[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\npatreon: playnite\nko_fi: playnite"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Bug report\ndescription: Create a report to help us improve\nlabels: ['bug']\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        **Before creating bug report:**\n        - Please post in English language only!\n        - Please use issue search in the repository first. If the bug is something really obvious there's a high change it was already reported.\n        - Make sure that the issue is not caused by custom theme or extension. You can restart Playnite in \"safe mode\" from help menu to quickly test it.\n        - Check list of known issues https://github.com/JosefNemec/Playnite/wiki/Known-Issues\n        \n        **Integration issues**\n        If an issue is related to library integrations, use separate [extensions repository](https://github.com/JosefNemec/PlayniteExtensions) to file a report.\n  - type: textarea\n    attributes:\n      label: Bug Description\n      description: A clear and concise description of what the bug is.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: To Reproduce\n      description: If it''s not clear from the description how to reproduce the issue please add clear steps to reproduce the behavior.\n    validations:\n      required: false\n  - type: input\n    attributes:\n      label: Diagnostics ID\n      description: 'Please generate diagnostics package from \"About Playnite\" menu and attach identifier you received. If the issue is a crash bug, you can generate diag. package directly from crash dialog.'      \n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Screenshots\n      description: If applicable, add screenshots to help explain your problem.\n    validations:\n      required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Playnite Discord server\n    url: https://playnite.link/discord\n    about: Official Discord server for general chat and support with Playnite.\n  - name: Playnite SDK documentation\n    url: https://playnite.link/docs/\n    about: Useful documentation when creating plugins and themes.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/custom.md",
    "content": "## Use [issue templates](https://github.com/JosefNemec/Playnite/issues/new/choose) instead!\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: Feature request\ndescription: Suggest an idea for this project\nlabels: ['enhancement']\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Please post in English language only!\n\n        **Integration features**\n        If a feature request is related to library integrations, use separate [extensions repository](https://github.com/JosefNemec/PlayniteExtensions) to file a request.\n\n        **Check for existing issue**\n        Please use issue search in the repository if your feature request is something really obvious there's a high change it was already requested.\n  - type: textarea\n    attributes:\n      label: Feature description\n      description: A clear and concise description of feature you want to be added.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Screenshots\n      description: If applicable, add screenshots to help explain requested changes.\n    validations:\n      required: false\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "Pull requests are generally on pause because majority of code base is being rewritten for Playnite 11.\n\nSmaller \"safe\" changes for P10 might get accepted based on what they and if they come with test coverage. If you plan to work on bigger changes, please discuss it first in related issue or on Discord, thank you.\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\r\n## files generated by popular Visual Studio add-ons.\r\n\r\n[Originals]/\r\n\r\n# User-specific files\r\n*.suo\r\n*.user\r\n*.userosscache\r\n*.sln.docstates\r\n\r\n# User-specific files (MonoDevelop/Xamarin Studio)\r\n*.userprefs\r\n\r\n# Build results\r\n[Dd]ebug/\r\n[Dd]ebugPublic/\r\n[Rr]elease/\r\n[Rr]eleases/\r\nx64/\r\nx86/\r\nbld/\r\n[Bb]in/\r\n[Oo]bj/\r\n[Ll]og/\r\n\r\n# Visual Studio 2015 cache/options directory\r\n.vs/\r\n# Uncomment if you have tasks that create the project's static files in wwwroot\r\n#wwwroot/\r\n\r\n# MSTest test Results\r\n[Tt]est[Rr]esult*/\r\n[Bb]uild[Ll]og.*\r\n\r\n# NUNIT\r\n*.VisualState.xml\r\nTestResult.xml\r\n\r\n# Build Results of an ATL Project\r\n[Dd]ebugPS/\r\n[Rr]eleasePS/\r\ndlldata.c\r\n\r\n# DNX\r\nproject.lock.json\r\nproject.fragment.lock.json\r\nartifacts/\r\n\r\n*_i.c\r\n*_p.c\r\n*_i.h\r\n*.ilk\r\n*.meta\r\n*.obj\r\n*.pch\r\n*.pdb\r\n*.pgc\r\n*.pgd\r\n*.rsp\r\n*.sbr\r\n*.tlb\r\n*.tli\r\n*.tlh\r\n*.tmp\r\n*.tmp_proj\r\n*.log\r\n*.vspscc\r\n*.vssscc\r\n.builds\r\n*.pidb\r\n*.svclog\r\n*.scc\r\n\r\n# Chutzpah Test files\r\n_Chutzpah*\r\n\r\n# Visual C++ cache files\r\nipch/\r\n*.aps\r\n*.ncb\r\n*.opendb\r\n*.opensdf\r\n*.sdf\r\n*.cachefile\r\n*.VC.db\r\n*.VC.VC.opendb\r\n\r\n# Visual Studio profiler\r\n*.psess\r\n*.vsp\r\n*.vspx\r\n*.sap\r\n\r\n# TFS 2012 Local Workspace\r\n$tf/\r\n\r\n# Guidance Automation Toolkit\r\n*.gpState\r\n\r\n# ReSharper is a .NET coding add-in\r\n_ReSharper*/\r\n*.[Rr]e[Ss]harper\r\n*.DotSettings.user\r\n\r\n# JustCode is a .NET coding add-in\r\n.JustCode\r\n\r\n# TeamCity is a build add-in\r\n_TeamCity*\r\n\r\n# DotCover is a Code Coverage Tool\r\n*.dotCover\r\n\r\n# NCrunch\r\n_NCrunch_*\r\n.*crunch*.local.xml\r\nnCrunchTemp_*\r\n\r\n# MightyMoose\r\n*.mm.*\r\nAutoTest.Net/\r\n\r\n# Web workbench (sass)\r\n.sass-cache/\r\n\r\n# Installshield output folder\r\n[Ee]xpress/\r\n\r\n# DocProject is a documentation generator add-in\r\nDocProject/buildhelp/\r\nDocProject/Help/*.HxT\r\nDocProject/Help/*.HxC\r\nDocProject/Help/*.hhc\r\nDocProject/Help/*.hhk\r\nDocProject/Help/*.hhp\r\nDocProject/Help/Html2\r\nDocProject/Help/html\r\n\r\n# Click-Once directory\r\npublish/\r\n\r\n# Publish Web Output\r\n*.[Pp]ublish.xml\r\n*.azurePubxml\r\n# TODO: Comment the next line if you want to checkin your web deploy settings\r\n# but database connection strings (with potential passwords) will be unencrypted\r\n*.pubxml\r\n*.publishproj\r\n\r\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\r\n# checkin your Azure Web App publish settings, but sensitive information contained\r\n# in these scripts will be unencrypted\r\nPublishScripts/\r\n\r\n# NuGet Packages\r\n*.nupkg\r\n# The packages folder can be ignored because of Package Restore\r\n**/packages/*\r\n# except build/, which is used as an MSBuild target.\r\n!**/packages/build/\r\n# Uncomment if necessary however generally it will be regenerated when needed\r\n#!**/packages/repositories.config\r\n# NuGet v3's project.json files produces more ignoreable files\r\n*.nuget.props\r\n*.nuget.targets\r\n\r\n# Microsoft Azure Build Output\r\ncsx/\r\n*.build.csdef\r\n\r\n# Microsoft Azure Emulator\r\necf/\r\nrcf/\r\n\r\n# Windows Store app package directories and files\r\nAppPackages/\r\nBundleArtifacts/\r\nPackage.StoreAssociation.xml\r\n_pkginfo.txt\r\n\r\n# Visual Studio cache files\r\n# files ending in .cache can be ignored\r\n*.[Cc]ache\r\n# but keep track of directories ending in .cache\r\n!*.[Cc]ache/\r\n\r\n# Others\r\nClientBin/\r\n~$*\r\n*~\r\n*.dbmdl\r\n*.dbproj.schemaview\r\n*.pfx\r\n*.publishsettings\r\nnode_modules/\r\norleans.codegen.cs\r\n\r\n# Since there are multiple workflows, uncomment next line to ignore bower_components\r\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\r\n#bower_components/\r\n\r\n# RIA/Silverlight projects\r\nGenerated_Code/\r\n\r\n# Backup & report files from converting an old project file\r\n# to a newer Visual Studio version. Backup files are not needed,\r\n# because we have git ;-)\r\n_UpgradeReport_Files/\r\nBackup*/\r\nUpgradeLog*.XML\r\nUpgradeLog*.htm\r\n\r\n# SQL Server files\r\n*.mdf\r\n*.ldf\r\n\r\n# Business Intelligence projects\r\n*.rdl.data\r\n*.bim.layout\r\n*.bim_*.settings\r\n\r\n# Microsoft Fakes\r\nFakesAssemblies/\r\n\r\n# GhostDoc plugin setting file\r\n*.GhostDoc.xml\r\n\r\n# Node.js Tools for Visual Studio\r\n.ntvs_analysis.dat\r\n\r\n# Visual Studio 6 build log\r\n*.plg\r\n\r\n# Visual Studio 6 workspace options file\r\n*.opt\r\n\r\n# Visual Studio LightSwitch build output\r\n**/*.HTMLClient/GeneratedArtifacts\r\n**/*.DesktopClient/GeneratedArtifacts\r\n**/*.DesktopClient/ModelManifest.xml\r\n**/*.Server/GeneratedArtifacts\r\n**/*.Server/ModelManifest.xml\r\n_Pvt_Extensions\r\n\r\n# Paket dependency manager\r\n.paket/paket.exe\r\npaket-files/\r\n\r\n# FAKE - F# Make\r\n.fake/\r\n\r\n# JetBrains Rider\r\n.idea/\r\n*.sln.iml\r\n\r\n# CodeRush\r\n.cr/\r\n\r\n# Visual Studio Code stuff\r\n.vscode/\r\n\r\nbuild/nuget.exe\r\nbuild/PlayniteSetup.exe\r\nbuild/PlaynitePortable.zip\r\nbuild/TestPackage/*\r\nbuild/PlayniteServices/*\r\nbuild/ReleaseSDK/*\r\nbuild/DebugSDK/*\r\nbuild/Playnite.zip\r\n\r\ntests/TestConfig.yaml\r\n\r\n# Don't share API keys with anyone :)\r\nsource/PlayniteServices/customSettings.json\r\nsource/PlayniteServices/patreonTokens.json\r\nsource/PlayniteServices/twitchTokens.json\r\n\r\n# Not redistributable\r\nXBOXONE.ttf\r\nPlayStation4.ttf\r\nsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/audio/*"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\r\n\r\nCopyright (c) 2020 Josef Nemec\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n"
  },
  {
    "path": "README.md",
    "content": "\n# <img src=\"https://playnite.link/applogo.png\" width=\"32\">  Playnite [![Crowdin](https://badges.crowdin.net/playnite/localized.svg)](https://crowdin.com/project/playnite)\nAn open source video game library manager and launcher with support for 3rd party libraries like Steam, Epic, GOG, EA App, Battle.net and [others](https://playnite.link/addons.html). Includes game emulation support, providing one unified interface for your games.\n\nScreenshots are available at the [Homepage](http://playnite.link/)\n\n*If you find Playnite useful please consider supporting the lead developer [Josef Nemec](https://github.com/JosefNemec) on [Patreon](https://www.patreon.com/playnite).*\n\nFeatures\n---------\n\nSee the [Homepage](http://playnite.link/) for the list of features.\n\nDownload\n---------\n\nGrab the latest installer or portable package from the [download](https://playnite.link/download.html) page. Playnite will automatically notify you about a new version upon release.\n\nRequirements: Windows 10 or 11\n\nFAQ, Known Issues, user manual\n---------\nCan be found [here](https://api.playnite.link/docs/)\n\nQuestions, issues etc.\n---------\nIf you find a bug please file an [issue](https://github.com/JosefNemec/Playnite/issues) and if relevant (crashes, broken features) please attach a diagnostics package, which can be created from inside the \"About Playnite...\" submenu.\n\nBiggest community around Playnite currently gathers on our [Discord server](https://playnite.link/discord) and [Reddit](https://www.reddit.com/r/playnite/).\n\nPrivacy Statement\n---------\nPlaynite itself doesn't store any user information and you generally don't need to provide any information to import installed games. All game library data is stored locally on your PC.\n\nAccount connection process depends on how a library plugin is implemented, but is usually done via official login web forms and only the web session cookies or tokens are stored, the same way when you login to those services via the web browser.\n\nAdd-ons\n---------\nPlaynite can be extended with plugins (written in .NET languages), PowerShell scripts and user interface themes.\n\nSee the [extensions portal](https://api.playnite.link/docs/tutorials/index.html) for more information about how to make these addons.\n\nTranslations\n---------\n\nWe use Crowdin to manage localization, please join our project if you want to submit translations:\n\nhttps://crowdin.com/project/playnite\n\nProofreading changes to original English strings can be submitted by creating pull request for [LocSource.xaml](https://github.com/JosefNemec/Playnite/blob/devel/source/Playnite/Localization/LocSource.xaml) file.\n\nCode Contributions\n---------\n\nPull requests are generally on pause because majority of code base is being rewritten for Playnite 11. Smaller \"safe\" changes for P10 might get accepted based on what they and if they come with test coverage. If you plan to work on bigger changes, please discuss it first in related issue or on Discord, thank you.\n\nPlease ask in the related issue first before starting implementing something to make sure that nobody else is already working on it. If an issue doesn't exist for your feature/bug fix, create one first.\n\nRegarding code styling, there are only a few major rules:\n\n- private fields and properties should use camelCase (without underscore)\n- all methods (private and public) should use PascalCase\n- use spaces instead of tabs with 4 spaces width\n- add empty line between code block end `}` and additional expression\n- always encapsulate the code body after *if, for, foreach, while* etc. with curly braces:\n\n```csharp\nif (true)\n{\n    DoSomething();\n}\n\nDoSomethingElse();\n```\n\ninstead of\n\n```csharp\nif (true)\n    DoSomething();\nDoSomethingElse();\n```\n\nBranches\n---------\n* `master` - default branch representing state of currently released build.\n* `devel` - development branch containing latest changes. All pull requests should be made against `devel` branch.\n* `devel*` - development branches for specific features/versions.\n\nRoadmap\n---------\n\nPlaynite is currently being rewritten from scratch for next major version release 11. The work is being done in private repository until beta release, after which the code will be release in this repository under the same license as current version 10 release. There is no list of planned changes and new features for version 11.\n\nDevelopment\n---------\n\nSee the [wiki](https://github.com/JosefNemec/Playnite/wiki/Building) for info about building and setting up the development environment.\n\nOthers\n---------\n\n.NET development tools courtesy of [JetBrains](https://www.jetbrains.com/?from=Playnite)\n\n[![jetbrains](https://user-images.githubusercontent.com/3874087/128503701-884cdae4-3283-4d67-8ad1-6103e777a660.png)](https://www.jetbrains.com/?from=Playnite)\n\nThis program uses free code signing provided by [SignPath.io](https://signpath.io?utm_source=foundation&utm_medium=github&utm_campaign=playnite), and a free code signing certificate by the [SignPath Foundation](https://signpath.org?utm_source=foundation&utm_medium=github&utm_campaign=playnite)\n\n[![Capture](https://user-images.githubusercontent.com/3874087/128503363-9c39f8cd-9900-4a8b-83f2-81359d4fc731.PNG)](https://about.signpath.io?utm_source=foundation&utm_medium=github&utm_campaign=playnite)\n"
  },
  {
    "path": "appveyor.yml",
    "content": "version: '{branch}_{build}'\r\npull_requests:\r\n  do_not_increment_build_number: true\r\nbranches:\r\n  only:\r\n  - master\r\nskip_non_tags: true\r\nimage: Visual Studio 2019\r\nshallow_clone: true\r\nenvironment:\r\n  LicensedDependenciesUrl:\r\n    secure: ZTSg1DK6QAtwZoCBUDQ94cIaMCKWgSeJMI0dCpVJBPE40+UqG9MNu+UJjjGWjvVa\r\n  OnlineInstallerConfig: https://playnite.link/build/installer_mirrors.txt\r\nbuild_script:\r\n- pwsh: .\\build\\build.ps1 -Package -SdkNuget -LicensedDependenciesUrl $env:LicensedDependenciesUrl -OnlineInstallerConfig $env:OnlineInstallerConfig\r\ntest: off\r\nartifacts:\r\n- path: 'build\\Playnite.zip'\r\ndeploy:\r\n- provider: Webhook\r\n  url: https://app.signpath.io/API/v1/4028e7e6-f183-4bbf-9640-c4b4d9a6992d/Integrations/AppVeyor?ProjectSlug=Playnite&SigningPolicySlug=release-signing\r\n  authorization:\r\n    secure: ZXw8Ro7eQ0opsdjLpNH7ZgTgS8ycnud7ag2qNOMRvqdxBmvegj+7QHrsh4pSgTSINhB5tbTZwgiMKFDjJV9QHg=="
  },
  {
    "path": "build/ExtensionsRefIgnoreList.txt",
    "content": "AngleSharp.dll\r\nCefSharp.dll\r\nCefSharp.BrowserSubprocess.Core.dll\r\nCefSharp.Core.dll\r\nCefSharp.Core.Runtime.dll\r\nCefSharp.OffScreen.dll\r\nCefSharp.Wpf.dll\r\nCommandLine.dll\r\nconcrt140.dll\r\nCrc32.NET.dll\r\nd3dcompiler_47.dll\r\nDiscordRPC.dll\r\nFlurl.dll\r\nHardcodet.Wpf.TaskbarNotification.dll\r\nHtmlRenderer.dll\r\nHtmlRenderer.WPF.dll\r\nchrome_elf.dll\r\nlibcef.dll\r\nlibEGL.dll\r\nlibGLESv2.dll\r\nLiteDB.dll\r\nMagick.Native-Q8-x86.dll\r\nMagick.NET.Core.dll\r\nMagick.NET.SystemWindowsMedia.dll\r\nMagick.NET-Q8-x86.dll\r\nMarkdig.dll\r\nMicrosoft.Dynamic.dll\r\nMicrosoft.Practices.ServiceLocation.dll\r\nMicrosoft.Scripting.dll\r\nMicrosoft.Scripting.Metadata.dll\r\nMicrosoft.VisualStudio.CodeCoverage.Shim.dll\r\nMicrosoft.Win32.Primitives.dll\r\nMicrosoft.WindowsAPICodePack.dll\r\nMicrosoft.WindowsAPICodePack.ExtendedLinguisticServices.dll\r\nMicrosoft.WindowsAPICodePack.Sensors.dll\r\nMicrosoft.WindowsAPICodePack.Shell.dll\r\nMicrosoft.WindowsAPICodePack.ShellExtensions.dll\r\nMicrosoft.Xaml.Behaviors.dll\r\nmsvcp140.dll\r\nmsvcp140_1.dll\r\nmsvcp140_2.dll\r\nmsvcp140_atomic_wait.dll\r\nmsvcp140_codecvt_ids.dll\r\nnetstandard.dll\r\nNett.dll\r\nNewtonsoft.Json.dll\r\nNLog.dll\r\nPhotoSauce.MagicScaler.dll\r\nPlaynite.dll\r\nPlaynite.SDK.dll\r\nPolly.dll\r\nPrism.dll\r\nPrism.Wpf.dll\r\nprotobuf-net.dll\r\nSDL2.dll\r\nSDL2_mixer.dll\r\nSharpCompress.dll\r\nsqlite3.x86.dll\r\nSQLNado.dll\r\nSystem.AppContext.dll\r\nSystem.Buffers.dll\r\nSystem.Collections.dll\r\nSystem.Collections.Concurrent.dll\r\nSystem.Collections.NonGeneric.dll\r\nSystem.Collections.Specialized.dll\r\nSystem.ComponentModel.dll\r\nSystem.ComponentModel.EventBasedAsync.dll\r\nSystem.ComponentModel.Primitives.dll\r\nSystem.ComponentModel.TypeConverter.dll\r\nSystem.Console.dll\r\nSystem.Data.Common.dll\r\nSystem.Diagnostics.Contracts.dll\r\nSystem.Diagnostics.Debug.dll\r\nSystem.Diagnostics.FileVersionInfo.dll\r\nSystem.Diagnostics.Process.dll\r\nSystem.Diagnostics.StackTrace.dll\r\nSystem.Diagnostics.TextWriterTraceListener.dll\r\nSystem.Diagnostics.Tools.dll\r\nSystem.Diagnostics.TraceSource.dll\r\nSystem.Diagnostics.Tracing.dll\r\nSystem.Drawing.Primitives.dll\r\nSystem.Dynamic.Runtime.dll\r\nSystem.Globalization.dll\r\nSystem.Globalization.Calendars.dll\r\nSystem.Globalization.Extensions.dll\r\nSystem.IO.dll\r\nSystem.IO.Abstractions.dll\r\nSystem.IO.Compression.dll\r\nSystem.IO.Compression.ZipFile.dll\r\nSystem.IO.FileSystem.dll\r\nSystem.IO.FileSystem.DriveInfo.dll\r\nSystem.IO.FileSystem.Primitives.dll\r\nSystem.IO.FileSystem.Watcher.dll\r\nSystem.IO.IsolatedStorage.dll\r\nSystem.IO.MemoryMappedFiles.dll\r\nSystem.IO.Pipes.dll\r\nSystem.IO.UnmanagedMemoryStream.dll\r\nSystem.Linq.dll\r\nSystem.Linq.Expressions.dll\r\nSystem.Linq.Parallel.dll\r\nSystem.Linq.Queryable.dll\r\nSystem.Memory.dll\r\nSystem.Net.Http.dll\r\nSystem.Net.NameResolution.dll\r\nSystem.Net.NetworkInformation.dll\r\nSystem.Net.Ping.dll\r\nSystem.Net.Primitives.dll\r\nSystem.Net.Requests.dll\r\nSystem.Net.Security.dll\r\nSystem.Net.Sockets.dll\r\nSystem.Net.WebHeaderCollection.dll\r\nSystem.Net.WebSockets.dll\r\nSystem.Net.WebSockets.Client.dll\r\nSystem.Numerics.Vectors.dll\r\nSystem.ObjectModel.dll\r\nSystem.Reflection.dll\r\nSystem.Reflection.Extensions.dll\r\nSystem.Reflection.Primitives.dll\r\nSystem.Resources.Reader.dll\r\nSystem.Resources.ResourceManager.dll\r\nSystem.Resources.Writer.dll\r\nSystem.Runtime.dll\r\nSystem.Runtime.CompilerServices.Unsafe.dll\r\nSystem.Runtime.CompilerServices.VisualC.dll\r\nSystem.Runtime.Extensions.dll\r\nSystem.Runtime.Handles.dll\r\nSystem.Runtime.InteropServices.dll\r\nSystem.Runtime.InteropServices.RuntimeInformation.dll\r\nSystem.Runtime.Numerics.dll\r\nSystem.Runtime.Serialization.Formatters.dll\r\nSystem.Runtime.Serialization.Json.dll\r\nSystem.Runtime.Serialization.Primitives.dll\r\nSystem.Runtime.Serialization.Xml.dll\r\nSystem.Security.Claims.dll\r\nSystem.Security.Cryptography.Algorithms.dll\r\nSystem.Security.Cryptography.Csp.dll\r\nSystem.Security.Cryptography.Encoding.dll\r\nSystem.Security.Cryptography.Primitives.dll\r\nSystem.Security.Cryptography.X509Certificates.dll\r\nSystem.Security.Principal.dll\r\nSystem.Security.SecureString.dll\r\nSystem.Text.Encoding.dll\r\nSystem.Text.Encoding.Extensions.dll\r\nSystem.Text.RegularExpressions.dll\r\nSystem.Threading.dll\r\nSystem.Threading.Overlapped.dll\r\nSystem.Threading.Tasks.dll\r\nSystem.Threading.Tasks.Parallel.dll\r\nSystem.Threading.Thread.dll\r\nSystem.Threading.ThreadPool.dll\r\nSystem.Threading.Timer.dll\r\nSystem.ValueTuple.dll\r\nSystem.Windows.Interactivity.dll\r\nSystem.Xml.ReaderWriter.dll\r\nSystem.Xml.XDocument.dll\r\nSystem.Xml.XmlDocument.dll\r\nSystem.Xml.XmlSerializer.dll\r\nSystem.Xml.XPath.dll\r\nSystem.Xml.XPath.XDocument.dll\r\nvccorlib140.dll\r\nvcruntime140.dll\r\nvcruntime140_threads.dll\r\nvk_swiftshader.dll\r\nvulkan-1.dll\r\nYamlDotNet.dll\r\nAngleSharp.xml\r\nCefSharp.xml\r\nCefSharp.BrowserSubprocess.Core.xml\r\nCefSharp.Core.xml\r\nCefSharp.Core.Runtime.xml\r\nCefSharp.OffScreen.xml\r\nCefSharp.Wpf.xml\r\nCommandLine.xml\r\nconcrt140.xml\r\nCrc32.NET.xml\r\nd3dcompiler_47.xml\r\nDiscordRPC.xml\r\nFlurl.xml\r\nHardcodet.Wpf.TaskbarNotification.xml\r\nHtmlRenderer.xml\r\nHtmlRenderer.WPF.xml\r\nchrome_elf.xml\r\nlibcef.xml\r\nlibEGL.xml\r\nlibGLESv2.xml\r\nLiteDB.xml\r\nMagick.Native-Q8-x86.xml\r\nMagick.NET.Core.xml\r\nMagick.NET.SystemWindowsMedia.xml\r\nMagick.NET-Q8-x86.xml\r\nMarkdig.xml\r\nMicrosoft.Dynamic.xml\r\nMicrosoft.Practices.ServiceLocation.xml\r\nMicrosoft.Scripting.xml\r\nMicrosoft.Scripting.Metadata.xml\r\nMicrosoft.VisualStudio.CodeCoverage.Shim.xml\r\nMicrosoft.Win32.Primitives.xml\r\nMicrosoft.WindowsAPICodePack.xml\r\nMicrosoft.WindowsAPICodePack.ExtendedLinguisticServices.xml\r\nMicrosoft.WindowsAPICodePack.Sensors.xml\r\nMicrosoft.WindowsAPICodePack.Shell.xml\r\nMicrosoft.WindowsAPICodePack.ShellExtensions.xml\r\nMicrosoft.Xaml.Behaviors.xml\r\nmsvcp140.xml\r\nmsvcp140_1.xml\r\nmsvcp140_2.xml\r\nmsvcp140_atomic_wait.xml\r\nmsvcp140_codecvt_ids.xml\r\nnetstandard.xml\r\nNett.xml\r\nNewtonsoft.Json.xml\r\nNLog.xml\r\nPhotoSauce.MagicScaler.xml\r\nPlaynite.xml\r\nPlaynite.SDK.xml\r\nPolly.xml\r\nPrism.xml\r\nPrism.Wpf.xml\r\nprotobuf-net.xml\r\nSDL2.xml\r\nSDL2_mixer.xml\r\nSharpCompress.xml\r\nsqlite3.x86.xml\r\nSQLNado.xml\r\nSystem.AppContext.xml\r\nSystem.Buffers.xml\r\nSystem.Collections.xml\r\nSystem.Collections.Concurrent.xml\r\nSystem.Collections.NonGeneric.xml\r\nSystem.Collections.Specialized.xml\r\nSystem.ComponentModel.xml\r\nSystem.ComponentModel.EventBasedAsync.xml\r\nSystem.ComponentModel.Primitives.xml\r\nSystem.ComponentModel.TypeConverter.xml\r\nSystem.Console.xml\r\nSystem.Data.Common.xml\r\nSystem.Diagnostics.Contracts.xml\r\nSystem.Diagnostics.Debug.xml\r\nSystem.Diagnostics.FileVersionInfo.xml\r\nSystem.Diagnostics.Process.xml\r\nSystem.Diagnostics.StackTrace.xml\r\nSystem.Diagnostics.TextWriterTraceListener.xml\r\nSystem.Diagnostics.Tools.xml\r\nSystem.Diagnostics.TraceSource.xml\r\nSystem.Diagnostics.Tracing.xml\r\nSystem.Drawing.Primitives.xml\r\nSystem.Dynamic.Runtime.xml\r\nSystem.Globalization.xml\r\nSystem.Globalization.Calendars.xml\r\nSystem.Globalization.Extensions.xml\r\nSystem.IO.xml\r\nSystem.IO.Abstractions.xml\r\nSystem.IO.Compression.xml\r\nSystem.IO.Compression.ZipFile.xml\r\nSystem.IO.FileSystem.xml\r\nSystem.IO.FileSystem.DriveInfo.xml\r\nSystem.IO.FileSystem.Primitives.xml\r\nSystem.IO.FileSystem.Watcher.xml\r\nSystem.IO.IsolatedStorage.xml\r\nSystem.IO.MemoryMappedFiles.xml\r\nSystem.IO.Pipes.xml\r\nSystem.IO.UnmanagedMemoryStream.xml\r\nSystem.Linq.xml\r\nSystem.Linq.Expressions.xml\r\nSystem.Linq.Parallel.xml\r\nSystem.Linq.Queryable.xml\r\nSystem.Memory.xml\r\nSystem.Net.Http.xml\r\nSystem.Net.NameResolution.xml\r\nSystem.Net.NetworkInformation.xml\r\nSystem.Net.Ping.xml\r\nSystem.Net.Primitives.xml\r\nSystem.Net.Requests.xml\r\nSystem.Net.Security.xml\r\nSystem.Net.Sockets.xml\r\nSystem.Net.WebHeaderCollection.xml\r\nSystem.Net.WebSockets.xml\r\nSystem.Net.WebSockets.Client.xml\r\nSystem.Numerics.Vectors.xml\r\nSystem.ObjectModel.xml\r\nSystem.Reflection.xml\r\nSystem.Reflection.Extensions.xml\r\nSystem.Reflection.Primitives.xml\r\nSystem.Resources.Reader.xml\r\nSystem.Resources.ResourceManager.xml\r\nSystem.Resources.Writer.xml\r\nSystem.Runtime.xml\r\nSystem.Runtime.CompilerServices.Unsafe.xml\r\nSystem.Runtime.CompilerServices.VisualC.xml\r\nSystem.Runtime.Extensions.xml\r\nSystem.Runtime.Handles.xml\r\nSystem.Runtime.InteropServices.xml\r\nSystem.Runtime.InteropServices.RuntimeInformation.xml\r\nSystem.Runtime.Numerics.xml\r\nSystem.Runtime.Serialization.Formatters.xml\r\nSystem.Runtime.Serialization.Json.xml\r\nSystem.Runtime.Serialization.Primitives.xml\r\nSystem.Runtime.Serialization.Xml.xml\r\nSystem.Security.Claims.xml\r\nSystem.Security.Cryptography.Algorithms.xml\r\nSystem.Security.Cryptography.Csp.xml\r\nSystem.Security.Cryptography.Encoding.xml\r\nSystem.Security.Cryptography.Primitives.xml\r\nSystem.Security.Cryptography.X509Certificates.xml\r\nSystem.Security.Principal.xml\r\nSystem.Security.SecureString.xml\r\nSystem.Text.Encoding.xml\r\nSystem.Text.Encoding.Extensions.xml\r\nSystem.Text.RegularExpressions.xml\r\nSystem.Threading.xml\r\nSystem.Threading.Overlapped.xml\r\nSystem.Threading.Tasks.xml\r\nSystem.Threading.Tasks.Parallel.xml\r\nSystem.Threading.Thread.xml\r\nSystem.Threading.ThreadPool.xml\r\nSystem.Threading.Timer.xml\r\nSystem.ValueTuple.xml\r\nSystem.Windows.Interactivity.xml\r\nSystem.Xml.ReaderWriter.xml\r\nSystem.Xml.XDocument.xml\r\nSystem.Xml.XmlDocument.xml\r\nSystem.Xml.XmlSerializer.xml\r\nSystem.Xml.XPath.xml\r\nSystem.Xml.XPath.XDocument.xml\r\nvccorlib140.xml\r\nvcruntime140.xml\r\nvcruntime140_threads.xml\r\nvk_swiftshader.xml\r\nvulkan-1.xml\r\nYamlDotNet.xml"
  },
  {
    "path": "build/PlayniteSDK.nuspec",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<package xmlns=\"http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd\">\r\n  <metadata>\r\n    <id>PlayniteSDK</id>\r\n    <version>{Version}</version>\r\n    <title>Playnite SDK</title>\r\n    <authors>Josef Nemec</authors>\r\n    <owners>JosefNemec</owners>\r\n    <license type=\"expression\">MIT</license>\r\n    <projectUrl>https://github.com/JosefNemec/Playnite</projectUrl>\r\n    <icon>images\\applogo.png</icon>\r\n    <requireLicenseAcceptance>false</requireLicenseAcceptance>\r\n    <description>SDK plugin library for Playnite video game library manager.</description>\r\n    <releaseNotes>https://playnite.link/docs/changelog.html</releaseNotes>\r\n    <copyright>Copyright © Josef Nemec 2018</copyright>\r\n    <tags>sdk gaming</tags>\r\n    <dependencies>\r\n      <group targetFramework=\".NETFramework4.6.2\" />\r\n    </dependencies>\r\n    <readme>docs\\readme.md</readme>\r\n  </metadata>\r\n  <files>\r\n    <file src=\"{OutDir}\\Playnite.SDK.dll\" target=\"lib\\net462\\Playnite.SDK.dll\" />\r\n    <file src=\"{OutDir}\\Playnite.SDK.xml\" target=\"lib\\net462\\Playnite.SDK.xml\" />\r\n    <file src=\"..\\source\\Playnite.DesktopApp\\Themes\\Desktop\\Default\\Images\\applogo.png\" target=\"images\\\" />\r\n    <file src=\"..\\source\\PlayniteSDK\\readme.md\" target=\"docs\\\" />\r\n</files>\r\n</package>"
  },
  {
    "path": "build/VerifyLanguageFiles.ps1",
    "content": "#Requires -Version 7\r\n\r\n$ErrorActionPreference = \"Stop\"\r\nAdd-Type -AssemblyName \"PresentationFramework\"\r\n\r\n$locDir = \"..\\source\\Playnite\\Localization\\\"\r\n$allOk = $true\r\nforeach ($locFile in (Get-ChildItem $locDir -Filter \"*.xaml\"))\r\n{\r\n    $stream = New-Object \"System.IO.StreamReader\" $locFile.FullName\r\n\r\n    try\r\n    {\r\n        $xaml = [System.Windows.Markup.XamlReader]::Load($stream.BaseStream)\r\n        Write-Host \"$($locFile.Name)...OK\" -ForegroundColor Green\r\n    }\r\n    catch\r\n    {\r\n        $allOk = $false\r\n        Write-Host \"$($locFile.Name)...FAIL\" -ForegroundColor Red\r\n        Write-Host $_.Exception.InnerException.Message -ForegroundColor Red\r\n    }\r\n    finally\r\n    {\r\n        $stream.Dispose()\r\n    }\r\n}\r\n\r\nif (-not $allOk)\r\n{\r\n    throw \"Some localization files failed verification.\"\r\n}"
  },
  {
    "path": "build/applyEnglishProofing.ps1",
    "content": "#Requires -Version 7\r\n\r\n$ErrorActionPreference = \"Stop\"\r\nAdd-Type -AssemblyName \"PresentationFramework\"\r\n\r\n$locDir = Join-Path $pwd \"..\\source\\Playnite\\Localization\\\"\r\n$proofFile = Join-Path $locDir \"en_US.xaml\"\r\n$lngSourceFile = Join-Path $locDir \"LocSource.xaml\"\r\n\r\n[xml]$proofXaml = Get-Content $proofFile\r\n[xml]$lngSourceXaml = Get-Content $lngSourceFile\r\n\r\nforeach ($node in $proofXaml.ResourceDictionary.ChildNodes)\r\n{\r\n    if (!$node.Key)\r\n    {\r\n        continue\r\n    }\r\n\r\n    if (![string]::IsNullOrEmpty($node.InnerXml))\r\n    {        \r\n        $lngSourceNode = $lngSourceXaml.ResourceDictionary.ChildNodes | Where-Object { $_.Key -eq $node.Key }\r\n        if ($lngSourceNode)\r\n        {\r\n            $importNode = $lngSourceXaml.ImportNode($node, $true)\r\n            $lngSourceXaml.ResourceDictionary.ReplaceChild($importNode, $lngSourceNode) | Out-Null\r\n        }\r\n    }\r\n}\r\n\r\n$settings = new-object System.Xml.XmlWriterSettings\r\n$settings.Indent = $true;\r\n$settings.IndentChars = \"    \";\r\n$settings.Encoding = [System.Text.Encoding]::UTF8;\r\n$settings.OmitXmlDeclaration = $true;\r\n$writer = [System.Xml.XmlWriter]::Create($lngSourceFile, $settings);\r\n[System.Xml.Linq.XDocument]::Parse($lngSourceXaml.OuterXml).WriteTo($writer);\r\n$writer.Flush();\r\n$writer.Dispose();"
  },
  {
    "path": "build/build.ps1",
    "content": "﻿#Requires -Version 7\r\n\r\nparam(\r\n    # Build configuration\r\n    [ValidateSet(\"Release\", \"Debug\")]\r\n    [string]$Configuration = \"Release\",\r\n    \r\n    # Target platform\r\n    [ValidateSet(\"x86\", \"x64\")]\r\n    [string]$Platform = \"x86\",\r\n\r\n    # Target directory for build files    \r\n    [string]$OutputDir,\r\n\r\n    # Target directory for installer files\r\n    [string]$InstallerDir,\r\n\r\n    # Package build output into zip file\r\n    [switch]$Package = $false,\r\n\r\n    # Skip build process\r\n    [switch]$SkipBuild = $false,\r\n\r\n    # Temp directory for build process\r\n    [string]$TempDir = (Join-Path $env:TEMP \"PlayniteBuild\"),\r\n\r\n    [string]$LicensedDependenciesUrl,\r\n\r\n    [switch]$SdkNuget,\r\n\r\n    [string]$OnlineInstallerConfig\r\n)\r\n\r\n$ErrorActionPreference = \"Stop\"\r\nif (!(Get-InstalledModule \"powershell-yaml\" -EA 0))\r\n{\r\n    Install-Module powershell-yaml\r\n}\r\n\r\nSet-Location $PSScriptRoot\r\n& .\\common.ps1\r\n\r\nif (!$OutputDir)\r\n{\r\n    $OutputDir = Join-Path $PWD $Configuration\r\n}\r\n\r\nif (!$InstallerDir)\r\n{\r\n    $InstallerDir = $PWD\r\n}\r\n\r\nfunction PackExtensionTemplate()\r\n{\r\n    param(\r\n        [Parameter(Mandatory = $true)]\r\n        [string]$TemplateRootName,        \r\n        [Parameter(Mandatory = $true)]\r\n        [string]$OutputDir\r\n    )\r\n\r\n    $templatesDir = Join-Path $OutputDir \"Templates\\Extensions\\\"\r\n    $templateOutDir = Join-Path $templatesDir $TemplateRootName\r\n    $tempFiles = Get-Content \"..\\source\\Tools\\Playnite.Toolbox\\Templates\\Extensions\\$TemplateRootName\\BuildInclude.txt\" | Where { ![string]::IsNullOrEmpty($_) }\r\n    $targetZip = Join-Path $templatesDir \"$TemplateRootName.zip\"\r\n    foreach ($file in $tempFiles)\r\n    {\r\n        $target = Join-Path $templateOutDir $file\r\n        New-FolderFromFilePath $target\r\n        Copy-Item (Join-Path \"..\\source\\Tools\\Playnite.Toolbox\\Templates\\Extensions\\$TemplateRootName\" $file) $target        \r\n    }\r\n\r\n    New-ZipFromDirectory $templateOutDir $targetZip\r\n    Remove-Item $templateOutDir -Recurse -Force\r\n} \r\n\r\n# -------------------------------------------\r\n#            Verify various non-build files\r\n# -------------------------------------------\r\n.\\VerifyLanguageFiles.ps1\r\n\r\n$platforms = Get-Content \"..\\source\\Playnite\\Emulation\\Platforms.yaml\" -Raw | ConvertFrom-Yaml\r\nif (!($platforms.Count -gt 0))\r\n{\r\n    throw \"Platforms definition file is not valid.\"\r\n}\r\n\r\nWrite-OperationLog \"Platforms definitions are OK\"\r\n\r\n$regions = Get-Content \"..\\source\\Playnite\\Emulation\\Regions.yaml\" -Raw | ConvertFrom-Yaml\r\nif (!($regions.Count -gt 0))\r\n{\r\n    throw \"Regions definition file is not valid.\"\r\n}\r\n\r\nWrite-OperationLog \"Regions definitions are OK\"\r\n\r\nGet-ChildItem \"..\\source\\Playnite\\Emulation\\\" -Filter \"*.yaml\" -Recurse | ForEach {\r\n    $emuDef = Get-Content $_.FullName -Raw | ConvertFrom-Yaml\r\n    if (!$emuDef.Id)\r\n    {\r\n        throw \"$($_.FullName) is not valid emulator definition.\"\r\n    }\r\n\r\n    foreach ($profile in $emuDef.Profiles)\r\n    {\r\n        foreach ($platId in $profile.Platforms)\r\n        {\r\n            if (!($platforms | Where { $_.Id -eq $platId } ))\r\n            {\r\n                throw \"Platform $platId not found, $($_.FullName).\"\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nWrite-OperationLog \"Emulator definitions are OK\"\r\n\r\n# -------------------------------------------\r\n#            Compile application \r\n# -------------------------------------------\r\nif (!$SkipBuild)\r\n{\r\n    if (Test-Path $OutputDir)\r\n    {\r\n        Remove-Item \"$OutputDir\\*\" -Recurse -Force\r\n    }\r\n    \r\n    if ($LicensedDependenciesUrl)\r\n    {\r\n        $depArchive = Join-Path $env:TEMP \"deps.zip\"\r\n        Invoke-WebRequest $LicensedDependenciesUrl -OutFile $depArchive\r\n        Expand-ZipToDirectory $depArchive (Resolve-Path \"..\").Path\r\n    }\r\n\r\n    if ($OnlineInstallerConfig)\r\n    {\r\n        Write-OperationLog \"Updating online installer config...\"\r\n        $locaConfigPath = \"..\\source\\Tools\\PlayniteInstaller\\installer_mirrors.txt\"\r\n        if ($OnlineInstallerConfig.StartsWith(\"http\"))\r\n        {\r\n            $configFile = Join-Path $env:TEMP \"installer_mirrors.txt\"\r\n            Invoke-WebRequest $OnlineInstallerConfig -OutFile $locaConfigPath\r\n        }\r\n        else\r\n        {\r\n            Copy-Item $OnlineInstallerConfig $locaConfigPath -Force\r\n        }\r\n    }\r\n\r\n    $solutionDir = Join-Path $pwd \"..\\source\"\r\n    Invoke-Nuget \"restore ..\\source\\Playnite.sln\"\r\n    $msbuildpath = Get-MsBuildPath\r\n    $arguments = \"build.xml /p:SolutionDir=`\"$solutionDir\\\\`\" /p:OutputPath=`\"$OutputDir`\";Configuration=$configuration /property:Platform=$Platform /t:Build\"\r\n    $compilerResult = StartAndWait $msbuildPath $arguments\r\n    if ($compilerResult -ne 0)\r\n    {\r\n        throw \"Build failed.\"\r\n    }\r\n\r\n    # Copy extension templates\r\n    PackExtensionTemplate \"CustomLibraryPlugin\" $OutputDir\r\n    PackExtensionTemplate \"CustomMetadataPlugin\" $OutputDir\r\n    PackExtensionTemplate \"GenericPlugin\" $OutputDir\r\n    PackExtensionTemplate \"PowerShellScript\" $OutputDir\r\n}\r\n\r\nNew-Folder $InstallerDir\r\n\r\n# -------------------------------------------\r\n#            SDK nuget\r\n# -------------------------------------------\r\nif ($SdkNuget)\r\n{\r\n    & .\\buildSdkNuget.ps1 -SkipBuild -OutputPath $OutputDir | Out-Null\r\n}\r\n\r\n# -------------------------------------------\r\n#            Build zip package\r\n# -------------------------------------------\r\nif ($Package)\r\n{\r\n    Write-OperationLog \"Building zip package...\"\r\n    $packageName = Join-Path $InstallerDir \"Playnite.zip\"\r\n    New-ZipFromDirectory $OutputDir $packageName\r\n}\r\n\r\n(Get-ChildItem (Join-Path $OutputDir \"Playnite.dll\")).VersionInfo.FileVersion | Write-Host -ForegroundColor Green\r\nreturn $true"
  },
  {
    "path": "build/build.xml",
    "content": "<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" ToolsVersion=\"4.0\">\r\n    <Target Name=\"BeforeBuild\">\r\n        <RemoveDir Directories=\"$(OutputPath)\" />\r\n        <MakeDir Directories=\"$(OutputPath)\" />\r\n    </Target>  \r\n    <Target Name=\"Build\">\r\n        <MSBuild\r\n            Projects=\"../source/tools/Playnite.Toolbox/Playnite.Toolbox.csproj\"\r\n            Targets=\"Build\"\r\n            Properties=\"OutputPath=$(OutputPath); Configuration=$(Configuration); AllowedReferenceRelatedFileExtensions=none;\" />\r\n        <MSBuild\r\n            Projects=\"../source/Playnite.DesktopApp/Playnite.DesktopApp.csproj\"\r\n            Targets=\"Build\"\r\n            Properties=\"OutputPath=$(OutputPath); Configuration=$(Configuration); AllowedReferenceRelatedFileExtensions=none;\" />\r\n        <MSBuild\r\n            Projects=\"../source/Playnite.FullscreenApp/Playnite.FullscreenApp.csproj\"\r\n            Targets=\"Build\"\r\n            Properties=\"OutputPath=$(OutputPath); Configuration=$(Configuration); AllowedReferenceRelatedFileExtensions=none;\" />\r\n        <MSBuild\r\n            Projects=\"../source/PlayniteSDK/Playnite.SDK.csproj\"\r\n            Targets=\"Build\"\r\n            Properties=\"OutputPath=$(OutputPath); Configuration=$(Configuration); AllowedReferenceRelatedFileExtensions=none; Platform=AnyCPU\" />\r\n        <MSBuild\r\n            Projects=\"../source/Tools/PlayniteInstaller/PlayniteInstaller.csproj\"\r\n            Targets=\"Build\"\r\n            Properties=\"OutputPath=$(OutputPath); Configuration=$(Configuration); AllowedReferenceRelatedFileExtensions=none; Platform=AnyCPU\" />\r\n    </Target>\r\n</Project>"
  },
  {
    "path": "build/buildLocConstants.ps1",
    "content": "#Requires -Version 7\r\n\r\n$ErrorActionPreference = \"Stop\"\r\n& .\\common.ps1\r\n\r\n$locFile = Join-Path $pwd \"..\\source\\Playnite\\Localization\\LocSource.xaml\"\r\n$locKeysSrc = Join-Path $pwd \"..\\source\\Playnite\\Localization\\LocalizationKeys.cs\"\r\n\r\n\r\n[xml]$locFileXaml = Get-Content $locFile\r\n\r\n@\"\r\n///\r\n/// DO NOT MODIFY! Automatically generated via buildLocConstants.ps1 script.\r\n/// \r\nnamespace Playnite\r\n{\r\n    public static class LOC\r\n    {\r\n\"@ | Out-File $locKeysSrc -Encoding utf8\r\n\r\nforeach ($node in $locFileXaml.ResourceDictionary.ChildNodes)\r\n{\r\n    if (!$node.Key)\r\n    {\r\n        continue\r\n    }\r\n\r\n    if (![string]::IsNullOrEmpty($node.InnerXml))\r\n    {\r\n@\"\r\n        /// <summary>\r\n        {0}\r\n        /// </summary>\r\n\"@ -f (($node.InnerXml -split \"\\n\") -replace \"^\", \"/// \") | Out-File $locKeysSrc -Encoding utf8 -Append\r\n        \"        public const string $($node.Key -replace `\"^LOC`\", `\"`\") = `\"$($node.Key)`\";\" `\r\n         | Out-File $locKeysSrc -Encoding utf8 -Append\r\n    }\r\n}\r\n\r\n@\"\r\n    }\r\n}\r\n\"@ | Out-File $locKeysSrc -Encoding utf8 -Append"
  },
  {
    "path": "build/buildSdkNuget.ps1",
    "content": "﻿#Requires -Version 7\r\n\r\nparam(\r\n    [ValidateSet(\"Release\", \"Debug\")]\r\n    [string]$Configuration = \"Release\",\r\n    [string]$OutputPath = (Join-Path $PWD \"$($Configuration)SDK\"),\r\n    [switch]$SkipBuild = $false,\r\n    [string]$LocalPublish\r\n)\r\n\r\n$ErrorActionPreference = \"Stop\"\r\n& .\\common.ps1\r\n\r\n# -------------------------------------------\r\n#            Compile SDK\r\n# -------------------------------------------\r\nif (!$SkipBuild)\r\n{\r\n    New-EmptyFolder $OutputPath\r\n    $project = Join-Path $pwd \"..\\source\\PlayniteSDK\\Playnite.SDK.csproj\"\r\n    $msbuildPath = Get-MsBuildPath\r\n    $arguments = \"`\"$project`\" /p:OutputPath=`\"$outputPath`\";Configuration=$configuration /t:Build\"\r\n    $compilerResult = StartAndWait $msbuildPath $arguments\r\n    if ($compilerResult -ne 0)\r\n    {\r\n        throw \"Build failed.\"\r\n    }\r\n}\r\n\r\n# -------------------------------------------\r\n#            Create NUGET\r\n# -------------------------------------------\r\n$version = (Get-ChildItem (Join-Path $OutputPath \"Playnite.SDK.dll\")).VersionInfo.ProductVersion\r\n$version = $version -replace \"\\.0$\", \"\"\r\n$spec = Get-Content \"PlayniteSDK.nuspec\"\r\n$spec = $spec -replace \"{Version}\", $version\r\n$spec = $spec -replace \"{OutDir}\", $OutputPath\r\n$specFile = \"nuget.nuspec\"\r\n\r\ntry\r\n{\r\n    $spec | Out-File $specFile\r\n    $packageRes = Invoke-Nuget \"pack $specFile -OutputDirectory $OutputPath\"\r\n    if ($packageRes -ne 0)\r\n    {\r\n        throw \"Nuget packing failed.\"\r\n    }\r\n}\r\nfinally\r\n{\r\n    Remove-Item $specFile -EA 0\r\n}\r\n\r\nif ($LocalPublish)\r\n{\r\n    Invoke-Nuget \"init `\"$pwd`\" `\"$LocalPublish`\"\"\r\n}\r\n\r\nreturn $true"
  },
  {
    "path": "build/common.ps1",
    "content": "﻿#Requires -Version 7\r\n\r\n$global:NugetUrl = \"https://dist.nuget.org/win-x86-commandline/latest/nuget.exe\"\r\n\r\nfunction global:StartAndWait()\r\n{\r\n    param(\r\n        [string]$Path,\r\n        [string]$Arguments,\r\n        [string]$WorkingDir\r\n    )\r\n\r\n    if ($WorkingDir)\r\n    {\r\n        $proc = Start-Process $Path $Arguments -PassThru -NoNewWindow -WorkingDirectory $WorkingDir\r\n    }\r\n    else\r\n    { \r\n        $proc = Start-Process $Path $Arguments -PassThru -NoNewWindow\r\n    }\r\n\r\n    $handle = $proc.Handle # cache proc.Handle http://stackoverflow.com/a/23797762/1479211\r\n    $proc.WaitForExit()\r\n    return $proc.ExitCode\r\n}\r\n\r\nfunction global:Invoke-Nuget()\r\n{\r\n    param(\r\n        [string]$NugetArgs\r\n    ) \r\n\r\n    $nugetCommand = Get-Command -Name \"nuget\" -Type Application -ErrorAction Ignore\r\n    if (-not $nugetCommand)\r\n    {\r\n        if (-not (Test-Path \"nuget.exe\"))\r\n        {\r\n            Invoke-WebRequest -Uri $NugetUrl -OutFile \"nuget.exe\"\r\n        }\r\n    }\r\n\r\n    if ($nugetCommand)\r\n    {\r\n        return StartAndWait \"nuget\" $NugetArgs\r\n    }\r\n    else\r\n    {      \r\n        return StartAndWait \".\\nuget.exe\" $NugetArgs\r\n    }\r\n}\r\n\r\nfunction global:Get-MsBuildPath()\r\n{\r\n    $VSWHERE_CMD = \"vswhere\"\r\n\r\n    if (-not (Get-Command -Name $VSWHERE_CMD -Type Application -ErrorAction Ignore))\r\n    {\r\n        $VSWHERE_CMD = \"..\\source\\packages\\vswhere.*\\tools\\vswhere.exe\"\r\n        if (-not (Get-Command -Name $VSWHERE_CMD -Type Application -ErrorAction Ignore))\r\n        {\r\n            Invoke-Nuget \"install vswhere -SolutionDirectory `\"$solutionDir`\"\" | Out-Null\r\n        }\r\n    }\r\n\r\n    $path = & $VSWHERE_CMD -latest -requires Microsoft.Component.MSBuild -find \"MSBuild\\**\\Bin\\MSBuild.exe\" -latest | Select-Object -First 1\r\n    if ($path -and (Test-Path $path))\r\n    {\r\n        return $path\r\n    }\r\n\r\n    throw \"MS Build not found.\"\r\n}\r\n\r\nfunction global:New-Folder()\r\n{\r\n    param(\r\n        [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]\r\n        [string]$Path        \r\n    )\r\n\r\n    if (Test-Path $Path)\r\n    {\r\n        return\r\n    }\r\n\r\n    mkdir $Path | Out-Null\r\n}\r\n\r\nfunction global:New-FolderFromFilePath()\r\n{\r\n    param(\r\n        [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]\r\n        [string]$FilePath        \r\n    )\r\n\r\n    $dirPath = Split-Path $FilePath\r\n    if (Test-Path $dirPath)\r\n    {\r\n        return\r\n    }\r\n\r\n    mkdir $dirPath | Out-Null\r\n}\r\n\r\nfunction global:New-EmptyFolder()\r\n{\r\n    param(\r\n        [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]\r\n        [string]$Path        \r\n    )\r\n\r\n    if (Test-Path $Path)\r\n    {\r\n        Remove-Item $Path -Recurse -Force\r\n    }\r\n\r\n    mkdir $Path | Out-Null\r\n}\r\n\r\nfunction global:New-ZipFromDirectory()\r\n{\r\n    param(\r\n        [string]$directory,\r\n        [string]$resultZipPath,\r\n        [bool]$includeBaseDirectory = $false\r\n    )\r\n\r\n    if (Test-path $resultZipPath)\r\n    {\r\n        Remove-Item $resultZipPath\r\n    }\r\n\r\n    Add-Type -assembly \"System.IO.Compression.Filesystem\" | Out-Null\r\n    [IO.Compression.ZipFile]::CreateFromDirectory($directory, $resultZipPath, \"Optimal\", $includeBaseDirectory) \r\n}\r\n\r\nfunction global:Expand-ZipToDirectory()\r\n{\r\n    param(\r\n        [string]$zipPath,\r\n        [string]$directory\r\n    )\r\n\r\n    Add-Type -assembly \"System.IO.Compression.Filesystem\" | Out-Null\r\n    [IO.Compression.ZipFile]::ExtractToDirectory($zipPath, $directory, $true)\r\n}\r\n\r\nfunction global:Write-OperationLog()\r\n{\r\n    param(\r\n        [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]\r\n        [string]$Message\r\n    )\r\n\r\n    Write-Host $Message -ForegroundColor Green\r\n}\r\n\r\nfunction global:Write-ErrorLog()\r\n{\r\n    param(\r\n        [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]\r\n        [string]$Message\r\n    )\r\n\r\n    Write-Host $Message -ForegroundColor Red -BackgroundColor Black\r\n}\r\n\r\n\r\nfunction global:Write-WarningLog()\r\n{\r\n    param(\r\n        [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]\r\n        [string]$Message\r\n    )\r\n\r\n    Write-Host $Message -ForegroundColor Yellow\r\n}\r\n\r\nfunction global:Write-InfoLog()\r\n{\r\n    param(\r\n        [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]\r\n        [string]$Message\r\n    )\r\n\r\n    Write-Host $Message -ForegroundColor White\r\n}\r\n\r\nfunction global:Write-DebugLog()\r\n{\r\n    param(\r\n        [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]\r\n        [string]$Message\r\n    )\r\n\r\n    Write-Host $Message -ForegroundColor DarkGray\r\n}"
  },
  {
    "path": "build/generateRetroArchProfile.ps1",
    "content": "param(\n    [Parameter(Mandatory=$true)]\n    [string]$RetroArchDir,\n    [Parameter(Mandatory=$true)]\n    [string]$PlayniteSourceDirectory\n)\n\n$ErrorActionPreference = \"Stop\"\nif (!(Get-InstalledModule \"powershell-yaml\" -EA 0))\n{\n    Install-Module powershell-yaml\n}\n\nfunction Get-IsYamlValid\n{\n    param (\n        [Parameter(Mandatory=$true)]\n        [string] $yamlContent\n    )\n\n    try {\n        $yamlContent | ConvertFrom-Yaml | Out-Null\n        return $true\n    } catch {\n        return $false\n    }\n}\n\nfunction ParseInfoFile()\n{\n    param(\n        [Parameter(Mandatory=$true)]\n        [string]$Path\n    )\n\n    $properties = @{}\n    foreach ($line in (Get-Content $Path))\n    {\n        if ($line.StartsWith(\"#\"))\n        {\n            continue\n        }\n\n        if ($line -match \"^(.*)\\s*=\\s*`\"(.*)`\"$\")\n        {\n            $property = $Matches[1].Trim()\n            if (!$properties.ContainsKey($property))\n            {\n                $properties.Add($property, $Matches[2].Trim())\n            }\n        }\n    }\n\n    return $properties\n}\n\n$emulationDirPath = [System.IO.Path]::Combine($PlayniteSourceDirectory, \"Playnite\", \"Emulation\")\n$platformsDefinitionPath = [System.IO.Path]::Combine($emulationDirPath, \"Platforms.yaml\")\n$retroArchEmuDefinitionPath = [System.IO.Path]::Combine($emulationDirPath, \"Emulators\", \"RetroArch\", \"emulator.yaml\")\n\nif (!(Test-Path $platformsDefinitionPath -Type Leaf))\n{\n    Write-Host \"Playnite platforms definition file not found in $platformsDefinitionPath\" -ForegroundColor Yellow\n    return\n}\n\n$ignoreList = @( \n    \"00_example_libretro.info\",\n    \"2048_libretro.info\",\n    \"3dengine_libretro.info\",\n    \"advanced_tests_libretro.info\",\n    \"bk_libretro.info\",\n    \"boom3_libretro.info\",\n    \"boom3_xp_libretro.info\",\n    \"cannonball_libretro.info\",\n    \"chaigame_libretro.info\",\n    \"chailove_libretro.info\",\n    \"craft_libretro.info\",\n    \"cruzes_libretro.info\",\n    \"dhewm3_libretro.info\",\n    \"dinothawr_libretro.info\",\n    \"ecwolf_libretro.info\",\n    \"ffmpeg_libretro.info\",\n    \"freechaf_libretro.info\",\n    \"freej2me_libretro.info\",\n    \"gme_libretro.info\",\n    \"hbmame_libretro.info\",\n    \"imageviewer_libretro.info\",\n    \"lutro_libretro.info\",\n    \"mojozork_libretro.info\",\n    \"mpv_libretro.info\",\n    \"mrboom_libretro.info\",\n    \"mu_libretro.info\",\n    \"nxengine_libretro.info\",\n    \"oberon_libretro.info\",\n    \"openlara_libretro.info\",\n    \"opentyrian_libretro.info\",\n    \"pascal_pong_libretro.info\",\n    \"pocketcdg_libretro.info\",\n    \"pokemini_libretro.info\",\n    \"prboom_libretro.info\",\n    \"quasi88_libretro.info\",\n    \"redbook_libretro.info\",\n    \"reminiscence_libretro.info\",\n    \"remotejoy_libretro.info\",\n    \"rvvm_libretro.info\",\n    \"scummvm_libretro.info\",\n    \"simcp_libretro.info\",\n    \"squirreljme_libretro.info\",\n    \"stonesoup_libretro.info\",\n    \"test_libretro.info\",\n    \"test_netplay_libretro.info\",\n    \"testaudio_callback_libretro.info\",\n    \"testaudio_no_callback_libretro.info\",\n    \"testaudio_playback_wav_libretro.info\",\n    \"testgl_compute_shaders_libretro.info\",\n    \"testgl_ff_libretro.info\",\n    \"testgl_libretro.info\",\n    \"testinput_buttontest_libretro.info\",\n    \"testretroluxury_libretro.info\",\n    \"testsw_libretro.info\",\n    \"testsw_vram_libretro.info\",\n    \"testvulkan_async_compute_libretro.info\",\n    \"testvulkan_libretro.info\",\n    \"thepowdertoy_libretro.info\",\n    \"tic80_libretro.info\",\n    \"tyrquake_libretro.info\",\n    \"ume2015_libretro.info\",\n    \"uw8_libretro.info\",\n    \"vaporspec_libretro.info\",\n    \"vitaquake2-rogue_libretro.info\",\n    \"vitaquake2-xatrix_libretro.info\",\n    \"vitaquake2-zaero_libretro.info\",\n    \"vitaquake2_libretro.info\",\n    \"vitaquake3_libretro.info\",\n    \"vitavoyager_libretro.info\",\n    \"wasm4_libretro.info\",\n    \"x1_libretro.info\",\n    \"xrick_libretro.info\"\n)\n\n$retroarchArcadeSystems = @(\n    \"16-bit (Various)\",\n    \"16-bit + 32X (Various)\",\n    \"Arcade (various)\",\n    \"CP System I\",\n    \"CP System II\",\n    \"CP System III\",\n    \"Multi (various)\",\n    \"Neo Geo\"\n)\n\n$retroarchMiscSystems = @(\n    \"2003 Game Engine\",\n    \"4\",\n    \"CHIP-8\",\n    \"Handheld Electronic\", #Handheld Electronic (GW)\n    \"LowRes NX\", #LowRes NX\n    \"Magnavox Odyssey2\", #133 \tPhilips Videopac G7000\n    \"Mega Duck\", # Mega Duck\n    \"Moonlight\", # Moonlight,\n    \"PICO8\", # PICO-8\n    \"Pong Game Clone\", # Gong,\n    \"RPG Maker 2000\",\n    \"SEGA Visual Memory Unit\", #VeMUlator / Sega VMU\n    \"Uzebox\" # Uzebox (Uzem)\n)\n\n$raCoreNameToPlatformIdsTranslate = @{\n    \"Gearsystem\" = @(\"sega_mastersystem\", \"sega_gamegear\", \"sega_sg1000\", \"coleco_vision\");\n    \"Genesis Plus GX\" = @(\"sega_mastersystem\", \"sega_gamegear\", \"sega_genesis\", \"sega_cd\");\n    \"Genesis Plus GX Wide\" = @(\"sega_mastersystem\", \"sega_gamegear\", \"sega_genesis\", \"sega_cd\");\n    \"nSide (Super Famicom Accuracy)\" = @(\"nintendo_super_nes\", \"nintendo_gameboy\", \"nintendo_gameboycolor\");\n    \"PicoDrive\" = @(\"sega_mastersystem\", \"sega_genesis\", \"sega_cd\", \"sega_32x\");\n    \"SMS Plus GX\" = @(\"sega_mastersystem\", \"sega_gamegear\", \"sega_sg1000\", \"coleco_vision\");\n}\n\n$raSystemIdToPlatformIdsTranslate = @{\n    \"msx\" = @(\"microsoft_msx\", \"microsoft_msx2\");\n    \"neo_geo_pocket\" = @(\"snk_neogeopocket\", \"snk_neogeopocket_color\");\n}\n\n$raSystemNameToPlatformIdTranslate = @{\n    \"3DO\" = \"3do\";\n    \"3DS\" = \"nintendo_3ds\";\n    \"Amiga\" = \"commodore_amiga\";\n    \"Atari 2600\" = \"atari_2600\";\n    \"Atari 5200\" = \"atari_5200\";\n    \"Atari 7800\" = \"atari_7800\";\n    \"Atari ST\" = \"atari_st\";\n    \"C128\" = \"commodore_64\";\n    \"C64\" = \"commodore_64\";\n    \"C64 SuperCPU\" = \"commodore_64\";\n    \"CBM-5x0\" = \"commodore_cbm5x0\";\n    \"CBM-II\" = \"commodore_cbm2\";\n    \"CD\" = \"nec_turbografx_cd\";\n    \"ColecoVision\" = \"coleco_vision\";\n    \"Color\" = \"bandai_wonderswan_color\";\n    \"Commodore Amiga\" = \"commodore_amiga\";\n    \"CPC\" = \"amstrad_cpc\";\n    \"DOS\" = \"pc_dos\";\n    \"DS\" = \"nintendo_ds\";\n    \"Falcon\" = \"atari_falcon030\";\n    \"Game Boy\" = \"nintendo_gameboy\";\n    \"Game Boy Advance\" = \"nintendo_gameboyadvance\";\n    \"Game Boy Color\" = \"nintendo_gameboycolor\";\n    \"GameCube\" = \"nintendo_gamecube\";\n    \"GG\" = \"sega_gamegear\";\n    \"Intellivision\" = \"mattel_intellivision\";\n    \"Jaguar\" = \"atari_jaguar\";\n    \"Lynx\" = \"atari_lynx\";\n    \"Nintendo 64\" = \"nintendo_64\";\n    \"Nintendo DS\" = \"nintendo_ds\";\n    \"Nintendo Entertainment System\" = \"nintendo_nes\";\n    \"PC\" = \"pc_dos\";\n    \"PC Engine\" = \"nec_turbografx_16\";\n    \"PC Engine SuperGrafx\" = \"nec_supergrafx\";\n    \"PC-98\" = \"nec_pc98\";\n    \"PC-FX\" = \"nec_pcfx\";\n    \"PCE-CD\" = \"nec_turbografx_cd\";\n    \"PET\" = \"commodore_pet\";\n    \"PlayStation\" = \"sony_playstation\";\n    \"PLUS\" = \"commodore_plus4\";\n    \"PSP\" = \"sony_psp\";\n    \"Saturn\" = \"sega_saturn\";\n    \"Sega Dreamcast\" = \"sega_dreamcast\";\n    \"Sega Genesis\" = \"sega_genesis\";\n    \"Sega Master System\" = \"sega_mastersystem\";\n    \"Sharp X68000\" = \"sharp_x68000\";\n    \"SNK Neo Geo CD\" = \"snk_neogeo_cd\";\n    \"Sony PlayStation 2\" = \"sony_playstation2\";\n    \"STE\" = \"atari_st\";\n    \"Super Nintendo Entertainment System\" = \"nintendo_super_nes\";\n    \"SuperGrafx\" = \"nec_supergrafx\";\n    \"Supervision\" = \"watara_supervision\";\n    \"SVI\" = \"microsoft_msx\";\n    \"Thomson MO\" = \"thomson_mo5\";\n    \"TO\" = \"thomson_to7\";\n    \"TT\" = \"atari_st\"; # The Atari TT030 is a member of the Atari ST family\n    \"Vectrex\" = \"vectrex\";\n    \"VIC-20\" = \"commodore_vci20\";\n    \"Virtual Boy\" = \"nintendo_virtualboy\";\n    \"Wii\" = \"nintendo_wii\";\n    \"WonderSwan\" = \"bandai_wonderswan\";\n    \"Xbox\" = \"xbox\";\n    \"ZX Spectrum (various)\" = \"sinclair_zxspectrum\";\n    \"ZX81\" = \"sinclair_zx81\";\n}\n\n$emuDefinitionTemplate = \"Id: retroarch\nName: RetroArch\nWebsite: 'http://www.retroarch.com/'\nProfiles:\n{0}\"\n\n$profileTemplate = '  - Name: {0}\n    StartupArguments: ''-L \".\\cores\\{1}.dll\" \"{{ImagePath}}\"''\n    Platforms: [{2}]\n    ImageExtensions: [{3}]\n    ProfileFiles: [''cores\\{4}.dll'']\n    StartupExecutable: ^retroarch\\.exe$'\n\n$existingProfileReaddTemplate = '  - Name: {0}\n    StartupArguments: ''{1}''\n    Platforms: [{2}]\n    ImageExtensions: [{3}]\n    ProfileFiles: [''{4}'']\n    StartupExecutable: ^retroarch\\.exe$'\n\n$existingEmuDefinition = Get-Content $retroArchEmuDefinitionPath -Raw | ConvertFrom-Yaml\n$usedProfileNames = @()\n$existingProfiles = @{}\nforeach ($existingProfile in $existingEmuDefinition.Profiles) {\n    $existingProfiles[$existingProfile.ProfileFiles[0]] = $existingProfile\n    $usedProfileNames += $existingProfile.Name\n}\n\n$foundCoreNames = @()\n$foundPlatformIds = @()\n$profiles = @()\n$infoPath = Join-Path $RetroArchDir \"info\"\n$infoFiles = Get-ChildItem $infoPath -Filter \"*.info\"\nforeach ($infoFile in $infoFiles)\n{\n    if ($ignoreList.Contains($infoFile.Name))\n    {\n        continue\n    }\n    \n    $coreInfo = ParseInfoFile $infoFile.FullName\n    $coreFile = \"cores\\{0}.dll\" -f $infoFile.BaseName\n    $platformIds = @()\n    if ($existingProfiles.ContainsKey($coreFile))\n    {\n        $coreName = $existingProfiles[$coreFile].Name\n        $platformIds = $existingProfiles[$coreFile].Platforms\n    }\n    else\n    {\n        if ($usedProfileNames.Contains($coreInfo.corename))\n        {\n            $coreName = \"{0} - {1}\" -f $coreInfo.corename, $coreInfo.display_name\n        }\n        else\n        {\n            $coreName = $coreInfo.corename\n        }\n    }\n    \n    if (!($coreInfo.ContainsKey(\"corename\")))\n    {\n        Write-Host \"$($infoFile.Name) does not contain the core name\" -ForegroundColor Yellow # Some cores like anarch_libretro.info don't contain a core name\n        continue\n    }\n    \n    $coreInfoCoreName = $coreInfo.corename\n    if ($raCoreNameToPlatformIdsTranslate.ContainsKey($coreInfoCoreName))\n    {\n        $platformIds = $raCoreNameToPlatformIdsTranslate[$coreInfoCoreName]\n    }\n    elseif ($null -ne $coreInfo.systemid -and $raSystemIdToPlatformIdsTranslate.ContainsKey($coreInfo.systemid.Trim()))\n    {\n        $platformIds = $raSystemIdToPlatformIdsTranslate[$coreInfo.systemid.Trim()]\n    }\n    else\n    {\n        if (!($coreInfo.ContainsKey(\"systemname\")))\n        {\n            Write-Host \"$($infoFile.Name) does not contain systemname\" -ForegroundColor Yellow # galaksija_libretro.info\n            continue\n        }\n\n        $coreInfo.systemname.Split(\"/\", [System.StringSplitOptions]::RemoveEmptyEntries) | ForEach-Object {\n            $system = $_.Trim()\n            if (($retroarchArcadeSystems -contains $system) -or ($retroarchMiscSystems -contains $system))\n            {\n                Continue\n            }\n\n            if ($raSystemNameToPlatformIdTranslate.ContainsKey($system))\n            {\n                $platformId = $raSystemNameToPlatformIdTranslate[$system]\n                if ($platformIds -notcontains $platformId)\n                {\n                    $platformIds += $platformId\n                }\n            }\n            else\n            {\n                Write-Host \"System to platform translate not found. System: $system, CoreName: $($coreInfo.corename), DisplayName: $($coreInfo.display_name)\" -ForegroundColor Yellow\n            }\n        }\n    }\n\n    if ($null -eq $platformIds -or $platformIds.Count -eq 0)\n    {\n        Write-Host \"PlatformIds not found. System: $system, CoreName: $($coreInfo.corename), DisplayName: $($coreInfo.display_name)\" -ForegroundColor Yellow\n        continue\n    }\n\n    if ($coreInfo.supported_extensions)\n    {\n        $extensions = @()\n        $coreInfo.supported_extensions.Split(\"|\", [System.StringSplitOptions]::RemoveEmptyEntries) | ForEach-Object {\n            $extensions += $_\n        }\n\n        if ($extensions -notcontains \"zip\")\n        {\n            $extensions += \"zip\"\n        }\n\n        if ($extensions -notcontains \"7z\")\n        {\n            $extensions += \"7z\"\n        }\n        \n        $extensions = $extensions | Sort-Object\n        $extensionsString = [System.String]::Join(\", \", $extensions)\n    }\n    else\n    {\n        Write-Host \"Profile did not have extensions. System: $system, CoreName: $($coreInfo.corename), DisplayName: $($coreInfo.display_name)\" -ForegroundColor Yellow\n        continue\n    }\n\n    foreach ($platformId in $platformIds) {\n        if ($foundPlatformIds -notcontains $platformId)\n        {\n            $foundPlatformIds += $platformId\n        }\n    }\n\n    $platformIds = $platformIds | Sort-Object\n    $extensions = $extensions | Sort-Object\n    $platformIdsString = [System.String]::Join(\", \", $platformIds)\n    $profileString = $profileTemplate -f $coreName, $infoFile.BaseName, $platformIdsString, $extensionsString, $infoFile.BaseName\n    $profiles += $profileString\n    $foundCoreNames += $coreName\n    $usedProfileNames += $coreName\n}\n\n# Previous profiles need to be kept or existing emulator configuration will break\n# Here emulators not generated will be added back\nforeach ($existingProfile in $existingEmuDefinition.Profiles) {\n    if ($foundCoreNames -notcontains $existingProfile.Name)\n    {\n        foreach ($platformId in $existingProfile.Platforms) {\n            if ($foundPlatformIds -notcontains $platformId)\n            {\n                $foundPlatformIds += $platformId\n            }\n        }\n\n        $platformIds = [System.String]::Join(\", \", ($existingProfile.Platforms | Sort-Object))\n        $extensionsString = [System.String]::Join(\", \", ($existingProfile.ImageExtensions | Sort-Object))\n        $profileFilesString = [System.String]::Join(\", \", ($existingProfile.ProfileFiles | Sort-Object))\n        $profileString = $existingProfileReaddTemplate -f  $existingProfile.Name, $existingProfile.StartupArguments, $platformIds, $extensionsString, $profileFilesString\n        $profiles += $profileString\n        Write-Host \"Existing profile $($existingProfile.Name) not found in newly generated definition and was added back from previous definition\" -ForegroundColor Yellow\n    }\n}\n\n# Join generated profiles and validated created profile yaml content\n$profiles = $profiles | Sort-Object\n$profilesString = [System.String]::Join(\"`n`n\", $profiles)\n$emuDefinitionContent = $emuDefinitionTemplate -f $profilesString\nif ((Get-IsYamlValid $emuDefinitionContent) -eq $false)\n{\n    Write-Host \"Newly generated profile definition file is not valid!\" -ForegroundColor Red\n    Set-Clipboard $emuDefinitionContent\n    return\n}\n\n# Add RetroArch to emulators list in Playnite platforms definitions\n$platformDefinitionTemplate = '- Name: {0}\n{1}'\n\n$newPlatformsDefinitions = @()\n$existingPlatformsDefinition = Get-Content $platformsDefinitionPath -Raw | ConvertFrom-Yaml\nforeach ($platform in $existingPlatformsDefinition) {\n    $platformData = @()\n    $platformData += \"  Id: {0}\" -f $platform.Id\n    if ($platform.IgdbId)\n    {\n        $platformData += \"IgdbId: {0}\" -f $platform.IgdbId\n    }\n\n    if ($platform.Databases)\n    {\n        $platformData +=  \"Databases: [{0}]\" -f [System.String]::Join(\", \", ($platform.Databases | Sort-Object))\n    }\n\n    $isSupportedByRetroArch = $foundPlatformIds -contains $platform.Id\n    if ($platform.Emulators)\n    {\n        if ($isSupportedByRetroArch -and ($platform.Emulators -notcontains \"retroarch\"))\n        {\n            $platform.Emulators += \"retroarch\"\n            $platform.Emulators = $platform.Emulators | Sort-Object\n            Write-Host \"Added retroarch emulator to `\"$($platform.Name)`\" platform\" -ForegroundColor Blue\n        }\n        $platformData +=  \"Emulators: [{0}]\" -f [System.String]::Join(\", \", ($platform.Emulators | Sort-Object))\n    }\n    elseif ($isSupportedByRetroArch)\n    {\n        $platformData +=  \"Emulators: [{0}]\" -f \"retroarch\"\n    }\n    \n    $platformDataString = $platformDefinitionTemplate -f $platform.Name, [System.String]::Join(\"`n  \", $platformData)\n    $newPlatformsDefinitions += $platformDataString\n}\n\n$newPlatformsDefinitionsContent = [System.String]::Join(\"`n  `n\", $newPlatformsDefinitions)\n\n# Validate created platforms definition yaml content\nif ((Get-IsYamlValid $newPlatformsDefinitionsContent) -eq $false)\n{\n    Write-Host \"Newly generated platforms definition file is not valid!\" -ForegroundColor Red\n    Set-Clipboard $newPlatformsDefinitionsContent\n    return\n}\n\n# Save generated yaml files. New lines are replaced to maintain CRLF endings\n[System.IO.File]::WriteAllLines($retroArchEmuDefinitionPath, $emuDefinitionContent.Replace(\"`n\",\"`r`n\"), [System.Text.Encoding]::UTF8)\n[System.IO.File]::WriteAllLines($platformsDefinitionPath, $newPlatformsDefinitionsContent.Replace(\"`n\",\"`r`n\"), [System.Text.Encoding]::UTF8)\nWrite-Host \"RetroArch emulator and Playnite platforms definitions updated and saved successfully!\" -ForegroundColor Green"
  },
  {
    "path": "build/updateLocalizations.ps1",
    "content": "#Requires -Version 7\r\n\r\nparam(\r\n    [string]$AccessToken\r\n)\r\n\r\n$ErrorActionPreference = \"Stop\"\r\n\r\n$locDir = Join-Path $pwd \"..\\source\\Playnite\\Localization\"\r\n$urlRoot = \"https://crowdin.com/api/v2\"\r\n$playnitePrjId = 345875\r\n$requestHeaders = @{\r\n    \"Authorization\" = \"Bearer $AccessToken\"\r\n}\r\n\r\n$locProgressData = New-Object \"System.Collections.Specialized.OrderedDictionary\"\r\n$locProgress = Invoke-RestMethod -Method Get -Headers $requestHeaders -Uri \"$urlRoot/projects/$playnitePrjId/files/30/languages/progress?limit=100\" ` -ContentType \"application/json\"\r\nforeach ($lng in $locProgress.data)\r\n{\r\n    $locProgressData.Add($lng.data.languageId, $lng.data.translationProgress);\r\n    $locDownloadData = Invoke-RestMethod -Method Post -Headers $requestHeaders -Uri \"$urlRoot/projects/$playnitePrjId/translations/builds/files/30\" `\r\n                                         -Body \"{`\"targetLanguageId`\":`\"$($lng.data.languageId)`\"}\" -ContentType \"application/json\"\r\n\r\n    $tempFile = Join-Path $locDir \"temp.xaml\"\r\n    Remove-Item $tempFile -EA 0\r\n    $locDownload = Invoke-WebRequest -Uri $locDownloadData.data.url -OutFile $tempFile -PassThru\r\n    $locDownload.Headers[\"Content-Disposition\"][0] -match '\"(.+)\"' | Out-Null\r\n    $fileName = $Matches[1]\r\n    Move-Item $tempFile (Join-Path $locDir $fileName) -Force\r\n}\r\n\r\n$locProgressData | ConvertTo-Json | Out-File (Join-Path $locDir \"locstatus.json\")\r\n.\\VerifyLanguageFiles.ps1"
  },
  {
    "path": "crowdin.yml",
    "content": "files:\n  - source: LocSource.xaml\n    translation: /%original_path%/%locale_with_underscore%.xaml\n"
  },
  {
    "path": "source/.editorconfig",
    "content": "﻿[*.cs]\r\n\r\n# IDE0058: Expression value is never used\r\ndotnet_diagnostic.IDE0058.severity = none\r\n\r\n# IDE0036: Order modifiers\r\ndotnet_diagnostic.IDE0036.severity = none\r\n\r\n# IDE0025: Use expression body for properties\r\ndotnet_diagnostic.IDE0025.severity = none\r\n"
  },
  {
    "path": "source/Playnite/API/AddonsAPI.cs",
    "content": "﻿using Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.API\r\n{\r\n    public class AddonsAPI : IAddons\r\n    {\r\n        private readonly ExtensionFactory extensions;\r\n        private readonly PlayniteSettings settings;\r\n\r\n        public List<string> DisabledAddons => settings.DisabledPlugins.ToList();\r\n\r\n        public List<string> Addons => ExtensionFactory.GetInstalledManifests().Select(a => a.Id).ToList();\r\n\r\n        public List<Plugin> Plugins => extensions.Plugins.Select(a => a.Value.Plugin).ToList();\r\n\r\n        public AddonsAPI(ExtensionFactory extensions, PlayniteSettings settings)\r\n        {\r\n            this.extensions = extensions;\r\n            this.settings = settings;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/API/DatabaseAPI.cs",
    "content": "﻿using LiteDB;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.API\r\n{\r\n    public class DatabaseAPI : IGameDatabaseAPI\r\n    {\r\n        private GameDatabase database;\r\n\r\n#pragma warning disable CS0067\r\n        public event EventHandler DatabaseOpened;\r\n#pragma warning restore CS0067\r\n\r\n        public IItemCollection<Game> Games => database.Games;\r\n        public IItemCollection<Platform> Platforms => database.Platforms;\r\n        public IItemCollection<Emulator> Emulators => database.Emulators;\r\n        public IItemCollection<Genre> Genres => database.Genres;\r\n        public IItemCollection<Company> Companies => database.Companies;\r\n        public IItemCollection<Tag> Tags => database.Tags;\r\n        public IItemCollection<Category> Categories => database.Categories;\r\n        public IItemCollection<Series> Series => database.Series;\r\n        public IItemCollection<AgeRating> AgeRatings => database.AgeRatings;\r\n        public IItemCollection<Region> Regions => database.Regions;\r\n        public IItemCollection<GameSource> Sources => database.Sources;\r\n        public IItemCollection<GameFeature> Features => database.Features;\r\n        public IItemCollection<GameScannerConfig> GameScanners => database.GameScanners;\r\n        public IItemCollection<CompletionStatus> CompletionStatuses => database.CompletionStatuses;\r\n        public IItemCollection<ImportExclusionItem> ImportExclusions => database.ImportExclusions;\r\n        public IItemCollection<FilterPreset> FilterPresets => database.FilterPresets;\r\n\r\n        public string DatabasePath\r\n        {\r\n            get => database?.DatabasePath;\r\n        }\r\n\r\n        public bool IsOpen\r\n        {\r\n            get => database?.IsOpen == true;\r\n        }\r\n\r\n        public DatabaseAPI(GameDatabase database)\r\n        {\r\n            this.database = database;\r\n        }\r\n\r\n        public string AddFile(string path, Guid parentId)\r\n        {\r\n            if (!File.Exists(path))\r\n            {\r\n                throw new FileNotFoundException(\"Cannot add file to database, file not found.\");\r\n            }\r\n\r\n            return database.AddFile(path, parentId, false, CancellationToken.None);\r\n        }\r\n\r\n        public void SaveFile(string id, string path)\r\n        {\r\n            database.CopyFile(id, path);\r\n        }\r\n\r\n        public void RemoveFile(string id)\r\n        {\r\n            database.RemoveFile(id);\r\n        }\r\n\r\n        public IDisposable BufferedUpdate()\r\n        {\r\n            return database.BufferedUpdate();\r\n        }\r\n\r\n        public string GetFileStoragePath(Guid parentId)\r\n        {\r\n            return database.GetFileStoragePath(parentId);\r\n        }\r\n\r\n        public string GetFullFilePath(string databasePath)\r\n        {\r\n            return database.GetFullFilePath(databasePath);\r\n        }\r\n\r\n        public Game ImportGame(GameMetadata game)\r\n        {\r\n            return database.ImportGame(game);\r\n        }\r\n\r\n        public Game ImportGame(GameMetadata game, LibraryPlugin sourcePlugin)\r\n        {\r\n            return database.ImportGame(game, sourcePlugin.Id);\r\n        }\r\n\r\n        public void BeginBufferUpdate()\r\n        {\r\n            database.BeginBufferUpdate();\r\n        }\r\n\r\n        public void EndBufferUpdate()\r\n        {\r\n            database.EndBufferUpdate();\r\n        }\r\n\r\n        public bool GetGameMatchesFilter(Game game, FilterPresetSettings filterSettings)\r\n        {\r\n            return database.GetGameMatchesFilter(game, filterSettings, false);\r\n        }\r\n\r\n        public IEnumerable<Game> GetFilteredGames(FilterPresetSettings filterSettings)\r\n        {\r\n            return database.GetFilteredGames(filterSettings, false);\r\n        }\r\n\r\n        public bool GetGameMatchesFilter(Game game, FilterPresetSettings filterSettings, bool useFuzzyNameMatch)\r\n        {\r\n            return database.GetGameMatchesFilter(game, filterSettings, useFuzzyNameMatch);\r\n        }\r\n\r\n        public IEnumerable<Game> GetFilteredGames(FilterPresetSettings filterSettings, bool useFuzzyNameMatch)\r\n        {\r\n            return database.GetFilteredGames(filterSettings, useFuzzyNameMatch);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/API/DesignData/DesignNotificationsAPI.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.API.DesignData\r\n{\r\n    public class DesignNotificationsAPI : ObservableObject, INotificationsAPI\r\n    {\r\n        public RelayCommand<object> RemoveAllCommands\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveAll();\r\n            });\r\n        }\r\n\r\n        public ObservableCollection<NotificationMessage> Messages { get; set; }\r\n\r\n        public int Count { get; }\r\n\r\n        public DesignNotificationsAPI()\r\n        {\r\n            Count = 3;\r\n            Messages = new ObservableCollection<NotificationMessage>\r\n            {\r\n                new NotificationMessage(\"design1\", \"Design notification message 1\", NotificationType.Error),\r\n                new NotificationMessage(\"design2\", \"Design message 2\", NotificationType.Info),\r\n                new NotificationMessage(\"design3\", \"Design notification message 3, long message that does to multiple lies. Long message that does to multiple lies.\", NotificationType.Error)\r\n            };\r\n        }\r\n\r\n        public void Add(NotificationMessage message)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void Add(string id, string text, NotificationType type)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void Remove(string id)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void RemoveAll()\r\n        {\r\n            Messages.Clear();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/API/DesignData/DesignPlayniteAPI.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.SDK.Events;\r\n\r\nnamespace Playnite.API.DesignData\r\n{\r\n    public class DesignPlayniteAPI : IPlayniteAPI\r\n    {\r\n        public IMainViewAPI MainView => throw new NotImplementedException();\r\n\r\n        public IGameDatabaseAPI Database => throw new NotImplementedException();\r\n\r\n        public IDialogsFactory Dialogs => throw new NotImplementedException();\r\n\r\n        public IPlaynitePathsAPI Paths => throw new NotImplementedException();\r\n\r\n        public INotificationsAPI Notifications { get; } = new DesignNotificationsAPI();\r\n\r\n        public IPlayniteInfoAPI ApplicationInfo => throw new NotImplementedException();\r\n\r\n        public IWebViewFactory WebViews => throw new NotImplementedException();\r\n\r\n        public IResourceProvider Resources => throw new NotImplementedException();\r\n\r\n        public IUriHandlerAPI UriHandler => throw new NotImplementedException();\r\n\r\n        public IPlayniteSettingsAPI ApplicationSettings => throw new NotImplementedException();\r\n\r\n        public IAddons Addons => throw new NotImplementedException();\r\n\r\n        public IEmulationAPI Emulation => throw new NotImplementedException();\r\n\r\n        public void AddCustomElementSupport(Plugin source, AddCustomElementSupportArgs args)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public ILogger CreateLogger(string name)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public ILogger CreateLogger()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public string ExpandGameVariables(Game game, string inputString)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public GameAction ExpandGameVariables(Game game, GameAction action)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void StartGame(Guid gameId)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void InstallGame(Guid gameId)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void UninstallGame(Guid gameId)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void AddSettingsSupport(Plugin source, AddSettingsSupportArgs args)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void AddConvertersSupport(Plugin source, AddConvertersSupportArgs args)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public List<GamepadController> GetConnectedControllers()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public string ExpandGameVariables(Game game, string inputString, string emulatorDir)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/API/NotificationsAPI.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.API\r\n{\r\n    public class NotificationsAPI : ObservableObject, INotificationsAPI\r\n    {\r\n        public class MessageEventArgs : EventArgs\r\n        {\r\n            public NotificationMessage Message { get; }\r\n\r\n            public MessageEventArgs(NotificationMessage message)\r\n            {\r\n                Message = message;\r\n            }\r\n        }\r\n\r\n        private readonly SynchronizationContext context;\r\n\r\n        public event EventHandler<MessageEventArgs> ActivationRequested;\r\n        public event EventHandler<MessageEventArgs> CloseRequested;\r\n\r\n        public ObservableCollection<NotificationMessage> Messages\r\n        {\r\n            get;\r\n        }\r\n\r\n        public int Count\r\n        {\r\n            get => Messages.Count;\r\n        }\r\n\r\n        public NotificationsAPI()\r\n        {\r\n            context = SynchronizationContext.Current;\r\n            Messages = new ObservableCollection<NotificationMessage>();\r\n        }\r\n\r\n        private void Message_Activated(object sender, EventArgs e)\r\n        {\r\n            ActivationRequested(this, new MessageEventArgs(sender as NotificationMessage));\r\n        }\r\n\r\n        private void Message_Closed(object sender, EventArgs e)\r\n        {\r\n            CloseRequested(this, new MessageEventArgs(sender as NotificationMessage));\r\n        }\r\n\r\n        public void Add(NotificationMessage message)\r\n        {\r\n            context.Send((c =>\r\n            {\r\n                if (!Messages.Any(a => a.Id == message.Id))\r\n                {\r\n                    message.Activated += Message_Activated;\r\n                    message.Closed += Message_Closed;\r\n                    Messages.Add(message);\r\n                    OnPropertyChanged(nameof(Count));\r\n                }\r\n            }), null);\r\n        }\r\n\r\n        public void Add(string id, string text, NotificationType type)\r\n        {\r\n            context.Send((c =>\r\n            {\r\n                if (!Messages.Any(a => a.Id == id))\r\n                {\r\n                    Add(new NotificationMessage(id, text, type));\r\n                }\r\n            }), null);\r\n        }\r\n\r\n        public void Remove(string id)\r\n        {\r\n            context.Send((c =>\r\n            {\r\n                var message = Messages.FirstOrDefault(a => a.Id == id);\r\n                if (message != null)\r\n                {\r\n                    message.Activated -= Message_Activated;\r\n                    message.Closed -= Message_Closed;\r\n                    Messages.Remove(message);\r\n                    OnPropertyChanged(nameof(Count));\r\n                }\r\n            }), null);\r\n        }\r\n\r\n        public void RemoveAll()\r\n        {\r\n            context.Send((c =>\r\n            {\r\n                foreach (var message in Messages)\r\n                {\r\n                    message.Activated -= Message_Activated;\r\n                    message.Closed -= Message_Closed;\r\n                }\r\n\r\n                Messages.Clear();\r\n                OnPropertyChanged(nameof(Count));\r\n            }), null);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/API/PlayniteAPI.cs",
    "content": "﻿using Newtonsoft.Json;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Settings;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing Playnite.Plugins;\r\nusing System.Threading;\r\nusing Playnite.Database;\r\nusing Playnite.Input;\r\nusing Playnite.SDK.Events;\r\nusing static Microsoft.Scripting.Hosting.Shell.ConsoleHostOptions;\r\n\r\nnamespace Playnite.API\r\n{\r\n    public interface IPlayniteAPIRoot\r\n    {\r\n        string ExpandGameVariables(Game game, string inputString);\r\n        GameAction ExpandGameVariables(Game game, GameAction action);\r\n        string ExpandGameVariables(Game game, string inputString, string emulatorDir);\r\n        void StartGame(Guid gameId);\r\n        void InstallGame(Guid gameId);\r\n        void UninstallGame(Guid gameId);\r\n        void AddCustomElementSupport(Plugin source, AddCustomElementSupportArgs args);\r\n        void AddSettingsSupport(Plugin source, AddSettingsSupportArgs args);\r\n        void AddConvertersSupport(Plugin source, AddConvertersSupportArgs args);\r\n        List<GamepadController> GetConnectedControllers();\r\n    }\r\n\r\n    public class PlayniteApiRoot : IPlayniteAPIRoot\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly GamesEditor gameEditor;\r\n        private readonly ExtensionFactory extensions;\r\n        private readonly GameDatabase database;\r\n        private readonly ViewModels.MainViewModelBase mainModel;\r\n        private readonly SynchronizationContext execContext;\r\n\r\n        public PlayniteApiRoot(\r\n            GamesEditor gameEditor,\r\n            ExtensionFactory extensions,\r\n            GameDatabase database,\r\n            ViewModels.MainViewModelBase mainModel)\r\n        {\r\n            this.gameEditor = gameEditor;\r\n            this.extensions = extensions;\r\n            this.database = database;\r\n            this.mainModel = mainModel;\r\n            execContext = SynchronizationContext.Current;\r\n        }\r\n\r\n        public string ExpandGameVariables(Game game, string inputString)\r\n        {\r\n            return game?.ExpandVariables(inputString);\r\n        }\r\n\r\n        public string ExpandGameVariables(Game game, string inputString, string emulatorDir)\r\n        {\r\n            return game?.ExpandVariables(inputString, emulatorDir: emulatorDir);\r\n        }\r\n\r\n        public GameAction ExpandGameVariables(Game game, GameAction action)\r\n        {\r\n            return action?.ExpandVariables(game);\r\n        }\r\n\r\n        public void StartGame(Guid gameId)\r\n        {\r\n            var game = database.Games.Get(gameId);\r\n            if (game == null)\r\n            {\r\n                logger.Error($\"Can't start game, game ID {gameId} not found.\");\r\n            }\r\n            else\r\n            {\r\n                // Run on main thread for edge cases like this:\r\n                // https://www.reddit.com/r/playnite/comments/slyg99/boot_another_game_as_a_play_action/\r\n                execContext.Send((_) => gameEditor.PlayGame(game, false), null);\r\n            }\r\n        }\r\n\r\n        public void InstallGame(Guid gameId)\r\n        {\r\n            var game = database.Games.Get(gameId);\r\n            if (game == null)\r\n            {\r\n                logger.Error($\"Can't install game, game ID {gameId} not found.\");\r\n            }\r\n            else\r\n            {\r\n                gameEditor.InstallGame(game);\r\n            }\r\n        }\r\n\r\n        public void UninstallGame(Guid gameId)\r\n        {\r\n            var game = database.Games.Get(gameId);\r\n            if (game == null)\r\n            {\r\n                logger.Error($\"Can't uninstall game, game ID {gameId} not found.\");\r\n            }\r\n            else\r\n            {\r\n                gameEditor.UnInstallGame(game);\r\n            }\r\n        }\r\n\r\n        public void AddCustomElementSupport(Plugin source, AddCustomElementSupportArgs args)\r\n        {\r\n            extensions.AddCustomElementSupport(source, args);\r\n        }\r\n\r\n        public void AddSettingsSupport(Plugin source, AddSettingsSupportArgs args)\r\n        {\r\n            extensions.AddSettingsSupport(source, args);\r\n        }\r\n\r\n        public void AddConvertersSupport(Plugin source, AddConvertersSupportArgs args)\r\n        {\r\n            extensions.AddConvertersSupport(source, args);\r\n        }\r\n\r\n        public List<GamepadController> GetConnectedControllers()\r\n        {\r\n            return mainModel.App.GameController.Controllers.Cast<GamepadController>().ToList();\r\n        }\r\n    }\r\n\r\n    public class PlayniteAPI : IPlayniteAPI\r\n    {\r\n        public IPlayniteAPIRoot RootApi { get; set; }\r\n        public IDialogsFactory Dialogs { get; set; }\r\n        public IGameDatabaseAPI Database { get; set; }\r\n        public IMainViewAPI MainView { get; set; }\r\n        public IPlaynitePathsAPI Paths { get; set; }\r\n        public IPlayniteInfoAPI ApplicationInfo { get; set; }\r\n        public IWebViewFactory WebViews { get; set; }\r\n        public IResourceProvider Resources { get; set; }\r\n        public INotificationsAPI Notifications { get; set; }\r\n        public IUriHandlerAPI UriHandler { get; set; }\r\n        public IPlayniteSettingsAPI ApplicationSettings { get; set; }\r\n        public IAddons Addons { get; set; }\r\n        public IEmulationAPI Emulation { get; set; }\r\n\r\n        public PlayniteAPI()\r\n        {\r\n        }\r\n\r\n        public string ExpandGameVariables(Game game, string inputString)\r\n        {\r\n            return RootApi.ExpandGameVariables(game, inputString);\r\n        }\r\n\r\n        public string ExpandGameVariables(Game game, string inputString, string emulatorDir)\r\n        {\r\n            return RootApi.ExpandGameVariables(game, inputString, emulatorDir);\r\n        }\r\n\r\n        public GameAction ExpandGameVariables(Game game, GameAction action)\r\n        {\r\n            return RootApi.ExpandGameVariables(game, action);\r\n        }\r\n\r\n        public void StartGame(Guid gameId)\r\n        {\r\n            RootApi.StartGame(gameId);\r\n        }\r\n\r\n        public void InstallGame(Guid gameId)\r\n        {\r\n            RootApi.InstallGame(gameId);\r\n        }\r\n\r\n        public void UninstallGame(Guid gameId)\r\n        {\r\n            RootApi.UninstallGame(gameId);\r\n        }\r\n\r\n        public void AddCustomElementSupport(Plugin source, AddCustomElementSupportArgs args)\r\n        {\r\n            RootApi.AddCustomElementSupport(source, args);\r\n        }\r\n\r\n        public void AddSettingsSupport(Plugin source, AddSettingsSupportArgs args)\r\n        {\r\n            RootApi.AddSettingsSupport(source, args);\r\n        }\r\n\r\n        public void AddConvertersSupport(Plugin source, AddConvertersSupportArgs args)\r\n        {\r\n            RootApi.AddConvertersSupport(source, args);\r\n        }\r\n\r\n        public List<GamepadController> GetConnectedControllers()\r\n        {\r\n            return RootApi.GetConnectedControllers();\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/API/PlayniteInfoAPI.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.API\r\n{\r\n    public class PlayniteInfoAPI : IPlayniteInfoAPI\r\n    {\r\n        public System.Version ApplicationVersion { get => Updater.CurrentVersion; }\r\n\r\n        public ApplicationMode Mode => PlayniteApplication.Current.Mode;\r\n\r\n        public bool IsPortable => PlayniteSettings.IsPortable;\r\n\r\n        public bool InOfflineMode => PlayniteEnvironment.InOfflineMode;\r\n\r\n        public bool IsDebugBuild => PlayniteEnvironment.IsDebugBuild;\r\n\r\n        public bool ThrowAllErrors => PlayniteEnvironment.ThrowAllErrors;\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/API/PlaynitePathsAPI.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.API\r\n{\r\n    public class PlaynitePathsAPI : IPlaynitePathsAPI\r\n    {\r\n        public bool IsPortable { get => PlayniteSettings.IsPortable; }\r\n\r\n        public string ApplicationPath { get => PlaynitePaths.ProgramPath; }\r\n\r\n        public string ConfigurationPath { get => PlaynitePaths.ConfigRootPath; }\r\n\r\n        public string ExtensionsDataPath { get => PlaynitePaths.ExtensionsDataPath; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/API/PlayniteSettingsAPI.cs",
    "content": "﻿using Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.API\r\n{\r\n    public class FullscreenSettingsAPI : IFullscreenSettingsAPI\r\n    {\r\n        private readonly FullscreenSettings settings;\r\n\r\n        public bool IsMusicMuted\r\n        {\r\n            get => settings.IsMusicMuted;\r\n            set => settings.IsMusicMuted = value;\r\n        }\r\n\r\n        public bool SwapConfirmCancelButtons => settings.SwapConfirmCancelButtons;\r\n        public bool SwapStartDetailsAction => settings.SwapStartDetailsAction;\r\n        public bool GuideButtonFocus => settings.GuideButtonFocus;\r\n\r\n        public FullscreenSettingsAPI(FullscreenSettings settings)\r\n        {\r\n            this.settings = settings;\r\n        }\r\n    }\r\n\r\n    public class CompletionStatusSettignsApi : ICompletionStatusSettignsApi\r\n    {\r\n        private readonly GameDatabase db;\r\n        public CompletionStatusSettignsApi(GameDatabase database)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public Guid DefaultStatus => db.GetCompletionStatusSettings().DefaultStatus;\r\n        public Guid PlayedStatus => db.GetCompletionStatusSettings().DefaultStatus;\r\n    }\r\n\r\n    public class PlayniteSettingsAPI : IPlayniteSettingsAPI\r\n    {\r\n        private readonly PlayniteSettings settings;\r\n        private readonly GameDatabase db;\r\n\r\n        public int Version => settings.Version;\r\n        public int GridItemWidthRatio => settings.GridItemWidthRatio;\r\n        public int GridItemHeightRatio => settings.GridItemHeightRatio;\r\n        public bool FirstTimeWizardComplete => settings.FirstTimeWizardComplete;\r\n        public bool DisableHwAcceleration => settings.DisableHwAcceleration;\r\n        public bool AsyncImageLoading => settings.AsyncImageLoading;\r\n        public bool DownloadMetadataOnImport => settings.DownloadMetadataOnImport;\r\n        public bool InstallSizeScanUseSizeOnDisk => settings.InstallSizeScanUseSizeOnDisk;\r\n        public bool ScanLibInstallSizeOnLibUpdate => settings.ScanLibInstallSizeOnLibUpdate;\r\n        public bool StartInFullscreen => settings.StartInFullscreen;\r\n        public string DatabasePath => settings.DatabasePath;\r\n        public bool MinimizeToTray => settings.MinimizeToTray;\r\n        public bool CloseToTray => settings.CloseToTray;\r\n        public bool EnableTray => settings.EnableTray;\r\n        public string Language => settings.Language == \"english\" ? \"en_US\" : settings.Language;\r\n        public bool UpdateLibStartup => settings.CheckForLibraryUpdates == LibraryUpdateCheckFrequency.OnEveryStartup;\r\n        public string DesktopTheme => settings.Theme;\r\n        public string FullscreenTheme => settings.Fullscreen.Theme;\r\n        public bool StartMinimized => settings.StartMinimized;\r\n        public bool StartOnBoot => settings.StartOnBoot;\r\n        public string FontFamilyName => settings.FontFamilyName;\r\n        public bool DiscordPresenceEnabled => settings.DiscordPresenceEnabled;\r\n        public AgeRatingOrg AgeRatingOrgPriority => settings.AgeRatingOrgPriority;\r\n        public bool SidebarVisible => settings.ShowSidebar;\r\n        public Dock SidebarPosition => settings.SidebarPosition;\r\n        public IFullscreenSettingsAPI Fullscreen { get; }\r\n        public ICompletionStatusSettignsApi CompletionStatus { get; }\r\n        public bool ForcePlayTimeSync => false;\r\n        public PlaytimeImportMode PlaytimeImportMode => settings.PlaytimeImportMode;\r\n\r\n        public PlayniteSettingsAPI(PlayniteSettings settings, GameDatabase db)\r\n        {\r\n            this.settings = settings;\r\n            this.db = db;\r\n            Fullscreen = new FullscreenSettingsAPI(settings.Fullscreen);\r\n            CompletionStatus = new CompletionStatusSettignsApi(db);\r\n        }\r\n\r\n        public bool GetGameExcludedFromImport(string gameId, Guid libraryId)\r\n        {\r\n            if (gameId.IsNullOrEmpty() || libraryId == Guid.Empty)\r\n            {\r\n                throw new ArgumentNullException(\"gameId and libraryId must be specified.\");\r\n            }\r\n\r\n            return db.ImportExclusions.Get(ImportExclusionItem.GetId(gameId, libraryId)) != null;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Addons/Addons.cs",
    "content": "﻿using Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.Services;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public enum AddonUpdateStatus\r\n    {\r\n        [Description(\"\")]\r\n        None,\r\n        [Description(LOC.AddonUpdateStatusDownloaded)]\r\n        Downloaded,\r\n        [Description(LOC.AddonUpdateStatusFailed)]\r\n        Failed,\r\n        [Description(LOC.AddonUpdateStatusLicenseRejected)]\r\n        LicenseRejected,\r\n    }\r\n\r\n    public class AddonUpdate : SelectableItem<AddonManifest>\r\n    {\r\n        public string UpdateInfo { get; set; }\r\n        public string Changelog { get; set; }\r\n        public AddonInstallerPackage Package { get; set; }\r\n\r\n        private AddonUpdateStatus status = AddonUpdateStatus.None;\r\n        public AddonUpdateStatus Status\r\n        {\r\n            get => status;\r\n            set\r\n            {\r\n                status = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string statusMessage;\r\n        public string StatusMessage\r\n        {\r\n            get => statusMessage;\r\n            set\r\n            {\r\n                statusMessage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public AddonUpdate(AddonManifest item) : base(item)\r\n        {\r\n        }\r\n    }\r\n\r\n    public static class Addons\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        private static List<AddonUpdate> CheckAddonsForUpdate(IEnumerable<BaseExtensionManifest> manifests, ServicesClient serviceClient)\r\n        {\r\n            var random = new Random();\r\n            var updateList = new List<AddonUpdate>();\r\n            foreach (var manifest in manifests)\r\n            {\r\n                try\r\n                {\r\n                    var addonManifest = serviceClient.GetAddon(manifest.Id);\r\n                    if (addonManifest == null)\r\n                    {\r\n                        continue;\r\n                    }\r\n               \r\n                    var installer = addonManifest.InstallerManifest;\r\n                    var package = installer.GetLatestCompatiblePackage();\r\n                    var currentVersion = Version.Parse(manifest.Version);\r\n                    var changeLog = string.Empty;\r\n                    if (package != null && package.Version > currentVersion)\r\n                    {\r\n                        if (installer.Packages.HasItems())\r\n                        {\r\n                            var changes = installer.Packages.Where(a => a.Version > currentVersion && a.Version <= package.Version).ToList();\r\n                            if (changes.HasItems())\r\n                            {\r\n                                changes.ForEach(a =>\r\n                                {\r\n                                    changeLog += a.Version.ToString();\r\n                                    a.Changelog?.ForEach(b => changeLog += Environment.NewLine + $\"  • {b}\");\r\n                                    changeLog += Environment.NewLine;\r\n                                });\r\n                            }\r\n                        }\r\n\r\n                        updateList.Add(new AddonUpdate(addonManifest)\r\n                        {\r\n                            Selected = true,\r\n                            UpdateInfo = $\"{currentVersion} -> {package.Version}\",\r\n                            Changelog = changeLog,\r\n                            Package = package\r\n                        });\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to check for addon for update. {manifest.Id}\");\r\n                }\r\n            }\r\n\r\n            return updateList;\r\n        }\r\n\r\n        public static List<AddonUpdate> CheckAddonUpdates(ServicesClient serviceClient)\r\n        {\r\n            var updateList = new List<AddonUpdate>();\r\n            if (PlayniteEnvironment.InOfflineMode)\r\n            {\r\n                return updateList;\r\n            }\r\n\r\n            var descriptions = ExtensionFactory.GetInstalledManifests();\r\n            updateList.AddRange(CheckAddonsForUpdate(descriptions.Where(a => a.Type == ExtensionType.MetadataProvider), serviceClient));\r\n            updateList.AddRange(CheckAddonsForUpdate(descriptions.Where(a => a.Type == ExtensionType.GameLibrary), serviceClient));\r\n            updateList.AddRange(CheckAddonsForUpdate(descriptions.Where(a => a.Type == ExtensionType.GenericPlugin), serviceClient));\r\n            updateList.AddRange(CheckAddonsForUpdate(descriptions.Where(a => a.Type == ExtensionType.Script), serviceClient));\r\n            updateList.AddRange(CheckAddonsForUpdate(ThemeManager.GetAvailableThemes(ApplicationMode.Desktop).Where(a => !a.IsBuiltInTheme), serviceClient));\r\n            updateList.AddRange(CheckAddonsForUpdate(ThemeManager.GetAvailableThemes(ApplicationMode.Fullscreen).Where(a => !a.IsBuiltInTheme), serviceClient));\r\n\r\n            var blackList = serviceClient.GetAddonBlacklist();\r\n            updateList.Where(a => blackList.Contains(a.Item.AddonId)).ToList().ForEach(a => updateList.Remove(a));\r\n            return updateList;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/App/CmdLineOptions.cs",
    "content": "﻿using CommandLine;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class CmdLineOptions\r\n    {\r\n        [Option(\"start\")]\r\n        public string Start { get; set; }\r\n\r\n        [Option(\"uridata\")]\r\n        public string UriData { get; set; }\r\n\r\n        [Option(\"nolibupdate\")]\r\n        public bool SkipLibUpdate { get; set; }\r\n\r\n        [Option(\"startdesktop\")]\r\n        public bool StartInDesktop { get; set; }\r\n\r\n        [Option(\"startfullscreen\")]\r\n        public bool StartInFullscreen { get; set; }\r\n\r\n        [Option(\"forcesoftrender\")]\r\n        public bool ForceSoftwareRender { get; set; }\r\n\r\n        [Option(\"forcedefaulttheme\")]\r\n        public bool ForceDefaultTheme { get; set; }\r\n\r\n        [Option(\"hidesplashscreen\")]\r\n        public bool HideSplashScreen { get; set; }\r\n\r\n        [Option(\"installext\")]\r\n        public string InstallExtension { get; set; }\r\n\r\n        [Option(\"clearwebcache\")]\r\n        public bool ClearWebCache { get; set; }\r\n\r\n        [Option(\"shutdown\")]\r\n        public bool Shutdown { get; set; }\r\n\r\n        [Option(\"safestartup\")]\r\n        public bool SafeStartup { get; set; }\r\n\r\n        [Option(\"resetsettings\")]\r\n        public bool ResetSettings { get; set; }\r\n\r\n        [Option(\"masterinstance\")]\r\n        public bool MasterInstance { get; set; }\r\n\r\n        [Option(\"backup\")]\r\n        public string Backup { get; set; }\r\n\r\n        [Option(\"restorebackup\")]\r\n        public string RestoreBackup { get; set; }\r\n\r\n        [Option(\"startclosedtotray\")]\r\n        public bool StartClosedToTray { get; set; }\r\n\r\n        [Option(\"userdatadir\")]\r\n        public string UserDataDir { get; set; }\r\n\r\n        [Option(\"fullscreenwidth\")]\r\n        public int FullscreenWidth { get; set; }\r\n\r\n        [Option(\"fullscreenheight\")]\r\n        public int FullscreenHeight { get; set; }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Parser.Default.FormatCommandLine(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/App/IPlayniteApplication.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public interface IPlayniteApplication\r\n    {\r\n        void Quit(bool saveSettings);\r\n        void Restart(bool saveSettings);\r\n        void QuitAndStart(string path, string arguments, bool asAdmin = false, bool saveSettings = true);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/App/PlayniteApplication.cs",
    "content": "﻿using Playnite.Controllers;\r\nusing Playnite.Input;\r\nusing Playnite.SDK;\r\nusing Playnite.Plugins;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Diagnostics;\r\nusing Playnite.Database;\r\nusing Playnite.API;\r\nusing TheArtOfDev.HtmlRenderer;\r\nusing Playnite.Services;\r\nusing System.Windows.Input;\r\nusing System.Windows.Interop;\r\nusing System.Reflection;\r\nusing System.IO;\r\nusing Playnite.Common;\r\nusing System.ComponentModel;\r\nusing Playnite.Windows;\r\nusing Polly;\r\nusing System.Windows.Media;\r\nusing Playnite.SDK.Events;\r\nusing System.Windows.Threading;\r\nusing System.Net;\r\nusing Playnite.Common.Web;\r\nusing System.ServiceProcess;\r\nusing System.Drawing.Imaging;\r\n\r\nnamespace Playnite\r\n{\r\n    public abstract class PlayniteApplication : ObservableObject, IPlayniteApplication\r\n    {\r\n        private ILogger logger = LogManager.GetLogger();\r\n        private const string instanceMuxet = \"PlayniteInstaceMutex\";\r\n        private Mutex appMutex;\r\n        public bool ResourcesReleased { get; private set; } = false;\r\n        private PipeService pipeService;\r\n        private PipeServer pipeServer;\r\n        private System.Threading.Timer updateCheckTimer;\r\n        private bool installingAddon = false;\r\n        private AddonLoadError themeLoadError = AddonLoadError.None;\r\n        private ThemeManifest customTheme;\r\n\r\n        private bool isActive;\r\n        public bool IsActive\r\n        {\r\n            get => isActive;\r\n            set\r\n            {\r\n                isActive = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public static Version CurrentVersion => Updater.CurrentVersion;\r\n        public event EventHandler ExtensionsLoaded;\r\n        public ApplicationMode Mode { get; }\r\n        public IDialogsFactory Dialogs { get; set; }\r\n        public PlayniteSettings AppSettings { get; set; }\r\n        public GamesEditor GamesEditor { get; set; }\r\n        public ExtensionFactory Extensions { get; set; }\r\n        public GameDatabase Database { get; set; }\r\n        public GameControllerFactory Controllers { get; set; }\r\n        public CmdLineOptions CmdLine { get; set; }\r\n        public DpiScale DpiScale { get; set; } = new DpiScale(1, 1);\r\n        public ComputerScreen CurrentScreen { get; set; } = Computer.GetPrimaryScreen();\r\n        public DiscordManager Discord { get; set; }\r\n        public SynchronizationContext SyncContext { get; private set; }\r\n        public Action<PlayniteUriEventArgs> AppUriHandler { get; set; }\r\n        public static Application CurrentNative { get; private set; }\r\n        public static PlayniteApplication Current { get; private set; }\r\n        public ServicesClient ServicesClient { get; private set; }\r\n        public MainViewModelBase MainModelBase { get; set; }\r\n        public List<ExtensionInstallResult> ExtensionsInstallResult { get; set; }\r\n        public NotificationsAPI Notifications { get; }\r\n        public PlayniteUriHandler UriHandler { get; }\r\n        public PlayniteAPI PlayniteApiGlobal { get; set; }\r\n        public GameControllerManager GameController { get; set; }\r\n\r\n        private ExtensionsStatusBinder extensionsStatusBinder = new ExtensionsStatusBinder();\r\n        public ExtensionsStatusBinder ExtensionsStatusBinder { get => extensionsStatusBinder; set => SetValue(ref extensionsStatusBinder, value); }\r\n\r\n        public PlayniteApplication()\r\n        {\r\n        }\r\n\r\n        public PlayniteApplication(\r\n            Func<Application> appInitializer,\r\n            ApplicationMode mode,\r\n            CmdLineOptions cmdLine)\r\n        {\r\n            if (Current != null)\r\n            {\r\n                throw new Exception(\"Only one application instance is allowed.\");\r\n            }\r\n\r\n            // TODO: remove after switch to .NET 5\r\n            // Fixes various network issues on 2004+ Win10 if TLS 1.3 is forced via registry.\r\n            if (Computer.IsTLS13SystemWideEnabled())\r\n            {\r\n                logger.Warn(\"System wide TLS 1.3 is enabled, forcing 1.2.\");\r\n                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;\r\n            }\r\n\r\n            CmdLine = cmdLine;\r\n            Mode = mode;\r\n            Current = this;\r\n\r\n            if (!Debugger.IsAttached)\r\n            {\r\n                AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;\r\n            }\r\n\r\n            if (!CmdLine.MasterInstance)\r\n            {\r\n                if (CheckOtherInstances() || CmdLine.Shutdown)\r\n                {\r\n                    ResourcesReleased = true;\r\n                    Environment.Exit(0);\r\n                    return;\r\n                }\r\n            }\r\n\r\n#if !DEBUG\r\n            if (FileSystem.FileExists(PlaynitePaths.SafeStartupFlagFile))\r\n            {\r\n                if (MessageBox.Show(\r\n                    \"Playnite closed unexpectedly while starting. This is usually caused by 3rd party theme or extension. Do you want to start in safe mode with all 3rd party add-ons disabled?\",\r\n                    \"Startup Error\",\r\n                    MessageBoxButton.YesNo,\r\n                    MessageBoxImage.Warning) == MessageBoxResult.Yes)\r\n                {\r\n                    cmdLine.SafeStartup = true;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                FileSystem.CreateFile(PlaynitePaths.SafeStartupFlagFile);\r\n            }\r\n#endif\r\n\r\n            // All code above has to be called before we create instance of WPF app,\r\n            // because MessageBox forces WPF to initialize and fire startup app events.\r\n            CurrentNative = appInitializer();\r\n            CurrentNative.ShutdownMode = ShutdownMode.OnExplicitShutdown;\r\n            SyncContext = new DispatcherSynchronizationContext(CurrentNative.Dispatcher);\r\n            SynchronizationContext.SetSynchronizationContext(SyncContext);\r\n            appMutex = new Mutex(true, instanceMuxet);\r\n\r\n            try\r\n            {\r\n                // This can fail in rare cases when switching application modes\r\n                // if an old instance fails to clean after itself or if it gets stuck on exit.\r\n                Policy.Handle<Exception>()\r\n                        .WaitAndRetry(3, a => TimeSpan.FromSeconds(3))\r\n                        .Execute(() => pipeService = new PipeService());\r\n                pipeService.CommandExecuted += PipeService_CommandExecuted;\r\n                pipeServer = new PipeServer(PlayniteSettings.GetAppConfigValue(\"PipeEndpoint\"));\r\n                pipeServer.StartServer(pipeService);\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to start pipe service.\");\r\n            }\r\n\r\n            PlayniteSettings.MigrateSettingsConfig();\r\n            AppSettings = PlayniteSettings.LoadSettings();\r\n            Commands.GlobalCommands.AppSettings = AppSettings;\r\n            NLogLogger.IsTraceEnabled = AppSettings.TraceLogEnabled;\r\n\r\n            if (AppSettings.ShouldDataBackupOnStartup())\r\n            {\r\n                var backOptions = Backup.GetAutoBackupOptions(AppSettings, PlaynitePaths.ConfigRootPath, GameDatabase.GetFullDbPath(AppSettings.DatabasePath));\r\n                FileSystem.WriteStringToFile(PlaynitePaths.BackupActionFile, Serialization.ToJson(backOptions));\r\n                CmdLine.Backup = PlaynitePaths.BackupActionFile;\r\n                AppSettings.LastAutoBackup = DateTime.Now;\r\n                AppSettings.SaveSettings();\r\n            }\r\n\r\n            if (!CmdLine.Backup.IsNullOrEmpty() || !CmdLine.RestoreBackup.IsNullOrEmpty())\r\n            {\r\n                ServicesClient = new ServicesClient();\r\n                CurrentNative.SessionEnding += Application_SessionEnding;\r\n                CurrentNative.Exit += Application_Exit;\r\n                CurrentNative.Startup += Application_Startup;\r\n                CurrentNative.Activated += Application_Activated;\r\n                CurrentNative.Deactivated += Application_Deactivated;\r\n\r\n                var defaultTheme = new ThemeManifest()\r\n                {\r\n                    DirectoryName = ThemeManager.DefaultThemeDirName,\r\n                    DirectoryPath = Path.Combine(PlaynitePaths.ThemesProgramPath, ThemeManager.GetThemeRootDir(Mode), ThemeManager.DefaultThemeDirName),\r\n                    Name = ThemeManager.DefaultThemeDirName,\r\n                    Id = mode == ApplicationMode.Desktop ? ThemeManager.DefaultDesktopThemeId : ThemeManager.DefaultFullscreenThemeId\r\n                };\r\n\r\n                ThemeManager.SetDefaultTheme(defaultTheme);\r\n                InitializeNative();\r\n\r\n                try\r\n                {\r\n                    Localization.SetLanguage(AppSettings.Language);\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(exc, $\"Failed to set {AppSettings.Language} langauge.\");\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (CmdLine.ResetSettings)\r\n                {\r\n                    var settings = PlayniteSettings.GetDefaultSettings();\r\n                    settings.FirstTimeWizardComplete = true;\r\n                    settings.DatabasePath = AppSettings.DatabasePath;\r\n                    settings.SaveSettings();\r\n                    AppSettings = settings;\r\n                }\r\n\r\n                var relaunchPath = string.Empty;\r\n                if (AppSettings.StartInFullscreen && mode == ApplicationMode.Desktop && !CmdLine.StartInDesktop)\r\n                {\r\n                    relaunchPath = PlaynitePaths.FullscreenExecutablePath;\r\n                }\r\n\r\n                if (CmdLine.StartInDesktop && mode != ApplicationMode.Desktop)\r\n                {\r\n                    relaunchPath = PlaynitePaths.DesktopExecutablePath;\r\n                }\r\n                else if (CmdLine.StartInFullscreen && mode != ApplicationMode.Fullscreen)\r\n                {\r\n                    relaunchPath = PlaynitePaths.FullscreenExecutablePath;\r\n                }\r\n\r\n                if (!relaunchPath.IsNullOrEmpty())\r\n                {\r\n                    FileSystem.DeleteFile(PlaynitePaths.SafeStartupFlagFile);\r\n                    ProcessStarter.StartProcess(relaunchPath, CmdLine.ToString());\r\n                    CurrentNative.Shutdown(0);\r\n                    return;\r\n                }\r\n\r\n                ServicesClient = new ServicesClient();\r\n                CurrentNative.SessionEnding += Application_SessionEnding;\r\n                CurrentNative.Exit += Application_Exit;\r\n                CurrentNative.Startup += Application_Startup;\r\n                CurrentNative.Activated += Application_Activated;\r\n                CurrentNative.Deactivated += Application_Deactivated;\r\n\r\n                OnPropertyChanged(nameof(AppSettings));\r\n                var defaultTheme = new ThemeManifest()\r\n                {\r\n                    DirectoryName = ThemeManager.DefaultThemeDirName,\r\n                    DirectoryPath = Path.Combine(PlaynitePaths.ThemesProgramPath, ThemeManager.GetThemeRootDir(Mode), ThemeManager.DefaultThemeDirName),\r\n                    Name = ThemeManager.DefaultThemeDirName,\r\n                    Id = mode == ApplicationMode.Desktop ? ThemeManager.DefaultDesktopThemeId : ThemeManager.DefaultFullscreenThemeId\r\n                };\r\n\r\n                try\r\n                {\r\n                    WaitForOtherInstacesToExit(false);\r\n                    ExtensionsInstallResult = ExtensionInstaller.InstallExtensionQueue();\r\n                    var installedTheme = ExtensionsInstallResult.FirstOrDefault(a => a.InstalledManifest is ThemeManifest && !a.Updated);\r\n                    if (installedTheme?.InstalledManifest != null)\r\n                    {\r\n                        var theme = installedTheme.InstalledManifest as ThemeManifest;\r\n                        if (theme.Mode == Mode)\r\n                        {\r\n                            if (theme.Mode == ApplicationMode.Desktop)\r\n                            {\r\n                                AppSettings.Theme = theme.Id;\r\n                            }\r\n                            else\r\n                            {\r\n                                AppSettings.Fullscreen.Theme = theme.Id;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, \"Failed to finish installing extenions.\");\r\n                }\r\n\r\n                ThemeManager.SetDefaultTheme(defaultTheme);\r\n\r\n                // Theme must be set BEFORE default app resources are initialized for ThemeFile markup to apply custom theme's paths.\r\n                customTheme = null;\r\n                if (CmdLine.ForceDefaultTheme || CmdLine.SafeStartup)\r\n                {\r\n                    logger.Warn(\"Default theme forced by cmdline.\");\r\n                }\r\n                else\r\n                {\r\n                    var theme = mode == ApplicationMode.Desktop ? AppSettings.Theme : AppSettings.Fullscreen.Theme;\r\n                    if (theme != ThemeManager.DefaultTheme.Id)\r\n                    {\r\n                        customTheme = ThemeManager.GetAvailableThemes(mode).Where(a => a.Id == theme).OrderByDescending(a => a.Version).FirstOrDefault();\r\n                        if (customTheme == null)\r\n                        {\r\n                            logger.Error($\"Failed to apply theme {theme}, theme not found.\");\r\n                            if (mode == ApplicationMode.Desktop)\r\n                            {\r\n                                AppSettings.Theme = ThemeManager.DefaultDesktopThemeId;\r\n                            }\r\n                            else\r\n                            {\r\n                                AppSettings.Fullscreen.Theme = ThemeManager.DefaultFullscreenThemeId;\r\n                            }\r\n\r\n                            ThemeManager.SetCurrentTheme(defaultTheme);\r\n                        }\r\n                        else\r\n                        {\r\n                            ThemeManager.SetCurrentTheme(customTheme);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                InitializeNative();\r\n\r\n                try\r\n                {\r\n                    if (!AppSettings.FirstTimeWizardComplete)\r\n                    {\r\n                        var cultName = System.Globalization.CultureInfo.CurrentUICulture.Name.Replace('-', '_');\r\n                        var validLang = Localization.AvailableLanguages.FirstOrDefault(a => a.Id == cultName && a.TranslatedPercentage > 75);\r\n                        if (validLang != null)\r\n                        {\r\n                            AppSettings.Language = validLang.Id;\r\n                        }\r\n                    }\r\n\r\n                    Localization.SetLanguage(AppSettings.Language);\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(exc, $\"Failed to set {AppSettings.Language} langauge.\");\r\n                }\r\n\r\n                // Must be applied AFTER default app resources are initialized, otherwise custom resource dictionaries won't be properly added to application scope.\r\n                if (customTheme != null)\r\n                {\r\n                    themeLoadError = ThemeManager.ApplyTheme(CurrentNative, customTheme, Mode);\r\n                    if (themeLoadError != AddonLoadError.None)\r\n                    {\r\n                        ThemeManager.SetCurrentTheme(null);\r\n                        logger.Error($\"Failed to load theme {customTheme.Name}, {themeLoadError}.\");\r\n                    }\r\n                }\r\n\r\n                if (mode == ApplicationMode.Desktop)\r\n                {\r\n                    try\r\n                    {\r\n                        if (System.Drawing.FontFamily.Families.Any(a => a.Name == AppSettings.FontFamilyName))\r\n                        {\r\n                            CurrentNative.Resources.Add(\r\n                                \"FontFamily\", new FontFamily(AppSettings.FontFamilyName));\r\n                        }\r\n                        else\r\n                        {\r\n                            logger.Error($\"Cannot set font {AppSettings.FontFamilyName}, font not found.\");\r\n                        }\r\n\r\n                        if (System.Drawing.FontFamily.Families.Any(a => a.Name == AppSettings.MonospaceFontFamilyName))\r\n                        {\r\n                            CurrentNative.Resources.Add(\r\n                                \"MonospaceFontFamily\", new FontFamily(AppSettings.MonospaceFontFamilyName));\r\n                        }\r\n                        else\r\n                        {\r\n                            logger.Error($\"Cannot set monospace font {AppSettings.MonospaceFontFamilyName}, font not found.\");\r\n                        }\r\n\r\n                        if (AppSettings.FontSize > 0)\r\n                        {\r\n                            CurrentNative.Resources.Add(\r\n                                \"FontSize\", AppSettings.FontSize);\r\n                        }\r\n\r\n                        if (AppSettings.FontSizeSmall > 0)\r\n                        {\r\n                            CurrentNative.Resources.Add(\r\n                                \"FontSizeSmall\", AppSettings.FontSizeSmall);\r\n                        }\r\n\r\n                        if (AppSettings.FontSizeLarge > 0)\r\n                        {\r\n                            CurrentNative.Resources.Add(\r\n                                \"FontSizeLarge\", AppSettings.FontSizeLarge);\r\n                        }\r\n\r\n                        if (AppSettings.FontSizeLarger > 0)\r\n                        {\r\n                            CurrentNative.Resources.Add(\r\n                                \"FontSizeLarger\", AppSettings.FontSizeLarger);\r\n                        }\r\n\r\n                        if (AppSettings.FontSizeLargest > 0)\r\n                        {\r\n                            CurrentNative.Resources.Add(\r\n                                \"FontSizeLargest\", AppSettings.FontSizeLargest);\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to set font {AppSettings.FontFamilyName}\");\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (AppSettings.Fullscreen.FontSize > 0)\r\n                    {\r\n                        CurrentNative.Resources.Add(\r\n                            \"FontSize\", AppSettings.Fullscreen.FontSize);\r\n                    }\r\n\r\n                    if (AppSettings.Fullscreen.FontSizeSmall > 0)\r\n                    {\r\n                        CurrentNative.Resources.Add(\r\n                            \"FontSizeSmall\", AppSettings.Fullscreen.FontSizeSmall);\r\n                    }\r\n                }\r\n\r\n                // Only use this for Desktop mode. Non-default options look terrible in Fullscreen because of viewport scaling.\r\n                if (mode == ApplicationMode.Desktop)\r\n                {\r\n                    Controls.WindowBase.SetTextRenderingOptions(AppSettings.TextFormattingMode, AppSettings.TextRenderingMode);\r\n                }\r\n\r\n                Notifications = new NotificationsAPI();\r\n                UriHandler = new PlayniteUriHandler();\r\n            }\r\n        }\r\n\r\n        public abstract void InstantiateApp();\r\n\r\n        public abstract void InitializeNative();\r\n\r\n        public abstract void Restore();\r\n\r\n        public abstract void Minimize();\r\n\r\n        public abstract void ShowWindowsNotification(string title, string body, Action action);\r\n\r\n        public abstract void SwitchAppMode(ApplicationMode mode);\r\n\r\n        public abstract void ConfigureViews();\r\n\r\n        private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e)\r\n        {\r\n            logger.Info(\"Shutting down application because of session ending.\");\r\n            // Don't dispose CefSharp here because of bug in CefSharp during system shutdown\r\n            // https://github.com/JosefNemec/Playnite/issues/866\r\n            AppSettings?.SaveSettings();\r\n            ReleaseResources(false);\r\n            CurrentNative.Shutdown(0);\r\n        }\r\n\r\n        private void Application_Exit(object sender, ExitEventArgs e)\r\n        {\r\n            ReleaseResources();\r\n        }\r\n\r\n        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)\r\n        {\r\n            // Running under Wine is not supported\r\n            if (PlayniteProcess.WorkingSetMemory == 0 &&\r\n                Programs.GetUnistallProgramsList().Any(a => a.DisplayName.StartsWith(\"Wine Mono\", StringComparison.OrdinalIgnoreCase)))\r\n            {\r\n                Process.GetCurrentProcess().Kill();\r\n                return;\r\n            }\r\n\r\n            var exception = (Exception)e.ExceptionObject;\r\n            var crashInfo = Exceptions.GetExceptionInfo(exception, Extensions);\r\n            logger.Error(exception, $\"Unhandled exception occured.\");\r\n            logger.Error($\"HResult: 0x{exception.HResult:X8}\");\r\n            if (exception is Win32Exception win32exc)\r\n                logger.Error($\"Win32 NativeErrorCode: 0x{win32exc.NativeErrorCode:X8}\");\r\n            CrashHandlerViewModel crashModel = null;\r\n\r\n            // Delete safe startup flag if we are able to handle the crash,\r\n            // safe startup option should show for crashes we are not handling.\r\n            FileSystem.DeleteFile(PlaynitePaths.SafeStartupFlagFile);\r\n            if (crashInfo.IsLiteDbCorruptionCrash)\r\n            {\r\n                Dialogs.ShowErrorMessage(LOC.DBCorruptionCrashMessage.GetLocalized());\r\n                Process.GetCurrentProcess().Kill();\r\n                return;\r\n            }\r\n\r\n            if (crashInfo.IsExtensionCrash)\r\n            {\r\n                crashModel = new CrashHandlerViewModel(\r\n                    new ExtensionCrashHandlerWindowFactory(),\r\n                    Dialogs,\r\n                    new ResourceProvider(),\r\n                    Mode,\r\n                    crashInfo,\r\n                    AppSettings);\r\n            }\r\n            else\r\n            {\r\n                // unchecked use reason: https://stackoverflow.com/a/10043486/1107424\r\n\r\n                // This started happening after the infamous 2026 January Win 11 update, Smart App Control is agersively blocking unsigned files from loading.\r\n                // Based on crash reports, this usually happens to SDL's and CefSharp's dlls, also random plugins.\r\n                if ((exception is FileLoadException || exception is DllNotFoundException) &&\r\n                    exception.Message.Contains(\"0x800711C7\")) // This is actually not set in HResult, it's in exception message and replaced by .NET to generic 0x80131524\r\n                {\r\n                    Dialogs.ShowErrorMessage(\"Failed to load dependencies needed for Playnite to continue operating properly.\\n\\nThis is usually caused by Windows Smart App Control blocking dlls in Playnite's install folder.\");\r\n                    Process.GetCurrentProcess().Kill();\r\n                    return;\r\n                }\r\n\r\n                // Have nonsense crashes with this about normal .NET runtime methods and Playnite class methods missing.\r\n                if (exception is MissingMethodException ||\r\n                    exception is BadImageFormatException ||\r\n                    exception is InvalidProgramException ||\r\n                    // Looks like there are some nested TargetInvocationException with MissingMethodException actual extension,\r\n                    // which seems to look like corrupted installed where binaries from different version got mixed up.\r\n                    exception.StackTrace?.Contains(\"System.MissingMethodException\") == true ||\r\n                    // Usually COM execution error from WindowsAPICodePack when opening folder selection dialog. As far as I can tell, this happens on \"debloated\" Windows edition only.\r\n                    (exception is System.Runtime.InteropServices.COMException &&\r\n                     (exception.HResult == unchecked((int)0x80004005) || exception.HResult == unchecked((int)0x80040111))) ||\r\n                    // DWM_E_COMPOSITIONDISABLED, looks like this can happen when GPU driver crashes and doesn't reboot properly\r\n                    exception.HResult == unchecked((int)0x80263001))\r\n                {\r\n                    Dialogs.ShowErrorMessage(\"System issue or corrupted Playnite install detected.\");\r\n                    Process.GetCurrentProcess().Kill();\r\n                    return;\r\n                }\r\n\r\n                // This seems to start happening after January Windows 11 update for libraries synced via cloud\r\n                // storage (OneDrive and DropBox reported by users). Looks like something fucked in that Windows update\r\n                // but we generally do not recommend/support storing files on cloud folders.\r\n                if (Diagnostic.IsHResultCloudError(exception.HResult))\r\n                {\r\n                    Dialogs.ShowErrorMessage(\"Cloud related file system operation failed. Might be issue with Windows or cloud sync app you are using.\\n\\nWe do not recommend storing Playnite files on cloud synced folders since it's been known to cause data corruption in the past.\");\r\n                    Process.GetCurrentProcess().Kill();\r\n                    return;\r\n                }\r\n\r\n                // ERROR_DISK_FULL\r\n                if (exception.HResult == unchecked((int)0x80070070) ||\r\n                    // \"device not ready\" error. Happens when people run Playnite from attached storage as far as I can tell.\r\n                    exception.HResult == unchecked((int)0x80070015) ||\r\n                    // self-explanatory\r\n                    exception is OutOfMemoryException)\r\n                {\r\n                    Dialogs.ShowErrorMessage(exception.Message, LOC.CrashWindowTitle.GetLocalized());\r\n                    Process.GetCurrentProcess().Kill();\r\n                    return;\r\n                }\r\n\r\n                crashModel = new CrashHandlerViewModel(\r\n                    new CrashHandlerWindowFactory(),\r\n                    Dialogs,\r\n                    new ResourceProvider(),\r\n                    Mode);\r\n            }\r\n\r\n            crashModel.OpenView();\r\n            Process.GetCurrentProcess().Kill();\r\n        }\r\n\r\n        private void Application_Startup(object sender, StartupEventArgs e)\r\n        {\r\n            logger.Info($\"Application started from '{PlaynitePaths.ProgramPath}'\");\r\n            SDK.Data.Markup.Init(new MarkupConverter());\r\n            SDK.Data.Serialization.Init(new DataSerializer());\r\n            SDK.Data.SQLite.Init((a, b) => new Sqlite(a, b));\r\n            EventManager.RegisterClassHandler(typeof(Controls.WindowBase), Controls.WindowBase.ClosedRoutedEvent, new RoutedEventHandler(WindowBaseCloseHandler));\r\n            EventManager.RegisterClassHandler(typeof(Controls.WindowBase), Controls.WindowBase.LoadedRoutedEvent, new RoutedEventHandler(WindowBaseLoadedHandler));\r\n            ConfigureViews();\r\n\r\n            if (!CmdLine.Backup.IsNullOrEmpty())\r\n            {\r\n                BackupOptions backupOptions = null;\r\n                try\r\n                {\r\n                    backupOptions = Serialization.FromJsonFile<BackupOptions>(CmdLine.Backup);\r\n                    var progRes = Dialogs.ActivateGlobalProgress(\r\n                        (progArgs) =>\r\n                        {\r\n                            WaitForOtherInstacesToExit(true);\r\n                            Backup.BackupData(backupOptions, progArgs.CancelToken);\r\n                        },\r\n                        new GlobalProgressOptions(LOC.BackupProgress, true) { IsIndeterminate = true });\r\n                    if (progRes.Error != null)\r\n                    {\r\n                        logger.Error(progRes.Error, \"Failed to backup data.\");\r\n                        throw progRes.Error;\r\n                    }\r\n\r\n                    if (progRes.Canceled)\r\n                    {\r\n                        Dialogs.ShowErrorMessage(LOC.BackupCancelled, LOC.BackupErrorTitle);\r\n                    }\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    Dialogs.ShowErrorMessage(LOC.BackupFailed.GetLocalized() + Environment.NewLine + Environment.NewLine + exc.Message, LOC.BackupErrorTitle);\r\n                    logger.Error(exc, \"Failed to backup data.\");\r\n                }\r\n                finally\r\n                {\r\n                    if (backupOptions == null || !backupOptions.ClosedWhenDone)\r\n                    {\r\n                        Restart(new CmdLineOptions\r\n                        {\r\n                            StartClosedToTray = CmdLine.StartClosedToTray,\r\n                            HideSplashScreen = CmdLine.HideSplashScreen,\r\n                            StartInFullscreen = CmdLine.StartInFullscreen\r\n                        }, false);\r\n                    }\r\n                }\r\n\r\n                FileSystem.DeleteFile(PlaynitePaths.SafeStartupFlagFile);\r\n                Quit(false);\r\n                return;\r\n            }\r\n            else if (!CmdLine.RestoreBackup.IsNullOrEmpty())\r\n            {\r\n                BackupRestoreOptions restoreOptions = null;\r\n                try\r\n                {\r\n                    restoreOptions = Serialization.FromJsonFile<BackupRestoreOptions>(CmdLine.RestoreBackup);\r\n                    var progRes = Dialogs.ActivateGlobalProgress(\r\n                        (progArgs) =>\r\n                        {\r\n                            WaitForOtherInstacesToExit(true);\r\n                            Backup.RestoreBackup(restoreOptions);\r\n                        },\r\n                        new GlobalProgressOptions(LOC.BackupRestoreProgress, false) { IsIndeterminate = true });\r\n                    if (progRes.Error != null)\r\n                    {\r\n                        logger.Error(progRes.Error, \"Failed to restore data from backup.\");\r\n                        throw progRes.Error;\r\n                    }\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    Dialogs.ShowErrorMessage(LOC.BackupRestoreFailed.GetLocalized() + Environment.NewLine + Environment.NewLine + exc.Message, LOC.BackupErrorTitle);\r\n                    logger.Error(exc, \"Failed to restore data from backup.\");\r\n                }\r\n                finally\r\n                {\r\n                    if (restoreOptions == null || !restoreOptions.ClosedWhenDone)\r\n                    {\r\n                        Restart(new CmdLineOptions(), false);\r\n                    }\r\n                }\r\n\r\n                FileSystem.DeleteFile(PlaynitePaths.SafeStartupFlagFile);\r\n                Quit(false);\r\n                return;\r\n            }\r\n\r\n            if (!Startup())\r\n            {\r\n                Quit();\r\n                return;\r\n            }\r\n\r\n            logger.Info($\"Application {CurrentVersion} started\");\r\n\r\n            ExtensionsInstallResult?.Where(a => a.InstallError != null).ForEach(ext =>\r\n                Notifications.Add(new NotificationMessage(\r\n                    \"inst_err\" + ext.PackagePath,\r\n                    ResourceProvider.GetString(LOC.AddonInstallFaild).Format(Path.GetFileNameWithoutExtension(ext.PackagePath)) +\r\n                        \"\\n\" + ext.InstallError.Message,\r\n                    NotificationType.Error)));\r\n\r\n            foreach (var fail in Extensions.FailedExtensions)\r\n            {\r\n                Notifications.Add(new NotificationMessage(\r\n                    fail.manifest.DirectoryPath,\r\n                    fail.error == AddonLoadError.SDKVersion ?\r\n                        ResourceProvider.GetString(LOC.SpecificExtensionLoadSDKError).Format(fail.manifest.Name) :\r\n                        ResourceProvider.GetString(LOC.SpecificExtensionLoadError).Format(fail.manifest.Name),\r\n                    NotificationType.Error));\r\n            }\r\n\r\n            if (themeLoadError != AddonLoadError.None && customTheme != null)\r\n            {\r\n                Notifications.Add(new NotificationMessage(\r\n                    customTheme.DirectoryPath,\r\n                    themeLoadError == AddonLoadError.SDKVersion ?\r\n                        ResourceProvider.GetString(LOC.SpecificThemeLoadSDKError).Format(customTheme.Name) :\r\n                        ResourceProvider.GetString(LOC.SpecificThemeLoadError).Format(customTheme.Name),\r\n                    NotificationType.Error));\r\n            }\r\n\r\n            try\r\n            {\r\n                if (AppSettings.ShowNahimicServiceWarning)\r\n                {\r\n                    if (ServiceController.GetServices().FirstOrDefault(a =>\r\n                        (a.ServiceName?.Contains(\"nahimic\", StringComparison.OrdinalIgnoreCase) == true ||\r\n                         a.DisplayName?.Contains(\"nahimic\", StringComparison.OrdinalIgnoreCase) == true) &&\r\n                        a.Status != ServiceControllerStatus.Stopped) != null)\r\n                    {\r\n                        var okResponse = new MessageBoxOption(LOC.OKLabel, true, true);\r\n                        var dontShowResponse = new MessageBoxOption(LOC.DontShowAgainTitle);\r\n                        var res = Dialogs.ShowMessage(\r\n                            LOC.NahimicServiceWarning, \"\",\r\n                            MessageBoxImage.Warning,\r\n                            new List<MessageBoxOption> { okResponse, dontShowResponse });\r\n                        if (res == dontShowResponse)\r\n                        {\r\n                            AppSettings.ShowNahimicServiceWarning = false;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            catch (Exception nahExc)\r\n            {\r\n                // ServiceController.GetServices() can apparently blow up on Win32Exception sometimes\r\n                logger.Error(nahExc, \"Failed to check for Nahimic service.\");\r\n            }\r\n\r\n            if (PlayniteEnvironment.IsElevated && AppSettings.ShowElevatedRightsWarning)\r\n            {\r\n                var okResponse = new MessageBoxOption(LOC.OKLabel, true, true);\r\n                var dontShowResponse = new MessageBoxOption(LOC.DontShowAgainTitle);\r\n                var res = Dialogs.ShowMessage(\r\n                    LOC.ElevatedProcessWarning, \"\",\r\n                    MessageBoxImage.Warning,\r\n                    new List<MessageBoxOption> { okResponse, dontShowResponse });\r\n                if (res == dontShowResponse)\r\n                {\r\n                    AppSettings.ShowElevatedRightsWarning = false;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void WindowBaseCloseHandler(object sender, RoutedEventArgs e)\r\n        {\r\n            WindowManager.NotifyChildOwnershipChanges();\r\n        }\r\n\r\n        private void WindowBaseLoadedHandler(object sender, RoutedEventArgs e)\r\n        {\r\n            WindowManager.NotifyChildOwnershipChanges();\r\n        }\r\n\r\n        private void PipeService_CommandExecuted(object sender, CommandExecutedEventArgs args)\r\n        {\r\n            logger.Info($\"Executing command \\\"{args.Command}\\\" from pipe with arguments \\\"{args.Args}\\\"\");\r\n\r\n            switch (args.Command)\r\n            {\r\n                case CmdlineCommand.Focus:\r\n                    Restore();\r\n                    break;\r\n\r\n                case CmdlineCommand.Start:\r\n                    if (Guid.TryParse(args.Args, out var gameId))\r\n                    {\r\n                        var game = Database.Games[gameId];\r\n                        if (game == null)\r\n                        {\r\n                            logger.Error($\"Cannot start game, game {args.Args} not found.\");\r\n                        }\r\n                        else\r\n                        {\r\n                            GamesEditor.PlayGame(game, false);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        logger.Error($\"Can't start game, failed to parse game id: {args.Args}\");\r\n                    }\r\n\r\n                    break;\r\n\r\n                case CmdlineCommand.UriRequest:\r\n                    UriHandler.ProcessUri(args.Args);\r\n                    break;\r\n\r\n                case CmdlineCommand.ExtensionInstall:\r\n                    if (installingAddon)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    var extPath = args.Args;\r\n                    if (!File.Exists(extPath))\r\n                    {\r\n                        logger.Error($\"Cannot install extension, file doesn't exists: {extPath}\");\r\n                        return;\r\n                    }\r\n\r\n                    installingAddon = true;\r\n                    var ext = Path.GetExtension(extPath).ToLower();\r\n                    if (ext.Equals(PlaynitePaths.PackedThemeFileExtention, StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        MainModelBase.Window.RestoreWindow();\r\n                        InstallThemeFile(extPath);\r\n                    }\r\n                    else if (ext.Equals(PlaynitePaths.PackedExtensionFileExtention, StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        MainModelBase.Window.RestoreWindow();\r\n                        InstallExtensionFile(extPath);\r\n                    }\r\n\r\n                    installingAddon = false;\r\n                    break;\r\n\r\n                case CmdlineCommand.SwitchMode:\r\n                    if (args.Args == \"desktop\")\r\n                    {\r\n                        SyncContext.Post(_ => SwitchAppMode(ApplicationMode.Desktop), null);\r\n                    }\r\n                    else if (args.Args == \"fullscreen\")\r\n                    {\r\n                        SyncContext.Post(_ => SwitchAppMode(ApplicationMode.Fullscreen), null);\r\n                    }\r\n                    else\r\n                    {\r\n                        logger.Error($\"Can't switch to uknwon application mode: {args.Args}\");\r\n                    }\r\n                    break;\r\n\r\n                case CmdlineCommand.Shutdown:\r\n                    Quit();\r\n                    break;\r\n\r\n                case CmdlineCommand.BackupData:\r\n                    if (!File.Exists(args.Args))\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    var backupOptions = Serialization.FromJsonFile<BackupOptions>(args.Args);\r\n                    if (backupOptions.CancelIfGameRunning && GamesEditor.RunningGames.HasItems())\r\n                    {\r\n                        return;\r\n                    }\r\n                    else\r\n                    {\r\n                        Restart(new CmdLineOptions\r\n                        {\r\n                            Backup = args.Args\r\n                        });\r\n                    }\r\n                    break;\r\n\r\n                case CmdlineCommand.RestoreBackup:\r\n                    if (!File.Exists(args.Args))\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    var restoreOptions = Serialization.FromJsonFile<BackupRestoreOptions>(args.Args);\r\n                    if (restoreOptions.CancelIfGameRunning && GamesEditor.RunningGames.HasItems())\r\n                    {\r\n                        return;\r\n                    }\r\n                    else\r\n                    {\r\n                        Restart(new CmdLineOptions\r\n                        {\r\n                            RestoreBackup = args.Args\r\n                        });\r\n                    }\r\n                    break;\r\n\r\n                default:\r\n                    logger.Warn(\"Unknown command received\");\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private void Application_Activated(object sender, EventArgs e)\r\n        {\r\n            IsActive = true;\r\n        }\r\n\r\n        private void Application_Deactivated(object sender, EventArgs e)\r\n        {\r\n            IsActive = false;\r\n        }\r\n\r\n        public void Run()\r\n        {\r\n            CurrentNative.Run();\r\n        }\r\n\r\n        public abstract bool Startup();\r\n\r\n        public bool CheckOtherInstances()\r\n        {\r\n            var curProcess = Process.GetCurrentProcess();\r\n            if (Mutex.TryOpenExisting(instanceMuxet, out var mutex))\r\n            {\r\n                try\r\n                {\r\n                    Policy.Handle<Exception>()\r\n                        .WaitAndRetry(3, a => TimeSpan.FromSeconds(3))\r\n                        .Execute(() =>\r\n                        {\r\n                            var client = new PipeClient(PlayniteSettings.GetAppConfigValue(\"PipeEndpoint\"));\r\n                            if (!CmdLine.Start.IsNullOrEmpty())\r\n                            {\r\n                                client.InvokeCommand(CmdlineCommand.Start, CmdLine.Start);\r\n                            }\r\n                            else if (!CmdLine.UriData.IsNullOrEmpty())\r\n                            {\r\n                                client.InvokeCommand(CmdlineCommand.UriRequest, CmdLine.UriData);\r\n                            }\r\n                            else if (!CmdLine.InstallExtension.IsNullOrEmpty())\r\n                            {\r\n                                client.InvokeCommand(CmdlineCommand.ExtensionInstall, CmdLine.InstallExtension);\r\n                            }\r\n                            else if (CmdLine.StartInDesktop)\r\n                            {\r\n                                client.InvokeCommand(CmdlineCommand.SwitchMode, \"desktop\");\r\n                            }\r\n                            else if (CmdLine.StartInFullscreen)\r\n                            {\r\n                                client.InvokeCommand(CmdlineCommand.SwitchMode, \"fullscreen\");\r\n                            }\r\n                            else if (CmdLine.Shutdown)\r\n                            {\r\n                                client.InvokeCommand(CmdlineCommand.Shutdown, null);\r\n                            }\r\n                            else if (!CmdLine.Backup.IsNullOrEmpty())\r\n                            {\r\n                                client.InvokeCommand(CmdlineCommand.BackupData, CmdLine.Backup);\r\n                            }\r\n                            else if (!CmdLine.RestoreBackup.IsNullOrEmpty())\r\n                            {\r\n                                client.InvokeCommand(CmdlineCommand.RestoreBackup, CmdLine.RestoreBackup);\r\n                            }\r\n                            else\r\n                            {\r\n                                var existingProcess = Process.GetProcesses().\r\n                                    First(a => IsProcessPlayniteProcess(a) && a.Id != curProcess.Id);\r\n                                if (existingProcess.ProcessName == curProcess.ProcessName)\r\n                                {\r\n                                    client.InvokeCommand(CmdlineCommand.Focus, string.Empty);\r\n                                }\r\n                                else\r\n                                {\r\n                                    client.InvokeCommand(CmdlineCommand.SwitchMode, Mode == ApplicationMode.Desktop ? \"desktop\" : \"fullscreen\");\r\n                                }\r\n                            }\r\n                        });\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    MessageBox.Show(\r\n                        \"Playnite failed to start. Please close all other instances and try again.\",\r\n                        \"Startup Error\");\r\n                    logger.Error(exc, \"Can't process communication with other instances.\");\r\n                }\r\n\r\n                logger.Info(\"Application already running, shutting down.\");\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                var processes = Process.GetProcesses().Where(a => IsProcessPlayniteProcess(a)).ToList();\r\n                // In case multiple processes end up in this branch,\r\n                // the process with highest process id gets to live.\r\n                if (processes.Count > 1 && processes.Max(a => a.Id) != curProcess.Id)\r\n                {\r\n                    logger.Info(\"Another process instance(s) is already running, shutting down.\");\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public bool ConfigureApplication()\r\n        {\r\n            HtmlRendererSettings.ImageCachePath = PlaynitePaths.ImagesCachePath;\r\n            HtmlRendererSettings.ImageLoader = BitmapExtensions.HtmlComponentImageLoader;\r\n            if (AppSettings.DisableHwAcceleration || CmdLine.ForceSoftwareRender)\r\n            {\r\n                logger.Info(\"Enabling software rendering.\");\r\n                System.Windows.Media.RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly;\r\n            }\r\n\r\n            if (CmdLine.ClearWebCache)\r\n            {\r\n                try\r\n                {\r\n                    FileSystem.DeleteDirectory(PlaynitePaths.BrowserCachePath);\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(exc, \"Failed to clear CEF cache.\");\r\n                }\r\n            }\r\n\r\n            try\r\n            {\r\n                CefTools.ConfigureCef(AppSettings.TraceLogEnabled);\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to initialize CefSharp.\");\r\n            }\r\n\r\n            if (!CefTools.IsInitialized)\r\n            {\r\n                Dialogs.ShowErrorMessage(\r\n                    ResourceProvider.GetString(\"LOCCefSharpInitError\"),\r\n                    ResourceProvider.GetString(\"LOCStartupError\"));\r\n                Quit();\r\n                return false;\r\n            }\r\n\r\n            try\r\n            {\r\n                ExtensionFactory.CreatePluginFolders();\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to script and plugin directories.\");\r\n            }\r\n\r\n            try\r\n            {\r\n                SystemIntegration.SetBootupStateRegistration(AppSettings.StartOnBoot, AppSettings.StartOnBootClosedToTray);\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to register Playnite to start on boot.\");\r\n            }\r\n\r\n            try\r\n            {\r\n                SystemIntegration.RegisterPlayniteUriProtocol();\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to register playnite URI scheme.\");\r\n            }\r\n\r\n            try\r\n            {\r\n                SystemIntegration.RegisterFileExtensions();\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to register playnite extensions.\");\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        public void ProcessArguments()\r\n        {\r\n            UriHandler.Handlers.Add(\"playnite\", ProcessUriRequest);\r\n            if (!CmdLine.Start.IsNullOrEmpty())\r\n            {\r\n                PipeService_CommandExecuted(this, new CommandExecutedEventArgs(CmdlineCommand.Start, CmdLine.Start));\r\n            }\r\n            else if (!CmdLine.UriData.IsNullOrEmpty())\r\n            {\r\n                PipeService_CommandExecuted(this, new CommandExecutedEventArgs(CmdlineCommand.UriRequest, CmdLine.UriData));\r\n            }\r\n            else if (!CmdLine.InstallExtension.IsNullOrEmpty())\r\n            {\r\n                PipeService_CommandExecuted(this, new CommandExecutedEventArgs(CmdlineCommand.ExtensionInstall, CmdLine.InstallExtension));\r\n            }\r\n            else if (CmdLine.StartInDesktop)\r\n            {\r\n                PipeService_CommandExecuted(this, new CommandExecutedEventArgs(CmdlineCommand.SwitchMode, \"desktop\"));\r\n            }\r\n            else if (CmdLine.StartInFullscreen)\r\n            {\r\n                PipeService_CommandExecuted(this, new CommandExecutedEventArgs(CmdlineCommand.SwitchMode, \"fullscreen\"));\r\n            }\r\n            else if (CmdLine.Shutdown)\r\n            {\r\n                PipeService_CommandExecuted(this, new CommandExecutedEventArgs(CmdlineCommand.Shutdown, null));\r\n            }\r\n        }\r\n\r\n        internal void ProcessUriRequest(PlayniteUriEventArgs args)\r\n        {\r\n            var arguments = args.Arguments;\r\n            if (args.Arguments.Count() == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var command = arguments[0];\r\n            switch (command)\r\n            {\r\n                case UriCommands.CreateDiag:\r\n                    CrashHandlerViewModel.CreateDiagPackage(Dialogs);\r\n                    break;\r\n\r\n                case UriCommands.StartGame:\r\n                    if (arguments.Count() != 2)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    if (Guid.TryParse(arguments[1], out var gameId))\r\n                    {\r\n                        var game = Database.Games[gameId];\r\n                        if (game == null)\r\n                        {\r\n                            logger.Error($\"Cannot start game, game {arguments[1]} not found.\");\r\n                        }\r\n                        else\r\n                        {\r\n                            GamesEditor.PlayGame(game, false);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        logger.Error($\"Can't start game, failed to parse game id: {arguments[1]}\");\r\n                    }\r\n\r\n                    break;\r\n\r\n                case UriCommands.InstallAddon:\r\n                    if (arguments.Count() != 2)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    InstallOnlineAddon(arguments[1]);\r\n                    break;\r\n\r\n                case UriCommands.Search:\r\n                    if (Mode == ApplicationMode.Desktop)\r\n                    {\r\n                        PlayniteApiGlobal.MainView.OpenSearch(arguments.Length >= 2 ? arguments[1] : string.Empty);\r\n                    }\r\n                    break;\r\n\r\n                default:\r\n                    AppUriHandler(args);\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public void Quit(bool saveSettings = true)\r\n        {\r\n            logger.Info(\"Shutting down Playnite\");\r\n            if (saveSettings)\r\n            {\r\n                AppSettings?.SaveSettings();\r\n            }\r\n\r\n            ReleaseResources();\r\n            CurrentNative.Shutdown(0);\r\n        }\r\n\r\n        public void QuitAndStart(string path, string arguments, bool asAdmin = false, bool saveSettings = true)\r\n        {\r\n            logger.Info(\"Shutting down Playnite and starting an app.\");\r\n            if (saveSettings)\r\n            {\r\n                AppSettings?.SaveSettings();\r\n            }\r\n\r\n            ReleaseResources();\r\n\r\n            try\r\n            {\r\n                ProcessStarter.StartProcess(path, arguments, asAdmin);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                // Not sure how this can happen, but there are some \"operation cancelled by user\" crashes here.\r\n                // People probably running Playnite as admin and cancelling UAC for new process, or something...\r\n                logger.Error(e, \"Failed to start process on app shutdown.\");\r\n            }\r\n\r\n            CurrentNative.Shutdown(0);\r\n        }\r\n\r\n        public void QuitAndExecute(Action action, bool saveSettings = true)\r\n        {\r\n            logger.Info(\"Shutting down Playnite and executing an action.\");\r\n            if (saveSettings)\r\n            {\r\n                AppSettings?.SaveSettings();\r\n            }\r\n\r\n            ReleaseResources();\r\n\r\n            try\r\n            {\r\n                action();\r\n            }\r\n            catch(Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to execute app quit action.\");\r\n            }\r\n\r\n            CurrentNative.Shutdown(0);\r\n        }\r\n\r\n        public abstract void Restart(bool saveSettings = true);\r\n\r\n        public abstract void Restart(CmdLineOptions options, bool saveSettings = true);\r\n\r\n        public virtual void ReleaseResources(bool releaseCefSharp = true)\r\n        {\r\n            if (ResourcesReleased)\r\n            {\r\n                return;\r\n            }\r\n\r\n            logger.Debug(\"Releasing Playnite resources...\");\r\n            CurrentNative.Dispatcher.Invoke(() =>\r\n            {\r\n                try\r\n                {\r\n                    appMutex?.ReleaseMutex();\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    // Only happens when trying to release mutext created by a different process.\r\n                    // This shouldn't normally happen since the mutex is released here before starting another instance.\r\n                    logger.Error(e, \"Failed to release app mutext.\");\r\n                }\r\n            });\r\n\r\n            try\r\n            {\r\n                pipeServer?.StopServer();\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                // I have no idea why this fails for some people.\r\n                logger.Error(e, \"Failed to stop pipe server.\");\r\n            }\r\n\r\n            // Rare crash report of DiscordRPC not being loaded properly and then crashing on this\r\n            try\r\n            {\r\n                Discord?.Dispose();\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to dispose Discord RPC.\");\r\n            }\r\n\r\n            updateCheckTimer?.Dispose();\r\n            MainModelBase?.RunShutdowScript();\r\n            Extensions?.NotifiyOnApplicationStopped();\r\n            Dialogs.ActivateGlobalProgress(_ =>\r\n            {\r\n                try\r\n                {\r\n                    if (GlobalTaskHandler.CancelAndWait(Common.Timer.SecondsToMilliseconds(5)) == false)\r\n                    {\r\n                        logger.Warn(\"Global task cancelation failed in time.\");\r\n                    }\r\n\r\n                    GamesEditor?.Dispose();\r\n                    Controllers?.Dispose();\r\n                    Extensions?.Dispose();\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(exc, \"Failed to dispose Playnite objects.\");\r\n                }\r\n            }, new GlobalProgressOptions(\"LOCClosingPlaynite\"));\r\n\r\n            // This must run on main thread\r\n            if (releaseCefSharp)\r\n            {\r\n                CurrentNative.Dispatcher.Invoke(() =>\r\n                {\r\n                    if (CefTools.IsInitialized)\r\n                    {\r\n                        CefTools.Shutdown();\r\n                    }\r\n                });\r\n            }\r\n\r\n            Database?.Dispose();\r\n            ResourcesReleased = true;\r\n        }\r\n\r\n        private void CheckAddonBlacklist()\r\n        {\r\n            try\r\n            {\r\n                var manifests = ExtensionFactory.GetInstalledManifests();\r\n                var blackList = ServicesClient.GetAddonBlacklist();\r\n                var installedList = manifests.Where(a => blackList.Contains(a.Id)).ToList();\r\n                if (installedList.HasItems())\r\n                {\r\n                    Dialogs.ShowMessage(ResourceProvider.GetString(LOC.WarningBlacklistedExtensions).Format(\r\n                        string.Join(Environment.NewLine, installedList.Select(a => a.Name))),\r\n                        \"\", MessageBoxButton.OK, MessageBoxImage.Warning);\r\n                }\r\n            }\r\n            catch (Exception exc)\r\n            {\r\n                logger.Warn(exc, \"Failed to process addon blacklist check.\");\r\n            }\r\n        }\r\n\r\n        private void CheckForUpdates(bool checkProgram, bool checkAddons)\r\n        {\r\n            if (checkProgram)\r\n            {\r\n                try\r\n                {\r\n                    var showNotification = false;\r\n                    var updater = new Updater(this);\r\n                    if (updater.IsUpdateAvailable)\r\n                    {\r\n                        if (AppSettings.UpdateNotificationOnPatchesOnly)\r\n                        {\r\n                            showNotification = Updater.CurrentVersion.Major == updater.GetLatestVersion().Major;\r\n                        }\r\n                        else\r\n                        {\r\n                            showNotification = true;\r\n                        }\r\n                    }\r\n\r\n                    if (showNotification)\r\n                    {\r\n                        var updateTitle = ResourceProvider.GetString(\"LOCUpdaterWindowTitle\");\r\n                        var updateBody = ResourceProvider.GetString(\"LOCUpdateIsAvailableNotificationBody\");\r\n                        if (!Current.IsActive)\r\n                        {\r\n                            ShowWindowsNotification(updateTitle, updateBody, () =>\r\n                            {\r\n                                Restore();\r\n                                new UpdateViewModel(\r\n                                    updater,\r\n                                    new UpdateWindowFactory(),\r\n                                    new ResourceProvider(),\r\n                                    Dialogs,\r\n                                    Mode).OpenView();\r\n                            });\r\n                        }\r\n\r\n                        MainModelBase.UpdatesAvailable = true;\r\n                    }\r\n                }\r\n                catch (Exception exc)\r\n                {\r\n                    logger.Warn(exc, \"Failed to process program update.\");\r\n                }\r\n\r\n                AppSettings.LastProgramUpdateCheck = DateTimes.Now;\r\n            }\r\n\r\n            if (checkAddons)\r\n            {\r\n                try\r\n                {\r\n                    var updates = Addons.CheckAddonUpdates(ServicesClient);\r\n                    if (updates.HasItems())\r\n                    {\r\n                        Notifications.Add(MainModelBase.GetAddonUpdatesFoundMessage(updates));\r\n                    }\r\n                }\r\n                catch (Exception exc)\r\n                {\r\n                    logger.Warn(exc, \"Failed to process addon update check.\");\r\n                }\r\n\r\n                AppSettings.LastAddonUpdateCheck = DateTimes.Now;\r\n            }\r\n        }\r\n\r\n        private void UpdateCheckerCallback(object state)\r\n        {\r\n            CheckForUpdates(AppSettings.ShouldCheckProgramUpdatePeriodic(), AppSettings.ShouldCheckAddonUpdatePeriodic());\r\n            CheckAddonBlacklist();\r\n        }\r\n\r\n        public async Task StartUpdateCheckerAsync()\r\n        {\r\n            if (PlayniteEnvironment.InOfflineMode)\r\n            {\r\n                return;\r\n            }\r\n\r\n            await Task.Delay(Common.Timer.SecondsToMilliseconds(5));\r\n            if (GlobalTaskHandler.IsActive)\r\n            {\r\n                await GlobalTaskHandler.ProgressTask;\r\n            }\r\n\r\n            await Task.Run(() =>\r\n            {\r\n                CheckForUpdates(AppSettings.ShouldCheckProgramUpdateStartup(), AppSettings.ShouldCheckAddonUpdateStartup());\r\n                CheckAddonBlacklist();\r\n            });\r\n\r\n            updateCheckTimer = new System.Threading.Timer(\r\n                UpdateCheckerCallback,\r\n                null,\r\n                Common.Timer.HoursToMilliseconds(4),\r\n                Common.Timer.HoursToMilliseconds(4));\r\n        }\r\n\r\n        public bool MigrateDatabase()\r\n        {\r\n            if (GameDatabase.GetMigrationRequired(AppSettings.DatabasePath))\r\n            {\r\n                var migrationProgress = new ProgressViewViewModel(\r\n                    new ProgressWindowFactory(),\r\n                    new GlobalProgressOptions(LOC.DBUpgradeProgress));\r\n\r\n                if (migrationProgress.ActivateProgress(\r\n                    _ => GameDatabase.MigrateNewDatabaseFormat(GameDatabase.GetFullDbPath(AppSettings.DatabasePath))).Result != true)\r\n                {\r\n                    logger.Error(migrationProgress.FailException, \"Failed to migrate database to new version.\");\r\n                    var message = ResourceProvider.GetString(\"LOCDBUpgradeFail\");\r\n                    if (migrationProgress.FailException is NoDiskSpaceException exc)\r\n                    {\r\n                        message = string.Format(ResourceProvider.GetString(\"LOCDBUpgradeEmptySpaceFail\"), Units.BytesToMegaBytes(exc.RequiredSpace));\r\n                    }\r\n\r\n                    Dialogs.ShowErrorMessage(message, \"\");\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        public void UpdateScreenInformation(Controls.WindowBase window)\r\n        {\r\n            try\r\n            {\r\n                DpiScale = VisualTreeHelper.GetDpi(window);\r\n                CurrentScreen = window.GetScreen();\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                DpiScale = new DpiScale(1, 1);\r\n                CurrentScreen = Computer.GetPrimaryScreen();\r\n                logger.Error(e, $\"Failed to get window information for main {Mode} window.\");\r\n            }\r\n        }\r\n\r\n        public void ShowAddonPerfNotice()\r\n        {\r\n            if (AppSettings.AddonsPerfNoticeShown)\r\n            {\r\n                return;\r\n            }\r\n\r\n            Dialogs.ShowMessage(LOC.AddonPerfNotice, \"\", MessageBoxButton.OK, MessageBoxImage.Warning);\r\n            AppSettings.AddonsPerfNoticeShown = true;\r\n            AppSettings.SaveSettings();\r\n        }\r\n\r\n        public void InstallOnlineAddon(string addonId)\r\n        {\r\n            try\r\n            {\r\n                var addon = ServicesClient.GetAddon(addonId);\r\n                var package = addon.InstallerManifest.GetLatestCompatiblePackage();\r\n                if (package == null)\r\n                {\r\n                    Dialogs.ShowErrorMessage(LOC.AddonErrorNotCompatible, \"\");\r\n                    return;\r\n                }\r\n\r\n                var message = string.Format(\r\n                    ResourceProvider.GetString(addon.IsTheme ? LOC.ThemeInstallPrompt : LOC.ExtensionInstallPrompt),\r\n                    addon.Name, addon.Author, package.Version);\r\n                BaseExtensionManifest existing = null;\r\n                if (addon.IsTheme)\r\n                {\r\n                    existing = ThemeManager.GetAvailableThemes().FirstOrDefault(a => a.Id == addon.AddonId);\r\n                }\r\n                else\r\n                {\r\n                    existing = ExtensionFactory.GetInstalledManifests().FirstOrDefault(a => a.Id == addon.AddonId);\r\n                }\r\n\r\n                if (existing != null)\r\n                {\r\n                    message = string.Format(\r\n                    ResourceProvider.GetString(addon.IsTheme ? LOC.ThemeUpdatePrompt : LOC.ExtensionUpdatePrompt),\r\n                    addon.Name, existing.Version, package.Version);\r\n                }\r\n\r\n                if (Dialogs.ShowMessage(message, LOC.GeneralExtensionInstallTitle, MessageBoxButton.YesNo) != MessageBoxResult.Yes)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                var licenseRes = addon.CheckAddonLicense();\r\n                if (licenseRes == null)\r\n                {\r\n                    Dialogs.ShowErrorMessage(LOC.AddonErrorDownloadFailed, string.Empty);\r\n                    return;\r\n                }\r\n\r\n                if (licenseRes == false)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                ShowAddonPerfNotice();\r\n                var locaPath = addon.GetTargetDownloadPath();\r\n                FileSystem.DeleteFile(locaPath);\r\n                var res = Dialogs.ActivateGlobalProgress((_) =>\r\n                {\r\n                    if (package.PackageUrl.IsHttpUrl())\r\n                    {\r\n                        FileSystem.PrepareSaveFile(locaPath);\r\n                        HttpDownloader.DownloadFile(package.PackageUrl, locaPath);\r\n                    }\r\n                    else\r\n                    {\r\n                        File.Copy(package.PackageUrl, locaPath);\r\n                    }\r\n                },\r\n                new GlobalProgressOptions(LOC.DownloadingLabel, false));\r\n                if (res.Error != null)\r\n                {\r\n                    logger.Error(res.Error, $\"Failed to download addon {package.PackageUrl}\");\r\n                    Dialogs.ShowErrorMessage(LOC.AddonErrorDownloadFailed, string.Empty);\r\n                    return;\r\n                }\r\n\r\n                ExtensionInstaller.QueuePackageInstall(locaPath);\r\n                if (Dialogs.ShowMessage(LOC.ExtInstallationRestartNotif, LOC.SettingsRestartTitle,\r\n                    MessageBoxButton.YesNo) == MessageBoxResult.Yes)\r\n                {\r\n                    Restart(new CmdLineOptions { SkipLibUpdate = true });\r\n                };\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to install addon from uri {addonId}\");\r\n            }\r\n        }\r\n\r\n        public void InstallThemeFile(string themeFile)\r\n        {\r\n            try\r\n            {\r\n                ExtensionInstaller.VerifyThemePackage(themeFile);\r\n                var desc = ExtensionInstaller.GetPackedThemeManifest(themeFile);\r\n                desc.VerifyManifest();\r\n\r\n                if (new Version(desc.ThemeApiVersion).Major != ThemeManager.GetApiVersion(desc.Mode).Major)\r\n                {\r\n                    throw new Exception(ResourceProvider.GetString(\"LOCGeneralExtensionInstallApiVersionFails\"));\r\n                }\r\n\r\n                var message = string.Format(ResourceProvider.GetString(\"LOCThemeInstallPrompt\"),\r\n                    desc.Name, desc.Author, desc.Version);\r\n                var existing = ThemeManager.GetAvailableThemes(desc.Mode).FirstOrDefault(a => a.Id == desc.Id);\r\n                if (existing != null)\r\n                {\r\n                    message = string.Format(ResourceProvider.GetString(\"LOCThemeUpdatePrompt\"),\r\n                        desc.Name, existing.Version, desc.Version);\r\n                }\r\n\r\n                if (Dialogs.ShowMessage(\r\n                        message,\r\n                        ResourceProvider.GetString(\"LOCGeneralExtensionInstallTitle\"),\r\n                        MessageBoxButton.YesNo) == MessageBoxResult.Yes)\r\n                {\r\n                    ShowAddonPerfNotice();\r\n                    ExtensionInstaller.QueuePackageInstall(themeFile);\r\n                    if (Dialogs.ShowMessage(\r\n                        ResourceProvider.GetString(\"LOCExtInstallationRestartNotif\"),\r\n                        ResourceProvider.GetString(\"LOCSettingsRestartTitle\"),\r\n                        MessageBoxButton.YesNo) == MessageBoxResult.Yes)\r\n                    {\r\n                        Restart(new CmdLineOptions()\r\n                        {\r\n                            SkipLibUpdate = true,\r\n                        });\r\n                    };\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to install theme.\");\r\n                Dialogs.ShowErrorMessage(\r\n                    string.Format(ResourceProvider.GetString(\"LOCThemeInstallFail\"), e.Message), \"\");\r\n            }\r\n        }\r\n\r\n        public void InstallExtensionFile(string extensionFile)\r\n        {\r\n            try\r\n            {\r\n                ExtensionInstaller.VerifyExtensionPackage(extensionFile);\r\n                var desc = ExtensionInstaller.GetPackedExtensionManifest(extensionFile);\r\n                desc.VerifyManifest();\r\n\r\n                var message = string.Format(ResourceProvider.GetString(\"LOCExtensionInstallPrompt\"),\r\n                    desc.Name, desc.Author, desc.Version);\r\n                var existing = ExtensionFactory.GetInstalledManifests().FirstOrDefault(a => a.Id == desc.Id);\r\n                if (existing != null)\r\n                {\r\n                    message = string.Format(ResourceProvider.GetString(\"LOCExtensionUpdatePrompt\"),\r\n                        desc.Name, existing.Version, desc.Version);\r\n                }\r\n\r\n                if (Dialogs.ShowMessage(\r\n                        message,\r\n                        ResourceProvider.GetString(\"LOCGeneralExtensionInstallTitle\"),\r\n                        MessageBoxButton.YesNo) == MessageBoxResult.Yes)\r\n                {\r\n                    ShowAddonPerfNotice();\r\n                    ExtensionInstaller.QueuePackageInstall(extensionFile);\r\n                    if (Dialogs.ShowMessage(\r\n                        ResourceProvider.GetString(\"LOCExtInstallationRestartNotif\"),\r\n                        ResourceProvider.GetString(\"LOCSettingsRestartTitle\"),\r\n                        MessageBoxButton.YesNo) == MessageBoxResult.Yes)\r\n                    {\r\n                        Restart(new CmdLineOptions()\r\n                        {\r\n                            SkipLibUpdate = true,\r\n                        });\r\n                    };\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to install extension.\");\r\n                Dialogs.ShowErrorMessage(\r\n                    string.Format(ResourceProvider.GetString(\"LOCExtensionInstallFail\"), e.Message), \"\");\r\n            }\r\n        }\r\n\r\n        public void OnExtensionsLoaded()\r\n        {\r\n            ExtensionsLoaded?.Invoke(this, EventArgs.Empty);\r\n            OnPropertyChanged(nameof(this.ExtensionsStatusBinder));\r\n        }\r\n\r\n        private void WaitForOtherInstacesToExit(bool throwOnTimetout)\r\n        {\r\n            if (Process.GetProcesses().Where(a => IsProcessPlayniteProcess(a)).Count() > 1)\r\n            {\r\n                logger.Info(\"Multiple Playnite instances detected, waiting for them to close.\");\r\n                for (int i = 0; i < 10; i++)\r\n                {\r\n                    Thread.Sleep(500);\r\n                    if (Process.GetProcesses().Where(a => IsProcessPlayniteProcess(a)).Count() == 1)\r\n                    {\r\n                        break;\r\n                    }\r\n                    else if (i == 9)\r\n                    {\r\n                        if (throwOnTimetout)\r\n                        {\r\n                            throw new Exception(\"Another Playnite instance didn't shutdown in time.\");\r\n                        }\r\n                        else\r\n                        {\r\n                            logger.Warn(\"Another Playnite instance didn't shutdown in time.\");\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static bool IsProcessPlayniteProcess(Process process)\r\n        {\r\n            return process.ProcessName.StartsWith(\"Playnite.DesktopApp\") || process.ProcessName.StartsWith(\"Playnite.FullscreenApp\");\r\n        }\r\n\r\n        public abstract PlayniteAPI GetApiInstance(ExtensionManifest pluginOwner);\r\n        public abstract PlayniteAPI GetApiInstance();\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/App/UpdateManifest.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class UpdateManifest : ObservableObject\r\n    {\r\n        public const string ServerManifestFileName = \"update.json\";\r\n\r\n        private Version version;\r\n        private Version sdkVersion;\r\n        private Version fullscreenThemeVersion;\r\n        private Version desktopThemeVersion;\r\n        private string checksum;\r\n        private List<string> packageUrls;\r\n        private List<Version> versionHistory;\r\n\r\n        public Version Version                  { get => version; set => SetValue(ref version, value); }\r\n        public Version SdkVersion               { get => sdkVersion; set => SetValue(ref sdkVersion, value); }\r\n        public Version FullscreenThemeVersion   { get => fullscreenThemeVersion; set => SetValue(ref fullscreenThemeVersion, value); }\r\n        public Version DesktopThemeVersion      { get => desktopThemeVersion; set => SetValue(ref desktopThemeVersion, value); }\r\n        public string Checksum                  { get => checksum; set => SetValue(ref checksum, value); }\r\n        public List<string> PackageUrls         { get => packageUrls; set => SetValue(ref packageUrls, value); }\r\n        public List<Version> VersionHistory     { get => versionHistory; set => SetValue(ref versionHistory, value); }\r\n    }\r\n\r\n    public class ReleaseNoteData\r\n    {\r\n        public Version Version\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public string Note\r\n        {\r\n            get; set;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/App/Updater.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Configuration;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Newtonsoft.Json;\r\nusing System.Windows;\r\nusing Flurl;\r\nusing System.Net;\r\nusing Playnite.Common;\r\nusing Playnite.Common.Web;\r\nusing Playnite.Settings;\r\nusing Playnite.SDK;\r\n\r\nnamespace Playnite\r\n{\r\n    public class Updater\r\n    {\r\n        private static string updateBranch\r\n        {\r\n            get\r\n            {\r\n                return ConfigurationManager.AppSettings[\"UpdateBranch\"];\r\n            }\r\n        }\r\n\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private UpdateManifest updateManifest;\r\n        private IPlayniteApplication playniteApp;\r\n        private IDownloader downloader;\r\n\r\n        private string updaterPath\r\n        {\r\n            get\r\n            {\r\n                return Path.Combine(PlaynitePaths.TempPath, \"update.exe\");\r\n            }\r\n        }\r\n\r\n        public bool IsUpdateAvailable\r\n        {\r\n            get\r\n            {\r\n                var latest = GetLatestVersion();\r\n                var current = CurrentVersion;\r\n                if (latest > current)\r\n                {\r\n                    // Windows 7 and 8 and 32bit systems should no longer update, except for patches\r\n                    if (Computer.WindowsVersion == WindowsVersion.Win7 || Computer.WindowsVersion == WindowsVersion.Win8 || !Environment.Is64BitOperatingSystem)\r\n                    {\r\n                        return latest.Major == current.Major;\r\n                    }\r\n                    else\r\n                    {\r\n                        return true;\r\n                    }\r\n                }\r\n\r\n                return false;\r\n            }\r\n        }\r\n\r\n        private static Version currentVersion;\r\n        public static Version CurrentVersion\r\n        {\r\n            get\r\n            {\r\n                if (currentVersion == null)\r\n                {\r\n                    currentVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;\r\n                }\r\n\r\n                return currentVersion;\r\n            }\r\n        }\r\n\r\n        public Updater(IPlayniteApplication app) : this(app, new Downloader())\r\n        {\r\n        }\r\n\r\n        public Updater(IPlayniteApplication app, IDownloader webDownloader)\r\n        {\r\n            playniteApp = app;\r\n            downloader = webDownloader;\r\n        }\r\n\r\n        private string GetUpdateDataRootUrl(string configKey)\r\n        {\r\n            return Url.Combine(ConfigurationManager.AppSettings[configKey], updateBranch, $\"{CurrentVersion.Major}.{CurrentVersion.Minor}\");\r\n        }\r\n\r\n        public List<ReleaseNoteData> GetReleaseNotes()\r\n        {\r\n            var notes = new List<ReleaseNoteData>();\r\n            if (updateManifest == null)\r\n            {\r\n                DownloadManifest();\r\n            }\r\n\r\n            foreach (var version in updateManifest.VersionHistory)\r\n            {\r\n                if (version.CompareTo(CurrentVersion) > 0)\r\n                {\r\n                    var noteUrls = new List<string>\r\n                    {\r\n                        Url.Combine(ConfigurationManager.AppSettings[\"UpdateUrl\"], updateBranch, $\"{version.Major}.{version.Minor}.html\"),\r\n                        Url.Combine(ConfigurationManager.AppSettings[\"UpdateUrl2\"], updateBranch, $\"{version.Major}.{version.Minor}.html\")\r\n                    };\r\n\r\n                    var note = downloader.DownloadString(noteUrls);\r\n                    notes.Add(new ReleaseNoteData()\r\n                    {\r\n                        Version = version,\r\n                        Note = note\r\n                    });\r\n                }\r\n            }\r\n\r\n            return notes;\r\n        }\r\n\r\n        private bool VerifyUpdateFile(string checksum, string path)\r\n        {\r\n            var newMD5 = FileSystem.GetMD5(path);\r\n            if (newMD5 != checksum)\r\n            {\r\n                logger.Error($\"Checksum of downloaded file doesn't match: {newMD5} vs {checksum}\");\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        public async Task DownloadUpdate(Action<DownloadProgressChangedEventArgs> progressHandler)\r\n        {\r\n            if (updateManifest == null)\r\n            {\r\n                DownloadManifest();\r\n            }\r\n\r\n            if (File.Exists(updaterPath))\r\n            {\r\n                if (VerifyUpdateFile(updateManifest.Checksum, updaterPath))\r\n                {\r\n                    logger.Info(\"Update already downloaded skipping download.\");\r\n                    return;\r\n                }\r\n            }\r\n\r\n            try\r\n            {\r\n                await downloader.DownloadFileAsync(updateManifest.PackageUrls, updaterPath, progressHandler);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to download update file.\");\r\n                throw new Exception(\"Failed to download update file.\");\r\n            }\r\n\r\n            if (!VerifyUpdateFile(updateManifest.Checksum, updaterPath))\r\n            {\r\n                throw new Exception($\"Update file integrity check failed.\");\r\n            }\r\n        }\r\n\r\n        public void InstallUpdate(ApplicationMode mode)\r\n        {\r\n            var portable = PlayniteSettings.IsPortable ? \"/PORTABLE\" : \"\";\r\n            var fullscreen = mode == ApplicationMode.Fullscreen ? \"/FULLSCREEN\" : \"\";\r\n            logger.Info(\"Installing new update to {0}, in {1} mode\".Format(PlaynitePaths.ProgramPath, portable));\r\n            playniteApp.QuitAndStart(\r\n                updaterPath,\r\n                @\"/SILENT /NOCANCEL /DIR=\"\"{0}\"\" /UPDATE {1} {2}\".Format(PlaynitePaths.ProgramPath, portable, fullscreen),\r\n                !FileSystem.CanWriteToFolder(PlaynitePaths.ProgramPath));\r\n        }\r\n\r\n        public UpdateManifest DownloadManifest()\r\n        {\r\n            var dataString = string.Empty;\r\n\r\n            try\r\n            {\r\n                dataString = GetUpdateManifestData(GetUpdateDataRootUrl(\"UpdateUrl\"));\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Warn(e, \"Failed to download update manifest from main URL\");\r\n            }\r\n\r\n            try\r\n            {\r\n                if (string.IsNullOrEmpty(dataString))\r\n                {\r\n                    dataString = GetUpdateManifestData(GetUpdateDataRootUrl(\"UpdateUrl2\"));\r\n                }\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Warn(e, \"Failed to download update manifest from secondary URL\");\r\n            }\r\n\r\n            if (string.IsNullOrEmpty(dataString))\r\n            {\r\n                throw new Exception(\"Failed to download update manifest.\");\r\n            }\r\n\r\n            updateManifest = JsonConvert.DeserializeObject<UpdateManifest>(dataString);\r\n            return updateManifest;\r\n        }\r\n\r\n        public Version GetLatestVersion()\r\n        {\r\n            if (updateManifest == null)\r\n            {\r\n                DownloadManifest();\r\n            }\r\n\r\n            return updateManifest.Version;\r\n        }\r\n\r\n        private string GetUpdateManifestData(string url)\r\n        {\r\n            return downloader.DownloadString(Url.Combine(url, UpdateManifest.ServerManifestFileName));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n  <configSections>\r\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" requirePermission=\"false\" />    \r\n  </configSections>\r\n  <entityFramework>\r\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework\">\r\n      <parameters>\r\n        <parameter value=\"v13.0\" />\r\n      </parameters>\r\n    </defaultConnectionFactory>\r\n    <providers>\r\n      <provider invariantName=\"System.Data.SqlClient\" type=\"System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer\" />\r\n    </providers>\r\n  </entityFramework>\r\n  <startup>\r\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\" />\r\n  </startup>\r\n  <runtime>\r\n    <loadFromRemoteSources enabled=\"true\" />\r\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.4.0\" newVersion=\"4.1.4.0\" />\r\n      </dependentAssembly>\r\n    </assemblyBinding>\r\n  </runtime>  \r\n</configuration>"
  },
  {
    "path": "source/Playnite/Archive.cs",
    "content": "﻿using Playnite.Common;\r\nusing SharpCompress.Archives;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.IO.Compression;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public static class Archive\r\n    {\r\n        public static List<string> GetArchiveFiles(string archivePath)\r\n        {\r\n            using (var archive = ArchiveFactory.Open(archivePath))\r\n            {\r\n                return archive.Entries.Where(a => !a.IsDirectory).Select(a => a.Key).ToList();\r\n            }\r\n        }\r\n\r\n        public static Tuple<Stream, IDisposable> GetEntryStream(string archivePath, string entryName)\r\n        {\r\n            var archive = ArchiveFactory.Open(archivePath);\r\n            var entry = archive.Entries.FirstOrDefault(a => a.Key == entryName);\r\n            if (entry == null)\r\n            {\r\n                archive.Dispose();\r\n                return null;\r\n            }\r\n\r\n            return new Tuple<Stream, IDisposable>(entry.OpenEntryStream(), archive);\r\n        }\r\n\r\n        public static void CreateEntryFromDirectory(this ZipArchive archive, string directory, string entryName, CancellationToken cancelToken)\r\n        {\r\n            if (cancelToken.IsCancellationRequested)\r\n            {\r\n                return;\r\n            }\r\n\r\n            foreach (var file in Directory.GetFiles(directory))\r\n            {\r\n                if (cancelToken.IsCancellationRequested)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                archive.CreateEntryFromFile(Paths.FixPathLength(file), Path.Combine(entryName, Path.GetFileName(file)));\r\n            }\r\n\r\n            if (cancelToken.IsCancellationRequested)\r\n            {\r\n                return;\r\n            }\r\n\r\n            foreach (var dir in Directory.GetDirectories(directory))\r\n            {\r\n                if (cancelToken.IsCancellationRequested)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                CreateEntryFromDirectory(archive, dir, Path.Combine(entryName, Path.GetFileName(dir)), cancelToken);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Audio.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing static SDL2.SDL;\r\nusing static SDL2.SDL_mixer;\r\n\r\nnamespace Playnite.Audio\r\n{\r\n    public class AudioEngine : IDisposable\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        public static readonly string[] SupportedFileTypes = new string[] { \"wav\", \"ogg\", \"mp3\", \"flac\" };\r\n        public static readonly string SupportedFileTypesRegex = string.Join(\"|\", SupportedFileTypes);\r\n\r\n        public bool AudioClosed { get; private set; } = false;\r\n        public bool AudioInitialized { get; private set; } = false;\r\n        public DateTime LastAudioEvent { get; private set; } = DateTime.Now;\r\n\r\n        public AudioEngine()\r\n        {\r\n            OpenAudio();\r\n        }\r\n\r\n        private void OpenAudio()\r\n        {\r\n            if (Mix_OpenAudio(44_100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)\r\n            {\r\n                logger.Error(\"Failed to open SDL2 audio device:\");\r\n                logger.Error(Mix_GetError());\r\n                AudioInitialized = false;\r\n                AudioClosed = true;\r\n                return;\r\n            }\r\n\r\n            AudioInitialized = true;\r\n            AudioClosed = false;\r\n        }\r\n\r\n        public static int GetVolume(float floatVolume)\r\n        {\r\n            floatVolume *= floatVolume;\r\n            // lerp settings float 0 -> 1 range to SDL's 0 -> 128 range\r\n            var res = (int)Math.Ceiling((0f * (1f - floatVolume)) + (128f * floatVolume));\r\n            return res;\r\n        }\r\n\r\n        public void PlaySound(IntPtr sound)\r\n        {\r\n            if (sound == IntPtr.Zero)\r\n                return;\r\n\r\n            if (!AudioInitialized)\r\n                return;\r\n\r\n            if (AudioClosed)\r\n                OpenAudio();\r\n\r\n            LastAudioEvent = DateTime.Now;\r\n            try\r\n            {\r\n                Mix_PlayChannel(-1, sound, 0);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to play SDL sound.\");\r\n            }\r\n        }\r\n\r\n        public void SetSoundVolume(IntPtr sounds, float volume)\r\n        {\r\n            if (!AudioInitialized)\r\n                return;\r\n\r\n            Mix_VolumeChunk(sounds, GetVolume(volume));\r\n        }\r\n\r\n        public IntPtr LoadSound(string path)\r\n        {\r\n            if (!AudioInitialized)\r\n                return IntPtr.Zero;\r\n\r\n            return Mix_LoadWAV(path);\r\n        }\r\n\r\n        public void SetMusicVolume(float volume)\r\n        {\r\n            if (!AudioInitialized)\r\n                return;\r\n\r\n            Mix_VolumeMusic(GetVolume(volume));\r\n        }\r\n\r\n        public IntPtr LoadMusic(string path)\r\n        {\r\n            if (!AudioInitialized)\r\n                return IntPtr.Zero;\r\n\r\n            return Mix_LoadMUS(path);\r\n        }\r\n\r\n        public void PlayMusic(IntPtr music)\r\n        {\r\n            if (music == IntPtr.Zero)\r\n                return;\r\n\r\n            if (!AudioInitialized)\r\n                return;\r\n\r\n            if (AudioClosed)\r\n                OpenAudio();\r\n\r\n            LastAudioEvent = DateTime.Now;\r\n            try\r\n            {\r\n                Mix_PlayMusic(music, -1);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to play SDL music.\");\r\n            }\r\n        }\r\n\r\n        public void PauseMusic()\r\n        {\r\n            if (!AudioInitialized)\r\n                return;\r\n\r\n            LastAudioEvent = DateTime.Now;\r\n            Mix_PauseMusic();\r\n        }\r\n\r\n        public void StopMusic()\r\n        {\r\n            if (!AudioInitialized)\r\n                return;\r\n\r\n            LastAudioEvent = DateTime.Now;\r\n            Mix_HaltMusic();\r\n        }\r\n\r\n        public void ResumeMusic()\r\n        {\r\n            if (!AudioInitialized)\r\n                return;\r\n\r\n            if (AudioClosed)\r\n                OpenAudio();\r\n\r\n            LastAudioEvent = DateTime.Now;\r\n            Mix_ResumeMusic();\r\n        }\r\n\r\n        public bool GetIsMusicPlaying()\r\n        {\r\n            if (!AudioInitialized)\r\n                return false;\r\n\r\n            return Mix_PlayingMusic() == 1;\r\n        }\r\n\r\n        public bool GetIsMusicPaused()\r\n        {\r\n            if (!AudioInitialized)\r\n                return false;\r\n\r\n            return Mix_PausedMusic() == 1;\r\n        }\r\n\r\n        public void CloseAudio()\r\n        {\r\n            if (AudioClosed || !AudioInitialized)\r\n                return;\r\n\r\n            Mix_CloseAudio();\r\n            AudioClosed = true;\r\n        }\r\n\r\n        public void DisposeSound(IntPtr sound)\r\n        {\r\n            Mix_FreeChunk(sound);\r\n        }\r\n\r\n        public void DisposeMusic(IntPtr music)\r\n        {\r\n            Mix_FreeMusic(music);\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            AudioInitialized = false;\r\n            AudioClosed = true;\r\n            Mix_Quit();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Backup.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.IO.Compression;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public enum BackupDataItem\r\n    {\r\n        [Description(LOC.BackupOptionSettings)]\r\n        Settings = 0,\r\n        [Description(LOC.BackupOptionLibrary)]\r\n        Library = 1,\r\n        [Description(LOC.BackupOptionGameMedia)]\r\n        LibraryFiles = 2,\r\n        [Description(LOC.BackupOptionExtensions)]\r\n        Extensions = 3,\r\n        [Description(LOC.BackupOptionThemes)]\r\n        Themes = 4,\r\n        [Description(LOC.BackupOptionExtensionsData)]\r\n        ExtensionsData = 5\r\n    }\r\n\r\n    public class BackupOptions\r\n    {\r\n        public string DataDir { get; set; }\r\n        public string LibraryDir { get; set; }\r\n        public string OutputFile { get; set; }\r\n        public string OutputDir { get; set; }\r\n        public List<BackupDataItem> BackupItems { get; set; }\r\n        public bool ClosedWhenDone  { get; set; }\r\n        public bool CancelIfGameRunning { get; set; }\r\n        public int RotatingBackups { get; set; } = 0;\r\n    }\r\n\r\n    public class BackupRestoreOptions\r\n    {\r\n        public string BackupFile { get; set; }\r\n        public string DataDir { get; set; }\r\n        public string LibraryDir { get; set; }\r\n        public List<BackupDataItem> RestoreItems { get; set; }\r\n        public bool ClosedWhenDone { get; set; }\r\n        public bool CancelIfGameRunning { get; set; }\r\n        public string RestoreLibrarySettingsPath { get; set; }\r\n    }\r\n\r\n    public class Backup\r\n    {\r\n        private const string backupDateFormat = \"yyyy-MM-dd-HH-mm-ss\";\r\n        private const string autoBackupFilePattern = autoBackupFileName + @\"\\-\\d{4}\\-\\d{2}-\\d{2}-\\d{2}-\\d{2}-\\d{2}\";\r\n        private const string autoBackupFileName = \"PlayniteBackup\";\r\n        private const string libraryEntryRoot = \"library\";\r\n        private const string libraryFilesEntryRoot = \"libraryfiles\";\r\n        private const string extensionsDataEntryRoot = \"extensiondata\";\r\n        private const string extensionsEntryRoot = \"extension\";\r\n        private const string themesEntryRoot = \"themes\";\r\n        private static readonly string[] configFilesNames = new string[] { PlaynitePaths.ConfigFileName, PlaynitePaths.FullscreenConfigFileName };\r\n\r\n        public static void BackupData(string optionsFile, CancellationToken cancelToken)\r\n        {\r\n            BackupData(Serialization.FromJsonFile<BackupOptions>(optionsFile), cancelToken);\r\n        }\r\n\r\n        public static void BackupData(BackupOptions options, CancellationToken cancelToken)\r\n        {\r\n            if (options.OutputDir.IsNullOrEmpty() && options.OutputFile.IsNullOrEmpty())\r\n            {\r\n                throw new Exception(\"Backup output path not specified!\");\r\n            }\r\n\r\n            if (!options.OutputDir.IsNullOrEmpty())\r\n            {\r\n                options.OutputFile = Path.Combine(options.OutputDir, GetAutoBackupFileName());\r\n            }\r\n\r\n            if (options.BackupItems == null)\r\n            {\r\n                options.BackupItems = new List<BackupDataItem>();\r\n            }\r\n\r\n            FileSystem.DeleteFile(options.OutputFile);\r\n            using (var zipFile = new FileStream(options.OutputFile, FileMode.Create))\r\n            using (var archive = new ZipArchive(zipFile, ZipArchiveMode.Create))\r\n            {\r\n                // Settings\r\n                foreach (var config in configFilesNames)\r\n                {\r\n                    var fullPath = Path.Combine(options.DataDir, config);\r\n                    if (File.Exists(fullPath))\r\n                    {\r\n                        archive.CreateEntryFromFile(fullPath, config);\r\n                    }\r\n                };\r\n\r\n                if (Directory.Exists(options.LibraryDir))\r\n                {\r\n                    // Library\r\n                    foreach (var libFile in Directory.GetFiles(Path.Combine(options.LibraryDir)))\r\n                    {\r\n                        if (cancelToken.IsCancellationRequested)\r\n                        {\r\n                            goto archiveDone;\r\n                        }\r\n\r\n                        archive.CreateEntryFromFile(libFile, Path.Combine(libraryEntryRoot, Path.GetFileName(libFile)));\r\n                    }\r\n\r\n                    if (cancelToken.IsCancellationRequested)\r\n                    {\r\n                        goto archiveDone;\r\n                    }\r\n\r\n                    // Library files\r\n                    var libFilesDir = Path.Combine(options.LibraryDir, GameDatabase.filesDirName);\r\n                    if (options.BackupItems.Contains(BackupDataItem.LibraryFiles) && Directory.Exists(libFilesDir))\r\n                    {\r\n                        archive.CreateEntryFromDirectory(libFilesDir, libraryFilesEntryRoot, cancelToken);\r\n                    }\r\n\r\n                    if (cancelToken.IsCancellationRequested)\r\n                    {\r\n                        goto archiveDone;\r\n                    }\r\n                }\r\n\r\n                // Extensions\r\n                var addonsDir = Path.Combine(options.DataDir, PlaynitePaths.ExtensionsDirName);\r\n                if (options.BackupItems.Contains(BackupDataItem.Extensions) && Directory.Exists(addonsDir))\r\n                {\r\n                    archive.CreateEntryFromDirectory(addonsDir, extensionsEntryRoot, cancelToken);\r\n                }\r\n\r\n                if (cancelToken.IsCancellationRequested)\r\n                {\r\n                    goto archiveDone;\r\n                }\r\n\r\n                // Extensions data\r\n                var extDataDir = Path.Combine(options.DataDir, PlaynitePaths.ExtensionsDataDirName);\r\n                if (options.BackupItems.Contains(BackupDataItem.ExtensionsData) && Directory.Exists(extDataDir))\r\n                {\r\n                    archive.CreateEntryFromDirectory(extDataDir, extensionsDataEntryRoot, cancelToken);\r\n                }\r\n\r\n                if (cancelToken.IsCancellationRequested)\r\n                {\r\n                    goto archiveDone;\r\n                }\r\n\r\n                // Themes\r\n                var themesDir = Path.Combine(options.DataDir, PlaynitePaths.ThemesDirName);\r\n                if (options.BackupItems.Contains(BackupDataItem.Themes) && Directory.Exists(themesDir))\r\n                {\r\n                    void packThemes(ApplicationMode mode)\r\n                    {\r\n                        var themeRootDir = ThemeManager.GetThemeRootDir(mode);\r\n                        var modeThemesDir = Path.Combine(themesDir, themeRootDir);\r\n                        if (Directory.Exists(modeThemesDir))\r\n                        {\r\n                            foreach (var themeDir in Directory.GetDirectories(modeThemesDir))\r\n                            {\r\n                                var themeDirName = Path.GetFileName(themeDir);\r\n                                // Never backup default themes\r\n                                if (themeDirName == ThemeManager.DefaultThemeDirName)\r\n                                {\r\n                                    continue;\r\n                                }\r\n\r\n                                archive.CreateEntryFromDirectory(themeDir, Path.Combine(themesEntryRoot, themeRootDir, themeDirName), cancelToken);\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    packThemes(ApplicationMode.Desktop);\r\n                    packThemes(ApplicationMode.Fullscreen);\r\n                }\r\n            }\r\n\r\n        archiveDone:\r\n            if (cancelToken.IsCancellationRequested)\r\n            {\r\n                FileSystem.DeleteFile(options.OutputFile);\r\n            }\r\n            else\r\n            {\r\n                var backupDir = Path.GetDirectoryName(options.OutputFile);\r\n                var files = Directory.GetFiles(backupDir, $\"{autoBackupFileName}*.zip\").Where(a => Regex.IsMatch(a, autoBackupFilePattern)).OrderBy(a => a).ToArray();\r\n                if (files.Length > options.RotatingBackups + 1)\r\n                {\r\n                    for (int i = 0; i < files.Length - (options.RotatingBackups + 1); i++)\r\n                    {\r\n                        File.Delete(files[i]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void RestoreBackup(string optionsFile)\r\n        {\r\n            RestoreBackup(Serialization.FromJsonFile<BackupRestoreOptions>(optionsFile));\r\n        }\r\n\r\n        public static void RestoreBackup(BackupRestoreOptions options)\r\n        {\r\n            if (options.RestoreItems == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            FileSystem.CreateDirectory(options.DataDir);\r\n            FileSystem.CreateDirectory(options.LibraryDir);\r\n            using (var zipFile = new FileStream(options.BackupFile, FileMode.Open))\r\n            using (var archive = new ZipArchive(zipFile, ZipArchiveMode.Read))\r\n            {\r\n                // Settings\r\n                if (options.RestoreItems.Contains(BackupDataItem.Settings))\r\n                {\r\n                    foreach (var config in configFilesNames)\r\n                    {\r\n                        var configEntry = archive.GetEntry(config);\r\n                        if (configEntry != null)\r\n                        {\r\n                            var origFile = Path.Combine(options.DataDir, config);\r\n                            FileSystem.DeleteFile(origFile);\r\n                            configEntry.ExtractToFile(Paths.FixPathLength(origFile));\r\n                        }\r\n                    }\r\n\r\n                    if (!options.RestoreLibrarySettingsPath.IsNullOrEmpty())\r\n                    {\r\n                        // We are doing direct string replacement because proper serialization might not be safe here.\r\n                        // We don't know what settings model version is the original file and potential conversion will\r\n                        // be left to setting load on next startup.\r\n                        var mainConfigFile = Paths.FixPathLength(Path.Combine(options.DataDir, PlaynitePaths.ConfigFileName));\r\n                        var resultLine = $\"\\\"{nameof(PlayniteSettings.DatabasePath)}\\\": {Newtonsoft.Json.JsonConvert.ToString(options.RestoreLibrarySettingsPath)},\";\r\n                        var configContent = File.ReadAllLines(mainConfigFile);\r\n                        for (int i = 0; i < configContent.Length; i++)\r\n                        {\r\n                            if (configContent[i].Contains($\"\\\"{nameof(PlayniteSettings.DatabasePath)}\\\"\"))\r\n                            {\r\n                                configContent[i] = resultLine;\r\n                            }\r\n                        }\r\n\r\n                        File.WriteAllLines(mainConfigFile, configContent);\r\n                    }\r\n                }\r\n\r\n                // Library\r\n                var libPrefix = libraryEntryRoot + Path.DirectorySeparatorChar;\r\n                if (options.RestoreItems.Contains(BackupDataItem.Library) && archive.Entries.Any(a => a.FullName.StartsWith(libPrefix, StringComparison.OrdinalIgnoreCase)))\r\n                {\r\n                    foreach (var file in Directory.GetFiles(options.LibraryDir))\r\n                    {\r\n                        File.Delete(file);\r\n                    }\r\n\r\n                    foreach (var entry in archive.Entries)\r\n                    {\r\n                        if (entry.FullName.StartsWith(libPrefix, StringComparison.OrdinalIgnoreCase) &&\r\n                            entry.FullName.Count(a => a == Path.DirectorySeparatorChar) == 1)\r\n                        {\r\n                            entry.ExtractToFile(Paths.FixPathLength(Path.Combine(options.LibraryDir, entry.Name)));\r\n                        }\r\n                    }\r\n                }\r\n\r\n                void unpackBackupDir(bool restore, string outputDir, string dirPrefix)\r\n                {\r\n                    dirPrefix = dirPrefix + Path.DirectorySeparatorChar;\r\n                    if (restore && archive.Entries.Any(a => a.FullName.StartsWith(dirPrefix, StringComparison.OrdinalIgnoreCase)))\r\n                    {\r\n                        FileSystem.CreateDirectory(outputDir, true);\r\n                        foreach (var entry in archive.Entries)\r\n                        {\r\n                            if (entry.FullName.StartsWith(dirPrefix, StringComparison.OrdinalIgnoreCase))\r\n                            {\r\n                                var outFile = Path.Combine(outputDir, entry.FullName.Replace(dirPrefix, \"\"));\r\n                                FileSystem.PrepareSaveFile(outFile);\r\n                                entry.ExtractToFile(Paths.FixPathLength(outFile));\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                void unpackThemeBackupDir(bool restore, string outputDir, string dirPrefix)\r\n                {\r\n                    dirPrefix = dirPrefix + Path.DirectorySeparatorChar;\r\n                    if (restore && archive.Entries.Any(a => a.FullName.StartsWith(dirPrefix, StringComparison.OrdinalIgnoreCase)))\r\n                    {\r\n                        void cleanThemeModeDir(ApplicationMode mode)\r\n                        {\r\n                            var modeDir = Path.Combine(outputDir, ThemeManager.GetThemeRootDir(mode));\r\n                            FileSystem.CreateDirectory(modeDir, false);\r\n                            foreach (var dir in Directory.GetDirectories(modeDir))\r\n                            {\r\n                                // Default themes must not be deleted since they are never included in the backup\r\n                                if (new DirectoryInfo(dir).Name.Equals(ThemeManager.DefaultThemeDirName, StringComparison.OrdinalIgnoreCase))\r\n                                {\r\n                                    continue;\r\n                                }\r\n\r\n                                FileSystem.DeleteDirectory(dir);\r\n                            }\r\n\r\n                            foreach (var file in Directory.GetFiles(modeDir))\r\n                            {\r\n                                FileSystem.DeleteFile(file);\r\n                            }\r\n                        }\r\n\r\n                        FileSystem.CreateDirectory(outputDir, false);\r\n                        cleanThemeModeDir(ApplicationMode.Desktop);\r\n                        cleanThemeModeDir(ApplicationMode.Fullscreen);\r\n                        foreach (var entry in archive.Entries)\r\n                        {\r\n                            if (entry.FullName.StartsWith(dirPrefix, StringComparison.OrdinalIgnoreCase))\r\n                            {\r\n                                var outFile = Path.Combine(outputDir, entry.FullName.Replace(dirPrefix, \"\"));\r\n                                FileSystem.PrepareSaveFile(outFile);\r\n                                entry.ExtractToFile(Paths.FixPathLength(outFile));\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Library files\r\n                unpackBackupDir(options.RestoreItems.Contains(BackupDataItem.LibraryFiles), Path.Combine(options.LibraryDir, GameDatabase.filesDirName), libraryFilesEntryRoot);\r\n\r\n                // Extensions\r\n                unpackBackupDir(options.RestoreItems.Contains(BackupDataItem.Extensions), Path.Combine(options.DataDir, PlaynitePaths.ExtensionsDirName), extensionsEntryRoot);\r\n\r\n                // Extensions data\r\n                unpackBackupDir(options.RestoreItems.Contains(BackupDataItem.ExtensionsData), Path.Combine(options.DataDir, PlaynitePaths.ExtensionsDataDirName), extensionsDataEntryRoot);\r\n\r\n                // Themes\r\n                unpackThemeBackupDir(options.RestoreItems.Contains(BackupDataItem.Themes), Path.Combine(options.DataDir, PlaynitePaths.ThemesDirName), themesEntryRoot);\r\n            }\r\n        }\r\n\r\n        public static List<BackupDataItem> GetRestoreSelections(string backupFile)\r\n        {\r\n            var selections = new List<BackupDataItem> { BackupDataItem.Settings, BackupDataItem.Library };\r\n            using (var zipFile = new FileStream(backupFile, FileMode.Open))\r\n            using (var archive = new ZipArchive(zipFile, ZipArchiveMode.Read))\r\n            {\r\n                var entires = archive.Entries;\r\n                if (entires.Any(a => a.FullName.StartsWith(libraryFilesEntryRoot, StringComparison.OrdinalIgnoreCase)))\r\n                {\r\n                    selections.Add(BackupDataItem.LibraryFiles);\r\n                }\r\n\r\n                if (entires.Any(a => a.FullName.StartsWith(extensionsEntryRoot, StringComparison.OrdinalIgnoreCase)))\r\n                {\r\n                    selections.Add(BackupDataItem.Extensions);\r\n                }\r\n\r\n                if (entires.Any(a => a.FullName.StartsWith(extensionsDataEntryRoot, StringComparison.OrdinalIgnoreCase)))\r\n                {\r\n                    selections.Add(BackupDataItem.ExtensionsData);\r\n                }\r\n\r\n                if (entires.Any(a => a.FullName.StartsWith(themesEntryRoot, StringComparison.OrdinalIgnoreCase)))\r\n                {\r\n                    selections.Add(BackupDataItem.Themes);\r\n                }\r\n            }\r\n\r\n            return selections;\r\n        }\r\n\r\n        public static BackupOptions GetAutoBackupOptions(PlayniteSettings settings, string dataDir, string libraryDir)\r\n        {\r\n            var options = new BackupOptions\r\n            {\r\n                BackupItems = new List<BackupDataItem>\r\n                {\r\n                    BackupDataItem.Settings,\r\n                    BackupDataItem.Library\r\n                },\r\n                DataDir = dataDir,\r\n                LibraryDir = libraryDir,\r\n                ClosedWhenDone = false,\r\n                RotatingBackups = settings.RotatingBackups\r\n            };\r\n\r\n            if (settings.AutoBackupIncludeExtensions)\r\n            {\r\n                options.BackupItems.Add(BackupDataItem.Extensions);\r\n            }\r\n\r\n            if (settings.AutoBackupIncludeExtensionsData)\r\n            {\r\n                options.BackupItems.Add(BackupDataItem.ExtensionsData);\r\n            }\r\n\r\n            if (settings.AutoBackupIncludeThemes)\r\n            {\r\n                options.BackupItems.Add(BackupDataItem.Themes);\r\n            }\r\n\r\n            if (settings.AutoBackupIncludeLibFiles)\r\n            {\r\n                options.BackupItems.Add(BackupDataItem.LibraryFiles);\r\n            }\r\n\r\n            options.OutputDir = settings.AutoBackupDir;\r\n            return options;\r\n        }\r\n\r\n        private static string GetAutoBackupFileName()\r\n        {\r\n            return $\"{autoBackupFileName}-{DateTime.Now.ToString(backupDateFormat)}.zip\";\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Behaviors/AnimatedVisibility.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Media.Animation;\r\n\r\nnamespace Playnite.Behaviors\r\n{\r\n    public class AnimationControl\r\n    {\r\n        private static readonly DependencyProperty AnimationOnVisibleProperty = DependencyProperty.RegisterAttached(\r\n            \"AnimationOnVisible\",\r\n            typeof(Storyboard),\r\n            typeof(AnimatedVisibility),\r\n            new PropertyMetadata(new PropertyChangedCallback(HandleAnimationOnVisibleChanged)));\r\n\r\n        public static Storyboard GetAnimationOnVisible(DependencyObject obj)\r\n        {\r\n            return (Storyboard)obj.GetValue(AnimationOnVisibleProperty);\r\n        }\r\n\r\n        public static void SetAnimationOnVisible(DependencyObject obj, Storyboard value)\r\n        {\r\n            obj.SetValue(AnimationOnVisibleProperty, value);\r\n        }\r\n\r\n        private static void HandleAnimationOnVisibleChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(obj))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var control = (FrameworkElement)obj;\r\n            void handler(object s, DependencyPropertyChangedEventArgs e)\r\n            {\r\n                if (control.Visibility == Visibility.Visible)\r\n                {\r\n                    GetAnimationOnVisible(control)?.Begin();\r\n                }\r\n                else\r\n                {\r\n                    GetAnimationOnVisible(control)?.Stop();\r\n                }\r\n            }\r\n\r\n            control.IsVisibleChanged -= handler;\r\n            if (args.NewValue != null)\r\n            {\r\n                var sb = (Storyboard)args.NewValue;\r\n                control.IsVisibleChanged += handler;\r\n            }\r\n        }\r\n    }\r\n\r\n    public class AnimatedVisibility\r\n    {\r\n        #region Visibility\r\n\r\n        private static readonly DependencyProperty VisibilityProperty =\r\n            DependencyProperty.RegisterAttached(\r\n                \"Visibility\",\r\n                typeof(Visibility),\r\n                typeof(AnimatedVisibility),\r\n                new PropertyMetadata(new PropertyChangedCallback(HandleVisibilityChanged)));\r\n\r\n        public static Visibility GetVisibility(DependencyObject obj)\r\n        {\r\n            return (Visibility)obj.GetValue(VisibilityProperty);\r\n        }\r\n\r\n        public static void SetVisibility(DependencyObject obj, Visibility value)\r\n        {\r\n            obj.SetValue(VisibilityProperty, value);\r\n        }\r\n\r\n        private static void HandleVisibilityChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            var control = (FrameworkElement)obj;\r\n            if (DesignerProperties.GetIsInDesignMode(control))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var visibility = (Visibility)args.NewValue;\r\n            if (visibility == Visibility.Visible)\r\n            {\r\n                control.Visibility = visibility;\r\n                var anim = GetVisible(control);\r\n                anim?.Begin();\r\n            }\r\n            else if (visibility == Visibility.Collapsed)\r\n            {\r\n                var anim = GetCollapsed(control);\r\n                if (anim == null)\r\n                {\r\n                    control.Visibility = Visibility.Collapsed;\r\n                }\r\n                else\r\n                {\r\n                    anim.Begin();\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion Visibility\r\n\r\n        #region Visible\r\n\r\n        private static readonly DependencyProperty VisibleProperty =\r\n            DependencyProperty.RegisterAttached(\r\n            \"Visible\",\r\n            typeof(Storyboard),\r\n            typeof(AnimatedVisibility));\r\n\r\n        public static Storyboard GetVisible(DependencyObject obj)\r\n        {\r\n            return (Storyboard)obj.GetValue(VisibleProperty);\r\n        }\r\n\r\n        public static void SetVisible(DependencyObject obj, Storyboard value)\r\n        {\r\n            obj.SetValue(VisibleProperty, value);\r\n        }\r\n\r\n        #endregion Visible\r\n\r\n        #region Collapsed\r\n\r\n        private static readonly DependencyProperty CollapsedProperty =\r\n            DependencyProperty.RegisterAttached(\r\n            \"Collapsed\",\r\n            typeof(Storyboard),\r\n            typeof(AnimatedVisibility),\r\n            new PropertyMetadata(new PropertyChangedCallback(HandleCollapsedChanged)));\r\n\r\n        public static Storyboard GetCollapsed(DependencyObject obj)\r\n        {\r\n            return (Storyboard)obj.GetValue(CollapsedProperty);\r\n        }\r\n\r\n        public static void SetCollapsed(DependencyObject obj, Storyboard value)\r\n        {\r\n            obj.SetValue(CollapsedProperty, value);\r\n        }\r\n\r\n        private static void HandleCollapsedChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            var control = (FrameworkElement)obj;\r\n            if (DesignerProperties.GetIsInDesignMode(control))\r\n            {\r\n                return;\r\n            }\r\n\r\n            void handler(object s, EventArgs e)\r\n            {\r\n                control.Visibility = Visibility.Collapsed;\r\n            }\r\n\r\n            if (args.NewValue != args.OldValue)\r\n            {\r\n                if (args.OldValue != null)\r\n                {\r\n                    var sb = (Storyboard)args.OldValue;\r\n                    sb.Completed -= handler;\r\n                }\r\n\r\n                if (args.NewValue != null)\r\n                {\r\n                    var sb = (Storyboard)args.NewValue;\r\n                    sb.Completed += handler;\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion Collapsed\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Behaviors/ExpanderBehaviors.cs",
    "content": "﻿using Playnite;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.Behaviors\r\n{\r\n    public class ExpanderBehaviors\r\n    {\r\n        private static readonly DependencyProperty SaveStateProperty =\r\n            DependencyProperty.RegisterAttached(\"SaveState\", typeof(bool), typeof(ExpanderBehaviors));\r\n\r\n        public static bool GetSaveState(DependencyObject obj)\r\n        {\r\n            return (bool)obj.GetValue(SaveStateProperty);\r\n        }\r\n\r\n        public static void SetSaveState(DependencyObject obj, bool value)\r\n        {\r\n            obj.SetValue(SaveStateProperty, value);\r\n        }\r\n\r\n        private static readonly DependencyProperty SaveStateIdProperty =\r\n            DependencyProperty.RegisterAttached(\"SaveStateId\", typeof(string), typeof(ExpanderBehaviors));\r\n\r\n        public static string GetSaveStateId(DependencyObject obj)\r\n        {\r\n            return (string)obj.GetValue(SaveStateIdProperty);\r\n        }\r\n\r\n        public static void SetSaveStateId(DependencyObject obj, string value)\r\n        {\r\n            obj.SetValue(SaveStateIdProperty, value);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Behaviors/FocusBahaviors.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\n\r\nnamespace Playnite.Behaviors\r\n{\r\n    public class FocusBahaviors\r\n    {\r\n        public static readonly DependencyProperty FocusBindingProperty =\r\n            DependencyProperty.RegisterAttached(\r\n                \"FocusBinding\",\r\n                typeof(bool),\r\n                typeof(FocusBahaviors),\r\n                new PropertyMetadata(new PropertyChangedCallback(FocusBindingPropertyChanged)));\r\n\r\n        public static bool GetFocusBinding(DependencyObject obj)\r\n        {\r\n            return (bool)obj.GetValue(FocusBindingProperty);\r\n        }\r\n\r\n        public static void SetFocusBinding(DependencyObject obj, bool value)\r\n        {\r\n            obj.SetValue(FocusBindingProperty, value);\r\n        }\r\n\r\n        private static void FocusBindingPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(obj))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var control = (FrameworkElement)obj;\r\n            if ((bool)args.NewValue)\r\n            {\r\n                if (control.Focusable)\r\n                {\r\n                    control.Focus();                    \r\n                }\r\n                else\r\n                {\r\n                    if (!control.IsLoaded)\r\n                    {\r\n                        control.Loaded += Control_Loaded;\r\n                    }\r\n                    else\r\n                    {\r\n                        foreach (var child in ElementTreeHelper.FindVisualChildren<FrameworkElement>(control))\r\n                        {\r\n                            if (child.Focusable && child.IsVisible)\r\n                            {\r\n                                child.Focus();\r\n                                return;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private static void Control_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            var elem = (FrameworkElement)sender;\r\n            elem.Loaded -= Control_Loaded;\r\n            foreach (var child in ElementTreeHelper.FindVisualChildren<FrameworkElement>(elem))\r\n            {\r\n                if (child.Focusable)\r\n                {\r\n                    child.Focus();\r\n                    return;\r\n                }\r\n            }\r\n        }\r\n\r\n        private static readonly DependencyProperty OnVisibilityFocusProperty =\r\n            DependencyProperty.RegisterAttached(\r\n            \"OnVisibilityFocus\",\r\n            typeof(bool),\r\n            typeof(FocusBahaviors),\r\n            new PropertyMetadata(new PropertyChangedCallback(OnVisibilityFocusPropertyChanged)));\r\n\r\n        public static bool GetOnVisibilityFocus(DependencyObject obj)\r\n        {\r\n            return (bool)obj.GetValue(OnVisibilityFocusProperty);\r\n        }\r\n\r\n        public static void SetOnVisibilityFocus(DependencyObject obj, bool value)\r\n        {\r\n            obj.SetValue(OnVisibilityFocusProperty, value);\r\n        }\r\n\r\n        private static void OnVisibilityFocusPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(obj))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var control = (FrameworkElement)obj;\r\n            if ((bool)args.NewValue)\r\n            {\r\n                control.IsVisibleChanged += Control_IsVisibleChanged;                \r\n            }\r\n            else\r\n            {\r\n                control.IsVisibleChanged -= Control_IsVisibleChanged;\r\n            }\r\n        }\r\n\r\n        private static void Control_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var control = (FrameworkElement)sender;\r\n            if (control.IsVisible)\r\n            {\r\n                if (control.Focusable)\r\n                {\r\n                    control.Focus();\r\n                }\r\n                else\r\n                {\r\n                    foreach (FrameworkElement child in LogicalTreeHelper.GetChildren(control))\r\n                    {\r\n                        if (child.Focusable && child.IsVisible)\r\n                        {\r\n                            child.Focus();\r\n                            return;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Behaviors/LeftClickContextMenuBehavior.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.Behaviors\r\n{\r\n    public class LeftClickContextMenuBehavior\r\n    {\r\n        private static readonly DependencyProperty LeftClickContextMenuProperty =\r\n            DependencyProperty.RegisterAttached(\"Enabled\", typeof(bool), typeof(LeftClickContextMenuBehavior), new PropertyMetadata(new PropertyChangedCallback(HandlePropertyChanged)));\r\n\r\n        public static bool GetEnabled(DependencyObject obj)\r\n        {\r\n            return (bool)obj.GetValue(LeftClickContextMenuProperty);\r\n        }\r\n\r\n        public static void SetEnabled(DependencyObject obj, bool value)\r\n        {\r\n            obj.SetValue(LeftClickContextMenuProperty, value);\r\n        }\r\n\r\n        private static void HandlePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            var control = (FrameworkElement)obj;\r\n            if (DesignerProperties.GetIsInDesignMode(control))\r\n            {\r\n                return;\r\n            }\r\n\r\n            if ((bool)args.NewValue)\r\n            {\r\n                control.PreviewMouseLeftButtonUp += Control_PreviewMouseLeftButtonUp;\r\n            }\r\n            else\r\n            {\r\n                control.PreviewMouseLeftButtonUp -= Control_PreviewMouseLeftButtonUp;\r\n            }\r\n        }\r\n\r\n        private static void Control_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)\r\n        {\r\n            var control = (FrameworkElement)sender;\r\n            if (control.ContextMenu != null)\r\n            {\r\n                control.ContextMenu.PlacementTarget = control;\r\n                control.ContextMenu.IsOpen = true;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Behaviors/MediaElementBehaviors.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.Behaviors\r\n{\r\n    public class MediaElementBehaviors\r\n    {\r\n        private static readonly DependencyProperty RepeatProperty =\r\n            DependencyProperty.RegisterAttached(\r\n            \"Repeat\",\r\n            typeof(bool),\r\n            typeof(MediaElementBehaviors),\r\n            new PropertyMetadata(new PropertyChangedCallback(RepeatPropertyChanged)));\r\n\r\n        public static bool GetRepeat(DependencyObject obj)\r\n        {\r\n            return (bool)obj.GetValue(RepeatProperty);\r\n        }\r\n\r\n        public static void SetRepeat(DependencyObject obj, bool value)\r\n        {\r\n            obj.SetValue(RepeatProperty, value);\r\n        }\r\n\r\n        private static void RepeatPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(obj))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var media = (MediaElement)obj;\r\n            if ((bool)args.NewValue)\r\n            {\r\n                media.UnloadedBehavior = MediaState.Manual;\r\n                media.MediaEnded += Control_MediaEnded;\r\n            }\r\n            else\r\n            {\r\n                media.MediaEnded -= Control_MediaEnded;\r\n            }\r\n        }\r\n\r\n        private static void Control_MediaEnded(object sender, RoutedEventArgs e)\r\n        {\r\n            var media = (MediaElement)sender;\r\n            media.Position = TimeSpan.Zero;\r\n            media.Play();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Behaviors/ScrollToSelectedBehavior.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.Behaviors\r\n{\r\n    public class ScrollToSelectedBehavior\r\n    {\r\n        private static readonly DependencyProperty ScrollToSelectedProperty =\r\n            DependencyProperty.RegisterAttached(\"Enabled\", typeof(bool), typeof(ScrollToSelectedBehavior), new PropertyMetadata(new PropertyChangedCallback(HandlePropertyChanged)));\r\n\r\n        public static bool GetEnabled(DependencyObject obj)\r\n        {\r\n            return (bool)obj.GetValue(ScrollToSelectedProperty);\r\n        }\r\n\r\n        public static void SetEnabled(DependencyObject obj, bool value)\r\n        {\r\n            obj.SetValue(ScrollToSelectedProperty, value);\r\n        }\r\n\r\n        private static void HandlePropertyChanged(\r\n          DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            var control = (Selector)obj;\r\n            if (DesignerProperties.GetIsInDesignMode(control))\r\n            {\r\n                return;\r\n            }\r\n\r\n            if ((bool)args.NewValue)\r\n            {\r\n                control.SelectionChanged += Control_SelectionChanged;\r\n            }\r\n            else\r\n            {\r\n                control.SelectionChanged -= Control_SelectionChanged;\r\n            }\r\n        }\r\n\r\n        private static void Control_SelectionChanged(object sender, SelectionChangedEventArgs e)\r\n        {\r\n            if ((sender as Selector).SelectedItem == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (sender is ListView listView)\r\n            {\r\n                if (listView.SelectedItems?.Count == 1)\r\n                {                    \r\n                    listView.ScrollIntoView(listView.SelectedItem);\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (sender is ListBox listBox)\r\n            {\r\n                if (listBox.SelectedItems?.Count == 1)\r\n                {\r\n                    listBox.ScrollIntoView(listBox.SelectedItem);\r\n                    return;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Behaviors/ScrollViewerBehaviours.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Animation;\r\n\r\nnamespace Playnite.Behaviors\r\n{\r\n    public class ScrollAnimationData\r\n    {\r\n        private readonly ScrollViewer scroller;\r\n\r\n        public bool IsAnimating { get; private set; }\r\n        public FrameworkElement ScrollOwner { get; set; }\r\n        public double TargetOffset { get; set; }\r\n        public Storyboard Storyboard { get; private set; }\r\n        public DoubleAnimation Animation { get; private set; }\r\n\r\n        public ScrollAnimationData(ScrollViewer scroller, FrameworkElement owner)\r\n        {\r\n            this.scroller = scroller;\r\n            ScrollOwner = owner;\r\n            Animation = new DoubleAnimation();\r\n            Animation.Completed += Storyboard_Completed;\r\n        }\r\n\r\n        private void Storyboard_Completed(object sender, EventArgs e)\r\n        {\r\n            IsAnimating = false;\r\n            TargetOffset = scroller.VerticalOffset;\r\n        }\r\n\r\n        public void BeginAnimation(double to, TimeSpan speed)\r\n        {\r\n            TargetOffset = to;\r\n            Animation.From = scroller.VerticalOffset;\r\n            Animation.To = TargetOffset;\r\n            Animation.Duration = new Duration(speed);\r\n            scroller.BeginAnimation(ScrollViewerBehaviours.VerticalOffsetProperty, Animation);\r\n            IsAnimating = true;\r\n        }\r\n    }\r\n\r\n    public class ScrollViewerBehaviours\r\n    {\r\n        // ---------------- VerticalOffset\r\n        // This is \"internal\" property only, should NOT be used in any other place.\r\n        public static DependencyProperty ScrollDataProperty = DependencyProperty.RegisterAttached(\r\n            \"ScrollData\",\r\n            typeof(ScrollAnimationData),\r\n            typeof(ScrollViewerBehaviours),\r\n            new PropertyMetadata(null));\r\n\r\n        public static void SetScrollData(FrameworkElement target, ScrollAnimationData value)\r\n        {\r\n            target.SetValue(ScrollDataProperty, value);\r\n        }\r\n\r\n        public static ScrollAnimationData GetScrollData(FrameworkElement target)\r\n        {\r\n            return (ScrollAnimationData)target.GetValue(ScrollDataProperty);\r\n        }\r\n\r\n        // ---------------- VerticalOffset\r\n        // This is \"internal\" property only, should NOT be used in any other place.\r\n        // It's done this way so vertical offset can be driven by an animation.\r\n        public static DependencyProperty VerticalOffsetProperty = DependencyProperty.RegisterAttached(\r\n            \"VerticalOffset\",\r\n            typeof(double),\r\n            typeof(ScrollViewerBehaviours),\r\n            new PropertyMetadata(0.0, OnVerticalOffsetChanged));\r\n\r\n        public static void SetVerticalOffset(FrameworkElement target, double value)\r\n        {\r\n            target.SetValue(VerticalOffsetProperty, value);\r\n        }\r\n\r\n        public static double GetVerticalOffset(FrameworkElement target)\r\n        {\r\n            return (double)target.GetValue(VerticalOffsetProperty);\r\n        }\r\n\r\n        private static void OnVerticalOffsetChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            if (target is ScrollViewer scrollViewer)\r\n            {\r\n                scrollViewer.ScrollToVerticalOffset((double)e.NewValue);\r\n            }\r\n        }\r\n\r\n        // ---------------- ScrollAmount\r\n        public static readonly DependencyProperty SensitivityProperty = DependencyProperty.RegisterAttached(\r\n            \"Sensitivity\",\r\n            typeof(double),\r\n            typeof(ScrollViewerBehaviours),\r\n            new PropertyMetadata(0.0));\r\n\r\n        public static void SetSensitivity(DependencyObject obj, double value)\r\n        {\r\n            obj.SetValue(SensitivityProperty, value);\r\n        }\r\n\r\n        public static double GetSensitivity(DependencyObject obj)\r\n        {\r\n            return (double)obj.GetValue(SensitivityProperty);\r\n        }\r\n\r\n        // ---------------- TimeDuration\r\n        public static DependencyProperty SpeedProperty = DependencyProperty.RegisterAttached(\r\n            \"Speed\",\r\n            typeof(TimeSpan),\r\n            typeof(ScrollViewerBehaviours),\r\n            new PropertyMetadata(new TimeSpan(0, 0, 0, 0, 250)));\r\n\r\n        public static void SetSpeed(FrameworkElement target, TimeSpan value)\r\n        {\r\n            target.SetValue(SpeedProperty, value);\r\n        }\r\n\r\n        public static TimeSpan GetSpeed(FrameworkElement target)\r\n        {\r\n            return (TimeSpan)target.GetValue(SpeedProperty);\r\n        }\r\n\r\n        // ---------------- SmoothScrollEnabled\r\n        public static DependencyProperty SmoothScrollEnabledProperty = DependencyProperty.RegisterAttached(\r\n            \"SmoothScrollEnabled\",\r\n            typeof(bool),\r\n            typeof(ScrollViewerBehaviours),\r\n            new PropertyMetadata(false));\r\n\r\n        public static void SetSmoothScrollEnabled(FrameworkElement target, bool value)\r\n        {\r\n            target.SetValue(SmoothScrollEnabledProperty, value);\r\n        }\r\n\r\n        public static bool GetSmoothScrollEnabled(FrameworkElement target)\r\n        {\r\n            return (bool)target.GetValue(SmoothScrollEnabledProperty);\r\n        }\r\n\r\n        // ---------------- CustomScrollEnabled\r\n        public static DependencyProperty CustomScrollEnabledProperty = DependencyProperty.RegisterAttached(\r\n            \"CustomScrollEnabled\",\r\n            typeof(bool),\r\n            typeof(ScrollViewerBehaviours),\r\n            new PropertyMetadata(false, OnCustomScrollEnabledChanged));\r\n\r\n        public static void SetCustomScrollEnabled(FrameworkElement target, bool value)\r\n        {\r\n            target.SetValue(CustomScrollEnabledProperty, value);\r\n        }\r\n\r\n        public static bool GetCustomScrollEnabled(FrameworkElement target)\r\n        {\r\n            return (bool)target.GetValue(CustomScrollEnabledProperty);\r\n        }\r\n\r\n        private static void OnCustomScrollEnabledChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(obj))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var control = (FrameworkElement)obj;\r\n            if (obj is ScrollViewer scr)\r\n            {\r\n                SetScrollerEvents(control, scr, (bool)args.NewValue);\r\n            }\r\n            else\r\n            {\r\n                if (control.IsLoaded)\r\n                {\r\n                    var scroll = ElementTreeHelper.FindVisualChildren<ScrollViewer>(obj).FirstOrDefault();\r\n                    if (scroll != null)\r\n                    {\r\n                        SetScrollerEvents(control, scroll, (bool)args.NewValue);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    void controlLoaded(object a, RoutedEventArgs e)\r\n                    {\r\n                        var ctrl = (FrameworkElement)a;\r\n                        ctrl.Loaded -= controlLoaded;\r\n                        var scroll = ElementTreeHelper.FindVisualChildren<ScrollViewer>(ctrl).FirstOrDefault();\r\n                        if (scroll != null)\r\n                        {\r\n                            SetScrollerEvents(control, scroll, (bool)args.NewValue);\r\n                        }\r\n                    }\r\n\r\n                    control.Loaded += controlLoaded;\r\n                }\r\n            }\r\n        }\r\n\r\n        private static void SetScrollerEvents(FrameworkElement owner, ScrollViewer scroller, bool hook)\r\n        {\r\n            if (hook)\r\n            {\r\n                SetScrollData(scroller, new ScrollAnimationData(scroller, owner));\r\n                scroller.PreviewMouseWheel += PreviewMouseWheel;\r\n            }\r\n            else\r\n            {\r\n                SetScrollData(scroller, null);\r\n                scroller.PreviewMouseWheel -= PreviewMouseWheel;\r\n            }\r\n        }\r\n\r\n        private static void PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)\r\n        {\r\n            if (e.Handled)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var mouseDelta = (double)e.Delta;\r\n            var scrollData = GetScrollData(sender as FrameworkElement);\r\n            var sensitivity = GetSensitivity(scrollData.ScrollOwner);\r\n            var scroll = sender as ScrollViewer;\r\n            if (scroll.ComputedVerticalScrollBarVisibility != Visibility.Visible)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (GetSmoothScrollEnabled(scrollData.ScrollOwner))\r\n            {\r\n                var targetOffset = scrollData.TargetOffset;\r\n                if (!scrollData.IsAnimating)\r\n                {\r\n                    targetOffset = scroll.VerticalOffset;\r\n                }\r\n\r\n                var newOffset = targetOffset - (mouseDelta * sensitivity);\r\n                if (newOffset < 0)\r\n                {\r\n                    newOffset = 0;\r\n                }\r\n                if (newOffset > scroll.ScrollableHeight)\r\n                {\r\n                    newOffset = scroll.ScrollableHeight;\r\n                }\r\n\r\n                scrollData.BeginAnimation(newOffset, GetSpeed(scrollData.ScrollOwner));\r\n            }\r\n            else\r\n            {\r\n                scroll.ScrollToVerticalOffset(scroll.VerticalOffset - e.Delta * sensitivity);\r\n            }\r\n\r\n            e.Handled = true;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Behaviors/SelectorBehaviors.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.Behaviors\r\n{\r\n    public class SelectorBehaviors\r\n    {\r\n        public class EnumSelector\r\n        {\r\n            public Enum Value { get; set; }\r\n            public string DisplayText { get; set; }\r\n        }\r\n\r\n        private static readonly DependencyProperty EnumSourceProperty =\r\n            DependencyProperty.RegisterAttached(\r\n            \"EnumSource\",\r\n            typeof(Type),\r\n            typeof(SelectorBehaviors),\r\n            new PropertyMetadata(new PropertyChangedCallback(EnumSourcePropertyChanged)));\r\n\r\n        public static Type GetEnumSource(DependencyObject obj)\r\n        {\r\n            return (Type)obj.GetValue(EnumSourceProperty);\r\n        }\r\n\r\n        public static void SetEnumSource(DependencyObject obj, Type value)\r\n        {\r\n            obj.SetValue(EnumSourceProperty, value);\r\n        }\r\n\r\n        private static void EnumSourcePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(obj))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var select = (System.Windows.Controls.Primitives.Selector)obj;\r\n            if (args.NewValue == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            select.DisplayMemberPath = nameof(EnumSelector.DisplayText);\r\n            select.SelectedValuePath = nameof(EnumSelector.Value);\r\n            select.Items.Clear();\r\n            var vals = Enum.GetValues((Type)args.NewValue);\r\n            foreach (Enum val in vals)\r\n            {\r\n                select.Items.Add(new EnumSelector { Value = val, DisplayText = val.GetDescription() });\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/BindingProxy.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite\r\n{\r\n    public class BindingProxy : Freezable\r\n    {\r\n        protected override Freezable CreateInstanceCore()\r\n        {\r\n            return new BindingProxy();\r\n        }\r\n\r\n        public object Data\r\n        {\r\n            get { return (object)GetValue(DataProperty); }\r\n            set { SetValue(DataProperty, value); }\r\n        }\r\n\r\n        public static readonly DependencyProperty DataProperty =\r\n            DependencyProperty.Register(\"Data\", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/CefTools.cs",
    "content": "﻿using CefSharp;\r\nusing CefSharp.Wpf;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class CefTools\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        public static bool IsInitialized { get; private set; }\r\n\r\n        public static void ConfigureCef(bool traceLogsEnabled)\r\n        {\r\n            FileSystem.CreateDirectory(PlaynitePaths.BrowserCachePath);\r\n            var settings = new CefSettings();\r\n            settings.WindowlessRenderingEnabled = true;\r\n\r\n            if (settings.CefCommandLineArgs.ContainsKey(\"disable-gpu\"))\r\n            {\r\n                settings.CefCommandLineArgs.Remove(\"disable-gpu\");\r\n            }\r\n\r\n            if (settings.CefCommandLineArgs.ContainsKey(\"disable-gpu-compositing\"))\r\n            {\r\n                settings.CefCommandLineArgs.Remove(\"disable-gpu-compositing\");\r\n            }\r\n\r\n            settings.CefCommandLineArgs.Add(\"disable-gpu\", \"1\");\r\n            settings.CefCommandLineArgs.Add(\"disable-gpu-compositing\", \"1\");\r\n\r\n            // This is needed since Chromium 138 and up automatically de-elevates elevated instances.\r\n            // This however breaks webviews in case Playnite is started as admin.\r\n            // This in unsafe, but we already warn users to not run Playnite as admin with explicit dialog on startup...\r\n            settings.CefCommandLineArgs.Add(\"do-not-de-elevate\");\r\n\r\n            settings.CachePath = PlaynitePaths.BrowserCachePath;\r\n            settings.PersistSessionCookies = true;\r\n            settings.LogFile = Path.Combine(PlaynitePaths.ConfigRootPath, \"cef.log\");\r\n            settings.LogSeverity =  traceLogsEnabled ? LogSeverity.Verbose : LogSeverity.Info;\r\n            IsInitialized = Cef.Initialize(settings);\r\n            if (!IsInitialized)            \r\n                logger.Error($\"CEF failed to initialize: {Cef.GetExitCode()}\");            \r\n        }\r\n\r\n        public static void Shutdown()\r\n        {\r\n            Cef.Shutdown();\r\n            IsInitialized = false;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/CmdlineCommands.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public enum CmdlineCommand : int\r\n    {\r\n        Start = 0,\r\n        Focus = 1,\r\n        UriRequest = 2,\r\n        ExtensionInstall = 3,\r\n        SwitchMode = 4,\r\n        Shutdown = 5,\r\n        BackupData = 6,\r\n        RestoreBackup = 7\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Commands/GenericCommands.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.Commands\r\n{\r\n    public static class GenericCommands\r\n    {\r\n        public static RoutedUICommand ZoomInCmd\r\n            = new RoutedUICommand(\"Zoom in view command\", \"ZoomInCmd\", typeof(GenericCommands));\r\n        public static RoutedUICommand ZoomOutCmd\r\n            = new RoutedUICommand(\"zoom out view command\", \"ZoomOutCmd\", typeof(GenericCommands));\r\n        public static RoutedUICommand PlayGameCmd\r\n            = new RoutedUICommand(\"play game command\", \"PlayGameCmd\", typeof(GenericCommands));\r\n        public static RoutedUICommand ShowDetailsCmd\r\n            = new RoutedUICommand(\"show game details command\", \"ShowDetailsCmd\", typeof(GenericCommands));\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Commands/GlobalCommands.cs",
    "content": "﻿using Flurl;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Commands\r\n{\r\n    public static class GlobalCommands\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        internal static PlayniteSettings AppSettings { get; set; }\r\n\r\n        public static RelayCommand<object> NavigateUrlCommand { get; } = new RelayCommand<object>((url) =>\r\n        {\r\n            try\r\n            {\r\n                NavigateUrl(url);\r\n            }\r\n            catch (Exception e) when (!Debugger.IsAttached)\r\n            {\r\n                logger.Error(e, \"Failed to open url.\");\r\n            }\r\n        });\r\n\r\n        public static RelayCommand<string> NavigateDirectoryCommand { get; } = new RelayCommand<string>((path) =>\r\n        {\r\n            try\r\n            {\r\n                if (AppSettings?.DirectoryOpenCommand?.IsNullOrWhiteSpace() == false)\r\n                {\r\n                    try\r\n                    {\r\n                        ProcessStarter.ShellExecute(AppSettings.DirectoryOpenCommand.Replace(\"{Dir}\", path));\r\n                    }\r\n                    catch (Exception e)\r\n                    {\r\n                        logger.Error(e, \"Failed to open directory using custom command.\");\r\n                        Process.Start(path)?.Dispose();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    Explorer.OpenDirectory(path);\r\n                }\r\n            }\r\n            catch (Exception e) when (!Debugger.IsAttached)\r\n            {\r\n                logger.Error(e, \"Failed to open directory.\");\r\n            }\r\n        });\r\n\r\n        public static void NavigateUrl(object url)\r\n        {\r\n            if (url is string stringUrl)\r\n            {\r\n                NavigateUrl(stringUrl);\r\n            }\r\n            else if (url is Link linkUrl)\r\n            {\r\n                NavigateUrl(linkUrl.Url);\r\n            }\r\n            else if (url is Uri uriUrl)\r\n            {\r\n                NavigateUrl(uriUrl.OriginalString);\r\n            }\r\n            else\r\n            {\r\n                throw new Exception(\"Unsupported URL format.\");\r\n            }\r\n        }\r\n\r\n        public static void NavigateUrl(string url)\r\n        {\r\n            if (url.IsNullOrEmpty())\r\n            {\r\n                throw new Exception(\"No URL was given.\");\r\n            }\r\n\r\n            if (url.StartsWith(\"{DocsRootUrl}\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                url = Url.Combine(PlayniteEnvironment.DocsRootUrl, url.Replace(\"{DocsRootUrl}\", \"\"));\r\n            }\r\n\r\n            url = url.Replace(\"{AppBranch}\", PlayniteEnvironment.AppBranch);\r\n            if (!Regex.IsMatch(url, @\"^.*:\\/\\/\"))\r\n            {\r\n                if (Paths.IsFullPath(url))\r\n                {\r\n                    // Do nothing, some people put local file paths to link fields: #2562\r\n                }\r\n                else\r\n                {\r\n                    url = \"http://\" + url;\r\n                }\r\n            }\r\n\r\n            ProcessStarter.StartUrl(url);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/BindingTools.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class BindingTools\r\n    {\r\n        public static BindingExpressionBase SetBinding(DependencyObject target, DependencyProperty dp, BindingBase binding)\r\n        {\r\n            return BindingOperations.SetBinding(target, dp, binding);\r\n        }\r\n\r\n        public static BindingExpressionBase SetBinding(\r\n            DependencyObject target,\r\n            DependencyProperty dp,\r\n            object source,\r\n            object path,\r\n            BindingMode mode = BindingMode.OneWay,\r\n            UpdateSourceTrigger trigger = UpdateSourceTrigger.Default,\r\n            IValueConverter converter = null,\r\n            object converterParameter = null,\r\n            string stringFormat = null,\r\n            object fallBackValue = null,\r\n            int delay = 0,\r\n            bool isAsync = false,\r\n            object targetNullValue = null)\r\n        {\r\n            var binding = new Binding\r\n            {\r\n                Mode = mode,\r\n                UpdateSourceTrigger = trigger\r\n            };\r\n\r\n            if (path is string stringPath)\r\n            {\r\n                binding.Path = new PropertyPath(stringPath);\r\n            }\r\n            else if (path is PropertyPath propPath)\r\n            {\r\n                binding.Path = propPath;\r\n            }\r\n            else\r\n            {\r\n                binding.Path = new PropertyPath(path);\r\n            }\r\n\r\n            if (converter != null)\r\n            {\r\n                binding.Converter = converter;\r\n            }\r\n\r\n            if (converterParameter != null)\r\n            {\r\n                binding.ConverterParameter = converterParameter;\r\n            }\r\n\r\n            if (source != null)\r\n            {\r\n                binding.Source = source;\r\n            }\r\n\r\n            if (fallBackValue != null)\r\n            {\r\n                binding.FallbackValue = fallBackValue;\r\n            }\r\n\r\n            if (targetNullValue != null)\r\n            {\r\n                binding.TargetNullValue = targetNullValue;\r\n            }\r\n\r\n            if (delay > 0)\r\n            {\r\n                binding.Delay = delay;\r\n            }\r\n\r\n            if (!stringFormat.IsNullOrEmpty())\r\n            {\r\n                binding.StringFormat = stringFormat;\r\n            }\r\n\r\n            if (isAsync)\r\n            {\r\n                binding.IsAsync = true;\r\n            }\r\n\r\n            return BindingOperations.SetBinding(target, dp, binding);\r\n        }\r\n\r\n        public static BindingExpressionBase SetBinding(\r\n           DependencyObject target,\r\n           DependencyProperty dp,\r\n           string path,\r\n           BindingMode mode = BindingMode.OneWay,\r\n           UpdateSourceTrigger trigger = UpdateSourceTrigger.Default,\r\n           IValueConverter converter = null,\r\n           object converterParameter = null,\r\n           string stringFormat = null,\r\n           object fallBackValue = null,\r\n           int delay = 0,\r\n           bool isAsync = false)\r\n        {\r\n            return SetBinding(\r\n                target,\r\n                dp,\r\n                null,\r\n                path,\r\n                mode,\r\n                trigger,\r\n                converter,\r\n                converterParameter,\r\n                stringFormat,\r\n                fallBackValue,\r\n                delay,\r\n                isAsync);\r\n        }\r\n\r\n        public static void ClearBinding(DependencyObject target, DependencyProperty dp)\r\n        {\r\n            BindingOperations.ClearBinding(target, dp);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Computer.cs",
    "content": "﻿using Microsoft.Win32;\r\nusing Playnite.SDK;\r\nusing Playnite.Native;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Management;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Forms;\r\nusing System.Diagnostics;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class SystemInfo\r\n    {\r\n        public bool Is64Bit { get; set; }\r\n\r\n        public string WindowsVersion { get; set; }\r\n\r\n        public string ActualWindowsVersion { get; set; }\r\n\r\n        public string WindowsEdition { get; set; }\r\n\r\n        public int WindowsBuildVersion { get; set; }\r\n\r\n        public string Cpu { get; set; }\r\n\r\n        public int Ram { get; set; }\r\n\r\n        public List<string> Gpus { get; set; }\r\n\r\n        public List<ComputerScreen> Screens { get; set; }\r\n    }\r\n\r\n    public class ComputerScreen\r\n    {\r\n        public System.Drawing.Rectangle WorkingArea { get; private set; }\r\n        public bool Primary { get; private set; }\r\n        public string DeviceName { get; private set; }\r\n        public System.Drawing.Rectangle Bounds { get; private set; }\r\n        public int BitsPerPixel { get; private set; }\r\n\r\n        public ComputerScreen()\r\n        {\r\n        }\r\n\r\n        public ComputerScreen(Screen screen)\r\n        {\r\n            WorkingArea = screen.WorkingArea;\r\n            Primary = screen.Primary;\r\n            DeviceName = screen.DeviceFriendlyName();\r\n            Bounds = screen.Bounds;\r\n            BitsPerPixel = screen.BitsPerPixel;\r\n        }\r\n    }\r\n\r\n    public enum WindowsVersion\r\n    {\r\n        Unknown,\r\n        Win7,\r\n        Win8,\r\n        Win10,\r\n        Win11\r\n    }\r\n\r\n    public enum HwCompany\r\n    {\r\n        Intel,\r\n        AMD,\r\n        Nvidia,\r\n        VMware,\r\n        Uknown\r\n    }\r\n\r\n    public static class Computer\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        public static readonly (string path, string args) ShutdownCmd = (\"shutdown.exe\", \"-s -hybrid -t 0\");\r\n        public static readonly (string path, string args) RestartCmd = (\"shutdown.exe\", \"-r -t 0\");\r\n\r\n        public static WindowsVersion WindowsVersion\r\n        {\r\n            get\r\n            {\r\n                var version = Environment.OSVersion.Version;\r\n                if (version.Major == 6 && version.Minor == 1)\r\n                {\r\n                    return WindowsVersion.Win7;\r\n                }\r\n                else if (version.Major == 6 && (version.Minor == 2 || version.Minor == 3))\r\n                {\r\n                    return WindowsVersion.Win8;\r\n                }\r\n                else if (version.Major == 10)\r\n                {\r\n                    // Apparently some people are spoofing Windows 10 build versions but whatherer they are using\r\n                    // is not updating instaled product name, so we need to check that as well.\r\n                    var windowsProd = Computer.GetWindowsProductName();\r\n                    if (windowsProd?.Contains(\"Windows 7\") == true)\r\n                        return WindowsVersion.Win7;\r\n\r\n                    if (windowsProd?.Contains(\"Windows 8\") == true)\r\n                        return WindowsVersion.Win8;\r\n\r\n                    return version.Build >= 22000 ? WindowsVersion.Win11 : WindowsVersion.Win10;\r\n                }\r\n                else\r\n                {\r\n                    return WindowsVersion.Unknown;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static bool IsTLS13SystemWideEnabled()\r\n        {\r\n            try\r\n            {\r\n                using (var key = Registry.LocalMachine.OpenSubKey(@\"SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\SCHANNEL\\Protocols\\TLS 1.3\\Client\"))\r\n                {\r\n                    if (key != null)\r\n                    {\r\n                        var isEnabled = key.GetValue(\"Enabled\");\r\n                        if (isEnabled != null)\r\n                        {\r\n                            return Convert.ToBoolean(isEnabled);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to test TLS 1.3 state.\");\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static int GetWindowsReleaseId()\r\n        {\r\n            var relVal = Registry.GetValue(@\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\", \"ReleaseId\", \"\");\r\n            if (relVal?.ToString().IsNullOrEmpty() == true)\r\n            {\r\n                return 0;\r\n            }\r\n            else\r\n            {\r\n                return Convert.ToInt32(relVal);\r\n            }\r\n        }\r\n\r\n        public static string GetWindowsProductName()\r\n        {\r\n            return Registry.GetValue(@\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\", \"ProductName\", \"\")?.ToString();\r\n        }\r\n\r\n        public static Guid GetMachineGuid()\r\n        {\r\n            RegistryKey root = null;\r\n            if (Environment.Is64BitOperatingSystem)\r\n            {\r\n                root = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);\r\n            }\r\n            else\r\n            {\r\n                root = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);\r\n            }\r\n\r\n            try\r\n            {\r\n                using (var cryptography = root.OpenSubKey(\"SOFTWARE\\\\Microsoft\\\\Cryptography\"))\r\n                {\r\n                    return Guid.Parse((string)cryptography.GetValue(\"MachineGuid\"));\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                root.Dispose();\r\n            }\r\n        }\r\n\r\n        public static SystemInfo GetSystemInfo()\r\n        {\r\n            var info = new SystemInfo\r\n            {\r\n                Is64Bit = Environment.Is64BitOperatingSystem,\r\n                WindowsVersion = Environment.OSVersion.VersionString,\r\n                ActualWindowsVersion = Computer.WindowsVersion.ToString(),\r\n                WindowsBuildVersion = GetWindowsReleaseId(),\r\n                WindowsEdition = GetWindowsProductName()\r\n            };\r\n\r\n            using (var win32Proc = new ManagementObjectSearcher(\"SELECT * FROM Win32_Processor\"))\r\n            {\r\n                foreach (var obj in win32Proc.Get())\r\n                {\r\n                    info.Cpu = obj[\"Name\"].ToString().Trim();\r\n                    break;\r\n                }\r\n            }\r\n\r\n            using (var memory = new ManagementObjectSearcher(\"SELECT * FROM Win32_ComputerSystem\"))\r\n            {\r\n                double totalCapacity = 0;\r\n                foreach (var obj in memory.Get())\r\n                {\r\n                    totalCapacity += Convert.ToDouble(obj[\"TotalPhysicalMemory\"]);\r\n                }\r\n\r\n                info.Ram = Convert.ToInt32(totalCapacity / 1048576);\r\n            }\r\n\r\n            using (var video = new ManagementObjectSearcher(\"SELECT * FROM Win32_VideoController\"))\r\n            {\r\n                info.Gpus = new List<string>();\r\n                foreach (var obj in video.Get())\r\n                {\r\n                    info.Gpus.Add(obj[\"Name\"].ToString());\r\n                }\r\n            }\r\n\r\n            info.Screens = GetScreens();\r\n            return info;\r\n        }\r\n\r\n        public static List<ComputerScreen> GetScreens()\r\n        {\r\n            return Screen.AllScreens.Select(a => a.ToComputerScreen()).ToList();\r\n        }\r\n\r\n        public static ComputerScreen GetPrimaryScreen()\r\n        {\r\n            return Screen.PrimaryScreen?.ToComputerScreen();\r\n        }\r\n\r\n        public static int GetGetPrimaryScreenIndex()\r\n        {\r\n            var allScreens = Screen.AllScreens;\r\n            for (int i = 0; i < allScreens.Length; i++)\r\n            {\r\n                if (allScreens[i].Primary)\r\n                {\r\n                    return i;\r\n                }\r\n            }\r\n\r\n            return 0;\r\n        }\r\n\r\n        public static void SetMouseCursorVisibility(bool show)\r\n        {\r\n            if (show)\r\n            {\r\n                while (User32.ShowCursor(true) < 0)\r\n                {\r\n                }\r\n            }\r\n            else\r\n            {\r\n                while (User32.ShowCursor(false) >= 0)\r\n                {\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void Shutdown()\r\n        {\r\n            // Used instead of shutdown.exe because it doesn't replicate the same shutdown behavior\r\n            // as user initiated \"from start menu\" shutdown: https://github.com/JosefNemec/Playnite/issues/3947\r\n            // EnablePrivilege needed https://stackoverflow.com/a/24726453/1107424\r\n            if (!User32.EnablePrivilege(\"SeShutdownPrivilege\", true) ||\r\n                !User32.ExitWindowsEx(\r\n                    User32.ExitWindowsFlags.EWX_SHUTDOWN |\r\n                    User32.ExitWindowsFlags.EWX_HYBRID_SHUTDOWN |\r\n                    User32.ExitWindowsFlags.EWX_ARSO,\r\n                    0))\r\n            {\r\n                logger.Error(\"ExitWindowsEx shutdown failed, using fallback via shutdown.exe\");\r\n                logger.Error(Marshal.GetLastWin32Error().ToString());\r\n                ProcessStarter.StartProcess(ShutdownCmd.path, ShutdownCmd.args);\r\n            }\r\n        }\r\n\r\n        public static void Restart()\r\n        {\r\n            ProcessStarter.StartProcess(RestartCmd.path, RestartCmd.args);\r\n        }\r\n\r\n        public static bool Sleep()\r\n        {\r\n            return Powrprof.SetSuspendState(false, true, false);\r\n        }\r\n\r\n        public static bool Hibernate()\r\n        {\r\n            return Powrprof.SetSuspendState(true, true, false);\r\n        }\r\n\r\n        public static bool Lock()\r\n        {\r\n            return User32.LockWorkStation();\r\n        }\r\n\r\n        public static bool Logout()\r\n        {\r\n            return User32.ExitWindowsEx(User32.ExitWindowsFlags.EWX_LOGOFF, 0);\r\n        }\r\n\r\n        public static ComputerScreen ToComputerScreen(this Screen screen)\r\n        {\r\n            if (screen == null)\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                return new ComputerScreen(screen);\r\n            }\r\n        }\r\n\r\n        public static List<HwCompany> GetGpuVendors()\r\n        {\r\n            var gpus = new List<string>();\r\n            var vendors = new List<HwCompany>();\r\n            try\r\n            {\r\n                using (var video = new ManagementObjectSearcher(\"SELECT * FROM Win32_VideoController\"))\r\n                {\r\n                    foreach (var obj in video.Get())\r\n                    {\r\n                        gpus.Add(obj[\"Name\"].ToString());\r\n                    }\r\n                }\r\n\r\n                foreach (var gpu in gpus)\r\n                {\r\n                    if (gpu.Contains(\"intel\", StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        vendors.AddMissing(HwCompany.Intel);\r\n                    }\r\n                    else if (gpu.Contains(\"nvidia\", StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        vendors.AddMissing(HwCompany.Nvidia);\r\n                    }\r\n                    else if (gpu.Contains(\"amd\", StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        vendors.AddMissing(HwCompany.AMD);\r\n                    }\r\n                    else if (gpu.Contains(\"vmware\", StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        vendors.AddMissing(HwCompany.VMware);\r\n                    }\r\n                    else\r\n                    {\r\n                        return new List<HwCompany> { HwCompany.Uknown };\r\n                    }\r\n                }\r\n\r\n                if (vendors.Count > 0)\r\n                {\r\n                    return vendors;\r\n                }\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to get GPU vendor.\");\r\n            }\r\n\r\n            return new List<HwCompany> { HwCompany.Uknown };\r\n        }\r\n\r\n        private static string GetMonitorFriendlyName(LUID adapterId, uint targetId)\r\n        {\r\n            var deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME\r\n            {\r\n                header =\r\n                {\r\n                    size = (uint)Marshal.SizeOf(typeof (DISPLAYCONFIG_TARGET_DEVICE_NAME)),\r\n                    adapterId = adapterId,\r\n                    id = targetId,\r\n                    type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME\r\n                }\r\n            };\r\n            var error = User32.DisplayConfigGetDeviceInfo(ref deviceName);\r\n            if (error != WinError.ERROR_SUCCESS)\r\n            {\r\n                throw new Win32Exception(error);\r\n            }\r\n\r\n            return deviceName.monitorFriendlyDeviceName;\r\n        }\r\n\r\n        private static IEnumerable<string> GetAllMonitorsFriendlyNames()\r\n        {\r\n            var error = User32.GetDisplayConfigBufferSizes(\r\n                QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,\r\n                out uint pathCount,\r\n                out uint modeCount);\r\n            if (error != WinError.ERROR_SUCCESS)\r\n            {\r\n                throw new Win32Exception(error);\r\n            }\r\n\r\n            var displayPaths = new DISPLAYCONFIG_PATH_INFO[pathCount];\r\n            var displayModes = new DISPLAYCONFIG_MODE_INFO[modeCount];\r\n            error = User32.QueryDisplayConfig(\r\n                QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,\r\n                ref pathCount,\r\n                displayPaths,\r\n                ref modeCount,\r\n                displayModes,\r\n                IntPtr.Zero);\r\n            if (error != WinError.ERROR_SUCCESS)\r\n            {\r\n                throw new Win32Exception(error);\r\n            }\r\n\r\n            for (var i = 0; i < modeCount; i++)\r\n            {\r\n                if (displayModes[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET)\r\n                {\r\n                    yield return GetMonitorFriendlyName(displayModes[i].adapterId, displayModes[i].id);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static string DeviceFriendlyName(this Screen screen)\r\n        {\r\n            try\r\n            {\r\n                var allFriendlyNames = GetAllMonitorsFriendlyNames();\r\n                for (var index = 0; index < Screen.AllScreens.Length; index++)\r\n                {\r\n                    if (Equals(screen, Screen.AllScreens[index]))\r\n                    {\r\n                        return allFriendlyNames.ToArray()[index];\r\n                    }\r\n                }\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to get display name.\");\r\n            }\r\n\r\n            return screen.DeviceName;\r\n        }\r\n\r\n        public static bool GetScreenReaderActive()\r\n        {\r\n            // In theory this method should be using SystemParametersInfo API with SPI_GETSCREENREADER\r\n            // but according to my testing that returns screen reader presence even if no screen reader is running.\r\n            // No idea why, so for now we will just check for Narrator, NVDA and JAWS readers.\r\n\r\n            if (Process.GetProcessesByName(\"narrator\").HasItems())\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if (Process.GetProcessesByName(\"nvda\").HasItems())\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if (Process.GetProcessesByName(\"jfw\").HasItems())\r\n            {\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Constants.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public static class Constants\r\n    {\r\n        public const string DefaultDateTimeFormat = \"d\";\r\n        public const string DefaultPartialReleaseDateTimeFormat = \"y\";\r\n\r\n        public static string DateUiFormat\r\n        {\r\n            get;\r\n        } = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;\r\n\r\n        public static string TimeUiFormat\r\n        {\r\n            get;\r\n        } = CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern;\r\n\r\n        public static char[] ListSeparators\r\n        {\r\n            get;\r\n        } = new char[] { ListSeparator };\r\n\r\n        public const char ListSeparator = ',';\r\n\r\n        public static readonly Guid MaxGuidVal = new Guid(\"FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF\");\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/CueSheet.cs",
    "content": "﻿using Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class CueSheet\r\n    {\r\n        public struct CueFileEntry\r\n        {\r\n            public string Path { get; }\r\n            public string Type { get; }\r\n\r\n            public CueFileEntry(string path, string type)\r\n            {\r\n                Path = path;\r\n                Type = type;\r\n            }\r\n        }\r\n\r\n        public static List<CueFileEntry> GetFileEntries(string cuePath)\r\n        {\r\n            var files = new List<CueFileEntry>();\r\n            foreach (var line in File.ReadAllLines(Paths.FixPathLength(cuePath)))\r\n            {\r\n                if (!line.IsNullOrWhiteSpace())\r\n                {\r\n                    var match = Regex.Match(line, @\"FILE\\s+\"\"(.+)\"\"\\s+(.+)$\");\r\n                    if (match.Success)\r\n                    {\r\n                        files.Add(new CueFileEntry(match.Groups[1].Value, match.Groups[2].Value));\r\n                    }\r\n                }\r\n            }\r\n\r\n            return files;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/DesignerTools.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System.Windows\r\n{\r\n    public class DesignerTools\r\n    {\r\n        private static bool? inDesignMode = null;\r\n\r\n        public static bool IsInDesignMode\r\n        {\r\n            get\r\n            {\r\n                if (inDesignMode == null)\r\n                {\r\n                    inDesignMode = DesignerProperties.GetIsInDesignMode(new System.Windows.DependencyObject());\r\n                }\r\n\r\n                return inDesignMode.Value;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Exceptions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class NoDiskSpaceException : Exception\r\n    {\r\n        public long RequiredSpace { get; }\r\n\r\n        public NoDiskSpaceException(long requiredSpace) : base()\r\n        {\r\n            RequiredSpace = requiredSpace;\r\n        }\r\n\r\n        public NoDiskSpaceException(string message) : base(message)\r\n        {\r\n        }\r\n\r\n        public NoDiskSpaceException(string message, long requiredSpace) : base(message)\r\n        {\r\n            RequiredSpace = requiredSpace;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Explorer.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class Explorer\r\n    {\r\n        [DllImport(\"shell32.dll\", SetLastError = true)]\r\n        private static extern int SHOpenFolderAndSelectItems(IntPtr pidlFolder, uint cidl, [In, MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, uint dwFlags);\r\n\r\n        [DllImport(\"shell32.dll\", SetLastError = true)]\r\n        private static extern void SHParseDisplayName([MarshalAs(UnmanagedType.LPWStr)] string name, IntPtr bindingContext, [Out] out IntPtr pidl, uint sfgaoIn, [Out] out uint psfgaoOut);\r\n\r\n        public static void NavigateToFileSystemEntry(string path)\r\n        {\r\n            var parentFolder = Path.GetDirectoryName(path);\r\n            if (string.IsNullOrEmpty(parentFolder))\r\n                return;\r\n\r\n            SHParseDisplayName(parentFolder, IntPtr.Zero, out var nativeFolder, 0, out _);\r\n            if (nativeFolder == IntPtr.Zero)\r\n                return;\r\n\r\n            var itemToSelect = Path.GetFileName(path);\r\n            SHParseDisplayName(Path.Combine(parentFolder, itemToSelect), IntPtr.Zero, out var nativeFile, 0, out _);\r\n\r\n            var fileArray = new[] { nativeFile == IntPtr.Zero ? nativeFolder : nativeFile };\r\n            SHOpenFolderAndSelectItems(nativeFolder, (uint)fileArray.Length, fileArray, 0);\r\n\r\n            Marshal.FreeCoTaskMem(nativeFolder);\r\n            if (nativeFile != IntPtr.Zero) Marshal.FreeCoTaskMem(nativeFile);\r\n        }\r\n\r\n        public static void OpenDirectory(string path)\r\n        {\r\n            // Adding trailing backslash ensures the path is treated as a directory\r\n            // and using UseShellExecute avoids the process hanging issue\r\n            if (!path.EndsWith(\"\\\\\"))\r\n                path += \"\\\\\";\r\n            Process.Start(new ProcessStartInfo(path) { UseShellExecute = true });\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/BitmapExtensions.cs",
    "content": "﻿using PhotoSauce.MagicScaler;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing.Imaging;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Interop;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing ImageMagick;\r\nusing TGASharpLib;\r\n\r\nnamespace System.Drawing.Imaging\r\n{\r\n    public class BitmapLoadProperties: IEquatable<BitmapLoadProperties>\r\n    {\r\n        public ImageLoadScaling Scaling { get; set; } = ImageLoadScaling.BitmapDotNet;\r\n        public DpiScale? DpiScale { get; set; }\r\n        public int MaxDecodePixelWidth { get; set; } = 0;\r\n        public int MaxDecodePixelHeight { get; set; } = 0;\r\n        public int DpiAwareMaxDecodePixelWidth =>\r\n            DpiScale == null ? MaxDecodePixelWidth : (int)Math.Round(MaxDecodePixelWidth * DpiScale.Value.DpiScaleX);\r\n        public int DpiAwareMaxDecodePixelHeight =>\r\n            DpiScale == null ? MaxDecodePixelHeight : (int)Math.Round(MaxDecodePixelHeight * DpiScale.Value.DpiScaleY);\r\n        public string Source { get; set; }\r\n\r\n        public BitmapLoadProperties(int decodePixelWidth, int decodePixelHeight)\r\n        {\r\n            MaxDecodePixelWidth = decodePixelWidth;\r\n            MaxDecodePixelHeight = decodePixelHeight;\r\n        }\r\n\r\n        public BitmapLoadProperties(int decodePixelWidth, int decodePixelHeight, DpiScale? dpiScale) : this(decodePixelWidth, decodePixelHeight)\r\n        {\r\n            DpiScale = dpiScale;\r\n        }\r\n\r\n        public BitmapLoadProperties(int decodePixelWidth, int decodePixelHeight, DpiScale? dpiScale, ImageLoadScaling scaling) : this(decodePixelWidth, decodePixelHeight, dpiScale)\r\n        {\r\n            Scaling = scaling;\r\n        }\r\n\r\n        public bool Equals(BitmapLoadProperties other)\r\n        {\r\n            if (other is null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (DpiScale?.Equals(other.DpiScale) == false)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (MaxDecodePixelWidth != other.MaxDecodePixelWidth)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (MaxDecodePixelHeight != other.MaxDecodePixelHeight)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Source, other.Source, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (Scaling != other.Scaling)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        public override bool Equals(object obj) => Equals(obj as BitmapLoadProperties);\r\n\r\n        public override int GetHashCode()\r\n        {\r\n            return base.GetHashCode();\r\n        }\r\n\r\n        public static bool operator ==(BitmapLoadProperties obj1, BitmapLoadProperties obj2)\r\n        {\r\n            if (obj1 is null && obj2 is null)\r\n            {\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return obj1?.Equals(obj2) == true;\r\n            }\r\n        }\r\n\r\n        public static bool operator !=(BitmapLoadProperties obj1, BitmapLoadProperties obj2)\r\n        {\r\n            return obj1?.Equals(obj2) == false;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return $\"{MaxDecodePixelWidth}x{MaxDecodePixelHeight};{DpiScale?.DpiScaleX}x{DpiScale?.DpiScaleY};{Source};{Scaling}\";\r\n        }\r\n    }\r\n\r\n    public static partial class BitmapExtensions\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private static readonly byte[] webpSig = new byte[] { 0x57, 0x45, 0x42, 0x50 };\r\n        // Apparently both ftypavif and ftypmif1 can appear in avif encoded images\r\n        private static readonly byte[] avif1 = new byte[] { 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66 };\r\n        private static readonly byte[] avif2 = new byte[] { 0x66, 0x74, 0x79, 0x70, 0x6d, 0x69, 0x66, 0x31 };\r\n\r\n        public static BitmapSource CreateSourceFromURI(Uri imageUri)\r\n        {\r\n            return CreateSourceFromURI(imageUri.LocalPath);\r\n        }\r\n\r\n        public static BitmapSource CreateSourceFromURI(string imageUri)\r\n        {\r\n            return BitmapFromFile(imageUri);\r\n        }\r\n\r\n        public static byte[] ToPngArray(this BitmapImage image)\r\n        {\r\n            return ToPngArray((BitmapSource)image);\r\n        }\r\n\r\n        public static byte[] ToPngArray(this BitmapSource image)\r\n        {\r\n            var encoder = new PngBitmapEncoder();\r\n            encoder.Frames.Add(BitmapFrame.Create(image));\r\n            using (var stream = new MemoryStream())\r\n            {\r\n                encoder.Save(stream);\r\n                return stream.ToArray();\r\n            }\r\n        }\r\n\r\n        public static BitmapSource GetClone(this BitmapSource image, BitmapLoadProperties loadProperties = null)\r\n        {\r\n            var encoder = new BmpBitmapEncoder();\r\n            encoder.Frames.Add(BitmapFrame.Create(image));\r\n            using (var stream = new MemoryStream())\r\n            {\r\n                encoder.Save(stream);\r\n                return BitmapExtensions.BitmapFromStream(stream, loadProperties);\r\n            }\r\n        }\r\n\r\n        public static Windows.Controls.Image ToImage(this BitmapSource bitmap, BitmapScalingMode scaling = BitmapScalingMode.Fant)\r\n        {\r\n            var image = new Windows.Controls.Image()\r\n            {\r\n                Source = bitmap\r\n            };\r\n\r\n            RenderOptions.SetBitmapScalingMode(image, scaling);\r\n            return image;\r\n        }\r\n\r\n        public static BitmapSource BitmapFromFile(string imagePath, BitmapLoadProperties loadProperties = null)\r\n        {\r\n            try\r\n            {\r\n                using (var fStream = FileSystem.OpenReadFileStreamSafe(imagePath))\r\n                {\r\n                    return BitmapFromStream(fStream, loadProperties);\r\n                }\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, $\"Failed to create bitmap from file {imagePath}.\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static bool IsFormatForImageMagickDecode(Stream stream)\r\n        {\r\n            if (stream.Length < 12)\r\n                return false;\r\n\r\n            // WEBP\r\n            stream.Seek(8, SeekOrigin.Begin);\r\n            var buffer = new byte[4];\r\n            stream.Read(buffer, 0, 4);\r\n            if (buffer.SequenceEqual(webpSig))\r\n                return true;\r\n\r\n            // AVIF\r\n            stream.Seek(4, SeekOrigin.Begin);\r\n            buffer = new byte[8];\r\n            stream.Read(buffer, 0, 8);\r\n            if (buffer.SequenceEqual(avif1))\r\n                return true;\r\n\r\n            if (buffer.SequenceEqual(avif2))\r\n                return true;\r\n\r\n            return false;\r\n        }\r\n\r\n        public static BitmapSource HtmlComponentImageLoader(Stream stream)\r\n        {\r\n            if (IsFormatForImageMagickDecode(stream))\r\n                return BitmapFromStreamImageMagick(stream);\r\n\r\n            // This is exactly how HTML renderer loads them by default, for compatbility reasons.\r\n            // With an exception of IgnoreColorProfile, which speeds up image decode and doesn't really matter for our use case.\r\n            stream.Seek(0, SeekOrigin.Begin);\r\n            var bitmap = new BitmapImage();\r\n            bitmap.BeginInit();\r\n            bitmap.StreamSource = stream;\r\n            bitmap.CacheOption = BitmapCacheOption.OnLoad;\r\n            bitmap.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;\r\n            bitmap.EndInit();\r\n            bitmap.Freeze();\r\n            return bitmap;\r\n        }\r\n\r\n        public static BitmapSource BitmapFromStreamImageMagick(Stream stream, BitmapLoadProperties loadProperties = null)\r\n        {\r\n            // It doesn't look look we can decode images from ImageMagick at specific size for speed and memory gains.\r\n            // So loadProperties are ignored for now.\r\n            // https://github.com/dlemstra/Magick.NET/discussions/1824#discussioncomment-12810888\r\n            //var info = new MagickImageInfo(stream);\r\n\r\n            stream.Seek(0, SeekOrigin.Begin);\r\n            using (var mImage = new MagickImage(stream))\r\n            {\r\n                var image = mImage.ToBitmapSource();\r\n                image.Freeze();\r\n                return image;\r\n            }\r\n        }\r\n\r\n        // TODO: Modify scaling to scale by both axies.\r\n        // This will currently work properly only if load properties force only width or height, not both.\r\n        public static BitmapSource BitmapFromStream(Stream stream, BitmapLoadProperties loadProperties = null)\r\n        {\r\n            // Have to call .Freeze() on sources created here otherwise images decoded from non-UI\r\n            // thread won't load on UI thread.\r\n            try\r\n            {\r\n                // For webp and avif primarily, since Windows' decoder doesn't work properly with some files.\r\n                // Primary example being images in Steam store's game descriptions.\r\n                if (IsFormatForImageMagickDecode(stream))\r\n                    return BitmapFromStreamImageMagick(stream, loadProperties);\r\n\r\n                stream.Seek(0, SeekOrigin.Begin);\r\n                var properties = Images.GetImageProperties(stream);\r\n                var aspect = new AspectRatio(properties.Width, properties.Height);\r\n                stream.Seek(0, SeekOrigin.Begin);\r\n                var bitmap = new BitmapImage();\r\n                bitmap.BeginInit();\r\n                MemoryStream tempStream = null;\r\n                var shouldRescale = false;\r\n\r\n                if ((loadProperties?.MaxDecodePixelWidth > 0 && properties?.Width > loadProperties?.MaxDecodePixelWidth) ||\r\n                    (loadProperties?.MaxDecodePixelHeight > 0 && properties?.Height > loadProperties?.MaxDecodePixelHeight))\r\n                {\r\n                    shouldRescale = true;\r\n                }\r\n\r\n                if (loadProperties?.Scaling == ImageLoadScaling.None)\r\n                {\r\n                    shouldRescale = false;\r\n                }\r\n\r\n                if (shouldRescale)\r\n                {\r\n                    if (loadProperties?.Scaling == ImageLoadScaling.BitmapDotNet)\r\n                    {\r\n                        if (loadProperties?.MaxDecodePixelWidth > 0 && properties?.Width > loadProperties?.MaxDecodePixelWidth)\r\n                        {\r\n                            bitmap.DecodePixelWidth = loadProperties.DpiAwareMaxDecodePixelWidth;\r\n                        }\r\n\r\n                        if (loadProperties?.MaxDecodePixelHeight > 0 && properties?.Height > loadProperties?.MaxDecodePixelHeight)\r\n                        {\r\n                            bitmap.DecodePixelHeight = loadProperties.DpiAwareMaxDecodePixelHeight;\r\n                        }\r\n\r\n                        if (bitmap.DecodePixelHeight != 0 && bitmap.DecodePixelWidth == 0)\r\n                        {\r\n                            bitmap.DecodePixelWidth = (int)Math.Round(aspect.GetWidth(bitmap.DecodePixelHeight));\r\n                        }\r\n                        else if (bitmap.DecodePixelWidth != 0 && bitmap.DecodePixelHeight == 0)\r\n                        {\r\n                            bitmap.DecodePixelHeight = (int)Math.Round(aspect.GetHeight(bitmap.DecodePixelWidth));\r\n                        }\r\n                    }\r\n                    else if (loadProperties?.Scaling == ImageLoadScaling.Custom)\r\n                    {\r\n                        var settings = new ProcessImageSettings\r\n                        {\r\n                            SaveFormat = FileFormat.Bmp,\r\n                            Sharpen = false\r\n                        };\r\n\r\n                        if (loadProperties.MaxDecodePixelWidth > 0 && properties?.Width > loadProperties?.MaxDecodePixelWidth)\r\n                        {\r\n                            settings.Width = loadProperties.DpiAwareMaxDecodePixelWidth;\r\n                        }\r\n\r\n                        if (loadProperties.MaxDecodePixelHeight > 0 && properties?.Height > loadProperties?.MaxDecodePixelHeight)\r\n                        {\r\n                            settings.Height = loadProperties.DpiAwareMaxDecodePixelHeight;\r\n                        }\r\n\r\n                        tempStream = new MemoryStream();\r\n                        // MagicImage can't run on UI thread.\r\n                        if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA)\r\n                        {\r\n                            Task.Run(() => MagicImageProcessor.ProcessImage(stream, tempStream, settings)).Wait();\r\n                        }\r\n                        else\r\n                        {\r\n                            MagicImageProcessor.ProcessImage(stream, tempStream, settings);\r\n                        }\r\n\r\n                        tempStream.Seek(0, SeekOrigin.Begin);\r\n                    }\r\n                }\r\n\r\n                bitmap.StreamSource = tempStream ?? stream;\r\n                bitmap.CacheOption = BitmapCacheOption.OnLoad;\r\n                bitmap.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;\r\n                bitmap.EndInit();\r\n                bitmap.Freeze();\r\n                tempStream?.Dispose();\r\n                return bitmap;\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to create bitmap from stream.\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static long GetSizeInMemory(this BitmapSource image)\r\n        {\r\n            try\r\n            {\r\n                return Convert.ToInt64(image.PixelHeight * image.PixelWidth * 4);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to get image size from bitmap.\");\r\n                return 0;\r\n            }\r\n        }\r\n\r\n        public static BitmapImage TgaToBitmap(TGA tga)\r\n        {\r\n            try\r\n            {\r\n                using (var tgaBitmap = tga.ToBitmap())\r\n                {\r\n                    using (var memory = new MemoryStream())\r\n                    {\r\n                        tgaBitmap.Save(memory, ImageFormat.Png);\r\n                        memory.Position = 0;\r\n                        var bitmapImage = new BitmapImage();\r\n                        bitmapImage.BeginInit();\r\n                        bitmapImage.StreamSource = memory;\r\n                        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;\r\n                        bitmapImage.EndInit();\r\n                        bitmapImage.Freeze();\r\n                        return bitmapImage;\r\n                    }\r\n                }\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, $\"Failed to create bitmap from TGA image.\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static Bitmap ToBitmap(this BitmapImage bitmapImage)\r\n        {\r\n            using (MemoryStream outStream = new MemoryStream())\r\n            {\r\n                var enc = new BmpBitmapEncoder();\r\n                enc.Frames.Add(BitmapFrame.Create(bitmapImage));\r\n                enc.Save(outStream);\r\n                Bitmap bitmap = new Bitmap(outStream);\r\n                return new Bitmap(bitmap);\r\n            }\r\n        }\r\n\r\n        public static BitmapImage TgaToBitmap(string tgaPath)\r\n        {\r\n            return TgaToBitmap(new TGA(tgaPath));\r\n        }\r\n\r\n        public static BitmapImage TgaToBitmap(byte[] tgaContent)\r\n        {\r\n            return TgaToBitmap(new TGA(tgaContent));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/BitmapIconExtensions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Drawing2D;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System.Drawing.Imaging\r\n{\r\n    /// <summary>\r\n    /// Adapted from this gist: https://gist.github.com/darkfall/1656050\r\n    /// Provides helper methods for imaging\r\n    /// </summary>\r\n    public static partial class BitmapExtensions\r\n    {\r\n        /// <summary>\r\n        /// Converts a PNG image to a icon (ico) with all the sizes windows likes\r\n        /// </summary>\r\n        /// <param name=\"inputBitmap\">The input bitmap</param>\r\n        /// <param name=\"output\">The output stream</param>\r\n        /// <returns>Wether or not the icon was succesfully generated</returns>\r\n        public static bool ConvertToIcon(Bitmap inputBitmap, Stream output)\r\n        {\r\n            if (inputBitmap == null)\r\n                return false;\r\n\r\n            int[] sizes = new int[] { 256, 48, 32, 16 };\r\n\r\n            // Generate bitmaps for all the sizes and toss them in streams\r\n            List<MemoryStream> imageStreams = new List<MemoryStream>();\r\n            foreach (int size in sizes)\r\n            {\r\n                Bitmap newBitmap = ResizeImage(inputBitmap, size, size);\r\n                if (newBitmap == null)\r\n                    return false;\r\n                MemoryStream memoryStream = new MemoryStream();\r\n                newBitmap.Save(memoryStream, ImageFormat.Png);\r\n                imageStreams.Add(memoryStream);\r\n            }\r\n\r\n            BinaryWriter iconWriter = new BinaryWriter(output);\r\n            if (output == null || iconWriter == null)\r\n                return false;\r\n\r\n            int offset = 0;\r\n\r\n            // 0-1 reserved, 0\r\n            iconWriter.Write((byte)0);\r\n            iconWriter.Write((byte)0);\r\n\r\n            // 2-3 image type, 1 = icon, 2 = cursor\r\n            iconWriter.Write((short)1);\r\n\r\n            // 4-5 number of images\r\n            iconWriter.Write((short)sizes.Length);\r\n\r\n            offset += 6 + (16 * sizes.Length);\r\n\r\n            for (int i = 0; i < sizes.Length; i++)\r\n            {\r\n                // image entry 1\r\n                // 0 image width\r\n                iconWriter.Write((byte)sizes[i]);\r\n                // 1 image height\r\n                iconWriter.Write((byte)sizes[i]);\r\n\r\n                // 2 number of colors\r\n                iconWriter.Write((byte)0);\r\n\r\n                // 3 reserved\r\n                iconWriter.Write((byte)0);\r\n\r\n                // 4-5 color planes\r\n                iconWriter.Write((short)0);\r\n\r\n                // 6-7 bits per pixel\r\n                iconWriter.Write((short)32);\r\n\r\n                // 8-11 size of image data\r\n                iconWriter.Write((int)imageStreams[i].Length);\r\n\r\n                // 12-15 offset of image data\r\n                iconWriter.Write((int)offset);\r\n\r\n                offset += (int)imageStreams[i].Length;\r\n            }\r\n\r\n            for (int i = 0; i < sizes.Length; i++)\r\n            {\r\n                // write image data\r\n                // png data must contain the whole png data file\r\n                iconWriter.Write(imageStreams[i].ToArray());\r\n                imageStreams[i].Close();\r\n            }\r\n\r\n            iconWriter.Flush();\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a PNG image to a icon (ico)\r\n        /// </summary>\r\n        /// <param name=\"input\">The input stream</param>\r\n        /// <param name=\"output\">The output stream</param\r\n        /// <returns>Wether or not the icon was succesfully generated</returns>\r\n        public static bool ConvertToIcon(Stream input, Stream output)\r\n        {\r\n            Bitmap inputBitmap = (Bitmap)Bitmap.FromStream(input);\r\n            return ConvertToIcon(inputBitmap, output);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts a PNG image to a icon (ico)\r\n        /// </summary>\r\n        /// <param name=\"inputPath\">The input path</param>\r\n        /// <param name=\"outputPath\">The output path</param>\r\n        /// <returns>Wether or not the icon was succesfully generated</returns>\r\n        public static bool ConvertToIcon(string inputPath, string outputPath)\r\n        {\r\n            using (FileStream inputStream = new FileStream(inputPath, FileMode.Open))\r\n            using (FileStream outputStream = new FileStream(outputPath, FileMode.Create))\r\n            {\r\n                return ConvertToIcon(inputStream, outputStream);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts an image to a icon (ico)\r\n        /// </summary>\r\n        /// <param name=\"inputImage\">The input image</param>\r\n        /// <param name=\"outputPath\">The output path</param>\r\n        /// <returns>Wether or not the icon was succesfully generated</returns>\r\n        public static bool ConvertToIcon(Image inputImage, string outputPath)\r\n        {\r\n            using (FileStream outputStream = new FileStream(outputPath, FileMode.Create))\r\n            {\r\n                return ConvertToIcon(new Bitmap(inputImage), outputStream);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Resize the image to the specified width and height.\r\n        /// Found on stackoverflow: https://stackoverflow.com/questions/1922040/resize-an-image-c-sharp\r\n        /// </summary>\r\n        /// <param name=\"image\">The image to resize.</param>\r\n        /// <param name=\"width\">The width to resize to.</param>\r\n        /// <param name=\"height\">The height to resize to.</param>\r\n        /// <returns>The resized image.</returns>\r\n        public static Bitmap ResizeImage(Image image, int width, int height)\r\n        {\r\n            var destRect = new Rectangle(0, 0, width, height);\r\n            var destImage = new Bitmap(width, height);\r\n\r\n            destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);\r\n\r\n            using (var graphics = Graphics.FromImage(destImage))\r\n            {\r\n                graphics.CompositingMode = CompositingMode.SourceCopy;\r\n                graphics.CompositingQuality = CompositingQuality.HighQuality;\r\n                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;\r\n                graphics.SmoothingMode = SmoothingMode.HighQuality;\r\n                graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;\r\n\r\n                using (var wrapMode = new ImageAttributes())\r\n                {\r\n                    wrapMode.SetWrapMode(WrapMode.TileFlipXY);\r\n                    graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);\r\n                }\r\n            }\r\n\r\n            return destImage;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/CloneObject.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Net;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Newtonsoft.Json;\r\nusing System.Reflection;\r\nusing Playnite.SDK.Data;\r\nusing Playnite.Common;\r\nusing Playnite.SDK.Models;\r\n\r\nnamespace System\r\n{\r\n    public static class CloneObject\r\n    {\r\n        private static readonly JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings()\r\n        {\r\n            Formatting = Formatting.None,\r\n            ContractResolver = JsonResolver.Global,\r\n            MaxDepth = 128\r\n        };\r\n\r\n        /// <summary>\r\n        /// Perform a deep copy of the object, using Json as a serialisation method.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\">The type of object being copied.</typeparam>\r\n        /// <param name=\"source\">The object instance to copy.</param>\r\n        /// <returns>The copied object.</returns>\r\n        public static T GetClone<T>(this T source)\r\n        {\r\n            if (Object.ReferenceEquals(source, null))\r\n            {\r\n                return default(T);\r\n            }\r\n\r\n            return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source, jsonSerializerSettings));\r\n        }\r\n\r\n        public static Game GetClone(this Game source)\r\n        {\r\n            if (source == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return source.GetCopy();\r\n        }\r\n\r\n        public static GameAction GetClone(this GameAction source)\r\n        {\r\n            if (source == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return source.GetCopy();\r\n        }\r\n\r\n        public static CustomEmulatorProfile GetClone(this CustomEmulatorProfile source)\r\n        {\r\n            if (source == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return source.GetCopy();\r\n        }\r\n\r\n        public static BuiltInEmulatorProfile GetClone(this BuiltInEmulatorProfile source)\r\n        {\r\n            if (source == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return source.GetCopy();\r\n        }\r\n\r\n        public static Emulator GetClone(this Emulator source)\r\n        {\r\n            if (source == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return source.GetCopy();\r\n        }\r\n\r\n        public static U GetClone<T, U>(this T source)\r\n        {\r\n            if (Object.ReferenceEquals(source, null))\r\n            {\r\n                return default(U);\r\n            }\r\n\r\n            return JsonConvert.DeserializeObject<U>(JsonConvert.SerializeObject(source, jsonSerializerSettings));\r\n        }\r\n\r\n        public static bool IsEqualJson(this object source, object targer)\r\n        {\r\n            var first = JsonConvert.SerializeObject(source, jsonSerializerSettings);\r\n            var second = JsonConvert.SerializeObject(targer, jsonSerializerSettings);\r\n            return first == second;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Extension for 'Object' that copies the properties to a destination object.\r\n        /// Courtesy of http://stackoverflow.com/questions/930433/apply-properties-values-from-one-object-to-another-of-the-same-type-automaticall\r\n        /// </summary>\r\n        /// <param name=\"source\">The source.</param>\r\n        /// <param name=\"destination\">The destination.</param>\r\n        public static void CopyProperties(this object source, object destination, bool diffOnly, List<string> ignoreNames = null, bool acceptJsonIgnore = false)\r\n        {\r\n            // If any this null throw an exception\r\n            if (source == null || destination == null)\r\n                throw new Exception(\"Source or/and Destination Objects are null\");\r\n            // Getting the Types of the objects\r\n            Type typeDest = destination.GetType();\r\n            Type typeSrc = source.GetType();\r\n\r\n            // Iterate the Properties of the source instance and\r\n            // populate them from their desination counterparts\r\n            PropertyInfo[] srcProps = typeSrc.GetProperties();\r\n            foreach (PropertyInfo srcProp in srcProps)\r\n            {\r\n                if (ignoreNames?.Any() == true && ignoreNames.Contains(srcProp.Name))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (!srcProp.CanRead)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                PropertyInfo targetProperty = typeDest.GetProperty(srcProp.Name);\r\n                if (targetProperty == null)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (!targetProperty.CanWrite)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (targetProperty.GetSetMethod(true) != null && targetProperty.GetSetMethod(true).IsPrivate)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if ((targetProperty.GetSetMethod().Attributes & MethodAttributes.Static) != 0)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (!targetProperty.PropertyType.IsAssignableFrom(srcProp.PropertyType))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (acceptJsonIgnore && (Attribute.IsDefined(targetProperty, typeof(DontSerializeAttribute)) || Attribute.IsDefined(targetProperty, typeof(JsonIgnoreAttribute))))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                var sourceValue = srcProp.GetValue(source);\r\n                var targetValue = targetProperty.GetValue(destination);\r\n                if (sourceValue == null && targetValue == null)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                // TODO Add support for lists\r\n                if (sourceValue is IComparable && diffOnly)\r\n                {\r\n                    var equal = ((IComparable)sourceValue).CompareTo(targetValue) == 0;\r\n                    if (!equal)\r\n                    {\r\n                        targetProperty.SetValue(destination, sourceValue);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (sourceValue != null)\r\n                    {\r\n                        var genericComparable = sourceValue.GetType().GetInterface(\"IComparable`1\");\r\n                        if (genericComparable != null && genericComparable.GenericTypeArguments.Any(a => a == sourceValue.GetType()) && diffOnly)\r\n                        {\r\n                            int res = (int)genericComparable.GetMethod(\"CompareTo\").Invoke(sourceValue, new object[] { targetValue });\r\n                            if (res != 0)\r\n                            {\r\n                                targetProperty.SetValue(destination, sourceValue);\r\n                            }\r\n\r\n                            continue;\r\n                        }\r\n                    }\r\n\r\n                    targetProperty.SetValue(destination, sourceValue);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/Dictionary.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System\r\n{\r\n    public static class DictionaryExtensions\r\n    {\r\n        public static void AddOrUpdate<TKey, TVal>(this Dictionary<TKey, TVal> source, TKey key, TVal value)\r\n        {\r\n            if (source.ContainsKey(key))\r\n            {\r\n                source[key] = value;\r\n            }\r\n            else\r\n            {\r\n                source.Add(key, value);\r\n            }\r\n        }\r\n\r\n        public static void AddMissing<TKey, TVal>(this Dictionary<TKey, TVal> source, TKey key, TVal value)\r\n        {\r\n            if (!source.ContainsKey(key))\r\n            {\r\n                source.Add(key, value);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/Enums.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System\r\n{\r\n    public static class EnumExtensions\r\n    {\r\n        public static int GetMax(this Enum source)\r\n        {\r\n            return Enum.GetValues(source.GetType()).Cast<int>().Max();\r\n        }\r\n        public static int GetMin(this Enum source)\r\n        {\r\n            return Enum.GetValues(source.GetType()).Cast<int>().Min();\r\n        }\r\n\r\n        public static string GetDescription(this Enum source)\r\n        {\r\n            FieldInfo field = source.GetType().GetField(source.ToString());\r\n            if (field == null)\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            var attributes = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), false);\r\n            if (attributes != null && attributes.Length > 0)\r\n            {\r\n                var desc = attributes[0].Description;\r\n                if (desc.StartsWith(\"LOC\", StringComparison.Ordinal))\r\n                {\r\n                    return ResourceProvider.GetString(desc);\r\n                }\r\n                else\r\n                {\r\n                    return attributes[0].Description;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return source.ToString();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/IconExtension.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\nusing System.Drawing;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing Playnite.Native;\r\n\r\nnamespace System.Drawing\r\n{\r\n    public static class IconExtension\r\n    {\r\n        public static byte[] ToByteArray(this Icon icon, System.Drawing.Imaging.ImageFormat format)\r\n        {\r\n            using (var stream = new MemoryStream())\r\n            {\r\n                using (var bitmap = icon.ToBitmap())\r\n                {\r\n                    bitmap.Save(stream, format);\r\n                    return stream.ToArray();\r\n                }\r\n            }\r\n        }\r\n\r\n        public static BitmapSource ToImageSource(this Icon icon)\r\n        {\r\n            using (Bitmap bitmap = icon.ToBitmap())\r\n            {\r\n                IntPtr hBitmap = bitmap.GetHbitmap();\r\n                BitmapSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(\r\n                    hBitmap,\r\n                    IntPtr.Zero,\r\n                    Int32Rect.Empty,\r\n                    BitmapSizeOptions.FromEmptyOptions());\r\n\r\n                if (!Gdi32.DeleteObject(hBitmap))\r\n                {\r\n                    throw new Win32Exception();\r\n                }\r\n\r\n                return wpfBitmap;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/ItemsControlExtensions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Media;\r\n\r\nnamespace System.Windows.Controls\r\n{\r\n    public static class ItemsControlExtensions\r\n    {\r\n        public static void ScrollIntoView(this ItemsControl control, object item)\r\n        {\r\n            var framework = control.ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement;\r\n            if (framework == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            framework.BringIntoView();\r\n        }\r\n\r\n        public static void ScrollIntoView(this ItemsControl control)\r\n        {\r\n            int count = control.Items.Count;\r\n            if (count == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            object item = control.Items[count - 1];\r\n            control.ScrollIntoView(item);\r\n        }\r\n\r\n        public static string ToHtml(this Color color)\r\n        {\r\n            return $\"#{color.R:X2}{color.G:X2}{color.B:X2}\";\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/KeyExtensions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public static class KeyExtensions\r\n    {\r\n        public static bool IsNumericKey(this Key key)\r\n        {\r\n            return (\r\n                key == Key.D0 ||\r\n                key == Key.D1 ||\r\n                key == Key.D2 ||\r\n                key == Key.D3 ||\r\n                key == Key.D4 ||\r\n                key == Key.D5 ||\r\n                key == Key.D6 ||\r\n                key == Key.D7 ||\r\n                key == Key.D8 ||\r\n                key == Key.D9 ||\r\n                key == Key.NumPad0 ||\r\n                key == Key.NumPad1 ||\r\n                key == Key.NumPad2 ||\r\n                key == Key.NumPad3 ||\r\n                key == Key.NumPad4 ||\r\n                key == Key.NumPad5 ||\r\n                key == Key.NumPad6 ||\r\n                key == Key.NumPad7 ||\r\n                key == Key.NumPad8 ||\r\n                key == Key.NumPad9);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/LongExtensions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System\r\n{\r\n    public static class LongExtensions\r\n    {\r\n        public static DateTime ToDateFromUnixMs(this long value)\r\n        {            \r\n            return DateTimeOffset.FromUnixTimeMilliseconds(value).DateTime;\r\n        }\r\n\r\n        public static DateTime ToDateFromUnixSeconds(this long value)\r\n        {\r\n            return DateTimeOffset.FromUnixTimeSeconds(value).DateTime;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/NetExtensions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System.Net\r\n{\r\n    public static class NetExtensions\r\n    {\r\n        public static bool IsSuccess(this HttpStatusCode statusCode)\r\n        {\r\n            return statusCode >= HttpStatusCode.OK && statusCode < HttpStatusCode.MultipleChoices;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/ObjectExtensions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System\r\n{\r\n    public static class ObjectExtensions\r\n    {\r\n        public static bool HasMethod(this object obj, string methodName)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            try\r\n            {\r\n                return obj.GetType().GetMethod(methodName) != null;\r\n            }\r\n            catch (AmbiguousMatchException)\r\n            {\r\n                // Ambiguous means there is more than one result\r\n                return true;\r\n            }\r\n        }\r\n\r\n        public static object CrateInstance(this Type type)\r\n        {\r\n            return Activator.CreateInstance(type);\r\n        }\r\n\r\n        public static T CrateInstance<T>(this Type type)\r\n        {\r\n            return (T)Activator.CreateInstance(type);\r\n        }\r\n\r\n        public static T CrateInstance<T>(this Type type, params object[] parameters)\r\n        {\r\n            return (T)Activator.CreateInstance(type, parameters);\r\n        }\r\n\r\n        public static object CreateGenericInstance(Type genericTypeDefinition, Type genericType)\r\n        {\r\n            Type resultType = genericTypeDefinition.MakeGenericType(genericType);\r\n            return Activator.CreateInstance(resultType);\r\n        }\r\n\r\n        public static object CreateGenericInstance(Type genericTypeDefinition, Type genericType, params object[] parameters)\r\n        {\r\n            Type resultType = genericTypeDefinition.MakeGenericType(genericType);\r\n            return Activator.CreateInstance(resultType, parameters);\r\n        }\r\n\r\n        public static bool HasPropertyAttribute<TAttribute>(this Type type, string propertyName) where TAttribute : Attribute\r\n        {\r\n            var prop = type.GetProperty(propertyName);\r\n            if (prop == null)\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                return prop.GetCustomAttribute(typeof(TAttribute)) != null;\r\n            }\r\n        }\r\n\r\n        public static bool IsGenericList(this Type type, out Type itemType)\r\n        {\r\n            var isGeneric = type.IsGenericType && (type.GetGenericTypeDefinition() == typeof(List<>));\r\n            if (isGeneric)\r\n            {\r\n                itemType = type.GenericTypeArguments.First();\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                itemType = null;\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/ProcessExtensions.cs",
    "content": "﻿using Playnite.Native;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Management;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System.Diagnostics\r\n{\r\n    public static class ProcessExtensions\r\n    {\r\n        public static bool TryGetMainModuleFileName(this Process process, out string fileName, int buffer = 1024)\r\n        {\r\n            fileName = null;\r\n            var handle = Kernel32.OpenProcess(ProcessAccessFlags.QueryLimitedInformation, false, process.Id);\r\n            if (handle == IntPtr.Zero)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            try\r\n            {\r\n                var fileNameBuilder = new StringBuilder(buffer);\r\n                uint bufferLength = (uint)fileNameBuilder.Capacity + 1;\r\n                var result = Kernel32.QueryFullProcessImageName(handle, 0, fileNameBuilder, ref bufferLength);\r\n                fileName = result ? fileNameBuilder.ToString() : null;\r\n                return result;\r\n            }\r\n            finally\r\n            {\r\n                Kernel32.CloseHandle(handle);\r\n            }\r\n        }\r\n\r\n        public static bool TryGetParentId(this Process process, out int processId)\r\n        {\r\n            processId = 0;\r\n            var handle = Kernel32.OpenProcess(ProcessAccessFlags.QueryLimitedInformation, false, process.Id);\r\n            if (handle == IntPtr.Zero)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            try\r\n            {\r\n                var info = new PROCESS_BASIC_INFORMATION();\r\n                int status = Ntdll.NtQueryInformationProcess(handle, 0, ref info, Marshal.SizeOf(info), out var returnLength);\r\n                if (status != 0)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                processId = info.InheritedFromUniqueProcessId.ToInt32();\r\n                return true;\r\n            }\r\n            finally\r\n            {\r\n                Kernel32.CloseHandle(handle);\r\n            }\r\n        }\r\n\r\n        public static bool IsRunning(string processPattern)\r\n        {\r\n            return Process.GetProcesses().FirstOrDefault(a => Regex.IsMatch(a.ProcessName, processPattern, RegexOptions.IgnoreCase)) != null;\r\n        }\r\n\r\n        public static string GetCommandLine(this Process process)\r\n        {\r\n            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(\"SELECT CommandLine FROM Win32_Process WHERE ProcessId = \" + process.Id))\r\n            using (ManagementObjectCollection objects = searcher.Get())\r\n            {\r\n                return objects.Cast<ManagementBaseObject>().SingleOrDefault()?[\"CommandLine\"]?.ToString();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/StringExtensions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Globalization;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\nusing System.Web;\r\n\r\nnamespace System\r\n{\r\n    class CaseInsensitiveCharComparer : EqualityComparer<char>\r\n    {\r\n        public override bool Equals(char x, char y)\r\n        {\r\n            return char.ToUpperInvariant(x) == char.ToUpperInvariant(y);\r\n        }\r\n\r\n        public override int GetHashCode(char obj)\r\n        {\r\n            return char.ToUpperInvariant(obj).GetHashCode();\r\n        }\r\n    }\r\n\r\n    public static class StringExtensions\r\n    {\r\n        private static readonly CultureInfo enUSCultInfo = new CultureInfo(\"en-US\", false);\r\n        private const double defaultWinklerWeightThreshold = 0.7; //Winkler's paper used a default value of 0.7\r\n        private const int winklerNumChars = 4; //Size of the prefix to be considered by the Winkler modification.\r\n        private static readonly EqualityComparer<char> charCaseInsensitiveComparer = new CaseInsensitiveCharComparer();\r\n\r\n        public static string MD5(this string s)\r\n        {\r\n            var builder = new StringBuilder();\r\n            foreach (byte b in MD5Bytes(s))\r\n            {\r\n                builder.Append(b.ToString(\"x2\").ToLower());\r\n            }\r\n\r\n            return builder.ToString();\r\n        }\r\n\r\n        public static byte[] MD5Bytes(this string s)\r\n        {\r\n            using (var provider = System.Security.Cryptography.MD5.Create())\r\n            {\r\n                return provider.ComputeHash(Encoding.UTF8.GetBytes(s));\r\n            }\r\n        }\r\n\r\n        public static string RemoveTrademarks(this string str, string remplacement = \"\")\r\n        {\r\n            if (str.IsNullOrEmpty())\r\n            {\r\n                return str;\r\n            }\r\n\r\n            return Regex.Replace(str, @\"[™©®]\", remplacement);\r\n        }\r\n\r\n        public static bool IsNullOrEmpty(this string source)\r\n        {\r\n            return string.IsNullOrEmpty(source);\r\n        }\r\n\r\n        public static bool IsNullOrWhiteSpace(this string source)\r\n        {\r\n            return string.IsNullOrWhiteSpace(source);\r\n        }\r\n\r\n        public static string Format(this string source, params object[] args)\r\n        {\r\n            return string.Format(source, args);\r\n        }\r\n\r\n        public static string TrimEndString(this string source, string value, StringComparison comp = StringComparison.Ordinal)\r\n        {\r\n            if (!source.EndsWith(value, comp))\r\n            {\r\n                return source;\r\n            }\r\n\r\n            return source.Remove(source.LastIndexOf(value, comp));\r\n        }\r\n\r\n        public static string ToTileCase(this string source, CultureInfo culture = null)\r\n        {\r\n            if (source.IsNullOrEmpty())\r\n            {\r\n                return source;\r\n            }\r\n\r\n            if (culture != null)\r\n            {\r\n                return culture.TextInfo.ToTitleCase(source);\r\n            }\r\n            else\r\n            {\r\n                return enUSCultInfo.TextInfo.ToTitleCase(source);\r\n            }\r\n        }\r\n\r\n        public static bool IsStartOfStringAcronym(this string acronymStart, string input)\r\n        {\r\n            if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(acronymStart)\r\n                || acronymStart.Length < 2 || acronymStart.Length > input.Length)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            for (int i = 0; i < acronymStart.Length; i++)\r\n            {\r\n                if (!char.IsLetterOrDigit(acronymStart[i]))\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            var acronymIndex = 0;\r\n            for (int i = 0; i < input.Length; i++)\r\n            {\r\n                if (char.IsLetterOrDigit(input[i]) && (i == 0 || input[i - 1] == ' '))\r\n                {\r\n                    if (char.ToUpperInvariant(input[i]) != char.ToUpperInvariant(acronymStart[acronymIndex]))\r\n                    {\r\n                        return false;\r\n                    }\r\n                    else\r\n                    {\r\n                        acronymIndex++;\r\n                        // If the acronym index and acronym start length is the same\r\n                        // it means all the characters have been matched\r\n                        if (acronymIndex == acronymStart.Length)\r\n                        {\r\n                            return true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        private static string RemoveUnlessThatEmptiesTheString(string input, string pattern)\r\n        {\r\n            string output = Regex.Replace(input, pattern, string.Empty);\r\n\r\n            if (string.IsNullOrWhiteSpace(output))\r\n            {\r\n                return input;\r\n            }\r\n            return output;\r\n        }\r\n\r\n        public static string NormalizeGameName(this string name)\r\n        {\r\n            if (string.IsNullOrEmpty(name))\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            var newName = name;\r\n            newName = newName.RemoveTrademarks();\r\n            newName = newName.Replace(\"_\", \" \");\r\n            newName = newName.Replace(\".\", \" \");\r\n            newName = newName.Replace('’', '\\'');\r\n            newName = RemoveUnlessThatEmptiesTheString(newName, @\"\\[.*?\\]\");\r\n            newName = RemoveUnlessThatEmptiesTheString(newName, @\"\\(.*?\\)\");\r\n            newName = Regex.Replace(newName, @\"\\s*:\\s*\", \": \");\r\n            newName = Regex.Replace(newName, @\"\\s+\", \" \");\r\n            if (Regex.IsMatch(newName, @\",\\s*The$\"))\r\n            {\r\n                newName = \"The \" + Regex.Replace(newName, @\",\\s*The$\", \"\", RegexOptions.IgnoreCase);\r\n            }\r\n\r\n            return newName.Trim();\r\n        }\r\n\r\n        public static string GetSHA256Hash(this string input)\r\n        {\r\n            using (var sha = System.Security.Cryptography.SHA256.Create())\r\n            {\r\n                var hash = sha.ComputeHash(Encoding.UTF8.GetBytes(input));\r\n                return BitConverter.ToString(hash).Replace(\"-\", \"\");\r\n            }\r\n        }\r\n\r\n        public static byte[] GetSHA256HashByte(this string input)\r\n        {\r\n            using (var sha = System.Security.Cryptography.SHA256.Create())\r\n            {\r\n                return sha.ComputeHash(Encoding.UTF8.GetBytes(input));\r\n            }\r\n        }\r\n\r\n        public static string GetPathWithoutAllExtensions(string path)\r\n        {\r\n            if (string.IsNullOrEmpty(path))\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            return Regex.Replace(path, @\"(\\.[A-Za-z0-9]+)+$\", \"\");\r\n        }\r\n\r\n        public static bool Contains(this string str, string value, StringComparison comparisonType)\r\n        {\r\n            return str?.IndexOf(value, 0, comparisonType) != -1;\r\n        }\r\n\r\n        public static bool ContainsAny(this string str, char[] chars)\r\n        {\r\n            return str?.IndexOfAny(chars) >= 0;\r\n        }\r\n\r\n        public static bool IsHttpUrl(this string str)\r\n        {\r\n            if (string.IsNullOrWhiteSpace(str))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Regex.IsMatch(str, @\"^https?:\\/\\/\", RegexOptions.IgnoreCase);\r\n        }\r\n\r\n        public static bool IsUri(this string str)\r\n        {\r\n            if (string.IsNullOrWhiteSpace(str))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Uri.IsWellFormedUriString(str, UriKind.Absolute);\r\n        }\r\n\r\n        public static string UrlEncode(this string str)\r\n        {\r\n            if (string.IsNullOrWhiteSpace(str))\r\n            {\r\n                return str;\r\n            }\r\n\r\n            return HttpUtility.UrlPathEncode(str);\r\n        }\r\n\r\n        public static string UrlDecode(this string str)\r\n        {\r\n            if (string.IsNullOrWhiteSpace(str))\r\n            {\r\n                return str;\r\n            }\r\n\r\n            return HttpUtility.UrlDecode(str);\r\n        }\r\n\r\n        public static int GetLineCount(this string str)\r\n        {\r\n            if (str == null)\r\n            {\r\n                return 0;\r\n            }\r\n            else\r\n            {\r\n                return Regex.Matches(str, \"\\n\").Count + 1;\r\n            }\r\n        }\r\n\r\n        // Courtesy of https://stackoverflow.com/questions/6275980/string-replace-ignoring-case\r\n        public static string Replace(this string str, string oldValue, string @newValue, StringComparison comparisonType)\r\n        {\r\n            // Check inputs.\r\n            if (str == null)\r\n            {\r\n                // Same as original .NET C# string.Replace behavior.\r\n                throw new ArgumentNullException(nameof(str));\r\n            }\r\n            if (str.Length == 0)\r\n            {\r\n                // Same as original .NET C# string.Replace behavior.\r\n                return str;\r\n            }\r\n            if (oldValue == null)\r\n            {\r\n                // Same as original .NET C# string.Replace behavior.\r\n                throw new ArgumentNullException(nameof(oldValue));\r\n            }\r\n            if (oldValue.Length == 0)\r\n            {\r\n                // Same as original .NET C# string.Replace behavior.\r\n                throw new ArgumentException(\"String cannot be of zero length.\");\r\n            }\r\n\r\n            // Prepare string builder for storing the processed string.\r\n            // Note: StringBuilder has a better performance than String by 30-40%.\r\n            StringBuilder resultStringBuilder = new StringBuilder(str.Length);\r\n\r\n            // Analyze the replacement: replace or remove.\r\n            bool isReplacementNullOrEmpty = string.IsNullOrEmpty(@newValue);\r\n\r\n            // Replace all values.\r\n            const int valueNotFound = -1;\r\n            int foundAt;\r\n            int startSearchFromIndex = 0;\r\n            while ((foundAt = str.IndexOf(oldValue, startSearchFromIndex, comparisonType)) != valueNotFound)\r\n            {\r\n                // Append all characters until the found replacement.\r\n                int @charsUntilReplacment = foundAt - startSearchFromIndex;\r\n                bool isNothingToAppend = @charsUntilReplacment == 0;\r\n                if (!isNothingToAppend)\r\n                {\r\n                    resultStringBuilder.Append(str, startSearchFromIndex, @charsUntilReplacment);\r\n                }\r\n\r\n                // Process the replacement.\r\n                if (!isReplacementNullOrEmpty)\r\n                {\r\n                    resultStringBuilder.Append(@newValue);\r\n                }\r\n\r\n                // Prepare start index for the next search.\r\n                // This needed to prevent infinite loop, otherwise method always start search\r\n                // from the start of the string. For example: if an oldValue == \"EXAMPLE\", newValue == \"example\"\r\n                // and comparisonType == \"any ignore case\" will conquer to replacing:\r\n                // \"EXAMPLE\" to \"example\" to \"example\" to \"example\" … infinite loop.\r\n                startSearchFromIndex = foundAt + oldValue.Length;\r\n                if (startSearchFromIndex == str.Length)\r\n                {\r\n                    // It is end of the input string: no more space for the next search.\r\n                    // The input string ends with a value that has already been replaced.\r\n                    // Therefore, the string builder with the result is complete and no further action is required.\r\n                    return resultStringBuilder.ToString();\r\n                }\r\n            }\r\n\r\n            // Append the last part to the result.\r\n            int @charsUntilStringEnd = str.Length - startSearchFromIndex;\r\n            resultStringBuilder.Append(str, startSearchFromIndex, @charsUntilStringEnd);\r\n            return resultStringBuilder.ToString();\r\n        }\r\n\r\n        public static string EndWithDirSeparator(this string source)\r\n        {\r\n            if (source.IsNullOrEmpty())\r\n            {\r\n                return source;\r\n            }\r\n\r\n            return source.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar;\r\n        }\r\n\r\n        public static string PrefixWithDirSeparator(this string source)\r\n        {\r\n            if (source.IsNullOrWhiteSpace())\r\n            {\r\n                return source;\r\n            }\r\n\r\n            if (source[0] == Path.DirectorySeparatorChar)\r\n            {\r\n                return source;\r\n            }\r\n\r\n            return Path.DirectorySeparatorChar + source;\r\n        }\r\n\r\n        public static bool ContainsInvariantCulture(this string source, string value, CompareOptions compareOptions)\r\n        {\r\n            return CultureInfo.InvariantCulture.CompareInfo.IndexOf(source, value, compareOptions) >= 0;\r\n        }\r\n\r\n        public static bool ContainsCurrentCulture(this string source, string value, CompareOptions compareOptions)\r\n        {\r\n            return CultureInfo.CurrentCulture.CompareInfo.IndexOf(source, value, compareOptions) >= 0;\r\n        }\r\n\r\n        public static int GetLevenshteinDistanceIgnoreCase(this string source, string value)\r\n        {\r\n            return GetLevenshteinDistance(source, value, charCaseInsensitiveComparer);\r\n        }\r\n\r\n        public static int GetLevenshteinDistance(this string source, string value)\r\n        {\r\n            return GetLevenshteinDistance(source, value, EqualityComparer<char>.Default);\r\n        }\r\n\r\n        //From https://github.com/DanHarltey/Fastenshtein\r\n        /// <summary>\r\n        /// Compares the two values to find the minimum Levenshtein distance.\r\n        /// Thread safe.\r\n        /// </summary>\r\n        /// <returns>Difference. 0 complete match.</returns>\r\n        public static int GetLevenshteinDistance(this string value1, string value2, IEqualityComparer<char> comparer)\r\n        {\r\n            if (value2.Length == 0)\r\n            {\r\n                return value1.Length;\r\n            }\r\n\r\n            int[] costs = new int[value2.Length];\r\n\r\n            // Add indexing for insertion to first row\r\n            for (int i = 0; i < costs.Length;)\r\n            {\r\n                costs[i] = ++i;\r\n            }\r\n\r\n            for (int i = 0; i < value1.Length; i++)\r\n            {\r\n                // cost of the first index\r\n                int cost = i;\r\n                int previousCost = i;\r\n\r\n                // cache value for inner loop to avoid index lookup and bonds checking, profiled this is quicker\r\n                char value1Char = value1[i];\r\n\r\n                for (int j = 0; j < value2.Length; j++)\r\n                {\r\n                    int currentCost = cost;\r\n                    cost = costs[j];\r\n\r\n                    if (!comparer.Equals(value1Char, value2[j]))\r\n                    {\r\n                        if (previousCost < currentCost)\r\n                        {\r\n                            currentCost = previousCost;\r\n                        }\r\n\r\n                        if (cost < currentCost)\r\n                        {\r\n                            currentCost = cost;\r\n                        }\r\n\r\n                        ++currentCost;\r\n                    }\r\n\r\n                    costs[j] = currentCost;\r\n                    previousCost = currentCost;\r\n                }\r\n            }\r\n\r\n            return costs[costs.Length - 1];\r\n        }\r\n\r\n        //Based on https://gist.github.com/ronnieoverby/2aa19724199df4ec8af6\r\n        public static double GetJaroWinklerSimilarityIgnoreCase(this string str, string str2, double winklerWeightThreshold = defaultWinklerWeightThreshold)\r\n        {\r\n            return GetJaroWinklerSimilarity(str, str2, charCaseInsensitiveComparer, winklerWeightThreshold);\r\n        }\r\n\r\n        public static double GetJaroWinklerSimilarity(this string str, string str2, double winklerWeightThreshold = defaultWinklerWeightThreshold)\r\n        {\r\n            return GetJaroWinklerSimilarity(str, str2, EqualityComparer<char>.Default, winklerWeightThreshold);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Returns the Jaro-Winkler similarity between the specified\r\n        /// strings. The distance is symmetric and will fall in the\r\n        /// range 0 (no match) to 1 (perfect match).\r\n        /// </summary>\r\n        /// <param name=\"str\">First String</param>\r\n        /// <param name=\"str2\">Second String</param>\r\n        /// <param name=\"comparer\">Comparer used to determine character equality.</param>\r\n        /// <param name=\"winklerWeightThreshold\">The weight threshold is used to determine whether the similarity score is high enough to consider two strings as a match. Winkler's paper used a default value of 0.7.</param>\r\n        /// <returns>Similarity between the specified strings.</returns>\r\n        public static double GetJaroWinklerSimilarity(this string str, string str2, IEqualityComparer<char> comparer, double winklerWeightThreshold = defaultWinklerWeightThreshold)\r\n        {\r\n            var lLen1 = str.Length;\r\n            var lLen2 = str2.Length;\r\n            if (lLen1 == 0)\r\n            {\r\n                return lLen2 == 0 ? 1.0 : 0.0;\r\n            }\r\n\r\n            var lSearchRange = Math.Max(0, Math.Max(lLen1, lLen2) / 2 - 1);\r\n\r\n            var lMatched1 = new bool[lLen1];\r\n            var lMatched2 = new bool[lLen2];\r\n\r\n            var lNumCommon = 0;\r\n            for (var i = 0; i < lLen1; ++i)\r\n            {\r\n                var lStart = Math.Max(0, i - lSearchRange);\r\n                var lEnd = Math.Min(i + lSearchRange + 1, lLen2);\r\n                for (var j = lStart; j < lEnd; ++j)\r\n                {\r\n                    if (lMatched2[j])\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    if (!comparer.Equals(str[i], str2[j]))\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    lMatched1[i] = true;\r\n                    lMatched2[j] = true;\r\n                    ++lNumCommon;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (lNumCommon == 0)\r\n            {\r\n                return 0.0;\r\n            }\r\n\r\n            var lNumHalfTransposed = 0;\r\n            var k = 0;\r\n            for (var i = 0; i < lLen1; ++i)\r\n            {\r\n                if (!lMatched1[i])\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                while (!lMatched2[k])\r\n                {\r\n                    ++k;\r\n                }\r\n\r\n                if (!comparer.Equals(str[i], str2[k]))\r\n                {\r\n                    ++lNumHalfTransposed;\r\n                }\r\n\r\n                ++k;\r\n            }\r\n\r\n            var lNumTransposed = lNumHalfTransposed / 2;\r\n            double lNumCommonD = lNumCommon;\r\n            var lWeight = (lNumCommonD / lLen1\r\n                            + lNumCommonD / lLen2\r\n                            + (lNumCommon - lNumTransposed) / lNumCommonD) / 3.0;\r\n\r\n            if (lWeight <= winklerWeightThreshold)\r\n            {\r\n                return lWeight;\r\n            }\r\n\r\n            var lMax = Math.Min(winklerNumChars, Math.Min(str.Length, str2.Length));\r\n            var lPos = 0;\r\n            while (lPos < lMax && comparer.Equals(str[lPos], str2[lPos]))\r\n            {\r\n                ++lPos;\r\n            }\r\n\r\n            if (lPos == 0)\r\n            {\r\n                return lWeight;\r\n            }\r\n\r\n            return lWeight + 0.1 * lPos * (1.0 - lWeight);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Extensions/WindowExtensions.cs",
    "content": "﻿using Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Forms;\r\n\r\nnamespace System.Windows\r\n{\r\n    public static class WindowExtensions\r\n    {\r\n        public static ComputerScreen GetScreen(this Window window)\r\n        {\r\n            return Screen.FromPoint(new System.Drawing.Point((int)window.Left, (int)window.Top)).ToComputerScreen();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/FileSystem.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Net;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Security.Cryptography;\r\nusing Playnite.SDK;\r\nusing System.Diagnostics;\r\nusing Playnite.Native;\r\nusing System.Runtime.InteropServices;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public enum FileSystemItem\r\n    {\r\n        File,\r\n        Directory\r\n    }\r\n\r\n    public static partial class FileSystem\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public static void CreateDirectory(string path)\r\n        {\r\n            CreateDirectory(path, false);\r\n        }\r\n\r\n        public static void CreateDirectory(string path, bool clean)\r\n        {\r\n            var directory = Paths.FixPathLength(path);\r\n            if (string.IsNullOrEmpty(directory))\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (Directory.Exists(directory))\r\n            {\r\n                if (clean)\r\n                {\r\n                    DeleteDirectory(directory, true);\r\n                }\r\n                else\r\n                {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            Directory.CreateDirectory(directory);\r\n        }\r\n\r\n        public static void PrepareSaveFile(string path)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            CreateDirectory(Path.GetDirectoryName(path));\r\n            if (File.Exists(path))\r\n            {\r\n                File.Delete(path);\r\n            }\r\n        }\r\n\r\n        public static bool IsDirectoryEmpty(string path)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            if (Directory.Exists(path))\r\n            {\r\n                return !Directory.EnumerateFileSystemEntries(path).Any();\r\n            }\r\n            else\r\n            {\r\n                return true;\r\n            }\r\n        }\r\n\r\n        public static void DeleteFile(string path)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            if (File.Exists(path))\r\n            {\r\n                File.Delete(path);\r\n            }\r\n        }\r\n\r\n        public static void CreateFile(string path)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            FileSystem.PrepareSaveFile(path);\r\n            File.Create(path).Dispose();\r\n        }\r\n\r\n        public static void CopyFile(string sourcePath, string targetPath, bool overwrite = true)\r\n        {\r\n            sourcePath = Paths.FixPathLength(sourcePath);\r\n            targetPath = Paths.FixPathLength(targetPath);\r\n            logger.Debug($\"Copying file {sourcePath} to {targetPath}\");\r\n            PrepareSaveFile(targetPath);\r\n            File.Copy(sourcePath, targetPath, overwrite);\r\n        }\r\n\r\n        public static void DeleteDirectory(string path)\r\n        {\r\n            path = Paths.FixPathLength(path, true); // we need to force prefix because otherwise recursive delete will fail if some nested path is too long\r\n            if (Directory.Exists(path))\r\n            {\r\n                Directory.Delete(path, true);\r\n            }\r\n        }\r\n\r\n        public static void DeleteDirectory(string path, bool includeReadonly)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            if (!Directory.Exists(path))\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (includeReadonly)\r\n            {\r\n                foreach (var s in Directory.GetDirectories(path))\r\n                {\r\n                    DeleteDirectory(s, true);\r\n                }\r\n\r\n                foreach (var f in Directory.GetFiles(path))\r\n                {\r\n                    var file = Paths.FixPathLength(f);\r\n                    var attr = File.GetAttributes(file);\r\n                    if ((attr & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)\r\n                    {\r\n                        File.SetAttributes(file, attr ^ FileAttributes.ReadOnly);\r\n                    }\r\n\r\n                    File.Delete(file);\r\n                }\r\n\r\n                var dirAttr = File.GetAttributes(path);\r\n                if ((dirAttr & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)\r\n                {\r\n                    File.SetAttributes(path, dirAttr ^ FileAttributes.ReadOnly);\r\n                }\r\n\r\n                Directory.Delete(path, false);\r\n            }\r\n            else\r\n            {\r\n                DeleteDirectory(path);\r\n            }\r\n        }\r\n\r\n        public static bool CanWriteToFolder(string folder)\r\n        {\r\n            folder = Paths.FixPathLength(folder);\r\n            try\r\n            {\r\n                if (!Directory.Exists(folder))\r\n                {\r\n                    Directory.CreateDirectory(folder);\r\n                }\r\n\r\n                using (var stream = File.Create(Path.Combine(folder, Path.GetRandomFileName()), 1, FileOptions.DeleteOnClose))\r\n                {\r\n                }\r\n\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static string ReadFileAsStringSafe(string path, int retryAttempts = 5)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            IOException ioException = null;\r\n            for (int i = 0; i < retryAttempts; i++)\r\n            {\r\n                try\r\n                {\r\n                    return File.ReadAllText(path);\r\n                }\r\n                catch (IOException exc)\r\n                {\r\n                    logger.Debug($\"Can't read from file, trying again. {path}\");\r\n                    ioException = exc;\r\n                    Task.Delay(500).Wait();\r\n                }\r\n            }\r\n\r\n            throw new IOException($\"Failed to read {path}\", ioException);\r\n        }\r\n\r\n        public static byte[] ReadFileAsBytesSafe(string path, int retryAttempts = 5)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            IOException ioException = null;\r\n            for (int i = 0; i < retryAttempts; i++)\r\n            {\r\n                try\r\n                {\r\n                    return File.ReadAllBytes(path);\r\n                }\r\n                catch (IOException exc)\r\n                {\r\n                    logger.Debug($\"Can't read from file, trying again. {path}\");\r\n                    ioException = exc;\r\n                    Task.Delay(500).Wait();\r\n                }\r\n            }\r\n\r\n            throw new IOException($\"Failed to read {path}\", ioException);\r\n        }\r\n\r\n        public static Stream CreateWriteFileStreamSafe(string path, int retryAttempts = 5)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            IOException ioException = null;\r\n            for (int i = 0; i < retryAttempts; i++)\r\n            {\r\n                try\r\n                {\r\n                    return new FileStream(path, FileMode.Create, FileAccess.ReadWrite);\r\n                }\r\n                catch (IOException exc)\r\n                {\r\n                    logger.Debug($\"Can't open write file stream, trying again. {path}\");\r\n                    ioException = exc;\r\n                    Task.Delay(500).Wait();\r\n                }\r\n            }\r\n\r\n            throw new IOException($\"Failed to read {path}\", ioException);\r\n        }\r\n\r\n        public static Stream OpenReadFileStreamSafe(string path, int retryAttempts = 5)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            IOException ioException = null;\r\n            for (int i = 0; i < retryAttempts; i++)\r\n            {\r\n                try\r\n                {\r\n                    return new FileStream(path, FileMode.Open, FileAccess.Read);\r\n                }\r\n                catch (IOException exc)\r\n                {\r\n                    logger.Debug($\"Can't open read file stream, trying again. {path}\");\r\n                    ioException = exc;\r\n                    Task.Delay(500).Wait();\r\n                }\r\n            }\r\n\r\n            throw new IOException($\"Failed to read {path}\", ioException);\r\n        }\r\n\r\n        public static void WriteStringToFile(string path, string content)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            PrepareSaveFile(path);\r\n            File.WriteAllText(path, content);\r\n        }\r\n\r\n        public static string ReadStringFromFile(string path)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            return File.ReadAllText(path);\r\n        }\r\n\r\n        public static void WriteStringToFileSafe(string path, string content, int retryAttempts = 5)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            IOException ioException = null;\r\n            for (int i = 0; i < retryAttempts; i++)\r\n            {\r\n                try\r\n                {\r\n                    PrepareSaveFile(path);\r\n                    File.WriteAllText(path, content);\r\n                    return;\r\n                }\r\n                catch (IOException exc)\r\n                {\r\n                    logger.Debug($\"Can't write to a file, trying again. {path}\");\r\n                    ioException = exc;\r\n                    Task.Delay(500).Wait();\r\n                }\r\n            }\r\n\r\n            throw new IOException($\"Failed to write to {path}\", ioException);\r\n        }\r\n\r\n        public static void DeleteFileSafe(string path, int retryAttempts = 5)\r\n        {\r\n            if (!File.Exists(path))\r\n            {\r\n                return;\r\n            }\r\n\r\n            IOException ioException = null;\r\n            for (int i = 0; i < retryAttempts; i++)\r\n            {\r\n                try\r\n                {\r\n                    File.Delete(path);\r\n                    return;\r\n                }\r\n                catch (IOException exc)\r\n                {\r\n                    logger.Debug($\"Can't detele file, trying again. {path}\");\r\n                    ioException = exc;\r\n                    Task.Delay(500).Wait();\r\n                }\r\n                catch (UnauthorizedAccessException exc)\r\n                {\r\n                    logger.Error(exc, $\"Can't detele file, UnauthorizedAccessException. {path}\");\r\n                    return;\r\n                }\r\n            }\r\n\r\n            throw new IOException($\"Failed to delete {path}\", ioException);\r\n        }\r\n\r\n        public static long GetFreeSpace(string drivePath)\r\n        {\r\n            var root = Path.GetPathRoot(drivePath);\r\n            var drive = DriveInfo.GetDrives().FirstOrDefault(a => a.RootDirectory.FullName.Equals(root, StringComparison.OrdinalIgnoreCase)); ;\r\n            if (drive != null)\r\n            {\r\n                return drive.AvailableFreeSpace;\r\n            }\r\n            else\r\n            {\r\n                return 0;\r\n            }\r\n        }\r\n\r\n        public static long GetFileSize(string path)\r\n        {\r\n            path = Paths.FixPathLength(path);\r\n            return GetFileSize(new FileInfo(path));\r\n        }\r\n\r\n        public static long GetFileSize(FileInfo fi)\r\n        {\r\n            return fi.Length;\r\n        }\r\n\r\n        public static long GetDirectorySize(string path, bool getSizeOnDisk)\r\n        {\r\n            return GetDirectorySize(new DirectoryInfo(Paths.FixPathLength(path)), getSizeOnDisk);\r\n        }\r\n\r\n        private static long GetDirectorySize(DirectoryInfo dirInfo, bool getSizeOnDisk)\r\n        {\r\n            long size = 0;\r\n            try\r\n            {\r\n                foreach (FileInfo fileInfo in dirInfo.GetFiles())\r\n                {\r\n                    size += getSizeOnDisk ? GetFileSizeOnDisk(fileInfo) : GetFileSize(fileInfo);\r\n                }\r\n            }\r\n            catch (DirectoryNotFoundException)\r\n            {\r\n                // Directory not being found here means that directory is a symlink\r\n                // with an invalid target path.\r\n                // TODO Rework with proper symlinks handling with FileSystemInfo.ResolveLinkTarget\r\n                // method after Net runtime upgrade\r\n                return size;\r\n            }\r\n\r\n            foreach (DirectoryInfo subdirInfo in dirInfo.GetDirectories())\r\n            {\r\n                if (!IsDirectorySubdirSafeToRecurse(subdirInfo))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                size += GetDirectorySize(subdirInfo.FullName, getSizeOnDisk);\r\n            }\r\n\r\n            return size;\r\n        }\r\n\r\n        public static long GetFileSizeOnDisk(string path)\r\n        {\r\n            return GetFileSizeOnDisk(new FileInfo(Paths.FixPathLength(path)));\r\n        }\r\n\r\n        public static long GetFileSizeOnDisk(FileInfo fileInfo)\r\n        {\r\n            // Method will fail if file is a symlink that has a target\r\n            // that does not exist. To avoid, we can check its lenght before continuing\r\n            if (fileInfo.Length == 0)\r\n            {\r\n                return 0;\r\n            }\r\n\r\n            // Method will fail when checking a file that's not valid on Windows,\r\n            // for example files used by Proton containing a colon (:).\r\n            // 'Directory' will be null when encountering such a file.\r\n            if (fileInfo.Directory is null)\r\n            {\r\n                return 0;\r\n            }\r\n\r\n            // From https://stackoverflow.com/a/3751135\r\n            int result = Kernel32.GetDiskFreeSpaceW(fileInfo.Directory.Root.FullName, out uint sectorsPerCluster, out uint bytesPerSector, out _, out _);\r\n            if (result == 0)\r\n            {\r\n                throw new System.ComponentModel.Win32Exception();\r\n            }\r\n\r\n            uint clusterSize = sectorsPerCluster * bytesPerSector;\r\n            uint losize = Kernel32.GetCompressedFileSizeW(Paths.FixPathLength(fileInfo.FullName), out uint hosize);\r\n            int error = Marshal.GetLastWin32Error();\r\n            if (losize == 0xFFFFFFFF && error != 0)\r\n            {\r\n                throw new System.ComponentModel.Win32Exception(error);\r\n            }\r\n\r\n            var size = (long)hosize << 32 | losize;\r\n            return ((size + clusterSize - 1) / clusterSize) * clusterSize;\r\n        }\r\n\r\n        private static bool IsDirectorySubdirSafeToRecurse(DirectoryInfo childDirectory)\r\n        {\r\n            // Whitespace characters can cause confusion in methods, causing them to process\r\n            // the parent directory instead and causing an infinite loop\r\n            if (childDirectory.Name.IsNullOrWhiteSpace())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        public static void CopyDirectory(string sourceDirName, string destDirName, bool copySubDirs = true, bool overwrite = true)\r\n        {\r\n            sourceDirName = Paths.FixPathLength(sourceDirName);\r\n            destDirName = Paths.FixPathLength(destDirName);\r\n            var dir = new DirectoryInfo(sourceDirName);\r\n            if (!dir.Exists)\r\n            {\r\n                throw new DirectoryNotFoundException(\r\n                    \"Source directory does not exist or could not be found: \"\r\n                    + sourceDirName);\r\n            }\r\n\r\n            var dirs = dir.GetDirectories();\r\n            if (!Directory.Exists(destDirName))\r\n            {\r\n                Directory.CreateDirectory(destDirName);\r\n            }\r\n\r\n            var files = dir.GetFiles();\r\n            foreach (FileInfo file in files)\r\n            {\r\n                string temppath = Path.Combine(destDirName, file.Name);\r\n                file.CopyTo(temppath, overwrite);\r\n            }\r\n\r\n            if (copySubDirs)\r\n            {\r\n                foreach (DirectoryInfo subdir in dirs)\r\n                {\r\n                    string temppath = Path.Combine(destDirName, subdir.Name);\r\n                    CopyDirectory(subdir.FullName, temppath, copySubDirs);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static bool FileExistsOnAnyDrive(string filePath, out string existringPath)\r\n        {\r\n            return PathExistsOnAnyDrive(filePath, path => File.Exists(path), out existringPath);\r\n        }\r\n\r\n        public static bool DirectoryExistsOnAnyDrive(string directoryPath, out string existringPath)\r\n        {\r\n            return PathExistsOnAnyDrive(directoryPath, path => Directory.Exists(path), out existringPath);\r\n        }\r\n\r\n        private static bool PathExistsOnAnyDrive(string originalPath, Predicate<string> predicate, out string existringPath)\r\n        {\r\n            originalPath = Paths.FixPathLength(originalPath);\r\n            existringPath = null;\r\n            try\r\n            {\r\n                if (predicate(originalPath))\r\n                {\r\n                    existringPath = originalPath;\r\n                    return true;\r\n                }\r\n\r\n                if (!Paths.IsFullPath(originalPath))\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                var rootPath = Path.GetPathRoot(originalPath);\r\n                var availableDrives = DriveInfo.GetDrives().Where(d => d.IsReady);\r\n                foreach (var drive in availableDrives)\r\n                {\r\n                    var pathWithoutDrive = originalPath.Substring(drive.Name.Length);\r\n                    var newPath = Path.Combine(drive.Name, pathWithoutDrive);\r\n                    if (predicate(newPath))\r\n                    {\r\n                        existringPath = newPath;\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n            catch (Exception ex) when (!Debugger.IsAttached)\r\n            {\r\n                logger.Error(ex, $\"Error checking if path exists on different drive \\\"{originalPath}\\\"\");\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public static bool DirectoryExists(string path)\r\n        {\r\n            return Directory.Exists(Paths.FixPathLength(path));\r\n        }\r\n\r\n        public static bool FileExists(string path)\r\n        {\r\n            return File.Exists(Paths.FixPathLength(path));\r\n        }\r\n\r\n        public static DateTime DirectoryGetLastWriteTime(string path)\r\n        {\r\n            return Directory.GetLastWriteTime(Paths.FixPathLength(path));\r\n        }\r\n\r\n        public static DateTime FileGetLastWriteTime(string path)\r\n        {\r\n            return File.GetLastWriteTime(Paths.FixPathLength(path));\r\n        }\r\n\r\n        public static void ReplaceStringInFile(string path, string oldValue, string newValue, Encoding encoding = null)\r\n        {\r\n            encoding = encoding ?? Encoding.UTF8;\r\n            var fileContent = File.ReadAllText(path, encoding);\r\n            File.WriteAllText(path, fileContent.Replace(oldValue, newValue), encoding);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/FileSystem_Checksum.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Net;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Security.Cryptography;\r\nusing Playnite.SDK;\r\nusing System.Diagnostics;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public static partial class FileSystem\r\n    {\r\n        public static string GetCRC32(Stream stream)\r\n        {\r\n            uint crc = 0;\r\n            var buffer = new byte[4096];\r\n            int bytesRead;\r\n            while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)\r\n            {\r\n                crc = Force.Crc32.Crc32Algorithm.Append(crc, buffer, 0, bytesRead);\r\n            }\r\n\r\n            return string.Format(\"{0:X8}\", crc);\r\n        }\r\n\r\n        public static string GetCRC32(string filePath)\r\n        {\r\n            using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))\r\n            {\r\n                return GetCRC32(stream);\r\n            }\r\n        }\r\n\r\n        public static string GetMD5(Stream stream)\r\n        {\r\n            using (var md5 = MD5.Create())\r\n            {\r\n                return BitConverter.ToString(md5.ComputeHash(stream)).Replace(\"-\", \"\");\r\n            }\r\n        }\r\n\r\n        public static string GetMD5(string filePath)\r\n        {\r\n            using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))\r\n            {\r\n                return GetMD5(stream);\r\n            }\r\n        }\r\n\r\n        public static bool AreFileContentsEqual(string path1, string path2)\r\n        {\r\n            var info1 = new FileInfo(path1);\r\n            var info2 = new FileInfo(path2);\r\n            if (info1.Length != info2.Length)\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                if (GetMD5(path1) == GetMD5(path2))\r\n                {\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/GdiFile.cs",
    "content": "﻿using Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    // gdi media descriptor file used mostly in Dreamcast dumps\r\n    public class GdiFile\r\n    {\r\n        public class GdiEntry\r\n        {\r\n            public string Path { get; set; }\r\n\r\n            public GdiEntry(string path)\r\n            {\r\n                Path = path;\r\n            }\r\n\r\n            public override string ToString()\r\n            {\r\n                return Path ?? base.ToString();\r\n            }\r\n        }\r\n\r\n        public static List<GdiEntry> GetEntries(string filePath)\r\n        {\r\n            var entries = new List<GdiEntry>();\r\n            filePath = Paths.FixPathLength(filePath);\r\n            // Apparently there are some scuffed \"big\" gdi files, no idea what they are,\r\n            // but to be sure lets ignore files larged than 10kB\r\n            if (new FileInfo(filePath).Length > 10240)\r\n            {\r\n                return entries;\r\n            }\r\n\r\n            foreach (var line in File.ReadAllLines(filePath).Skip(1))\r\n            {\r\n                var match = Regex.Match(line, @\"^\\d+\\s+\\d+\\s+\\d+\\s+\\d+\\s+(.+)\\s+\\d+$\");\r\n                if (!match.Success)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                entries.Add(new GdiEntry(match.Groups[1].Value.Trim('\"')));\r\n            }\r\n\r\n            return entries;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/GlobalRandom.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class GlobalRandom\r\n    {\r\n        private static readonly Random generator = new Random();\r\n\r\n        public static int Next()\r\n        {\r\n            return generator.Next();\r\n        }\r\n\r\n        public static int Next(int minValue, int maxValue)\r\n        {\r\n            return generator.Next(minValue, maxValue);\r\n        }\r\n\r\n        public static int Next(int maxValue)\r\n        {\r\n            return generator.Next(maxValue);\r\n        }\r\n\r\n        public static void NextBytes(byte[] buffer)\r\n        {\r\n            generator.NextBytes(buffer);\r\n        }\r\n\r\n        public static double NextDouble()\r\n        {\r\n            return generator.NextDouble();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Images.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Media;\r\nusing System.IO;\r\nusing Playnite.SDK;\r\nusing Playnite.Common.Media.Icons;\r\nusing System.Drawing.Imaging;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class ImageProperties\r\n    {\r\n        public int Height { get; set; }\r\n        public int Width { get; set; }\r\n    }\r\n\r\n    public class Images\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        public static Image GetImageFromResource(string path, string assemblyName, BitmapScalingMode scaling = BitmapScalingMode.HighQuality, double height = 16, double width = 16)\r\n        {\r\n            var image = new Image()\r\n            {\r\n                Source = new BitmapImage(new Uri($\"pack://application:,,,/{assemblyName};component/\" + path, UriKind.Absolute)),\r\n                Height = height,\r\n                Width = width\r\n            };\r\n\r\n            RenderOptions.SetBitmapScalingMode(image, scaling);\r\n            return image;\r\n        }\r\n\r\n        public static Image GetImageFromFile(string path, BitmapScalingMode scaling = BitmapScalingMode.HighQuality, double height = 16, double width = 16)\r\n        {\r\n            var image = new Image()\r\n            {\r\n                Source = System.Drawing.Imaging.BitmapExtensions.BitmapFromFile(path),\r\n                Height = height,\r\n                Width = width\r\n            };\r\n\r\n            RenderOptions.SetBitmapScalingMode(image, scaling);\r\n            return image;\r\n        }\r\n\r\n        public static Image GetEmptyImage(double height = 16, double width = 16)\r\n        {\r\n            return new Image()\r\n            {\r\n                Height = height,\r\n                Width = width\r\n            };\r\n        }\r\n\r\n        public static ImageProperties GetImageProperties(string imagePath)\r\n        {\r\n            try\r\n            {\r\n                using (var stream = new FileStream(imagePath, FileMode.Open, FileAccess.Read, FileShare.Read))\r\n                {\r\n                    return GetImageProperties(stream);\r\n                }\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, $\"Failed to load image properties from file {imagePath}\");\r\n                return new ImageProperties();\r\n            }\r\n        }\r\n\r\n        public static ImageProperties GetImageProperties(Stream imageStream)\r\n        {\r\n            try\r\n            {\r\n                var decoder = BitmapDecoder.Create(imageStream, BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.Default);\r\n                if (decoder.Frames.HasItems())\r\n                {\r\n                    return new ImageProperties\r\n                    {\r\n                        Height = decoder.Frames.Max(a => a.PixelHeight),\r\n                        Width = decoder.Frames.Max(a => a.PixelWidth),\r\n                    };\r\n                }\r\n                else\r\n                {\r\n                    logger.Warn(\"Images stream has no frames.\");\r\n                    return new ImageProperties();\r\n                }\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to load image properties from stream.\");\r\n                return new ImageProperties();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts file to an image file.\r\n        /// </summary>\r\n        /// <param name=\"imagePath\"></param>\r\n        /// <param name=\"outFileRoot\">Resulting file name without extension.</param>\r\n        /// <returns>File path to converted image if conversion was successful or original path if file is alreadny an image.</returns>\r\n        public static string ConvertToCompatibleFormat(string imagePath, string outFileRoot)\r\n        {\r\n            if (imagePath.IsNullOrEmpty() || !File.Exists(imagePath))\r\n            {\r\n                return null;\r\n            }\r\n\r\n            FileSystem.CreateDirectory(Path.GetDirectoryName(outFileRoot));\r\n            if (imagePath.EndsWith(\".exe\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                var icoPath = outFileRoot + \".ico\";\r\n                if (IconExtractor.ExtractMainIconFromFile(imagePath, icoPath))\r\n                {\r\n                    return icoPath;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n            else if (imagePath.EndsWith(\".tga\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                var pngPath = outFileRoot + \".png\";\r\n                try\r\n                {\r\n                    File.WriteAllBytes(pngPath, BitmapExtensions.TgaToBitmap(imagePath).ToPngArray());\r\n                    return pngPath;\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to covert {imagePath} to png.\");\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            return imagePath;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/IniParser.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class IniSection\r\n    {\r\n        public string Name { get; }\r\n        public List<IniItem> Items { get; } = new List<IniItem>();\r\n\r\n        public string this[string itemName]\r\n        {\r\n            get\r\n            {\r\n                return Items.FirstOrDefault(a => a.Name == itemName)?.Value;\r\n            }\r\n\r\n            set\r\n            {\r\n                new NotImplementedException();\r\n            }\r\n        }\r\n\r\n        public IniSection(string name)\r\n        {\r\n            if (string.IsNullOrEmpty(name)) new ArgumentNullException(nameof(name));\r\n            Name = name;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n\r\n    public class IniItem\r\n    {\r\n        public string Name { get; }\r\n        public string Value { get; }\r\n\r\n        public IniItem(string name, string value)\r\n        {\r\n            if (string.IsNullOrEmpty(name)) new ArgumentNullException(nameof(name));\r\n            Name = name;\r\n            Value = value;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n\r\n    public class IniData\r\n    {\r\n        public List<IniSection> Sections { get; } = new List<IniSection>();\r\n\r\n        public IniSection this[string sectionName]\r\n        {\r\n            get\r\n            {\r\n                return Sections.FirstOrDefault(a => a.Name == sectionName);\r\n            }\r\n\r\n            set\r\n            {\r\n                new NotImplementedException();\r\n            }\r\n        }\r\n    }\r\n\r\n    public class IniParser\r\n    {\r\n        public static IniData Parse(string[] iniString)\r\n        {            \r\n            if (iniString?.Any() != true)\r\n            {\r\n                throw new ArgumentNullException();\r\n            }\r\n\r\n            var data = new IniData();\r\n            IniSection curSection = null;\r\n            foreach (var line in iniString)\r\n            {\r\n                if (string.IsNullOrWhiteSpace(line))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                // Comment\r\n                if (line.TrimStart().StartsWith(\";\"))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                // Section\r\n                var sectionMatch = Regex.Match(line.Trim(), @\"^\\[(.+)\\]$\");\r\n                if (sectionMatch.Success)\r\n                {\r\n                    curSection = new IniSection(sectionMatch.Groups[1].Value);\r\n                    data.Sections.Add(curSection);\r\n                    continue;\r\n                }\r\n\r\n                // Section item\r\n                var valueMatch = Regex.Match(line.Trim(), @\"^(.+)=(.*)$\");\r\n                if (valueMatch.Success)\r\n                {\r\n                    if (curSection != null)\r\n                    {\r\n                        curSection.Items.Add(new IniItem(valueMatch.Groups[1].Value, valueMatch.Groups[2].Value));\r\n                    }\r\n                }\r\n            }\r\n\r\n            return data;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/ItemsSource.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class ItemsSource\r\n    {\r\n        public class EnumItem\r\n        {\r\n            public string Name { get; set; }\r\n            public Enum Value { get; set; }\r\n\r\n            public EnumItem(string name, Enum value)\r\n            {\r\n                Name = name;\r\n                Value = value;\r\n            }\r\n\r\n            public override string ToString()\r\n            {\r\n                return Name;\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<EnumItem> GetEnumSources(Type enumType)\r\n        {\r\n            foreach (Enum type in Enum.GetValues(enumType))\r\n            {\r\n                yield return new EnumItem(type.GetDescription(), type);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/M3U.cs",
    "content": "﻿using Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class M3U\r\n    {\r\n        public class M3UEntry\r\n        {\r\n            public Dictionary<string, string> Extensions { get; set; } = new Dictionary<string, string>();\r\n            public string Path { get; set; }\r\n\r\n            public override string ToString()\r\n            {\r\n                return Path ?? base.ToString();\r\n            }\r\n        }\r\n\r\n        public static List<M3UEntry> GetEntries(string filePath)\r\n        {\r\n            var entries = new List<M3UEntry>();\r\n            var currentEntry = new M3UEntry();\r\n            foreach (var line in File.ReadAllLines(Paths.FixPathLength(filePath)))\r\n            {\r\n                if (line.IsNullOrWhiteSpace() || line == \"#EXTM3U\")\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (line.StartsWith(\"#\"))\r\n                {\r\n                    var sep = line.IndexOf(':');\r\n                    currentEntry.Extensions.AddOrUpdate(line.Substring(0, sep), line.Substring(sep + 1));\r\n                }\r\n                else\r\n                {\r\n                    currentEntry.Path = line;\r\n                    entries.Add(currentEntry);\r\n                    currentEntry = new M3UEntry();\r\n                }\r\n            }\r\n\r\n            return entries;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/MarkupConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class MarkupConverter : SDK.Data.IMarkupConverter\r\n    {\r\n        public string MarkdownToHtml(string markdown)\r\n        {\r\n            return Markdig.Markdown.ToHtml(markdown);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Media/Icons/IconExtractor.cs",
    "content": "﻿/*\r\n *  IconExtractor/IconUtil for .NET\r\n *  Copyright (C) 2014 Tsuda Kageyu. All rights reserved.\r\n *\r\n *  Redistribution and use in source and binary forms, with or without\r\n *  modification, are permitted provided that the following conditions\r\n *  are met:\r\n *\r\n *   1. Redistributions of source code must retain the above copyright\r\n *      notice, this list of conditions and the following disclaimer.\r\n *   2. Redistributions in binary form must reproduce the above copyright\r\n *      notice, this list of conditions and the following disclaimer in the\r\n *      documentation and/or other materials provided with the distribution.\r\n *\r\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\r\n *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\r\n *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\r\n *  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r\n *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\r\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nusing Playnite.SDK;\r\nusing Playnite.Native;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.IO;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\n\r\nnamespace Playnite.Common.Media.Icons\r\n{\r\n    public class IconExtractor\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public static bool ExtractMainIconFromFile(string exePath, string outPath)\r\n        {\r\n            try\r\n            {\r\n                var extractor = new IconExtractor(exePath);\r\n                if (extractor.Count == 0)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                var ico = extractor.GetIcon(0);\r\n                try\r\n                {\r\n                    FileSystem.PrepareSaveFile(outPath);\r\n                    using (var fs = File.OpenWrite(outPath))\r\n                    {\r\n                        ico.Save(fs);\r\n                    }\r\n\r\n                    return true;\r\n                }\r\n                finally\r\n                {\r\n                    ico.Dispose();\r\n                }\r\n            }\r\n            catch (Exception e)// when (false)\r\n            {\r\n                logger.Error(e, $\"Failed to extract icon from {exePath}.\");\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool ExtractMainIconFromFile(string exePath, Stream outStream)\r\n        {\r\n            try\r\n            {\r\n                var extractor = new IconExtractor(exePath);\r\n                if (extractor.Count == 0)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                var ico = extractor.GetIcon(0);\r\n                try\r\n                {\r\n                    ico.Save(outStream);\r\n                    return true;\r\n                }\r\n                finally\r\n                {\r\n                    ico.Dispose();\r\n                }\r\n            }\r\n            catch (Exception e)// when (false)\r\n            {\r\n                logger.Error(e, $\"Failed to extract icon from {exePath}.\");\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static Icon ExtractMainIconFromFile(string exePath)\r\n        {\r\n            try\r\n            {\r\n                var extractor = new IconExtractor(exePath);\r\n                if (extractor.Count == 0)\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                return extractor.GetIcon(0);\r\n            }\r\n            catch (Exception e)// when (false)\r\n            {\r\n                logger.Error(e, $\"Failed to extract icon from {exePath}.\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        ////////////////////////////////////////////////////////////////////////\r\n        // Constants\r\n\r\n        // Flags for LoadLibraryEx().\r\n\r\n        private const uint LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020;\r\n\r\n        // Resource types for EnumResourceNames().\r\n\r\n        private readonly static IntPtr RT_ICON = (IntPtr)3;\r\n        private readonly static IntPtr RT_GROUP_ICON = (IntPtr)14;\r\n\r\n        private const int MAX_PATH = 260;\r\n\r\n        ////////////////////////////////////////////////////////////////////////\r\n        // Fields\r\n\r\n        private byte[][] iconData = null;   // Binary data of each icon.\r\n\r\n        ////////////////////////////////////////////////////////////////////////\r\n        // Public properties\r\n\r\n        /// <summary>\r\n        /// Gets the full path of the associated file.\r\n        /// </summary>\r\n        public string FileName\r\n        {\r\n            get;\r\n            private set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets the count of the icons in the associated file.\r\n        /// </summary>\r\n        public int Count\r\n        {\r\n            get { return iconData.Length; }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Initializes a new instance of the IconExtractor class from the specified file name.\r\n        /// </summary>\r\n        /// <param name=\"fileName\">The file to extract icons from.</param>\r\n        public IconExtractor(string fileName)\r\n        {\r\n            Initialize(fileName);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Extracts an icon from the file.\r\n        /// </summary>\r\n        /// <param name=\"index\">Zero based index of the icon to be extracted.</param>\r\n        /// <returns>A System.Drawing.Icon object.</returns>\r\n        /// <remarks>Always returns new copy of the Icon. It should be disposed by the user.</remarks>\r\n        public Icon GetIcon(int index)\r\n        {\r\n            if (index < 0 || Count <= index)\r\n                throw new ArgumentOutOfRangeException(\"index\");\r\n\r\n            // Create an Icon based on a .ico file in memory.\r\n\r\n            using (var ms = new MemoryStream(iconData[index]))\r\n            {\r\n                return new Icon(ms);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Extracts all the icons from the file.\r\n        /// </summary>\r\n        /// <returns>An array of System.Drawing.Icon objects.</returns>\r\n        /// <remarks>Always returns new copies of the Icons. They should be disposed by the user.</remarks>\r\n        public Icon[] GetAllIcons()\r\n        {\r\n            var icons = new List<Icon>();\r\n            for (int i = 0; i < Count; ++i)\r\n                icons.Add(GetIcon(i));\r\n\r\n            return icons.ToArray();\r\n        }\r\n\r\n        private void Initialize(string fileName)\r\n        {\r\n            if (fileName == null)\r\n                throw new ArgumentNullException(\"fileName\");\r\n\r\n            IntPtr hModule = IntPtr.Zero;\r\n            try\r\n            {\r\n                hModule = Kernel32.LoadLibraryEx(fileName, IntPtr.Zero, LOAD_LIBRARY_AS_IMAGE_RESOURCE);\r\n                if (hModule == IntPtr.Zero)\r\n                    throw new Win32Exception();\r\n\r\n                FileName = GetFileName(hModule);\r\n\r\n                // Enumerate the icon resource and build .ico files in memory.\r\n\r\n                var tmpData = new List<byte[]>();\r\n\r\n                ENUMRESNAMEPROC callback = (h, t, name, l) =>\r\n                {\r\n                    // Refer the following URL for the data structures used here:\r\n                    // http://msdn.microsoft.com/en-us/library/ms997538.aspx\r\n\r\n                    // RT_GROUP_ICON resource consists of a GRPICONDIR and GRPICONDIRENTRY's.\r\n\r\n                    var dir = GetDataFromResource(hModule, RT_GROUP_ICON, name);\r\n\r\n                    // Calculate the size of an entire .icon file.\r\n\r\n                    int count = BitConverter.ToUInt16(dir, 4);  // GRPICONDIR.idCount\r\n                    int len = 6 + 16 * count;                   // sizeof(ICONDIR) + sizeof(ICONDIRENTRY) * count\r\n                    for (int i = 0; i < count; ++i)\r\n                        len += BitConverter.ToInt32(dir, 6 + 14 * i + 8);   // GRPICONDIRENTRY.dwBytesInRes\r\n\r\n                    using (var dst = new BinaryWriter(new MemoryStream(len)))\r\n                    {\r\n                        // Copy GRPICONDIR to ICONDIR.\r\n\r\n                        dst.Write(dir, 0, 6);\r\n\r\n                        int picOffset = 6 + 16 * count; // sizeof(ICONDIR) + sizeof(ICONDIRENTRY) * count\r\n\r\n                        for (int i = 0; i < count; ++i)\r\n                        {\r\n                            // Load the picture.\r\n\r\n                            ushort id = BitConverter.ToUInt16(dir, 6 + 14 * i + 12);    // GRPICONDIRENTRY.nID\r\n                            var pic = GetDataFromResource(hModule, RT_ICON, (IntPtr)id);\r\n\r\n                            // Copy GRPICONDIRENTRY to ICONDIRENTRY.\r\n\r\n                            dst.Seek(6 + 16 * i, SeekOrigin.Begin);\r\n\r\n                            dst.Write(dir, 6 + 14 * i, 8);  // First 8bytes are identical.\r\n                            dst.Write(pic.Length);          // ICONDIRENTRY.dwBytesInRes\r\n                            dst.Write(picOffset);           // ICONDIRENTRY.dwImageOffset\r\n\r\n                            // Copy a picture.\r\n\r\n                            dst.Seek(picOffset, SeekOrigin.Begin);\r\n                            dst.Write(pic, 0, pic.Length);\r\n\r\n                            picOffset += pic.Length;\r\n                        }\r\n\r\n                        tmpData.Add(((MemoryStream)dst.BaseStream).ToArray());\r\n                    }\r\n\r\n                    return true;\r\n                };\r\n                Kernel32.EnumResourceNames(hModule, RT_GROUP_ICON, callback, IntPtr.Zero);\r\n\r\n                iconData = tmpData.ToArray();\r\n            }\r\n            finally\r\n            {\r\n                if (hModule != IntPtr.Zero)\r\n                    Kernel32.FreeLibrary(hModule);\r\n            }\r\n        }\r\n\r\n        private byte[] GetDataFromResource(IntPtr hModule, IntPtr type, IntPtr name)\r\n        {\r\n            // Load the binary data from the specified resource.\r\n\r\n            IntPtr hResInfo = Kernel32.FindResource(hModule, name, type);\r\n            if (hResInfo == IntPtr.Zero)\r\n                throw new Win32Exception();\r\n\r\n            IntPtr hResData = Kernel32.LoadResource(hModule, hResInfo);\r\n            if (hResData == IntPtr.Zero)\r\n                throw new Win32Exception();\r\n\r\n            IntPtr pResData = Kernel32.LockResource(hResData);\r\n            if (pResData == IntPtr.Zero)\r\n                throw new Win32Exception();\r\n\r\n            uint size = Kernel32.SizeofResource(hModule, hResInfo);\r\n            if (size == 0)\r\n                throw new Win32Exception();\r\n\r\n            byte[] buf = new byte[size];\r\n            Marshal.Copy(pResData, buf, 0, buf.Length);\r\n\r\n            return buf;\r\n        }\r\n\r\n        private string GetFileName(IntPtr hModule)\r\n        {\r\n            // Alternative to GetModuleFileName() for the module loaded with\r\n            // LOAD_LIBRARY_AS_DATAFILE option.\r\n\r\n            // Get the file name in the format like:\r\n            // \"\\\\Device\\\\HarddiskVolume2\\\\Windows\\\\System32\\\\shell32.dll\"\r\n\r\n            string fileName;\r\n            {\r\n                var buf = new StringBuilder(MAX_PATH);\r\n                int len = Psapi.GetMappedFileName(\r\n                    Kernel32.GetCurrentProcess(), hModule, buf, buf.Capacity);\r\n                if (len == 0)\r\n                    throw new Win32Exception();\r\n\r\n                fileName = buf.ToString();\r\n            }\r\n\r\n            // Convert the device name to drive name like:\r\n            // \"C:\\\\Windows\\\\System32\\\\shell32.dll\"\r\n\r\n            for (char c = 'A'; c <= 'Z'; ++c)\r\n            {\r\n                var drive = c + \":\";\r\n                var buf = new StringBuilder(MAX_PATH);\r\n                int len = Kernel32.QueryDosDevice(drive, buf, buf.Capacity);\r\n                if (len == 0)\r\n                    continue;\r\n\r\n                var devPath = buf.ToString();\r\n                if (fileName.StartsWith(devPath))\r\n                    return (drive + fileName.Substring(devPath.Length));\r\n            }\r\n\r\n            return fileName;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Media/Icons/IconUtil.cs",
    "content": "﻿/*\n *  IconExtractor/IconUtil for .NET\n *  Copyright (C) 2014 Tsuda Kageyu. All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   1. Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *   2. Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n *  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\n *  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.IO;\nusing System.Reflection;\nusing System.Reflection.Emit;\n\nnamespace Playnite.Common.Media.Icons\n{\n    public static class IconUtil\n    {\n        private delegate byte[] GetIconDataDelegate(Icon icon);\n\n        static GetIconDataDelegate getIconData;\n\n        static IconUtil()\n        {\n            // Create a dynamic method to access Icon.iconData private field.\n\n            var dm = new DynamicMethod(\n                \"GetIconData\", typeof(byte[]), new Type[] { typeof(Icon) }, typeof(Icon));\n            var fi = typeof(Icon).GetField(\n                \"iconData\", BindingFlags.Instance | BindingFlags.NonPublic);\n            var gen = dm.GetILGenerator();\n            gen.Emit(OpCodes.Ldarg_0);\n            gen.Emit(OpCodes.Ldfld, fi);\n            gen.Emit(OpCodes.Ret);\n\n            getIconData = (GetIconDataDelegate)dm.CreateDelegate(typeof(GetIconDataDelegate));\n        }\n\n        /// <summary>\n        /// Split an Icon consists of multiple icons into an array of Icon each\n        /// consists of single icons.\n        /// </summary>\n        /// <param name=\"icon\">A System.Drawing.Icon to be split.</param>\n        /// <returns>An array of System.Drawing.Icon.</returns>\n        public static Icon[] Split(Icon icon)\n        {\n            if (icon == null)\n                throw new ArgumentNullException(\"icon\");\n\n            // Get an .ico file in memory, then split it into separate icons.\n\n            var src = GetIconData(icon);\n\n            var splitIcons = new List<Icon>();\n            {\n                int count = BitConverter.ToUInt16(src, 4);\n\n                for (int i = 0; i < count; i++)\n                {\n                    int length = BitConverter.ToInt32(src, 6 + 16 * i + 8);    // ICONDIRENTRY.dwBytesInRes\n                    int offset = BitConverter.ToInt32(src, 6 + 16 * i + 12);   // ICONDIRENTRY.dwImageOffset\n\n                    using (var dst = new BinaryWriter(new MemoryStream(6 + 16 + length)))\n                    {\n                        // Copy ICONDIR and set idCount to 1.\n\n                        dst.Write(src, 0, 4);\n                        dst.Write((short)1);\n\n                        // Copy ICONDIRENTRY and set dwImageOffset to 22.\n\n                        dst.Write(src, 6 + 16 * i, 12); // ICONDIRENTRY except dwImageOffset\n                        dst.Write(22);                   // ICONDIRENTRY.dwImageOffset\n\n                        // Copy a picture.\n\n                        dst.Write(src, offset, length);\n\n                        // Create an icon from the in-memory file.\n\n                        dst.BaseStream.Seek(0, SeekOrigin.Begin);\n                        splitIcons.Add(new Icon(dst.BaseStream));\n                    }\n                }\n            }\n\n            return splitIcons.ToArray();\n        }\n\n        /// <summary>\n        /// Converts an Icon to a GDI+ Bitmap preserving the transparent area.\n        /// </summary>\n        /// <param name=\"icon\">An System.Drawing.Icon to be converted.</param>\n        /// <returns>A System.Drawing.Bitmap Object.</returns>\n        public static Bitmap ToBitmap(Icon icon)\n        {\n            if (icon == null)\n                throw new ArgumentNullException(\"icon\");\n\n            // Quick workaround: Create an .ico file in memory, then load it as a Bitmap.\n\n            using (var ms = new MemoryStream())\n            {\n                icon.Save(ms);\n                using (var bmp = (Bitmap)Image.FromStream(ms))\n                {\n                    return new Bitmap(bmp);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets the bit depth of an Icon.\n        /// </summary>\n        /// <param name=\"icon\">An System.Drawing.Icon object.</param>\n        /// <returns>Bit depth of the icon.</returns>\n        /// <remarks>\n        /// This method takes into account the PNG header.\n        /// If the icon has multiple variations, this method returns the bit\n        /// depth of the first variation.\n        /// </remarks>\n        public static int GetBitCount(Icon icon)\n        {\n            if (icon == null)\n                throw new ArgumentNullException(\"icon\");\n\n            // Get an .ico file in memory, then read the header.\n\n            var data = GetIconData(icon);\n            if (data.Length >= 51\n                && data[22] == 0x89 && data[23] == 0x50 && data[24] == 0x4e && data[25] == 0x47\n                && data[26] == 0x0d && data[27] == 0x0a && data[28] == 0x1a && data[29] == 0x0a\n                && data[30] == 0x00 && data[31] == 0x00 && data[32] == 0x00 && data[33] == 0x0d\n                && data[34] == 0x49 && data[35] == 0x48 && data[36] == 0x44 && data[37] == 0x52)\n            {\n                // The picture is PNG. Read IHDR chunk.\n\n                switch (data[47])\n                {\n                    case 0:\n                        return data[46];\n                    case 2:\n                        return data[46] * 3;\n                    case 3:\n                        return data[46];\n                    case 4:\n                        return data[46] * 2;\n                    case 6:\n                        return data[46] * 4;\n                    default:\n                        // NOP\n                        break;\n                }\n            }\n            else if (data.Length >= 22)\n            {\n                // The picture is not PNG. Read ICONDIRENTRY structure.\n\n                return BitConverter.ToUInt16(data, 12);\n            }\n\n            throw new ArgumentException(\"The icon is corrupt. Couldn't read the header.\", \"icon\");\n        }\n\n        private static byte[] GetIconData(Icon icon)\n        {\n            var data = getIconData(icon);\n            if (data != null)\n            {\n                return data;\n            }\n            else\n            {\n                using (var ms = new MemoryStream())\n                {\n                    icon.Save(ms);\n                    return ms.ToArray();\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "source/Playnite/Common/MemoryCache.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Concurrent;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Runtime.InteropServices;\r\nusing System.Runtime.Serialization.Formatters.Binary;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class CacheItem\r\n    {\r\n        public object CacheObject\r\n        {\r\n            get;\r\n        }\r\n\r\n        public DateTime LastAccess\r\n        {\r\n            get; internal set;\r\n        }\r\n\r\n        public DateTime CachedTime\r\n        {\r\n            get;\r\n        }\r\n\r\n        public long Size\r\n        {\r\n            get;\r\n        }\r\n\r\n        public Dictionary<string, object> Metadata\r\n        {\r\n            get;\r\n        } = new Dictionary<string, object>();\r\n\r\n        public CacheItem(object item, long size)\r\n        {\r\n            CacheObject = item;\r\n            CachedTime = DateTime.Now;\r\n            LastAccess = CachedTime;\r\n            Size = size;\r\n        }\r\n\r\n        public CacheItem(object item, long size, Dictionary<string, object> metadata) : this (item, size)\r\n        {\r\n            Metadata = metadata;\r\n        }\r\n    }\r\n\r\n    public class MemoryCache\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private ConcurrentDictionary<string, CacheItem> cache = new ConcurrentDictionary<string, CacheItem>();\r\n        private long memorySizeLimit = 0;\r\n        private long currentSize = 0;\r\n\r\n        public MemoryCache(long memoryLimit)\r\n        {\r\n            memorySizeLimit = memoryLimit;\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            cache.Clear();\r\n            currentSize = 0;\r\n            GC.Collect();\r\n        }\r\n\r\n        private void ReleaseOldestItems()\r\n        {\r\n            // ToArray reason:\r\n            // https://stackoverflow.com/questions/11692389/getting-argument-exception-in-concurrent-dictionary-when-sorting-and-displaying\r\n            foreach (var item in cache.ToArray().OrderBy(a => a.Value.LastAccess))\r\n            {\r\n                if (currentSize > memorySizeLimit)\r\n                {\r\n                    TryRemove(item.Key, out var removed);\r\n                }\r\n                else\r\n                {\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool TryAdd(string id, object item, long size, Dictionary<string, object> metadata = null)\r\n        {\r\n            if (size >= memorySizeLimit)\r\n            {\r\n                logger.Warn($\"Cannot add item to memory cache. Size: {size}, cache limit: {memorySizeLimit}\");\r\n                return false;\r\n            }\r\n\r\n            Interlocked.Add(ref currentSize, size);\r\n            if (currentSize > memorySizeLimit)\r\n            {\r\n                ReleaseOldestItems();\r\n            }\r\n\r\n            if (metadata == null)\r\n            {\r\n                return cache.TryAdd(id, new CacheItem(item, size));\r\n            }\r\n            else\r\n            {\r\n                return cache.TryAdd(id, new CacheItem(item, size, metadata));\r\n            }\r\n        }\r\n\r\n        public bool TryRemove(string id, out CacheItem item)\r\n        {\r\n            if (cache.TryRemove(id, out var cacheItem))\r\n            {\r\n                item = cacheItem;\r\n                Interlocked.Add(ref currentSize, -cacheItem.Size);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                item = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public bool TryRemove(string id)\r\n        {\r\n            if (cache.TryRemove(id, out var cacheItem))\r\n            {\r\n                Interlocked.Add(ref currentSize, -cacheItem.Size);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public bool TryGet(string id, out CacheItem item)\r\n        {\r\n            if (cache.TryGetValue(id, out var cacheItem))\r\n            {\r\n                cacheItem.LastAccess = DateTime.Now;\r\n                item = cacheItem;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                item = null;\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "source/Playnite/Common/NLogLogProvider.cs",
    "content": "﻿using NLog.Config;\r\nusing NLog.Targets;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class NLogLogger : ILogger\r\n    {\r\n        public static bool IsTraceEnabled { get; set; } = false;\r\n        private NLog.Logger logger;\r\n\r\n        public NLogLogger(string loggerName)\r\n        {\r\n            logger = NLog.LogManager.GetLogger(loggerName);\r\n        }\r\n\r\n        public void Debug(string message)\r\n        {\r\n            logger.Debug(message);\r\n        }\r\n\r\n        public void Debug(Exception exception, string message)\r\n        {\r\n            logger.Debug(exception, message);\r\n        }\r\n\r\n        public void Error(string message)\r\n        {\r\n            logger.Error(message);\r\n        }\r\n\r\n        public void Error(Exception exception, string message)\r\n        {\r\n            logger.Error(exception, message);\r\n        }\r\n\r\n        public void Info(string message)\r\n        {\r\n            logger.Info(message);\r\n        }\r\n\r\n        public void Info(Exception exception, string message)\r\n        {\r\n            logger.Info(exception, message);\r\n        }\r\n\r\n        public void Warn(string message)\r\n        {\r\n            logger.Warn(message);\r\n        }\r\n\r\n        public void Warn(Exception exception, string message)\r\n        {\r\n            logger.Warn(exception, message);\r\n        }\r\n\r\n        public void Trace(string message)\r\n        {\r\n            if (IsTraceEnabled)\r\n            {\r\n                logger.Trace(message);\r\n            }\r\n        }\r\n\r\n        public void Trace(Exception exception, string message)\r\n        {\r\n            if (IsTraceEnabled)\r\n            {\r\n                logger.Trace(exception, message);\r\n            }\r\n        }\r\n    }\r\n\r\n    public class NLogLogProvider : ILogProvider\r\n    {\r\n        public NLogLogProvider()\r\n        {\r\n            if (NLog.LogManager.Configuration != null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var config = new LoggingConfiguration();\r\n            config.DefaultCultureInfo = new System.Globalization.CultureInfo(\"en-US\");\r\n#if DEBUG\r\n            var consoleTarget = new ColoredConsoleTarget()\r\n            {\r\n                Layout = @\"${level:uppercase=true}|${logger}:${message}${exception}\"\r\n            };\r\n\r\n            config.AddTarget(\"console\", consoleTarget);\r\n            var rule1 = new LoggingRule(\"*\", NLog.LogLevel.Trace, consoleTarget);\r\n            config.LoggingRules.Add(rule1);\r\n#endif\r\n\r\n            var loggerDir = Path.GetDirectoryName(Assembly.GetCallingAssembly().Location);\r\n            var fileTarget = new FileTarget()\r\n            {\r\n                FileName = Path.Combine(loggerDir, \"nlog.log\"),\r\n                Layout = \"${longdate}|${level:uppercase=true}:${message}${exception:format=toString}\",\r\n                KeepFileOpen = false,\r\n                ArchiveFileName = Path.Combine(loggerDir, \"nlog.{#####}.log\"),\r\n                ArchiveAboveSize = 4096000,\r\n                ArchiveNumbering = ArchiveNumberingMode.Sequence,\r\n                MaxArchiveFiles = 2,\r\n                Encoding = Encoding.UTF8\r\n            };\r\n\r\n            config.AddTarget(\"file\", fileTarget);\r\n            var rule2 = new LoggingRule(\"*\", NLog.LogLevel.Trace, fileTarget);\r\n            config.LoggingRules.Add(rule2);\r\n            NLog.LogManager.Configuration = config;\r\n        }\r\n\r\n        public ILogger GetLogger(string loggerName)\r\n        {\r\n            return new NLogLogger(loggerName);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Network.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Net.NetworkInformation;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class Network\r\n    {\r\n        public static async Task<bool> GetIsConnectedToInternet()\r\n        {\r\n            // NetworkListManager is too slow (5 or so seconds) even if connection is available.\r\n            // InternetGetConnectedState is no longer recommended to be used by MS.\r\n            // Plus both options are not portable to non-Windows systems.\r\n            // 1.1.1.1 is Cloudflare's DNS server.\r\n            using (var ping = new Ping())\r\n            {\r\n                try\r\n                {\r\n                    return (await ping.SendPingAsync(new System.Net.IPAddress(new byte[] { 1, 1, 1, 1 }), 5_000)).Status == IPStatus.Success;\r\n                }\r\n                catch\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Paths.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\nusing Playnite.Native;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class Paths\r\n    {\r\n        private const string longPathPrefix = @\"\\\\?\\\";\r\n        private const string longPathUncPrefix = @\"\\\\?\\UNC\\\";\r\n        public static readonly char[] DirectorySeparators = new char[] { '\\\\', '/' };\r\n\r\n        public static string GetFinalPathName(string path)\r\n        {\r\n            var h = Kernel32.CreateFile(path,\r\n                0,\r\n                FileShare.ReadWrite | FileShare.Delete,\r\n                IntPtr.Zero,\r\n                FileMode.Open,\r\n                Fileapi.FILE_FLAG_BACKUP_SEMANTICS,\r\n                IntPtr.Zero);\r\n\r\n            if (path.StartsWith(@\"\\\\\"))\r\n            {\r\n                return path;\r\n            }\r\n\r\n            if (h == Winuser.INVALID_HANDLE_VALUE)\r\n            {\r\n                throw new Win32Exception();\r\n            }\r\n\r\n            try\r\n            {\r\n                var sb = new StringBuilder(1024);\r\n                var res = Kernel32.GetFinalPathNameByHandle(h, sb, 1024, 0);\r\n                if (res == 0)\r\n                {\r\n                    throw new Win32Exception();\r\n                }\r\n\r\n                var targetPath = sb.ToString();\r\n                if (targetPath.StartsWith(longPathUncPrefix))\r\n                {\r\n                    return targetPath.Replace(longPathUncPrefix, @\"\\\\\");\r\n                }\r\n                else\r\n                {\r\n                    return targetPath.Replace(longPathPrefix, string.Empty);\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                Kernel32.CloseHandle(h);\r\n            }\r\n        }\r\n\r\n        public static bool IsValidFilePath(string path)\r\n        {\r\n            try\r\n            {\r\n                if (string.IsNullOrEmpty(path))\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                if (string.IsNullOrEmpty(Path.GetExtension(path)))\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                string drive = Path.GetPathRoot(path);\r\n                if (!string.IsNullOrEmpty(drive) && !Directory.Exists(drive))\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n                // Any of Path methods can throw exception in case that path is some weird string\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static string FixSeparators(string path)\r\n        {\r\n            if (path.IsNullOrWhiteSpace())\r\n            {\r\n                return path;\r\n            }\r\n\r\n            char prev = default;\r\n            var sb = new StringBuilder(path.Length);\r\n            for (int i = 0; i < path.Length; i++)\r\n            {\r\n                var current = path[i];\r\n                if (current == Path.AltDirectorySeparatorChar)\r\n                {\r\n                    current = Path.DirectorySeparatorChar;\r\n                }\r\n\r\n                if (prev != current || current != Path.DirectorySeparatorChar ||\r\n                    (current == Path.DirectorySeparatorChar && prev != Path.DirectorySeparatorChar))\r\n                {\r\n                    prev = current;\r\n                    sb.Append(current);\r\n                    continue;\r\n                }\r\n            }\r\n\r\n            if (path.StartsWith(@\"\\\\\"))\r\n            {\r\n                sb.Insert(0, @\"\\\");\r\n            }\r\n\r\n            return sb.ToString();\r\n        }\r\n\r\n        private static string Normalize(string path)\r\n        {\r\n            var formatted = path;\r\n            try\r\n            {\r\n                formatted = new Uri(path).LocalPath;\r\n            }\r\n            catch\r\n            {\r\n                // this shound't happen\r\n            }\r\n\r\n            return Path.GetFullPath(formatted).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar).ToUpperInvariant();\r\n        }\r\n\r\n        public static bool AreEqual(string path1, string path2)\r\n        {\r\n            if (string.IsNullOrEmpty(path1) && !string.IsNullOrEmpty(path2))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.IsNullOrEmpty(path1) && string.IsNullOrEmpty(path2))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            // Empty string is not valid path, return false even when both are null\r\n            if (string.IsNullOrEmpty(path1) && string.IsNullOrEmpty(path2))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            try\r\n            {\r\n                return Normalize(path1) == Normalize(path2);\r\n            }\r\n            catch\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool ContainsInvalidPathChars(string path)\r\n        {\r\n            return path.Intersect(Path.GetInvalidPathChars()).Any();\r\n        }\r\n\r\n        public static string GetSafePathName(string filename)\r\n        {\r\n            var path = string.Join(\" \", filename.Split(Path.GetInvalidFileNameChars()));\r\n            return Regex.Replace(path, @\"\\s+\", \" \").Trim();\r\n        }\r\n\r\n        public static bool IsFullPath(string path)\r\n        {\r\n            if (string.IsNullOrWhiteSpace(path))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            // Don't use Path.IsPathRooted because it fails on paths starting with one backslash.\r\n            return Regex.IsMatch(path, @\"^([a-zA-Z]:\\\\|\\\\\\\\)\");\r\n        }\r\n\r\n        public static string GetCommonDirectory(string[] paths)\r\n        {\r\n            int k = paths[0].Length;\r\n            for (int i = 1; i < paths.Length; i++)\r\n            {\r\n                k = Math.Min(k, paths[i].Length);\r\n                for (int j = 0; j < k; j++)\r\n                {\r\n                    if (paths[i][j] != paths[0][j])\r\n                    {\r\n                        k = j;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var common = paths[0].Substring(0, k);\r\n            if (common.Length == 0)\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            if (common[common.Length -1] == Path.DirectorySeparatorChar)\r\n            {\r\n                return common;\r\n            }\r\n            else\r\n            {\r\n                return common.Substring(0, common.LastIndexOf(Path.DirectorySeparatorChar) + 1);\r\n            }\r\n        }\r\n\r\n        public static bool MathcesFilePattern(string filePath, string pattern)\r\n        {\r\n            if (filePath.IsNullOrEmpty() || pattern.IsNullOrEmpty())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (pattern.Contains(';'))\r\n            {\r\n                return Shlwapi.PathMatchSpecExW(filePath, pattern, MatchPatternFlags.Multiple) == 0;\r\n            }\r\n            else\r\n            {\r\n                return Shlwapi.PathMatchSpecExW(filePath, pattern, MatchPatternFlags.Normal) == 0;\r\n            }\r\n        }\r\n\r\n        public static string FixPathLength(string path, bool forcePrefix = false)\r\n        {\r\n            if (path.IsNullOrWhiteSpace())\r\n            {\r\n                return path;\r\n            }\r\n\r\n            // Relative paths don't support long paths\r\n            // https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd\r\n            if (!Paths.IsFullPath(path))\r\n            {\r\n                return path;\r\n            }\r\n\r\n            // While the MAX_PATH value is 260 characters, a lower value is used because\r\n            // methods can append \"\\\" and string terminator characters to paths and\r\n            // make them surpass the limit\r\n            if ((path.Length >= 258 || forcePrefix) && !path.StartsWith(longPathPrefix))\r\n            {\r\n                if (path.StartsWith(@\"\\\\\"))\r\n                {\r\n                    return longPathUncPrefix + path.Substring(2);\r\n                }\r\n                else\r\n                {\r\n                    return longPathPrefix + path;\r\n                }\r\n            }\r\n\r\n            return path;\r\n        }\r\n\r\n        public static string TrimLongPathPrefix(string path)\r\n        {\r\n            if (path.IsNullOrWhiteSpace())\r\n            {\r\n                return path;\r\n            }\r\n\r\n            if (path.StartsWith(longPathUncPrefix))\r\n            {\r\n                return path.Replace(longPathUncPrefix, @\"\\\\\");\r\n            }\r\n            else\r\n            {\r\n                return path.Replace(longPathPrefix, string.Empty);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/ProcessMonitor.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Management;\r\nusing System.Threading;\r\nusing System.IO;\r\nusing Playnite.SDK;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class MonitorProcess\r\n    {\r\n        private readonly Process process;\r\n\r\n        public MonitorProcess(Process process)\r\n        {\r\n            this.process = process;\r\n        }\r\n\r\n        public bool IsProcessRunning()\r\n        {\r\n            return !process.HasExited;\r\n        }\r\n    }\r\n\r\n    public class MonitorProcessTree\r\n    {\r\n        private List<int> relatedIds = new List<int>();\r\n\r\n        public MonitorProcessTree(int originalId)\r\n        {\r\n            relatedIds.Add(originalId);\r\n        }\r\n\r\n        public bool IsProcessTreeRunning()\r\n        {\r\n            if (relatedIds.Count == 0)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            var runningIds = new List<int>();\r\n            foreach (var proc in Process.GetProcesses().Where(a => a.SessionId != 0))\r\n            {\r\n                if (proc.TryGetParentId(out var parent))\r\n                {\r\n                    if (relatedIds.Contains(parent) && !relatedIds.Contains(proc.Id))\r\n                    {\r\n                        relatedIds.Add(proc.Id);\r\n                    }\r\n                }\r\n\r\n                if (relatedIds.Contains(proc.Id))\r\n                {\r\n                    runningIds.Add(proc.Id);\r\n                }\r\n            }\r\n\r\n            relatedIds = runningIds;\r\n            return relatedIds.Count > 0;\r\n        }\r\n    }\r\n\r\n    public class MonitorProcessNames\r\n    {\r\n        private readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly List<string> procNames = new List<string>();\r\n        private readonly List<string> procNamesNoExt = new List<string>();\r\n\r\n        public MonitorProcessNames(string directory)\r\n        {\r\n            var dir = directory;\r\n            try\r\n            {\r\n                dir = Paths.GetFinalPathName(directory);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, $\"Failed to get target path for a directory {directory}\");\r\n            }\r\n\r\n            if (FileSystem.DirectoryExists(dir))\r\n            {\r\n                var executables = Directory.GetFiles(dir, \"*.exe\", SearchOption.AllDirectories);\r\n                procNames = executables.Select(a => Path.GetFileName(a)).ToList();\r\n                procNamesNoExt = executables.Select(a => Path.GetFileNameWithoutExtension(a)).ToList();\r\n            }\r\n        }\r\n\r\n        public bool IsTrackable()\r\n        {\r\n            return procNames.Count > 0;\r\n        }\r\n\r\n        public int IsProcessRunning()\r\n        {\r\n            foreach (var process in Process.GetProcesses().Where(a => a.SessionId != 0))\r\n            {\r\n                if (process.TryGetMainModuleFileName(out var procPath))\r\n                {\r\n                    if (procNames.Contains(Path.GetFileName(procPath)))\r\n                    {\r\n                        return process.Id; ;\r\n                    }\r\n                }\r\n                else if (procNamesNoExt.Contains(process.ProcessName))\r\n                {\r\n                    return process.Id;\r\n                }\r\n            }\r\n\r\n            return 0;\r\n        }\r\n    }\r\n\r\n    public class MonitorDirectory\r\n    {\r\n        private readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly string dir;\r\n\r\n        public MonitorDirectory(string directory)\r\n        {\r\n            dir = directory;\r\n\r\n            try\r\n            {\r\n                dir = Paths.GetFinalPathName(directory);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, $\"Failed to get target path for a directory {directory}\");\r\n            }\r\n        }\r\n\r\n        public bool IsTrackable()\r\n        {\r\n            if (dir.IsNullOrWhiteSpace())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return FileSystem.DirectoryExists(dir);\r\n        }\r\n\r\n        public int IsProcessRunning()\r\n        {\r\n            foreach (var process in Process.GetProcesses().Where(a => a.SessionId != 0))\r\n            {\r\n                if (process.TryGetMainModuleFileName(out var procPath) &&\r\n                    procPath.IndexOf(dir, StringComparison.OrdinalIgnoreCase) >= 0)\r\n                {\r\n                    return process.Id;\r\n                }\r\n            }\r\n\r\n            return 0;\r\n        }\r\n    }\r\n}\r\n\r\npublic class MonitorProcessName\r\n{\r\n    public string ProcessName { get; }\r\n\r\n    public MonitorProcessName(string processName)\r\n    {\r\n        if (processName.IsNullOrWhiteSpace())\r\n        {\r\n            throw new Exception(\"Non empty process name must be specified.\");\r\n        }\r\n\r\n        ProcessName = processName;\r\n    }\r\n\r\n    public int IsProcessRunning()\r\n    {\r\n        foreach (var process in Process.GetProcesses().Where(a => a.SessionId != 0))\r\n        {\r\n            using (process)\r\n            {\r\n                if (process.ProcessName == ProcessName)\r\n                {\r\n                    return process.Id;\r\n                }\r\n            }\r\n        }\r\n\r\n        return 0;\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/Common/ProcessStarter.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.Native;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public static class CmdLineTools\r\n    {\r\n        public const string TaskKill = \"taskkill\";\r\n        public const string Cmd = \"cmd\";\r\n        public const string IPConfig = \"ipconfig\";\r\n    }\r\n\r\n    public static class ProcessStarter\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public static int ShellExecute(string cmdLine)\r\n        {\r\n            logger.Debug($\"Executing shell command: {cmdLine}\");\r\n            var startInfo = new STARTUPINFO();\r\n            var procInfo = new PROCESS_INFORMATION();\r\n            var procAtt = new SECURITY_ATTRIBUTES();\r\n            var threadAtt = new SECURITY_ATTRIBUTES();\r\n            procAtt.nLength = Marshal.SizeOf(procAtt);\r\n            threadAtt.nLength = Marshal.SizeOf(threadAtt);\r\n\r\n            try\r\n            {\r\n                if (Kernel32.CreateProcess(\r\n                    null,\r\n                    cmdLine,\r\n                    ref procAtt,\r\n                    ref threadAtt,\r\n                    false,\r\n                    0x0020,\r\n                    IntPtr.Zero,\r\n                    null,\r\n                    ref startInfo,\r\n                    out procInfo))\r\n                {\r\n                    return procInfo.dwProcessId;\r\n                }\r\n                else\r\n                {\r\n                    throw new Win32Exception(Marshal.GetLastWin32Error());\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                if (procInfo.hProcess != IntPtr.Zero)\r\n                {\r\n                    Kernel32.CloseHandle(procInfo.hProcess);\r\n                }\r\n\r\n                if (procInfo.hThread != IntPtr.Zero)\r\n                {\r\n                    Kernel32.CloseHandle(procInfo.hThread);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static Process StartUrl(string url)\r\n        {\r\n            logger.Debug($\"Opening URL: {url}\");\r\n            try\r\n            {\r\n                return Process.Start(url);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                // There are some crash report with 0x80004005 error when opening standard URL.\r\n                logger.Error(e, \"Failed to open URL.\");\r\n                return Process.Start(CmdLineTools.Cmd, $\"/C start {url}\");\r\n            }\r\n        }\r\n\r\n        public static Process StartProcess(string path, bool asAdmin = false)\r\n        {\r\n            return StartProcess(path, string.Empty, string.Empty, asAdmin);\r\n        }\r\n\r\n        public static Process StartProcess(string path, string arguments, bool asAdmin = false)\r\n        {\r\n            return StartProcess(path, arguments, string.Empty, asAdmin);\r\n        }\r\n\r\n        public static Process StartProcess(string path, string arguments, string workDir, bool asAdmin = false)\r\n        {\r\n            logger.Debug($\"Starting process: {path}, {arguments}, {workDir}, {asAdmin}\");\r\n            if (path.IsNullOrWhiteSpace())\r\n            {\r\n                throw new ArgumentNullException(\"Cannot start process, executable path is specified.\");\r\n            }\r\n\r\n            var startupPath = path;\r\n            if (path.Contains(\"..\"))\r\n            {\r\n                startupPath = Path.GetFullPath(path);\r\n            }\r\n\r\n            var info = new ProcessStartInfo(startupPath)\r\n            {\r\n                Arguments = arguments,\r\n                WorkingDirectory = string.IsNullOrEmpty(workDir) ? (new FileInfo(startupPath)).Directory.FullName : workDir\r\n            };\r\n\r\n            if (asAdmin)\r\n            {\r\n                info.Verb = \"runas\";\r\n            }\r\n\r\n            return Process.Start(info);\r\n        }\r\n\r\n        public static int StartProcessWait(string path, string arguments, string workDir, bool noWindow = false)\r\n        {\r\n            logger.Debug($\"Starting process: {path}, {arguments}, {workDir}\");\r\n            if (path.IsNullOrWhiteSpace())\r\n            {\r\n                throw new ArgumentNullException(\"Cannot start process, executable path is specified.\");\r\n            }\r\n\r\n            var startupPath = path;\r\n            if (path.Contains(\"..\"))\r\n            {\r\n                startupPath = Path.GetFullPath(path);\r\n            }\r\n\r\n            var info = new ProcessStartInfo(startupPath)\r\n            {\r\n                Arguments = arguments,\r\n                WorkingDirectory = string.IsNullOrEmpty(workDir) ? (new FileInfo(startupPath)).Directory.FullName : workDir\r\n            };\r\n\r\n            if (noWindow)\r\n            {\r\n                info.CreateNoWindow = true;\r\n                info.UseShellExecute = false;\r\n            }\r\n\r\n            using (var proc = Process.Start(info))\r\n            {\r\n                proc.WaitForExit();\r\n                return proc.ExitCode;\r\n            }\r\n        }\r\n\r\n        public static int StartProcessWait(\r\n            string path,\r\n            string arguments,\r\n            string workDir,\r\n            out string stdOutput,\r\n            out string stdError)\r\n        {\r\n            logger.Debug($\"Starting process: {path}, {arguments}, {workDir}\");\r\n            if (path.IsNullOrWhiteSpace())\r\n            {\r\n                throw new ArgumentNullException(\"Cannot start process, executable path is specified.\");\r\n            }\r\n\r\n            var startupPath = path;\r\n            if (path.Contains(\"..\"))\r\n            {\r\n                startupPath = Path.GetFullPath(path);\r\n            }\r\n\r\n            var info = new ProcessStartInfo(startupPath)\r\n            {\r\n                Arguments = arguments,\r\n                WorkingDirectory = string.IsNullOrEmpty(workDir) ? (new FileInfo(startupPath)).Directory.FullName : workDir,\r\n                RedirectStandardError = true,\r\n                RedirectStandardOutput = true,\r\n                CreateNoWindow = true,\r\n                UseShellExecute = false\r\n            };\r\n\r\n            var stdout = string.Empty;\r\n            var stderr = string.Empty;\r\n            using (var proc = new Process())\r\n            {\r\n                proc.StartInfo = info;\r\n                proc.OutputDataReceived += (_, e) =>\r\n                {\r\n                    if (e.Data != null)\r\n                    {\r\n                        stdout += e.Data + Environment.NewLine;\r\n                    }\r\n                };\r\n\r\n                proc.ErrorDataReceived += (_, e) =>\r\n                {\r\n                    if (e.Data != null)\r\n                    {\r\n                        stderr += e.Data + Environment.NewLine;\r\n                    }\r\n                };\r\n\r\n                proc.Start();\r\n                proc.BeginOutputReadLine();\r\n                proc.BeginErrorReadLine();\r\n                proc.WaitForExit();\r\n                stdOutput = stdout;\r\n                stdError = stderr;\r\n                return proc.ExitCode;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Programs.cs",
    "content": "﻿using Microsoft.Win32;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Security.AccessControl;\r\nusing System.Security.Principal;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class Program\r\n    {\r\n        public string Path { get; set; }\r\n        public string Arguments { get; set; }\r\n        public string Icon { get; set; }\r\n        public int IconIndex { get; set; }\r\n        public string WorkDir { get; set; }\r\n        public string Name { get; set; }\r\n        public string AppId { get; set; }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n\r\n    public class UninstallProgram\r\n    {\r\n        public string DisplayIcon { get; set; }\r\n        public string DisplayName { get; set; }\r\n        public string DisplayVersion { get; set; }\r\n        public string InstallLocation { get; set; }\r\n        public string Publisher { get; set; }\r\n        public string UninstallString { get; set; }\r\n        public string URLInfoAbout { get; set; }\r\n        public string RegistryKeyName { get; set; }\r\n        public string Path { get; set; }\r\n\r\n        public override string ToString()\r\n        {\r\n            return DisplayName ?? RegistryKeyName;\r\n        }\r\n    }\r\n\r\n    public partial class Programs\r\n    {\r\n        private static readonly string[] scanFileExclusionMasks = new string[]\r\n        {\r\n            \"uninst\",\r\n            \"setup\",\r\n            @\"unins\\d+\",\r\n            \"Config\",\r\n            \"DXSETUP\",\r\n            @\"vc_redist\\.x64\",\r\n            @\"vc_redist\\.x86\",\r\n            @\"^UnityCrashHandler32\\.exe$\",\r\n            @\"^UnityCrashHandler64\\.exe$\",\r\n            @\"^notification_helper\\.exe$\",\r\n            @\"^python\\.exe$\",\r\n            @\"^pythonw\\.exe$\",\r\n            @\"^zsync\\.exe$\",\r\n            @\"^zsyncmake\\.exe$\"\r\n        };\r\n\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public static bool IsFileScanExcluded(string path)\r\n        {\r\n            return scanFileExclusionMasks.Any(a => Regex.IsMatch(path, a, RegexOptions.IgnoreCase));\r\n        }\r\n\r\n        public static void CreateUrlShortcut(string url, string iconPath, string shortcutPath)\r\n        {\r\n            FileSystem.PrepareSaveFile(shortcutPath);\r\n            var content = @\"[InternetShortcut]\r\nIconIndex=0\";\r\n            if (!iconPath.IsNullOrEmpty())\r\n            {\r\n                content += Environment.NewLine + $\"IconFile={iconPath}\";\r\n            }\r\n\r\n            content += Environment.NewLine + $\"URL={url}\";\r\n            File.WriteAllText(shortcutPath, content);\r\n        }\r\n\r\n        private static List<UninstallProgram> GetUninstallProgsFromView(RegistryView view)\r\n        {\r\n            var rootString = @\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\\";\r\n            void SearchRoot(RegistryHive hive, List<UninstallProgram> programs)\r\n            {\r\n                using (var root = RegistryKey.OpenBaseKey(hive, view))\r\n                {\r\n                    var keyList = root.OpenSubKey(rootString);\r\n                    if (keyList == null)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    foreach (var key in keyList.GetSubKeyNames())\r\n                    {\r\n                        try\r\n                        {\r\n                            using (var prog = root.OpenSubKey(rootString + key))\r\n                            {\r\n                                if (prog == null)\r\n                                {\r\n                                    continue;\r\n                                }\r\n\r\n                                var program = new UninstallProgram()\r\n                                {\r\n                                    DisplayIcon = prog.GetValue(\"DisplayIcon\")?.ToString(),\r\n                                    DisplayVersion = prog.GetValue(\"DisplayVersion\")?.ToString(),\r\n                                    DisplayName = prog.GetValue(\"DisplayName\")?.ToString(),\r\n                                    InstallLocation = prog.GetValue(\"InstallLocation\")?.ToString(),\r\n                                    Publisher = prog.GetValue(\"Publisher\")?.ToString(),\r\n                                    UninstallString = prog.GetValue(\"UninstallString\")?.ToString(),\r\n                                    URLInfoAbout = prog.GetValue(\"URLInfoAbout\")?.ToString(),\r\n                                    Path = prog.GetValue(\"Path\")?.ToString(),\r\n                                    RegistryKeyName = key\r\n                                };\r\n\r\n                                programs.Add(program);\r\n                            }\r\n                        }\r\n                        catch (System.Security.SecurityException e)\r\n                        {\r\n                            logger.Warn(e, $\"Failed to read registry key {rootString + key}\");\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            var progs = new List<UninstallProgram>();\r\n            SearchRoot(RegistryHive.LocalMachine, progs);\r\n            SearchRoot(RegistryHive.CurrentUser, progs);\r\n            return progs;\r\n        }\r\n\r\n        public static List<UninstallProgram> GetUnistallProgramsList()\r\n        {\r\n            var progs = new List<UninstallProgram>();\r\n\r\n            if (Environment.Is64BitOperatingSystem)\r\n            {\r\n                progs.AddRange(GetUninstallProgsFromView(RegistryView.Registry64));\r\n            }\r\n\r\n            progs.AddRange(GetUninstallProgsFromView(RegistryView.Registry32));\r\n            return progs;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Programs2.cs",
    "content": "﻿using Microsoft.Win32;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Security.Principal;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Xml;\r\nusing Windows.ApplicationModel;\r\nusing Windows.Management.Deployment;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public partial class Programs\r\n    {\r\n        public static async Task<List<Program>> GetExecutablesFromFolder(string path, SearchOption searchOption, CancellationToken cancelToken)\r\n        {\r\n            return await Task.Run(() =>\r\n            {\r\n                var execs = new List<Program>();\r\n                var files = new SafeFileEnumerator(path, \"*.*\", SearchOption.AllDirectories);\r\n\r\n                foreach (var file in files)\r\n                {\r\n                    if (cancelToken.IsCancellationRequested == true)\r\n                    {\r\n                        return null;\r\n                    }\r\n\r\n                    if (file.Attributes.HasFlag(FileAttributes.Directory))\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    if (IsFileScanExcluded(file.Name))\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    if (file.Extension.IsNullOrEmpty())\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    if (file.Extension.EndsWith(\".exe\", StringComparison.OrdinalIgnoreCase) == true ||\r\n                        file.Extension.EndsWith(\".lnk\", StringComparison.OrdinalIgnoreCase) == true ||\r\n                        file.Extension.EndsWith(\".bat\", StringComparison.OrdinalIgnoreCase) == true)\r\n                    {\r\n                        execs.Add(GetProgramData(file.FullName));\r\n                    }\r\n                }\r\n\r\n                return execs;\r\n            });\r\n        }\r\n\r\n        public static Program GetProgramData(string filePath)\r\n        {\r\n            var file = new FileInfo(filePath);\r\n            if (file.Extension?.EndsWith(\".exe\", StringComparison.OrdinalIgnoreCase) == true)\r\n            {\r\n                var versionInfo = FileVersionInfo.GetVersionInfo(file.FullName);\r\n                var programName = !string.IsNullOrEmpty(versionInfo.ProductName?.Trim()) ? versionInfo.ProductName : new DirectoryInfo(Path.GetDirectoryName(file.FullName)).Name;\r\n                return new Program\r\n                {\r\n                    Path = file.FullName,\r\n                    Icon = file.FullName,\r\n                    WorkDir = Path.GetDirectoryName(file.FullName),\r\n                    Name = programName,\r\n                    AppId = filePath.MD5()\r\n                };\r\n            }\r\n            else if (file.Extension?.EndsWith(\".lnk\", StringComparison.OrdinalIgnoreCase) == true)\r\n            {\r\n                var data = GetLnkShortcutData(file.FullName);\r\n                var name = Path.GetFileNameWithoutExtension(file.Name);\r\n                var program = new Program\r\n                {\r\n                    Path = data.Path,\r\n                    WorkDir = data.WorkDir,\r\n                    Arguments = data.Arguments,\r\n                    Name = name,\r\n                    AppId = filePath.MD5()\r\n                };\r\n\r\n                if (!data.Icon.IsNullOrEmpty())\r\n                {\r\n                    var reg = Regex.Match(data.Icon, @\"^(.+),(\\d+)$\");\r\n                    if (reg.Success)\r\n                    {\r\n                        program.Icon = reg.Groups[1].Value;\r\n                        program.IconIndex = int.Parse(reg.Groups[2].Value);\r\n                    }\r\n                    else\r\n                    {\r\n                        program.Icon = data.Icon;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    program.Icon = data.Path;\r\n                }\r\n\r\n                return program;\r\n            }\r\n            else if (file.Extension?.EndsWith(\".bat\", StringComparison.OrdinalIgnoreCase) == true)\r\n            {\r\n                return new Program\r\n                {\r\n                    Path = file.FullName,\r\n                    Name = Path.GetFileNameWithoutExtension(file.FullName),\r\n                    WorkDir = Path.GetDirectoryName(file.FullName),\r\n                    AppId = filePath.MD5()\r\n                };\r\n            }\r\n\r\n            throw new NotSupportedException(\"Only exe, bat and lnk files are supported.\");\r\n        }\r\n\r\n        public static void CreateShortcut(string executablePath, string arguments, string iconPath, string shortcutPath)\r\n        {\r\n            var shell = new IWshRuntimeLibrary.WshShell();\r\n            var link = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(shortcutPath);\r\n            link.TargetPath = executablePath;\r\n            link.WorkingDirectory = Path.GetDirectoryName(executablePath);\r\n            link.Arguments = arguments;\r\n            link.IconLocation = string.IsNullOrEmpty(iconPath) ? executablePath + \",0\" : iconPath;\r\n            link.Save();\r\n        }\r\n\r\n        public static Program GetLnkShortcutData(string lnkPath)\r\n        {\r\n            var shell = new IWshRuntimeLibrary.WshShell();\r\n            var link = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(lnkPath);\r\n            return new Program()\r\n            {\r\n                Path = link.TargetPath,\r\n                Icon = link.IconLocation == \",0\" ? link.TargetPath : link.IconLocation,\r\n                Arguments = link.Arguments,\r\n                WorkDir = link.WorkingDirectory,\r\n                Name = link.FullName,\r\n                AppId = lnkPath.MD5()\r\n            };\r\n        }\r\n        public static async Task<List<Program>> GetShortcutProgramsFromFolder(string path, CancellationTokenSource cancelToken = null)\r\n        {\r\n            return await Task.Run(() =>\r\n            {\r\n                var folderExceptions = new string[]\r\n                {\r\n                    @\"\\Accessibility\\\",\r\n                    @\"\\Accessories\\\",\r\n                    @\"\\Administrative Tools\\\",\r\n                    @\"\\Maintenance\\\",\r\n                    @\"\\StartUp\\\",\r\n                    @\"\\Windows \",\r\n                    @\"\\Microsoft \",\r\n                };\r\n\r\n                var pathExceptions = new string[]\r\n                {\r\n                    @\"\\system32\\\",\r\n                    @\"\\windows\\\",\r\n                };\r\n\r\n                var shell = new IWshRuntimeLibrary.WshShell();\r\n                var apps = new List<Program>();\r\n                var shortucts = new SafeFileEnumerator(path, \"*.lnk\", SearchOption.AllDirectories);\r\n\r\n                foreach (var shortcut in shortucts)\r\n                {\r\n                    if (cancelToken?.IsCancellationRequested == true)\r\n                    {\r\n                        return null;\r\n                    }\r\n\r\n                    if (shortcut.Attributes.HasFlag(FileAttributes.Directory))\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    var fileName = shortcut.Name;\r\n                    var Directory = Path.GetDirectoryName(shortcut.FullName);\r\n\r\n                    if (folderExceptions.FirstOrDefault(a => shortcut.FullName.IndexOf(a, StringComparison.OrdinalIgnoreCase) >= 0) != null)\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    var link = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(shortcut.FullName);\r\n                    var target = link.TargetPath;\r\n\r\n                    if (pathExceptions.FirstOrDefault(a => target.IndexOf(a, StringComparison.OrdinalIgnoreCase) >= 0) != null)\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    // Ignore uninstallers, config, redistributables and game engine executables\r\n                    if (IsFileScanExcluded(Path.GetFileName(target)))\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    // Ignore duplicates\r\n                    if (apps.FirstOrDefault(a => a.Path == target) != null)\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    // Ignore non-application links\r\n                    if (Path.GetExtension(target) != \".exe\")\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    var app = new Program()\r\n                    {\r\n                        Path = target,\r\n                        Icon = link.IconLocation,\r\n                        Name = Path.GetFileNameWithoutExtension(shortcut.Name),\r\n                        WorkDir = link.WorkingDirectory,\r\n                        AppId = path.MD5()\r\n                    };\r\n\r\n                    apps.Add(app);\r\n                }\r\n\r\n                return apps;\r\n            });\r\n        }\r\n\r\n        public static async Task<List<Program>> GetInstalledPrograms(CancellationToken cancelToken)\r\n        {\r\n            var apps = new List<Program>();\r\n\r\n            // Get apps from All Users\r\n            var allPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu), \"Programs\");\r\n            var allApps = await GetShortcutProgramsFromFolder(allPath);\r\n            if (cancelToken.IsCancellationRequested == true)\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                apps.AddRange(allApps);\r\n            }\r\n\r\n            // Get current user apps\r\n            var userPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu), \"Programs\");\r\n            var userApps = await GetShortcutProgramsFromFolder(userPath);\r\n            if (cancelToken.IsCancellationRequested == true)\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                apps.AddRange(userApps);\r\n            }\r\n\r\n            return apps;\r\n        }\r\n\r\n        private static string GetUWPGameIcon(string defPath)\r\n        {\r\n            if (File.Exists(defPath))\r\n            {\r\n                return defPath;\r\n            }\r\n\r\n            var folder = Path.GetDirectoryName(defPath);\r\n            var fileMask = Path.GetFileNameWithoutExtension(defPath) + \".scale*.png\";\r\n            var files = Directory.GetFiles(folder, fileMask);\r\n\r\n            if (files == null || files.Count() == 0)\r\n            {\r\n                return string.Empty;\r\n            }\r\n            else\r\n            {\r\n                var icons = files.Where(a => Regex.IsMatch(a, @\"\\.scale-\\d+\\.png\"));\r\n                if (icons.Any())\r\n                {\r\n                    return icons.OrderBy(a => a).Last();\r\n                }\r\n\r\n                return string.Empty;\r\n            }\r\n        }\r\n\r\n        public static List<Program> GetUWPApps()\r\n        {\r\n            var apps = new List<Program>();\r\n\r\n            try\r\n            {\r\n                var manager = new PackageManager();\r\n                IEnumerable<Package> packages = manager.FindPackagesForUser(WindowsIdentity.GetCurrent().User.Value);\r\n                foreach (var package in packages)\r\n                {\r\n                    if (package.IsFramework || package.IsResourcePackage || package.SignatureKind != PackageSignatureKind.Store)\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    try\r\n                    {\r\n                        if (package.InstalledLocation == null)\r\n                        {\r\n                            continue;\r\n                        }\r\n                    }\r\n                    catch\r\n                    {\r\n                        // InstalledLocation accessor may throw Win32 exception for unknown reason\r\n                        continue;\r\n                    }\r\n\r\n                    try\r\n                    {\r\n                        string manifestPath;\r\n                        if (package.IsBundle)\r\n                        {\r\n                            manifestPath = @\"AppxMetadata\\AppxBundleManifest.xml\";\r\n                        }\r\n                        else\r\n                        {\r\n                            manifestPath = \"AppxManifest.xml\";\r\n                        }\r\n\r\n                        manifestPath = Path.Combine(package.InstalledLocation.Path, manifestPath);\r\n                        var manifest = new XmlDocument();\r\n                        using (var stream = new FileStream(manifestPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))\r\n                        {\r\n                            manifest.Load(stream);\r\n                        }\r\n\r\n                        var apxApp = manifest.SelectSingleNode(@\"/*[local-name() = 'Package']/*[local-name() = 'Applications']//*[local-name() = 'Application'][1]\");\r\n                        if (apxApp.Attributes[\"Id\"] == null)\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        var appId = apxApp.Attributes[\"Id\"].Value;\r\n\r\n                        var visuals = apxApp.SelectSingleNode(@\"//*[local-name() = 'VisualElements']\");\r\n                        var iconPath = visuals.Attributes[\"Square150x150Logo\"]?.Value;\r\n                        if (iconPath.IsNullOrEmpty())\r\n                        {\r\n                            iconPath = visuals.Attributes[\"Square70x70Logo\"]?.Value;\r\n                            if (iconPath.IsNullOrEmpty())\r\n                            {\r\n                                iconPath = visuals.Attributes[\"Square44x44Logo\"]?.Value;\r\n                                if (iconPath.IsNullOrEmpty())\r\n                                {\r\n                                    iconPath = visuals.Attributes[\"Logo\"]?.Value;\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        if (!iconPath.IsNullOrEmpty())\r\n                        {\r\n                            iconPath = Path.Combine(package.InstalledLocation.Path, iconPath);\r\n                            iconPath = GetUWPGameIcon(iconPath);\r\n                        }\r\n\r\n                        var name = manifest.SelectSingleNode(@\"/*[local-name() = 'Package']/*[local-name() = 'Properties']/*[local-name() = 'DisplayName']\").InnerText;\r\n                        if (name.StartsWith(\"ms-resource\"))\r\n                        {\r\n                            name = Resources.GetIndirectResourceString(package.Id.FullName, package.Id.Name, name);\r\n                            if (name.IsNullOrEmpty())\r\n                            {\r\n                                name = manifest.SelectSingleNode(@\"/*[local-name() = 'Package']/*[local-name() = 'Identity']\").Attributes[\"Name\"].Value;\r\n                            }\r\n                        }\r\n\r\n                        var app = new Program()\r\n                        {\r\n                            Name = StringExtensions.NormalizeGameName(name),\r\n                            WorkDir = package.InstalledLocation.Path,\r\n                            Path = \"explorer.exe\",\r\n                            Arguments = $\"shell:AppsFolder\\\\{package.Id.FamilyName}!{appId}\",\r\n                            Icon = iconPath,\r\n                            AppId = package.Id.FamilyName\r\n                        };\r\n\r\n                        apps.Add(app);\r\n                    }\r\n                    catch (Exception e)\r\n                    {\r\n                        logger.Error(e, $\"Failed to parse UWP app {package.Id.FullName} info.\");\r\n                    }\r\n                }\r\n            }\r\n            catch (Exception e) when (!Debugger.IsAttached)\r\n            {\r\n                logger.Error(e, \"Failed to get list of installed UWP apps.\");\r\n            }\r\n\r\n            return apps;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Resources.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing Playnite.Native;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class Resources\r\n    {\r\n        public static void ExtractResource(string path, string name, string type, string destination)\r\n        {\r\n            IntPtr hMod = Kernel32.LoadLibraryEx(path, IntPtr.Zero, 0x00000002);\r\n            IntPtr hRes = Kernel32.FindResource(hMod, name, type);\r\n            uint size = Kernel32.SizeofResource(hMod, hRes);\r\n            IntPtr pt = Kernel32.LoadResource(hMod, hRes);\r\n\r\n            byte[] bPtr = new byte[size];\r\n            Marshal.Copy(pt, bPtr, 0, (int)size);\r\n            using (MemoryStream m = new MemoryStream(bPtr))\r\n            {\r\n                File.WriteAllBytes(destination, m.ToArray());\r\n            }\r\n        }\r\n\r\n        public static long GetUriPackFileSize(string packUri)\r\n        {\r\n            var info = Application.GetResourceStream(new Uri(packUri));\r\n            using (var stream = info.Stream)\r\n            {\r\n                return stream.Length;\r\n            }\r\n        }\r\n\r\n        public static string ReadFileFromResource(string resource)\r\n        {\r\n            using (var stream = Assembly.GetCallingAssembly().GetManifestResourceStream(resource))\r\n            {\r\n                var tr = new StreamReader(stream);\r\n                return tr.ReadToEnd();\r\n            }\r\n        }\r\n\r\n        public static string GetIndirectResourceString(string fullName, string packageName, string resource)\r\n        {\r\n            var resUri = new Uri(resource);\r\n            var resourceString = string.Empty;\r\n            if (resource.StartsWith(\"ms-resource://\"))\r\n            {\r\n                resourceString = $\"@{{{fullName}? {resource}}}\";\r\n            }\r\n            else if (resource.Contains('/'))\r\n            {\r\n                resourceString = $\"@{{{fullName}? ms-resource://{packageName}/{resource.Replace(\"ms-resource:\", \"\").Trim('/')}}}\";\r\n            }\r\n            else\r\n            {\r\n                resourceString = $\"@{{{fullName}? ms-resource://{packageName}/resources/{resUri.Segments.Last()}}}\";\r\n            }\r\n\r\n            var sb = new StringBuilder(1024);\r\n            var result = Shlwapi.SHLoadIndirectString(resourceString, sb, sb.Capacity, IntPtr.Zero);\r\n            if (result == 0)\r\n            {\r\n                return sb.ToString();\r\n            }\r\n\r\n            resourceString = $\"@{{{fullName}? ms-resource://{packageName}/{resUri.Segments.Last()}}}\";\r\n            result = Shlwapi.SHLoadIndirectString(resourceString, sb, sb.Capacity, IntPtr.Zero);\r\n            if (result == 0)\r\n            {\r\n                return sb.ToString();\r\n            }\r\n\r\n            return string.Empty;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Roman.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    // Courtesy of https://stackoverflow.com/questions/7040289/converting-integers-to-roman-numerals\r\n    public static class Roman\r\n    {\r\n        public static readonly Dictionary<char, int> RomanNumberDictionary;\r\n        public static readonly Dictionary<int, string> NumberRomanDictionary;\r\n\r\n        static Roman()\r\n        {\r\n            RomanNumberDictionary = new Dictionary<char, int>\r\n            {\r\n                { 'I', 1 },\r\n                { 'V', 5 },\r\n                { 'X', 10 },\r\n                { 'L', 50 },\r\n                { 'C', 100 },\r\n                { 'D', 500 },\r\n                { 'M', 1000 },\r\n            };\r\n\r\n            NumberRomanDictionary = new Dictionary<int, string>\r\n            {\r\n                { 1000, \"M\" },\r\n                { 900, \"CM\" },\r\n                { 500, \"D\" },\r\n                { 400, \"CD\" },\r\n                { 100, \"C\" },\r\n                { 90, \"XC\" },\r\n                { 50, \"L\" },\r\n                { 40, \"XL\" },\r\n                { 10, \"X\" },\r\n                { 9, \"IX\" },\r\n                { 5, \"V\" },\r\n                { 4, \"IV\" },\r\n                { 1, \"I\" },\r\n            };\r\n        }\r\n\r\n        public static string To(int number)\r\n        {\r\n            var roman = new StringBuilder();\r\n\r\n            foreach (var item in NumberRomanDictionary)\r\n            {\r\n                while (number >= item.Key)\r\n                {\r\n                    roman.Append(item.Value);\r\n                    number -= item.Key;\r\n                }\r\n            }\r\n\r\n            return roman.ToString();\r\n        }\r\n\r\n        public static int From(string roman)\r\n        {\r\n            int total = 0;\r\n            int current, previous = 0;\r\n            char currentRoman, previousRoman = '\\0';\r\n\r\n            for (int i = 0; i < roman.Length; i++)\r\n            {\r\n                currentRoman = roman[i];\r\n\r\n                previous = previousRoman != '\\0' ? RomanNumberDictionary[previousRoman] : '\\0';\r\n                current = RomanNumberDictionary[currentRoman];\r\n\r\n                if (previous != 0 && current > previous)\r\n                {\r\n                    total = total - (2 * previous) + current;\r\n                }\r\n                else\r\n                {\r\n                    total += current;\r\n                }\r\n\r\n                previousRoman = currentRoman;\r\n            }\r\n\r\n            return total;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/SafeFileEnumerator.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    // Originally from https://stackoverflow.com/questions/9746538/fastest-safest-file-finding-parsing\r\n    public class SafeFileEnumerator : IEnumerable<FileSystemInfo>\r\n    {\r\n        /// <summary>\r\n        /// Helper class to enumerate the file system.\r\n        /// </summary>\r\n        private class Enumerator : IEnumerator<FileSystemInfo>\r\n        {\r\n            // Core enumerator that we will be walking though\r\n            private IEnumerator<FileSystemInfo> fileEnumerator;\r\n            // Directory enumerator to capture access errors\r\n            private IEnumerator<DirectoryInfo> directoryEnumerator;\r\n\r\n            private DirectoryInfo root;\r\n            private string pattern;\r\n            private SearchOption searchOption;\r\n            private IList<Exception> errors;\r\n\r\n            public Enumerator(DirectoryInfo root, string pattern, SearchOption option, IList<Exception> errors)\r\n            {\r\n                this.root = root;\r\n                this.pattern = pattern;\r\n                this.errors = errors;\r\n                this.searchOption = option;\r\n\r\n                Reset();\r\n            }\r\n\r\n            /// <summary>\r\n            /// Current item the primary itterator is pointing to\r\n            /// </summary>\r\n            public FileSystemInfo Current\r\n            {\r\n                get\r\n                {\r\n                    //if (fileEnumerator == null) throw new ObjectDisposedException(\"FileEnumerator\");\r\n                    return fileEnumerator.Current as FileSystemInfo;\r\n                }\r\n            }\r\n\r\n            object System.Collections.IEnumerator.Current\r\n            {\r\n                get { return Current; }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                Dispose(true, true);\r\n            }\r\n\r\n            private void Dispose(bool file, bool dir)\r\n            {\r\n                if (file)\r\n                {\r\n                    if (fileEnumerator != null)\r\n                        fileEnumerator.Dispose();\r\n\r\n                    fileEnumerator = null;\r\n                }\r\n\r\n                if (dir)\r\n                {\r\n                    if (directoryEnumerator != null)\r\n                        directoryEnumerator.Dispose();\r\n\r\n                    directoryEnumerator = null;\r\n                }\r\n            }\r\n\r\n            public bool MoveNext()\r\n            {\r\n                // Enumerate the files in the current folder\r\n                if ((fileEnumerator != null) && (fileEnumerator.MoveNext()))\r\n                    return true;\r\n\r\n                // Don't go recursive...\r\n                if (searchOption == SearchOption.TopDirectoryOnly) { return false; }\r\n\r\n                while ((directoryEnumerator != null) && (directoryEnumerator.MoveNext()))\r\n                {\r\n                    Dispose(true, false);\r\n\r\n                    try\r\n                    {\r\n                        fileEnumerator = new SafeFileEnumerator(\r\n                            directoryEnumerator.Current,\r\n                            pattern,\r\n                            SearchOption.AllDirectories,\r\n                            errors\r\n                            ).GetEnumerator();\r\n                    }\r\n                    catch (Exception ex)\r\n                    {\r\n                        errors.Add(ex);\r\n                        continue;\r\n                    }\r\n\r\n                    // Open up the current folder file enumerator\r\n                    if (fileEnumerator.MoveNext())\r\n                        return true;\r\n                }\r\n\r\n                Dispose(true, true);\r\n\r\n                return false;\r\n            }\r\n\r\n            public void Reset()\r\n            {\r\n                Dispose(true, true);\r\n\r\n                // Safely get the enumerators, including in the case where the root is not accessable\r\n                if (root != null)\r\n                {\r\n                    try\r\n                    {\r\n                        fileEnumerator = root.GetFileSystemInfos(pattern, SearchOption.TopDirectoryOnly).AsEnumerable<FileSystemInfo>().GetEnumerator();\r\n                    }\r\n                    catch (Exception ex)\r\n                    {\r\n                        errors.Add(ex);\r\n                        fileEnumerator = null;\r\n                    }\r\n\r\n                    try\r\n                    {\r\n                        directoryEnumerator = root.GetDirectories(\"*\", SearchOption.TopDirectoryOnly).AsEnumerable<DirectoryInfo>().GetEnumerator();\r\n                    }\r\n                    catch (Exception ex)\r\n                    {\r\n                        errors.Add(ex);\r\n                        directoryEnumerator = null;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Starting directory to search from\r\n        /// </summary>\r\n        private DirectoryInfo root;\r\n\r\n        /// <summary>\r\n        /// Filter pattern\r\n        /// </summary>\r\n        private string pattern;\r\n\r\n        /// <summary>\r\n        /// Indicator if search is recursive or not\r\n        /// </summary>\r\n        private SearchOption searchOption;\r\n\r\n        /// <summary>\r\n        /// Any errors captured\r\n        /// </summary>\r\n        private IList<Exception> errors;\r\n\r\n        /// <summary>\r\n        /// Create an Enumerator that will scan the file system, skipping directories where access is denied\r\n        /// </summary>\r\n        /// <param name=\"root\">Starting Directory</param>\r\n        /// <param name=\"pattern\">Filter pattern</param>\r\n        /// <param name=\"option\">Recursive or not</param>\r\n        public SafeFileEnumerator(string root, string pattern, SearchOption option)\r\n            : this(new DirectoryInfo(root), pattern, option)\r\n        { }\r\n\r\n        /// <summary>\r\n        /// Create an Enumerator that will scan the file system, skipping directories where access is denied\r\n        /// </summary>\r\n        /// <param name=\"root\">Starting Directory</param>\r\n        /// <param name=\"pattern\">Filter pattern</param>\r\n        /// <param name=\"option\">Recursive or not</param>\r\n        public SafeFileEnumerator(DirectoryInfo root, string pattern, SearchOption option)\r\n            : this(root, pattern, option, new List<Exception>())\r\n        { }\r\n\r\n        // Internal constructor for recursive itterator\r\n        private SafeFileEnumerator(DirectoryInfo root, string pattern, SearchOption option, IList<Exception> errors)\r\n        {\r\n            if (root == null || !root.Exists)\r\n            {\r\n                throw new ArgumentException(\"Root directory is not set or does not exist.\", \"root\");\r\n            }\r\n            this.root = root;\r\n            this.searchOption = option;\r\n            this.pattern = String.IsNullOrEmpty(pattern)\r\n                ? \"*\"\r\n                : pattern;\r\n            this.errors = errors;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Errors captured while parsing the file system.\r\n        /// </summary>\r\n        public Exception[] Errors\r\n        {\r\n            get\r\n            {\r\n                return errors.ToArray();\r\n            }\r\n        }\r\n\r\n        public IEnumerator<FileSystemInfo> GetEnumerator()\r\n        {\r\n            return new Enumerator(root, pattern, searchOption, errors);\r\n        }\r\n\r\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\r\n        {\r\n            return GetEnumerator();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Serialization.cs",
    "content": "﻿using Nett;\r\nusing Newtonsoft.Json;\r\nusing Newtonsoft.Json.Serialization;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Data;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing YamlDotNet.Serialization;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public static class SerializationExtensions\r\n    {\r\n        public static string ToJson(this object obj, bool formatted = false)\r\n        {\r\n            return Serialization.ToJson(obj, formatted);\r\n        }\r\n    }\r\n\r\n    public class JsonResolver : DefaultContractResolver\r\n    {\r\n        public static JsonResolver Global { get; } = new JsonResolver();\r\n\r\n        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)\r\n        {\r\n            var prop = base.CreateProperty(member, memberSerialization);\r\n            if (Attribute.IsDefined(member, typeof(SerializationPropertyNameAttribute)))\r\n            {\r\n                var att = (SerializationPropertyNameAttribute)Attribute.GetCustomAttribute(member, typeof(SerializationPropertyNameAttribute));\r\n                prop.PropertyName = att.PropertyName;\r\n            }\r\n\r\n            return prop;\r\n        }\r\n\r\n        protected override List<MemberInfo> GetSerializableMembers(Type objectType)\r\n        {\r\n            return objectType.\r\n                GetMembers(BindingFlags.Public | BindingFlags.Instance).\r\n                Where(a => a is PropertyInfo || a is FieldInfo).\r\n                Where(a => !Attribute.IsDefined(a, typeof(DontSerializeAttribute)) && !Attribute.IsDefined(a, typeof(JsonIgnoreAttribute))).\r\n                ToList();\r\n        }\r\n    }\r\n\r\n    public class DataSerializer : IDataSerializer\r\n    {\r\n        public string ToYaml(object obj)\r\n        {\r\n            return Serialization.ToYaml(obj);\r\n        }\r\n\r\n        public T FromYaml<T>(string yaml) where T : class\r\n        {\r\n            return Serialization.FromYaml<T>(yaml);\r\n        }\r\n\r\n        public T FromYamlFile<T>(string filePath) where T : class\r\n        {\r\n            return Serialization.FromYamlFile<T>(filePath);\r\n        }\r\n\r\n        public string ToJson(object obj, bool formatted = false)\r\n        {\r\n            return Serialization.ToJson(obj, formatted);\r\n        }\r\n\r\n        public void ToJsonStream(object obj, Stream stream, bool formatted = false)\r\n        {\r\n            Serialization.ToJsonStream(obj, stream, formatted);\r\n        }\r\n\r\n        public T FromJson<T>(string json) where T : class\r\n        {\r\n            return Serialization.FromJson<T>(json);\r\n        }\r\n\r\n        public T FromJsonStream<T>(Stream stream) where T : class\r\n        {\r\n            return Serialization.FromJsonStream<T>(stream);\r\n        }\r\n\r\n        public T FromJsonFile<T>(string filePath) where T : class\r\n        {\r\n            return Serialization.FromJsonFile<T>(filePath);\r\n        }\r\n\r\n        public T FromToml<T>(string toml) where T : class\r\n        {\r\n            return Serialization.FromToml<T>(toml);\r\n        }\r\n\r\n        public T FromTomlFile<T>(string filePath) where T : class\r\n        {\r\n            return Serialization.FromTomlFile<T>(filePath);\r\n        }\r\n\r\n        public bool TryFromYaml<T>(string yaml, out T content) where T : class\r\n        {\r\n            return Serialization.TryFromYaml(yaml, out content);\r\n        }\r\n\r\n        public bool TryFromYaml<T>(string yaml, out T content, out Exception error) where T : class\r\n        {\r\n            return Serialization.TryFromYaml(yaml, out content, out error);\r\n        }\r\n\r\n        public bool TryFromYamlFile<T>(string filePath, out T content) where T : class\r\n        {\r\n            return Serialization.TryFromYamlFile(filePath, out content);\r\n        }\r\n\r\n        public bool TryFromYamlFile<T>(string filePath, out T content, out Exception error) where T : class\r\n        {\r\n            return Serialization.TryFromYamlFile(filePath, out content, out error);\r\n        }\r\n\r\n        public bool TryFromJson<T>(string json, out T content) where T : class\r\n        {\r\n            return Serialization.TryFromJson(json, out content);\r\n        }\r\n\r\n        public bool TryFromJson<T>(string json, out T content, out Exception error) where T : class\r\n        {\r\n            return Serialization.TryFromJson(json, out content, out error);\r\n        }\r\n\r\n        public bool TryFromJsonStream<T>(Stream stream, out T content) where T : class\r\n        {\r\n            return Serialization.TryFromJsonStream(stream, out content);\r\n        }\r\n\r\n        public bool TryFromJsonStream<T>(Stream stream, out T content, out Exception error) where T : class\r\n        {\r\n            return Serialization.TryFromJsonStream(stream, out content, out error);\r\n        }\r\n\r\n        public bool TryFromJsonFile<T>(string filePath, out T content) where T : class\r\n        {\r\n            return Serialization.TryFromJsonFile(filePath, out content);\r\n        }\r\n\r\n        public bool TryFromJsonFile<T>(string filePath, out T content, out Exception error) where T : class\r\n        {\r\n            return Serialization.TryFromJsonFile(filePath, out content, out error);\r\n        }\r\n\r\n        public bool TryFromToml<T>(string toml, out T content) where T : class\r\n        {\r\n            return Serialization.TryFromToml(toml, out content);\r\n        }\r\n\r\n        public bool TryFromToml<T>(string toml, out T content, out Exception error) where T : class\r\n        {\r\n            return Serialization.TryFromToml(toml, out content, out error);\r\n        }\r\n\r\n        public bool TryFromTomlFile<T>(string filePath, out T content) where T : class\r\n        {\r\n            return Serialization.TryFromTomlFile(filePath, out content);\r\n        }\r\n\r\n        public bool TryFromTomlFile<T>(string filePath, out T content, out Exception error) where T : class\r\n        {\r\n            return Serialization.TryFromTomlFile(filePath, out content, out error);\r\n        }\r\n\r\n        public bool AreObjectsEqual(object object1, object object2)\r\n        {\r\n            return object1.IsEqualJson(object2);\r\n        }\r\n\r\n        public T GetClone<T>(T source) where T : class\r\n        {\r\n            return source.GetClone<T>();\r\n        }\r\n\r\n        public U GetClone<T, U>(T source)\r\n            where T : class\r\n            where U : class\r\n        {\r\n            return source.GetClone<T, U>();\r\n        }\r\n    }\r\n\r\n    public static class Serialization\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private static readonly JsonSerializerSettings jsonDesSettings = new JsonSerializerSettings\r\n        {\r\n            ContractResolver = JsonResolver.Global,\r\n            MaxDepth = 128\r\n        };\r\n\r\n        public static string ToYaml(object obj)\r\n        {\r\n            var serializer = new SerializerBuilder().Build();\r\n            return serializer.Serialize(obj);\r\n        }\r\n\r\n        public static T FromYaml<T>(string yaml) where T : class\r\n        {\r\n            try\r\n            {\r\n                var deserializer = new DeserializerBuilder().IgnoreUnmatchedProperties().Build();\r\n                return deserializer.Deserialize<T>(yaml);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, $\"Failed to deserialize {typeof(T).FullName} from yaml:\");\r\n                logger.Debug(yaml);\r\n                throw;\r\n            }\r\n        }\r\n\r\n        public static bool TryFromYaml<T>(string yaml, out T deserialized) where T : class\r\n        {\r\n            try\r\n            {\r\n                var deserializer = new DeserializerBuilder().IgnoreUnmatchedProperties().Build();\r\n                deserialized = deserializer.Deserialize<T>(yaml);\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n                deserialized = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool TryFromYaml<T>(string yaml, out T deserialized, out Exception error) where T : class\r\n        {\r\n            try\r\n            {\r\n                var deserializer = new DeserializerBuilder().IgnoreUnmatchedProperties().Build();\r\n                deserialized = deserializer.Deserialize<T>(yaml);\r\n                error = null;\r\n                return true;\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                deserialized = null;\r\n                error = e;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static T FromYamlFile<T>(string filePath) where T : class\r\n        {\r\n            return FromYaml<T>(FileSystem.ReadStringFromFile(filePath));\r\n        }\r\n\r\n        public static bool TryFromYamlFile<T>(string filePath, out T deserialized) where T : class\r\n        {\r\n            try\r\n            {\r\n                deserialized = FromYaml<T>(FileSystem.ReadStringFromFile(filePath));\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n                deserialized = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool TryFromYamlFile<T>(string filePath, out T deserialized, out Exception error) where T : class\r\n        {\r\n            try\r\n            {\r\n                deserialized = FromYaml<T>(FileSystem.ReadStringFromFile(filePath));\r\n                error = null;\r\n                return true;\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                deserialized = null;\r\n                error = e;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static T FromYamlStream<T>(Stream stream) where T : class\r\n        {\r\n            using (var sr = new StreamReader(stream, true))\r\n            {\r\n                var deserializer = new DeserializerBuilder().IgnoreUnmatchedProperties().Build();\r\n                return deserializer.Deserialize<T>(sr);\r\n            }\r\n        }\r\n\r\n        public static string ToJson(object obj, bool formatted = false, params JsonConverter[] converters)\r\n        {\r\n            return JsonConvert.SerializeObject(obj, new JsonSerializerSettings()\r\n            {\r\n                Formatting = formatted ? Formatting.Indented : Formatting.None,\r\n                NullValueHandling = NullValueHandling.Ignore,\r\n                ContractResolver = JsonResolver.Global,\r\n                Converters = converters,\r\n                MaxDepth = 128\r\n            });\r\n        }\r\n\r\n        public static void ToJsonStream(object obj, Stream stream, bool formatted = false)\r\n        {\r\n            using (var sw = new StreamWriter(stream, Encoding.UTF8, 4096, true))\r\n            using (var writer = new JsonTextWriter(sw))\r\n            {\r\n                var ser = JsonSerializer.Create(new JsonSerializerSettings()\r\n                {\r\n                    Formatting = formatted ? Formatting.Indented : Formatting.None,\r\n                    NullValueHandling = NullValueHandling.Ignore,\r\n                    ContractResolver = JsonResolver.Global,\r\n                    MaxDepth = 128\r\n                });\r\n\r\n                ser.Serialize(writer, obj);\r\n            }\r\n        }\r\n\r\n        public static T FromJson<T>(string json) where T : class\r\n        {\r\n            try\r\n            {\r\n                return JsonConvert.DeserializeObject<T>(json, jsonDesSettings);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, $\"Failed to deserialize {typeof(T).FullName} from json:\");\r\n                logger.Debug(json);\r\n                throw;\r\n            }\r\n        }\r\n\r\n        public static T FromJsonStream<T>(Stream stream) where T : class\r\n        {\r\n            using (var sr = new StreamReader(stream))\r\n            using (var reader = new JsonTextReader(sr))\r\n            {\r\n                return JsonSerializer.Create(jsonDesSettings).Deserialize<T>(reader);\r\n            }\r\n        }\r\n\r\n        public static bool TryFromJsonStream<T>(Stream stream, out T deserialized) where T : class\r\n        {\r\n            try\r\n            {\r\n                using (var sr = new StreamReader(stream))\r\n                using (var reader = new JsonTextReader(sr))\r\n                {\r\n                    deserialized = JsonSerializer.Create(jsonDesSettings).Deserialize<T>(reader);\r\n                }\r\n\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n                deserialized = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool TryFromJsonStream<T>(Stream stream, out T deserialized, out Exception error) where T : class\r\n        {\r\n            try\r\n            {\r\n                using (var sr = new StreamReader(stream))\r\n                using (var reader = new JsonTextReader(sr))\r\n                {\r\n                    deserialized = JsonSerializer.Create(jsonDesSettings).Deserialize<T>(reader);\r\n                }\r\n\r\n                error = null;\r\n                return true;\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                deserialized = null;\r\n                error = e;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static T FromJsonFile<T>(string filePath) where T : class\r\n        {\r\n            filePath = Paths.FixPathLength(filePath);\r\n            using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))\r\n            {\r\n                return FromJsonStream<T>(fs);\r\n            }\r\n        }\r\n\r\n        public static bool TryFromJsonFile<T>(string filePath, out T deserialized) where T : class\r\n        {\r\n            try\r\n            {\r\n                filePath = Paths.FixPathLength(filePath);\r\n                using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))\r\n                {\r\n                    deserialized = FromJsonStream<T>(fs);\r\n                }\r\n\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n                deserialized = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool TryFromJsonFile<T>(string filePath, out T deserialized, out Exception error) where T : class\r\n        {\r\n            try\r\n            {\r\n                filePath = Paths.FixPathLength(filePath);\r\n                using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))\r\n                {\r\n                    deserialized = FromJsonStream<T>(fs);\r\n                }\r\n\r\n                error = null;\r\n                return true;\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                deserialized = null;\r\n                error = e;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool TryFromJson<T>(string json, out T deserialized) where T : class\r\n        {\r\n            try\r\n            {\r\n                deserialized = JsonConvert.DeserializeObject<T>(json, jsonDesSettings);\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n                deserialized = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool TryFromJson<T>(string json, out T deserialized, out Exception error) where T : class\r\n        {\r\n            try\r\n            {\r\n                deserialized = JsonConvert.DeserializeObject<T>(json, jsonDesSettings);\r\n                error = null;\r\n                return true;\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                deserialized = null;\r\n                error = e;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static T FromToml<T>(string toml) where T : class\r\n        {\r\n            try\r\n            {\r\n                return Toml.ReadString<T>(toml);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, $\"Failed to deserialize {typeof(T).FullName} from toml:\");\r\n                logger.Debug(toml);\r\n                throw;\r\n            }\r\n        }\r\n\r\n        public static bool TryFromToml<T>(string toml, out T deserialized) where T : class\r\n        {\r\n            try\r\n            {\r\n                deserialized = Toml.ReadString<T>(toml);\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n                deserialized = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool TryFromToml<T>(string toml, out T deserialized, out Exception error) where T : class\r\n        {\r\n            try\r\n            {\r\n                deserialized = Toml.ReadString<T>(toml);\r\n                error = null;\r\n                return true;\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                deserialized = null;\r\n                error = e;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static T FromTomlFile<T>(string filePath) where T : class\r\n        {\r\n            return FromToml<T>(FileSystem.ReadStringFromFile(filePath));\r\n        }\r\n\r\n        public static bool TryFromTomlFile<T>(string filePath, out T deserialized) where T : class\r\n        {\r\n            try\r\n            {\r\n                deserialized = FromToml<T>(FileSystem.ReadStringFromFile(filePath));\r\n                return true;\r\n            }\r\n            catch\r\n            {\r\n                deserialized = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static bool TryFromTomlFile<T>(string filePath, out T deserialized, out Exception error) where T : class\r\n        {\r\n            try\r\n            {\r\n                deserialized = FromToml<T>(FileSystem.ReadStringFromFile(filePath));\r\n                error = null;\r\n                return true;\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                deserialized = null;\r\n                error = e;\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/SigningTools.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Security.Cryptography.X509Certificates;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.Native;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class SigningTools\r\n    {\r\n        private static uint WinVerifyTrust(string fileName)\r\n        {\r\n            Guid wintrust_action_generic_verify_v2 = new Guid(\"{00AAC56B-CD44-11d0-8CC2-00C04FC295EE}\");\r\n            uint result = 0;\r\n            using (WINTRUST_FILE_INFO fileInfo = new WINTRUST_FILE_INFO(fileName,\r\n                                                                        Guid.Empty))\r\n            using (Wintrust.UnmanagedPointer guidPtr = new Wintrust.UnmanagedPointer(\r\n                Marshal.AllocHGlobal(\r\n                    Marshal.SizeOf(typeof(Guid))),\r\n                    WINTRUST_DATA.AllocMethod.HGlobal))\r\n            using (Wintrust.UnmanagedPointer wvtDataPtr = new Wintrust.UnmanagedPointer(\r\n                Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WINTRUST_DATA))),\r\n                WINTRUST_DATA.AllocMethod.HGlobal))\r\n            {\r\n                WINTRUST_DATA data = new WINTRUST_DATA(fileInfo);\r\n                IntPtr pGuid = guidPtr;\r\n                IntPtr pData = wvtDataPtr;\r\n                Marshal.StructureToPtr(\r\n                    wintrust_action_generic_verify_v2,\r\n                    pGuid,\r\n                    true);\r\n                Marshal.StructureToPtr(\r\n                    data,\r\n                    pData,\r\n                    true);\r\n                result = User32.WinVerifyTrust(\r\n                    IntPtr.Zero,\r\n                    pGuid,\r\n                    pData);\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        public static bool IsTrusted(string path)\r\n        {\r\n            return WinVerifyTrust(path) == 0;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Sizes.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class AspectRatioTypeConverter : TypeConverter\r\n    {\r\n        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)\r\n        {\r\n            if (value is string ratio)\r\n            {\r\n                var regex = Regex.Match(ratio, @\"(\\d+):(\\d+)\");\r\n                if (regex.Success)\r\n                {\r\n                    return new AspectRatio(\r\n                        Convert.ToInt32(regex.Groups[1].Value),\r\n                        Convert.ToInt32(regex.Groups[2].Value));\r\n                }\r\n                else\r\n                {\r\n                    // For cases where this is called from designer element preview via binding expression\r\n                    return new AspectRatio();\r\n                }\r\n            }\r\n\r\n            throw new NotSupportedException($\"Cannot convert {value} to AspectRatio.\");\r\n        }\r\n\r\n        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)\r\n        {\r\n            return sourceType == typeof(string);\r\n        }\r\n    }\r\n\r\n    [TypeConverter(typeof(AspectRatioTypeConverter))]\r\n    public class AspectRatio : IEquatable<AspectRatio>\r\n    {\r\n        public int Width { get; set; }\r\n        public int Height { get; set; }\r\n\r\n        public AspectRatio()\r\n        {\r\n        }\r\n\r\n        public AspectRatio(int width, int height)\r\n        {\r\n            Width = width;\r\n            Height = height;\r\n        }\r\n\r\n        public override bool Equals(object obj) => Equals(obj as AspectRatio);\r\n\r\n        public bool Equals(AspectRatio other)\r\n        {\r\n            return other != null &&\r\n                   Width == other.Width &&\r\n                   Height == other.Height;\r\n        }\r\n\r\n        public override int GetHashCode()\r\n        {\r\n            return base.GetHashCode();\r\n        }\r\n\r\n        public static bool operator ==(AspectRatio obj1, AspectRatio obj2)\r\n        {\r\n            return obj1?.Equals(obj2) == true;\r\n        }\r\n\r\n        public static bool operator !=(AspectRatio obj1, AspectRatio obj2)\r\n        {\r\n            return obj1?.Equals(obj2) == false;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return $\"{Width}:{Height}\";\r\n        }\r\n\r\n        public double GetWidth(double height)\r\n        {\r\n            return ((double)Width / Height) * height;\r\n        }\r\n\r\n        public double GetHeight(double width)\r\n        {\r\n            return ((double)Height / Width) * width;\r\n        }\r\n    }\r\n\r\n    public class Sizes\r\n    {\r\n        public static AspectRatio GetAspectRatio(Rectangle rect)\r\n        {\r\n            return GetAspectRatio(rect.Width, rect.Height);\r\n        }\r\n\r\n        public static AspectRatio GetAspectRatio(int width, int height)\r\n        {\r\n            var gcd = GetGreatestCommonDivisor(width, height);\r\n            return new AspectRatio(width / gcd, height / gcd);\r\n        }\r\n\r\n        static int GetGreatestCommonDivisor(int a, int b)\r\n        {\r\n            return b == 0 ? a : GetGreatestCommonDivisor(b, a % b);\r\n        }\r\n\r\n        public static double GetMegapixelsFromRes(int width, int height)\r\n        {\r\n            return Math.Round((double)(width * height) / 1000000, 3);\r\n        }\r\n\r\n        public static double GetMegapixelsFromRes(ImageProperties props)\r\n        {\r\n            return GetMegapixelsFromRes(props.Width, props.Height);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Sqlite.cs",
    "content": "﻿using Playnite.SDK.Data;\r\nusing SqlNado;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class Sqlite : ISQLite, IDisposable\r\n    {\r\n        private SQLiteDatabase db;\r\n\r\n        public Sqlite(string dbPath, SqliteOpenFlags openFlags)\r\n        {\r\n            db = new SQLiteDatabase(dbPath, (SQLiteOpenOptions)openFlags);\r\n        }\r\n\r\n        public List<T> Query<T>(string query, params object[] args) where T : new()\r\n        {\r\n            return db.Load<T>(query, args).ToList();\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            db.Dispose();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/SystemDialogs.cs",
    "content": "﻿using Microsoft.Win32;\r\nusing Microsoft.WindowsAPICodePack.Dialogs;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class SystemDialogs\r\n    {\r\n        public static string SaveFile(Window owner, string filter, bool promptOverwrite, string initialDir = null)\r\n        {\r\n            var dialog = new SaveFileDialog()\r\n            {\r\n                Filter = filter,\r\n                OverwritePrompt = promptOverwrite\r\n            };\r\n\r\n            if (initialDir != null && Directory.Exists(initialDir))\r\n                dialog.InitialDirectory = initialDir;\r\n\r\n            var dialogResult = owner == null ? dialog.ShowDialog() : dialog.ShowDialog(owner);\r\n            if (dialogResult == true)\r\n            {\r\n                return dialog.FileName;\r\n            }\r\n            else\r\n            {\r\n                return string.Empty;\r\n            }\r\n        }\r\n\r\n        public static string SaveFile(Window owner, string filter, string initialDir = null)\r\n        {\r\n            return SaveFile(owner, filter, true, initialDir);\r\n        }\r\n\r\n        public static string SaveFile(string filter, bool promptOverwrite, string initialDir = null)\r\n        {\r\n            return SaveFile(null, filter, promptOverwrite, initialDir);\r\n        }\r\n\r\n        public static string SaveFile(string filter, string initialDir = null)\r\n        {\r\n            return SaveFile(null, filter, true, initialDir);\r\n        }\r\n\r\n        public static string SelectFolder(Window owner, string initialDir = null)\r\n        {\r\n            var dialog = new CommonOpenFileDialog()\r\n            {\r\n                IsFolderPicker = true\r\n            };\r\n\r\n            if (initialDir != null && Directory.Exists(initialDir))\r\n                dialog.InitialDirectory = initialDir;\r\n\r\n            var dialogResult = owner == null ? dialog.ShowDialog() : dialog.ShowDialog(owner);\r\n            if (dialogResult == CommonFileDialogResult.Ok)\r\n            {\r\n                return dialog.FileName;\r\n            }\r\n            else\r\n            {\r\n                return string.Empty;\r\n            }\r\n        }\r\n\r\n        public static List<string> SelectFiles(Window owner, string filter, string initialDir = null)\r\n        {\r\n            var dialog = new OpenFileDialog()\r\n            {\r\n                Filter = filter,\r\n                Multiselect = true\r\n            };\r\n\r\n            if (!initialDir.IsNullOrWhiteSpace() && Directory.Exists(initialDir))\r\n                dialog.InitialDirectory = initialDir;\r\n\r\n            var dialogResult = owner == null ? dialog.ShowDialog() : dialog.ShowDialog(owner);\r\n            if (dialogResult == true)\r\n            {\r\n                return dialog.FileNames.ToList();\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static List<string> SelectFiles(string filter)\r\n        {\r\n            return SelectFiles(null, filter);\r\n        }\r\n\r\n        public static string SelectFile(Window owner, string filter, string initialDir = null)\r\n        {\r\n            var dialog = new OpenFileDialog()\r\n            {\r\n                Filter = filter\r\n            };\r\n\r\n            if (!initialDir.IsNullOrWhiteSpace() && Directory.Exists(initialDir))\r\n                dialog.InitialDirectory = initialDir;\r\n\r\n            var dialogResult = owner == null ? dialog.ShowDialog() : dialog.ShowDialog(owner);\r\n            if (dialogResult == true)\r\n            {\r\n                return dialog.FileName;\r\n            }\r\n            else\r\n            {\r\n                return string.Empty;\r\n            }\r\n        }\r\n\r\n        public static string SelectFile(string filter, string initialDir = null)\r\n        {\r\n            return SelectFile(null, filter, initialDir);\r\n        }\r\n\r\n        public static string SelectIconFile(Window owner, string initialDir = null)\r\n        {\r\n            return SelectFile(owner, \"Icon Files|*.bmp;*.jpg*;*.jpeg*;*.png;*.gif;*.ico;*.tga;*.exe;*.tif;*.webp;*.avif\", initialDir);\r\n        }\r\n\r\n        public static string SelectIconFile(string initialDir = null)\r\n        {\r\n            return SelectIconFile(null, initialDir);\r\n        }\r\n\r\n        public static string SelectImageFile(Window owner, string initialDir = null)\r\n        {\r\n            return SelectFile(owner, \"Image Files|*.bmp;*.jpg*;*.jpeg*;*.png;*.gif;*.tga;*.tif;*.webp;*.avif\", initialDir);\r\n        }\r\n\r\n        public static string SelectImageFile(string initialDir = null)\r\n        {\r\n            return SelectIconFile(null, initialDir);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/TGASharpLib.cs",
    "content": "﻿/*                         MIT License\n                 Copyright (c) 2017 TGASharpLib\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Drawing;\nusing System.Drawing.Imaging;\nusing System.IO;\nusing System.Runtime.InteropServices;\n\nnamespace TGASharpLib\n{\n    #region Enums\n    /// <summary>\n    /// <para>The first 128 Color Map Type codes are reserved for use by Truevision,\n    /// while the second set of 128 Color Map Type codes(128 to 255) may be used for\n    /// developer applications.</para>\n    /// True-Color images do not normally make use of the color map field, but some current\n    /// applications store palette information or developer-defined information in this field.\n    /// It is best to check Field 3, Image Type, to make sure you have a file which can use the\n    /// data stored in the Color Map Field.\n    /// Otherwise ignore the information. When saving or creating files for True-Color\n    /// images do not use this field and set it to Zero to ensure compatibility. Please refer\n    /// to the Developer Area specification for methods of storing developer defined information.\n    /// </summary>\n    public enum TgaColorMapType : byte\n    {\n        NoColorMap = 0,\n        ColorMap = 1,\n        Truevision_2,\n        Truevision_3,\n        Truevision_4,\n        Truevision_5,\n        Truevision_6,\n        Truevision_7,\n        Truevision_8,\n        Truevision_9,\n        Truevision_10,\n        Truevision_11,\n        Truevision_12,\n        Truevision_13,\n        Truevision_14,\n        Truevision_15,\n        Truevision_16,\n        Truevision_17,\n        Truevision_18,\n        Truevision_19,\n        Truevision_20,\n        Truevision_21,\n        Truevision_22,\n        Truevision_23,\n        Truevision_24,\n        Truevision_25,\n        Truevision_26,\n        Truevision_27,\n        Truevision_28,\n        Truevision_29,\n        Truevision_30,\n        Truevision_31,\n        Truevision_32,\n        Truevision_33,\n        Truevision_34,\n        Truevision_35,\n        Truevision_36,\n        Truevision_37,\n        Truevision_38,\n        Truevision_39,\n        Truevision_40,\n        Truevision_41,\n        Truevision_42,\n        Truevision_43,\n        Truevision_44,\n        Truevision_45,\n        Truevision_46,\n        Truevision_47,\n        Truevision_48,\n        Truevision_49,\n        Truevision_50,\n        Truevision_51,\n        Truevision_52,\n        Truevision_53,\n        Truevision_54,\n        Truevision_55,\n        Truevision_56,\n        Truevision_57,\n        Truevision_58,\n        Truevision_59,\n        Truevision_60,\n        Truevision_61,\n        Truevision_62,\n        Truevision_63,\n        Truevision_64,\n        Truevision_65,\n        Truevision_66,\n        Truevision_67,\n        Truevision_68,\n        Truevision_69,\n        Truevision_70,\n        Truevision_71,\n        Truevision_72,\n        Truevision_73,\n        Truevision_74,\n        Truevision_75,\n        Truevision_76,\n        Truevision_77,\n        Truevision_78,\n        Truevision_79,\n        Truevision_80,\n        Truevision_81,\n        Truevision_82,\n        Truevision_83,\n        Truevision_84,\n        Truevision_85,\n        Truevision_86,\n        Truevision_87,\n        Truevision_88,\n        Truevision_89,\n        Truevision_90,\n        Truevision_91,\n        Truevision_92,\n        Truevision_93,\n        Truevision_94,\n        Truevision_95,\n        Truevision_96,\n        Truevision_97,\n        Truevision_98,\n        Truevision_99,\n        Truevision_100,\n        Truevision_101,\n        Truevision_102,\n        Truevision_103,\n        Truevision_104,\n        Truevision_105,\n        Truevision_106,\n        Truevision_107,\n        Truevision_108,\n        Truevision_109,\n        Truevision_110,\n        Truevision_111,\n        Truevision_112,\n        Truevision_113,\n        Truevision_114,\n        Truevision_115,\n        Truevision_116,\n        Truevision_117,\n        Truevision_118,\n        Truevision_119,\n        Truevision_120,\n        Truevision_121,\n        Truevision_122,\n        Truevision_123,\n        Truevision_124,\n        Truevision_125,\n        Truevision_126,\n        Truevision_127,\n        Other_128,\n        Other_129,\n        Other_130,\n        Other_131,\n        Other_132,\n        Other_133,\n        Other_134,\n        Other_135,\n        Other_136,\n        Other_137,\n        Other_138,\n        Other_139,\n        Other_140,\n        Other_141,\n        Other_142,\n        Other_143,\n        Other_144,\n        Other_145,\n        Other_146,\n        Other_147,\n        Other_148,\n        Other_149,\n        Other_150,\n        Other_151,\n        Other_152,\n        Other_153,\n        Other_154,\n        Other_155,\n        Other_156,\n        Other_157,\n        Other_158,\n        Other_159,\n        Other_160,\n        Other_161,\n        Other_162,\n        Other_163,\n        Other_164,\n        Other_165,\n        Other_166,\n        Other_167,\n        Other_168,\n        Other_169,\n        Other_170,\n        Other_171,\n        Other_172,\n        Other_173,\n        Other_174,\n        Other_175,\n        Other_176,\n        Other_177,\n        Other_178,\n        Other_179,\n        Other_180,\n        Other_181,\n        Other_182,\n        Other_183,\n        Other_184,\n        Other_185,\n        Other_186,\n        Other_187,\n        Other_188,\n        Other_189,\n        Other_190,\n        Other_191,\n        Other_192,\n        Other_193,\n        Other_194,\n        Other_195,\n        Other_196,\n        Other_197,\n        Other_198,\n        Other_199,\n        Other_200,\n        Other_201,\n        Other_202,\n        Other_203,\n        Other_204,\n        Other_205,\n        Other_206,\n        Other_207,\n        Other_208,\n        Other_209,\n        Other_210,\n        Other_211,\n        Other_212,\n        Other_213,\n        Other_214,\n        Other_215,\n        Other_216,\n        Other_217,\n        Other_218,\n        Other_219,\n        Other_220,\n        Other_221,\n        Other_222,\n        Other_223,\n        Other_224,\n        Other_225,\n        Other_226,\n        Other_227,\n        Other_228,\n        Other_229,\n        Other_230,\n        Other_231,\n        Other_232,\n        Other_233,\n        Other_234,\n        Other_235,\n        Other_236,\n        Other_237,\n        Other_238,\n        Other_239,\n        Other_240,\n        Other_241,\n        Other_242,\n        Other_243,\n        Other_244,\n        Other_245,\n        Other_246,\n        Other_247,\n        Other_248,\n        Other_249,\n        Other_250,\n        Other_251,\n        Other_252,\n        Other_253,\n        Other_254,\n        Other_255\n    }\n\n    /// <summary>\n    /// Establishes the number of bits per entry. Typically 15, 16, 24 or 32-bit values are used.\n    /// <para>When working with VDA or VDA/D cards it is preferred that you select 16 bits(5 bits\n    /// per primary with 1 bit to select interrupt control) and set the 16th bit to 0 so that the\n    /// interrupt bit is disabled. Even if this field is set to 15 bits(5 bits per primary) you\n    /// must still parse the color map data 16 bits at a time and ignore the 16th bit.</para>\n    /// <para>When working with a TARGA M8 card you would select 24 bits (8 bits per primary)\n    /// since the color map is defined as 256 entries of 24 bit color values.</para>\n    /// When working with a TrueVista card(ATVista or NuVista) you would select 24-bit(8 bits per\n    /// primary) or 32-bit(8 bits per primary including Alpha channel) depending on your\n    /// application’s use of look-up tables. It is suggested that when working with 16-bit and\n    /// 32-bit color images, you store them as True-Color images and do not use the color map \n    /// field to store look-up tables. Please refer to the TGA Extensions for fields better suited\n    /// to storing look-up table information.\n    /// </summary>\n    public enum TgaColorMapEntrySize : byte\n    {\n        Other = 0,\n        X1R5G5B5 = 15,\n        A1R5G5B5 = 16,\n        R8G8B8 = 24,\n        A8R8G8B8 = 32\n    }\n\n    /// <summary>\n    /// Truevision has currently defined seven image types:\n    /// <para>0 - No Image Data Included;</para>\n    /// <para>1 - Uncompressed, Color-mapped Image;</para>\n    /// <para>2 - Uncompressed, True-color Image;</para>\n    /// <para>3 - Uncompressed, Black-and-white Image;</para>\n    /// <para>9 - Run-length encoded, Color-mapped Image;</para>\n    /// <para>10 - Run-length encoded, True-color Image;</para>\n    /// <para>11 - Run-length encoded, Black-and-white Image.</para>\n    /// Image Data Type codes 0 to 127 are reserved for use by Truevision for general applications.\n    /// Image Data Type codes 128 to 255 may be used for developer applications.\n    /// </summary>\n    public enum TgaImageType : byte\n    {\n        NoImageData = 0,\n        Uncompressed_ColorMapped = 1,\n        Uncompressed_TrueColor,\n        Uncompressed_BlackWhite,\n        _Truevision_4,\n        _Truevision_5,\n        _Truevision_6,\n        _Truevision_7,\n        _Truevision_8,\n        RLE_ColorMapped = 9,\n        RLE_TrueColor,\n        RLE_BlackWhite,\n        _Truevision_12,\n        _Truevision_13,\n        _Truevision_14,\n        _Truevision_15,\n        _Truevision_16,\n        _Truevision_17,\n        _Truevision_18,\n        _Truevision_19,\n        _Truevision_20,\n        _Truevision_21,\n        _Truevision_22,\n        _Truevision_23,\n        _Truevision_24,\n        _Truevision_25,\n        _Truevision_26,\n        _Truevision_27,\n        _Truevision_28,\n        _Truevision_29,\n        _Truevision_30,\n        _Truevision_31,\n        _Truevision_32,\n        _Truevision_33,\n        _Truevision_34,\n        _Truevision_35,\n        _Truevision_36,\n        _Truevision_37,\n        _Truevision_38,\n        _Truevision_39,\n        _Truevision_40,\n        _Truevision_41,\n        _Truevision_42,\n        _Truevision_43,\n        _Truevision_44,\n        _Truevision_45,\n        _Truevision_46,\n        _Truevision_47,\n        _Truevision_48,\n        _Truevision_49,\n        _Truevision_50,\n        _Truevision_51,\n        _Truevision_52,\n        _Truevision_53,\n        _Truevision_54,\n        _Truevision_55,\n        _Truevision_56,\n        _Truevision_57,\n        _Truevision_58,\n        _Truevision_59,\n        _Truevision_60,\n        _Truevision_61,\n        _Truevision_62,\n        _Truevision_63,\n        _Truevision_64,\n        _Truevision_65,\n        _Truevision_66,\n        _Truevision_67,\n        _Truevision_68,\n        _Truevision_69,\n        _Truevision_70,\n        _Truevision_71,\n        _Truevision_72,\n        _Truevision_73,\n        _Truevision_74,\n        _Truevision_75,\n        _Truevision_76,\n        _Truevision_77,\n        _Truevision_78,\n        _Truevision_79,\n        _Truevision_80,\n        _Truevision_81,\n        _Truevision_82,\n        _Truevision_83,\n        _Truevision_84,\n        _Truevision_85,\n        _Truevision_86,\n        _Truevision_87,\n        _Truevision_88,\n        _Truevision_89,\n        _Truevision_90,\n        _Truevision_91,\n        _Truevision_92,\n        _Truevision_93,\n        _Truevision_94,\n        _Truevision_95,\n        _Truevision_96,\n        _Truevision_97,\n        _Truevision_98,\n        _Truevision_99,\n        _Truevision_100,\n        _Truevision_101,\n        _Truevision_102,\n        _Truevision_103,\n        _Truevision_104,\n        _Truevision_105,\n        _Truevision_106,\n        _Truevision_107,\n        _Truevision_108,\n        _Truevision_109,\n        _Truevision_110,\n        _Truevision_111,\n        _Truevision_112,\n        _Truevision_113,\n        _Truevision_114,\n        _Truevision_115,\n        _Truevision_116,\n        _Truevision_117,\n        _Truevision_118,\n        _Truevision_119,\n        _Truevision_120,\n        _Truevision_121,\n        _Truevision_122,\n        _Truevision_123,\n        _Truevision_124,\n        _Truevision_125,\n        _Truevision_126,\n        _Truevision_127,\n        _Other_128,\n        _Other_129,\n        _Other_130,\n        _Other_131,\n        _Other_132,\n        _Other_133,\n        _Other_134,\n        _Other_135,\n        _Other_136,\n        _Other_137,\n        _Other_138,\n        _Other_139,\n        _Other_140,\n        _Other_141,\n        _Other_142,\n        _Other_143,\n        _Other_144,\n        _Other_145,\n        _Other_146,\n        _Other_147,\n        _Other_148,\n        _Other_149,\n        _Other_150,\n        _Other_151,\n        _Other_152,\n        _Other_153,\n        _Other_154,\n        _Other_155,\n        _Other_156,\n        _Other_157,\n        _Other_158,\n        _Other_159,\n        _Other_160,\n        _Other_161,\n        _Other_162,\n        _Other_163,\n        _Other_164,\n        _Other_165,\n        _Other_166,\n        _Other_167,\n        _Other_168,\n        _Other_169,\n        _Other_170,\n        _Other_171,\n        _Other_172,\n        _Other_173,\n        _Other_174,\n        _Other_175,\n        _Other_176,\n        _Other_177,\n        _Other_178,\n        _Other_179,\n        _Other_180,\n        _Other_181,\n        _Other_182,\n        _Other_183,\n        _Other_184,\n        _Other_185,\n        _Other_186,\n        _Other_187,\n        _Other_188,\n        _Other_189,\n        _Other_190,\n        _Other_191,\n        _Other_192,\n        _Other_193,\n        _Other_194,\n        _Other_195,\n        _Other_196,\n        _Other_197,\n        _Other_198,\n        _Other_199,\n        _Other_200,\n        _Other_201,\n        _Other_202,\n        _Other_203,\n        _Other_204,\n        _Other_205,\n        _Other_206,\n        _Other_207,\n        _Other_208,\n        _Other_209,\n        _Other_210,\n        _Other_211,\n        _Other_212,\n        _Other_213,\n        _Other_214,\n        _Other_215,\n        _Other_216,\n        _Other_217,\n        _Other_218,\n        _Other_219,\n        _Other_220,\n        _Other_221,\n        _Other_222,\n        _Other_223,\n        _Other_224,\n        _Other_225,\n        _Other_226,\n        _Other_227,\n        _Other_228,\n        _Other_229,\n        _Other_230,\n        _Other_231,\n        _Other_232,\n        _Other_233,\n        _Other_234,\n        _Other_235,\n        _Other_236,\n        _Other_237,\n        _Other_238,\n        _Other_239,\n        _Other_240,\n        _Other_241,\n        _Other_242,\n        _Other_243,\n        _Other_244,\n        _Other_245,\n        _Other_246,\n        _Other_247,\n        _Other_248,\n        _Other_249,\n        _Other_250,\n        _Other_251,\n        _Other_252,\n        _Other_253,\n        _Other_254,\n        _Other_255\n    }\n\n    /// <summary>\n    /// Number of bits per pixel. This number includes the Attribute or Alpha channel bits.\n    /// Common values are 8, 16, 24 and 32 but other pixel depths could be used.\n    /// </summary>\n    public enum TgaPixelDepth : byte\n    {\n        Other = 0,\n        Bpp8 = 8,\n        Bpp16 = 16,\n        Bpp24 = 24,\n        Bpp32 = 32\n    }\n\n    /// <summary>\n    /// Used to indicate the order in which pixel data is transferred from the file to the screen.\n    /// (Bit 4 (bit 0 in enum) is for left-to-right ordering and bit 5 (bit 1 in enum) is for\n    /// topto-bottom ordering as shown below.)\n    /// </summary>\n    public enum TgaImgOrigin : byte\n    {\n        BottomLeft = 0,\n        BottomRight,\n        TopLeft,\n        TopRight\n    }\n\n    /// <summary>\n    /// Contains a value which specifies the type of Alpha channel\n    /// data contained in the file. Value Meaning:\n    /// <para>0: no Alpha data included (bits 3-0 of field 5.6 should also be set to zero)</para>\n    /// <para>1: undefined data in the Alpha field, can be ignored</para>\n    /// <para>2: undefined data in the Alpha field, but should be retained</para>\n    /// <para>3: useful Alpha channel data is present</para>\n    /// <para>4: pre-multiplied Alpha(see description below)</para>\n    /// <para>5 -127: RESERVED</para>\n    /// <para>128-255: Un-assigned</para>\n    /// <para>Pre-multiplied Alpha Example: Suppose the Alpha channel data is being used to specify the\n    /// opacity of each pixel(for use when the image is overlayed on another image), where 0 indicates\n    /// that the pixel is completely transparent and a value of 1 indicates that the pixel is\n    /// completely opaque(assume all component values have been normalized).</para>\n    /// <para>A quadruple(a, r, g, b) of( 0.5, 1, 0, 0) would indicate that the pixel is pure red with a\n    /// transparency of one-half. For numerous reasons(including image compositing) is is better to\n    /// pre-multiply the individual color components with the value in the Alpha channel.</para>\n    /// A pre-multiplication of the above would produce a quadruple(0.5, 0.5, 0, 0).\n    /// A value of 3 in the Attributes Type Field(field 23) would indicate that the color components\n    /// of the pixel have already been scaled by the value in the Alpha channel.\n    /// </summary>\n    public enum TgaAttrType : byte\n    {\n        NoAlpha = 0,\n        UndefinedAlphaCanBeIgnored,\n        UndefinedAlphaButShouldBeRetained,\n        UsefulAlpha,\n        PreMultipliedAlpha,\n        _Reserved_5,\n        _Reserved_6,\n        _Reserved_7,\n        _Reserved_8,\n        _Reserved_9,\n        _Reserved_10,\n        _Reserved_11,\n        _Reserved_12,\n        _Reserved_13,\n        _Reserved_14,\n        _Reserved_15,\n        _Reserved_16,\n        _Reserved_17,\n        _Reserved_18,\n        _Reserved_19,\n        _Reserved_20,\n        _Reserved_21,\n        _Reserved_22,\n        _Reserved_23,\n        _Reserved_24,\n        _Reserved_25,\n        _Reserved_26,\n        _Reserved_27,\n        _Reserved_28,\n        _Reserved_29,\n        _Reserved_30,\n        _Reserved_31,\n        _Reserved_32,\n        _Reserved_33,\n        _Reserved_34,\n        _Reserved_35,\n        _Reserved_36,\n        _Reserved_37,\n        _Reserved_38,\n        _Reserved_39,\n        _Reserved_40,\n        _Reserved_41,\n        _Reserved_42,\n        _Reserved_43,\n        _Reserved_44,\n        _Reserved_45,\n        _Reserved_46,\n        _Reserved_47,\n        _Reserved_48,\n        _Reserved_49,\n        _Reserved_50,\n        _Reserved_51,\n        _Reserved_52,\n        _Reserved_53,\n        _Reserved_54,\n        _Reserved_55,\n        _Reserved_56,\n        _Reserved_57,\n        _Reserved_58,\n        _Reserved_59,\n        _Reserved_60,\n        _Reserved_61,\n        _Reserved_62,\n        _Reserved_63,\n        _Reserved_64,\n        _Reserved_65,\n        _Reserved_66,\n        _Reserved_67,\n        _Reserved_68,\n        _Reserved_69,\n        _Reserved_70,\n        _Reserved_71,\n        _Reserved_72,\n        _Reserved_73,\n        _Reserved_74,\n        _Reserved_75,\n        _Reserved_76,\n        _Reserved_77,\n        _Reserved_78,\n        _Reserved_79,\n        _Reserved_80,\n        _Reserved_81,\n        _Reserved_82,\n        _Reserved_83,\n        _Reserved_84,\n        _Reserved_85,\n        _Reserved_86,\n        _Reserved_87,\n        _Reserved_88,\n        _Reserved_89,\n        _Reserved_90,\n        _Reserved_91,\n        _Reserved_92,\n        _Reserved_93,\n        _Reserved_94,\n        _Reserved_95,\n        _Reserved_96,\n        _Reserved_97,\n        _Reserved_98,\n        _Reserved_99,\n        _Reserved_100,\n        _Reserved_101,\n        _Reserved_102,\n        _Reserved_103,\n        _Reserved_104,\n        _Reserved_105,\n        _Reserved_106,\n        _Reserved_107,\n        _Reserved_108,\n        _Reserved_109,\n        _Reserved_110,\n        _Reserved_111,\n        _Reserved_112,\n        _Reserved_113,\n        _Reserved_114,\n        _Reserved_115,\n        _Reserved_116,\n        _Reserved_117,\n        _Reserved_118,\n        _Reserved_119,\n        _Reserved_120,\n        _Reserved_121,\n        _Reserved_122,\n        _Reserved_123,\n        _Reserved_124,\n        _Reserved_125,\n        _Reserved_126,\n        _Reserved_127,\n        _UnAssigned_128,\n        _UnAssigned_129,\n        _UnAssigned_130,\n        _UnAssigned_131,\n        _UnAssigned_132,\n        _UnAssigned_133,\n        _UnAssigned_134,\n        _UnAssigned_135,\n        _UnAssigned_136,\n        _UnAssigned_137,\n        _UnAssigned_138,\n        _UnAssigned_139,\n        _UnAssigned_140,\n        _UnAssigned_141,\n        _UnAssigned_142,\n        _UnAssigned_143,\n        _UnAssigned_144,\n        _UnAssigned_145,\n        _UnAssigned_146,\n        _UnAssigned_147,\n        _UnAssigned_148,\n        _UnAssigned_149,\n        _UnAssigned_150,\n        _UnAssigned_151,\n        _UnAssigned_152,\n        _UnAssigned_153,\n        _UnAssigned_154,\n        _UnAssigned_155,\n        _UnAssigned_156,\n        _UnAssigned_157,\n        _UnAssigned_158,\n        _UnAssigned_159,\n        _UnAssigned_160,\n        _UnAssigned_161,\n        _UnAssigned_162,\n        _UnAssigned_163,\n        _UnAssigned_164,\n        _UnAssigned_165,\n        _UnAssigned_166,\n        _UnAssigned_167,\n        _UnAssigned_168,\n        _UnAssigned_169,\n        _UnAssigned_170,\n        _UnAssigned_171,\n        _UnAssigned_172,\n        _UnAssigned_173,\n        _UnAssigned_174,\n        _UnAssigned_175,\n        _UnAssigned_176,\n        _UnAssigned_177,\n        _UnAssigned_178,\n        _UnAssigned_179,\n        _UnAssigned_180,\n        _UnAssigned_181,\n        _UnAssigned_182,\n        _UnAssigned_183,\n        _UnAssigned_184,\n        _UnAssigned_185,\n        _UnAssigned_186,\n        _UnAssigned_187,\n        _UnAssigned_188,\n        _UnAssigned_189,\n        _UnAssigned_190,\n        _UnAssigned_191,\n        _UnAssigned_192,\n        _UnAssigned_193,\n        _UnAssigned_194,\n        _UnAssigned_195,\n        _UnAssigned_196,\n        _UnAssigned_197,\n        _UnAssigned_198,\n        _UnAssigned_199,\n        _UnAssigned_200,\n        _UnAssigned_201,\n        _UnAssigned_202,\n        _UnAssigned_203,\n        _UnAssigned_204,\n        _UnAssigned_205,\n        _UnAssigned_206,\n        _UnAssigned_207,\n        _UnAssigned_208,\n        _UnAssigned_209,\n        _UnAssigned_210,\n        _UnAssigned_211,\n        _UnAssigned_212,\n        _UnAssigned_213,\n        _UnAssigned_214,\n        _UnAssigned_215,\n        _UnAssigned_216,\n        _UnAssigned_217,\n        _UnAssigned_218,\n        _UnAssigned_219,\n        _UnAssigned_220,\n        _UnAssigned_221,\n        _UnAssigned_222,\n        _UnAssigned_223,\n        _UnAssigned_224,\n        _UnAssigned_225,\n        _UnAssigned_226,\n        _UnAssigned_227,\n        _UnAssigned_228,\n        _UnAssigned_229,\n        _UnAssigned_230,\n        _UnAssigned_231,\n        _UnAssigned_232,\n        _UnAssigned_233,\n        _UnAssigned_234,\n        _UnAssigned_235,\n        _UnAssigned_236,\n        _UnAssigned_237,\n        _UnAssigned_238,\n        _UnAssigned_239,\n        _UnAssigned_240,\n        _UnAssigned_241,\n        _UnAssigned_242,\n        _UnAssigned_243,\n        _UnAssigned_244,\n        _UnAssigned_245,\n        _UnAssigned_246,\n        _UnAssigned_247,\n        _UnAssigned_248,\n        _UnAssigned_249,\n        _UnAssigned_250,\n        _UnAssigned_251,\n        _UnAssigned_252,\n        _UnAssigned_253,\n        _UnAssigned_254,\n        _UnAssigned_255\n    }\n    #endregion\n\n    #region Classes\n    public class TgaColorKey : ICloneable\n    {\n        byte a = 0;\n        byte r = 0;\n        byte g = 0;\n        byte b = 0;\n\n        public TgaColorKey()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaColorKey\"/> from ARGB bytes.\n        /// </summary>\n        /// <param name=\"A\">Alpha value.</param>\n        /// <param name=\"R\">Red value.</param>\n        /// <param name=\"G\">Green value.</param>\n        /// <param name=\"B\">Blue value.</param>\n        public TgaColorKey(byte A, byte R, byte G, byte B)\n        {\n            a = A;\n            r = R;\n            g = G;\n            b = B;\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaColorKey\"/> from ARGB bytes.\n        /// </summary>\n        /// <param name=\"Bytes\">Array of bytes(byte[4]).</param>\n        public TgaColorKey(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            if (Bytes.Length != Size)\n                throw new ArgumentOutOfRangeException(nameof(Bytes.Length) + \" must be equal \" + Size + \"!\");\n\n            Color color = Color.FromArgb(BitConverter.ToInt32(Bytes, 0));\n            a = color.A;\n            r = color.R;\n            g = color.G;\n            b = color.B;\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaColorKey\"/> from <see cref=\"int\"/>.\n        /// </summary>\n        /// <param name=\"ARGB\">32bit ARGB integer color value.</param>\n        public TgaColorKey(int ARGB)\n        {\n            Color ColorARGB = Color.FromArgb(ARGB);\n            a = ColorARGB.A;\n            r = ColorARGB.R;\n            g = ColorARGB.G;\n            b = ColorARGB.B;\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaColorKey\"/> from <see cref=\"Color\"/>.\n        /// </summary>\n        /// <param name=\"color\">GDI+ <see cref=\"Color\"/> value.</param>\n        public TgaColorKey(Color color)\n        {\n            a = color.A;\n            r = color.R;\n            g = color.G;\n            b = color.B;\n        }\n\n        /// <summary>\n        /// Gets or sets alpha color value.\n        /// </summary>\n        public byte A\n        {\n            get { return a; }\n            set { a = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets red color value.\n        /// </summary>\n        public byte R\n        {\n            get { return r; }\n            set { r = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets green color value.\n        /// </summary>\n        public byte G\n        {\n            get { return g; }\n            set { g = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets blue color value.\n        /// </summary>\n        public byte B\n        {\n            get { return b; }\n            set { b = value; }\n        }\n\n        /// <summary>\n        /// Gets TGA Field size in bytes.\n        /// </summary>\n        public const int Size = 4;\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaColorKey\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaColorKey\"/></returns>\n        public TgaColorKey Clone()\n        {\n            return new TgaColorKey(a, r, g, b);\n        }\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaColorKey\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaColorKey\"/></returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaColorKey) ? Equals((TgaColorKey)obj) : false);\n        }\n\n        public bool Equals(TgaColorKey item)\n        {\n            return (a == item.a && r == item.r && g == item.g && b == item.b);\n        }\n\n        public static bool operator ==(TgaColorKey item1, TgaColorKey item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaColorKey item1, TgaColorKey item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            return ToInt().GetHashCode();\n        }\n\n        /// <summary>\n        /// Gets <see cref=\"TgaColorKey\"/> like string.\n        /// </summary>\n        /// <returns>String in ARGB format.</returns>\n        public override string ToString()\n        {\n            return String.Format(\"{0}={1}, {2}={3}, {4}={5}, {6}={7}\",\n                nameof(A), a, nameof(R), r, nameof(G), g, nameof(B), b);\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaColorKey\"/> to byte array.\n        /// </summary>\n        /// <returns>Byte array with length = 4.</returns>\n        public byte[] ToBytes()\n        {\n            return BitConverter.GetBytes(ToInt());\n        }\n\n        /// <summary>\n        /// Gets <see cref=\"TgaColorKey\"/> like GDI+ <see cref=\"Color\"/>.\n        /// </summary>\n        /// <returns><see cref=\"Color\"/> value of <see cref=\"TgaColorKey\"/>.</returns>\n        public Color ToColor()\n        {\n            return Color.FromArgb(a, r, g, b);\n        }\n\n        /// <summary>\n        /// Gets <see cref=\"TgaColorKey\"/> like ARGB <see cref=\"int\"/>.\n        /// </summary>\n        /// <returns>ARGB <see cref=\"int\"/> value of <see cref=\"TgaColorKey\"/>.</returns>\n        public int ToInt()\n        {\n            return ToColor().ToArgb();\n        }\n    }\n\n    /// <summary>\n    /// This field (5 bytes) and its sub-fields describe the color map (if any) used for the image.\n    /// If the Color Map Type field is set to zero, indicating that no color map exists, then\n    /// these 5 bytes should be set to zero. These bytes always must be written to the file.\n    /// </summary>\n    public class TgaColorMapSpec : ICloneable\n    {\n        ushort firstEntryIndex = 0;\n        ushort colorMapLength = 0;\n        TgaColorMapEntrySize colorMapEntrySize = TgaColorMapEntrySize.Other;\n\n        /// <summary>\n        /// Make new <see cref=\"TgaColorMapSpec\"/>.\n        /// </summary>\n        public TgaColorMapSpec()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaColorMapSpec\"/> from bytes.\n        /// </summary>\n        /// <param name=\"Bytes\">Array of bytes(byte[5]).</param>\n        public TgaColorMapSpec(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            if (Bytes.Length != Size)\n                throw new ArgumentOutOfRangeException(nameof(Bytes.Length) + \" must be equal \" + Size + \"!\");\n\n            firstEntryIndex = BitConverter.ToUInt16(Bytes, 0);\n            colorMapLength = BitConverter.ToUInt16(Bytes, 2);\n            colorMapEntrySize = (TgaColorMapEntrySize)Bytes[4];\n        }\n\n        /// <summary>\n        /// Field 4.1 (2 bytes):\n        /// Index of the first color map entry. Index refers to the starting entry in loading\n        /// the color map.\n        /// <para>Example: If you would have 1024 entries in the entire color map but you only\n        /// need to store 72 of those entries, this field allows you to start in the middle of\n        /// the color-map (e.g., position 342).</para>\n        /// </summary>\n        public ushort FirstEntryIndex\n        {\n            get { return firstEntryIndex; }\n            set { firstEntryIndex = value; }\n        }\n\n        /// <summary>\n        /// Field 4.2 (2 bytes):\n        /// Total number of color map entries included.\n        /// </summary>\n        public ushort ColorMapLength\n        {\n            get { return colorMapLength; }\n            set { colorMapLength = value; }\n        }\n\n        /// <summary>\n        /// Field 4.3 (1 byte):\n        /// Establishes the number of bits per entry. Typically 15, 16, 24 or 32-bit values are used.\n        /// <para>When working with VDA or VDA/D cards it is preferred that you select 16 bits(5 bits\n        /// per primary with 1 bit to select interrupt control) and set the 16th bit to 0 so that the\n        /// interrupt bit is disabled. Even if this field is set to 15 bits(5 bits per primary) you\n        /// must still parse the color map data 16 bits at a time and ignore the 16th bit.</para>\n        /// <para>When working with a TARGA M8 card you would select 24 bits (8 bits per primary)\n        /// since the color map is defined as 256 entries of 24 bit color values.</para>\n        /// When working with a TrueVista card(ATVista or NuVista) you would select 24-bit(8 bits per\n        /// primary) or 32-bit(8 bits per primary including Alpha channel) depending on your\n        /// application’s use of look-up tables. It is suggested that when working with 16-bit and\n        /// 32-bit color images, you store them as True-Color images and do not use the color map \n        /// field to store look-up tables. Please refer to the TGA Extensions for fields better suited\n        /// to storing look-up table information.\n        /// </summary>\n        public TgaColorMapEntrySize ColorMapEntrySize\n        {\n            get { return colorMapEntrySize; }\n            set { colorMapEntrySize = value; }\n        }\n\n        /// <summary>\n        /// Gets TGA Field size in bytes.\n        /// </summary>\n        public const int Size = 5;\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaColorMapSpec\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaColorMapSpec\"/></returns>\n        public TgaColorMapSpec Clone()\n        {\n            return new TgaColorMapSpec(ToBytes());\n        }\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaColorMapSpec\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaColorMapSpec\"/></returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaColorMapSpec) ? Equals((TgaColorMapSpec)obj) : false);\n        }\n\n        public bool Equals(TgaColorMapSpec item)\n        {\n            return (firstEntryIndex == item.firstEntryIndex &&\n                colorMapLength == item.colorMapLength &&\n                colorMapEntrySize == item.colorMapEntrySize);\n        }\n\n        public static bool operator ==(TgaColorMapSpec item1, TgaColorMapSpec item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaColorMapSpec item1, TgaColorMapSpec item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                return (firstEntryIndex << 16 | colorMapLength).GetHashCode() ^ colorMapEntrySize.GetHashCode();\n            }\n        }\n\n        public override string ToString()\n        {\n            return String.Format(\"{0}={1}, {2}={3}, {4}={5}\", nameof(FirstEntryIndex), FirstEntryIndex,\n                nameof(ColorMapLength), ColorMapLength, nameof(ColorMapEntrySize), ColorMapEntrySize);\n        }\n\n        /// <summary>\n        /// Convert ColorMapSpec to byte array.\n        /// </summary>\n        /// <returns>Byte array with length = 5.</returns>\n        public byte[] ToBytes()\n        {\n            return BitConverterExt.ToBytes(firstEntryIndex, colorMapLength, (byte)colorMapEntrySize);\n        }\n    }\n\n    public class TgaComment : ICloneable\n    {\n        const int StrNLen = 80; //80 ASCII chars + 1 '\\0' = 81 per SrtN!\n        string origString = String.Empty;\n        char blankSpaceChar = TgaString.DefaultBlankSpaceChar;\n\n        public TgaComment()\n        {\n        }\n\n        public TgaComment(string Str, char BlankSpaceChar = '\\0')\n        {\n            if (Str == null)\n                throw new ArgumentNullException(nameof(Str) + \" = null!\");\n\n            origString = Str;\n            blankSpaceChar = BlankSpaceChar;\n        }\n\n        public TgaComment(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            if (Bytes.Length != Size)\n                throw new ArgumentOutOfRangeException(nameof(Bytes.Length) + \" must be equal \" + Size + \"!\");\n\n            string s = Encoding.ASCII.GetString(Bytes, 0, StrNLen);\n            s += Encoding.ASCII.GetString(Bytes, 81, StrNLen);\n            s += Encoding.ASCII.GetString(Bytes, 162, StrNLen);\n            s += Encoding.ASCII.GetString(Bytes, 243, StrNLen);\n\n            switch (s[s.Length - 1])\n            {\n                case '\\0':\n                case ' ':\n                    blankSpaceChar = s[s.Length - 1];\n                    origString = s.TrimEnd(new char[] { s[s.Length - 1] });\n                    break;\n                default:\n                    origString = s;\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Gets TGA Field size in bytes.\n        /// </summary>\n        public const int Size = 81 * 4;\n\n        public string OriginalString\n        {\n            get { return origString; }\n            set { origString = value; }\n        }\n\n        public char BlankSpaceChar\n        {\n            get { return blankSpaceChar; }\n            set { blankSpaceChar = value; }\n        }\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaComment\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaComment\"/></returns>\n        public TgaComment Clone()\n        {\n            return new TgaComment(origString, blankSpaceChar);\n        }\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaComment\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaComment\"/></returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaComment) ? Equals((TgaComment)obj) : false);\n        }\n\n        public bool Equals(TgaComment item)\n        {\n            return (origString == item.origString && blankSpaceChar == item.blankSpaceChar);\n        }\n\n        public static bool operator ==(TgaComment item1, TgaComment item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaComment item1, TgaComment item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            return origString.GetHashCode() ^ blankSpaceChar.GetHashCode();\n        }\n\n        /// <summary>\n        /// Get ASCII-Like string with string-terminators, example: \"Line1 \\0\\0 Line2 \\0\\0\\0\".\n        /// </summary>\n        /// <returns>String with replaced string-terminators to \"\\0\".</returns>\n        public override string ToString()\n        {\n            return Encoding.ASCII.GetString(ToBytes()).Replace(\"\\0\", @\"\\0\");\n        }\n\n        /// <summary>\n        /// Get ASCII-Like string to first string-terminator, example:\n        /// \"Some string \\0 Some Data \\0\" - > \"Some string\".\n        /// </summary>\n        /// <returns>String to first string-terminator.</returns>\n        public string GetString()\n        {\n            String Str = Encoding.ASCII.GetString(ToBytes());\n            for (int i = 1; i < 4; i++)\n                Str = Str.Insert((StrNLen + 1) * i + i - 1, \"\\n\");\n            return Str.Replace(\"\\0\", String.Empty).TrimEnd(new char[] { '\\n' });\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaComment\"/> to byte array.\n        /// </summary>\n        /// <returns>Byte array, every byte is ASCII symbol.</returns>\n        public byte[] ToBytes()\n        {\n            return ToBytes(origString, blankSpaceChar);\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaComment\"/> to byte array.\n        /// </summary>\n        /// <param name=\"Str\">Input string.</param>\n        /// <param name=\"BlankSpaceChar\">Char for filling blank space in string.</param>\n        /// <returns>Byte array, every byte is ASCII symbol.</returns>\n        public static byte[] ToBytes(string Str, char BlankSpaceChar = '\\0')\n        {\n            char[] C = new char[81 * 4];\n\n            for (int i = 0; i < C.Length; i++)\n            {\n                if ((i + 82) % 81 == 0)\n                    C[i] = TgaString.DefaultEndingChar;\n                else\n                {\n                    int Index = i - i / 81;\n                    C[i] = (Index < Str.Length ? Str[Index] : BlankSpaceChar);\n                }\n            }\n            return Encoding.ASCII.GetBytes(C);\n        }\n    }\n\n    public class TgaDateTime : ICloneable\n    {\n        ushort month = 0;\n        ushort day = 0;\n        ushort year = 0;\n        ushort hour = 0;\n        ushort minute = 0;\n        ushort second = 0;\n\n        /// <summary>\n        /// Make empty <see cref=\"TgaDateTime\"/>.\n        /// </summary>\n        public TgaDateTime()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaDateTime\"/> from <see cref=\"DateTime\"/>.\n        /// </summary>\n        /// <param name=\"DateAndTime\">Some <see cref=\"DateTime\"/> variable.</param>\n        public TgaDateTime(DateTime DateAndTime)\n        {\n            month = (ushort)DateAndTime.Month;\n            day = (ushort)DateAndTime.Day;\n            year = (ushort)DateAndTime.Year;\n            hour = (ushort)DateAndTime.Hour;\n            minute = (ushort)DateAndTime.Minute;\n            second = (ushort)DateAndTime.Second;\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaDateTime\"/> from ushort values.\n        /// </summary>\n        /// <param name=\"Month\">Month (1 - 12).</param>\n        /// <param name=\"Day\">Day (1 - 31).</param>\n        /// <param name=\"Year\">Year (4 digit, ie. 1989).</param>\n        /// <param name=\"Hour\">Hour (0 - 23).</param>\n        /// <param name=\"Minute\">Minute (0 - 59).</param>\n        /// <param name=\"Second\">Second (0 - 59).</param>\n        public TgaDateTime(ushort Month, ushort Day, ushort Year, ushort Hour, ushort Minute, ushort Second)\n        {\n            month = Month;\n            day = Day;\n            year = Year;\n            hour = Hour;\n            minute = Minute;\n            second = Second;\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaDateTime\"/> from bytes.\n        /// </summary>\n        /// <param name=\"Bytes\">Array of bytes(byte[12]).</param>\n        public TgaDateTime(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            else if (Bytes.Length != Size)\n                throw new ArgumentOutOfRangeException(nameof(Bytes) + \" must be equal \" + Size + \"!\");\n\n            month = BitConverter.ToUInt16(Bytes, 0);\n            day = BitConverter.ToUInt16(Bytes, 2);\n            year = BitConverter.ToUInt16(Bytes, 4);\n            hour = BitConverter.ToUInt16(Bytes, 6);\n            minute = BitConverter.ToUInt16(Bytes, 8);\n            second = BitConverter.ToUInt16(Bytes, 10);\n        }\n\n        /// <summary>\n        /// Gets or Sets month (1 - 12).\n        /// </summary>\n        public ushort Month\n        {\n            get { return month; }\n            set { month = value; }\n        }\n\n        /// <summary>\n        /// Gets or Sets day (1 - 31).\n        /// </summary>\n        public ushort Day\n        {\n            get { return day; }\n            set { day = value; }\n        }\n\n        /// <summary>\n        /// Gets or Sets year (4 digit, ie. 1989).\n        /// </summary>\n        public ushort Year\n        {\n            get { return year; }\n            set { year = value; }\n        }\n\n        /// <summary>\n        /// Gets or Sets hour (0 - 23).\n        /// </summary>\n        public ushort Hour\n        {\n            get { return hour; }\n            set { hour = value; }\n        }\n\n        /// <summary>\n        /// Gets or Sets minute (0 - 59).\n        /// </summary>\n        public ushort Minute\n        {\n            get { return minute; }\n            set { minute = value; }\n        }\n\n        /// <summary>\n        /// Gets or Sets second (0 - 59).\n        /// </summary>\n        public ushort Second\n        {\n            get { return second; }\n            set { second = value; }\n        }\n\n        /// <summary>\n        /// Gets TGA Field size in bytes.\n        /// </summary>\n        public const int Size = 12;\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaDateTime\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaDateTime\"/></returns>\n        public TgaDateTime Clone()\n        {\n            return new TgaDateTime(month, day, year, hour, minute, second);\n        }\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaDateTime\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaDateTime\"/></returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaDateTime) ? Equals((TgaDateTime)obj) : false);\n        }\n\n        public bool Equals(TgaDateTime item)\n        {\n            return (\n                month == item.month &&\n                day == item.day &&\n                year == item.year &&\n                hour == item.hour &&\n                minute == item.minute &&\n                second == item.second);\n        }\n\n        public static bool operator ==(TgaDateTime item1, TgaDateTime item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaDateTime item1, TgaDateTime item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = 17;\n                hash = hash * 23 + (month << 16 | hour).GetHashCode();\n                hash = hash * 23 + (day << 16 | minute).GetHashCode();\n                hash = hash * 23 + (year << 16 | second).GetHashCode();\n                return hash;\n            }\n        }\n\n        /// <summary>\n        /// Gets <see cref=\"TgaDateTime\"/> like string.\n        /// </summary>\n        /// <returns>String in \"1990.01.23 1:02:03\" format.</returns>\n        public override string ToString()\n        {\n            return String.Format(\"{0:D4}.{1:D2}.{2:D2} {3}:{4:D2}:{5:D2}\", year, month, day, hour, minute, second);\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaDateTime\"/> to byte array.\n        /// </summary>\n        /// <returns>Byte array with length = 12.</returns>\n        public byte[] ToBytes()\n        {\n            return BitConverterExt.ToBytes(month, day, year, hour, minute, second);\n        }\n\n        /// <summary>\n        /// Gets <see cref=\"TgaDateTime\"/> like <see cref=\"DateTime\"/>.\n        /// </summary>\n        /// <returns><see cref=\"DateTime\"/> value of <see cref=\"TgaDateTime\"/>.</returns>\n        public DateTime ToDateTime()\n        {\n            return new DateTime(year, month, day, hour, minute, second);\n        }\n    }\n\n    public class TgaDevEntry : ICloneable\n    {\n        // Directory\n        ushort fieldTag = 0;\n        uint fieldFileOffset = 0;\n        // Field\n        byte[] data = null;\n\n        /// <summary>\n        /// Make empty <see cref=\"TgaDevEntry\"/>.\n        /// </summary>\n        public TgaDevEntry()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaDevEntry\"/> from other <see cref=\"TgaDevEntry\"/>.\n        /// </summary>\n        /// <param name=\"Entry\">Some <see cref=\"TgaDevEntry\"/> variable.</param>\n        public TgaDevEntry(TgaDevEntry Entry)\n        {\n            if (Entry == null)\n                throw new ArgumentNullException();\n\n            fieldTag = Entry.fieldTag;\n            fieldFileOffset = Entry.fieldFileOffset;\n            data = BitConverterExt.ToBytes(Entry.data);\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaDevEntry\"/> from <see cref=\"Tag\"/>, <see cref=\"Offset\"/> and <see cref=\"FieldSize\"/>.\n        /// </summary>\n        /// <param name=\"Tag\">TAG ID (0 - 65535). See <see cref=\"Tag\"/>.</param>\n        /// <param name=\"Offset\">TAG file offset in bytes. See <see cref=\"Offset\"/>.</param>\n        /// <param name=\"Data\">This is DevEntry Field Data. See <see cref=\"Data\"/>.</param>\n        public TgaDevEntry(ushort Tag, uint Offset, byte[] Data = null)\n        {\n            fieldTag = Tag;\n            fieldFileOffset = Offset;\n            data = Data;\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaDevEntry\"/> from bytes.\n        /// </summary>\n        /// <param name=\"Bytes\">Array of bytes(byte[6] or bigger, if <see cref=\"Data\"/> exist).</param>\n        public TgaDevEntry(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            else if (Bytes.Length < 6)\n                throw new ArgumentOutOfRangeException(nameof(Bytes) + \" must be >= 6!\");\n\n            fieldTag = BitConverter.ToUInt16(Bytes, 0);\n            fieldFileOffset = BitConverter.ToUInt32(Bytes, 2);\n\n            if (Bytes.Length > 6)\n                data = BitConverterExt.GetElements(Bytes, 6, Bytes.Length - 6);\n        }\n\n        /// <summary>\n        /// Each TAG is a value in the range of 0 to 65535. Values from 0 - 32767 are available for developer use,\n        /// while values from 32768 - 65535 are reserved for Truevision.\n        /// </summary>\n        public ushort Tag\n        {\n            get { return fieldTag; }\n            set { fieldTag = value; }\n        }\n\n        /// <summary>\n        /// This OFFSET is a number of bytes from the beginning of the file to the start of the field\n        /// referenced by the tag.\n        /// </summary>\n        public uint Offset\n        {\n            get { return fieldFileOffset; }\n            set { fieldFileOffset = value; }\n        }\n\n        /// <summary>\n        /// Field DATA.\n        /// Although the size and format of the actual Developer Area fields are totally up to the developer,\n        /// please define your formats to address future considerations you might have concerning your fields.\n        /// This means that if you anticipate changing a field, build flexibility into the format to make these\n        /// changes easy on other developers.Major changes to an existing TAG’s definition should never happen.\n        /// </summary>\n        public byte[] Data\n        {\n            get { return data; }\n            set { data = value; }\n        }\n\n        /// <summary>\n        /// The FIELD SIZE is a number of bytes in the field. Same like: <see cref=\"Data.Length\"/>,\n        /// if <see cref=\"Data\"/> is null, return -1.\n        /// </summary>\n        public int FieldSize\n        {\n            get\n            {\n                if (Data == null)\n                    return -1;\n\n                return Data.Length;\n            }\n        }\n\n        /// <summary>\n        /// Gets TGA <see cref=\"TgaDevEntry\"/> size in bytes (Always constant and equal 10!).\n        /// It is not <see cref=\"FieldSize\"/>! It is just size of entry sizeof(ushort + uint + uint).\n        /// </summary>\n        public const int Size = 10;\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaDevEntry\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaDevEntry\"/></returns>\n        public TgaDevEntry Clone()\n        {\n            return new TgaDevEntry(this);\n        }\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaDevEntry\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaDevEntry\"/></returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaDevEntry) ? Equals((TgaDevEntry)obj) : false);\n        }\n\n        public bool Equals(TgaDevEntry item)\n        {\n            return (fieldTag == item.fieldTag &&\n                fieldFileOffset == item.fieldFileOffset &&\n                BitConverterExt.IsArraysEqual(data, item.data));\n        }\n\n        public static bool operator ==(TgaDevEntry item1, TgaDevEntry item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaDevEntry item1, TgaDevEntry item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = 17;\n                hash = hash * 23 + fieldTag.GetHashCode();\n                hash = hash * 23 + fieldFileOffset.GetHashCode();\n\n                if (data != null)\n                    for (int i = 0; i < data.Length; i++)\n                        hash = hash * 23 + data[i].GetHashCode();\n\n                return hash;\n            }\n        }\n\n        /// <summary>\n        /// Gets <see cref=\"TgaDevEntry\"/> like string.\n        /// </summary>\n        /// <returns>String in \"Tag={0}, Offset={1}, FieldSize={2}\" format.</returns>\n        public override string ToString()\n        {\n            return String.Format(\"{0}={1}, {1}={2}, {3}={4}\", nameof(Tag), fieldTag,\n                nameof(Offset), fieldFileOffset, nameof(FieldSize), FieldSize);\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaDevEntry\"/> to byte array. (Not include <see cref=\"Data\"/>!).\n        /// </summary>\n        /// <returns>Byte array with length = 10.</returns>\n        public byte[] ToBytes()\n        {\n            return BitConverterExt.ToBytes(fieldTag, fieldFileOffset, (data == null ? 0 : data.Length));\n        }\n    } //Not full ToBytes()\n\n    public class TgaFraction : ICloneable\n    {\n        ushort numerator = 0;\n        ushort denominator = 0;\n\n        /// <summary>\n        /// Make <see cref=\"TgaFraction\"/> from <see cref=\"Numerator\"/> and <see cref=\"Denominator\"/>.\n        /// </summary>\n        /// <param name=\"Numerator\">Numerator value.</param>\n        /// <param name=\"Denominator\">Denominator value.</param>\n        public TgaFraction(ushort Numerator = 0, ushort Denominator = 0)\n        {\n            numerator = Numerator;\n            denominator = Denominator;\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaFraction\"/> from bytes.\n        /// </summary>\n        /// <param name=\"Bytes\">Array of bytes(byte[4]).</param>\n        public TgaFraction(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            if (Bytes.Length != Size)\n                throw new ArgumentOutOfRangeException(nameof(Bytes.Length) + \" must be equal \" + Size + \"!\");\n\n            numerator = BitConverter.ToUInt16(Bytes, 0);\n            denominator = BitConverter.ToUInt16(Bytes, 2);\n        }\n\n        /// <summary>\n        /// Gets or sets numerator value.\n        /// </summary>\n        public ushort Numerator\n        {\n            get { return numerator; }\n            set { numerator = value; }\n        }\n\n        /// <summary>\n        /// Gets or sets denominator value.\n        /// </summary>\n        public ushort Denominator\n        {\n            get { return denominator; }\n            set { denominator = value; }\n        }\n\n        /// <summary>\n        /// Get aspect ratio = <see cref=\"Numerator\"/> / <see cref=\"Denominator\"/>.\n        /// </summary>\n        public float AspectRatio\n        {\n            get\n            {\n                if (numerator == denominator)\n                    return 1f;\n\n                return numerator / (float)denominator;\n            }\n        }\n\n        /// <summary>\n        /// Gets Empty <see cref=\"TgaFraction\"/>, all values are 0.\n        /// </summary>\n        public static readonly TgaFraction Empty = new TgaFraction();\n\n        /// <summary>\n        /// Gets One <see cref=\"TgaFraction\"/>, all values are 1 (ones, 1 / 1 = 1).\n        /// </summary>\n        public static readonly TgaFraction One = new TgaFraction(1, 1);\n\n        /// <summary>\n        /// Gets TGA Field size in bytes.\n        /// </summary>\n        public const int Size = 4;\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaFraction\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaFraction\"/></returns>\n        public TgaFraction Clone()\n        {\n            return new TgaFraction(numerator, denominator);\n        }\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaFraction\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaFraction\"/></returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaFraction) ? Equals((TgaFraction)obj) : false);\n        }\n\n        public bool Equals(TgaFraction item)\n        {\n            return (numerator == item.numerator && denominator == item.denominator);\n        }\n\n        public static bool operator ==(TgaFraction item1, TgaFraction item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaFraction item1, TgaFraction item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            return (numerator << 16 | denominator).GetHashCode();\n        }\n\n        /// <summary>\n        /// Gets <see cref=\"TgaFraction\"/> like string.\n        /// </summary>\n        /// <returns>String in \"Numerator=1, Denominator=2\" format.</returns>\n        public override string ToString()\n        {\n            return String.Format(\"{0}={1}, {2}={3}\", nameof(Numerator), numerator,\n                nameof(Denominator), denominator);\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaFraction\"/> to byte array.\n        /// </summary>\n        /// <returns>Byte array with length = 4.</returns>\n        public byte[] ToBytes()\n        {\n            return BitConverterExt.ToBytes(numerator, denominator);\n        }\n    }\n\n    /// <summary>\n    /// Contains image origin bits and alpha channel bits(or number of overlay bits)\n    /// </summary>\n    public class TgaImageDescriptor : ICloneable\n    {\n        TgaImgOrigin imageOrigin = 0; //bits 5-4\n        byte alphaChannelBits = 0; //bits 3-0\n\n        /// <summary>\n        /// Make empty <see cref=\"TgaImageDescriptor\"/>.\n        /// </summary>\n        public TgaImageDescriptor()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaImageDescriptor\"/> from bytes.\n        /// </summary>\n        /// <param name=\"b\">ImageDescriptor byte with reserved 7-6 bits, bits 5-4 used for\n        /// <see cref=\"ImageOrigin\"/>, 3-0 used as alpha channel bits or number of overlay bits.</param>\n        public TgaImageDescriptor(byte b)\n        {\n            imageOrigin = (TgaImgOrigin)((b & 0x30) >> 4);\n            alphaChannelBits = (byte)(b & 0x0F);\n        }\n\n        /// <summary>\n        /// Gets or Sets Image Origin bits (select from enum only, don'n use 5-4 bits!).\n        /// </summary>\n        public TgaImgOrigin ImageOrigin\n        {\n            get { return imageOrigin; }\n            set { imageOrigin = value; }\n        }\n\n        /// <summary>\n        /// Gets or Sets alpha channel bits or number of overlay bits.\n        /// </summary>\n        public byte AlphaChannelBits\n        {\n            get { return alphaChannelBits; }\n            set { alphaChannelBits = value; }\n        }\n\n        /// <summary>\n        /// Gets TGA Field size in bytes.\n        /// </summary>\n        public const int Size = 1;\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaImageDescriptor\"/>.\n        /// </summary>\n        /// <returns>Full independent copy of <see cref=\"TgaImageDescriptor\"/>.</returns>\n        public TgaImageDescriptor Clone()\n        {\n            return new TgaImageDescriptor(ToByte());\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaImageDescriptor\"/>.\n        /// </summary>\n        /// <returns>Full independent copy of <see cref=\"TgaImageDescriptor\"/>.</returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaImageDescriptor) ? Equals((TgaImageDescriptor)obj) : false);\n        }\n\n        public bool Equals(TgaImageDescriptor item)\n        {\n            return (imageOrigin == item.imageOrigin && alphaChannelBits == item.alphaChannelBits);\n        }\n\n        public static bool operator ==(TgaImageDescriptor item1, TgaImageDescriptor item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaImageDescriptor item1, TgaImageDescriptor item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                return ((int)ImageOrigin << 4 | alphaChannelBits).GetHashCode();\n            }\n        }\n\n        public override string ToString()\n        {\n            return String.Format(\"{0}={1}, {2}={3}, ImageDescriptor_AsByte={4}\", nameof(ImageOrigin),\n                imageOrigin, nameof(AlphaChannelBits), alphaChannelBits, ToByte());\n        }\n\n        /// <summary>\n        /// Gets ImageDescriptor byte.\n        /// </summary>\n        /// <returns>ImageDescriptor byte with reserved 7-6 bits, bits 5-4 used for imageOrigin,\n        /// 3-0 used as alpha channel bits or number of overlay bits.</returns>\n        public byte ToByte()\n        {\n            return (byte)(((int)imageOrigin << 4) | alphaChannelBits);\n        }\n    }\n\n    /// <summary>\n    /// Image Specification - Field 5 (10 bytes):\n    /// <para>This field and its sub-fields describe the image screen location, size and pixel depth.\n    /// These information is always written to the file.</para>\n    /// </summary>\n    public class TgaImageSpec : ICloneable\n    {\n        ushort x_Origin = 0;\n        ushort y_Origin = 0;\n        ushort imageWidth = 0;\n        ushort imageHeight = 0;\n        TgaPixelDepth pixelDepth = TgaPixelDepth.Other;\n        TgaImageDescriptor imageDescriptor = new TgaImageDescriptor();\n\n        public TgaImageSpec()\n        {\n        }\n\n        /// <summary>\n        /// Make ImageSpec from values.\n        /// </summary>\n        /// <param name=\"X_Origin\">These specify the absolute horizontal coordinate for the lower\n        /// left corner of the image as it is positioned on a display device having an origin at\n        /// the lower left of the screen(e.g., the TARGA series).</param>\n        /// <param name=\"Y_Origin\">These specify the absolute vertical coordinate for the lower\n        /// left corner of the image as it is positioned on a display device having an origin at\n        /// the lower left of the screen(e.g., the TARGA series).</param>\n        /// <param name=\"ImageWidth\">This field specifies the width of the image in pixels.</param>\n        /// <param name=\"ImageHeight\">This field specifies the height of the image in pixels.</param>\n        /// <param name=\"PixelDepth\">This field indicates the number of bits per pixel. This number\n        /// includes the Attribute or Alpha channel bits. Common values are 8, 16, 24 and 32 but\n        /// other pixel depths could be used.</param>\n        /// <param name=\"ImageDescriptor\">Contains image origin bits and alpha channel bits\n        /// (or number of overlay bits).</param>\n        public TgaImageSpec(ushort X_Origin, ushort Y_Origin, ushort ImageWidth, ushort ImageHeight,\n            TgaPixelDepth PixelDepth, TgaImageDescriptor ImageDescriptor)\n        {\n            x_Origin = X_Origin;\n            y_Origin = Y_Origin;\n            imageWidth = ImageWidth;\n            imageHeight = ImageHeight;\n            pixelDepth = PixelDepth;\n            imageDescriptor = ImageDescriptor;\n        }\n\n        /// <summary>\n        /// Make ImageSpec from bytes.\n        /// </summary>\n        /// <param name=\"Bytes\">Array of bytes(byte[10]).</param>\n        public TgaImageSpec(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            if (Bytes.Length != Size)\n                throw new ArgumentOutOfRangeException(nameof(Bytes.Length) + \" must be equal \" + Size + \"!\");\n\n            x_Origin = BitConverter.ToUInt16(Bytes, 0);\n            y_Origin = BitConverter.ToUInt16(Bytes, 2);\n            imageWidth = BitConverter.ToUInt16(Bytes, 4);\n            imageHeight = BitConverter.ToUInt16(Bytes, 6);\n            pixelDepth = (TgaPixelDepth)Bytes[8];\n            imageDescriptor = new TgaImageDescriptor(Bytes[9]);\n        }\n\n        /// <summary>\n        /// These specify the absolute horizontal coordinate for the lower left corner of the image\n        /// as it is positioned on a display device having an origin at the lower left of the\n        /// screen(e.g., the TARGA series).\n        /// </summary>\n        public ushort X_Origin\n        {\n            get { return x_Origin; }\n            set { x_Origin = value; }\n        }\n\n        /// <summary>\n        /// These specify the absolute vertical coordinate for the lower left corner of the image\n        /// as it is positioned on a display device having an origin at the lower left of the\n        /// screen(e.g., the TARGA series).\n        /// </summary>\n        public ushort Y_Origin\n        {\n            get { return y_Origin; }\n            set { y_Origin = value; }\n        }\n\n        /// <summary>\n        /// This field specifies the width of the image in pixels.\n        /// </summary>\n        public ushort ImageWidth\n        {\n            get { return imageWidth; }\n            set { imageWidth = value; }\n        }\n\n        /// <summary>\n        /// This field specifies the height of the image in pixels.\n        /// </summary>\n        public ushort ImageHeight\n        {\n            get { return imageHeight; }\n            set { imageHeight = value; }\n        }\n\n        /// <summary>\n        /// This field indicates the number of bits per pixel. This number includes the Attribute or\n        /// Alpha channel bits. Common values are 8, 16, 24 and 32 but other pixel depths could be used.\n        /// </summary>\n        public TgaPixelDepth PixelDepth\n        {\n            get { return pixelDepth; }\n            set { pixelDepth = value; }\n        }\n\n        /// <summary>\n        /// Contains image origin bits and alpha channel bits(or number of overlay bits).\n        /// </summary>\n        public TgaImageDescriptor ImageDescriptor\n        {\n            get { return imageDescriptor; }\n            set { imageDescriptor = value; }\n        }\n\n        /// <summary>\n        /// Gets TGA Field size in bytes.\n        /// </summary>\n        public const int Size = 10;\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaImageDescriptor\"/>.\n        /// </summary>\n        /// <returns></returns>\n        public TgaImageSpec Clone()\n        {\n            return new TgaImageSpec(ToBytes());\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaImageDescriptor\"/>.\n        /// </summary>\n        /// <returns></returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaImageSpec) ? Equals((TgaImageSpec)obj) : false);\n        }\n\n        public bool Equals(TgaImageSpec item)\n        {\n            return (\n                x_Origin == item.x_Origin &&\n                y_Origin == item.y_Origin &&\n                imageWidth == item.imageWidth &&\n                imageHeight == item.imageHeight &&\n                pixelDepth == item.pixelDepth &&\n                imageDescriptor == item.imageDescriptor);\n        }\n\n        public static bool operator ==(TgaImageSpec item1, TgaImageSpec item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaImageSpec item1, TgaImageSpec item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = 17;\n                hash = hash * 23 + x_Origin.GetHashCode();\n                hash = hash * 23 + y_Origin.GetHashCode();\n                hash = hash * 23 + imageWidth.GetHashCode();\n                hash = hash * 23 + imageHeight.GetHashCode();\n                hash = hash * 23 + pixelDepth.GetHashCode();\n\n                if (imageDescriptor != null)\n                    hash = hash * 23 + imageDescriptor.GetHashCode();\n\n                return hash;\n            }\n        }\n\n        public override string ToString()\n        {\n            return String.Format(\"{0}={1}, {2}={3}, {4}={5}, {6}={7}, {8}={9}, {10}={11}\",\n                nameof(X_Origin), x_Origin,\n                nameof(Y_Origin), y_Origin,\n                nameof(ImageWidth), imageWidth,\n                nameof(ImageHeight), imageHeight,\n                nameof(PixelDepth), pixelDepth,\n                nameof(ImageDescriptor), imageDescriptor);\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaImageSpec\"/> to byte array.\n        /// </summary>\n        /// <returns>Byte array with length = 10.</returns>\n        public byte[] ToBytes()\n        {\n            return BitConverterExt.ToBytes(x_Origin, y_Origin, imageWidth, imageHeight,\n                (byte)pixelDepth, (imageDescriptor == null ? byte.MinValue : imageDescriptor.ToByte()));\n        }\n    }\n\n    /// <summary>\n    /// Postage Stamp Image (MaxSize 64x64, uncompressed, PixelDepth like in full image).\n    /// </summary>\n    public class TgaPostageStampImage : ICloneable\n    {\n        byte width = 0;\n        byte height = 0;\n        byte[] data = null;\n\n        public TgaPostageStampImage()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaPostageStampImage\"/> from bytes array.\n        /// </summary>\n        /// <param name=\"Bytes\">Bytes array, first 2 bytes are <see cref=\"Width\"/> and <see cref=\"Height\"/>,\n        /// next bytes - image data.</param>\n        public TgaPostageStampImage(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            if (Bytes.Length < 2)\n                throw new ArgumentOutOfRangeException(nameof(Bytes.Length) + \" must be >= \" + 2 + \"!\");\n\n            width = Bytes[0];\n            height = Bytes[1];\n\n            if (Bytes.Length > 2)\n                data = BitConverterExt.GetElements(Bytes, 2, Bytes.Length - 2);\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaPostageStampImage\"/> from bytes and size.\n        /// </summary>\n        /// <param name=\"Width\">Image Width.</param>\n        /// <param name=\"Height\">Image Height.</param>\n        /// <param name=\"Bytes\">Postage Stamp Image Data.</param>\n        public TgaPostageStampImage(byte Width, byte Height, byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n\n            width = Width;\n            height = Height;\n            data = Bytes;\n        }\n\n        /// <summary>\n        /// Postage Stamp Image Data\n        /// </summary>\n        public byte[] Data\n        {\n            get { return data; }\n            set { data = value; }\n        }\n\n        /// <summary>\n        /// Postage Stamp Image Width (maximum = 64).\n        /// </summary>\n        public byte Width\n        {\n            get { return width; }\n            set { width = value; }\n        }\n\n        /// <summary>\n        /// Postage Stamp Image Height (maximum = 64).\n        /// </summary>\n        public byte Height\n        {\n            get { return height; }\n            set { height = value; }\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaPostageStampImage\"/>.\n        /// </summary>\n        /// <returns>Full independent copy of <see cref=\"TgaPostageStampImage\"/>.</returns>\n        public TgaPostageStampImage Clone()\n        {\n            return new TgaPostageStampImage(width, height, BitConverterExt.ToBytes(data));\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaPostageStampImage\"/>.\n        /// </summary>\n        /// <returns>Full independent copy of <see cref=\"TgaPostageStampImage\"/>.</returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaPostageStampImage) ? Equals((TgaPostageStampImage)obj) : false);\n        }\n\n        public bool Equals(TgaPostageStampImage item)\n        {\n            return width == item.width && height == item.height && BitConverterExt.IsArraysEqual(data, item.data);\n        }\n\n        public static bool operator ==(TgaPostageStampImage item1, TgaPostageStampImage item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaPostageStampImage item1, TgaPostageStampImage item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = 27;\n                hash = (13 * hash) + width.GetHashCode();\n                hash = (13 * hash) + height.GetHashCode();\n                if (data != null)\n                    for (int i = 0; i < data.Length; i++)\n                        hash = (13 * hash) + data[i].GetHashCode();\n                return hash;\n            }\n        }\n\n        public override string ToString()\n        {\n            return String.Format(\"{0}={1}, {2}={3}, DataLength={4}\",\n                nameof(Width), width, nameof(Height), height, (data == null ? -1 : data.Length));\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaPostageStampImage\"/> to byte array.\n        /// </summary>\n        /// <returns>Byte array.</returns>\n        public byte[] ToBytes()\n        {\n            return BitConverterExt.ToBytes(width, height, data);\n        }\n    }\n\n    public class TgaSoftVersion : ICloneable\n    {\n        ushort versionNumber = 0;\n        char versionLetter = ' ';\n\n        /// <summary>\n        /// Gets Empty <see cref=\"TgaSoftVersion\"/>, <see cref=\"VersionLetter\"/> = ' ' (space).\n        /// </summary>\n        public TgaSoftVersion()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaSoftVersion\"/> from string.\n        /// </summary>\n        /// <param name=\"Str\">Input string, example: \"123d\".</param>\n        public TgaSoftVersion(string Str)\n        {\n            if (Str == null)\n                throw new ArgumentNullException();\n            if (Str.Length < 3 || Str.Length > 4)\n                throw new ArgumentOutOfRangeException(nameof(Str.Length) + \" must be equal 3 or 4!\");\n\n            bool Res = ushort.TryParse(Str.Substring(0, 3), out versionNumber);\n            if (Res && Str.Length == 4)\n                versionLetter = Str[3];\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaSoftVersion\"/> from bytes.\n        /// </summary>\n        /// <param name=\"Bytes\">Bytes array (byte[3]).</param>\n        public TgaSoftVersion(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            if (Bytes.Length != Size)\n                throw new ArgumentOutOfRangeException(nameof(Bytes.Length) + \" must be equal \" + Size + \"!\");\n\n            versionNumber = BitConverter.ToUInt16(Bytes, 0);\n            versionLetter = Encoding.ASCII.GetString(Bytes, 2, 1)[0];\n        }\n\n        public TgaSoftVersion(ushort VersionNumber, char VersionLetter = ' ')\n        {\n            versionNumber = VersionNumber;\n            versionLetter = VersionLetter;\n        }\n\n        public ushort VersionNumber\n        {\n            get { return versionNumber; }\n            set { versionNumber = value; }\n        }\n\n        public char VersionLetter\n        {\n            get { return versionLetter; }\n            set { versionLetter = value; }\n        }\n\n        /// <summary>\n        /// Gets TGA Field size in bytes.\n        /// </summary>\n        public const int Size = 3;\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaSoftVersion\"/>.\n        /// </summary>\n        /// <returns></returns>\n        public TgaSoftVersion Clone()\n        {\n            return new TgaSoftVersion(versionNumber, versionLetter);\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaSoftVersion\"/>.\n        /// </summary>\n        /// <returns></returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaSoftVersion) ? Equals((TgaSoftVersion)obj) : false);\n        }\n\n        public bool Equals(TgaSoftVersion item)\n        {\n            return (versionNumber == item.versionNumber && versionLetter == item.versionLetter);\n        }\n\n        public static bool operator ==(TgaSoftVersion item1, TgaSoftVersion item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaSoftVersion item1, TgaSoftVersion item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            return versionNumber.GetHashCode() ^ versionLetter.GetHashCode();\n        }\n\n        public override string ToString()\n        {\n            return (versionNumber.ToString(\"000\") + versionLetter).TrimEnd(new char[] { ' ', '\\0' });\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaSoftVersion\"/> to byte array.\n        /// </summary>\n        /// <returns>Byte array, <see cref=\"VersionNumber\"/> (2 bytes) and\n        /// <see cref=\"VersionLetter\"/> (ASCII symbol).</returns>\n        public byte[] ToBytes()\n        {\n            return ToBytes(versionNumber, versionLetter);\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaSoftVersion\"/> to byte array.\n        /// </summary>\n        /// <param name=\"VersionNumber\">Set 123 for 1.23 version.</param>\n        /// <param name=\"VersionLetter\">Version letter, example: for 'a' - \"1.23a\".</param>\n        /// <returns>Byte array, <see cref=\"VersionNumber\"/> (2 bytes) and <see cref=\"VersionLetter\"/> (ASCII symbol).</returns>\n        public static byte[] ToBytes(ushort VersionNumber, char VersionLetter = ' ')\n        {\n            return BitConverterExt.ToBytes(VersionNumber, Encoding.ASCII.GetBytes(VersionLetter.ToString()));\n        }\n    }\n\n    /// <summary>\n    /// Use it for working with ASCII strings in TGA files.\n    /// </summary>\n    public class TgaString : ICloneable\n    {\n        public const string XFileSignatuteConst = \"TRUEVISION-XFILE\";\n        public const string DotSymbolConst = \".\";\n\n        string origString = String.Empty;\n        int length = 0;\n        char blankSpaceChar = DefaultBlankSpaceChar;\n        bool useEnding = false;\n\n        public TgaString(bool UseEnding = false)\n        {\n            useEnding = UseEnding;\n        }\n\n        public TgaString(byte[] Bytes, bool UseEnding = false)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n\n            length = Bytes.Length;\n            useEnding = UseEnding;\n            string s = Encoding.ASCII.GetString(Bytes, 0, Bytes.Length - (useEnding ? 1 : 0));\n\n            if (s.Length > 0)\n                switch (s[s.Length - 1])\n                {\n                    case '\\0':\n                    case ' ':\n                        blankSpaceChar = s[s.Length - 1];\n                        origString = s.TrimEnd(new char[] { s[s.Length - 1] });\n                        break;\n                    default:\n                        origString = s;\n                        break;\n                }\n        }\n\n        public TgaString(int Length, bool UseEnding = false)\n        {\n            length = Length;\n            useEnding = UseEnding;\n        }\n\n        public TgaString(string Str, int Length, bool UseEnding = false, char BlankSpaceChar = '\\0')\n        {\n            if (Str == null)\n                throw new ArgumentNullException(nameof(Str) + \" = null!\");\n\n            origString = Str;\n            length = Length;\n            blankSpaceChar = BlankSpaceChar;\n            useEnding = UseEnding;\n        }\n\n        public string OriginalString\n        {\n            get { return origString; }\n            set { origString = value; }\n        }\n\n        public int Length\n        {\n            get { return length; }\n            set { length = value; }\n        }\n\n        public char BlankSpaceChar\n        {\n            get { return blankSpaceChar; }\n            set { blankSpaceChar = value; }\n        }\n\n        public bool UseEndingChar\n        {\n            get { return useEnding; }\n            set { useEnding = value; }\n        }\n\n        /// <summary>\n        /// Gets ending char, default '\\0'.\n        /// </summary>\n        public static readonly char DefaultEndingChar = '\\0';\n\n        /// <summary>\n        /// Gets blank space char, value = '\\0'.\n        /// </summary>\n        public static readonly char DefaultBlankSpaceChar = '\\0';\n\n        /// <summary>\n        /// Gets Empty <see cref=\"TgaString\"/>.\n        /// </summary>\n        public static readonly TgaString Empty = new TgaString();\n\n        /// <summary>\n        /// Gets <see cref=\"TgaString\"/> with <see cref=\"DefaultEndingChar\"/> = '\\0' and <see cref=\"UseEndingChar\"/> = true.\n        /// </summary>\n        public static readonly TgaString ZeroTerminator = new TgaString(true);\n\n        /// <summary>\n        /// Gets \".\" <see cref=\"TgaString\"/> with dot (period) symbol.\n        /// </summary>\n        public static readonly TgaString DotSymbol = new TgaString(DotSymbolConst, DotSymbolConst.Length);\n\n        /// <summary>\n        /// Gets \"TRUEVISION-XFILE\" <see cref=\"TgaString\"/> (TGA File Format Version 2.0 signatute).\n        /// </summary>\n        public static readonly TgaString XFileSignatute = new TgaString(XFileSignatuteConst, XFileSignatuteConst.Length);\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaString\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaString\"/></returns>\n        public TgaString Clone()\n        {\n            return new TgaString(origString, length, useEnding, blankSpaceChar);\n        }\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaString\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaString\"/></returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaString) ? Equals((TgaString)obj) : false);\n        }\n\n        public bool Equals(TgaString item)\n        {\n            return (\n                origString == item.origString &&\n                length == item.length &&\n                blankSpaceChar == item.blankSpaceChar &&\n                useEnding == item.useEnding);\n        }\n\n        public static bool operator ==(TgaString item1, TgaString item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaString item1, TgaString item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public static TgaString operator +(TgaString item1, TgaString item2)\n        {\n            if (ReferenceEquals(item1, null) || ReferenceEquals(item2, null))\n                throw new ArgumentNullException();\n\n            return new TgaString(BitConverterExt.ToBytes(item1.ToBytes(), item2.ToBytes()));\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = 17;\n                hash = hash * 23 + origString.GetHashCode();\n                hash = hash * 23 + length.GetHashCode();\n                hash = hash * 23 + blankSpaceChar.GetHashCode();\n                hash = hash * 23 + useEnding.GetHashCode();\n                return hash;\n            }\n        }\n\n        /// <summary>\n        /// Get ASCII-Like string with string-terminators, example: \"Some string\\0\\0\\0\\0\\0\".\n        /// </summary>\n        /// <returns>String with replaced string-terminators to \"\\0\".</returns>\n        public override string ToString()\n        {\n            return Encoding.ASCII.GetString(ToBytes()).Replace(\"\\0\", @\"\\0\");\n        }\n\n        /// <summary>\n        /// Get ASCII-Like string to first string-terminator, example:\n        /// \"Some string \\0 Some Data \\0\" - > \"Some string\".\n        /// </summary>\n        /// <returns>String to first string-terminator.</returns>\n        public string GetString()\n        {\n            String Str = Encoding.ASCII.GetString(ToBytes());\n            int EndIndex = Str.IndexOf('\\0');\n            if (EndIndex != -1)\n                Str = Str.Substring(0, EndIndex);\n            return Str;\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaString\"/> to byte array.\n        /// </summary>\n        /// <returns>Byte array, every byte is ASCII symbol.</returns>\n        public byte[] ToBytes()\n        {\n            return ToBytes(origString, length, useEnding, blankSpaceChar);\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaString\"/> to byte array.\n        /// </summary>\n        /// <param name=\"str\">Input string.</param>\n        /// <param name=\"Length\">Length of output ASCII string with Ending char (if used).</param>\n        /// <param name=\"UseEnding\">Add <see cref=\"EndingChr\"/> to string or not?</param>\n        /// <param name=\"BlankSpaceChar\">Char for filling blank space in string. If this char is '-' (only for example!),\n        /// for string \"ABC\" with <see cref=\"Length\"/> = 7, with <see cref=\"UseEnding\"/> = true,\n        /// <see cref=\"DefaultEndingChar\"/> is '\\0', result string is \"ABC---\\0\".</param>\n        /// <returns>Byte array, every byte is ASCII symbol.</returns>\n        public static byte[] ToBytes(string str, int Length, bool UseEnding = true, char BlankSpaceChar = '\\0')\n        {\n            char[] C = new char[Math.Max(Length, (UseEnding ? 1 : 0))];\n\n            for (int i = 0; i < C.Length; i++)\n                C[i] = (i < str.Length ? str[i] : BlankSpaceChar);\n\n            if (UseEnding)\n                C[C.Length - 1] = DefaultEndingChar;\n\n            return Encoding.ASCII.GetBytes(C);\n        }\n    }\n\n    public class TgaTime : ICloneable\n    {\n        ushort hours = 0;\n        ushort minutes = 0;\n        ushort seconds = 0;\n\n        /// <summary>\n        /// Make empty <see cref=\"TgaTime\"/>.\n        /// </summary>\n        public TgaTime()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaTime\"/> from <see cref=\"TimeSpan\"/>.\n        /// </summary>\n        /// <param name=\"Time\">Some <see cref=\"TimeSpan\"/> variable.</param>\n        public TgaTime(TimeSpan Time)\n        {\n            hours = (ushort)Time.TotalHours;\n            minutes = (ushort)Time.Minutes;\n            seconds = (ushort)Time.Seconds;\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaTime\"/> from ushort values.\n        /// </summary>\n        /// <param name=\"Hours\">Hour (0 - 65535).</param>\n        /// <param name=\"Minutes\">Minute (0 - 59).</param>\n        /// <param name=\"Seconds\">Second (0 - 59).</param>\n        public TgaTime(ushort Hours, ushort Minutes, ushort Seconds)\n        {\n            hours = Hours;\n            minutes = Minutes;\n            seconds = Seconds;\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaTime\"/> from bytes.\n        /// </summary>\n        /// <param name=\"Bytes\">Array of bytes(byte[6]).</param>\n        public TgaTime(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            else if (Bytes.Length != Size)\n                throw new ArgumentOutOfRangeException(nameof(Bytes) + \" must be equal \" + Size + \"!\");\n\n            hours = BitConverter.ToUInt16(Bytes, 0);\n            minutes = BitConverter.ToUInt16(Bytes, 2);\n            seconds = BitConverter.ToUInt16(Bytes, 4);\n        }\n\n        /// <summary>\n        /// Gets or Sets hour (0 - 65535).\n        /// </summary>\n        public ushort Hours\n        {\n            get { return hours; }\n            set { hours = value; }\n        }\n\n        /// <summary>\n        /// Gets or Sets minute (0 - 59).\n        /// </summary>\n        public ushort Minutes\n        {\n            get { return minutes; }\n            set { minutes = value; }\n        }\n\n        /// <summary>\n        /// Gets or Sets second (0 - 59).\n        /// </summary>\n        public ushort Seconds\n        {\n            get { return seconds; }\n            set { seconds = value; }\n        }\n\n        /// <summary>\n        /// Gets TGA Field size in bytes.\n        /// </summary>\n        public const int Size = 6;\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaTime\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaTime\"/></returns>\n        public TgaTime Clone()\n        {\n            return new TgaTime(hours, minutes, seconds);\n        }\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TgaTime\"/>.\n        /// </summary>\n        /// <returns>Copy of <see cref=\"TgaTime\"/></returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaTime) ? Equals((TgaTime)obj) : false);\n        }\n\n        public bool Equals(TgaTime item)\n        {\n            return (hours == item.hours && minutes == item.minutes && seconds == item.seconds);\n        }\n\n        public static bool operator ==(TgaTime item1, TgaTime item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaTime item1, TgaTime item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = 17;\n                hash = hash * 23 + hours.GetHashCode();\n                hash = hash * 23 + (minutes << 16 | seconds).GetHashCode();\n                return hash;\n            }\n        }\n\n        /// <summary>\n        /// Gets <see cref=\"TgaTime\"/> like string.\n        /// </summary>\n        /// <returns>String in \"H:M:S\" format.</returns>\n        public override string ToString()\n        {\n            return String.Format(\"{0}:{1}:{2}\", hours, minutes, seconds);\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaTime\"/> to byte array.\n        /// </summary>\n        /// <returns>Byte array with length = 6.</returns>\n        public byte[] ToBytes()\n        {\n            return BitConverterExt.ToBytes(hours, minutes, seconds);\n        }\n\n        /// <summary>\n        /// Gets <see cref=\"TgaTime\"/> like <see cref=\"TimeSpan\"/>.\n        /// </summary>\n        /// <returns><see cref=\"TimeSpan\"/> value of <see cref=\"TgaTime\"/>.</returns>\n        public TimeSpan ToTimeSpan()\n        {\n            return new TimeSpan(hours, minutes, seconds);\n        }\n    }\n\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n\n    /// <summary>\n    /// File Header Area (18 bytes)\n    /// </summary>\n    public class TgaHeader : ICloneable\n    {\n        byte idLength = 0;\n        TgaColorMapType colorMapType = TgaColorMapType.NoColorMap;\n        TgaImageType imageType = TgaImageType.NoImageData;\n        TgaColorMapSpec colorMapSpec = new TgaColorMapSpec();\n        TgaImageSpec imageSpec = new TgaImageSpec();\n\n        /// <summary>\n        /// Make empty <see cref=\"TgaHeader\"/>.\n        /// </summary>\n        public TgaHeader()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaHeader\"/> from bytes.\n        /// </summary>\n        /// <param name=\"Bytes\">Bytes array (byte[18]).</param>\n        public TgaHeader(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            if (Bytes.Length != Size)\n                throw new ArgumentOutOfRangeException(nameof(Bytes.Length) + \" must be equal \" + Size + \"!\");\n\n            idLength = Bytes[0];\n            colorMapType = (TgaColorMapType)Bytes[1];\n            imageType = (TgaImageType)Bytes[2];\n            colorMapSpec = new TgaColorMapSpec(BitConverterExt.GetElements(Bytes, 3, TgaColorMapSpec.Size));\n            imageSpec = new TgaImageSpec(BitConverterExt.GetElements(Bytes, 8, TgaImageSpec.Size));\n        }\n\n        /// <summary>\n        /// ID Length - Field 1 (1 byte):\n        /// This field identifies the number of bytes contained in the <see cref=\"ImageID\"/> Field.\n        /// The maximum number of characters is 255. A value of zero indicates that no Image ID\n        /// field is included with the image.\n        /// </summary>\n        public byte IDLength\n        {\n            get { return idLength; }\n            set { idLength = value; }\n        }\n\n        /// <summary>\n        /// Color Map Type - Field 2 (1 byte):\n        /// This field indicates the type of color map (if any) included with the image.\n        /// There are currently 2 defined values for this field:\n        /// <para>0 - indicates that no color-map data is included with this image;</para>\n        /// <para>1 - indicates that a color-map is included with this image.</para>\n        /// </summary>\n        public TgaColorMapType ColorMapType\n        {\n            get { return colorMapType; }\n            set { colorMapType = value; }\n        }\n\n        /// <summary>\n        /// Image Type - Field 3 (1 byte):\n        /// <para>The TGA File Format can be used to store Pseudo-Color, True-Color and Direct-Color images\n        /// of various pixel depths.</para>\n        /// </summary>\n        public TgaImageType ImageType\n        {\n            get { return imageType; }\n            set { imageType = value; }\n        }\n\n        /// <summary>\n        /// Color Map Specification - Field 4 (5 bytes):\n        /// <para>This field and its sub-fields describe the color map (if any) used for the image.\n        /// If the Color Map Type field is set to zero, indicating that no color map exists, then\n        /// these 5 bytes should be set to zero. These bytes always must be written to the file.</para>\n        /// </summary>\n        public TgaColorMapSpec ColorMapSpec\n        {\n            get { return colorMapSpec; }\n            set { colorMapSpec = value; }\n        }\n\n        /// <summary>\n        /// Image Specification - Field 5 (10 bytes):\n        /// <para>This field and its sub-fields describe the image screen location, size and pixel depth.\n        /// These information is always written to the file.</para>\n        /// </summary>\n        public TgaImageSpec ImageSpec\n        {\n            get { return imageSpec; }\n            set { imageSpec = value; }\n        }\n\n        /// <summary>\n        /// Gets TGA Header Section size in bytes.\n        /// </summary>\n        public const int Size = 18;\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaHeader\"/>.\n        /// </summary>\n        /// <returns>Full independent copy of <see cref=\"TgaHeader\"/>.</returns>\n        public TgaHeader Clone()\n        {\n            return new TgaHeader(ToBytes());\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaHeader\"/>.\n        /// </summary>\n        /// <returns>Full independent copy of <see cref=\"TgaHeader\"/>.</returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaHeader) ? Equals((TgaHeader)obj) : false);\n        }\n\n        public bool Equals(TgaHeader item)\n        {\n            return (idLength == item.idLength &&\n                colorMapType == item.colorMapType &&\n                imageType == item.imageType &&\n                colorMapSpec == item.colorMapSpec &&\n                imageSpec == item.imageSpec);\n        }\n\n        public static bool operator ==(TgaHeader item1, TgaHeader item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaHeader item1, TgaHeader item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = 17;\n                hash = hash * 23 + (idLength << 24 | (byte)colorMapType << 8 | (byte)imageType).GetHashCode();\n\n                if (colorMapSpec != null)\n                    hash = hash * 23 + colorMapSpec.GetHashCode();\n\n                if (imageSpec != null)\n                    hash = hash * 23 + imageSpec.GetHashCode();\n\n                return hash;\n            }\n        }\n\n        public override string ToString()\n        {\n            return String.Format(\"{0}={1}, {2}={3}, {4}={5}, {6}={7}, {8}={9}\",\n                nameof(IDLength), idLength,\n                nameof(ColorMapType), colorMapType,\n                nameof(ImageType), imageType,\n                nameof(ColorMapSpec), colorMapSpec,\n                nameof(ImageSpec), imageSpec);\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaHeader\"/> to byte array.\n        /// </summary>\n        /// <returns>Byte array with size equal <see cref=\"Size\"/>.</returns>\n        public byte[] ToBytes()\n        {\n            return BitConverterExt.ToBytes(idLength, (byte)colorMapType, (byte)imageType,\n                (colorMapSpec == null ? new byte[TgaColorMapSpec.Size] : colorMapSpec.ToBytes()),\n                (imageSpec == null ? new byte[TgaImageSpec.Size] : imageSpec.ToBytes()));\n        }\n    }\n\n    /// <summary>\n    /// Image Or ColorMap Area\n    /// </summary>\n    public class TgaImgOrColMap : ICloneable\n    {\n        TgaString imageID = null;\n        byte[] colorMapData = null;\n        byte[] imageData = null;\n\n        /// <summary>\n        /// Make empty <see cref=\"TgaImgOrColMap\"/>.\n        /// </summary>\n        public TgaImgOrColMap()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaImgOrColMap\"/> from arrays.\n        /// </summary>\n        /// <param name=\"ImageID\">This optional field contains identifying information about the image.\n        /// The maximum length for this field is 255 bytes. Refer to <see cref=\"TgaHeader.IDLength\"/>\n        /// for the length of this field. If field 1 is set to Zero indicating that no Image ID exists\n        /// then these bytes are not written to the file.</param>\n        /// <param name=\"ColorMapData\">Color Map Data, see <see cref=\"ColorMapData\"/> description.</param>\n        /// <param name=\"ImageData\">Image Data, see <see cref=\"ImageData\"/> description.</param>\n        public TgaImgOrColMap(TgaString ImageID, byte[] ColorMapData, byte[] ImageData)\n        {\n            imageID = ImageID;\n            colorMapData = ColorMapData;\n            imageData = ImageData;\n        }\n\n        /// <summary>\n        /// Image ID - Field 6 (variable):\n        /// <para>This optional field contains identifying information about the image. The maximum length\n        /// for this field is 255 bytes. Refer to <see cref=\"TgaHeader.IDLength\"/> for the length of this\n        /// field. If field 1 is set to Zero indicating that no Image ID exists then these bytes are not\n        /// written to the file. Can have text inside (ASCII).</para>\n        /// </summary>\n        public TgaString ImageID\n        {\n            get { return imageID; }\n            set { imageID = value; }\n        }\n\n        /// <summary>\n        /// Color Map Data - Field 7 (variable):\n        /// <para>If the Color Map Type(field 2) field is set to zero indicating that no Color-Map\n        /// exists then this field will not be present (i.e., no bytes written to the file).</para>\n        /// <para>This variable-length field contains the actual color map information (LUT data).\n        /// Field 4.3 specifies the width in bits of each color map entry while Field 4.2 specifies\n        /// the number of color map entries in this field. These two fields together are used to\n        /// determine the number of bytes contained in field 7.</para>\n        /// <para>Each color map entry is stored using an integral number of bytes.The RGB specification\n        /// for each color map entry is stored in successive bit-fields in the multi-byte entries.\n        /// Each color bit-field is assumed to be MIN(Field4.3/3, 8) bits in length. If Field 4.3\n        /// contains 24, then each color specification is 8 bits in length; if Field 4.3 contains 32,\n        /// then each color specification is also 8 bits (32/3 gives 10, but 8 is smaller).\n        /// Unused bit(s) in the multi-byte entries are assumed to specify attribute bits. The\n        /// attribute bit field is often called the Alpha Channel, Overlay Bit(s) or Interrupt Bit(s).</para>\n        /// For the TARGA M-8, ATVista and NuVista, the number of bits in a color map specification is\n        /// 24 (or 32). The red, green, and blue components are each represented by one byte.\n        /// </summary>\n        public byte[] ColorMapData\n        {\n            get { return colorMapData; }\n            set { colorMapData = value; }\n        }\n\n        /// <summary>\n        /// Image Data - Field 8 (variable):\n        /// <para>This field contains (Width)x(Height) pixels. Each pixel specifies image data in one\n        /// of the following formats:</para>\n        /// <para>a single color-map index for Pseudo-Color;\n        /// Attribute, Red, Green and Blue ordered data for True-Color;\n        /// and independent color-map indices for Direct-Color.</para>\n        /// <para>The values for Width and Height are specified in Fields 5.3 and 5.4 respectively.\n        /// The number of attribute and color-definition bits for each pixel are defined in Fields 5.6\n        /// and 5.5, respectively.Each pixel is stored as an integral number of bytes.</para>\n        /// </summary>\n        public byte[] ImageData\n        {\n            get { return imageData; }\n            set { imageData = value; }\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaImgOrColMap\"/>.\n        /// </summary>\n        /// <returns>Full independed copy of <see cref=\"TgaImgOrColMap\"/>.</returns>\n        public TgaImgOrColMap Clone()\n        {\n            return new TgaImgOrColMap(\n                (imageID == null ? null : imageID.Clone()),\n                (colorMapData == null ? null : (byte[])colorMapData.Clone()),\n                (imageData == null ? null : (byte[])imageData.Clone()));\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaImgOrColMap\"/>.\n        /// </summary>\n        /// <returns>Full independed copy of <see cref=\"TgaImgOrColMap\"/>.</returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaImgOrColMap) ? Equals((TgaImgOrColMap)obj) : false);\n        }\n\n        public bool Equals(TgaImgOrColMap item)\n        {\n            return imageID == item.imageID &&\n                BitConverterExt.IsArraysEqual(colorMapData, item.colorMapData) &&\n                BitConverterExt.IsArraysEqual(imageData, item.imageData);\n        }\n\n        public static bool operator ==(TgaImgOrColMap item1, TgaImgOrColMap item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaImgOrColMap item1, TgaImgOrColMap item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = 27;\n\n                if (imageID != null)\n                    hash = (13 * hash) + imageID.GetHashCode();\n                if (colorMapData != null)\n                    for (int i = 0; i < colorMapData.Length; i++)\n                        hash = (13 * hash) + colorMapData[i].GetHashCode();\n                if (imageData != null)\n                    for (int i = 0; i < imageData.Length; i++)\n                        hash = (13 * hash) + imageData[i].GetHashCode();\n\n                return hash;\n            }\n        }\n    } //No ToBytes()\n\n    /// <summary>\n    /// Developer Area\n    /// </summary> //?\n    public class TgaDevArea : ICloneable\n    {\n        List<TgaDevEntry> entries = new List<TgaDevEntry>();\n\n        public TgaDevArea()\n        {\n        }\n\n        public TgaDevArea(List<TgaDevEntry> Entries)\n        {\n            if (Entries == null)\n                throw new ArgumentNullException(nameof(Entries) + \" = null!\");\n\n            entries = Entries;\n        }\n\n        /// <summary>\n        /// Developer Data - Field 9 (variable):\n        /// </summary>\n        public List<TgaDevEntry> Entries\n        {\n            get { return entries; }\n            set { entries = value; }\n        }\n\n        public int Count\n        {\n            get { return entries.Count; }\n        }\n\n        public TgaDevEntry this[int index]\n        {\n            get { return entries[index]; }\n            set { entries[index] = value; }\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaDevArea\"/>.\n        /// </summary>\n        /// <returns>Full independent copy of <see cref=\"TgaDevArea\"/>.</returns>\n        public TgaDevArea Clone()\n        {\n            if (entries == null)\n                return new TgaDevArea(null);\n\n            List<TgaDevEntry> L = new List<TgaDevEntry>();\n            for (int i = 0; i < entries.Count; i++)\n                L.Add(entries[i].Clone());\n\n            return new TgaDevArea(L);\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaDevArea\"/>.\n        /// </summary>\n        /// <returns>Full independent copy of <see cref=\"TgaDevArea\"/>.</returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaDevArea) ? Equals((TgaDevArea)obj) : false);\n        }\n\n        public bool Equals(TgaDevArea item)\n        {\n            return BitConverterExt.IsListsEqual(entries, item.entries);\n        }\n\n        public static bool operator ==(TgaDevArea item1, TgaDevArea item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaDevArea item1, TgaDevArea item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = 27;\n                if (entries != null)\n                    for (int i = 0; i < entries.Count; i++)\n                        hash = (13 * hash) + entries[i].GetHashCode();\n                return hash;\n            }\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaDevArea\"/> (without Fields Data, only Directory!) to byte array.\n        /// </summary>\n        /// <returns>Byte array, Len = (NUMBER_OF_TAGS_IN_THE_DIRECTORY * 10) + 2 bytes in size.\n        /// The \"+ 2\" includes the 2 bytes for the number of tags in the directory.</returns>\n        public byte[] ToBytes()\n        {\n            if (entries == null)\n                throw new Exception(nameof(Entries) + \" = null!\");\n\n            ushort NumberOfEntries = (ushort)Math.Min(ushort.MaxValue, entries.Count);\n            List<byte> DevDir = new List<byte>(BitConverter.GetBytes(NumberOfEntries));\n\n            for (int i = 0; i < entries.Count; i++)\n            {\n                DevDir.AddRange(BitConverter.GetBytes(entries[i].Tag));\n                DevDir.AddRange(BitConverter.GetBytes(entries[i].Offset));\n                DevDir.AddRange(BitConverter.GetBytes(entries[i].FieldSize));\n            }\n\n            return DevDir.ToArray();\n        }\n    } //Not full ToBytes()\n\n    /// <summary>\n    /// Extension Area\n    /// </summary>\n    public class TgaExtArea : ICloneable\n    {\n        public const int MinSize = 495; //bytes\n\n        ushort extensionSize = MinSize;\n        TgaString authorName = new TgaString(41, true);\n        TgaComment authorComments = new TgaComment();\n        TgaDateTime dateTimeStamp = new TgaDateTime();\n        TgaString jobNameOrID = new TgaString(41, true);\n        TgaTime jobTime = new TgaTime();\n        TgaString softwareID = new TgaString(41, true);\n        TgaSoftVersion softVersion = new TgaSoftVersion();\n        TgaColorKey keyColor = new TgaColorKey();\n        TgaFraction pixelAspectRatio = TgaFraction.Empty;\n        TgaFraction gammaValue = TgaFraction.Empty;\n        uint colorCorrectionOffset = 0;\n        uint postageStampOffset = 0;\n        uint scanLineOffset = 0;\n        TgaAttrType attributesType = TgaAttrType.NoAlpha;\n        uint[] scanLineTable = null;\n        TgaPostageStampImage postageStampImage = null;\n        ushort[] colorCorrectionTable = null;\n        byte[] otherDataInExtensionArea = null;\n\n        public TgaExtArea()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaExtArea\"/> from bytes. Warning: <see cref=\"ScanLineTable\"/>,\n        /// <see cref=\"PostageStampImage\"/>, <see cref=\"ColorCorrectionTable\"/> not included,\n        /// because thea are can be not in the Extension Area of TGA file!\n        /// </summary>\n        /// <param name=\"Bytes\">Bytes of <see cref=\"TgaExtArea\"/>.</param>\n        /// <param name=\"SLT\">Scan Line Table.</param>\n        /// <param name=\"PostImg\">Postage Stamp Image.</param>\n        /// <param name=\"CCT\">Color Correction Table.</param>\n        public TgaExtArea(byte[] Bytes, uint[] SLT = null, TgaPostageStampImage PostImg = null, ushort[] CCT = null)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            if (Bytes.Length < MinSize)\n                throw new ArgumentOutOfRangeException(nameof(Bytes.Length) + \" must be >= \" + MinSize + \"!\");\n\n            extensionSize = BitConverter.ToUInt16(Bytes, 0);\n            authorName = new TgaString(BitConverterExt.GetElements(Bytes, 2, 41), true);\n            authorComments = new TgaComment(BitConverterExt.GetElements(Bytes, 43, TgaComment.Size));\n            dateTimeStamp = new TgaDateTime(BitConverterExt.GetElements(Bytes, 367, TgaDateTime.Size));\n            jobNameOrID = new TgaString(BitConverterExt.GetElements(Bytes, 379, 41), true);\n            jobTime = new TgaTime(BitConverterExt.GetElements(Bytes, 420, TgaTime.Size));\n            softwareID = new TgaString(BitConverterExt.GetElements(Bytes, 426, 41), true);\n            softVersion = new TgaSoftVersion(BitConverterExt.GetElements(Bytes, 467, TgaSoftVersion.Size));\n            keyColor = new TgaColorKey(BitConverterExt.GetElements(Bytes, 470, TgaColorKey.Size));\n            pixelAspectRatio = new TgaFraction(BitConverterExt.GetElements(Bytes, 474, TgaFraction.Size));\n            gammaValue = new TgaFraction(BitConverterExt.GetElements(Bytes, 478, TgaFraction.Size));\n            colorCorrectionOffset = BitConverter.ToUInt32(Bytes, 482);\n            postageStampOffset = BitConverter.ToUInt32(Bytes, 486);\n            scanLineOffset = BitConverter.ToUInt32(Bytes, 490);\n            attributesType = (TgaAttrType)Bytes[494];\n\n            if (extensionSize > MinSize)\n                otherDataInExtensionArea = BitConverterExt.GetElements(Bytes, 495, Bytes.Length - MinSize);\n\n            scanLineTable = SLT;\n            postageStampImage = PostImg;\n            colorCorrectionTable = CCT;\n        }\n\n        #region Properties\n        /// <summary>\n        /// Extension Size - Field 10 (2 Bytes):\n        /// This field is a SHORT field which specifies the number of BYTES in the fixedlength portion of\n        /// the Extension Area. For Version 2.0 of the TGA File Format, this number should be set to 495.\n        /// If the number found in this field is not 495, then the file will be assumed to be of a\n        /// version other than 2.0. If it ever becomes necessary to alter this number, the change\n        /// will be controlled by Truevision, and will be accompanied by a revision to the TGA File\n        /// Format with an accompanying change in the version number.\n        /// </summary>\n        public ushort ExtensionSize\n        {\n            get { return extensionSize; }\n            set { extensionSize = value; }\n        }\n\n        /// <summary>\n        /// Author Name - Field 11 (41 Bytes):\n        /// Bytes 2-42 - This field is an ASCII field of 41 bytes where the last byte must be a null\n        /// (binary zero). This gives a total of 40 ASCII characters for the name. If the field is used,\n        /// it should contain the name of the person who created the image (author). If the field is not\n        /// used, you may fill it with nulls or a series of blanks(spaces) terminated by a null.\n        /// The 41st byte must always be a null.\n        /// </summary>\n        public TgaString AuthorName\n        {\n            get { return authorName; }\n            set { authorName = value; }\n        }\n\n        /// <summary>\n        /// Author Comments - Field 12 (324 Bytes):\n        /// Bytes 43-366 - This is an ASCII field consisting of 324 bytes which are organized as four lines\n        /// of 80 characters, each followed by a null terminator.This field is provided, in addition to the\n        /// original IMAGE ID field(in the original TGA format), because it was determined that a few\n        /// developers had used the IMAGE ID field for their own purposes.This field gives the developer\n        /// four lines of 80 characters each, to use as an Author Comment area. Each line is fixed to 81\n        /// bytes which makes access to the four lines easy.Each line must be terminated by a null.\n        /// If you do not use all 80 available characters in the line, place the null after the last\n        /// character and blank or null fill the rest of the line. The 81st byte of each of the four\n        /// lines must be null.\n        /// </summary>\n        public TgaComment AuthorComments\n        {\n            get { return authorComments; }\n            set { authorComments = value; }\n        }\n\n        /// <summary>\n        /// Date/Time Stamp - Field 13 (12 Bytes):\n        /// Bytes 367-378 - This field contains a series of 6 SHORT values which define the integer\n        /// value for the date and time that the image was saved. This data is formatted as follows:\n        /// <para>SHORT 0: Month(1 - 12)</para>\n        /// <para>SHORT 1: Day(1 - 31)</para>\n        /// <para>SHORT 2: Year(4 digit, ie. 1989)</para>\n        /// <para>SHORT 3: Hour(0 - 23)</para>\n        /// <para>SHORT 4: Minute(0 - 59)</para>\n        /// <para>SHORT 5: Second(0 - 59)</para>\n        /// Even though operating systems typically time- and date-stamp files, this feature is\n        /// provided because the operating system may change the time and date stamp if the file is\n        /// copied. By using this area, you are guaranteed an unmodified region for date and time\n        /// recording. If the fields are not used, you should fill them with binary zeros (0).\n        /// </summary>\n        public TgaDateTime DateTimeStamp\n        {\n            get { return dateTimeStamp; }\n            set { dateTimeStamp = value; }\n        }\n\n        /// <summary>\n        /// Job Name/ID - Field 14 (41 Bytes):\n        /// Bytes 379-419 - This field is an ASCII field of 41 bytes where the last byte must be \n        /// a binary zero. This gives a total of 40 ASCII characters for the job name or the ID.\n        /// If the field is used, it should contain a name or id tag which refers to the job with\n        /// which the image was associated.This allows production companies (and others) to tie\n        /// images with jobs by using this field as a job name (i.e., CITY BANK) or job id number\n        /// (i.e., CITY023). If the field is not used, you may fill it with a null terminated series\n        /// of blanks (spaces) or nulls. In any case, the 41st byte must be a null.\n        /// </summary>\n        public TgaString JobNameOrID\n        {\n            get { return jobNameOrID; }\n            set { jobNameOrID = value; }\n        }\n\n        /// <summary>\n        /// Job Time - Field 15 (6 Bytes):\n        /// Bytes 420-425 - This field contains a series of 3 SHORT values which define the integer\n        /// value for the job elapsed time when the image was saved.This data is formatted as follows:\n        /// <para>SHORT 0: Hours(0 - 65535)</para>\n        /// <para>SHORT 1: Minutes(0 - 59)</para>\n        /// <para>SHORT 2: Seconds(0 - 59)</para>\n        /// The purpose of this field is to allow production houses (and others) to keep a running total\n        /// of the amount of time invested in a particular image. This may be useful for billing, costing,\n        /// and time estimating. If the fields are not used, you should fill them with binary zeros (0).\n        /// </summary>\n        public TgaTime JobTime\n        {\n            get { return jobTime; }\n            set { jobTime = value; }\n        }\n\n        /// <summary>\n        /// Software ID - Field 16 (41 Bytes):\n        /// Bytes 426-466 - This field is an ASCII field of 41 bytes where the last byte must be\n        /// a binary zero (null). This gives a total of 40 ASCII characters for the Software ID.\n        /// The purpose of this field is to allow software to determine and record with what program\n        /// a particular image was created.If the field is not used, you may fill it with a\n        /// null terminated series of blanks (spaces) or nulls. The 41st byte must always be a null.\n        /// </summary>\n        public TgaString SoftwareID\n        {\n            get { return softwareID; }\n            set { softwareID = value; }\n        }\n\n        /// <summary>\n        /// Software Version - Field 17 (3 Bytes):\n        /// Bytes 467-469 - This field consists of two sub-fields, a SHORT and an ASCII BYTE.\n        /// The purpose of this field is to define the version of software defined by the\n        /// “Software ID” field above. The SHORT contains the version number as a binary\n        /// integer times 100.\n        /// <para>Therefore, software version 4.17 would be the integer value 417.This allows for\n        /// two decimal positions of sub-version.The ASCII BYTE supports developers who also\n        /// tag a release letter to the end. For example, if the version number is 1.17b, then\n        /// the SHORT would contain 117. and the ASCII BYTE would contain “b”.\n        /// The organization is as follows:</para>\n        /// <para>SHORT (Bytes 0 - 1): Version Number * 100</para>\n        /// <para>BYTE(Byte 2): Version Letter</para>\n        /// If you do not use this field, set the SHORT to binary zero, and the BYTE to a space(“ “)\n        /// </summary>\n        public TgaSoftVersion SoftVersion\n        {\n            get { return softVersion; }\n            set { softVersion = value; }\n        }\n\n        /// <summary>\n        /// Key Color - Field 18 (4 Bytes):\n        /// Bytes 470-473 - This field contains a long value which is the key color in effect at\n        /// the time the image is saved. The format is in A:R:G:B where ‘A’ (most significant byte)\n        /// is the alpha channel key color(if you don’t have an alpha channel in your application,\n        /// keep this byte zero [0]).\n        /// <para>The Key Color can be thought of as the ‘background color’ or ‘transparent color’.\n        /// This is the color of the ‘non image’ area of the screen, and the same color that the\n        /// screen would be cleared to if erased in the application. If you don’t use this field,\n        /// set it to all zeros (0). Setting the field to all zeros is the same as selecting a key\n        /// color of black.</para>\n        /// A good example of a key color is the ‘transparent color’ used in TIPS™ for WINDOW loading/saving.\n        /// </summary>\n        public TgaColorKey KeyColor\n        {\n            get { return keyColor; }\n            set { keyColor = value; }\n        }\n\n        /// <summary>\n        /// Pixel Aspect Ratio - Field 19 (4 Bytes):\n        /// Bytes 474-477 - This field contains two SHORT sub-fields, which when taken together\n        /// specify a pixel size ratio.The format is as follows:\n        /// <para>SHORT 0: Pixel Ratio Numerator(pixel width)</para>\n        /// <para>SHORT 1: Pixel Ratio Denominator(pixel height)</para>\n        /// These sub-fields may be used to determine the aspect ratio of a pixel. This is useful when\n        /// it is important to preserve the proper aspect ratio of the saved image. If the two values\n        /// are set to the same non-zero value, then the image is composed of square pixels. A zero\n        /// in the second sub-field (denominator) indicates that no pixel aspect ratio is specified.\n        /// </summary>\n        public TgaFraction PixelAspectRatio\n        {\n            get { return pixelAspectRatio; }\n            set { pixelAspectRatio = value; }\n        }\n\n        /// <summary>\n        /// Gamma Value - Field 20 (4 Bytes):\n        /// Bytes 478-481 - This field contains two SHORT sub-fields, which when taken together in a ratio,\n        /// provide a fractional gamma value.The format is as follows:\n        /// <para>SHORT 0: Gamma Numerator</para>\n        /// <para>SHORT 1: Gamma Denominator</para>\n        /// The resulting value should be in the range of 0.0 to 10.0, with only one decimal place of\n        /// precision necessary. An uncorrected image (an image with no gamma) should have the value 1.0 as\n        /// the result.This may be accomplished by placing thesame, non-zero values in both positions\n        /// (i.e., 1/1). If you decide to totally ignore this field, please set the denominator (the second\n        /// SHORT) to the value zero. This will indicate that the Gamma Value field is not being used.\n        /// </summary>\n        public TgaFraction GammaValue\n        {\n            get { return gammaValue; }\n            set { gammaValue = value; }\n        }\n\n        /// <summary>\n        /// Color Correction Offset - Field 21 (4 Bytes):\n        /// Bytes 482-485 - This field is a 4-byte field containing a single offset value. This is an offset\n        /// from the beginning of the file to the start of the Color Correction table. This table may be\n        /// written anywhere between the end of the Image Data field (field 8) and the start of the TGA\n        /// File Footer. If the image has no Color Correction Table or if the Gamma Value setting is\n        /// sufficient, set this value to zero and do not write a Correction Table anywhere.\n        /// </summary>\n        public uint ColorCorrectionTableOffset\n        {\n            get { return colorCorrectionOffset; }\n            set { colorCorrectionOffset = value; }\n        }\n\n        /// <summary>\n        /// Postage Stamp Offset - Field 22 (4 Bytes):\n        /// Bytes 486-489 - This field is a 4-byte field containing a single offset value. This is an offset\n        /// from the beginning of the file to the start of the Postage Stamp Image. The Postage Stamp Image\n        /// must be written after Field 25 (Scan Line Table) but before the start of the TGA File Footer.\n        /// If no postage stamp is stored, set this field to the value zero (0).\n        /// </summary>\n        public uint PostageStampOffset\n        {\n            get { return postageStampOffset; }\n            set { postageStampOffset = value; }\n        }\n\n        /// <summary>\n        /// Scan Line Offset - Field 23 (4 Bytes):\n        /// Bytes 490-493 - This field is a 4-byte field containing a single offset value. This is an\n        /// offset from the beginning of the file to the start of the Scan Line Table.\n        /// </summary>\n        public uint ScanLineOffset\n        {\n            get { return scanLineOffset; }\n            set { scanLineOffset = value; }\n        }\n\n        /// <summary>\n        /// Attributes Type - Field 24 (1 Byte):\n        /// Byte 494 - This single byte field contains a value which specifies the type of Alpha channel\n        /// data contained in the file. Value Meaning:\n        /// <para>0: no Alpha data included (bits 3-0 of field 5.6 should also be set to zero)</para>\n        /// <para>1: undefined data in the Alpha field, can be ignored</para>\n        /// <para>2: undefined data in the Alpha field, but should be retained</para>\n        /// <para>3: useful Alpha channel data is present</para>\n        /// <para>4: pre-multiplied Alpha(see description below)</para>\n        /// <para>5 -127: RESERVED</para>\n        /// <para>128-255: Un-assigned</para>\n        /// <para>Pre-multiplied Alpha Example: Suppose the Alpha channel data is being used to specify the\n        /// opacity of each pixel(for use when the image is overlayed on another image), where 0 indicates\n        /// that the pixel is completely transparent and a value of 1 indicates that the pixel is\n        /// completely opaque(assume all component values have been normalized).</para>\n        /// <para>A quadruple(a, r, g, b) of( 0.5, 1, 0, 0) would indicate that the pixel is pure red with a\n        /// transparency of one-half. For numerous reasons(including image compositing) is is better to\n        /// pre-multiply the individual color components with the value in the Alpha channel.</para>\n        /// A pre-multiplication of the above would produce a quadruple(0.5, 0.5, 0, 0).\n        /// A value of 3 in the Attributes Type Field(field 23) would indicate that the color components\n        /// of the pixel have already been scaled by the value in the Alpha channel.\n        /// </summary>\n        public TgaAttrType AttributesType\n        {\n            get { return attributesType; }\n            set { attributesType = value; }\n        }\n\n        /// <summary>\n        /// Scan Line Table - Field 25 (Variable):\n        /// This information is provided, at the developers’ request, for two purposes:\n        /// <para>1) To make random access of compressed images easy.</para>\n        /// <para>2) To allow “giant picture” access in smaller “chunks”.</para>\n        /// This table should contain a series of 4-byte offsets.Each offset you write should point to the\n        /// start of the next scan line, in the order that the image was saved (i.e., top down or bottom up).\n        /// The offset should be from the start of the file.Therefore, you will have a four byte value for\n        /// each scan line in your image. This means that if your image is 768 pixels tall, you will have 768,\n        /// 4-byte offset pointers (for a total of 3072 bytes). This size is not extreme, and thus this table\n        /// can be built and maintained in memory, and then written out at the proper time.\n        /// </summary>\n        public uint[] ScanLineTable\n        {\n            get { return scanLineTable; }\n            set { scanLineTable = value; }\n        }\n\n        /// <summary>\n        /// Postage Stamp Image - Field 26 (Variable):\n        /// The Postage Stamp area is a smaller representation of the original image. This is useful for\n        /// “browsing” a collection of image files. If your application can deal with a postage stamp image,\n        /// it is recommended that you create one using sub-sampling techniques to create the best\n        /// representation possible. The postage stamp image must be stored in the same format as the normal\n        /// image specified in the file, but without any compression. The first byte of the postage stamp\n        /// image specifies the X size of the stamp in pixels, the second byte of the stamp image specifies the\n        /// Y size of the stamp in pixels. Truevision does not recommend stamps larger than 64x64 pixels, and\n        /// suggests that any stamps stored larger be clipped. Obviously, the storage of the postage stamp\n        /// relies heavily on the storage of the image. The two images are stored using the same format under\n        /// the assumption that if you can read the image, then you can read the postage stamp. If the original\n        /// image is color mapped, DO NOT average the postage stamp, as you will create new colors not in your map.\n        /// </summary>\n        public TgaPostageStampImage PostageStampImage\n        {\n            get { return postageStampImage; }\n            set { postageStampImage = value; }\n        }\n\n        /// <summary>\n        /// Color Correction Table - Field 27 (2K Bytes):\n        /// The Color Correction Table is a block of 256 x 4 SHORT values, where each set of\n        /// four contiguous values are the desired A:R:G:B correction for that entry. This\n        /// allows the user to store a correction table for image remapping or LUT driving.\n        /// Since each color in the block is a SHORT, the maximum value for a color gun (i.e.,\n        /// A, R, G, B) is 65535, and the minimum value is zero.Therefore, BLACK maps to\n        /// 0, 0, 0, 0 and WHITE maps to 65535, 65535, 65535, 65535.\n        /// </summary>\n        public ushort[] ColorCorrectionTable\n        {\n            get { return colorCorrectionTable; }\n            set { colorCorrectionTable = value; }\n        }\n\n        /// <summary>\n        /// Other Data In Extension Area (if <see cref=\"ExtensionSize\"/> > 495).\n        /// </summary>\n        public byte[] OtherDataInExtensionArea\n        {\n            get { return otherDataInExtensionArea; }\n            set { otherDataInExtensionArea = value; }\n        }\n        #endregion\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaExtArea\"/>.\n        /// </summary>\n        /// <returns>Full independent copy of <see cref=\"TgaExtArea\"/>.</returns>\n        public TgaExtArea Clone()\n        {\n            TgaExtArea NewExtArea = new TgaExtArea();\n            NewExtArea.extensionSize = extensionSize;\n            NewExtArea.authorName = authorName.Clone();\n            NewExtArea.authorComments = authorComments.Clone();\n            NewExtArea.dateTimeStamp = dateTimeStamp.Clone();\n            NewExtArea.jobNameOrID = jobNameOrID.Clone();\n            NewExtArea.jobTime = jobTime.Clone();\n            NewExtArea.softwareID = softwareID.Clone();\n            NewExtArea.softVersion = softVersion.Clone();\n            NewExtArea.keyColor = keyColor.Clone();\n            NewExtArea.pixelAspectRatio = pixelAspectRatio.Clone();\n            NewExtArea.gammaValue = gammaValue.Clone();\n            NewExtArea.colorCorrectionOffset = colorCorrectionOffset;\n            NewExtArea.postageStampOffset = postageStampOffset;\n            NewExtArea.scanLineOffset = scanLineOffset;\n            NewExtArea.attributesType = attributesType;\n\n            if (scanLineTable != null)\n                NewExtArea.scanLineTable = (uint[])scanLineTable.Clone();\n            if (postageStampImage != null)\n                NewExtArea.postageStampImage = new TgaPostageStampImage(postageStampImage.ToBytes());\n            if (colorCorrectionTable != null)\n                NewExtArea.colorCorrectionTable = (ushort[])colorCorrectionTable.Clone();\n\n            if (otherDataInExtensionArea != null)\n                NewExtArea.otherDataInExtensionArea = (byte[])otherDataInExtensionArea.Clone();\n\n            return NewExtArea;\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaExtArea\"/>.\n        /// </summary>\n        /// <returns>Full independent copy of <see cref=\"TgaExtArea\"/>.</returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaExtArea) ? Equals((TgaExtArea)obj) : false);\n        }\n\n        public bool Equals(TgaExtArea item)\n        {\n            return (extensionSize == item.extensionSize &&\n                authorName == item.authorName &&\n                authorComments == item.authorComments &&\n                dateTimeStamp == item.dateTimeStamp &&\n                jobNameOrID == item.jobNameOrID &&\n                jobTime == item.jobTime &&\n                softwareID == item.softwareID &&\n                softVersion == item.softVersion &&\n                keyColor == item.keyColor &&\n                pixelAspectRatio == item.pixelAspectRatio &&\n                gammaValue == item.gammaValue &&\n                colorCorrectionOffset == item.colorCorrectionOffset &&\n                postageStampOffset == item.postageStampOffset &&\n                scanLineOffset == item.scanLineOffset &&\n                attributesType == item.attributesType &&\n\n                BitConverterExt.IsArraysEqual(scanLineTable, item.scanLineTable) &&\n                postageStampImage == item.postageStampImage &&\n                BitConverterExt.IsArraysEqual(colorCorrectionTable, item.colorCorrectionTable) &&\n\n                BitConverterExt.IsArraysEqual(otherDataInExtensionArea, item.otherDataInExtensionArea));\n        }\n\n        public static bool operator ==(TgaExtArea item1, TgaExtArea item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaExtArea item1, TgaExtArea item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = 27;\n                hash = (13 * hash) + extensionSize.GetHashCode();\n                hash = (13 * hash) + authorName.GetHashCode();\n                hash = (13 * hash) + authorComments.GetHashCode();\n                hash = (13 * hash) + dateTimeStamp.GetHashCode();\n                hash = (13 * hash) + jobNameOrID.GetHashCode();\n                hash = (13 * hash) + jobTime.GetHashCode();\n                hash = (13 * hash) + softwareID.GetHashCode();\n                hash = (13 * hash) + softVersion.GetHashCode();\n                hash = (13 * hash) + keyColor.GetHashCode();\n                hash = (13 * hash) + pixelAspectRatio.GetHashCode();\n                hash = (13 * hash) + gammaValue.GetHashCode();\n                hash = (13 * hash) + colorCorrectionOffset.GetHashCode();\n                hash = (13 * hash) + postageStampOffset.GetHashCode();\n                hash = (13 * hash) + scanLineOffset.GetHashCode();\n                hash = (13 * hash) + attributesType.GetHashCode();\n\n                if (scanLineTable != null)\n                    for (int i = 0; i < scanLineTable.Length; i++)\n                        hash = (13 * hash) + scanLineTable[i].GetHashCode();\n\n                if (postageStampImage != null)\n                    hash = (13 * hash) + postageStampImage.GetHashCode();\n\n                if (colorCorrectionTable != null)\n                    for (int i = 0; i < colorCorrectionTable.Length; i++)\n                        hash = (13 * hash) + colorCorrectionTable[i].GetHashCode();\n\n                if (otherDataInExtensionArea != null)\n                    for (int i = 0; i < otherDataInExtensionArea.Length; i++)\n                        hash = (13 * hash) + otherDataInExtensionArea[i].GetHashCode();\n\n                return hash;\n            }\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaExtArea\"/> to byte array. Warning: <see cref=\"ScanLineTable\"/>,\n        /// <see cref=\"PostageStampImage\"/>, <see cref=\"ColorCorrectionTable\"/> not included,\n        /// because thea are can be not in the Extension Area of TGA file!\n        /// </summary>\n        /// <returns>Byte array.</returns>\n        public byte[] ToBytes()\n        {\n            #region Exceptions check\n            if (authorName == null)\n                authorName = new TgaString(41, true);\n\n            if (authorComments == null)\n                authorComments = new TgaComment();\n\n            if (dateTimeStamp == null)\n                dateTimeStamp = new TgaDateTime(DateTime.UtcNow);\n\n            if (jobNameOrID == null)\n                jobNameOrID = new TgaString(41, true);\n\n            if (jobTime == null)\n                jobTime = new TgaTime();\n\n            if (softwareID == null)\n                softwareID = new TgaString(41, true);\n\n            if (softVersion == null)\n                softVersion = new TgaSoftVersion();\n\n            if (keyColor == null)\n                keyColor = new TgaColorKey();\n\n            if (pixelAspectRatio == null)\n                pixelAspectRatio = new TgaFraction();\n\n            if (gammaValue == null)\n                gammaValue = new TgaFraction();\n            #endregion\n\n            return BitConverterExt.ToBytes(\n                extensionSize,\n                authorName.ToBytes(),\n                authorComments.ToBytes(),\n                dateTimeStamp.ToBytes(),\n                jobNameOrID.ToBytes(),\n                jobTime.ToBytes(),\n                softwareID.ToBytes(),\n                softVersion.ToBytes(),\n                keyColor.ToBytes(),\n                pixelAspectRatio.ToBytes(),\n                gammaValue.ToBytes(),\n                colorCorrectionOffset,\n                postageStampOffset,\n                scanLineOffset,\n                (byte)attributesType,\n                otherDataInExtensionArea);\n        }\n    } //Not full ToBytes()\n\n    /// <summary>\n    /// File Footer Area\n    /// </summary>\n    public class TgaFooter : ICloneable\n    {\n        uint extAreaOffset = 0;\n        uint devDirOffset = 0;\n        TgaString signature = TgaString.XFileSignatute;\n        TgaString reservedChar = TgaString.DotSymbol;\n        TgaString zeroStrTerminator = TgaString.ZeroTerminator;\n\n        /// <summary>\n        /// Make NewXFile format TGA Footer with <see cref=\"ExtensionAreaOffset\"/> = 0 and\n        /// <see cref=\"DeveloperDirectoryOffset\"/> = 0.\n        /// </summary>\n        public TgaFooter()\n        {\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaFooter\"/> from values.\n        /// </summary>\n        /// <param name=\"ExtOff\">Extension Area Offset, offset from the beginning of the file.</param>\n        /// <param name=\"DevDirOff\">Developer Directory Offset, offset from the beginning of the file.</param>\n        /// <param name=\"Sign\">New TGA format signature.</param>\n        /// <param name=\"ReservChr\">Reserved Character - ASCII character “.” (period).</param>\n        /// <param name=\"Termin\">Binary Zero Terminator, a binary zero which acts as a final terminator.</param>\n        public TgaFooter(uint ExtOff, uint DevDirOff, TgaString Sign, TgaString ReservChr, TgaString Termin)\n        {\n            extAreaOffset = ExtOff;\n            devDirOffset = DevDirOff;\n            signature = Sign;\n            reservedChar = ReservChr;\n            zeroStrTerminator = Termin;\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TgaFooter\"/> from bytes (if signature is right).\n        /// </summary>\n        /// <param name=\"Bytes\">Bytes array (byte[26]).</param>\n        public TgaFooter(byte[] Bytes)\n        {\n            if (Bytes == null)\n                throw new ArgumentNullException(nameof(Bytes) + \" = null!\");\n            if (Bytes.Length != Size)\n                throw new ArgumentOutOfRangeException(nameof(Bytes.Length) + \" must be equal \" + Size + \"!\");\n\n            extAreaOffset = BitConverter.ToUInt32(Bytes, 0);\n            devDirOffset = BitConverter.ToUInt32(Bytes, 4);\n            signature = new TgaString(BitConverterExt.GetElements(Bytes, 8, TgaString.XFileSignatuteConst.Length));\n            reservedChar = new TgaString(new byte[] { Bytes[24] });\n            zeroStrTerminator = new TgaString(new byte[] { Bytes[25] });\n        }\n\n        /// <summary>\n        /// Byte 0-3 - Extension Area Offset - Field 28\n        /// The first four bytes (bytes 0-3, the first LONG) of the TGA File Footer contain an\n        /// offset from the beginning of the file to the start of the Extension Area. Simply\n        /// SEEK to this location to position to the start of the Extension Area. If the\n        /// Extension Area Offset is zero, no Extension Area exists in the file.\n        /// </summary>\n        public uint ExtensionAreaOffset\n        {\n            get { return extAreaOffset; }\n            set { extAreaOffset = value; }\n        }\n\n        /// <summary>\n        /// Byte 4-7 - Developer Directory Offset - Field 29\n        /// The next four bytes(bytes 4-7, the second LONG) contain an offset from the\n        /// beginning of the file to the start of the Developer Directory. If the Developer\n        /// Directory Offset is zero, then the Developer Area does not exist.\n        /// </summary>\n        public uint DeveloperDirectoryOffset\n        {\n            get { return devDirOffset; }\n            set { devDirOffset = value; }\n        }\n\n        /// <summary>\n        /// Byte 8-23 - Signature - Field 30\n        /// This string is exactly 16 bytes long and is formatted exactly as shown below\n        /// capital letters), with a hyphen between “TRUEVISION” and “XFILE.” If the\n        /// signature is detected, the file is assumed to be of the New TGA format and MAY,\n        /// therefore, contain the Developer Area and/or the Extension Area fields.If the\n        /// signature is not found, then the file is assumed to be in the Original TGA format.\n        /// </summary>\n        public TgaString Signature\n        {\n            get { return signature; }\n            set { signature = value; }\n        }\n\n        /// <summary>\n        /// Byte 24 - Reserved Character - Field 31\n        /// Byte 24 is an ASCII character “.” (period). This character MUST BE a period or\n        /// the file is not considered a proper TGA file.\n        /// </summary>\n        public TgaString ReservedCharacter\n        {\n            get { return reservedChar; }\n            set { reservedChar = value; }\n        }\n\n        /// <summary>\n        /// Byte 25 - Binary Zero String Terminator - Field 32\n        /// Byte 25 is a binary zero which acts as a final terminator and allows the entire TGA\n        /// File Footer to be read and utilized as a “C” string.\n        /// </summary>\n        public TgaString BinaryZeroStringTerminator\n        {\n            get { return zeroStrTerminator; }\n            set { zeroStrTerminator = value; }\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaFooter\"/>.\n        /// </summary>\n        /// <returns></returns>\n        public TgaFooter Clone()\n        {\n            return new TgaFooter(extAreaOffset, devDirOffset, signature.Clone(),\n                reservedChar.Clone(), zeroStrTerminator.Clone());\n        }\n\n        /// <summary>\n        /// Make full copy of <see cref=\"TgaFooter\"/>.\n        /// </summary>\n        /// <returns></returns>\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        /// <summary>\n        /// Gets TGA Footer Section size in bytes.\n        /// </summary>\n        public const int Size = 26;\n\n        public override bool Equals(object obj)\n        {\n            return ((obj is TgaFooter) ? Equals((TgaFooter)obj) : false);\n        }\n\n        public bool Equals(TgaFooter item)\n        {\n            return (extAreaOffset == item.extAreaOffset &&\n                devDirOffset == item.devDirOffset &&\n                signature == item.signature &&\n                reservedChar == item.reservedChar &&\n                zeroStrTerminator == item.zeroStrTerminator);\n        }\n\n        public static bool operator ==(TgaFooter item1, TgaFooter item2)\n        {\n            if (ReferenceEquals(item1, null))\n                return ReferenceEquals(item2, null);\n\n            if (ReferenceEquals(item2, null))\n                return ReferenceEquals(item1, null);\n\n            return item1.Equals(item2);\n        }\n\n        public static bool operator !=(TgaFooter item1, TgaFooter item2)\n        {\n            return !(item1 == item2);\n        }\n\n        public override int GetHashCode()\n        {\n            unchecked\n            {\n                int hash = 17;\n                hash = hash * 23 + extAreaOffset.GetHashCode();\n                hash = hash * 23 + devDirOffset.GetHashCode();\n\n                if (signature != null)\n                    hash = hash * 23 + signature.GetHashCode();\n\n                if (reservedChar != null)\n                    hash = hash * 23 + reservedChar.GetHashCode();\n\n                if (zeroStrTerminator != null)\n                    hash = hash * 23 + zeroStrTerminator.GetHashCode();\n\n                return hash;\n            }\n        }\n\n        public override string ToString()\n        {\n            return String.Format(\"{0}={1}, {2}={3}, FullSignature={4}\",\n                nameof(ExtensionAreaOffset), extAreaOffset, nameof(DeveloperDirectoryOffset), devDirOffset,\n                (signature + reservedChar + zeroStrTerminator).ToString());\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TgaFooter\"/> to byte array.\n        /// </summary>\n        /// <returns>Byte array with size equal <see cref=\"Size\"/>.</returns>\n        public byte[] ToBytes()\n        {\n            return BitConverterExt.ToBytes(extAreaOffset, devDirOffset,\n                signature.ToBytes(), reservedChar.ToBytes(), zeroStrTerminator.ToBytes());\n        }\n\n        /// <summary>\n        /// Is footer is real footer of TGA File Format Version 2.0?\n        /// Checking by <see cref=\"TgaString.XFileSignatute\"/>.\n        /// </summary>\n        public bool IsFooterCorrect\n        {\n            get { return signature == TgaString.XFileSignatute; }\n        }\n    }\n\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n\n    /// <summary>\n    /// Simplify ByteConversion operations, like concatination of byte arrays, comparing and other.\n    /// </summary>\n    public static class BitConverterExt\n    {\n        /// <summary>\n        /// Combine byte, byte[], (u)short, (u)int, (u)long values to byte[] array.\n        /// </summary>\n        /// <param name=\"obj\">Array of byte, byte[], (u)short, (u)int, (u)long values.</param>\n        /// <returns>Array of bytes, null when some object is null.</returns>\n        public static byte[] ToBytes(params object[] obj)\n        {\n            if (obj == null)\n                return null;\n\n            List<byte> BytesList = new List<byte>();\n\n            for (int i = 0; i < obj.Length; i++)\n            {\n                if (obj[i] == null)\n                    continue;\n                else if (obj[i] is byte)\n                    BytesList.Add((byte)obj[i]);\n                else if (obj[i] is byte[])\n                    BytesList.AddRange((byte[])obj[i]);\n                else if (obj[i] is short)\n                    BytesList.AddRange(BitConverter.GetBytes((short)obj[i]));\n                else if (obj[i] is ushort)\n                    BytesList.AddRange(BitConverter.GetBytes((ushort)obj[i]));\n                else if (obj[i] is int)\n                    BytesList.AddRange(BitConverter.GetBytes((int)obj[i]));\n                else if (obj[i] is uint)\n                    BytesList.AddRange(BitConverter.GetBytes((uint)obj[i]));\n                else if (obj[i] is long)\n                    BytesList.AddRange(BitConverter.GetBytes((long)obj[i]));\n                else if (obj[i] is ulong)\n                    BytesList.AddRange(BitConverter.GetBytes((ulong)obj[i]));\n            }\n            return BytesList.ToArray();\n        }\n\n        /// <summary>\n        /// Copies a range of elements from an Array starting at the specified source index.\n        /// The length and the index are specified as 32-bit integers.\n        /// </summary>\n        /// <param name=\"SrcArray\">The <see cref=\"Array\"/> that contains the data to copy.</param>\n        /// <param name=\"Offset\">A 32-bit integer that represents the index in the\n        /// <see cref=\"SrcArray\"/> at which copying begins.</param>\n        /// <param name=\"Count\">A 32-bit integer that represents the number of elements to copy.</param>\n        /// <returns></returns>\n        public static T[] GetElements<T>(T[] SrcArray, int Offset, int Count)\n        {\n            if (SrcArray == null)\n                throw new ArgumentNullException(nameof(SrcArray) + \" is null!\");\n\n            if (Offset >= SrcArray.Length || Offset < 0)\n                throw new ArgumentOutOfRangeException(nameof(Offset) + \" has wrong value!\");\n\n            if (Count <= 0 || Offset + Count > SrcArray.Length)\n                throw new ArgumentOutOfRangeException(nameof(Count) + \" has wrong value!\");\n\n            T[] Buff = new T[Count];\n            Array.Copy(SrcArray, Offset, Buff, 0, Buff.Length);\n            return Buff;\n        }\n\n        /// <summary>\n        /// Compare N-dimensional Arrays.\n        /// </summary>\n        /// <typeparam name=\"T\">Arrays Type.</typeparam>\n        /// <param name=\"item1\">First Array.</param>\n        /// <param name=\"item2\">Second Array.</param>\n        /// <returns>True, if Arrays are equal.</returns>\n        public static bool IsArraysEqual<T>(T[] item1, T[] item2)\n        {\n            if (ReferenceEquals(item1, item2))\n                return true;\n\n            if (item1 == null || item2 == null)\n                return false;\n\n            if (item1.Length != item2.Length)\n                return false;\n\n            EqualityComparer<T> comparer = EqualityComparer<T>.Default;\n            for (int i = 0; i < item1.Length; i++)\n                if (!comparer.Equals(item1[i], item2[i]))\n                    return false;\n            return true;\n        }\n\n        /// <summary>\n        /// Compare Lists.\n        /// </summary>\n        /// <typeparam name=\"T\">List Type.</typeparam>\n        /// <param name=\"item1\">First List.</param>\n        /// <param name=\"item2\">Second List.</param>\n        /// <returns>True, if Lists are equal.</returns>\n        public static bool IsListsEqual<T>(List<T> item1, List<T> item2)\n        {\n            if (ReferenceEquals(item1, item2))\n                return true;\n\n            if (item1 == null || item2 == null)\n                return false;\n\n            if (item1.Count != item2.Count)\n                return false;\n\n            for (int i = 0; i < item1.Count; i++)\n                if (!item1[i].Equals(item2[i]))\n                    return false;\n            return true;\n        }\n\n        /// <summary>\n        /// Compare elements in one Array with different offsets.\n        /// </summary>\n        /// <typeparam name=\"T\">Array type.</typeparam>\n        /// <param name=\"Arr\">Some Array.</param>\n        /// <param name=\"Offset1\">First offset.</param>\n        /// <param name=\"Offset2\">Second offset.</param>\n        /// <param name=\"Count\">Elements count which must be compared.</param>\n        /// <returns></returns>\n        public static bool IsElementsEqual<T>(T[] Arr, int Offset1, int Offset2, int Count)\n        {\n            if (Arr == null)\n                throw new ArgumentNullException(nameof(Arr) + \" is null!\");\n\n            if (Offset1 >= Arr.Length || Offset1 < 0)\n                throw new ArgumentOutOfRangeException(nameof(Offset1) + \" has wrong value!\");\n\n            if (Offset2 >= Arr.Length || Offset2 < 0)\n                throw new ArgumentOutOfRangeException(nameof(Offset2) + \" has wrong value!\");\n\n            if (Count <= 0 || Offset1 + Count > Arr.Length || Offset2 + Count > Arr.Length)\n                throw new ArgumentOutOfRangeException(nameof(Count) + \" has wrong value!\");\n\n            if (Offset1 == Offset2)\n                return true;\n\n            for (int i = 0; i < Count; i++)\n                if (!Arr[Offset1 + i].Equals(Arr[Offset2 + i]))\n                    return false;\n\n            return true;\n        }\n    }\n    #endregion\n\n    public class TGA : ICloneable\n    {\n        public TgaHeader Header = new TgaHeader();\n        public TgaImgOrColMap ImageOrColorMapArea = new TgaImgOrColMap();\n        public TgaDevArea DevArea = null;\n        public TgaExtArea ExtArea = null;\n        public TgaFooter Footer = null;\n\n        #region TGA Creation, Loading, Saving (all are public, have reference to private metods).\n        /// <summary>\n        /// Create new empty <see cref=\"TGA\"/> istance.\n        /// </summary>\n        public TGA()\n        {\n        }\n\n        /// <summary>\n        /// Create <see cref=\"TGA\"/> instance with some params. If it must have ColorMap,\n        /// check all ColorMap fields and settings after.\n        /// </summary>\n        /// <param name=\"Width\">Image Width.</param>\n        /// <param name=\"Height\">Image Height.</param>\n        /// <param name=\"PixDepth\">Image Pixel Depth (bits / pixel), set ColorMap bpp after, if needed!</param>\n        /// <param name=\"ImgType\">Image Type (is RLE compressed, ColorMapped or GrayScaled).</param>\n        /// <param name=\"AttrBits\">Set numder of Attrbute bits (Alpha channel bits), default: 0, 1, 8.</param>\n        /// <param name=\"NewFormat\">Use new 2.0 TGA XFile format?</param>\n        public TGA(ushort Width, ushort Height, TgaPixelDepth PixDepth = TgaPixelDepth.Bpp24,\n            TgaImageType ImgType = TgaImageType.Uncompressed_TrueColor, byte AttrBits = 0, bool NewFormat = true)\n        {\n            if (Width <= 0 || Height <= 0 || PixDepth == TgaPixelDepth.Other)\n            {\n                Width = Height = 0;\n                PixDepth = TgaPixelDepth.Other;\n                ImgType = TgaImageType.NoImageData;\n                AttrBits = 0;\n            }\n            else\n            {\n                int BytesPerPixel = (int)Math.Ceiling((double)PixDepth / 8.0);\n                ImageOrColorMapArea.ImageData = new byte[Width * Height * BytesPerPixel];\n\n                if (ImgType == TgaImageType.Uncompressed_ColorMapped || ImgType == TgaImageType.RLE_ColorMapped)\n                {\n                    Header.ColorMapType = TgaColorMapType.ColorMap;\n                    Header.ColorMapSpec.FirstEntryIndex = 0;\n                    Header.ColorMapSpec.ColorMapEntrySize = (TgaColorMapEntrySize)Math.Ceiling((double)PixDepth / 8);\n                }\n            }\n\n            Header.ImageType = ImgType;\n            Header.ImageSpec.ImageWidth = Width;\n            Header.ImageSpec.ImageHeight = Height;\n            Header.ImageSpec.PixelDepth = PixDepth;\n            Header.ImageSpec.ImageDescriptor.AlphaChannelBits = AttrBits;\n\n            if (NewFormat)\n            {\n                Footer = new TgaFooter();\n                ExtArea = new TgaExtArea();\n                ExtArea.DateTimeStamp = new TgaDateTime(DateTime.UtcNow);\n                ExtArea.AttributesType = (AttrBits > 0 ? TgaAttrType.UsefulAlpha : TgaAttrType.NoAlpha);\n            }\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TGA\"/> from some <see cref=\"TGA\"/> instance.\n        /// Equal to <see cref=\"TGA.Clone()\"/> function.\n        /// </summary>\n        /// <param name=\"tga\">Original <see cref=\"TGA\"/> instance.</param>\n        public TGA(TGA tga)\n        {\n            Header = tga.Header.Clone();\n            ImageOrColorMapArea = tga.ImageOrColorMapArea.Clone();\n            DevArea = tga.DevArea.Clone();\n            ExtArea = tga.ExtArea.Clone();\n            Footer = tga.Footer.Clone();\n        }\n\n        /// <summary>\n        /// Load <see cref=\"TGA\"/> from file.\n        /// </summary>\n        /// <param name=\"filename\">Full path to TGA file.</param>\n        /// <returns>Loaded <see cref=\"TGA\"/> file.</returns>\n        public TGA(string filename)\n        {\n            LoadFunc(filename);\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TGA\"/> from bytes array.\n        /// </summary>\n        /// <param name=\"bytes\">Bytes array (same like TGA File).</param>\n        public TGA(byte[] bytes)\n        {\n            LoadFunc(bytes);\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TGA\"/> from <see cref=\"Stream\"/>.\n        /// For file opening better use <see cref=\"FromFile(string)\"/>.\n        /// </summary>\n        /// <param name=\"stream\">Some stream. You can use a lot of Stream types, but Stream must support:\n        /// <see cref=\"Stream.CanSeek\"/> and <see cref=\"Stream.CanRead\"/>.</param>\n        public TGA(Stream stream)\n        {\n            LoadFunc(stream);\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TGA\"/> from <see cref=\"Bitmap\"/>.\n        /// </summary>\n        /// <param name=\"bmp\">Input Bitmap, supported a lot of bitmaps types: 8/15/16/24/32 Bpp's.</param>\n        /// <param name=\"UseRLE\">Use RLE Compression?</param>\n        /// <param name=\"NewFormat\">Use new 2.0 TGA XFile format?</param>\n        /// <param name=\"ColorMap2BytesEntry\">Is Color Map Entry size equal 15 or 16 Bpp, else - 24 or 32.</param>\n        public TGA(Bitmap bmp, bool UseRLE = false, bool NewFormat = true, bool ColorMap2BytesEntry = false)\n        {\n            LoadFunc(bmp, UseRLE, NewFormat, ColorMap2BytesEntry);\n        }\n\n        /// <summary>\n        /// Load <see cref=\"TGA\"/> from file.\n        /// </summary>\n        /// <param name=\"filename\">Full path to TGA file.</param>\n        /// <returns>Loaded <see cref=\"TGA\"/> file.</returns>\n        public static TGA FromFile(string filename)\n        {\n            return new TGA(filename);\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TGA\"/> from bytes array.\n        /// </summary>\n        /// <param name=\"bytes\">Bytes array (same like TGA File).</param>\n        public static TGA FromBytes(byte[] bytes)\n        {\n            return new TGA(bytes);\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TGA\"/> from <see cref=\"Stream\"/>.\n        /// For file opening better use <see cref=\"FromFile(string)\"/>.\n        /// </summary>\n        /// <param name=\"stream\">Some stream. You can use a lot of Stream types, but Stream must support:\n        /// <see cref=\"Stream.CanSeek\"/> and <see cref=\"Stream.CanRead\"/>.</param>\n        public static TGA FromStream(Stream stream)\n        {\n            return new TGA(stream);\n        }\n\n        /// <summary>\n        /// Make <see cref=\"TGA\"/> from <see cref=\"Bitmap\"/>.\n        /// </summary>\n        /// <param name=\"bmp\">Input Bitmap, supported a lot of bitmaps types: 8/15/16/24/32 Bpp's.</param>\n        /// <param name=\"UseRLE\">Use RLE Compression?</param>\n        /// <param name=\"NewFormat\">Use new 2.0 TGA XFile format?</param>\n        /// <param name=\"ColorMap2BytesEntry\">Is Color Map Entry size equal 15 or 16 Bpp, else - 24 or 32.</param>\n        public static TGA FromBitmap(Bitmap bmp, bool UseRLE = false,\n            bool NewFormat = true, bool ColorMap2BytesEntry = false)\n        {\n            return new TGA(bmp, UseRLE, NewFormat, ColorMap2BytesEntry);\n        }\n\n        /// <summary>\n        /// Save <see cref=\"TGA\"/> to file.\n        /// </summary>\n        /// <param name=\"filename\">Full path to file.</param>\n        /// <returns>Return \"true\", if all done or \"false\", if failed.</returns>\n        public bool Save(string filename)\n        {\n            try\n            {\n                bool Result = false;\n                using (FileStream Fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None))\n                {\n                    using (MemoryStream Ms = new MemoryStream())\n                    {\n                        Result = SaveFunc(Ms);\n                        Ms.WriteTo(Fs);\n                        Fs.Flush();\n                    }\n                }\n                return Result;\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Save <see cref=\"TGA\"/> to <see cref=\"Stream\"/>.\n        /// </summary>\n        /// <param name=\"stream\">Some stream, it must support: <see cref=\"Stream.CanWrite\"/>.</param>\n        /// <returns>Return \"true\", if all done or \"false\", if failed.</returns>\n        public bool Save(Stream stream)\n        {\n            return SaveFunc(stream);\n        }\n        #endregion\n\n        /// <summary>\n        /// Gets or Sets Image Width (see <see cref=\"Header.ImageSpec.ImageWidth\"/>).\n        /// </summary>\n        public ushort Width\n        {\n            get { return Header.ImageSpec.ImageWidth; }\n            set { Header.ImageSpec.ImageWidth = value; }\n        }\n\n        /// <summary>\n        /// Gets or Sets Image Height (see <see cref=\"Header.ImageSpec.ImageHeight\"/>).\n        /// </summary>\n        public ushort Height\n        {\n            get { return Header.ImageSpec.ImageHeight; }\n            set { Header.ImageSpec.ImageHeight = value; }\n        }\n\n        /// <summary>\n        /// Gets or Sets <see cref=\"TGA\"/> image Size.\n        /// </summary>\n        public Size Size\n        {\n            get { return new Size(Header.ImageSpec.ImageWidth, Header.ImageSpec.ImageHeight); }\n            set\n            {\n                Header.ImageSpec.ImageWidth = (ushort)value.Width;\n                Header.ImageSpec.ImageHeight = (ushort)value.Height;\n            }\n        }\n\n        /// <summary>\n        /// Make full independed copy of <see cref=\"TGA\"/>.\n        /// </summary>\n        /// <returns>Full independed copy of <see cref=\"TGA\"/>.</returns>\n        public TGA Clone()\n        {\n            return new TGA(this);\n        }\n\n        object ICloneable.Clone()\n        {\n            return Clone();\n        }\n\n        /// <summary>\n        /// Flip <see cref=\"TGA\"/> directions, for more info see <see cref=\"TgaImgOrigin\"/>.\n        /// </summary>\n        /// <param name=\"Horizontal\">Flip horizontal.</param>\n        /// <param name=\"Vertical\">Flip vertical.</param>\n        public void Flip(bool Horizontal = false, bool Vertical = false)\n        {\n            int NewOrigin = (int)Header.ImageSpec.ImageDescriptor.ImageOrigin;\n            NewOrigin = NewOrigin ^ ((Vertical ? 0x20 : 0) | (Horizontal ? 0x10 : 0));\n            Header.ImageSpec.ImageDescriptor.ImageOrigin = (TgaImgOrigin)NewOrigin;\n        }\n\n        /// <summary>\n        /// Get information from TGA image.\n        /// </summary>\n        /// <returns>MultiLine string with info fields (one per line).</returns>\n        public string GetInfo()\n        {\n            StringBuilder SB = new StringBuilder();\n\n            SB.AppendLine(\"Header:\");\n            SB.AppendLine(\"\\tID Length = \" + Header.IDLength);\n            SB.AppendLine(\"\\tImage Type = \" + Header.ImageType);\n            SB.AppendLine(\"\\tHeader -> ImageSpec:\");\n            SB.AppendLine(\"\\t\\tImage Width = \" + Header.ImageSpec.ImageWidth);\n            SB.AppendLine(\"\\t\\tImage Height = \" + Header.ImageSpec.ImageHeight);\n            SB.AppendLine(\"\\t\\tPixel Depth = \" + Header.ImageSpec.PixelDepth);\n            SB.AppendLine(\"\\t\\tImage Descriptor (AsByte) = \" + Header.ImageSpec.ImageDescriptor.ToByte());\n            SB.AppendLine(\"\\t\\tImage Descriptor -> AttributeBits = \" + Header.ImageSpec.ImageDescriptor.AlphaChannelBits);\n            SB.AppendLine(\"\\t\\tImage Descriptor -> ImageOrigin = \" + Header.ImageSpec.ImageDescriptor.ImageOrigin);\n            SB.AppendLine(\"\\t\\tX_Origin = \" + Header.ImageSpec.X_Origin);\n            SB.AppendLine(\"\\t\\tY_Origin = \" + Header.ImageSpec.Y_Origin);\n            SB.AppendLine(\"\\tColorMap Type = \" + Header.ColorMapType);\n            SB.AppendLine(\"\\tHeader -> ColorMapSpec:\");\n            SB.AppendLine(\"\\t\\tColorMap Entry Size = \" + Header.ColorMapSpec.ColorMapEntrySize);\n            SB.AppendLine(\"\\t\\tColorMap Length = \" + Header.ColorMapSpec.ColorMapLength);\n            SB.AppendLine(\"\\t\\tFirstEntry Index = \" + Header.ColorMapSpec.FirstEntryIndex);\n\n            SB.AppendLine(\"\\nImage / Color Map Area:\");\n            if (Header.IDLength > 0 && ImageOrColorMapArea.ImageID != null)\n                SB.AppendLine(\"\\tImage ID = \\\"\" + ImageOrColorMapArea.ImageID.GetString() + \"\\\"\");\n            else\n                SB.AppendLine(\"\\tImage ID = null\");\n\n            if (ImageOrColorMapArea.ImageData != null)\n                SB.AppendLine(\"\\tImage Data Length = \" + ImageOrColorMapArea.ImageData.Length);\n            else\n                SB.AppendLine(\"\\tImage Data = null\");\n\n            if (ImageOrColorMapArea.ColorMapData != null)\n                SB.AppendLine(\"\\tColorMap Data Length = \" + ImageOrColorMapArea.ColorMapData.Length);\n            else\n                SB.AppendLine(\"\\tColorMap Data = null\");\n\n            SB.AppendLine(\"\\nDevelopers Area:\");\n            if (DevArea != null)\n                SB.AppendLine(\"\\tCount = \" + DevArea.Count);\n            else\n                SB.AppendLine(\"\\tDevArea = null\");\n\n            SB.AppendLine(\"\\nExtension Area:\");\n            if (ExtArea != null)\n            {\n                SB.AppendLine(\"\\tExtension Size = \" + ExtArea.ExtensionSize);\n                SB.AppendLine(\"\\tAuthor Name = \\\"\" + ExtArea.AuthorName.GetString() + \"\\\"\");\n                SB.AppendLine(\"\\tAuthor Comments = \\\"\" + ExtArea.AuthorComments.GetString() + \"\\\"\");\n                SB.AppendLine(\"\\tDate / Time Stamp = \" + ExtArea.DateTimeStamp);\n                SB.AppendLine(\"\\tJob Name / ID = \\\"\" + ExtArea.JobNameOrID.GetString() + \"\\\"\");\n                SB.AppendLine(\"\\tJob Time = \" + ExtArea.JobTime);\n                SB.AppendLine(\"\\tSoftware ID = \\\"\" + ExtArea.SoftwareID.GetString() + \"\\\"\");\n                SB.AppendLine(\"\\tSoftware Version = \\\"\" + ExtArea.SoftVersion + \"\\\"\");\n                SB.AppendLine(\"\\tKey Color = \" + ExtArea.KeyColor);\n                SB.AppendLine(\"\\tPixel Aspect Ratio = \" + ExtArea.PixelAspectRatio);\n                SB.AppendLine(\"\\tGamma Value = \" + ExtArea.GammaValue);\n                SB.AppendLine(\"\\tColor Correction Table Offset = \" + ExtArea.ColorCorrectionTableOffset);\n                SB.AppendLine(\"\\tPostage Stamp Offset = \" + ExtArea.PostageStampOffset);\n                SB.AppendLine(\"\\tScan Line Offset = \" + ExtArea.ScanLineOffset);\n                SB.AppendLine(\"\\tAttributes Type = \" + ExtArea.AttributesType);\n\n                if (ExtArea.ScanLineTable != null)\n                    SB.AppendLine(\"\\tScan Line Table = \" + ExtArea.ScanLineTable.Length);\n                else\n                    SB.AppendLine(\"\\tScan Line Table = null\");\n\n                if (ExtArea.PostageStampImage != null)\n                    SB.AppendLine(\"\\tPostage Stamp Image: \" + ExtArea.PostageStampImage.ToString());\n                else\n                    SB.AppendLine(\"\\tPostage Stamp Image = null\");\n\n                SB.AppendLine(\"\\tColor Correction Table = \" + (ExtArea.ColorCorrectionTable != null));\n            }\n            else\n                SB.AppendLine(\"\\tExtArea = null\");\n\n            SB.AppendLine(\"\\nFooter:\");\n            if (Footer != null)\n            {\n                SB.AppendLine(\"\\tExtension Area Offset = \" + Footer.ExtensionAreaOffset);\n                SB.AppendLine(\"\\tDeveloper Directory Offset = \" + Footer.DeveloperDirectoryOffset);\n                SB.AppendLine(\"\\tSignature (Full) = \\\"\" + Footer.Signature.ToString() +\n                    Footer.ReservedCharacter.ToString() + Footer.BinaryZeroStringTerminator.ToString() + \"\\\"\");\n            }\n            else\n                SB.AppendLine(\"\\tFooter = null\");\n\n            return SB.ToString();\n        }\n\n        /// <summary>\n        /// Check and update all fields with data length and offsets.\n        /// </summary>\n        /// <returns>Return \"true\", if all OK or \"false\", if checking failed.</returns>\n        public bool CheckAndUpdateOffsets(out string ErrorStr)\n        {\n            ErrorStr = String.Empty;\n\n            if (Header == null)\n            {\n                ErrorStr = \"Header = null\";\n                return false;\n            }\n\n            if (ImageOrColorMapArea == null)\n            {\n                ErrorStr = \"ImageOrColorMapArea = null\";\n                return false;\n            }\n\n            uint Offset = TgaHeader.Size; // Virtual Offset\n\n            #region Header\n            if (ImageOrColorMapArea.ImageID != null)\n            {\n                int StrMaxLen = 255;\n                if (ImageOrColorMapArea.ImageID.UseEndingChar)\n                    StrMaxLen--;\n\n                Header.IDLength = (byte)Math.Min(ImageOrColorMapArea.ImageID.OriginalString.Length, StrMaxLen);\n                ImageOrColorMapArea.ImageID.Length = Header.IDLength;\n                Offset += Header.IDLength;\n            }\n            else\n                Header.IDLength = 0;\n            #endregion\n\n            #region ColorMap\n            if (Header.ColorMapType != TgaColorMapType.NoColorMap)\n            {\n                if (Header.ColorMapSpec == null)\n                {\n                    ErrorStr = \"Header.ColorMapSpec = null\";\n                    return false;\n                }\n\n                if (Header.ColorMapSpec.ColorMapLength == 0)\n                {\n                    ErrorStr = \"Header.ColorMapSpec.ColorMapLength = 0\";\n                    return false;\n                }\n\n                if (ImageOrColorMapArea.ColorMapData == null)\n                {\n                    ErrorStr = \"ImageOrColorMapArea.ColorMapData = null\";\n                    return false;\n                }\n\n                int CmBytesPerPixel = (int)Math.Ceiling((double)Header.ColorMapSpec.ColorMapEntrySize / 8.0);\n                int LenBytes = Header.ColorMapSpec.ColorMapLength * CmBytesPerPixel;\n\n                if (LenBytes != ImageOrColorMapArea.ColorMapData.Length)\n                {\n                    ErrorStr = \"ImageOrColorMapArea.ColorMapData.Length has wrong size!\";\n                    return false;\n                }\n\n                Offset += (uint)ImageOrColorMapArea.ColorMapData.Length;\n            }\n            #endregion\n\n            #region Image Data\n            int BytesPerPixel = 0;\n            if (Header.ImageType != TgaImageType.NoImageData)\n            {\n                if (Header.ImageSpec == null)\n                {\n                    ErrorStr = \"Header.ImageSpec = null\";\n                    return false;\n                }\n\n                if (Header.ImageSpec.ImageWidth == 0 || Header.ImageSpec.ImageHeight == 0)\n                {\n                    ErrorStr = \"Header.ImageSpec.ImageWidth = 0 or Header.ImageSpec.ImageHeight = 0\";\n                    return false;\n                }\n\n                if (ImageOrColorMapArea.ImageData == null)\n                {\n                    ErrorStr = \"ImageOrColorMapArea.ImageData = null\";\n                    return false;\n                }\n\n                BytesPerPixel = (int)Math.Ceiling((double)Header.ImageSpec.PixelDepth / 8.0);\n                if (Width * Height * BytesPerPixel != ImageOrColorMapArea.ImageData.Length)\n                {\n                    ErrorStr = \"ImageOrColorMapArea.ImageData.Length has wrong size!\";\n                    return false;\n                }\n\n                if (Header.ImageType >= TgaImageType.RLE_ColorMapped &&\n                    Header.ImageType <= TgaImageType.RLE_BlackWhite)\n                {\n                    byte[] RLE = RLE_Encode(ImageOrColorMapArea.ImageData, Width, Height);\n                    if (RLE == null)\n                    {\n                        ErrorStr = \"RLE Compressing error! Check Image Data size.\";\n                        return false;\n                    }\n\n                    Offset += (uint)RLE.Length;\n                    RLE = null;\n                }\n                else\n                    Offset += (uint)ImageOrColorMapArea.ImageData.Length;\n            }\n            #endregion\n\n            #region Footer, DevArea, ExtArea\n            if (Footer != null)\n            {\n                #region DevArea\n                if (DevArea != null)\n                {\n                    int DevAreaCount = DevArea.Count;\n                    for (int i = 0; i < DevAreaCount; i++)\n                        if (DevArea[i] == null || DevArea[i].FieldSize <= 0) //Del Empty Entries\n                        {\n                            DevArea.Entries.RemoveAt(i);\n                            DevAreaCount--;\n                            i--;\n                        }\n\n                    if (DevArea.Count <= 0)\n                        Footer.DeveloperDirectoryOffset = 0;\n\n                    if (DevArea.Count > 2)\n                    {\n                        DevArea.Entries.Sort((a, b) => { return a.Tag.CompareTo(b.Tag); });\n                        for (int i = 0; i < DevArea.Count - 1; i++)\n                            if (DevArea[i].Tag == DevArea[i + 1].Tag)\n                            {\n                                ErrorStr = \"DevArea Enties has same Tags!\";\n                                return false;\n                            }\n                    }\n\n                    for (int i = 0; i < DevArea.Count; i++)\n                    {\n                        DevArea[i].Offset = Offset;\n                        Offset += (uint)DevArea[i].FieldSize;\n                    }\n\n                    Footer.DeveloperDirectoryOffset = Offset;\n                    Offset += (uint)(DevArea.Count * 10 + 2);\n                }\n                else\n                    Footer.DeveloperDirectoryOffset = 0;\n                #endregion\n\n                #region ExtArea\n                if (ExtArea != null)\n                {\n                    ExtArea.ExtensionSize = TgaExtArea.MinSize;\n                    if (ExtArea.OtherDataInExtensionArea != null)\n                        ExtArea.ExtensionSize += (ushort)ExtArea.OtherDataInExtensionArea.Length;\n\n                    ExtArea.DateTimeStamp = new TgaDateTime(DateTime.UtcNow);\n\n                    Footer.ExtensionAreaOffset = Offset;\n                    Offset += ExtArea.ExtensionSize;\n\n                    #region ScanLineTable\n                    if (ExtArea.ScanLineTable == null)\n                        ExtArea.ScanLineOffset = 0;\n                    else\n                    {\n                        if (ExtArea.ScanLineTable.Length != Height)\n                        {\n                            ErrorStr = \"ExtArea.ScanLineTable.Length != Height\";\n                            return false;\n                        }\n\n                        ExtArea.ScanLineOffset = Offset;\n                        Offset += (uint)(ExtArea.ScanLineTable.Length * 4);\n                    }\n                    #endregion\n\n                    #region PostageStampImage\n                    if (ExtArea.PostageStampImage == null)\n                        ExtArea.PostageStampOffset = 0;\n                    else\n                    {\n                        if (ExtArea.PostageStampImage.Width == 0 || ExtArea.PostageStampImage.Height == 0)\n                        {\n                            ErrorStr = \"ExtArea.PostageStampImage Width or Height is equal 0!\";\n                            return false;\n                        }\n\n                        if (ExtArea.PostageStampImage.Data == null)\n                        {\n                            ErrorStr = \"ExtArea.PostageStampImage.Data == null\";\n                            return false;\n                        }\n\n                        int PImgSB = ExtArea.PostageStampImage.Width * ExtArea.PostageStampImage.Height * BytesPerPixel;\n                        if (Header.ImageType != TgaImageType.NoImageData &&\n                            ExtArea.PostageStampImage.Data.Length != PImgSB)\n                        {\n                            ErrorStr = \"ExtArea.PostageStampImage.Data.Length is wrong!\";\n                            return false;\n                        }\n\n\n                        ExtArea.PostageStampOffset = Offset;\n                        Offset += (uint)(ExtArea.PostageStampImage.Data.Length);\n                    }\n                    #endregion\n\n                    #region ColorCorrectionTable\n                    if (ExtArea.ColorCorrectionTable == null)\n                        ExtArea.ColorCorrectionTableOffset = 0;\n                    else\n                    {\n                        if (ExtArea.ColorCorrectionTable.Length != 1024)\n                        {\n                            ErrorStr = \"ExtArea.ColorCorrectionTable.Length != 256 * 4\";\n                            return false;\n                        }\n\n                        ExtArea.ColorCorrectionTableOffset = Offset;\n                        Offset += (uint)(ExtArea.ColorCorrectionTable.Length * 2);\n                    }\n                    #endregion\n                }\n                else\n                    Footer.ExtensionAreaOffset = 0;\n                #endregion\n\n                #region Footer\n                if (Footer.ToBytes().Length != TgaFooter.Size)\n                {\n                    ErrorStr = \"Footer.Length is wrong!\";\n                    return false;\n                }\n\n                Offset += TgaFooter.Size;\n                #endregion\n            }\n            #endregion\n\n            return true;\n        }\n\n        #region Convert\n        /// <summary>\n        /// Convert <see cref=\"TGA\"/> to <see cref=\"Bitmap\"/>.\n        /// </summary>\n        /// <param name=\"ForceUseAlpha\">Force use alpha channel.</param>\n        /// <returns>Bitmap or null, on error.</returns>\n        public Bitmap ToBitmap(bool ForceUseAlpha = false)\n        {\n            return ToBitmapFunc(ForceUseAlpha, false);\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TGA\"/> to bytes array.\n        /// </summary>\n        /// <returns>Bytes array, (equal to saved file, but in memory) or null (on error).</returns>\n        public byte[] ToBytes()\n        {\n            try\n            {\n                byte[] Bytes;\n                using (MemoryStream ms = new MemoryStream())\n                {\n                    Save(ms);\n                    Bytes = ms.ToArray();\n                    ms.Flush();\n                }\n                return Bytes;\n            }\n            catch\n            {\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Convert TGA Image to new XFile format (v2.0).\n        /// </summary>\n        public void ToNewFormat()\n        {\n            if (Footer == null)\n                Footer = new TgaFooter();\n\n            if (ExtArea == null)\n            {\n                ExtArea = new TgaExtArea();\n\n                ExtArea.DateTimeStamp = new TgaDateTime(DateTime.UtcNow);\n\n                if (Header.ImageSpec.ImageDescriptor.AlphaChannelBits > 0)\n                    ExtArea.AttributesType = TgaAttrType.UsefulAlpha;\n                else\n                    ExtArea.AttributesType = TgaAttrType.NoAlpha;\n            }\n        }\n        #endregion\n\n        #region Private functions\n        bool LoadFunc(string filename)\n        {\n            if (!File.Exists(filename))\n                throw new FileNotFoundException(\"File: \\\"\" + filename + \"\\\" not found!\");\n\n            try\n            {\n                using (FileStream FS = new FileStream(filename, FileMode.Open))\n                    return LoadFunc(FS);\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n        bool LoadFunc(byte[] bytes)\n        {\n            if (bytes == null)\n                throw new ArgumentNullException();\n\n            try\n            {\n                using (MemoryStream FS = new MemoryStream(bytes, false))\n                    return LoadFunc(FS);\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n        bool LoadFunc(Stream stream)\n        {\n            if (stream == null)\n                throw new ArgumentNullException();\n            if (!(stream.CanRead && stream.CanSeek))\n                throw new FileLoadException(\"Stream reading or seeking is not avaiable!\");\n\n            try\n            {\n                stream.Seek(0, SeekOrigin.Begin);\n                BinaryReader Br = new BinaryReader(stream);\n\n                Header = new TgaHeader(Br.ReadBytes(TgaHeader.Size));\n\n                if (Header.IDLength > 0)\n                    ImageOrColorMapArea.ImageID = new TgaString(Br.ReadBytes(Header.IDLength));\n\n                if (Header.ColorMapSpec.ColorMapLength > 0)\n                {\n                    int CmBytesPerPixel = (int)Math.Ceiling((double)Header.ColorMapSpec.ColorMapEntrySize / 8.0);\n                    int LenBytes = Header.ColorMapSpec.ColorMapLength * CmBytesPerPixel;\n                    ImageOrColorMapArea.ColorMapData = Br.ReadBytes(LenBytes);\n                }\n\n                #region Read Image Data\n                int BytesPerPixel = (int)Math.Ceiling((double)Header.ImageSpec.PixelDepth / 8.0);\n                if (Header.ImageType != TgaImageType.NoImageData)\n                {\n                    int ImageDataSize = Width * Height * BytesPerPixel;\n                    switch (Header.ImageType)\n                    {\n                        case TgaImageType.RLE_ColorMapped:\n                        case TgaImageType.RLE_TrueColor:\n                        case TgaImageType.RLE_BlackWhite:\n\n                            int DataOffset = 0;\n                            byte PacketInfo;\n                            int PacketCount;\n                            byte[] RLE_Bytes, RLE_Part;\n                            ImageOrColorMapArea.ImageData = new byte[ImageDataSize];\n\n                            do\n                            {\n                                PacketInfo = Br.ReadByte(); //1 type bit and 7 count bits. Len = Count + 1.\n                                PacketCount = (PacketInfo & 127) + 1;\n\n                                if (PacketInfo >= 128) // bit7 = 1, RLE\n                                {\n                                    RLE_Bytes = new byte[PacketCount * BytesPerPixel];\n                                    RLE_Part = Br.ReadBytes(BytesPerPixel);\n                                    for (int i = 0; i < RLE_Bytes.Length; i++)\n                                        RLE_Bytes[i] = RLE_Part[i % BytesPerPixel];\n                                }\n                                else // RAW format\n                                    RLE_Bytes = Br.ReadBytes(PacketCount * BytesPerPixel);\n\n                                Buffer.BlockCopy(RLE_Bytes, 0, ImageOrColorMapArea.ImageData, DataOffset, RLE_Bytes.Length);\n                                DataOffset += RLE_Bytes.Length;\n                            }\n                            while (DataOffset < ImageDataSize);\n                            RLE_Bytes = null;\n                            break;\n\n                        case TgaImageType.Uncompressed_ColorMapped:\n                        case TgaImageType.Uncompressed_TrueColor:\n                        case TgaImageType.Uncompressed_BlackWhite:\n                            ImageOrColorMapArea.ImageData = Br.ReadBytes(ImageDataSize);\n                            break;\n                    }\n                }\n                #endregion\n\n                #region Try parse Footer\n                stream.Seek(-TgaFooter.Size, SeekOrigin.End);\n                uint FooterOffset = (uint)stream.Position;\n                TgaFooter MbFooter = new TgaFooter(Br.ReadBytes(TgaFooter.Size));\n                if (MbFooter.IsFooterCorrect)\n                {\n                    Footer = MbFooter;\n                    uint DevDirOffset = Footer.DeveloperDirectoryOffset;\n                    uint ExtAreaOffset = Footer.ExtensionAreaOffset;\n\n                    #region If Dev Area exist, read it.\n                    if (DevDirOffset != 0)\n                    {\n                        stream.Seek(DevDirOffset, SeekOrigin.Begin);\n                        DevArea = new TgaDevArea();\n                        uint NumberOfTags = Br.ReadUInt16();\n\n                        ushort[] Tags = new ushort[NumberOfTags];\n                        uint[] TagOffsets = new uint[NumberOfTags];\n                        uint[] TagSizes = new uint[NumberOfTags];\n\n                        for (int i = 0; i < NumberOfTags; i++)\n                        {\n                            Tags[i] = Br.ReadUInt16();\n                            TagOffsets[i] = Br.ReadUInt32();\n                            TagSizes[i] = Br.ReadUInt32();\n                        }\n\n                        for (int i = 0; i < NumberOfTags; i++)\n                        {\n                            stream.Seek(TagOffsets[i], SeekOrigin.Begin);\n                            var Ent = new TgaDevEntry(Tags[i], TagOffsets[i], Br.ReadBytes((int)TagSizes[i]));\n                            DevArea.Entries.Add(Ent);\n                        }\n\n                        Tags = null;\n                        TagOffsets = null;\n                        TagSizes = null;\n                    }\n                    #endregion\n\n                    #region If Ext Area exist, read it.\n                    if (ExtAreaOffset != 0)\n                    {\n                        stream.Seek(ExtAreaOffset, SeekOrigin.Begin);\n                        ushort ExtAreaSize = Math.Max((ushort)TgaExtArea.MinSize, Br.ReadUInt16());\n                        stream.Seek(ExtAreaOffset, SeekOrigin.Begin);\n                        ExtArea = new TgaExtArea(Br.ReadBytes(ExtAreaSize));\n\n                        if (ExtArea.ScanLineOffset > 0)\n                        {\n                            stream.Seek(ExtArea.ScanLineOffset, SeekOrigin.Begin);\n                            ExtArea.ScanLineTable = new uint[Height];\n                            for (int i = 0; i < ExtArea.ScanLineTable.Length; i++)\n                                ExtArea.ScanLineTable[i] = Br.ReadUInt32();\n                        }\n\n                        if (ExtArea.PostageStampOffset > 0)\n                        {\n                            stream.Seek(ExtArea.PostageStampOffset, SeekOrigin.Begin);\n                            byte W = Br.ReadByte();\n                            byte H = Br.ReadByte();\n                            int ImgDataSize = W * H * BytesPerPixel;\n                            if (ImgDataSize > 0)\n                                ExtArea.PostageStampImage = new TgaPostageStampImage(W, H, Br.ReadBytes(ImgDataSize));\n                        }\n\n                        if (ExtArea.ColorCorrectionTableOffset > 0)\n                        {\n                            stream.Seek(ExtArea.ColorCorrectionTableOffset, SeekOrigin.Begin);\n                            ExtArea.ColorCorrectionTable = new ushort[256 * 4];\n                            for (int i = 0; i < ExtArea.ColorCorrectionTable.Length; i++)\n                                ExtArea.ColorCorrectionTable[i] = Br.ReadUInt16();\n                        }\n                    }\n                    #endregion\n                }\n                #endregion\n\n                Br.Close();\n                return true;\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n        bool LoadFunc(Bitmap bmp, bool UseRLE = false, bool NewFormat = true, bool ColorMap2BytesEntry = false)\n        {\n            if (bmp == null)\n                throw new ArgumentNullException();\n\n            try\n            {\n                Header.ImageSpec.ImageWidth = (ushort)bmp.Width;\n                Header.ImageSpec.ImageHeight = (ushort)bmp.Height;\n                Header.ImageSpec.ImageDescriptor.ImageOrigin = TgaImgOrigin.TopLeft;\n\n                switch (bmp.PixelFormat)\n                {\n                    case PixelFormat.Indexed:\n                    case PixelFormat.Gdi:\n                    case PixelFormat.Alpha:\n                    case PixelFormat.Undefined:\n                    case PixelFormat.PAlpha:\n                    case PixelFormat.Extended:\n                    case PixelFormat.Max:\n                    case PixelFormat.Canonical:\n                    case PixelFormat.Format16bppRgb565:\n                    default:\n                        throw new FormatException(nameof(PixelFormat) + \" is not supported!\");\n\n                    case PixelFormat.Format1bppIndexed:\n                    case PixelFormat.Format4bppIndexed:\n                    case PixelFormat.Format8bppIndexed:\n                    case PixelFormat.Format16bppGrayScale:\n                    case PixelFormat.Format16bppRgb555:\n                    case PixelFormat.Format16bppArgb1555:\n                    case PixelFormat.Format24bppRgb:\n                    case PixelFormat.Format32bppRgb:\n                    case PixelFormat.Format32bppArgb:\n                    case PixelFormat.Format32bppPArgb:\n                    case PixelFormat.Format48bppRgb:\n                    case PixelFormat.Format64bppArgb:\n                    case PixelFormat.Format64bppPArgb:\n\n                        int bpp = Math.Max(8, Image.GetPixelFormatSize(bmp.PixelFormat));\n                        int BytesPP = bpp / 8;\n\n                        if (bmp.PixelFormat == PixelFormat.Format16bppRgb555)\n                            bpp = 15;\n\n                        bool IsAlpha = Image.IsAlphaPixelFormat(bmp.PixelFormat);\n                        bool IsPreAlpha = IsAlpha && bmp.PixelFormat.ToString().EndsWith(\"PArgb\");\n                        bool IsColorMapped = bmp.PixelFormat.ToString().EndsWith(\"Indexed\");\n\n                        Header.ImageSpec.PixelDepth = (TgaPixelDepth)(BytesPP * 8);\n\n                        if (IsAlpha)\n                        {\n                            Header.ImageSpec.ImageDescriptor.AlphaChannelBits = (byte)(BytesPP * 2);\n\n                            if (bmp.PixelFormat == PixelFormat.Format16bppArgb1555)\n                                Header.ImageSpec.ImageDescriptor.AlphaChannelBits = 1;\n                        }\n\n                        #region ColorMap\n                        bool IsGrayImage = (bmp.PixelFormat == PixelFormat.Format16bppGrayScale | IsColorMapped);\n\n                        if (IsColorMapped && bmp.Palette != null)\n                        {\n                            Color[] Colors = bmp.Palette.Entries;\n\n                            #region Analyze ColorMapType\n                            int AlphaSum = 0;\n                            bool ColorMapUseAlpha = false;\n\n                            for (int i = 0; i < Colors.Length; i++)\n                            {\n                                IsGrayImage &= (Colors[i].R == Colors[i].G && Colors[i].G == Colors[i].B);\n                                ColorMapUseAlpha |= (Colors[i].A < 248);\n                                AlphaSum |= Colors[i].A;\n                            }\n                            ColorMapUseAlpha &= (AlphaSum > 0);\n\n                            int CMapBpp = (ColorMap2BytesEntry ? 15 : 24) + (ColorMapUseAlpha ? (ColorMap2BytesEntry ? 1 : 8) : 0);\n                            int CMBytesPP = (int)Math.Ceiling(CMapBpp / 8.0);\n                            #endregion\n\n                            Header.ColorMapSpec.ColorMapLength = Math.Min((ushort)Colors.Length, ushort.MaxValue);\n                            Header.ColorMapSpec.ColorMapEntrySize = (TgaColorMapEntrySize)CMapBpp;\n                            ImageOrColorMapArea.ColorMapData = new byte[Header.ColorMapSpec.ColorMapLength * CMBytesPP];\n\n                            byte[] CMapEntry = new byte[CMBytesPP];\n\n                            const float To5Bit = 32f / 256f; // Scale value from 8 to 5 bits.\n                            for (int i = 0; i < Colors.Length; i++)\n                            {\n                                switch (Header.ColorMapSpec.ColorMapEntrySize)\n                                {\n                                    case TgaColorMapEntrySize.A1R5G5B5:\n                                    case TgaColorMapEntrySize.X1R5G5B5:\n                                        int R = (int)(Colors[i].R * To5Bit);\n                                        int G = (int)(Colors[i].G * To5Bit) << 5;\n                                        int B = (int)(Colors[i].B * To5Bit) << 10;\n                                        int A = 0;\n\n                                        if (Header.ColorMapSpec.ColorMapEntrySize == TgaColorMapEntrySize.A1R5G5B5)\n                                            A = ((Colors[i].A & 0x80) << 15);\n\n                                        CMapEntry = BitConverter.GetBytes(A | R | G | B);\n                                        break;\n\n                                    case TgaColorMapEntrySize.R8G8B8:\n                                        CMapEntry[0] = Colors[i].B;\n                                        CMapEntry[1] = Colors[i].G;\n                                        CMapEntry[2] = Colors[i].R;\n                                        break;\n\n                                    case TgaColorMapEntrySize.A8R8G8B8:\n                                        CMapEntry[0] = Colors[i].B;\n                                        CMapEntry[1] = Colors[i].G;\n                                        CMapEntry[2] = Colors[i].R;\n                                        CMapEntry[3] = Colors[i].A;\n                                        break;\n\n                                    case TgaColorMapEntrySize.Other:\n                                    default:\n                                        break;\n                                }\n\n                                Buffer.BlockCopy(CMapEntry, 0, ImageOrColorMapArea.ColorMapData, i * CMBytesPP, CMBytesPP);\n                            }\n                        }\n                        #endregion\n\n                        #region ImageType\n                        if (UseRLE)\n                        {\n                            if (IsGrayImage)\n                                Header.ImageType = TgaImageType.RLE_BlackWhite;\n                            else if (IsColorMapped)\n                                Header.ImageType = TgaImageType.RLE_ColorMapped;\n                            else\n                                Header.ImageType = TgaImageType.RLE_TrueColor;\n                        }\n                        else\n                        {\n                            if (IsGrayImage)\n                                Header.ImageType = TgaImageType.Uncompressed_BlackWhite;\n                            else if (IsColorMapped)\n                                Header.ImageType = TgaImageType.Uncompressed_ColorMapped;\n                            else\n                                Header.ImageType = TgaImageType.Uncompressed_TrueColor;\n                        }\n\n                        Header.ColorMapType = (IsColorMapped ? TgaColorMapType.ColorMap : TgaColorMapType.NoColorMap);\n                        #endregion\n\n                        #region NewFormat\n                        if (NewFormat)\n                        {\n                            Footer = new TgaFooter();\n                            ExtArea = new TgaExtArea();\n                            ExtArea.DateTimeStamp = new TgaDateTime(DateTime.UtcNow);\n\n                            if (IsAlpha)\n                            {\n                                ExtArea.AttributesType = TgaAttrType.UsefulAlpha;\n\n                                if (IsPreAlpha)\n                                    ExtArea.AttributesType = TgaAttrType.PreMultipliedAlpha;\n                            }\n                            else\n                            {\n                                ExtArea.AttributesType = TgaAttrType.NoAlpha;\n\n                                if (Header.ImageSpec.ImageDescriptor.AlphaChannelBits > 0)\n                                    ExtArea.AttributesType = TgaAttrType.UndefinedAlphaButShouldBeRetained;\n                            }\n                        }\n                        #endregion\n\n                        #region Bitmap width is aligned by 32 bits = 4 bytes! Delete it.\n                        int StrideBytes = bmp.Width * BytesPP;\n                        int PaddingBytes = (int)Math.Ceiling(StrideBytes / 4.0) * 4 - StrideBytes;\n\n                        byte[] ImageData = new byte[(StrideBytes + PaddingBytes) * bmp.Height];\n\n                        Rectangle Re = new Rectangle(0, 0, bmp.Width, bmp.Height);\n                        BitmapData BmpData = bmp.LockBits(Re, ImageLockMode.ReadOnly, bmp.PixelFormat);\n                        Marshal.Copy(BmpData.Scan0, ImageData, 0, ImageData.Length);\n                        bmp.UnlockBits(BmpData);\n                        BmpData = null;\n\n                        if (PaddingBytes > 0) //Need delete bytes align\n                        {\n                            ImageOrColorMapArea.ImageData = new byte[StrideBytes * bmp.Height];\n                            for (int i = 0; i < bmp.Height; i++)\n                                Buffer.BlockCopy(ImageData, i * (StrideBytes + PaddingBytes),\n                                    ImageOrColorMapArea.ImageData, i * StrideBytes, StrideBytes);\n                        }\n                        else\n                            ImageOrColorMapArea.ImageData = ImageData;\n\n                        ImageData = null;\n\n                        // Not official supported, but works (tested on 16bpp GrayScale test images)!\n                        if (bmp.PixelFormat == PixelFormat.Format16bppGrayScale)\n                        {\n                            for (long i = 0; i < ImageOrColorMapArea.ImageData.Length; i++)\n                                ImageOrColorMapArea.ImageData[i] ^= byte.MaxValue;\n                        }\n                        #endregion\n\n                        break;\n                }\n\n                return true;\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n        bool SaveFunc(Stream stream)\n        {\n            try\n            {\n                if (stream == null)\n                    throw new ArgumentNullException();\n                if (!(stream.CanWrite && stream.CanSeek))\n                    throw new FileLoadException(\"Stream writing or seeking is not avaiable!\");\n\n                string CheckResult;\n                if (!CheckAndUpdateOffsets(out CheckResult))\n                    return false;\n\n                BinaryWriter Bw = new BinaryWriter(stream);\n                Bw.Write(Header.ToBytes());\n\n                if (ImageOrColorMapArea.ImageID != null)\n                    Bw.Write(ImageOrColorMapArea.ImageID.ToBytes());\n\n                if (Header.ColorMapType != TgaColorMapType.NoColorMap)\n                    Bw.Write(ImageOrColorMapArea.ColorMapData);\n\n                #region ImageData\n                if (Header.ImageType != TgaImageType.NoImageData)\n                {\n                    if (Header.ImageType >= TgaImageType.RLE_ColorMapped &&\n                        Header.ImageType <= TgaImageType.RLE_BlackWhite)\n                        Bw.Write(RLE_Encode(ImageOrColorMapArea.ImageData, Width, Height));\n                    else\n                        Bw.Write(ImageOrColorMapArea.ImageData);\n                }\n                #endregion\n\n                #region Footer\n                if (Footer != null)\n                {\n                    #region DevArea\n                    if (DevArea != null)\n                    {\n                        for (int i = 0; i < DevArea.Count; i++)\n                            Bw.Write(DevArea[i].Data);\n\n                        Bw.Write((ushort)DevArea.Count);\n\n                        for (int i = 0; i < DevArea.Count; i++)\n                        {\n                            Bw.Write(DevArea[i].Tag);\n                            Bw.Write(DevArea[i].Offset);\n                            Bw.Write(DevArea[i].FieldSize);\n                        }\n                    }\n                    #endregion\n\n                    #region ExtArea\n                    if (ExtArea != null)\n                    {\n                        Bw.Write(ExtArea.ToBytes());\n\n                        if (ExtArea.ScanLineTable != null)\n                            for (int i = 0; i < ExtArea.ScanLineTable.Length; i++)\n                                Bw.Write(ExtArea.ScanLineTable[i]);\n\n                        if (ExtArea.PostageStampImage != null)\n                            Bw.Write(ExtArea.PostageStampImage.ToBytes());\n\n                        if (ExtArea.ColorCorrectionTable != null)\n                            for (int i = 0; i < ExtArea.ColorCorrectionTable.Length; i++)\n                                Bw.Write(ExtArea.ColorCorrectionTable[i]);\n                    }\n                    #endregion\n\n                    Bw.Write(Footer.ToBytes());\n                }\n                #endregion\n\n                Bw.Flush();\n                stream.Flush();\n                return true;\n            }\n            catch\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Encode image with RLE compression (used RLE per line)!\n        /// </summary>\n        /// <param name=\"ImageData\">Image data, bytes array with size = Width * Height * BytesPerPixel.</param>\n        /// <param name=\"Width\">Image Width, must be > 0.</param>\n        /// <param name=\"Height\">Image Height, must be > 0.</param>\n        /// <returns>Bytes array with RLE compressed image data.</returns>\n        byte[] RLE_Encode(byte[] ImageData, int Width, int Height)\n        {\n            if (ImageData == null)\n                throw new ArgumentNullException(nameof(ImageData) + \"in null!\");\n\n            if (Width <= 0 || Height <= 0)\n                throw new ArgumentOutOfRangeException(nameof(Width) + \" and \" + nameof(Height) + \" must be > 0!\");\n\n            int Bpp = ImageData.Length / Width / Height; // Bytes per pixel\n            int ScanLineSize = Width * Bpp;\n\n            if (ScanLineSize * Height != ImageData.Length)\n                throw new ArgumentOutOfRangeException(\"ImageData has wrong Length!\");\n\n            try\n            {\n                int Count = 0;\n                int Pos = 0;\n                bool IsRLE = false;\n                List<byte> Encoded = new List<byte>();\n                byte[] RowData = new byte[ScanLineSize];\n\n                for (int y = 0; y < Height; y++)\n                {\n                    Pos = 0;\n                    Buffer.BlockCopy(ImageData, y * ScanLineSize, RowData, 0, ScanLineSize);\n\n                    while (Pos < ScanLineSize)\n                    {\n                        if (Pos >= ScanLineSize - Bpp)\n                        {\n                            Encoded.Add(0);\n                            Encoded.AddRange(BitConverterExt.GetElements(RowData, Pos, Bpp));\n                            Pos += Bpp;\n                            break;\n                        }\n\n                        Count = 0; //1\n                        IsRLE = BitConverterExt.IsElementsEqual(RowData, Pos, Pos + Bpp, Bpp);\n\n                        for (int i = Pos + Bpp; i < Math.Min(Pos + 128 * Bpp, ScanLineSize) - Bpp; i += Bpp)\n                        {\n                            if (IsRLE ^ BitConverterExt.IsElementsEqual(RowData, (IsRLE ? Pos : i), i + Bpp, Bpp))\n                            {\n                                //Count--;\n                                break;\n                            }\n                            else\n                                Count++;\n                        }\n\n                        int CountBpp = (Count + 1) * Bpp;\n                        Encoded.Add((byte)(IsRLE ? Count | 128 : Count));\n                        Encoded.AddRange(BitConverterExt.GetElements(RowData, Pos, (IsRLE ? Bpp : CountBpp)));\n                        Pos += CountBpp;\n                    }\n                }\n\n                return Encoded.ToArray();\n            }\n            catch\n            {\n                return null;\n            }\n        }\n\n        /// <summary>\n        /// Convert <see cref=\"TGA\"/> to <see cref=\"Bitmap\"/>.\n        /// </summary>\n        /// <param name=\"ForceUseAlpha\">Force use alpha channel.</param>\n        /// <param name=\"PostageStampImage\">Get Postage Stamp Image (Thumb) or get main image?</param>\n        /// <returns>Bitmap or null, on error.</returns>\n        Bitmap ToBitmapFunc(bool ForceUseAlpha = false, bool PostageStampImage = false)\n        {\n            try\n            {\n                #region UseAlpha?\n                bool UseAlpha = true;\n                if (ExtArea != null)\n                {\n                    switch (ExtArea.AttributesType)\n                    {\n                        case TgaAttrType.NoAlpha:\n                        case TgaAttrType.UndefinedAlphaCanBeIgnored:\n                        case TgaAttrType.UndefinedAlphaButShouldBeRetained:\n                            UseAlpha = false;\n                            break;\n                        case TgaAttrType.UsefulAlpha:\n                        case TgaAttrType.PreMultipliedAlpha:\n                        default:\n                            break;\n                    }\n                }\n                UseAlpha = (Header.ImageSpec.ImageDescriptor.AlphaChannelBits > 0 && UseAlpha) | ForceUseAlpha;\n                #endregion\n\n                #region IsGrayImage\n                bool IsGrayImage = Header.ImageType == TgaImageType.RLE_BlackWhite ||\n                    Header.ImageType == TgaImageType.Uncompressed_BlackWhite;\n                #endregion\n\n                #region Get PixelFormat\n                PixelFormat PixFormat = PixelFormat.Format24bppRgb;\n\n                switch (Header.ImageSpec.PixelDepth)\n                {\n                    case TgaPixelDepth.Bpp8:\n                        PixFormat = PixelFormat.Format8bppIndexed;\n                        break;\n\n                    case TgaPixelDepth.Bpp16:\n                        if (IsGrayImage)\n                            PixFormat = PixelFormat.Format16bppGrayScale;\n                        else\n                            PixFormat = (UseAlpha ? PixelFormat.Format16bppArgb1555 : PixelFormat.Format16bppRgb555);\n                        break;\n\n                    case TgaPixelDepth.Bpp24:\n                        PixFormat = PixelFormat.Format24bppRgb;\n                        break;\n\n                    case TgaPixelDepth.Bpp32:\n                        if (UseAlpha)\n                        {\n                            var f = Footer;\n                            if (ExtArea?.AttributesType == TgaAttrType.PreMultipliedAlpha)\n                                PixFormat = PixelFormat.Format32bppPArgb;\n                            else\n                                PixFormat = PixelFormat.Format32bppArgb;\n                        }\n                        else\n                            PixFormat = PixelFormat.Format32bppRgb;\n                        break;\n\n                    default:\n                        PixFormat = PixelFormat.Undefined;\n                        break;\n                }\n                #endregion\n\n                ushort BMP_Width = (PostageStampImage ? ExtArea.PostageStampImage.Width : Width);\n                ushort BMP_Height = (PostageStampImage ? ExtArea.PostageStampImage.Height : Height);\n                Bitmap BMP = new Bitmap(BMP_Width, BMP_Height, PixFormat);\n\n                #region ColorMap and GrayPalette\n                if (Header.ColorMapType == TgaColorMapType.ColorMap &&\n                   (Header.ImageType == TgaImageType.RLE_ColorMapped ||\n                    Header.ImageType == TgaImageType.Uncompressed_ColorMapped))\n                {\n\n                    ColorPalette ColorMap = BMP.Palette;\n                    Color[] CMapColors = ColorMap.Entries;\n\n                    switch (Header.ColorMapSpec.ColorMapEntrySize)\n                    {\n                        case TgaColorMapEntrySize.X1R5G5B5:\n                        case TgaColorMapEntrySize.A1R5G5B5:\n                            const float To8Bit = 255f / 31f; // Scale value from 5 to 8 bits.\n                            for (int i = 0; i < Math.Min(CMapColors.Length, Header.ColorMapSpec.ColorMapLength); i++)\n                            {\n                                ushort A1R5G5B5 = BitConverter.ToUInt16(ImageOrColorMapArea.ColorMapData, i * 2);\n                                int A = (UseAlpha ? (A1R5G5B5 & 0x8000) >> 15 : 1) * 255; // (0 or 1) * 255\n                                int R = (int)(((A1R5G5B5 & 0x7C00) >> 10) * To8Bit);\n                                int G = (int)(((A1R5G5B5 & 0x3E0) >> 5) * To8Bit);\n                                int B = (int)((A1R5G5B5 & 0x1F) * To8Bit);\n                                CMapColors[i] = Color.FromArgb(A, R, G, B);\n                            }\n                            break;\n\n                        case TgaColorMapEntrySize.R8G8B8:\n                            for (int i = 0; i < Math.Min(CMapColors.Length, Header.ColorMapSpec.ColorMapLength); i++)\n                            {\n                                int Index = i * 3; //RGB = 3 bytes\n                                int R = ImageOrColorMapArea.ColorMapData[Index + 2];\n                                int G = ImageOrColorMapArea.ColorMapData[Index + 1];\n                                int B = ImageOrColorMapArea.ColorMapData[Index];\n                                CMapColors[i] = Color.FromArgb(R, G, B);\n                            }\n                            break;\n\n                        case TgaColorMapEntrySize.A8R8G8B8:\n                            for (int i = 0; i < Math.Min(CMapColors.Length, Header.ColorMapSpec.ColorMapLength); i++)\n                            {\n                                int ARGB = BitConverter.ToInt32(ImageOrColorMapArea.ColorMapData, i * 4);\n                                CMapColors[i] = Color.FromArgb(UseAlpha ? ARGB | (0xFF << 24) : ARGB);\n                            }\n                            break;\n\n                        default:\n                            ColorMap = null;\n                            break;\n                    }\n\n                    if (ColorMap != null)\n                        BMP.Palette = ColorMap;\n                }\n\n                if (PixFormat == PixelFormat.Format8bppIndexed && IsGrayImage)\n                {\n                    ColorPalette GrayPalette = BMP.Palette;\n                    Color[] GrayColors = GrayPalette.Entries;\n                    for (int i = 0; i < GrayColors.Length; i++)\n                        GrayColors[i] = Color.FromArgb(i, i, i);\n                    BMP.Palette = GrayPalette;\n                }\n                #endregion\n\n                #region Bitmap width must by aligned (align value = 32 bits = 4 bytes)!\n                byte[] ImageData;\n                int BytesPerPixel = (int)Math.Ceiling((double)Header.ImageSpec.PixelDepth / 8.0);\n                int StrideBytes = BMP.Width * BytesPerPixel;\n                int PaddingBytes = (int)Math.Ceiling(StrideBytes / 4.0) * 4 - StrideBytes;\n\n                if (PaddingBytes > 0) //Need bytes align\n                {\n                    ImageData = new byte[(StrideBytes + PaddingBytes) * BMP.Height];\n                    for (int i = 0; i < BMP.Height; i++)\n                        Buffer.BlockCopy(PostageStampImage ? ExtArea.PostageStampImage.Data :\n                            ImageOrColorMapArea.ImageData, i * StrideBytes, ImageData,\n                            i * (StrideBytes + PaddingBytes), StrideBytes);\n                }\n                else\n                    ImageData = BitConverterExt.ToBytes(PostageStampImage ? ExtArea.PostageStampImage.Data :\n                        ImageOrColorMapArea.ImageData);\n\n                // Not official supported, but works (tested on 2 test images)!\n                if (PixFormat == PixelFormat.Format16bppGrayScale)\n                {\n                    for (long i = 0; i < ImageData.Length; i++)\n                        ImageData[i] ^= byte.MaxValue;\n                }\n                #endregion\n\n                Rectangle Re = new Rectangle(0, 0, BMP.Width, BMP.Height);\n                BitmapData BmpData = BMP.LockBits(Re, ImageLockMode.WriteOnly, BMP.PixelFormat);\n                Marshal.Copy(ImageData, 0, BmpData.Scan0, ImageData.Length);\n                BMP.UnlockBits(BmpData);\n                ImageData = null;\n                BmpData = null;\n\n                if (ExtArea != null && ExtArea.KeyColor.ToInt() != 0)\n                    BMP.MakeTransparent(ExtArea.KeyColor.ToColor());\n\n                #region Flip Image\n                switch (Header.ImageSpec.ImageDescriptor.ImageOrigin)\n                {\n                    case TgaImgOrigin.BottomLeft:\n                        BMP.RotateFlip(RotateFlipType.RotateNoneFlipY);\n                        break;\n                    case TgaImgOrigin.BottomRight:\n                        BMP.RotateFlip(RotateFlipType.RotateNoneFlipXY);\n                        break;\n                    case TgaImgOrigin.TopLeft:\n                    default:\n                        break;\n                    case TgaImgOrigin.TopRight:\n                        BMP.RotateFlip(RotateFlipType.RotateNoneFlipX);\n                        break;\n                }\n                #endregion\n\n                return BMP;\n            }\n            catch\n            {\n                return null;\n            }\n        }\n        #endregion\n\n        #region Explicit\n        public static explicit operator Bitmap(TGA tga)\n        {\n            return tga.ToBitmap();\n        }\n\n        public static explicit operator TGA(Bitmap bmp)\n        {\n            return FromBitmap(bmp);\n        }\n        #endregion\n\n        #region PostageStamp Image\n        /// <summary>\n        /// Convert <see cref=\"TgaPostageStampImage\"/> to <see cref=\"Bitmap\"/>.\n        /// </summary>\n        /// <param name=\"ForceUseAlpha\">Force use alpha channel.</param>\n        /// <returns>Bitmap or null.</returns>\n        public Bitmap GetPostageStampImage(bool ForceUseAlpha = false)\n        {\n            if (ExtArea == null || ExtArea.PostageStampImage == null || ExtArea.PostageStampImage.Data == null ||\n                ExtArea.PostageStampImage.Width <= 0 || ExtArea.PostageStampImage.Height <= 0)\n                return null;\n\n            return ToBitmapFunc(ForceUseAlpha, true);\n        }\n\n        /// <summary>\n        /// Update Postage Stamp Image or set it.\n        /// </summary>\n        public void UpdatePostageStampImage()\n        {\n            if (Header.ImageType == TgaImageType.NoImageData)\n            {\n                if (ExtArea != null)\n                    ExtArea.PostageStampImage = null;\n                return;\n            }\n\n            ToNewFormat();\n            if (ExtArea.PostageStampImage == null)\n                ExtArea.PostageStampImage = new TgaPostageStampImage();\n\n            int PS_Width = Header.ImageSpec.ImageWidth;\n            int PS_Height = Header.ImageSpec.ImageHeight;\n\n            if (Width > 64 || Height > 64)\n            {\n                float AspectRatio = Width / (float)Height;\n                PS_Width = (byte)(64f * (AspectRatio < 1f ? AspectRatio : 1f));\n                PS_Height = (byte)(64f / (AspectRatio > 1f ? AspectRatio : 1f));\n            }\n            PS_Width = Math.Max(PS_Width, 4);\n            PS_Height = Math.Max(PS_Height, 4);\n\n            ExtArea.PostageStampImage.Width = (byte)PS_Width;\n            ExtArea.PostageStampImage.Height = (byte)PS_Height;\n\n            int BytesPerPixel = (int)Math.Ceiling((double)Header.ImageSpec.PixelDepth / 8.0);\n            ExtArea.PostageStampImage.Data = new byte[PS_Width * PS_Height * BytesPerPixel];\n\n            float WidthCoef = Width / (float)PS_Width;\n            float HeightCoef = Height / (float)PS_Height;\n\n            for (int y = 0; y < PS_Height; y++)\n            {\n                int Y_Offset = (int)(y * HeightCoef) * Width * BytesPerPixel;\n                int y_Offset = y * PS_Width * BytesPerPixel;\n\n                for (int x = 0; x < PS_Width; x++)\n                {\n                    Buffer.BlockCopy(ImageOrColorMapArea.ImageData, Y_Offset + (int)(x * WidthCoef) * BytesPerPixel,\n                        ExtArea.PostageStampImage.Data, y_Offset + x * BytesPerPixel, BytesPerPixel);\n                }\n            }\n        }\n\n        public void DeletePostageStampImage()\n        {\n            if (ExtArea != null)\n                ExtArea.PostageStampImage = null;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "source/Playnite/Common/TempDirectory.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class TempDirectory : IDisposable\r\n    {\r\n        private bool autoDelete;\r\n\r\n        public string TempPath { get; private set; }\r\n\r\n        public static TempDirectory Create(bool autoDelete = true, string dirName = null)\r\n        {\r\n            if (dirName.IsNullOrEmpty())\r\n            {\r\n                var stack = new StackTrace(1);\r\n                var method = stack.GetFrame(0).GetMethod();\r\n                dirName = Paths.GetSafePathName($\"{method.DeclaringType.Name}_{method.Name}\");\r\n            }\r\n\r\n            return new TempDirectory(dirName, autoDelete);\r\n        }\r\n\r\n        public TempDirectory(string dirName, bool autoDelete = true)\r\n        {\r\n            TempPath = Path.Combine(Path.GetTempPath(), \"Playnite\", dirName);\r\n            FileSystem.CreateDirectory(TempPath, true);\r\n            this.autoDelete = autoDelete;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            if (autoDelete)\r\n            {\r\n                FileSystem.DeleteDirectory(TempPath);\r\n            }\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return TempPath;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Timer.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class ExecutionTimer : IDisposable\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private string name;\r\n        private Stopwatch watch = new Stopwatch();\r\n\r\n        public ExecutionTimer(string name)\r\n        {\r\n            this.name = name;\r\n            watch.Start();\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            watch.Stop();\r\n            logger.Debug($\"--- Timer '{name}', {watch.ElapsedMilliseconds} ms to complete.\");\r\n        }\r\n    }\r\n\r\n    public class Timer\r\n    {\r\n        private static Random randomGen = new Random();\r\n\r\n        public static IDisposable TimeExecution(string name)\r\n        {\r\n            return new ExecutionTimer(name);\r\n        }\r\n\r\n        public static int HoursToMilliseconds(int hours)\r\n        {\r\n            return MinutesToMilliseconds(hours * 60);\r\n        }\r\n\r\n        public static int MinutesToMilliseconds(int minutes)\r\n        {\r\n            return SecondsToMilliseconds(minutes * 60);\r\n        }\r\n\r\n        public static int SecondsToMilliseconds(int seconds)\r\n        {\r\n            return seconds * 1000;\r\n        }\r\n\r\n        public static DateTime GetRandomDateTime()\r\n        {\r\n            var startDate = new DateTime(1970, 1, 1);\r\n            int range = (DateTime.Today - startDate).Days;\r\n            return startDate.AddDays(randomGen.Next(range));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Units.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public static class Units\r\n    {\r\n        public static long MegaBytesToBytes(long megaBytes)\r\n        {\r\n            return megaBytes * 1024 * 1024;\r\n        }\r\n\r\n        public static long BytesToMegaBytes(long bytes)\r\n        {\r\n            return bytes / 1024 / 1024;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Web/Downloader.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Net;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Common.Web\r\n{\r\n    public interface IDownloader\r\n    {\r\n        string DownloadString(IEnumerable<string> mirrors);\r\n\r\n        string DownloadString(string url);\r\n\r\n        string DownloadString(string url, Encoding encoding);\r\n\r\n        string DownloadString(string url, List<Cookie> cookies);\r\n\r\n        string DownloadString(string url, List<Cookie> cookies, Encoding encoding);\r\n\r\n        void DownloadString(string url, string path);\r\n\r\n        void DownloadString(string url, string path, Encoding encoding);\r\n\r\n        byte[] DownloadData(string url);\r\n\r\n        void DownloadFile(string url, string path);\r\n\r\n        void DownloadFile(IEnumerable<string> mirrors, string path);\r\n\r\n        Task DownloadFileAsync(string url, string path, Action<DownloadProgressChangedEventArgs> progressHandler);\r\n\r\n        Task DownloadFileAsync(IEnumerable<string> mirrors, string path, Action<DownloadProgressChangedEventArgs> progressHandler);\r\n    }\r\n\r\n    // The default timeout of WebClient is 100 seconds which is just too much and doesn't make sense.\r\n    // This is apparatenly the only way to change timeout for the entire WebClient instance.\r\n    // We should be using HttpClient but that's not very safe changes for P10 right now.\r\n    public class CustomWebClient : WebClient\r\n    {\r\n        protected override WebRequest GetWebRequest(Uri address)\r\n        {\r\n            var request = base.GetWebRequest(address);\r\n            if (request != null)\r\n                request.Timeout = 15 * 1000;\r\n\r\n            return request;\r\n        }\r\n    }\r\n\r\n    public class Downloader : IDownloader\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private static readonly string playniteUserAgent = $\"Playnite 10\";\r\n\r\n        public Downloader()\r\n        {\r\n        }\r\n\r\n        public string DownloadString(IEnumerable<string> mirrors)\r\n        {\r\n            logger.Debug($\"Downloading string content from multiple mirrors.\");\r\n            foreach (var mirror in mirrors)\r\n            {\r\n                try\r\n                {\r\n                    return DownloadString(mirror);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to download {mirror} string.\");\r\n                }\r\n            }\r\n\r\n            throw new Exception(\"Failed to download string from all mirrors.\");\r\n        }\r\n\r\n        public string DownloadString(string url)\r\n        {\r\n            return DownloadString(url, Encoding.UTF8);\r\n        }\r\n\r\n        public string DownloadString(string url, CancellationToken cancelToken)\r\n        {\r\n            logger.Debug($\"Downloading string content from {url} using UTF8 encoding.\");\r\n\r\n            try\r\n            {\r\n                using (var webClient = new CustomWebClient { Encoding = Encoding.UTF8 })\r\n                using (var registration = cancelToken.Register(() => webClient.CancelAsync()))\r\n                {\r\n                    webClient.Headers.Add(\"User-Agent\", playniteUserAgent);\r\n                    return Task.Run(async () => await webClient.DownloadStringTaskAsync(url)).GetAwaiter().GetResult();\r\n                }\r\n            }\r\n            catch (WebException ex) when (ex.Status == WebExceptionStatus.RequestCanceled)\r\n            {\r\n                logger.Warn(\"Download canceled.\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public string DownloadString(string url, Encoding encoding)\r\n        {\r\n            logger.Debug($\"Downloading string content from {url} using {encoding} encoding.\");\r\n            using (var webClient = new CustomWebClient { Encoding = encoding })\r\n            {\r\n                webClient.Headers.Add(\"User-Agent\", playniteUserAgent);\r\n                return webClient.DownloadString(url);\r\n            }\r\n        }\r\n\r\n        public string DownloadString(string url, List<Cookie> cookies)\r\n        {\r\n            return DownloadString(url, cookies, Encoding.UTF8);\r\n        }\r\n\r\n        public string DownloadString(string url, List<Cookie> cookies, Encoding encoding)\r\n        {\r\n            logger.Debug($\"Downloading string content from {url} using cookies and {encoding} encoding.\");\r\n            using (var webClient = new CustomWebClient { Encoding = encoding })\r\n            {\r\n                webClient.Headers.Add(\"User-Agent\", playniteUserAgent);\r\n                if (cookies?.Any() == true)\r\n                {\r\n                    var cookieString = string.Join(\";\", cookies.Select(a => $\"{a.Name}={a.Value}\"));\r\n                    webClient.Headers.Add(HttpRequestHeader.Cookie, cookieString);\r\n                }\r\n\r\n                return webClient.DownloadString(url);\r\n            }\r\n        }\r\n\r\n        public void DownloadString(string url, string path)\r\n        {\r\n            DownloadString(url, path, Encoding.UTF8);\r\n        }\r\n\r\n        public void DownloadString(string url, string path, Encoding encoding)\r\n        {\r\n            logger.Debug($\"Downloading string content from {url} to {path} using {encoding} encoding.\");\r\n            using (var webClient = new CustomWebClient { Encoding = encoding })\r\n            {\r\n                webClient.Headers.Add(\"User-Agent\", playniteUserAgent);\r\n                var data = webClient.DownloadString(url);\r\n                File.WriteAllText(path, data);\r\n            }\r\n        }\r\n\r\n        public byte[] DownloadData(string url)\r\n        {\r\n            logger.Debug($\"Downloading data from {url}.\");\r\n            using (var webClient = new CustomWebClient())\r\n            {\r\n                webClient.Headers.Add(\"User-Agent\", playniteUserAgent);\r\n                return webClient.DownloadData(url);\r\n            }\r\n        }\r\n\r\n        public byte[] DownloadData(string url, CancellationToken cancelToken)\r\n        {\r\n            logger.Debug($\"Downloading data from {url}.\");\r\n\r\n            try\r\n            {\r\n                using (var webClient = new CustomWebClient())\r\n                using (var registration = cancelToken.Register(() => webClient.CancelAsync()))\r\n                {\r\n                    webClient.Headers.Add(\"User-Agent\", playniteUserAgent);\r\n                    return webClient.DownloadData(url);\r\n                    }\r\n                }\r\n            catch (WebException ex) when (ex.Status == WebExceptionStatus.RequestCanceled)\r\n            {\r\n                logger.Warn(\"Download canceled.\");\r\n                return new byte[0];\r\n            }\r\n        }\r\n\r\n        public void DownloadFile(string url, string path)\r\n        {\r\n            logger.Debug($\"Downloading data from {url} to {path}.\");\r\n            FileSystem.CreateDirectory(Path.GetDirectoryName(path));\r\n            using (var webClient = new CustomWebClient())\r\n            {\r\n                webClient.Headers.Add(\"User-Agent\", playniteUserAgent);\r\n                webClient.DownloadFile(url, path);\r\n            }\r\n        }\r\n\r\n        public void DownloadFile(string url, string path, CancellationToken cancelToken)\r\n        {\r\n            logger.Debug($\"Downloading data from {url} to {path}.\");\r\n            FileSystem.CreateDirectory(Path.GetDirectoryName(path));\r\n\r\n            try\r\n            {\r\n                using (var webClient = new CustomWebClient())\r\n                using (var registration = cancelToken.Register(() => webClient.CancelAsync()))\r\n                {\r\n                    webClient.Headers.Add(\"User-Agent\", playniteUserAgent);\r\n                    Task.Run(async () => await webClient.DownloadFileTaskAsync(new Uri(url), path)).Wait();\r\n                }\r\n            }\r\n            catch (WebException ex) when (ex.Status == WebExceptionStatus.RequestCanceled)\r\n            {\r\n                logger.Warn(\"Download canceled.\");\r\n            }\r\n            catch (AggregateException ae) when (ae.InnerException is WebException we && we.Status == WebExceptionStatus.RequestCanceled)\r\n            {\r\n                logger.Warn(\"Download canceled.\");\r\n            }\r\n        }\r\n\r\n        public async Task DownloadFileAsync(string url, string path, Action<DownloadProgressChangedEventArgs> progressHandler)\r\n        {\r\n            logger.Debug($\"Downloading data async from {url} to {path}.\");\r\n            FileSystem.CreateDirectory(Path.GetDirectoryName(path));\r\n            using (var webClient = new CustomWebClient())\r\n            {\r\n                webClient.Headers.Add(\"User-Agent\", playniteUserAgent);\r\n                webClient.DownloadProgressChanged += (s, e) => progressHandler(e);\r\n                webClient.DownloadFileCompleted += (s, e) => webClient.Dispose();\r\n                await webClient.DownloadFileTaskAsync(url, path);\r\n            }\r\n        }\r\n\r\n        public async Task DownloadFileAsync(IEnumerable<string> mirrors, string path, Action<DownloadProgressChangedEventArgs> progressHandler)\r\n        {\r\n            logger.Debug($\"Downloading data async from multiple mirrors.\");\r\n            foreach (var mirror in mirrors)\r\n            {\r\n                try\r\n                {\r\n                    await DownloadFileAsync(mirror, path, progressHandler);\r\n                    return;\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to download {mirror} file.\");\r\n                }\r\n            }\r\n\r\n            throw new Exception(\"Failed to download file from all mirrors.\");\r\n        }\r\n\r\n        public void DownloadFile(IEnumerable<string> mirrors, string path)\r\n        {\r\n            logger.Debug($\"Downloading data from multiple mirrors.\");\r\n            foreach (var mirror in mirrors)\r\n            {\r\n                try\r\n                {\r\n                    DownloadFile(mirror, path);\r\n                    return;\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to download {mirror} file.\");\r\n                }\r\n            }\r\n\r\n            throw new Exception(\"Failed to download file from all mirrors.\");\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Web/HttpDownloader.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Net;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing System.Net.Http;\r\nusing Playnite.SDK;\r\nusing System.Threading;\r\n\r\nnamespace Playnite.Common.Web\r\n{\r\n    public class HttpDownloader\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private static readonly HttpClient httpClient = new HttpClient();\r\n        private static readonly Downloader downloader = new Downloader();\r\n\r\n        public static string DownloadString(IEnumerable<string> mirrors)\r\n        {\r\n            return downloader.DownloadString(mirrors);\r\n        }\r\n\r\n        public static string DownloadString(string url)\r\n        {\r\n            return downloader.DownloadString(url);\r\n        }\r\n\r\n        public static string DownloadString(string url, CancellationToken cancelToken)\r\n        {\r\n            return downloader.DownloadString(url, cancelToken);\r\n        }\r\n\r\n        public static string DownloadString(string url, Encoding encoding)\r\n        {\r\n            return downloader.DownloadString(url, encoding);\r\n        }\r\n\r\n        public static string DownloadString(string url, List<Cookie> cookies)\r\n        {\r\n            return downloader.DownloadString(url, cookies);\r\n        }\r\n\r\n        public static string DownloadString(string url, List<Cookie> cookies, Encoding encoding)\r\n        {\r\n            return downloader.DownloadString(url, cookies, encoding);\r\n        }\r\n\r\n        public static void DownloadString(string url, string path)\r\n        {\r\n            downloader.DownloadString(url, path);\r\n        }\r\n\r\n        public static void DownloadString(string url, string path, Encoding encoding)\r\n        {\r\n            downloader.DownloadString(url, path, encoding);\r\n        }\r\n\r\n        public static byte[] DownloadData(string url)\r\n        {\r\n            return downloader.DownloadData(url);\r\n        }\r\n\r\n        public static byte[] DownloadData(string url, CancellationToken cancelToken)\r\n        {\r\n            return downloader.DownloadData(url, cancelToken);\r\n        }\r\n\r\n        public static void DownloadFile(string url, string path)\r\n        {\r\n            downloader.DownloadFile(url, path);\r\n        }\r\n\r\n        public static void DownloadFile(string url, string path, CancellationToken cancelToken)\r\n        {\r\n            downloader.DownloadFile(url, path, cancelToken);\r\n        }\r\n\r\n        public static HttpStatusCode GetResponseCode(string url, CancellationToken cancelToken, out Dictionary<string, string> headers)\r\n        {\r\n            headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);\r\n\r\n            try\r\n            {\r\n                var response = httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, url), cancelToken).GetAwaiter().GetResult();\r\n                foreach (var header in response.Headers)\r\n                {\r\n                    headers.Add(header.Key, string.Join(\",\", header.Value));\r\n                }\r\n\r\n                foreach (var header in response.Content.Headers)\r\n                {\r\n                    headers.Add(header.Key, string.Join(\",\", header.Value));\r\n                }\r\n\r\n                return response.StatusCode;\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, $\"Failed to get HTTP response for {url}.\");\r\n                return HttpStatusCode.ServiceUnavailable;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class Xaml\r\n    {\r\n        public static object FromFile(string path)\r\n        {\r\n            using (var stream = new StreamReader(path))\r\n            {\r\n                return XamlReader.Load(stream.BaseStream);\r\n            }\r\n        }\r\n\r\n        public static T FromFile<T>(string path)\r\n        {\r\n            using (var stream = new StreamReader(path))\r\n            {\r\n                return (T)XamlReader.Load(stream.BaseStream);\r\n            }\r\n        }\r\n\r\n        public static T FromString<T>(string xaml)\r\n        {\r\n            return (T)XamlReader.Parse(xaml);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common/Xml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Xml.Linq;\r\n\r\nnamespace Playnite.Common\r\n{\r\n    public class Xml\r\n    {\r\n\r\n        public static bool AreEqual(XElement elem1, XElement elem2)\r\n        {\r\n            if (elem1.Name.ToString() != elem2.Name.ToString())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (elem1.Value != elem2.Value)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            var atts1 = elem1.Attributes().OrderBy(a => a.Name.ToString()).ToList();\r\n            var atts2 = elem2.Attributes().OrderBy(a => a.Name.ToString()).ToList();\r\n\r\n            if (atts1.Count != atts2.Count)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (atts1.Count > 0)\r\n            {\r\n                for (int i = 0; i < atts1.Count; i++)\r\n                {\r\n                    var att1 = atts1[i];\r\n                    var att2 = atts2[i];\r\n                    if (att1.Name.ToString() != att2.Name.ToString())\r\n                    {\r\n                        return false;\r\n                    }\r\n\r\n                    if (att1.Value != att2.Value)\r\n                    {\r\n                        return false;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var elems1 = elem1.Elements().ToList();\r\n            var elems2 = elem2.Elements().ToList();\r\n\r\n            if (elems1.Count != elems2.Count)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (elems1.Count > 0)\r\n            {\r\n                for (int i = 0; i < elems1.Count; i++)\r\n                {\r\n                    if (!AreEqual(elems1[i], elems2[i]))\r\n                    {\r\n                        return false;\r\n                    }                        \r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        public static bool AreEqual(string xml1, string xml2)\r\n        {\r\n            var xdoc1 = XDocument.Parse(xml1);\r\n            var xdoc2 = XDocument.Parse(xml2);\r\n            return AreEqual(xdoc1.Root, xdoc2.Root);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Common.config",
    "content": "﻿<appSettings>\r\n  <add key=\"UpdateUrl\" value=\"http://localhost/update/\" />\r\n  <add key=\"UpdateUrl2\" value=\"http://localhost:8081/update/\" />\r\n  <add key=\"ServicesUrl\" value=\"http://localhost:5000/\" />\r\n  <add key=\"DocsRootUrl\" value=\"http://localhost:8080/_site/\" />\r\n  <add key=\"UpdateBranch\" value=\"stable\" />\r\n  <add key=\"ThrowAllErrors\" value=\"True\" />\r\n  <add key=\"OfflineMode\" value=\"True\" />\r\n  <add key=\"PipeEndpoint\" value=\"net.pipe://localhost/PlaynitePipe\" />\r\n  <add key=\"AppBranch\" value=\"devel\" />\r\n  <add key=\"wcf:useBestMatchNamedPipeUri\" value=\"true\" />\r\n</appSettings>"
  },
  {
    "path": "source/Playnite/ControlTemplateTools.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite\r\n{\r\n    public class ControlTemplateTools\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        public static void InitializePluginControls(\r\n            ExtensionFactory extensions,\r\n            ControlTemplate template,\r\n            FrameworkElement templateParent,\r\n            ApplicationMode mode,\r\n            object contextSource,\r\n            string contextPath)\r\n        {\r\n            if (DesignerTools.IsInDesignMode)\r\n            {\r\n                return;\r\n            }\r\n\r\n            foreach (var p in extensions.CustomElementList)\r\n            {\r\n                foreach (var elemName in p.ElementList)\r\n                {\r\n                    if (template.FindName($\"{p.SourceName}_{elemName}\", templateParent) is ContentControl elem)\r\n                    {\r\n                        Control plugControl = null;\r\n                        try\r\n                        {\r\n                            plugControl = p.Source.GetGameViewControl(new SDK.Plugins.GetGameViewControlArgs\r\n                            {\r\n                                Name = elemName,\r\n                                Mode = mode\r\n                            });\r\n                        }\r\n                        catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            logger.Error(e, $\"Failed to get plugin control: {p.Source}.\");\r\n                        }\r\n\r\n                        if (plugControl == null)\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        if (contextSource == null)\r\n                        {\r\n                            BindingTools.SetBinding(plugControl,\r\n                                plugControl is PluginUserControl ? PluginUserControl.GameContextProperty : Control.DataContextProperty,\r\n                                contextPath);\r\n                        }\r\n                        else\r\n                        {\r\n                            BindingTools.SetBinding(plugControl,\r\n                                plugControl is PluginUserControl ? PluginUserControl.GameContextProperty : Control.DataContextProperty,\r\n                                contextSource,\r\n                                contextPath);\r\n                        }\r\n\r\n                        elem.Focusable = false;\r\n                        elem.Content = plugControl;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Controllers/GameControllerFactory.cs",
    "content": "﻿using Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK.Events;\r\n\r\nnamespace Playnite.Controllers\r\n{\r\n    public class GameControllerFactory : IDisposable\r\n    {\r\n        private ILogger logger = LogManager.GetLogger();\r\n        private readonly GameDatabase database;\r\n\r\n        public List<PlayController> PlayControllers { get; } = new List<PlayController>();\r\n        public List<InstallController> InstallControllers { get; } = new List<InstallController>();\r\n        public List<UninstallController> UninstallControllers { get; } = new List<UninstallController>();\r\n\r\n        // Starting even is not called by a controller, Playnite starts it automatically when a game is being started\r\n        public event EventHandler<OnGameStartingEventArgs> Starting;\r\n        public event EventHandler<GameStartedEventArgs> Started;\r\n        public event EventHandler<GameStoppedEventArgs> Stopped;\r\n        public event EventHandler<GameUninstalledEventArgs> Uninstalled;\r\n        public event EventHandler<GameInstalledEventArgs> Installed;\r\n        public event EventHandler<GameInstallationCancelledEventArgs> InstallationCancelled;\r\n        public event EventHandler<OnGameStartupCancelledEventArgs> StartupCancelled;\r\n\r\n        public GameControllerFactory()\r\n        {\r\n        }\r\n\r\n        public GameControllerFactory(GameDatabase database) : this()\r\n        {\r\n            this.database = database;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            foreach (var controller in PlayControllers.ToList())\r\n            {\r\n                RemoveController(controller);\r\n            }\r\n\r\n            foreach (var controller in InstallControllers.ToList())\r\n            {\r\n                RemoveController(controller);\r\n            }\r\n\r\n            foreach (var controller in UninstallControllers.ToList())\r\n            {\r\n                RemoveController(controller);\r\n            }\r\n        }\r\n\r\n        public void AddController(PlayController controller)\r\n        {\r\n            controller.Started += Controller_Started;\r\n            controller.Stopped += Controller_Stopped;\r\n            PlayControllers.Add(controller);\r\n        }\r\n\r\n        public void AddController(InstallController controller)\r\n        {\r\n            controller.Installed += Controller_Installed;\r\n            controller.InstallCancelled += Controller_InstallationCancelled;\r\n            InstallControllers.Add(controller);\r\n        }\r\n\r\n        public void AddController(UninstallController controller)\r\n        {\r\n            controller.Uninstalled += Controller_Uninstalled;\r\n            UninstallControllers.Add(controller);\r\n        }\r\n\r\n        public void RemovePlayController(Guid gameId)\r\n        {\r\n            var controller = PlayControllers.FirstOrDefault(a => a.Game?.Id == gameId);\r\n            if (controller != null)\r\n            {\r\n                RemoveController(controller);\r\n            }\r\n        }\r\n\r\n        public void RemoveInstallController(Guid gameId)\r\n        {\r\n            var controller = InstallControllers.FirstOrDefault(a => a.Game?.Id == gameId);\r\n            if (controller != null)\r\n            {\r\n                RemoveController(controller);\r\n            }\r\n        }\r\n\r\n        public void RemoveUninstallController(Guid gameId)\r\n        {\r\n            var controller = UninstallControllers.FirstOrDefault(a => a.Game?.Id == gameId);\r\n            if (controller != null)\r\n            {\r\n                RemoveController(controller);\r\n            }\r\n        }\r\n\r\n        public void RemoveController(PlayController controller)\r\n        {\r\n            controller.Started -= Controller_Started;\r\n            controller.Stopped -= Controller_Stopped;\r\n            try\r\n            {\r\n                controller.Dispose();\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to dispose game controller {controller.GetType()}\");\r\n            }\r\n\r\n            PlayControllers.Remove(controller);\r\n        }\r\n\r\n        public void RemoveController(InstallController controller)\r\n        {\r\n            controller.Installed -= Controller_Installed;\r\n            controller.InstallCancelled -= Controller_InstallationCancelled;\r\n\r\n            try\r\n            {\r\n                controller.Dispose();\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to dispose game controller {controller.GetType()}\");\r\n            }\r\n\r\n            InstallControllers.Remove(controller);\r\n        }\r\n\r\n        public void RemoveController(UninstallController controller)\r\n        {\r\n            controller.Uninstalled -= Controller_Uninstalled;\r\n            try\r\n            {\r\n                controller.Dispose();\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to dispose game controller {controller.GetType()}\");\r\n            }\r\n\r\n            UninstallControllers.Remove(controller);\r\n        }\r\n\r\n        public PlayController GetPlayController(Guid gameId)\r\n        {\r\n            return PlayControllers.FirstOrDefault(a => a.Game.Id == gameId);\r\n        }\r\n\r\n        public InstallController GetInstallController(Guid gameId)\r\n        {\r\n            return InstallControllers.FirstOrDefault(a => a.Game.Id == gameId);\r\n        }\r\n\r\n        public UninstallController GetUninstallController(Guid gameId)\r\n        {\r\n            return UninstallControllers.FirstOrDefault(a => a.Game.Id == gameId);\r\n        }\r\n\r\n        private void Controller_Stopped(object sender, GameStoppedEventArgs e)\r\n        {\r\n            Stopped?.Invoke(this, e);\r\n        }\r\n\r\n        private void Controller_Started(object sender, GameStartedEventArgs e)\r\n        {\r\n            Started?.Invoke(this, e);\r\n        }\r\n\r\n        private void Controller_Uninstalled(object sender, GameUninstalledEventArgs e)\r\n        {\r\n            Uninstalled?.Invoke(this, e);\r\n        }\r\n\r\n        private void Controller_Installed(object sender, GameInstalledEventArgs e)\r\n        {\r\n            Installed?.Invoke(this, e);\r\n        }\r\n\r\n        private void Controller_InstallationCancelled(object sender, GameInstallationCancelledEventArgs e)\r\n        {\r\n            InstallationCancelled?.Invoke(this, e);\r\n        }\r\n\r\n        internal void InvokeOnStarting(object sender, OnGameStartingEventArgs e)\r\n        {\r\n            Starting?.Invoke(this, e);\r\n        }\r\n\r\n        internal void InvokeOnGameStartupCancelled(object sernder, Game game)\r\n        {\r\n            StartupCancelled?.Invoke(this, new OnGameStartupCancelledEventArgs { Game = game });\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Controllers/GenericGameController.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.Emulators;\r\nusing Playnite.Scripting.PowerShell;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Events;\r\nusing Playnite.SDK.Exceptions;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\n#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n\r\nnamespace Playnite.Controllers\r\n{\r\n    public class EmulationPlayAction : GameAction\r\n    {\r\n        public EmulatorProfile SelectedEmulatorProfile { get; set; }\r\n        public string SelectedRomPath { get; set; }\r\n    }\r\n\r\n    public class GenericPlayController : PlayController\r\n    {\r\n        protected CancellationTokenSource watcherToken;\r\n        private GameDatabase database;\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private readonly IPlayniteAPI playniteApi;\r\n        private IPowerShellRuntime scriptRuntime;\r\n        private PowerShellRuntime playRuntime;\r\n        private Task playTask;\r\n        private bool isDisposed = false;\r\n        private EmulatorProfile currentEmuProfile;\r\n\r\n        internal OnGameStartingEventArgs StartingArgs { get; private set; }\r\n\r\n        // These are stored for emulator scripts because they can be executed in non-linear fasion\r\n        private string startedRomFile;\r\n        private Emulator startedEmulator;\r\n        private EmulatorProfile startedEmulatorProfile;\r\n        private string startedEmulatorDir;\r\n        private int startedEmuProcessId;\r\n\r\n        public GenericPlayController(\r\n            GameDatabase db,\r\n            Game game,\r\n            IPowerShellRuntime scriptRuntime,\r\n            IPlayniteAPI playniteApi) : base(game)\r\n        {\r\n            execContext = SynchronizationContext.Current;\r\n            database = db;\r\n            this.scriptRuntime = scriptRuntime;\r\n            this.playniteApi = playniteApi;\r\n        }\r\n\r\n        public override void Play(PlayActionArgs args)\r\n        {\r\n            throw new NotSupportedException(\"This shouldn't be called.\");\r\n        }\r\n\r\n        public void StartEmulator(EmulationPlayAction action, bool asyncExec, OnGameStartingEventArgs startingArgs)\r\n        {\r\n            var emulator = database.Emulators[action.EmulatorId];\r\n            if (emulator == null)\r\n            {\r\n                throw new Exception(\"Emulator not found.\");\r\n            }\r\n\r\n            currentEmuProfile = null;\r\n            if (action.SelectedEmulatorProfile is CustomEmulatorProfile customProfile)\r\n            {\r\n                currentEmuProfile = customProfile;\r\n            }\r\n            else if (action.SelectedEmulatorProfile is BuiltInEmulatorProfile builtinProfile)\r\n            {\r\n                currentEmuProfile = builtinProfile;\r\n            }\r\n            else\r\n            {\r\n                throw new Exception(\"Uknown play action configuration.\");\r\n            }\r\n\r\n            emulator = emulator.GetClone();\r\n            if (!emulator.InstallDir.IsNullOrEmpty())\r\n            {\r\n                emulator.InstallDir = Paths.FixSeparators(emulator.InstallDir.Replace(ExpandableVariables.PlayniteDirectory, PlaynitePaths.ProgramPath));\r\n                emulator.InstallDir = CheckPath(emulator.InstallDir, nameof(emulator.InstallDir), FileSystemItem.Directory);\r\n                emulator.InstallDir = emulator.InstallDir.TrimEnd(Path.DirectorySeparatorChar);\r\n            }\r\n\r\n            StartingArgs = startingArgs;\r\n\r\n            var startupPath = \"\";\r\n            var startupArgs = \"\";\r\n            var startupDir = \"\";\r\n            var romPath = Game.ExpandVariables(action.SelectedRomPath, true, emulator.InstallDir, null);\r\n            // This is later passed to an emulator so it's up to it how it processes long paths.\r\n            romPath = Paths.TrimLongPathPrefix(CheckPath(romPath, \"ROM\", FileSystemItem.File));\r\n\r\n            if (currentEmuProfile is CustomEmulatorProfile emuProf)\r\n            {\r\n                var expandedProfile = emuProf.ExpandVariables(Game, emulator.InstallDir, romPath);\r\n                expandedProfile.Executable = CheckPath(expandedProfile.Executable, nameof(expandedProfile.Executable), FileSystemItem.File);\r\n                expandedProfile.WorkingDirectory = CheckPath(expandedProfile.WorkingDirectory, nameof(expandedProfile.WorkingDirectory), FileSystemItem.Directory);\r\n\r\n                if (!expandedProfile.StartupScript.IsNullOrWhiteSpace())\r\n                {\r\n                    expandedProfile.StartupScript = Game.ExpandVariables(expandedProfile.StartupScript, false, emulator.InstallDir, romPath);\r\n                    RunStartScript(\r\n                        $\"{emulator.Name} runtime for {Game.Name}\",\r\n                        expandedProfile.StartupScript,\r\n                        emulator.InstallDir,\r\n                        new Dictionary<string, object>\r\n                        {\r\n                            { \"Emulator\", emulator.GetClone() },\r\n                            { \"EmulatorProfile\", expandedProfile.GetClone() },\r\n                            { \"RomPath\", romPath }\r\n                        },\r\n                        asyncExec);\r\n                }\r\n                else\r\n                {\r\n                    if (action.OverrideDefaultArgs)\r\n                    {\r\n                        startupArgs = Game.ExpandVariables(action.Arguments, false, emulator.InstallDir, romPath);\r\n                    }\r\n                    else\r\n                    {\r\n                        startupArgs = expandedProfile.Arguments;\r\n                        if (!action.AdditionalArguments.IsNullOrEmpty())\r\n                        {\r\n                            startupArgs += \" \" + Game.ExpandVariables(action.AdditionalArguments, false, emulator.InstallDir, romPath);\r\n                        }\r\n                    }\r\n\r\n                    startupDir = expandedProfile.WorkingDirectory;\r\n                    startupPath = expandedProfile.Executable;\r\n                    StartEmulatorProcess(startupPath, startupArgs, startupDir, emulator.InstallDir, romPath, asyncExec, emulator.GetClone(), expandedProfile.GetClone(), expandedProfile.TrackingMode, expandedProfile.TrackingPath);\r\n                }\r\n            }\r\n            else if (currentEmuProfile is BuiltInEmulatorProfile builtIn)\r\n            {\r\n                var profileDef = Emulation.GetProfile(emulator.BuiltInConfigId, builtIn.BuiltInProfileName);\r\n                if (profileDef == null)\r\n                {\r\n                    throw new Exception($\"Can't find built-in {builtIn.BuiltInProfileName} emulator profile.\");\r\n                }\r\n\r\n                if (profileDef.ScriptStartup)\r\n                {\r\n                    var def = Emulation.GetDefition(emulator.BuiltInConfigId);\r\n                    if (def == null || !FileSystem.FileExists(Emulation.GetStartupScriptPath(def)))\r\n                    {\r\n                        throw new FileNotFoundException(ResourceProvider.GetString(LOC.ErrorEmulatorStartupScriptNotFound));\r\n                    }\r\n\r\n                    RunStartScriptFile(\r\n                        $\"{emulator.Name} runtime for {Game.Name}\",\r\n                        Emulation.GetStartupScriptPath(def),\r\n                        emulator.InstallDir,\r\n                        new Dictionary<string, object>\r\n                        {\r\n                            { \"Emulator\", emulator.GetClone() },\r\n                            { \"EmulatorProfile\", profileDef.GetClone() },\r\n                            { \"RomPath\", romPath }\r\n                        },\r\n                        asyncExec);\r\n                }\r\n                else\r\n                {\r\n                    builtIn = builtIn.GetClone();\r\n                    startupDir = emulator.InstallDir;\r\n                    startupPath = Emulation.GetExecutable(emulator.InstallDir, profileDef, true);\r\n                    if (startupPath.IsNullOrEmpty())\r\n                    {\r\n                        throw new FileNotFoundException(ResourceProvider.GetString(LOC.ErrorEmulatorExecutableNotFound) +\r\n                            $\"\\n\\nRegular expression lookup: {profileDef.StartupExecutable}\");\r\n                    }\r\n\r\n                    if (action.OverrideDefaultArgs)\r\n                    {\r\n                        startupArgs = Game.ExpandVariables(action.Arguments, false, emulator.InstallDir, romPath);\r\n                    }\r\n                    else\r\n                    {\r\n                        if (builtIn.OverrideDefaultArgs)\r\n                        {\r\n                            startupArgs = Game.ExpandVariables(builtIn.CustomArguments, false, emulator.InstallDir, romPath);\r\n                        }\r\n                        else\r\n                        {\r\n                            startupArgs = Game.ExpandVariables(profileDef.StartupArguments, false, emulator.InstallDir, romPath);\r\n                        }\r\n\r\n                        if (!action.AdditionalArguments.IsNullOrEmpty())\r\n                        {\r\n                            startupArgs += \" \" + Game.ExpandVariables(action.AdditionalArguments, false, emulator.InstallDir, romPath);\r\n                        }\r\n                    }\r\n\r\n                    StartEmulatorProcess(startupPath, startupArgs, startupDir, emulator.InstallDir, romPath, asyncExec, emulator.GetClone(), builtIn.GetClone(), TrackingMode.Process);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new NotSupportedException();\r\n            }\r\n        }\r\n\r\n        private void StartEmulatorProcess(\r\n            string path,\r\n            string args,\r\n            string workDir,\r\n            string emulatorDir,\r\n            string romPath,\r\n            bool asyncExec,\r\n            Emulator emulator,\r\n            EmulatorProfile emuProfile,\r\n            TrackingMode trackingMode,\r\n            string trackingPath = null)\r\n        {\r\n            startedRomFile = romPath;\r\n            startedEmulator = emulator;\r\n            startedEmulatorProfile = emuProfile;\r\n            startedEmulatorDir = emulatorDir;\r\n\r\n            if (asyncExec)\r\n            {\r\n                ExecuteEmulatorScript(currentEmuProfile.PreScript, emulatorDir, romPath, emulator, emuProfile);\r\n                Process process = null;\r\n                try\r\n                {\r\n                    process = ProcessStarter.StartProcess(path, args, workDir);\r\n                }\r\n                catch (Win32Exception exc)\r\n                {\r\n                    // 2 is ERROR_FILE_NOT_FOUND\r\n                    if (exc.NativeErrorCode == 2)\r\n                    {\r\n                        throw new FileNotFoundException(LOC.ErrorEmulatorExecutableNotFound.GetLocalized() +\r\n                            $\"\\n\\n{path} in {workDir}\");\r\n                    }\r\n                    else\r\n                    {\r\n                        throw;\r\n                    }\r\n                }\r\n\r\n                void gameStarted(int processId)\r\n                {\r\n                    startedEmuProcessId = processId;\r\n                    ExecuteEmulatorScript(currentEmuProfile.PostScript, emulatorDir, romPath, emulator, emuProfile);\r\n                    InvokeOnStarted(new GameStartedEventArgs { StartedProcessId = startedEmuProcessId });\r\n                }\r\n\r\n                if (trackingMode == TrackingMode.Default || trackingMode == TrackingMode.Process)\r\n                {\r\n                    gameStarted(process.Id);\r\n                    var monitor = new MonitorProcessTree(process.Id);\r\n                    StartTracking(\r\n                        () => monitor.IsProcessTreeRunning(),\r\n                        gameStoppedAction: () => ExecuteEmulatorScript(currentEmuProfile?.ExitScript, startedEmulatorDir, startedRomFile, startedEmulator, startedEmulatorProfile));\r\n                }\r\n                else if (trackingMode == TrackingMode.OriginalProcess)\r\n                {\r\n                    gameStarted(process.Id);\r\n                    var monitor = new MonitorProcess(process);\r\n                    StartTracking(\r\n                        () => monitor.IsProcessRunning(),\r\n                        gameStoppedAction: () => ExecuteEmulatorScript(currentEmuProfile?.ExitScript, startedEmulatorDir, startedRomFile, startedEmulator, startedEmulatorProfile));\r\n                }\r\n                else if (trackingMode == TrackingMode.Directory)\r\n                {\r\n                    var watchDir = trackingPath.IsNullOrEmpty() ? emulatorDir : trackingPath;\r\n                    var monitor = new MonitorDirectory(watchDir);\r\n                    if (monitor.IsTrackable())\r\n                    {\r\n                        StartTracking(\r\n                            () => monitor.IsProcessRunning() > 0,\r\n                            startupCheck: () => monitor.IsProcessRunning(),\r\n                            gameStartedAction: (id) => gameStarted(id),\r\n                            gameStoppedAction: () => ExecuteEmulatorScript(currentEmuProfile?.ExitScript, startedEmulatorDir, startedRomFile, startedEmulator, startedEmulatorProfile));\r\n                    }\r\n                    else\r\n                    {\r\n                        InvokeOnStopped(new GameStoppedEventArgs());\r\n                    }\r\n                }\r\n                else if (trackingMode == TrackingMode.ProcessName)\r\n                {\r\n                    if (!trackingPath.IsNullOrWhiteSpace())\r\n                    {\r\n                        var monitor = new MonitorProcessName(trackingPath);\r\n                        StartTracking(\r\n                            () => monitor.IsProcessRunning() > 0,\r\n                            startupCheck: () => monitor.IsProcessRunning(),\r\n                            gameStartedAction: (id) => gameStarted(id),\r\n                            gameStoppedAction: () => ExecuteEmulatorScript(currentEmuProfile?.ExitScript, startedEmulatorDir, startedRomFile, startedEmulator, startedEmulatorProfile));\r\n                    }\r\n                    else\r\n                    {\r\n                        InvokeOnStopped(new GameStoppedEventArgs());\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    throw new NotSupportedException();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                ExecuteEmulatorScript(currentEmuProfile.PreScript, emulatorDir, romPath, emulator, emuProfile);\r\n                ProcessStarter.StartProcess(path, args, workDir);\r\n                ExecuteEmulatorScript(currentEmuProfile.PostScript, emulatorDir, romPath, emulator, emuProfile);\r\n                ExecuteEmulatorScript(currentEmuProfile.ExitScript, emulatorDir, romPath, emulator, emuProfile);\r\n            }\r\n        }\r\n\r\n        private void ExecuteEmulatorScript(string script, string emulatorDir, string romPath, Emulator emulator, EmulatorProfile emuProfile)\r\n        {\r\n            if (script.IsNullOrWhiteSpace())\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                var scriptVars = new Dictionary<string, object>\r\n                {\r\n                    {  \"PlayniteApi\", playniteApi },\r\n                    {  \"Game\", Game.GetClone() },\r\n                    {  \"StartingArgs\", StartingArgs },\r\n                    {  \"SourceAction\", StartingArgs.SourceAction },\r\n                    {  \"SelectedRomFile\", romPath },\r\n                    {  \"Emulator\", emulator },\r\n                    {  \"EmulatorProfile\", emuProfile },\r\n                    {  \"StartedProcessId\", startedEmuProcessId }\r\n                };\r\n\r\n                var expandedScript = Game.ExpandVariables(script, false, emulatorDir, romPath);\r\n                var dir = Game.ExpandVariables(Game.InstallDirectory, true);\r\n                if (!dir.IsNullOrEmpty() && FileSystem.DirectoryExists(dir))\r\n                {\r\n                    scriptRuntime.Execute(expandedScript, dir, scriptVars);\r\n                }\r\n                else\r\n                {\r\n                    scriptRuntime.Execute(expandedScript, variables: scriptVars);\r\n                }\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Emulator script failed.\");\r\n                logger.Debug(script);\r\n                Dialogs.ShowMessage(\r\n                    exc.Message,\r\n                    LOC.ErrorEmulatorScriptAction,\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n            }\r\n        }\r\n\r\n        private void RunScript(string runtimeName, Action<PowerShellRuntime> startAction, Dictionary<string, object> variables, bool asyncExec = true)\r\n        {\r\n            variables.Add(\"Game\", Game.GetClone());\r\n            variables.Add(\"PlayniteApi\", playniteApi);\r\n            variables.Add(\"IsPlayAction\", asyncExec);\r\n            playRuntime = new PowerShellRuntime(runtimeName);\r\n            var stopWatch = Stopwatch.StartNew();\r\n\r\n            if (asyncExec)\r\n            {\r\n                watcherToken = new CancellationTokenSource();\r\n                variables.Add(\"CancelToken\", watcherToken.Token);\r\n                playTask = Task.Run(() =>\r\n                {\r\n                    try\r\n                    {\r\n                        startAction(playRuntime);\r\n\r\n                        if (!isDisposed) // Should not be called when we reached this from cancel state.\r\n                        {\r\n                            execContext.Post((_) => InvokeOnStopped(new GameStoppedEventArgs() { SessionLength = Convert.ToUInt64(stopWatch.Elapsed.TotalSeconds) }), null);\r\n                        }\r\n                    }\r\n                    catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(exc, \"Play script failed.\");\r\n                        execContext.Post((_) =>\r\n                        {\r\n                            InvokeOnStopped(new GameStoppedEventArgs() { SessionLength = Convert.ToUInt64(stopWatch.Elapsed.TotalSeconds) });\r\n                            Dialogs.ShowMessage(\r\n                                exc.Message,\r\n                                LOC.ErrorPlayScriptAction,\r\n                                MessageBoxButton.OK,\r\n                                MessageBoxImage.Error);\r\n                        }, null);\r\n                    }\r\n                    finally\r\n                    {\r\n                        if (!playRuntime.IsDisposed)\r\n                        {\r\n                            playRuntime?.Dispose();\r\n                        }\r\n                    }\r\n                });\r\n\r\n                InvokeOnStarted(new GameStartedEventArgs());\r\n            }\r\n            else\r\n            {\r\n                try\r\n                {\r\n                    startAction(playRuntime);\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(exc, \"Play script failed.\");\r\n                    InvokeOnStopped(new GameStoppedEventArgs() { SessionLength = Convert.ToUInt64(stopWatch.Elapsed.TotalSeconds) });\r\n                    Dialogs.ShowMessage(\r\n                        exc.Message,\r\n                        LOC.ErrorPlayScriptAction,\r\n                        MessageBoxButton.OK,\r\n                        MessageBoxImage.Error);\r\n                }\r\n                finally\r\n                {\r\n                    if (!playRuntime.IsDisposed)\r\n                    {\r\n                        playRuntime?.Dispose();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private void RunStartScriptFile(string runtimeName, string scriptPath, string workDir, Dictionary<string, object> variables, bool asyncExec = true)\r\n        {\r\n            logger.Debug($\"Starting game using script file {scriptPath}\");\r\n            RunScript(runtimeName, r => r.ExecuteFile(scriptPath, workDir, variables), variables, asyncExec);\r\n        }\r\n\r\n        private void RunStartScript(string runtimeName, string script, string workDir, Dictionary<string, object> variables, bool asyncExec = true)\r\n        {\r\n            logger.Debug($\"Starting game using script.\");\r\n            logger.Trace(script);\r\n            RunScript(runtimeName, r => r.Execute(script, workDir, variables), variables, asyncExec);\r\n        }\r\n\r\n        public void Start(AutomaticPlayController controller)\r\n        {\r\n            var action = new GameAction\r\n            {\r\n                Type = controller.Type == AutomaticPlayActionType.Url ? GameActionType.URL : GameActionType.File,\r\n                Arguments = controller.Arguments,\r\n                Path = controller.Path,\r\n                WorkingDir = controller.WorkingDir,\r\n                TrackingMode = controller.TrackingMode,\r\n                TrackingPath = controller.TrackingPath,\r\n                InitialTrackingDelay = controller.InitialTrackingDelay,\r\n                TrackingFrequency = controller.TrackingFrequency\r\n            };\r\n\r\n            Start(action, true, new OnGameStartingEventArgs\r\n            {\r\n                SourceAction = action,\r\n                Game = Game\r\n            });\r\n        }\r\n\r\n        public void Start(GameAction playAction, bool asyncExec, OnGameStartingEventArgs startingArgs)\r\n        {\r\n            if (playAction == null)\r\n            {\r\n                throw new ArgumentNullException(\"Cannot start game without play action.\");\r\n            }\r\n\r\n            if (playAction.Type == GameActionType.Emulator)\r\n            {\r\n                throw new Exception(\"Cannot start emulator using this configuration.\");\r\n            }\r\n\r\n            StartingArgs = startingArgs;\r\n            var gameClone = Game.GetClone();\r\n            var action = playAction.GetClone();\r\n            action = action.ExpandVariables(gameClone);\r\n            action.Path = CheckPath(action.Path, nameof(action.Path), FileSystemItem.File);\r\n            action.WorkingDir = CheckPath(action.WorkingDir, nameof(action.WorkingDir), FileSystemItem.Directory);\r\n\r\n            if (playAction.Type == GameActionType.Script)\r\n            {\r\n                if (action.Script.IsNullOrWhiteSpace())\r\n                {\r\n                    throw new ArgumentNullException(\"Game script is not defined.\");\r\n                }\r\n\r\n                action.Script = Game.ExpandVariables(action.Script, false);\r\n                RunStartScript(\r\n                    $\"{Game.Name} play script\",\r\n                    action.Script,\r\n                    gameClone.ExpandVariables(gameClone.InstallDirectory, true),\r\n                    new Dictionary<string, object>(),\r\n                    asyncExec);\r\n            }\r\n            else\r\n            {\r\n                Process proc;\r\n                if (action.Type == GameActionType.File)\r\n                {\r\n                    proc = ProcessStarter.StartProcess(action.Path, action.Arguments, action.WorkingDir);\r\n                }\r\n                else if (action.Type == GameActionType.URL)\r\n                {\r\n                    proc = ProcessStarter.StartUrl(action.Path);\r\n                }\r\n                else\r\n                {\r\n                    throw new NotSupportedException();\r\n                }\r\n\r\n                if (action.TrackingMode == TrackingMode.Default)\r\n                {\r\n                    if (action.Type != GameActionType.URL)\r\n                    {\r\n                        // Handle Windows store apps\r\n                        var uwpMatch = Regex.Match(action.Arguments ?? string.Empty, @\"shell:AppsFolder\\\\(.+)!.+\");\r\n                        if (action.Path == \"explorer.exe\" && uwpMatch.Success)\r\n                        {\r\n                            var scanDirectory = gameClone.InstallDirectory;\r\n\r\n                            if (!gameClone.GameId.IsNullOrEmpty())\r\n                            {\r\n                                var prg = Programs.GetUWPApps().FirstOrDefault(a => a.AppId == gameClone.GameId);\r\n                                if (prg != null)\r\n                                {\r\n                                    scanDirectory = prg.WorkDir;\r\n                                }\r\n                            }\r\n\r\n                            // TODO switch to WatchUwpApp once we are building as 64bit app\r\n                            //procMon.WatchUwpApp(uwpMatch.Groups[1].Value, false);\r\n                            var monitor = new MonitorProcessNames(scanDirectory);\r\n                            if (monitor.IsTrackable())\r\n                            {\r\n                                StartTracking(\r\n                                    () => monitor.IsProcessRunning() > 0,\r\n                                    startupCheck: () => monitor.IsProcessRunning(),\r\n                                    trackingFrequency: action.TrackingFrequency,\r\n                                    trackingStartDelay: action.InitialTrackingDelay);\r\n                            }\r\n                            else\r\n                            {\r\n                                InvokeOnStopped(new GameStoppedEventArgs());\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            if (proc != null)\r\n                            {\r\n                                InvokeOnStarted(new GameStartedEventArgs() { StartedProcessId = proc.Id });\r\n                                var monitor = new MonitorProcessTree(proc.Id);\r\n                                StartTracking(\r\n                                    () => monitor.IsProcessTreeRunning(),\r\n                                    trackingFrequency: action.TrackingFrequency,\r\n                                    trackingStartDelay: action.InitialTrackingDelay);\r\n                            }\r\n                            else\r\n                            {\r\n                                InvokeOnStopped(new GameStoppedEventArgs());\r\n                            }\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        var monitor = new MonitorDirectory(gameClone.InstallDirectory);\r\n                        if (monitor.IsTrackable())\r\n                        {\r\n                            StartTracking(\r\n                               () => monitor.IsProcessRunning() > 0,\r\n                               startupCheck: () => monitor.IsProcessRunning(),\r\n                               trackingFrequency: action.TrackingFrequency,\r\n                               trackingStartDelay: action.InitialTrackingDelay);\r\n                        }\r\n                        else\r\n                        {\r\n                            InvokeOnStopped(new GameStoppedEventArgs());\r\n                        }\r\n                    }\r\n                }\r\n                else if (action.TrackingMode == TrackingMode.Process)\r\n                {\r\n                    if (proc != null)\r\n                    {\r\n                        InvokeOnStarted(new GameStartedEventArgs() { StartedProcessId = proc.Id });\r\n                        var monitor = new MonitorProcessTree(proc.Id);\r\n                        StartTracking(\r\n                            () => monitor.IsProcessTreeRunning(),\r\n                            trackingFrequency: action.TrackingFrequency,\r\n                            trackingStartDelay: action.InitialTrackingDelay);\r\n                    }\r\n                    else\r\n                    {\r\n                        InvokeOnStopped(new GameStoppedEventArgs());\r\n                    }\r\n                }\r\n                else if (action.TrackingMode == TrackingMode.OriginalProcess)\r\n                {\r\n                    if (proc != null)\r\n                    {\r\n                        InvokeOnStarted(new GameStartedEventArgs() { StartedProcessId = proc.Id });\r\n                        var monitor = new MonitorProcess(proc);\r\n                        StartTracking(\r\n                            () => monitor.IsProcessRunning(),\r\n                            trackingFrequency: action.TrackingFrequency,\r\n                            trackingStartDelay: action.InitialTrackingDelay);\r\n                    }\r\n                    else\r\n                    {\r\n                        InvokeOnStopped(new GameStoppedEventArgs());\r\n                    }\r\n                }\r\n                else if (action.TrackingMode == TrackingMode.Directory)\r\n                {\r\n                    var watchDir = action.TrackingPath.IsNullOrEmpty() ? gameClone.InstallDirectory : action.TrackingPath;\r\n                    var monitor = new MonitorDirectory(watchDir);\r\n                    if (monitor.IsTrackable())\r\n                    {\r\n                        StartTracking(\r\n                            () => monitor.IsProcessRunning() > 0,\r\n                            startupCheck: () => monitor.IsProcessRunning(),\r\n                            trackingFrequency: action.TrackingFrequency,\r\n                            trackingStartDelay: action.InitialTrackingDelay);\r\n                    }\r\n                    else\r\n                    {\r\n                        InvokeOnStopped(new GameStoppedEventArgs());\r\n                    }\r\n                }\r\n                else if (action.TrackingMode == TrackingMode.ProcessName)\r\n                {\r\n                    if (!action.TrackingPath.IsNullOrWhiteSpace())\r\n                    {\r\n                        var monitor = new MonitorProcessName(action.TrackingPath);\r\n                        StartTracking(\r\n                            () => monitor.IsProcessRunning() > 0,\r\n                            startupCheck: () => monitor.IsProcessRunning(),\r\n                            trackingFrequency: action.TrackingFrequency,\r\n                            trackingStartDelay: action.InitialTrackingDelay);\r\n                    }\r\n                    else\r\n                    {\r\n                        InvokeOnStopped(new GameStoppedEventArgs());\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    throw new NotSupportedException();\r\n                }\r\n            }\r\n        }\r\n\r\n        public void StartTracking(\r\n            Func<bool> trackingAction,\r\n            Func<int> startupCheck = null,\r\n            Action<int> gameStartedAction = null,\r\n            Action gameStoppedAction = null,\r\n            int trackingFrequency = 2000,\r\n            int trackingStartDelay = 0)\r\n        {\r\n            if (watcherToken != null)\r\n            {\r\n                throw new Exception(\"Game is already being tracked.\");\r\n            }\r\n\r\n            watcherToken = new CancellationTokenSource();\r\n            Task.Run(async () =>\r\n            {\r\n                ulong playTimeMs = 0;\r\n                var trackingWatch = new Stopwatch();\r\n                var maxFailCount = 5;\r\n                var failCount = 0;\r\n\r\n                if (trackingStartDelay > 0)\r\n                {\r\n                    await Task.Delay(trackingStartDelay, watcherToken.Token).ContinueWith(task => { });\r\n                }\r\n\r\n                if (startupCheck != null)\r\n                {\r\n                    while (true)\r\n                    {\r\n                        if (watcherToken.IsCancellationRequested)\r\n                        {\r\n                            return;\r\n                        }\r\n\r\n                        if (failCount >= maxFailCount)\r\n                        {\r\n                            InvokeOnStopped(new GameStoppedEventArgs(0));\r\n                            return;\r\n                        }\r\n\r\n                        try\r\n                        {\r\n                            var id = startupCheck();\r\n                            if (id > 0)\r\n                            {\r\n                                gameStartedAction?.Invoke(id);\r\n                                InvokeOnStarted(new GameStartedEventArgs {  StartedProcessId = id });\r\n                                break;\r\n                            }\r\n                        }\r\n                        catch (Exception e)\r\n                        {\r\n                            failCount++;\r\n                            logger.Error(e, \"Game startup tracking iteration failed.\");\r\n                        }\r\n\r\n                        await Task.Delay(trackingFrequency, watcherToken.Token).ContinueWith(task => { });\r\n                    }\r\n                }\r\n\r\n                while (true)\r\n                {\r\n                    failCount = 0;\r\n                    if (watcherToken.IsCancellationRequested)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    if (failCount >= maxFailCount)\r\n                    {\r\n                        gameStoppedAction?.Invoke();\r\n                        InvokeOnStopped(new GameStoppedEventArgs(playTimeMs / 1000));\r\n                        return;\r\n                    }\r\n\r\n                    try\r\n                    {\r\n                        trackingWatch.Restart();\r\n                        if (!trackingAction())\r\n                        {\r\n                            gameStoppedAction?.Invoke();\r\n                            InvokeOnStopped(new GameStoppedEventArgs(playTimeMs / 1000));\r\n                            return;\r\n                        }\r\n                    }\r\n                    catch (Exception e)\r\n                    {\r\n                        failCount++;\r\n                        logger.Error(e, \"Game tracking iteration failed.\");\r\n                    }\r\n\r\n                    await Task.Delay(trackingFrequency, watcherToken.Token).ContinueWith(task => { });\r\n                    trackingWatch.Stop();\r\n                    if (trackingWatch.ElapsedMilliseconds > (trackingFrequency + 30_000))\r\n                    {\r\n                        // This is for cases where system is put into sleep or hibernation.\r\n                        // Realistically speaking, one tracking interation should never take 30+ seconds,\r\n                        // but lets use that as safe value in case this runs super slowly on some weird PCs.\r\n                        continue;\r\n                    }\r\n\r\n                    playTimeMs += (ulong)trackingWatch.ElapsedMilliseconds;\r\n                }\r\n            });\r\n        }\r\n\r\n        public override void Dispose()\r\n        {\r\n            isDisposed = true;\r\n            watcherToken?.Cancel();\r\n            playTask?.Wait(5000); // Give startup script time to gracefully shutdown.\r\n            if (playRuntime?.IsDisposed == false)\r\n            {\r\n                playRuntime?.Dispose();\r\n            }\r\n\r\n            watcherToken?.Dispose();\r\n            currentEmuProfile = null;\r\n        }\r\n\r\n        private string CheckPath(string sourcePath, string changeProp, FileSystemItem pathType)\r\n        {\r\n            if (sourcePath.IsNullOrWhiteSpace())\r\n            {\r\n                return sourcePath;\r\n            }\r\n\r\n            var exists = false;\r\n            var newPath = \"\";\r\n            switch (pathType)\r\n            {\r\n                case FileSystemItem.File:\r\n                    exists = FileSystem.FileExistsOnAnyDrive(sourcePath, out newPath);\r\n                    break;\r\n                case FileSystemItem.Directory:\r\n                    exists = FileSystem.DirectoryExistsOnAnyDrive(sourcePath, out newPath);\r\n                    break;\r\n                default:\r\n                    throw new NotSupportedException();\r\n            }\r\n\r\n            if (exists && !string.Equals(newPath, sourcePath, StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                logger.Warn($\"Replaced missing {changeProp} with new one:\\n{{0}}\\n{{1}}\".Format(sourcePath, newPath));\r\n                return newPath;\r\n            }\r\n\r\n            return sourcePath;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Controls/ExtendedDataGrid.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.Controls\r\n{\r\n    public class ExtendedDataGrid : DataGrid\r\n    {\r\n        static ExtendedDataGrid()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ExtendedDataGrid), new FrameworkPropertyMetadata(typeof(ExtendedDataGrid)));\r\n        }\r\n\r\n        public ExtendedDataGrid()\r\n        {\r\n            SelectionChanged += ExtendedDataGrid_SelectionChanged;\r\n        }\r\n\r\n        private void ExtendedDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)\r\n        {\r\n            SelectedItemsList = (IList<object>)SelectedItems;\r\n        }\r\n\r\n        public IList<object> SelectedItemsList\r\n        {\r\n            get\r\n            {\r\n                return (IList<object>)GetValue(SelectedItemsListProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(SelectedItemsListProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty SelectedItemsListProperty =\r\n           DependencyProperty.Register(\r\n               nameof(SelectedItemsList),\r\n               typeof(IList<object>),\r\n               typeof(ExtendedDataGrid),\r\n               new PropertyMetadata(null));\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Controls/ExtendedListBox.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.Controls\r\n{\r\n    public class ExtendedListBox : ListBox\r\n    {\r\n        internal bool ignoreSelectedItemsListChanges = false;\r\n\r\n        static ExtendedListBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ExtendedListBox), new FrameworkPropertyMetadata(typeof(ExtendedListBox)));\r\n        }\r\n\r\n        public ExtendedListBox()\r\n        {\r\n            SelectionChanged += ExtendedListBox_SelectionChanged;\r\n        }\r\n\r\n        private void ExtendedListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)\r\n        {\r\n            ignoreSelectedItemsListChanges = true;\r\n            SelectedItemsList = (IList<object>)SelectedItems;\r\n            ignoreSelectedItemsListChanges = false;\r\n        }\r\n\r\n        public IList<object> SelectedItemsList\r\n        {\r\n            get\r\n            {\r\n                return (IList<object>)GetValue(SelectedItemsListProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(SelectedItemsListProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty SelectedItemsListProperty =\r\n           DependencyProperty.Register(\r\n               nameof(SelectedItemsList),\r\n               typeof(IList<object>),\r\n               typeof(ExtendedListBox),\r\n               new PropertyMetadata(null, SelectedItemsListChanged));\r\n\r\n        public static void SelectedItemsListChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var list = (ExtendedListBox)d;\r\n            if (list.ignoreSelectedItemsListChanges || list.SelectionMode == SelectionMode.Single)\r\n            {\r\n                return;\r\n            }\r\n\r\n            list.SelectedItems.Clear();\r\n            var newValues = e.NewValue as IList<object>;\r\n            if (newValues.HasItems())\r\n            {\r\n                newValues.ForEach(a => list.SelectedItems.Add(a));\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Controls/ExtendedListView.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.Controls\r\n{\r\n    public class ExtendedListView : ListView\r\n    {\r\n        static ExtendedListView()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ExtendedListView), new FrameworkPropertyMetadata(typeof(ExtendedListView)));\r\n        }\r\n\r\n        public ExtendedListView()\r\n        {            \r\n            SelectionChanged += ExtendedListView_SelectionChanged;\r\n        }\r\n\r\n        private void ExtendedListView_SelectionChanged(object sender, SelectionChangedEventArgs e)\r\n        {\r\n            SelectedItemsList = (IList<object>)SelectedItems;\r\n        }\r\n\r\n        public IList<object> SelectedItemsList\r\n        {\r\n            get\r\n            {\r\n                return (IList<object>)GetValue(SelectedItemsListProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(SelectedItemsListProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty SelectedItemsListProperty =\r\n           DependencyProperty.Register(\r\n               nameof(SelectedItemsList),\r\n               typeof(IList<object>),\r\n               typeof(ExtendedListView),\r\n               new PropertyMetadata(null));\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Controls/FadeImage.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.Controls.FadeImage\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             mc:Ignorable=\"d\" \r\n             Name=\"ControlRoot\"             \r\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\r\n    \r\n    <UserControl.CacheMode>\r\n        <BitmapCache EnableClearType=\"False\" \r\n                     RenderAtScale=\"1\" \r\n                     SnapsToDevicePixels=\"False\" />\r\n    </UserControl.CacheMode>\r\n\r\n    <UserControl.Resources>\r\n        <Storyboard x:Key=\"Image1FadeIn\">\r\n            <DoubleAnimation Storyboard.TargetProperty=\"Opacity\"\r\n                             Storyboard.TargetName=\"Image1\"\r\n                             From=\"0.0\" To=\"1.0\" Duration=\"0:0:0.5\"/>\r\n        </Storyboard>\r\n        <Storyboard x:Key=\"Image2FadeIn\">\r\n            <DoubleAnimation Storyboard.TargetProperty=\"Opacity\"\r\n                             Storyboard.TargetName=\"Image2\"\r\n                             From=\"0.0\" To=\"1.0\" Duration=\"0:0:0.5\"/>\r\n        </Storyboard>\r\n        <Storyboard x:Key=\"Image1FadeOut\">\r\n            <DoubleAnimation Storyboard.TargetProperty=\"Opacity\"\r\n                             Storyboard.TargetName=\"Image1\"\r\n                             From=\"1.0\" To=\"0.0\" Duration=\"0:0:0.5\"/>\r\n        </Storyboard>\r\n        <Storyboard x:Key=\"Image2FadeOut\">\r\n            <DoubleAnimation Storyboard.TargetProperty=\"Opacity\"\r\n                             Storyboard.TargetName=\"Image2\"\r\n                             From=\"1.0\" To=\"0.0\" Duration=\"0:0:0.5\"/>\r\n        </Storyboard>\r\n        <Storyboard x:Key=\"BorderDarkenFadeOut\">\r\n            <DoubleAnimation Storyboard.TargetProperty=\"Opacity\"\r\n                             Storyboard.TargetName=\"BorderDarken\"\r\n                             FillBehavior=\"Stop\"\r\n                             From=\"1.0\" To=\"0.0\" Duration=\"0:0:0.5\"/>\r\n        </Storyboard>\r\n    </UserControl.Resources>\r\n\r\n    <Grid Name=\"ImageHolder\">        \r\n        <Image x:Name=\"Image1\"\r\n               HorizontalAlignment=\"{Binding ElementName=ControlRoot, Path=HorizontalAlignment}\"\r\n               VerticalAlignment=\"{Binding ElementName=ControlRoot, Path=VerticalAlignment}\"\r\n               RenderOptions.BitmapScalingMode=\"Fant\" Stretch=\"{Binding Stretch, RelativeSource={RelativeSource AncestorType=UserControl}}\"\r\n               OpacityMask=\"{Binding ImageOpacityMask, ElementName=ControlRoot}\">\r\n        </Image>\r\n        <Image x:Name=\"Image2\"\r\n               HorizontalAlignment=\"{Binding ElementName=ControlRoot, Path=HorizontalAlignment}\"\r\n               VerticalAlignment=\"{Binding ElementName=ControlRoot, Path=VerticalAlignment}\"\r\n               RenderOptions.BitmapScalingMode=\"Fant\" Stretch=\"{Binding Stretch, RelativeSource={RelativeSource AncestorType=UserControl}}\"\r\n               OpacityMask=\"{Binding ImageOpacityMask, ElementName=ControlRoot}\">\r\n        </Image>\r\n        <Border x:Name=\"BorderDarken\" Background=\"{Binding ImageDarkeningBrush, ElementName=ControlRoot}\" />\r\n    </Grid>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite/Controls/FadeImage.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Imaging;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Animation;\r\nusing System.Windows.Media.Effects;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.Controls\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for FadeImage.xaml\r\n    /// </summary>\r\n    public partial class FadeImage : UserControl\r\n    {\r\n        private enum CurrentImage\r\n        {\r\n            Image1,\r\n            Image2,\r\n            None\r\n        }\r\n\r\n        private CurrentImage currentImage = CurrentImage.None;\r\n        private object currentSource = null;\r\n        private System.Timers.Timer sourceChangeTimer = new System.Timers.Timer() { AutoReset = false };\r\n        private object newSource;\r\n        private readonly SynchronizationContext context;\r\n\r\n        internal Storyboard Image1FadeIn;\r\n        internal Storyboard Image2FadeIn;\r\n        internal Storyboard Image1FadeOut;\r\n        internal Storyboard Image2FadeOut;\r\n        internal Storyboard stateAnim;\r\n        internal Storyboard BorderDarkenFadeOut;\r\n\r\n        public double SourceUpdateDelay { get; set; } = 0;\r\n\r\n        #region AnimationEnabled\r\n\r\n        public static readonly DependencyProperty AnimationEnabledProperty = DependencyProperty.Register(\r\n            nameof(AnimationEnabled),\r\n            typeof(bool),\r\n            typeof(FadeImage),\r\n            new PropertyMetadata(true));\r\n\r\n        public bool AnimationEnabled\r\n        {\r\n            get { return (bool)GetValue(AnimationEnabledProperty); }\r\n            set { SetValue(AnimationEnabledProperty, value); }\r\n        }\r\n\r\n        #endregion AnimationEnabled\r\n\r\n        #region Source\r\n\r\n        public static readonly DependencyProperty SourceProperty = DependencyProperty.Register(\r\n            nameof(Source),\r\n            typeof(object),\r\n            typeof(FadeImage),\r\n            new PropertyMetadata(null, SourceChanged));\r\n\r\n        public object Source\r\n        {\r\n            get { return GetValue(SourceProperty); }\r\n            set { SetValue(SourceProperty, value); }\r\n        }\r\n\r\n        #endregion Source\r\n\r\n        #region ImageOpacityMask\r\n\r\n        public static readonly DependencyProperty ImageOpacityMaskProperty = DependencyProperty.Register(\r\n            nameof(ImageOpacityMask),\r\n            typeof(Brush),\r\n            typeof(FadeImage),\r\n            new PropertyMetadata());\r\n\r\n        public Brush ImageOpacityMask\r\n        {\r\n            get { return (Brush)GetValue(ImageOpacityMaskProperty); }\r\n            set { SetValue(ImageOpacityMaskProperty, value); }\r\n        }\r\n\r\n        #endregion ImageOpacityMask\r\n\r\n        #region ImageDarkeningBrush\r\n\r\n        public static readonly DependencyProperty ImageDarkeningBrushProperty = DependencyProperty.Register(\r\n            nameof(ImageDarkeningBrush),\r\n            typeof(Brush),\r\n            typeof(FadeImage),\r\n            new PropertyMetadata());\r\n\r\n        public Brush ImageDarkeningBrush\r\n        {\r\n            get { return (Brush)GetValue(ImageDarkeningBrushProperty); }\r\n            set { SetValue(ImageDarkeningBrushProperty, value); }\r\n        }\r\n\r\n        #endregion ImageDarkeningBrush\r\n\r\n        #region Stretch\r\n\r\n        public static readonly DependencyProperty StretchProperty = DependencyProperty.Register(\r\n            nameof(Stretch),\r\n            typeof(Stretch),\r\n            typeof(FadeImage),\r\n            new PropertyMetadata(Stretch.UniformToFill));\r\n\r\n        public Stretch Stretch\r\n        {\r\n            get { return (Stretch)GetValue(StretchProperty); }\r\n            set { SetValue(StretchProperty, value); }\r\n        }\r\n\r\n        #endregion Strech\r\n\r\n        #region IsBlurEnabled\r\n\r\n        public static readonly DependencyProperty IsBlurEnabledProperty = DependencyProperty.Register(\r\n            nameof(IsBlurEnabled),\r\n            typeof(bool),\r\n            typeof(FadeImage),\r\n            new PropertyMetadata(false, BlurSettingChanged));\r\n\r\n        public bool IsBlurEnabled\r\n        {\r\n            get { return (bool)GetValue(IsBlurEnabledProperty); }\r\n            set { SetValue(IsBlurEnabledProperty, value); }\r\n        }\r\n\r\n        #endregion IsBlurEnabled\r\n\r\n        #region BlurAmount\r\n\r\n        public static readonly DependencyProperty BlurAmountProperty = DependencyProperty.Register(\r\n            nameof(BlurAmount),\r\n            typeof(int),\r\n            typeof(FadeImage),\r\n            new PropertyMetadata(10, BlurSettingChanged));\r\n\r\n        public int BlurAmount\r\n        {\r\n            get { return (int)GetValue(BlurAmountProperty); }\r\n            set { SetValue(BlurAmountProperty, value); }\r\n        }\r\n\r\n        #endregion IsBlurEnabled\r\n\r\n        #region HighQualityBlur\r\n\r\n        public static readonly DependencyProperty HighQualityBlurProperty = DependencyProperty.Register(\r\n            nameof(HighQualityBlurProperty),\r\n            typeof(bool),\r\n            typeof(FadeImage),\r\n            new PropertyMetadata(false, BlurSettingChanged));\r\n\r\n        public bool HighQualityBlur\r\n        {\r\n            get { return (bool)GetValue(HighQualityBlurProperty); }\r\n            set { SetValue(HighQualityBlurProperty, value); }\r\n        }\r\n\r\n        #endregion HighQualityBlur\r\n\r\n        public FadeImage()\r\n        {\r\n            InitializeComponent();\r\n            context = SynchronizationContext.Current;\r\n            Image1FadeIn = (Storyboard)TryFindResource(\"Image1FadeIn\");\r\n            Image2FadeIn = (Storyboard)TryFindResource(\"Image2FadeIn\");\r\n            Image1FadeOut = (Storyboard)TryFindResource(\"Image1FadeOut\");\r\n            Image2FadeOut = (Storyboard)TryFindResource(\"Image2FadeOut\");\r\n            BorderDarkenFadeOut = (Storyboard)TryFindResource(\"BorderDarkenFadeOut\");\r\n            Image1FadeOut.Completed += Image1FadeOut_Completed;\r\n            Image2FadeOut.Completed += Image2FadeOut_Completed;\r\n            BorderDarkenFadeOut.Completed += BorderDarkenOut_Completed;\r\n            sourceChangeTimer.Elapsed += (_, __) => context.Send((___) => LoadNewSource(), null);\r\n        }\r\n\r\n        ~FadeImage()\r\n        {\r\n            sourceChangeTimer.Dispose();\r\n        }\r\n\r\n        private void Image1FadeOut_Completed(object sender, EventArgs e)\r\n        {\r\n            Image1.Source = null;\r\n            Image1.UpdateLayout();\r\n            GC.Collect();\r\n        }\r\n\r\n        private void Image2FadeOut_Completed(object sender, EventArgs e)\r\n        {\r\n            Image2.Source = null;\r\n            Image2.UpdateLayout();\r\n        }\r\n\r\n        private void BorderDarkenOut_Completed(object sender, EventArgs e)\r\n        {\r\n            BorderDarken.Opacity = 0;\r\n        }\r\n\r\n        private static void BlurSettingChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            var control = (FadeImage)obj;\r\n            if (control.Source == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var blurAmount = control.BlurAmount;\r\n            var blurEnabled = control.IsBlurEnabled;\r\n            var highQuality = control.HighQualityBlur;\r\n            if (blurEnabled)\r\n            {\r\n                control.ImageHolder.Effect = new BlurEffect()\r\n                {\r\n                    KernelType = KernelType.Gaussian,\r\n                    Radius = blurAmount,\r\n                    RenderingBias = highQuality ? RenderingBias.Quality : RenderingBias.Performance\r\n                };\r\n            }\r\n            else\r\n            {\r\n                control.ImageHolder.Effect = null;\r\n            }\r\n        }\r\n\r\n        private static void SourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            var control = (FadeImage)obj;\r\n            control.newSource = args.NewValue;\r\n\r\n            if (control.SourceUpdateDelay > 0)\r\n            {\r\n                control.sourceChangeTimer.Enabled = false;\r\n                control.sourceChangeTimer.Interval = control.SourceUpdateDelay;\r\n                control.sourceChangeTimer.Enabled = true;\r\n            }\r\n            else\r\n            {\r\n                control.LoadNewSource();\r\n            }\r\n        }\r\n\r\n        private async void LoadNewSource()\r\n        {\r\n            sourceChangeTimer.Enabled = false;\r\n            if (newSource?.Equals(currentSource) == true)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var blurAmount = BlurAmount;\r\n            var blurEnabled = IsBlurEnabled;\r\n            var highQuality = HighQualityBlur;\r\n            BitmapSource image = null;\r\n            currentSource = newSource;\r\n            if (newSource != null)\r\n            {\r\n                image = await Task.Factory.StartNew(() =>\r\n                {\r\n                    if (newSource is string str)\r\n                    {\r\n                        return ImageSourceManager.GetImage(str, false);\r\n                    }\r\n                    else if (newSource is BitmapLoadProperties props)\r\n                    {\r\n                        return ImageSourceManager.GetImage(props.Source, false, props);\r\n                    }\r\n                    else\r\n                    {\r\n                        return null;\r\n                    }\r\n                });\r\n            }\r\n\r\n            if (blurEnabled)\r\n            {\r\n                if (ImageHolder.Effect == null)\r\n                {\r\n                    ImageHolder.Effect = new BlurEffect()\r\n                    {\r\n                        KernelType = KernelType.Gaussian,\r\n                        Radius = blurAmount,\r\n                        RenderingBias = highQuality ? RenderingBias.Quality : RenderingBias.Performance\r\n                    };\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (ImageHolder.Effect != null)\r\n                {\r\n                    ImageHolder.Effect = null;\r\n                }\r\n            }\r\n\r\n            if (AnimationEnabled)\r\n            {\r\n                if (image == null)\r\n                {\r\n                    if (currentImage == CurrentImage.None)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    if (currentImage == CurrentImage.Image1)\r\n                    {\r\n                        Image1FadeOut.Begin();\r\n                        BorderDarkenFadeOut.Begin();\r\n                    }\r\n                    else if (currentImage == CurrentImage.Image2)\r\n                    {\r\n                        Image2FadeOut.Begin();\r\n                        BorderDarkenFadeOut.Begin();\r\n                    }\r\n\r\n                    currentImage = CurrentImage.None;\r\n                }\r\n                else\r\n                {\r\n                    if (currentImage == CurrentImage.None)\r\n                    {\r\n                        Image1FadeOut.Stop();\r\n                        Image1.Source = image;\r\n                        Image1FadeIn.Begin();\r\n                        BorderDarken.Opacity = 1;\r\n                        BorderDarkenFadeOut.Stop();\r\n                        currentImage = CurrentImage.Image1;\r\n                    }\r\n                    else if (currentImage == CurrentImage.Image1)\r\n                    {\r\n                        Image2FadeOut.Stop();\r\n                        Image2.Source = image;\r\n                        Image2FadeIn.Begin();\r\n                        Image1FadeOut.Begin();\r\n                        BorderDarken.Opacity = 1;\r\n                        BorderDarkenFadeOut.Stop();\r\n                        currentImage = CurrentImage.Image2;\r\n                    }\r\n                    else if (currentImage == CurrentImage.Image2)\r\n                    {\r\n                        Image1FadeOut.Stop();\r\n                        Image1.Source = image;\r\n                        Image1FadeIn.Begin();\r\n                        Image2FadeOut.Begin();\r\n                        BorderDarken.Opacity = 1;\r\n                        BorderDarkenFadeOut.Stop();\r\n                        currentImage = CurrentImage.Image1;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (currentImage == CurrentImage.Image1)\r\n                {\r\n                    Image1.Source = image;\r\n                }\r\n                else if (currentImage == CurrentImage.Image2)\r\n                {\r\n                    Image2.Source = image;\r\n                }\r\n                else\r\n                {\r\n                    Image1.Source = image;\r\n                    currentImage = CurrentImage.Image1;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Controls/GridEx.cs",
    "content": "﻿using Playnite.Extensions.Markup;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\nusing TheArtOfDev.HtmlRenderer.WPF;\r\n\r\nnamespace Playnite.Controls\r\n{\r\n    public class GridEx : Grid\r\n    {\r\n        #region RowCount Property\r\n\r\n        /// <summary>\r\n        /// Adds the specified number of Rows to RowDefinitions.\r\n        /// Default Height is Auto\r\n        /// </summary>\r\n        public static readonly DependencyProperty RowCountProperty =\r\n            DependencyProperty.Register(\r\n                \"RowCount\", typeof(int), typeof(GridEx),\r\n                new PropertyMetadata(-1, RowCountChanged));\r\n\r\n        // Get\r\n        public static int GetRowCount(DependencyObject obj)\r\n        {\r\n            return (int)obj.GetValue(RowCountProperty);\r\n        }\r\n\r\n        // Set\r\n        public static void SetRowCount(DependencyObject obj, int value)\r\n        {\r\n            obj.SetValue(RowCountProperty, value);\r\n        }\r\n\r\n        // Change Event - Adds the Rows\r\n        public static void RowCountChanged(\r\n            DependencyObject obj, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            if (!(obj is Grid) || (int)e.NewValue < 0)\r\n                return;\r\n\r\n            Grid grid = (Grid)obj;\r\n            grid.RowDefinitions.Clear();\r\n\r\n            for (int i = 0; i < (int)e.NewValue; i++)\r\n                grid.RowDefinitions.Add(\r\n                    new RowDefinition() { Height = GridLength.Auto });\r\n\r\n            SetStarRows(grid);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region ColumnCount Property\r\n\r\n        /// <summary>\r\n        /// Adds the specified number of Columns to ColumnDefinitions.\r\n        /// Default Width is Auto\r\n        /// </summary>\r\n        public static readonly DependencyProperty ColumnCountProperty =\r\n            DependencyProperty.Register(\r\n                \"ColumnCount\", typeof(int), typeof(GridEx),\r\n                new PropertyMetadata(-1, ColumnCountChanged));\r\n\r\n        // Get\r\n        public static int GetColumnCount(DependencyObject obj)\r\n        {\r\n            return (int)obj.GetValue(ColumnCountProperty);\r\n        }\r\n\r\n        // Set\r\n        public static void SetColumnCount(DependencyObject obj, int value)\r\n        {\r\n            obj.SetValue(ColumnCountProperty, value);\r\n        }\r\n\r\n        // Change Event - Add the Columns\r\n        public static void ColumnCountChanged(\r\n            DependencyObject obj, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            if (!(obj is Grid) || (int)e.NewValue < 0)\r\n                return;\r\n\r\n            Grid grid = (Grid)obj;\r\n            grid.ColumnDefinitions.Clear();\r\n\r\n            for (int i = 0; i < (int)e.NewValue; i++)\r\n                grid.ColumnDefinitions.Add(\r\n                    new ColumnDefinition() { Width = GridLength.Auto });\r\n\r\n            SetStarColumns(grid);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region StarRows Property\r\n\r\n        /// <summary>\r\n        /// Makes the specified Row's Height equal to Star.\r\n        /// Can set on multiple Rows\r\n        /// </summary>\r\n        public static readonly DependencyProperty StarRowsProperty =\r\n            DependencyProperty.Register(\r\n                \"StarRows\", typeof(string), typeof(GridEx),\r\n                new PropertyMetadata(string.Empty, StarRowsChanged));\r\n\r\n        // Get\r\n        public static string GetStarRows(DependencyObject obj)\r\n        {\r\n            return (string)obj.GetValue(StarRowsProperty);\r\n        }\r\n\r\n        // Set\r\n        public static void SetStarRows(DependencyObject obj, string value)\r\n        {\r\n            obj.SetValue(StarRowsProperty, value);\r\n        }\r\n\r\n        // Change Event - Makes specified Row's Height equal to Star\r\n        public static void StarRowsChanged(\r\n            DependencyObject obj, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            if (!(obj is Grid) || string.IsNullOrEmpty(e.NewValue.ToString()))\r\n                return;\r\n\r\n            SetStarRows((Grid)obj);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region StarColumns Property\r\n\r\n        /// <summary>\r\n        /// Makes the specified Column's Width equal to Star.\r\n        /// Can set on multiple Columns\r\n        /// </summary>\r\n        public static readonly DependencyProperty StarColumnsProperty =\r\n            DependencyProperty.Register(\r\n                \"StarColumns\", typeof(string), typeof(GridEx),\r\n                new PropertyMetadata(string.Empty, StarColumnsChanged));\r\n\r\n        // Get\r\n        public static string GetStarColumns(DependencyObject obj)\r\n        {\r\n            return (string)obj.GetValue(StarColumnsProperty);\r\n        }\r\n\r\n        // Set\r\n        public static void SetStarColumns(DependencyObject obj, string value)\r\n        {\r\n            obj.SetValue(StarColumnsProperty, value);\r\n        }\r\n\r\n        // Change Event - Makes specified Column's Width equal to Star\r\n        public static void StarColumnsChanged(\r\n            DependencyObject obj, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            if (!(obj is Grid) || string.IsNullOrEmpty(e.NewValue.ToString()))\r\n                return;\r\n\r\n            SetStarColumns((Grid)obj);\r\n        }\r\n\r\n        #endregion\r\n\r\n        #region AutoLayoutColumns\r\n        public static readonly DependencyProperty AutoLayoutColumnsProperty =\r\n            DependencyProperty.Register(\r\n                \"AutoLayoutColumns\", typeof(int), typeof(GridEx),\r\n                new PropertyMetadata(-1, AutoLayoutColumnsChanged));\r\n\r\n        public static int GetAutoLayoutColumns(DependencyObject obj)\r\n        {\r\n            return (int)obj.GetValue(AutoLayoutColumnsProperty);\r\n        }\r\n\r\n        public static void SetAutoLayoutColumns(DependencyObject obj, int value)\r\n        {\r\n            obj.SetValue(AutoLayoutColumnsProperty, value);\r\n        }\r\n\r\n        public static void AutoLayoutColumnsChanged(\r\n            DependencyObject obj, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            ((GridEx)obj).ArrangeChildren();\r\n        }\r\n\r\n        #endregion AutoLayoutColumns\r\n\r\n        public GridEx() : base()\r\n        {\r\n        }\r\n\r\n        internal void ArrangeChildren()\r\n        {\r\n            var columns = GetAutoLayoutColumns(this);\r\n            if (columns == -1)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var index = 0;\r\n            foreach (UIElement elem in Children)\r\n            {\r\n                var span = Grid.GetColumnSpan(elem);\r\n                SetColumn(elem, index % columns);\r\n                SetRow(elem, index / columns);\r\n                if (span > 0)\r\n                {\r\n                    index += span;\r\n                }\r\n                else\r\n                {\r\n                    index++;\r\n                }\r\n            }\r\n        }\r\n\r\n        private static void SetStarColumns(Grid grid)\r\n        {\r\n            var starColumns = GetStarColumns(grid).Split(',');\r\n            for (int i = 0; i < grid.ColumnDefinitions.Count; i++)\r\n            {\r\n                if (starColumns.Contains(i.ToString()))\r\n                {\r\n                    grid.ColumnDefinitions[i].Width = new GridLength(1, GridUnitType.Star);\r\n                }\r\n                else\r\n                {\r\n                    grid.ColumnDefinitions[i].Width = new GridLength(1, GridUnitType.Auto);\r\n                }\r\n            }\r\n        }\r\n\r\n        private static void SetStarRows(Grid grid)\r\n        {\r\n            var starRows = GetStarRows(grid).Split(',');\r\n            for (int i = 0; i < grid.RowDefinitions.Count; i++)\r\n            {\r\n                if (starRows.Contains(i.ToString()))\r\n                {\r\n                    grid.RowDefinitions[i].Height = new GridLength(1, GridUnitType.Star);\r\n                }\r\n                else\r\n                {\r\n                    grid.RowDefinitions[i].Height = new GridLength(1, GridUnitType.Auto);\r\n                }\r\n            }\r\n        }\r\n\r\n        protected override Size MeasureOverride(Size constraint)\r\n        {\r\n            ArrangeChildren();\r\n            return base.MeasureOverride(constraint);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Controls/HotKeyBox.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.Controls\r\n{\r\n    public class HotKeyBox : TextBox\r\n    {\r\n        public static readonly DependencyProperty HotkeyProperty = DependencyProperty.Register(\r\n            nameof(Hotkey),\r\n            typeof(HotKey),\r\n            typeof(HotKeyBox),\r\n            new FrameworkPropertyMetadata(default(HotKey), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));\r\n\r\n        public HotKey Hotkey\r\n        {\r\n            get => (HotKey)GetValue(HotkeyProperty);\r\n            set => SetValue(HotkeyProperty, value);\r\n        }\r\n\r\n        public bool ClearWithDeleteKeys { get; set; } = true;\r\n\r\n        static HotKeyBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(HotKeyBox), new FrameworkPropertyMetadata(typeof(HotKeyBox)));\r\n        }\r\n\r\n        public HotKeyBox() : base()\r\n        {\r\n            PreviewKeyDown += HotKeyBox_PreviewKeyDown;\r\n            IsReadOnly = true;\r\n            IsReadOnlyCaretVisible = false;\r\n            IsUndoEnabled = false;\r\n\r\n            BindingTools.SetBinding(\r\n                this,\r\n                TextProperty,\r\n                this,\r\n                nameof(Hotkey),\r\n                System.Windows.Data.BindingMode.OneWay,\r\n                targetNullValue: ResourceProvider.GetResource(LOC.None));\r\n        }\r\n\r\n        private void HotKeyBox_PreviewKeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            e.Handled = true;\r\n            var modifiers = Keyboard.Modifiers;\r\n            var key = e.Key;\r\n            if (key == Key.System)\r\n            {\r\n                key = e.SystemKey;\r\n            }\r\n\r\n            if (modifiers == ModifierKeys.None &&\r\n                (key == Key.Delete || key == Key.Back || key == Key.Escape) &&\r\n                ClearWithDeleteKeys)\r\n            {\r\n                Hotkey = null;\r\n                return;\r\n            }\r\n\r\n            if (key == Key.LeftCtrl ||\r\n                key == Key.RightCtrl ||\r\n                key == Key.LeftAlt ||\r\n                key == Key.RightAlt ||\r\n                key == Key.LeftShift ||\r\n                key == Key.RightShift ||\r\n                key == Key.LWin ||\r\n                key == Key.RWin ||\r\n                key == Key.Clear ||\r\n                key == Key.OemClear ||\r\n                key == Key.Apps)\r\n            {\r\n                return;\r\n            }\r\n\r\n            Hotkey = new HotKey(key, modifiers);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Controls/HtmlTextView.cs",
    "content": "﻿using Playnite.Extensions.Markup;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\nusing TheArtOfDev.HtmlRenderer.WPF;\r\n\r\nnamespace Playnite.Controls\r\n{\r\n    public class HtmlTextView : StackPanel\r\n    {\r\n        private const string defaultTemplate = @\"\r\n<!DOCTYPE html>\r\n<html>\r\n<head>\r\n    <meta charset=\"\"UTF-8\"\">\r\n    <style type=\"\"text/css\"\">\r\n        HTML,BODY\r\n        {\r\n            color: {foreground};\r\n            font-family: \"\"{font_family}\"\";\r\n            font-size: {font_size}px;\r\n            margin: 0;\r\n            padding: 0;\r\n        }\r\n\r\n        a {\r\n            color: {link_foreground};\r\n            text-decoration: none;\r\n        }\r\n\r\n        img {\r\n            max-width: 100%;\r\n        }\r\n    </style>\r\n    <title>Game Description</title>\r\n</head>\r\n<body>\r\n<div>\r\n{text}\r\n</div>\r\n</body>\r\n</html>\";\r\n\r\n        private int currentLoadedLength = 0;\r\n        private readonly int loadPartLength = 10_000;\r\n        internal string templateContent = string.Empty;\r\n        private readonly HtmlPanel htmlPanel;\r\n        private readonly Button moreButton;\r\n\r\n        public string TemplatePath\r\n        {\r\n            get\r\n            {\r\n                return (string)GetValue(TemplatePathProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(TemplatePathProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty TemplatePathProperty =\r\n            DependencyProperty.Register(\r\n                \"TemplatePath\",\r\n                typeof(string),\r\n                typeof(HtmlTextView),\r\n                new PropertyMetadata(null, TemplatePathChange));\r\n\r\n        private static void TemplatePathChange(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as HtmlTextView;\r\n            if (e.NewValue is string path)\r\n            {\r\n                if (path.IsNullOrEmpty())\r\n                {\r\n                    obj.templateContent = string.Empty;\r\n                }\r\n                else if (File.Exists(path))\r\n                {\r\n                    obj.templateContent = File.ReadAllText(path);\r\n                }\r\n\r\n                obj.UpdateTextContent();\r\n            }\r\n        }\r\n\r\n        public double HtmlFontSize\r\n        {\r\n            get\r\n            {\r\n                return (double)GetValue(HtmlFontSizeProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(HtmlFontSizeProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty HtmlFontSizeProperty =\r\n            DependencyProperty.Register(\"HtmlFontSize\", typeof(double), typeof(HtmlTextView), new PropertyMetadata(11.0, OnHtmlFontSizeChange));\r\n\r\n        private static void OnHtmlFontSizeChange(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as HtmlTextView;\r\n            if (e.NewValue is double size)\r\n            {\r\n                obj.UpdateTextContent();\r\n            }\r\n        }\r\n\r\n        public FontFamily HtmlFontFamily\r\n        {\r\n            get\r\n            {\r\n                return (FontFamily)GetValue(HtmlFontFamilyProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(HtmlFontFamilyProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty HtmlFontFamilyProperty =\r\n            DependencyProperty.Register(\"HtmlFontFamily\", typeof(FontFamily), typeof(HtmlTextView), new PropertyMetadata(new FontFamily(\"Trebuchet MS\"), OnHtmlFontFamilyChange));\r\n\r\n        private static void OnHtmlFontFamilyChange(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as HtmlTextView;\r\n            obj.UpdateTextContent();\r\n        }\r\n\r\n        public Color LinkForeground\r\n        {\r\n            get\r\n            {\r\n                return (Color)GetValue(LinkForegroundProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(LinkForegroundProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty LinkForegroundProperty =\r\n            DependencyProperty.Register(\"LinkForeground\", typeof(Color), typeof(HtmlTextView), new PropertyMetadata(Colors.White, OnLinkForegroundChange));\r\n\r\n        private static void OnLinkForegroundChange(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as HtmlTextView;\r\n            if (e.NewValue is Color color)\r\n            {\r\n                obj.UpdateTextContent();\r\n            }\r\n        }\r\n\r\n        public Color HtmlForeground\r\n        {\r\n            get\r\n            {\r\n                return (Color)GetValue(HtmlForegroundProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(HtmlForegroundProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty HtmlForegroundProperty =\r\n            DependencyProperty.Register(\"HtmlForeground\", typeof(Color), typeof(HtmlTextView), new PropertyMetadata(Colors.Black, OnHtmlForegroundChange));\r\n\r\n        private static void OnHtmlForegroundChange(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as HtmlTextView;\r\n            if (e.NewValue is Color color)\r\n            {\r\n                obj.UpdateTextContent();\r\n            }\r\n        }\r\n\r\n        public string HtmlText\r\n        {\r\n            get\r\n            {\r\n                return (string)GetValue(HtmlTextProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(HtmlTextProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty HtmlTextProperty =\r\n            DependencyProperty.Register(\"HtmlText\", typeof(string), typeof(HtmlTextView), new PropertyMetadata(string.Empty, OnHtmlTextChange));\r\n\r\n        private static void OnHtmlTextChange(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as HtmlTextView;\r\n            obj.UpdateTextContent();\r\n        }\r\n\r\n        public bool PartialLoadEnabled\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(PartialLoadEnabledProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(PartialLoadEnabledProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty PartialLoadEnabledProperty =\r\n            DependencyProperty.Register(\r\n                \"PartialLoadEnabled\",\r\n                typeof(bool),\r\n                typeof(HtmlTextView),\r\n                new PropertyMetadata(true));\r\n\r\n        // These are for theme backwards compatibility since this control is no longer Control but FrameworkElement\r\n        public FontStyle FontStyle { get; set; }\r\n        public static readonly DependencyProperty FontStyleProperty = DependencyProperty.Register(\"FontStyle\", typeof(FontStyle), typeof(HtmlTextView));\r\n\r\n        public FontStretch FontStretch { get; set; }\r\n        public static readonly DependencyProperty FontStretchProperty = DependencyProperty.Register(\"FontStretch\", typeof(FontStretch), typeof(HtmlTextView));\r\n\r\n        public double FontSize { get; set; }\r\n        public static readonly DependencyProperty FontSizeProperty = DependencyProperty.Register(\"FontSize\", typeof(double), typeof(HtmlTextView));\r\n\r\n        public FontFamily FontFamily { get; set; }\r\n        public static readonly DependencyProperty FontFamilyProperty = DependencyProperty.Register(\"FontFamily\", typeof(FontFamily), typeof(HtmlTextView));\r\n\r\n        public Brush Foreground { get; set; }\r\n        public static readonly DependencyProperty ForegroundProperty = DependencyProperty.Register(\"Foreground\", typeof(Brush), typeof(HtmlTextView));\r\n\r\n        public Thickness BorderThickness { get; set; }\r\n        public static readonly DependencyProperty BorderThicknessProperty = DependencyProperty.Register(\"BorderThickness\", typeof(Thickness), typeof(HtmlTextView));\r\n\r\n        public bool IsTabStop { get; set; }\r\n        public static readonly DependencyProperty IsTabStopProperty = DependencyProperty.Register(\"IsTabStop\", typeof(bool), typeof(HtmlTextView));\r\n\r\n        public VerticalAlignment VerticalContentAlignment { get; set; }\r\n        public static readonly DependencyProperty VerticalContentAlignmentProperty = DependencyProperty.Register(\"VerticalContentAlignment\", typeof(VerticalAlignment), typeof(HtmlTextView));\r\n\r\n        public int TabIndex { get; set; }\r\n        public static readonly DependencyProperty TabIndexProperty = DependencyProperty.Register(\"TabIndex\", typeof(int), typeof(HtmlTextView));\r\n\r\n        public Thickness Padding { get; set; }\r\n        public static readonly DependencyProperty PaddingProperty = DependencyProperty.Register(\"Padding\", typeof(Thickness), typeof(HtmlTextView));\r\n\r\n        public FontWeight FontWeight { get; set; }\r\n        public static readonly DependencyProperty FontWeightProperty = DependencyProperty.Register(\"FontWeight\", typeof(FontWeight), typeof(HtmlTextView));\r\n\r\n        public Brush BorderBrush { get; set; }\r\n        public static readonly DependencyProperty BorderBrushProperty = DependencyProperty.Register(\"BorderBrush\", typeof(Brush), typeof(HtmlTextView));\r\n\r\n        public HorizontalAlignment HorizontalContentAlignment { get; set; }\r\n        public static readonly DependencyProperty HorizontalContentAlignmentProperty = DependencyProperty.Register(\"HorizontalContentAlignment\", typeof(HorizontalAlignment), typeof(HtmlTextView));\r\n\r\n        internal void UpdateTextContent()\r\n        {\r\n            currentLoadedLength = loadPartLength;\r\n            if (PartialLoadEnabled && !HtmlText.IsNullOrEmpty() && HtmlText.Length > loadPartLength)\r\n            {\r\n                moreButton.Visibility = Visibility.Visible;\r\n                SetHtmlContent(HtmlText.Substring(0, loadPartLength));\r\n            }\r\n            else\r\n            {\r\n                moreButton.Visibility = Visibility.Hidden;\r\n                SetHtmlContent(HtmlText ?? string.Empty);\r\n            };\r\n        }\r\n\r\n        internal void SetHtmlContent(string htmlContent)\r\n        {\r\n            var content = string.Empty;\r\n            if (!templateContent.IsNullOrEmpty())\r\n            {\r\n                content = templateContent;\r\n            }\r\n            else if (HtmlText?.Contains(\"<html>\") != true)\r\n            {\r\n                content = defaultTemplate;\r\n            }\r\n\r\n            content = content.Replace(\"{foreground}\", HtmlForeground.ToHtml());\r\n            content = content.Replace(\"{link_foreground}\", LinkForeground.ToHtml());\r\n            content = content.Replace(\"{font_family}\", HtmlFontFamily.ToString());\r\n            content = content.Replace(\"{font_size}\", HtmlFontSize.ToString());\r\n            htmlPanel.Text = content.Replace(\"{text}\", htmlContent);\r\n        }\r\n\r\n        static HtmlTextView()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(HtmlTextView), new FrameworkPropertyMetadata(typeof(HtmlTextView)));\r\n        }\r\n\r\n        public HtmlTextView()\r\n        {\r\n            htmlPanel = new HtmlPanel();\r\n            htmlPanel.Background = Brushes.Transparent;\r\n\r\n            // Always use LTR because HtmlPanel doesn't support RTL properly\r\n            FlowDirection = FlowDirection.LeftToRight;\r\n\r\n            // This makes performance way better to leave scrolling to be handled by the parent layout\r\n            ScrollViewer.SetHorizontalScrollBarVisibility(htmlPanel, ScrollBarVisibility.Disabled);\r\n            ScrollViewer.SetVerticalScrollBarVisibility(htmlPanel, ScrollBarVisibility.Disabled);\r\n\r\n            moreButton = new Button\r\n            {\r\n                HorizontalAlignment = HorizontalAlignment.Center,\r\n                Content = LOC.LoadMore.GetLocalized(),\r\n                Visibility = Visibility.Hidden,\r\n                Margin = new Thickness(0, 0, 0, 5)\r\n            };\r\n\r\n            moreButton.Click += (_, __) =>\r\n            {\r\n                currentLoadedLength += loadPartLength;\r\n                if (currentLoadedLength > HtmlText.Length)\r\n                {\r\n                    moreButton.Visibility = Visibility.Hidden;\r\n                    SetHtmlContent(HtmlText);\r\n                }\r\n                else\r\n                {\r\n                    SetHtmlContent(HtmlText.Substring(0, currentLoadedLength));\r\n                }\r\n            };\r\n\r\n            Children.Add(htmlPanel);\r\n            Children.Add(moreButton);\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Controls/WindowBase.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Native;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Automation.Peers;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\nusing System.Windows.Interop;\r\nusing System.Windows.Media;\r\n\r\nnamespace Playnite.Controls\r\n{\r\n    public class EmptyWindowAutomationPeer : FrameworkElementAutomationPeer\r\n    {\r\n        private static readonly List<AutomationPeer> emptyList = new List<AutomationPeer>();\r\n\r\n        public EmptyWindowAutomationPeer(FrameworkElement owner) : base(owner)\r\n        {\r\n        }\r\n\r\n        protected override string GetNameCore()\r\n        {\r\n            return nameof(EmptyWindowAutomationPeer);\r\n        }\r\n\r\n        protected override AutomationControlType GetAutomationControlTypeCore()\r\n        {\r\n            return AutomationControlType.Window;\r\n        }\r\n\r\n        protected override List<AutomationPeer> GetChildrenCore()\r\n        {\r\n            return emptyList;\r\n        }\r\n    }\r\n\r\n    [TemplatePart(Name = \"PART_ButtonMinimize\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_ButtonMaximize\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_ButtonClose\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_TextTitle\", Type = typeof(TextBlock))]\r\n    public class WindowBase : Window, INotifyPropertyChanged\r\n    {\r\n        public readonly WindowPositionHandler PositionHandler;\r\n        private readonly EmptyWindowAutomationPeer emptyAutomationPeer;\r\n        private HwndSource hwndSource;\r\n        private readonly Dictionary<int, Action> hotKeyHandlers = new Dictionary<int, Action>();\r\n\r\n        private Button MinimizeButton;\r\n        private Button MaximizeButton;\r\n        private Button CloseButton;\r\n        private TextBlock TextTitle;\r\n\r\n        public static TextFormattingMode TextFormattingMode { get; private set; } = TextFormattingMode.Ideal;\r\n        public static TextRenderingMode TextRenderingMode { get; private set; } = TextRenderingMode.Auto;\r\n        public event PropertyChangedEventHandler PropertyChanged;\r\n        public readonly Guid Id = Guid.NewGuid();\r\n\r\n        public static readonly RoutedEvent ClosedRoutedEvent = EventManager.RegisterRoutedEvent(\r\n            \"ClosedRouted\",\r\n            RoutingStrategy.Bubble,\r\n            typeof(RoutedEventHandler),\r\n            typeof(WindowBase));\r\n\r\n        public event RoutedEventHandler ClosedRouted\r\n        {\r\n            add { AddHandler(ClosedRoutedEvent, value); }\r\n            remove { RemoveHandler(ClosedRoutedEvent, value); }\r\n        }\r\n\r\n        public static readonly RoutedEvent LoadedRoutedEvent = EventManager.RegisterRoutedEvent(\r\n            \"LoadedRouted\",\r\n            RoutingStrategy.Bubble,\r\n            typeof(RoutedEventHandler),\r\n            typeof(WindowBase));\r\n\r\n        public event RoutedEventHandler LoadedRouted\r\n        {\r\n            add { AddHandler(LoadedRoutedEvent, value); }\r\n            remove { RemoveHandler(LoadedRoutedEvent, value); }\r\n        }\r\n\r\n        public static readonly RoutedEvent ActivatedRoutedEvent = EventManager.RegisterRoutedEvent(\r\n            \"ActivatedRouted\",\r\n            RoutingStrategy.Bubble,\r\n            typeof(RoutedEventHandler),\r\n            typeof(WindowBase));\r\n\r\n        public event RoutedEventHandler ActivatedRouted\r\n        {\r\n            add { AddHandler(ActivatedRoutedEvent, value); }\r\n            remove { RemoveHandler(ActivatedRoutedEvent, value); }\r\n        }\r\n\r\n        // The reason we currently don't have accessibility/automation interaface enabled is because of performance.\r\n        // For some reason certain controls, like listviews, degrade a lot performance wise when accessibility is enabled.\r\n        // It doesn't seem to be an issue in Playnite itself from my testing (content of listview basically doesn't matter),\r\n        // so most likely WPF bug.\r\n        protected override AutomationPeer OnCreateAutomationPeer()\r\n        {\r\n            var acc = PlayniteApplication.Current?.AppSettings.AccessibilityInterface;\r\n            if (acc != null)\r\n            {\r\n                switch (acc.Value)\r\n                {\r\n                    case AccessibilityInterfaceOptions.Auto:\r\n                        return Computer.GetScreenReaderActive() ? base.OnCreateAutomationPeer() : emptyAutomationPeer;\r\n                    case AccessibilityInterfaceOptions.AlwaysOn:\r\n                        return base.OnCreateAutomationPeer();\r\n                    case AccessibilityInterfaceOptions.AlwaysOff:\r\n                    default:\r\n                        return emptyAutomationPeer;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return emptyAutomationPeer;\r\n            }\r\n        }\r\n\r\n        public bool HasChildWindow\r\n        {\r\n            get => WindowManager.GetHasChild(this);\r\n        }\r\n\r\n        public bool ShowMinimizeButton\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(ShowMinimizeButtonProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ShowMinimizeButtonProperty, value);\r\n            }\r\n        }\r\n\r\n        public bool ShowMaximizeButton\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(ShowMaximizeButtonProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ShowMaximizeButtonProperty, value);\r\n            }\r\n        }\r\n\r\n        public bool ShowCloseButton\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(ShowCloseButtonProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ShowCloseButtonProperty, value);\r\n            }\r\n        }\r\n\r\n        public bool ShowTitle\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(ShowTitleProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ShowTitleProperty, value);\r\n            }\r\n        }\r\n\r\n        public bool BlockAltF4\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(BlockAltF4Property);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(BlockAltF4Property, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ShowMinimizeButtonProperty =\r\n            DependencyProperty.Register(nameof(ShowMinimizeButton), typeof(bool), typeof(WindowBase), new PropertyMetadata(true, ShowMinimizeButtonPropertyChanged));\r\n        public static readonly DependencyProperty ShowMaximizeButtonProperty =\r\n            DependencyProperty.Register(nameof(ShowMaximizeButton), typeof(bool), typeof(WindowBase), new PropertyMetadata(true, ShowMaximizeButtonPropertyChanged));\r\n        public static readonly DependencyProperty ShowCloseButtonProperty =\r\n            DependencyProperty.Register(nameof(ShowCloseButton), typeof(bool), typeof(WindowBase), new PropertyMetadata(true, ShowCloseButtonPropertyChanged));\r\n        public static readonly DependencyProperty ShowTitleProperty =\r\n            DependencyProperty.Register(nameof(ShowTitle), typeof(bool), typeof(WindowBase), new PropertyMetadata(true, ShowTitlePropertyChanged));\r\n        public static readonly DependencyProperty BlockAltF4Property =\r\n            DependencyProperty.Register(nameof(BlockAltF4), typeof(bool), typeof(WindowBase), new PropertyMetadata(false));\r\n\r\n        public bool IsShown { get; private set; }\r\n        public bool WasClosed { get; private set; }\r\n        public IntPtr Handle { get; private set; }\r\n        public bool? DialogResultFixed { get; set; } = null;\r\n\r\n        static WindowBase()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(WindowBase), new FrameworkPropertyMetadata(typeof(WindowBase)));\r\n        }\r\n\r\n        public WindowBase() : base()\r\n        {\r\n            emptyAutomationPeer = new EmptyWindowAutomationPeer(this);\r\n            Style defaultStyle = (Style)Application.Current?.TryFindResource(typeof(WindowBase));\r\n            if (defaultStyle != null)\r\n            {\r\n                Style = defaultStyle;\r\n            }\r\n\r\n            if (Localization.IsRightToLeft)\r\n            {\r\n                FlowDirection = FlowDirection.RightToLeft;\r\n            }\r\n\r\n            TextOptions.SetTextFormattingMode(this, TextFormattingMode);\r\n            TextOptions.SetTextRenderingMode(this, TextRenderingMode);\r\n            Closed += (_, __) =>\r\n            {\r\n                hwndSource?.RemoveHook(HwndHook);\r\n                IsShown = false;\r\n                WasClosed = true;\r\n                RaiseEvent(new RoutedEventArgs(ClosedRoutedEvent));\r\n            };\r\n\r\n            Loaded += (_, __) =>\r\n            {\r\n                Handle = new WindowInteropHelper(this).Handle;\r\n                hwndSource = HwndSource.FromHwnd(Handle);\r\n                hwndSource.AddHook(HwndHook);\r\n                IsShown = true;\r\n                RaiseEvent(new RoutedEventArgs(LoadedRoutedEvent));\r\n            };\r\n\r\n            Activated += (_, __) =>\r\n            {\r\n                RaiseEvent(new RoutedEventArgs(ActivatedRoutedEvent));\r\n            };\r\n\r\n            PreviewKeyDown += (_, e) =>\r\n            {\r\n                if (e.Key == Key.System && e.SystemKey == Key.F4 && BlockAltF4)\r\n                {\r\n                    e.Handled = true;\r\n                }\r\n            };\r\n\r\n            // This fixes an issue if SizeToContent is used on windows with custom WindowChrome (all Playnite windows)\r\n            // https://stackoverflow.com/questions/29207331/wpf-window-with-custom-chrome-has-unwanted-outline-on-right-and-bottom\r\n            SourceInitialized += (_, e) =>\r\n            {\r\n                if (SizeToContent == SizeToContent.WidthAndHeight)\r\n                {\r\n                    InvalidateMeasure();\r\n                }\r\n            };\r\n\r\n            if (PlayniteApplication.Current?.AppSettings != null)\r\n            {\r\n                if (PlayniteApplication.Current.Mode == SDK.ApplicationMode.Fullscreen)\r\n                {\r\n                    IsHitTestVisible = !PlayniteApplication.Current.AppSettings.Fullscreen.HideMouserCursor;\r\n                }\r\n            }\r\n        }\r\n\r\n        public WindowBase(string savePositionName, bool saveSize = true) : this()\r\n        {\r\n            if (PlayniteApplication.Current?.AppSettings != null)\r\n            {\r\n                PositionHandler = new WindowPositionHandler(this, savePositionName, PlayniteApplication.Current.AppSettings.WindowPositions, saveSize);\r\n            }\r\n        }\r\n\r\n        public static void SetTextRenderingOptions(TextFormattingModeOptions formatting, TextRenderingModeOptions rendering)\r\n        {\r\n            TextFormattingMode = (TextFormattingMode)formatting;\r\n            TextRenderingMode = (TextRenderingMode)rendering;\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            if (Template != null)\r\n            {\r\n                MinimizeButton = Template.FindName(\"PART_ButtonMinimize\", this) as Button;\r\n                if (MinimizeButton != null)\r\n                {\r\n                    MinimizeButton.Click += MinimizeButton_Click;\r\n                    MinimizeButton.Visibility = ShowMinimizeButton == true ? Visibility.Visible : Visibility.Collapsed;\r\n                }\r\n\r\n                MaximizeButton = Template.FindName(\"PART_ButtonMaximize\", this) as Button;\r\n                if (MaximizeButton != null)\r\n                {\r\n                    MaximizeButton.Click += MaximizeButton_Click;\r\n                    MaximizeButton.Visibility = ShowMaximizeButton == true ? Visibility.Visible : Visibility.Collapsed;\r\n                }\r\n\r\n                CloseButton = Template.FindName(\"PART_ButtonClose\", this) as Button;\r\n                if (CloseButton != null)\r\n                {\r\n                    CloseButton.Click += CloseButton_Click;\r\n                    CloseButton.Visibility = ShowCloseButton == true ? Visibility.Visible : Visibility.Collapsed;\r\n                }\r\n\r\n                TextTitle = Template.FindName(\"PART_TextTitle\", this) as TextBlock;\r\n                if (TextTitle != null)\r\n                {\r\n                    TextTitle.Visibility = ShowTitle == true ? Visibility.Visible : Visibility.Collapsed;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void CloseButton_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            Close();\r\n        }\r\n\r\n        private void MinimizeButton_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            WindowState = WindowState.Minimized;\r\n        }\r\n\r\n        private void MaximizeButton_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            if (WindowState == WindowState.Maximized)\r\n            {\r\n                WindowState = WindowState.Normal;\r\n            }\r\n            else\r\n            {\r\n                WindowState = WindowState.Maximized;\r\n            }\r\n        }\r\n\r\n        private static void ShowTitlePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var window = (WindowBase)sender;\r\n            if (window.TextTitle != null)\r\n            {\r\n                window.TextTitle.Visibility = (bool)e.NewValue == true ? Visibility.Visible : Visibility.Collapsed;\r\n            }\r\n        }\r\n\r\n        private static void ShowCloseButtonPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var window = (WindowBase)sender;\r\n            if (window.CloseButton != null)\r\n            {\r\n                window.CloseButton.Visibility = (bool)e.NewValue == true ? Visibility.Visible : Visibility.Collapsed;\r\n            }\r\n        }\r\n\r\n        private static void ShowMaximizeButtonPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var window = (WindowBase)sender;\r\n            if (window.MaximizeButton != null)\r\n            {\r\n                window.MaximizeButton.Visibility = (bool)e.NewValue == true ? Visibility.Visible : Visibility.Collapsed;\r\n            }\r\n        }\r\n\r\n        private static void ShowMinimizeButtonPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var window = (WindowBase)sender;\r\n            if (window.MinimizeButton != null)\r\n            {\r\n                window.MinimizeButton.Visibility = (bool)e.NewValue == true ? Visibility.Visible : Visibility.Collapsed;\r\n            }\r\n        }\r\n\r\n        public void OnPropertyChanged([CallerMemberName]string name = null)\r\n        {\r\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));\r\n        }\r\n\r\n        private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)\r\n        {\r\n            if (msg == Winuser.WM_HOTKEY)\r\n            {\r\n                var hotKeyId = wParam.ToInt32();\r\n                if (hotKeyHandlers.TryGetValue(hotKeyId, out var handler))\r\n                {\r\n                    handler();\r\n                    handled = true;\r\n                }\r\n            }\r\n\r\n            return IntPtr.Zero;\r\n        }\r\n\r\n        public void RegisterHotKeyHandler(int hotKeyId, HotKey hotKey, Action handler)\r\n        {\r\n            var success = User32.RegisterHotKey(Handle, hotKeyId, (uint)hotKey.Modifiers, (uint)KeyInterop.VirtualKeyFromKey(hotKey.Key));\r\n            if (success)\r\n            {\r\n                hotKeyHandlers.AddOrUpdate(hotKeyId, handler);\r\n            }\r\n            else\r\n            {\r\n                throw new Win32Exception(Marshal.GetLastWin32Error());\r\n            }\r\n        }\r\n\r\n        public void UnregisterHotKeyHandler(int hotKeyId)\r\n        {\r\n            if (!hotKeyHandlers.ContainsKey(hotKeyId))\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (WasClosed)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var success = User32.UnregisterHotKey(Handle, hotKeyId);\r\n            if (success)\r\n            {\r\n                hotKeyHandlers.Remove(hotKeyId);\r\n            }\r\n            else\r\n            {\r\n                throw new Win32Exception(Marshal.GetLastWin32Error());\r\n            }\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/Converters/BidirectionalEnumAndNumberConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class BidirectionalEnumAndNumberConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            if (targetType.IsEnum)\r\n            {\r\n                // Convert int to enum\r\n                return Enum.ToObject(targetType, value);\r\n            }\r\n\r\n            if (value.GetType().IsEnum)\r\n            {\r\n                // Convert enum to int\r\n                return System.Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()));\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            // Perform the same conversion in both directions\r\n            return Convert(value, targetType, parameter, culture);\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/BoolToAutoWidthConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class BoolToAutoWidthConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is bool boolValue)\r\n                return boolValue ? Double.NaN : 0;\r\n\r\n            return 0;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/BoolToYesNoConverter.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class BoolToYesNoConverter : MarkupExtension, IValueConverter\r\n    {\r\n        private readonly string yesString;\r\n        private readonly string noString;\r\n\r\n        public BoolToYesNoConverter()\r\n        {\r\n            yesString = ResourceProvider.GetString(\"LOCYesLabel\");\r\n            noString = ResourceProvider.GetString(\"LOCNoLabel\");\r\n        }\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is bool boolValue)\r\n                return boolValue ? yesString : noString;\r\n\r\n            return noString;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/BooleanToHiddenConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class BooleanToHiddenConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is bool boolValue)\r\n                return boolValue ? Visibility.Visible : Visibility.Hidden;\r\n\r\n            return Visibility.Hidden;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is Visibility visibility)\r\n                return visibility == Visibility.Visible;\r\n\r\n            return false;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/BooleanToVisibilityConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    [ValueConversion(typeof(bool), typeof(Visibility))]\r\n    public class BooleanToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public static BooleanToVisibilityConverter Instance { get; } = new BooleanToVisibilityConverter();\r\n\r\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return Visibility.Collapsed;\r\n            }\r\n\r\n            return ((bool)value) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            return ((Visibility)value) == Visibility.Visible ? true : false;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class MultiBooleanToVisibilityConverter : MarkupExtension, IMultiValueConverter\r\n    {\r\n        public static MultiBooleanToVisibilityConverter Instance { get; } = new MultiBooleanToVisibilityConverter();\r\n\r\n        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            if (values == null)\r\n            {\r\n                return Visibility.Collapsed;\r\n            }\r\n\r\n            return values.All(a => a is bool val && val == true) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/CoversZoomToPercentageConverter.cs",
    "content": "﻿using Playnite.Settings;\r\nusing System;\r\nusing System.Globalization;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class CoversZoomToPercentageConverter : MarkupExtension, IValueConverter\r\n    {\r\n        private const double OneHundredPercentValue = ViewSettings.DefaultGridItemWidth;\r\n\r\n        // raw pixel value to percentage\r\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            if (value is null)\r\n                return 100;\r\n\r\n            var source = (double)value;\r\n            return Math.Round(source / OneHundredPercentValue * 100);\r\n        }\r\n\r\n        // percentage to raw pixel value\r\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            if (value is null)\r\n                return OneHundredPercentValue;\r\n\r\n            var source = (double)value;\r\n            return Math.Round(source * OneHundredPercentValue / 100);\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/Converters/DateTimeToLastPlayedConverter.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class DateTimeToLastPlayedConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public static readonly DateTimeToLastPlayedConverter Instance = new DateTimeToLastPlayedConverter();\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            var lastPlayed = (DateTime?)value;\r\n            if (lastPlayed == null)\r\n            {\r\n                return LOC.Never.GetLocalized();\r\n            }\r\n\r\n            if (parameter is DateFormattingOptions options)\r\n            {\r\n                return lastPlayed.Value.ToDisplayString(options);\r\n            }\r\n\r\n            return lastPlayed.Value.ToString(Common.Constants.DateUiFormat);\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/DockToStringConverter.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\nusing System.Windows.Media;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class DockToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public static string GetString(Dock value)\r\n        {\r\n            switch (value)\r\n            {\r\n                case Dock.Left:\r\n                    return ResourceProvider.GetString(\"LOCDockLeft\");\r\n                case Dock.Right:\r\n                    return ResourceProvider.GetString(\"LOCDockRight\");\r\n                case Dock.Top:\r\n                    return ResourceProvider.GetString(\"LOCDockTop\");\r\n                case Dock.Bottom:\r\n                    return ResourceProvider.GetString(\"LOCDockBottom\");\r\n            }\r\n\r\n            return \"<UknownDockMode>\";\r\n        }\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is Dock dockValue)\r\n                return GetString(dockValue);\r\n\r\n            return \"<UknownDockMode>\";\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/EnumToBooleanConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class EnumToBooleanConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return value.Equals(parameter);\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return value.Equals(true) ? parameter : Binding.DoNothing;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/EnumToVisibilityConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class EnumToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return value.Equals(parameter) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/GenericTypeConverter.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class GenericTypeConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public IValueConverter CustomConverter { get; set; }\r\n        public string StringFormat { get; set; }\r\n        public bool TestAsFilePath { get; set; }\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            try\r\n            {\r\n                object actualValue = value;\r\n                if (!StringFormat.IsNullOrEmpty() && value is string)\r\n                {\r\n                    actualValue = string.Format(StringFormat, value);\r\n                }\r\n\r\n                if (CustomConverter != null)\r\n                {\r\n                    if (TestAsFilePath && actualValue is string filePath)\r\n                    {\r\n                        if (File.Exists(filePath))\r\n                        {\r\n                            return CustomConverter.Convert(filePath, targetType, parameter, culture);\r\n                        }\r\n                        else\r\n                        {\r\n                            return DependencyProperty.UnsetValue;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        return CustomConverter.Convert(actualValue, targetType, parameter, culture);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    var converter = TypeDescriptor.GetConverter(targetType);\r\n                    if (TestAsFilePath && actualValue is string filePath)\r\n                    {\r\n                        if (File.Exists(filePath))\r\n                        {\r\n                            return converter.ConvertFrom(filePath);\r\n                        }\r\n                        else\r\n                        {\r\n                            return DependencyProperty.UnsetValue;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        return converter.ConvertFrom(actualValue);\r\n                    }\r\n                }\r\n            }\r\n            catch\r\n            {\r\n                return DependencyProperty.UnsetValue;\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/ICollectionNullOrEmptyToVisibilityConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class ICollectionNullOrEmptyToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is ICollection collection)\r\n                return collection.Count == 0 ? Visibility.Collapsed : Visibility.Visible;\r\n\r\n            return Visibility.Collapsed;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/IconToImageSourceConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing System.Windows;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class PluginIconSourceToElementConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return SdkHelpers.ResolveUiItemIcon(value);\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class IconToImageSourceConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return DependencyProperty.UnsetValue;\r\n            }\r\n\r\n            var icon = (Icon)value;\r\n            return icon.ToImageSource();\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/ImageStringToImageConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Media.Imaging;\r\nusing Playnite.Database;\r\nusing NLog;\r\nusing System.IO;\r\nusing Playnite;\r\nusing System.Windows.Markup;\r\nusing Playnite.Common.Web;\r\nusing Playnite.Settings;\r\nusing System.Collections.Concurrent;\r\nusing System.Collections.Specialized;\r\nusing Playnite.Common;\r\nusing System.Drawing.Imaging;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class ImageStringToImageConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public bool Cached { get; set; }\r\n\r\n        public ImageStringToImageConverter()\r\n        {\r\n        }\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return DependencyProperty.UnsetValue;\r\n            }\r\n\r\n            var image = ImageSourceManager.GetImage((string)value, Cached);\r\n            return image ?? DependencyProperty.UnsetValue;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/IntToVisibilityConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class IntToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is null || parameter is null)\r\n                return Visibility.Collapsed;\r\n\r\n            var param = (int)parameter;\r\n            var val = (int)value;\r\n            if (val == param)\r\n            {\r\n                return Visibility.Visible;\r\n            }\r\n            else\r\n            {\r\n                return Visibility.Collapsed;\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class InvertedIntToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is null || parameter is null)\r\n                return Visibility.Visible;\r\n\r\n            var param = (int)parameter;\r\n            var val = (int)value;\r\n            if (val != param)\r\n            {\r\n                return Visibility.Visible;\r\n            }\r\n            else\r\n            {\r\n                return Visibility.Collapsed;\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/InvertableBooleanToVisibilityConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    [ValueConversion(typeof(bool), typeof(Visibility))]\r\n    public class InvertedBooleanToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            if (value is bool boolValue)\r\n                return boolValue ? Visibility.Collapsed : Visibility.Visible;\r\n\r\n            return Visibility.Visible;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    [ValueConversion(typeof(bool), typeof(Visibility))]\r\n    public class InvertableBooleanToVisibilityConverter : IValueConverter\r\n    {\r\n        enum Parameters\r\n        {\r\n            Normal, Inverted\r\n        }\r\n\r\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            if (value is bool boolValue)\r\n            {\r\n                var direction = (Parameters)Enum.Parse(typeof(Parameters), (string)parameter);\r\n                if (direction == Parameters.Inverted)\r\n                {\r\n                    return !boolValue ? Visibility.Visible : Visibility.Collapsed;\r\n                }\r\n\r\n                return boolValue ? Visibility.Visible : Visibility.Collapsed;\r\n            }\r\n\r\n            return Visibility.Collapsed;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            return null;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/InvertedBoolenConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class InvertedBoolenConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            if (value is bool boolValue)\r\n                return !boolValue;\r\n\r\n            return false;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            if (value is bool boolValue)\r\n                return !boolValue;\r\n\r\n            return false;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/ListToStringConverter.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class ListSizeToBoolConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is IList<dynamic> list)\r\n            {\r\n                return list.Count > 0;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class ListSizeToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is System.Collections.IList list)\r\n            {\r\n                return list.Count > 0 ? Visibility.Visible : Visibility.Collapsed;\r\n            }\r\n            else\r\n            {\r\n                return Visibility.Collapsed;\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class NiceListToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            if (value is IEnumerable<dynamic>)\r\n            {\r\n                return string.Join(\", \", (IEnumerable<object>)value);\r\n            }\r\n            else\r\n            {\r\n                return value.ToString();\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is string stringVal && !stringVal.IsNullOrEmpty())\r\n            {\r\n                var converted = stringVal.Split(new char[] { ',' }).Select(a => a.Trim());\r\n                if (targetType == typeof(ComparableList<string>))\r\n                {\r\n                    return new ComparableList<string>(converted);\r\n                }\r\n                else\r\n                {\r\n                    return converted.ToList();\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class ListToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        private const string defaultSeperator = \",\";\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            var sep = defaultSeperator;\r\n            if (parameter is string customSep)\r\n            {\r\n                sep = customSep;\r\n            }\r\n\r\n            if (value is IEnumerable<dynamic>)\r\n            {\r\n                return string.Join(sep, (IEnumerable<object>)value);\r\n            }\r\n            else\r\n            {\r\n                return value.ToString();\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is string stringVal && !stringVal.IsNullOrEmpty())\r\n            {\r\n                var sep = defaultSeperator;\r\n                if (parameter is string customSep)\r\n                {\r\n                    sep = customSep;\r\n                }\r\n\r\n                var converted = stringVal.Split(new [] { sep }, StringSplitOptions.None);\r\n                if (targetType == typeof(ComparableList<string>))\r\n                {\r\n                    return new ComparableList<string>(converted);\r\n                }\r\n                if (targetType == typeof(ObservableCollection<string>))\r\n                {\r\n                    return new ObservableCollection<string>(converted);\r\n                }\r\n                else\r\n                {\r\n                    return converted.ToList();\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class ListToMultilineStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        private readonly string[] splitter = new string[] { \"\\n\" };\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            if (value is IEnumerable<dynamic>)\r\n            {\r\n                return string.Join(\"\\n\", (IEnumerable<object>)value);\r\n            }\r\n            else\r\n            {\r\n                return value.ToString();\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is string stringVal && !stringVal.IsNullOrEmpty())\r\n            {\r\n                var converted = stringVal.Split(splitter, StringSplitOptions.None).Select(a => a.Trim('\\r')).ToArray();\r\n                if (targetType == typeof(ComparableList<string>))\r\n                {\r\n                    return new ComparableList<string>(converted);\r\n                }\r\n                if (targetType == typeof(ObservableCollection<string>))\r\n                {\r\n                    return new ObservableCollection<string>(converted);\r\n                }\r\n                else\r\n                {\r\n                    return converted.ToList();\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/NegateConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class NegateConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is bool boolValue)\r\n                return !boolValue;\r\n\r\n            return false;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is bool boolValue)\r\n                return !boolValue;\r\n\r\n            return false;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/NotificationIconConverter.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class NotificationIconConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is NotificationType icon)\r\n                switch (icon)\r\n                {\r\n                    case NotificationType.Info:\r\n                        return @\"/Images/Icons/info.png\";\r\n                    case NotificationType.Error:\r\n                        return @\"/Images/Icons/warn.png\";\r\n                }\r\n\r\n            return null;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/NullToBoolConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class NullToBoolConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public static NullToBoolConverter Instance { get; } = new NullToBoolConverter();\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                return true;\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/NullToDependencyPropertyUnsetConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class NullToDependencyPropertyUnsetConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return value ?? DependencyProperty.UnsetValue;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/NullToVisibilityConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class NullToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return Visibility.Collapsed;\r\n            }\r\n            else\r\n            {\r\n                return Visibility.Visible;\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class InvertedNullToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return Visibility.Visible;\r\n            }\r\n            else\r\n            {\r\n                return Visibility.Collapsed;\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/NullableDateToStringConverter.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class NullableDateToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public static readonly NullableDateToStringConverter Instance = new NullableDateToStringConverter();\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            if (value is DateTime date)\r\n            {\r\n                if (parameter is DateFormattingOptions options)\r\n                {\r\n                    return date.ToDisplayString(options);\r\n                }\r\n\r\n                return date.ToString(Common.Constants.DateUiFormat);\r\n            }\r\n            else\r\n            {\r\n                return string.Empty;\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (string.IsNullOrEmpty(value as string))\r\n            {\r\n                return null;\r\n            }\r\n\r\n            var sucess = DateTime.TryParseExact(value as string, Common.Constants.DateUiFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var newDate);\r\n            if (sucess)\r\n            {\r\n                return newDate;\r\n            }\r\n            else\r\n            {\r\n                return DependencyProperty.UnsetValue;\r\n            }\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class ReleaseDateToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public static readonly ReleaseDateToStringConverter Instance = new ReleaseDateToStringConverter();\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is ReleaseDate date)\r\n            {\r\n                if (parameter is ReleaseDateFormattingOptions options)\r\n                {\r\n                    return date.ToDisplayString(options);\r\n                }\r\n                else if (date.Month != null && date.Day != null)\r\n                {\r\n                    return date.Date.ToString(Common.Constants.DateUiFormat);\r\n                }\r\n                else\r\n                {\r\n                    return date.Serialize();\r\n                }\r\n            }\r\n            else if (value == null)\r\n            {\r\n                return string.Empty;\r\n            }\r\n            else\r\n            {\r\n                throw new NotSupportedException();\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            var str = value as string;\r\n            if (str.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return ReleaseDate.Deserialize(str);\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class EditingReleaseDateToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is ReleaseDate date)\r\n            {\r\n                return date.Serialize();\r\n            }\r\n            else if (value == null)\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                throw new NotSupportedException();\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            var str = value as string;\r\n            if (str.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return ReleaseDate.Deserialize(str);\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class ReleaseDateFieldValidation : ValidationRule\r\n    {\r\n        private const string InvalidInput = \"Release date must be in year-month-day format!\";\r\n\r\n        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)\r\n        {\r\n            if (!string.IsNullOrEmpty((string)value))\r\n            {\r\n                if (!ReleaseDate.TryDeserialize((string)value, out var _))\r\n                {\r\n                    return new ValidationResult(false, InvalidInput);\r\n                }\r\n            }\r\n\r\n            return new ValidationResult(true, null);\r\n        }\r\n    }\r\n\r\n    public class DateTimeFormatToStringValidation : ValidationRule\r\n    {\r\n        private const string InvalidFormatInput = \"Format does not contain a valid custom format pattern!\";\r\n        private const string InvalidArgumentRangeInput = \"The date and time is outside the range of dates supported!\";\r\n        private static DateTime TestDate = DateTime.Now;\r\n\r\n        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)\r\n        {\r\n            var str = (string)value;\r\n            try\r\n            {\r\n                TestDate.ToString(str);\r\n                return new ValidationResult(true, null);\r\n            }\r\n            catch (FormatException)\r\n            {\r\n                return new ValidationResult(false, InvalidFormatInput);\r\n            }\r\n            catch (ArgumentOutOfRangeException)\r\n            {\r\n                return new ValidationResult(false, InvalidArgumentRangeInput);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/NullableUlongBytesSizeToStringConverter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Data;\nusing System.Windows.Markup;\n\nnamespace Playnite.Converters\n{\n    public class NullableUlongBytesSizeToStringConverter : MarkupExtension, IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n        {\n            if (value == null)\n            {\n                return string.Empty;\n            }\n\n            if (value is ulong bytes)\n            {\n                string suffix;\n                double readable;\n                if (bytes >= 0x1000000000000000) // Exabyte\n                {\n                    suffix = \"EB\";\n                    readable = (bytes >> 50);\n                }\n                else if (bytes >= 0x4000000000000) // Petabyte\n                {\n                    suffix = \"PB\";\n                    readable = bytes >> 40;\n                }\n                else if (bytes >= 0x10000000000) // Terabyte\n                {\n                    suffix = \"TB\";\n                    readable = bytes >> 30;\n                }\n                else if (bytes >= 0x40000000) // Gigabyte\n                {\n                    suffix = \"GB\";\n                    readable = bytes >> 20;\n                }\n                else if (bytes >= 0x100000) // Megabyte\n                {\n                    suffix = \"MB\";\n                    readable = bytes >> 10;\n                }\n                else if (bytes >= 0x400) // Kilobyte\n                {\n                    suffix = \"KB\";\n                    readable = bytes;\n                }\n                else\n                {\n                    return bytes.ToString(\"0 B\"); // Byte\n                }\n\n                readable /= 1024;\n                return readable.ToString(\"0.00# \") + suffix;\n            }\n            else\n            {\n                return string.Empty;\n            }\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n        {\n            throw new NotSupportedException();\n        }\n\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            return this;\n        }\n    }\n}"
  },
  {
    "path": "source/Playnite/Converters/NumericConverters.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    #region ulong\r\n\r\n    public class UlongToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                throw new NotSupportedException();\r\n            }\r\n            else if (value is ulong num)\r\n            {\r\n                return num.ToString();\r\n            }\r\n\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            var str = (string)value;\r\n            if (str.IsNullOrEmpty())\r\n            {\r\n                throw new NotSupportedException();\r\n            }\r\n            else\r\n            {\r\n                return ulong.Parse(str);\r\n            }\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class UlongFieldValidation : ValidationRule\r\n    {\r\n        private string invalidInput => $\"Not an ulong value in {MinValue} to {MaxValue} range!\";\r\n\r\n        public ulong MinValue { get; set; } = 0;\r\n        public ulong MaxValue { get; set; } = ulong.MaxValue;\r\n\r\n        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return new ValidationResult(true, null);\r\n            }\r\n            else\r\n            {\r\n                var str = (string)value;\r\n                if (str.IsNullOrEmpty())\r\n                {\r\n                    return new ValidationResult(false, invalidInput);\r\n                }\r\n\r\n                if (ulong.TryParse(str, out var intVal) && intVal >= MinValue && intVal <= MaxValue)\r\n                {\r\n                    return new ValidationResult(true, null);\r\n                }\r\n\r\n                return new ValidationResult(false, invalidInput);\r\n            }\r\n        }\r\n    }\r\n\r\n    #endregion ulong\r\n\r\n    #region null int\r\n\r\n    public class NullableIntToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return string.Empty;\r\n            }\r\n            else if (value is int num)\r\n            {\r\n                return num.ToString();\r\n            }\r\n\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            var str = (string)value;\r\n            if (str.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                return int.Parse(str);\r\n            }\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class NullableIntFieldValidation : ValidationRule\r\n    {\r\n        private string invalidInput => $\"Not an integer value in {MinValue} to {MaxValue} range!\";\r\n\r\n        public int MinValue { get; set; } = 0;\r\n        public int MaxValue { get; set; } = int.MaxValue;\r\n\r\n        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return new ValidationResult(true, null);\r\n            }\r\n            else\r\n            {\r\n                var str = (string)value;\r\n                if (str.IsNullOrEmpty())\r\n                {\r\n                    return new ValidationResult(true, null);\r\n                }\r\n\r\n                if (int.TryParse(str, out var intVal) && intVal >= MinValue && intVal <= MaxValue)\r\n                {\r\n                    return new ValidationResult(true, null);\r\n                }\r\n\r\n                return new ValidationResult(false, invalidInput);\r\n            }\r\n        }\r\n    }\r\n\r\n    #endregion null int\r\n\r\n    #region null ulong\r\n\r\n    public class NullableUlongToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return string.Empty;\r\n            }\r\n            else if (value is ulong num)\r\n            {\r\n                return num.ToString();\r\n            }\r\n\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            var str = (string)value;\r\n            if (str.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                return ulong.Parse(str);\r\n            }\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class NullableUlongFieldValidation : ValidationRule\r\n    {\r\n        private string invalidInput => $\"Not a long value in {MinValue} to {MaxValue} range!\";\r\n\r\n        public ulong MinValue { get; set; } = ulong.MinValue;\r\n        public ulong MaxValue { get; set; } = ulong.MaxValue;\r\n\r\n        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return new ValidationResult(true, null);\r\n            }\r\n            else\r\n            {\r\n                var str = (string)value;\r\n                if (str.IsNullOrEmpty())\r\n                {\r\n                    return new ValidationResult(true, null);\r\n                }\r\n\r\n                if (ulong.TryParse(str, out var ulongVal) && ulongVal >= MinValue && ulongVal <= MaxValue)\r\n                {\r\n                    return new ValidationResult(true, null);\r\n                }\r\n\r\n                return new ValidationResult(false, invalidInput);\r\n            }\r\n        }\r\n    }\r\n\r\n    #endregion null ulong\r\n}"
  },
  {
    "path": "source/Playnite/Converters/ObjectEqualityToBoolConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class ObjectEqualityToBoolConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return value?.Equals(parameter) == true;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return value?.Equals(true) == true ? parameter : Binding.DoNothing;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class InvertedObjectEqualityToBoolConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return value?.Equals(parameter) != true;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return value?.Equals(true) != true ? parameter : Binding.DoNothing;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class ObjectEqualityToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return value?.Equals(parameter) == true ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class InvertedObjectEqualityToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return value?.Equals(parameter) != true ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/ObjectToStringConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\nusing System.Windows.Media;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class ObjectToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                if (value is Enum enumVar)\r\n                {\r\n                    return enumVar.GetDescription();\r\n                }\r\n                else\r\n                {\r\n                    return value.ToString();\r\n                }\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/OpacityBoolConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class OpacityBoolConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is bool boolValue)\r\n            {\r\n                if (parameter != null && ((bool)parameter) == true)\r\n                    boolValue = !boolValue;\r\n\r\n                return boolValue ? 1.0 : 0.5;\r\n            }\r\n\r\n            return 0.5;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is null)\r\n                throw new NotSupportedException();\r\n\r\n            var val = (double)value;\r\n            if (val <= 0.5)\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                return true;\r\n            }\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/PlayTimeToStringConverter.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class PlayTimeToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public static PlayTimeToStringConverter Instance { get; } = new PlayTimeToStringConverter();\r\n\r\n        private static string LOCPlayedNoneString;\r\n        private static string LOCPlayedNone;\r\n        private static string LOCPlayedSeconds;\r\n        private static string LOCPlayedMinutes;\r\n        private static string LOCPlayedHours;\r\n        private static string LOCPlayedDays;\r\n\r\n        private static void CacheStrings()\r\n        {\r\n            if (LOCPlayedNoneString != null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            LOCPlayedNoneString = ResourceProvider.GetString(\"LOCPlayedNoneString\");\r\n            LOCPlayedNone = ResourceProvider.GetString(\"LOCPlayedNone\");\r\n            LOCPlayedSeconds = ResourceProvider.GetString(\"LOCPlayedSeconds\");\r\n            LOCPlayedMinutes = ResourceProvider.GetString(\"LOCPlayedMinutes\");\r\n            LOCPlayedHours = ResourceProvider.GetString(\"LOCPlayedHours\");\r\n            LOCPlayedDays = ResourceProvider.GetString(\"LOCPlayedDays\");\r\n        }\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            CacheStrings();\r\n            if (value == null)\r\n            {\r\n                return LOCPlayedNone;\r\n            }\r\n\r\n            var seconds = (ulong)value;\r\n            if (seconds == 0)\r\n            {\r\n                return LOCPlayedNone;\r\n            }\r\n\r\n            // Can't use TimeSpan from seconds because ulong is too large for it\r\n            if (seconds < 60)\r\n            {\r\n                return string.Format(LOCPlayedSeconds, seconds);\r\n            }\r\n\r\n            var minutes = seconds / 60;\r\n            if (minutes < 60)\r\n            {\r\n                return string.Format(LOCPlayedMinutes, minutes);\r\n            }\r\n\r\n            var hours = minutes / 60;\r\n            if (parameter is bool formatToDays && formatToDays && hours >= 24)\r\n            {\r\n                var days = hours / 24;\r\n                var remainingHours = hours % 24;\r\n                var remainingMinutes = minutes % 60;\r\n\r\n                return string.Format(LOCPlayedDays, days, remainingHours, remainingMinutes);\r\n            }\r\n\r\n            return string.Format(LOCPlayedHours, hours, minutes - (hours * 60));\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/SortingOrderToStringConverter.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class SortingOrderToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is SortOrder order)\r\n                return order.GetDescription();\r\n\r\n            return \"no sort order passed!\";\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/StrechToStringConverter.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\nusing System.Windows.Media;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class StrechToStringConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is Stretch stretch)\r\n                switch (stretch)\r\n                {\r\n                    case Stretch.None:\r\n                        return ResourceProvider.GetString(\"LOCStrechNone\");\r\n                    case Stretch.Fill:\r\n                        return ResourceProvider.GetString(\"LOCStrechFill\");\r\n                    case Stretch.Uniform:\r\n                        return ResourceProvider.GetString(\"LOCStrechUniform\");\r\n                    case Stretch.UniformToFill:\r\n                        return ResourceProvider.GetString(\"LOCStrechUniformToFill\");\r\n                }\r\n\r\n            return \"<UknownStrechMode>\";\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/StringNullOrEmptyToBoolConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class StringNullOrEmptyToBoolConverter : MarkupExtension, IValueConverter\r\n    {\r\n        enum Parameters\r\n        {\r\n            Normal, Inverted\r\n        }\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            var direction = parameter == null ? Parameters.Normal : (Parameters)Enum.Parse(typeof(Parameters), (string)parameter);\r\n            if (direction == Parameters.Inverted)\r\n            {\r\n                return string.IsNullOrEmpty(value as string) ? true : false;\r\n            }\r\n            else\r\n            {\r\n                return string.IsNullOrEmpty(value as string) ? false : true;\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/StringNullOrEmptyToVisibilityConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class StringNullOrEmptyToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        enum Parameters\r\n        {\r\n            Normal, Inverted\r\n        }\r\n\r\n        public static StringNullOrEmptyToVisibilityConverter Instance { get; } = new StringNullOrEmptyToVisibilityConverter();\r\n\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            var direction = parameter == null ? Parameters.Normal : (Parameters)Enum.Parse(typeof(Parameters), (string)parameter);\r\n            if (direction == Parameters.Inverted)\r\n            {\r\n                return string.IsNullOrEmpty(value as string) ? Visibility.Visible : Visibility.Collapsed;\r\n            }\r\n            else\r\n            {\r\n                return string.IsNullOrEmpty(value as string) ? Visibility.Collapsed : Visibility.Visible;\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/StringToUpperCaseConverter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Data;\nusing System.Windows.Markup;\n\nnamespace Playnite.Converters\n{\n    public class StringToUpperCaseConverter : MarkupExtension, IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n        {\n            if (value is string str && !str.IsNullOrEmpty())\n                return str.ToUpperInvariant();\n\n            return string.Empty;\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\n        {\n            return new NotSupportedException();\n        }\n\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            return this;\n        }\n    }\n}"
  },
  {
    "path": "source/Playnite/Converters/TicksToTimeSpanConverter.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class TicksToTimeSpanConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is int intValue)\r\n            {\r\n                return new TimeSpan(intValue);\r\n            }\r\n            else if (value is long longValue)\r\n            {\r\n                return new TimeSpan(longValue);\r\n            }\r\n            else\r\n            {\r\n                throw new NotSupportedException();\r\n            }\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is TimeSpan timeSpan)\r\n            {\r\n                return timeSpan.Ticks;\r\n            }\r\n            else\r\n            {\r\n                throw new NotSupportedException();\r\n            }\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/ValueConverterGroup.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class ValueConverterGroup : List<IValueConverter>, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            return this.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Converters/WidthToFontSizeConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Converters\r\n{\r\n    public class WidthToFontSizeConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            if (value is null)\r\n                throw new NotSupportedException();\r\n\r\n            var width = (double)value;\r\n            return width / 10;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/AgeRatingsCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class AgeRatingsCollection : ItemCollection<AgeRating>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public AgeRatingsCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.AgeRatings)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<AgeRating>().Id(a => a.Id, false);\r\n        }\r\n\r\n        private void RemoveUsage(Guid ageRatingId)\r\n        {\r\n            foreach (var game in db.Games.Where(a => a.AgeRatingIds?.Contains(ageRatingId) == true))\r\n            {\r\n                game.AgeRatingIds.Remove(ageRatingId);\r\n                db.Games.Update(game);\r\n            }\r\n        }\r\n\r\n        public override bool Remove(AgeRating itemToRemove)\r\n        {\r\n            RemoveUsage(itemToRemove.Id);\r\n            return base.Remove(itemToRemove);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<AgeRating> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                }\r\n            }\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/AppSoftwareCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class AppSoftwareCollection : ItemCollection<AppSoftware>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public AppSoftwareCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.AppSoftware)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<AppSoftware>().Id(a => a.Id, false);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            var dbItem = Get(id);\r\n            db.RemoveFile(dbItem.Icon);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(AppSoftware item)\r\n        {\r\n            return Remove(item.Id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<AppSoftware> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    var dbItem = Get(item.Id);\r\n                    db.RemoveFile(dbItem.Icon);\r\n                }\r\n            }\r\n\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n\r\n        public override void Update(IEnumerable<AppSoftware> items)\r\n        {\r\n            foreach (var item in items)\r\n            {\r\n                var dbItem = Get(item.Id);\r\n                if (!dbItem.Icon.IsNullOrEmpty() && dbItem.Icon != item.Icon)\r\n                {\r\n                    db.RemoveFile(dbItem.Icon);\r\n                }\r\n            }\r\n\r\n            base.Update(items);\r\n        }\r\n\r\n        public override void Update(AppSoftware item)\r\n        {\r\n            var dbItem = Get(item.Id);\r\n            if (!dbItem.Icon.IsNullOrEmpty() && dbItem.Icon != item.Icon)\r\n            {\r\n                db.RemoveFile(dbItem.Icon);\r\n            }\r\n\r\n            base.Update(item);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/CategoriesCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class CategoriesCollection : ItemCollection<Category>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public CategoriesCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.Categories)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<Category>().Id(a => a.Id, false);\r\n        }\r\n\r\n        private void RemoveUsage(Guid categoryId)\r\n        {\r\n            foreach (var game in db.Games.Where(a => a.CategoryIds?.Contains(categoryId) == true))\r\n            {\r\n                game.CategoryIds.Remove(categoryId);\r\n                db.Games.Update(game);\r\n            }\r\n        }\r\n\r\n        public override bool Remove(Category itemToRemove)\r\n        {\r\n            RemoveUsage(itemToRemove.Id);\r\n            return base.Remove(itemToRemove);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<Category> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                }\r\n            }\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/CompaniesCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class CompaniesCollection : ItemCollection<Company>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public CompaniesCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.Companies)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<Company>().Id(a => a.Id, false);\r\n        }\r\n\r\n        private void RemoveUsage(Guid companyId)\r\n        {\r\n            foreach (var game in db.Games)\r\n            {\r\n                var modified = false;\r\n                if (game.PublisherIds?.Contains(companyId) == true)\r\n                {\r\n                    game.PublisherIds.Remove(companyId);\r\n                    modified = true;\r\n                }\r\n\r\n                if (game.DeveloperIds?.Contains(companyId) == true)\r\n                {\r\n                    game.DeveloperIds.Remove(companyId);\r\n                    modified = true;\r\n                }\r\n\r\n                if (modified)\r\n                {\r\n                    db.Games.Update(game);\r\n                }\r\n            }\r\n        }\r\n\r\n        public override bool Remove(Company itemToRemove)\r\n        {\r\n            RemoveUsage(itemToRemove.Id);\r\n            return base.Remove(itemToRemove);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<Company> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                }\r\n            }\r\n\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/CompletionStatusesCollection.cs",
    "content": "﻿using LiteDB;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class CompletionStatusSettings\r\n    {\r\n        [BsonId(false)]\r\n        public int Id { get; set; } = 0;\r\n        public Guid DefaultStatus { get; set; }\r\n        public Guid PlayedStatus { get; set; }\r\n    }\r\n\r\n    public class CompletionStatusesCollection : ItemCollection<CompletionStatus>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        private LiteCollection<CompletionStatusSettings> settingsCollection;\r\n        private LiteCollection<CompletionStatusSettings> SettingsCollection\r\n        {\r\n            get\r\n            {\r\n                if (settingsCollection == null)\r\n                {\r\n                    settingsCollection = liteDb.GetCollection<CompletionStatusSettings>();\r\n                }\r\n\r\n                return settingsCollection;\r\n            }\r\n        }\r\n\r\n        public CompletionStatusesCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.CompletionStatuses)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public CompletionStatusSettings GetSettings()\r\n        {\r\n            if (SettingsCollection.Count() == 0)\r\n            {\r\n                var settings = new CompletionStatusSettings();\r\n                SettingsCollection.Insert(settings);\r\n                return settings;\r\n            }\r\n            else\r\n            {\r\n                return SettingsCollection.FindAll().First();\r\n            }\r\n        }\r\n\r\n        public void SetSettings(CompletionStatusSettings settings)\r\n        {\r\n            settings.Id = 0;\r\n            SettingsCollection.Upsert(settings);\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<CompletionStatus>().Id(a => a.Id, false);\r\n        }\r\n\r\n        private void RemoveUsage(Guid statusId)\r\n        {\r\n            foreach (var game in db.Games.Where(a => a.CompletionStatusId == statusId))\r\n            {\r\n                game.CompletionStatusId = Guid.Empty;\r\n                db.Games.Update(game);\r\n            }\r\n        }\r\n\r\n        public override bool Remove(CompletionStatus itemToRemove)\r\n        {\r\n            RemoveUsage(itemToRemove.Id);\r\n            return base.Remove(itemToRemove);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<CompletionStatus> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                }\r\n            }\r\n\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/EmulatorsCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class EmulatorsCollection : ItemCollection<Emulator>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public EmulatorsCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.Emulators)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<Emulator>().\r\n                Id(a => a.Id, false).\r\n                Ignore(a => a.SelectableProfiles).\r\n                Ignore(a => a.AllProfiles);\r\n            mapper.Entity<BuiltInEmulatorProfile>().\r\n                Ignore(a => a.Type);\r\n            mapper.Entity<CustomEmulatorProfile>().\r\n                Ignore(a => a.Type);\r\n        }\r\n\r\n        private void RemoveUsage(Guid id)\r\n        {\r\n            foreach (var game in db.Games)\r\n            {\r\n                if (game.GameActions.HasItems())\r\n                {\r\n                    foreach (var action in game.GameActions)\r\n                    {\r\n                        if (action?.Type == GameActionType.Emulator && action?.EmulatorId == id)\r\n                        {\r\n                            action.EmulatorId = Guid.Empty;\r\n                            action.EmulatorProfileId = null;\r\n                            db.Games.Update(game);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public override bool Remove(Emulator itemToRemove)\r\n        {\r\n            RemoveUsage(itemToRemove.Id);\r\n            return base.Remove(itemToRemove);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<Emulator> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                }\r\n            }\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n\r\n        public override Emulator Add(string itemName)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override Emulator Add(string itemName, Func<Emulator, string, bool> existingComparer)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override IEnumerable<Emulator> Add(List<string> items)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override IEnumerable<Emulator> Add(List<string> itemsToAdd, Func<Emulator, string, bool> existingComparer)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/FeaturesCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class FeaturesCollection : ItemCollection<GameFeature>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public FeaturesCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.Features)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<GameFeature>().Id(a => a.Id, false);\r\n        }\r\n\r\n        private void RemoveUsage(Guid id)\r\n        {\r\n            foreach (var game in db.Games.Where(a => a.FeatureIds?.Contains(id) == true))\r\n            {\r\n                game.FeatureIds.Remove(id);\r\n                db.Games.Update(game);\r\n            }\r\n        }\r\n\r\n        public override bool Remove(GameFeature itemToRemove)\r\n        {\r\n            RemoveUsage(itemToRemove.Id);\r\n            return base.Remove(itemToRemove);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<GameFeature> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                }\r\n            }\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/FilterPresetsCollection.cs",
    "content": "﻿using LiteDB;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing SdkModels = Playnite.SDK.Models;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class FilterPresetsSettings\r\n    {\r\n        [BsonId(false)]\r\n        public int Id { get; set; } = 0;\r\n        public List<Guid> SortingOrder { get; set; } = new List<Guid>();\r\n    }\r\n\r\n    public class FilterPresetsSettingsUpdateEvent\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets old item state.\r\n        /// </summary>\r\n        public FilterPresetsSettings OldData\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets or sets new item state.\r\n        /// </summary>\r\n        public FilterPresetsSettings NewData\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of FilterPresetsSettingsUpdateEvent.\r\n        /// </summary>\r\n        /// <param name=\"oldData\">Old state.</param>\r\n        /// <param name=\"newData\">New state.</param>\r\n        public FilterPresetsSettingsUpdateEvent(FilterPresetsSettings oldData, FilterPresetsSettings newData)\r\n        {\r\n            OldData = oldData;\r\n            NewData = newData;\r\n        }\r\n    }\r\n\r\n    public class FilterPresetsCollection : ItemCollection<FilterPreset>\r\n    {\r\n        public event EventHandler<FilterPresetsSettingsUpdateEvent> OnSettingsUpdated;\r\n\r\n        private LiteCollection<FilterPresetsSettings> settingsCollection;\r\n        private LiteCollection<FilterPresetsSettings> SettingsCollection\r\n        {\r\n            get\r\n            {\r\n                if (settingsCollection == null)\r\n                {\r\n                    settingsCollection = liteDb.GetCollection<FilterPresetsSettings>();\r\n                }\r\n\r\n                return settingsCollection;\r\n            }\r\n        }\r\n\r\n        public FilterPresetsCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.FilterPresets)\r\n        {\r\n        }\r\n\r\n        public FilterPresetsSettings GetSettings()\r\n        {\r\n            if (SettingsCollection.Count() == 0)\r\n            {\r\n                var settings = new FilterPresetsSettings();\r\n                SettingsCollection.Insert(settings);\r\n                return settings;\r\n            }\r\n            else\r\n            {\r\n                return SettingsCollection.FindAll().First();\r\n            }\r\n        }\r\n\r\n        public void SetSettings(FilterPresetsSettings settings)\r\n        {\r\n            var oldSettings = GetSettings();\r\n            settings.Id = 0;\r\n            SettingsCollection.Upsert(settings);\r\n            OnSettingsUpdated?.Invoke(this, new FilterPresetsSettingsUpdateEvent(oldSettings, settings));\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<FilterPreset>().Id(a => a.Id, false);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/GameScannersCollection.cs",
    "content": "﻿using LiteDB;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class GameScannersSettings\r\n    {\r\n        [BsonId(false)]\r\n        public int Id { get; set; } = 0;\r\n        public List<string> CrcExcludeFileTypes { get; set; }\r\n    }\r\n\r\n    public class GameScannersCollection : ItemCollection<GameScannerConfig>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        private LiteCollection<GameScannersSettings> settingsCollection;\r\n        private LiteCollection<GameScannersSettings> SettingsCollection\r\n        {\r\n            get\r\n            {\r\n                if (settingsCollection == null)\r\n                {\r\n                    settingsCollection = liteDb.GetCollection<GameScannersSettings>();\r\n                }\r\n\r\n                return settingsCollection;\r\n            }\r\n        }\r\n\r\n        public GameScannersCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.GameScanners)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<GameScannerConfig>().Id(a => a.Id, false);\r\n        }\r\n\r\n        public GameScannersSettings GetSettings()\r\n        {\r\n            if (SettingsCollection.Count() == 0)\r\n            {\r\n                var settings = new GameScannersSettings { CrcExcludeFileTypes = new List<string> { \"*.chd\" } };\r\n                SettingsCollection.Insert(settings);\r\n                return settings;\r\n            }\r\n            else\r\n            {\r\n                return SettingsCollection.FindAll().First();\r\n            }\r\n        }\r\n\r\n        public void SetSettings(GameScannersSettings settings)\r\n        {\r\n            settings.Id = 0;\r\n            SettingsCollection.Upsert(settings);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/GamesCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class GamesCollection : ItemCollection<Game>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public GamesCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base((Game game) =>\r\n        {\r\n            game.IsInstalling = false;\r\n            game.IsUninstalling = false;\r\n            game.IsLaunching = false;\r\n            game.IsRunning = false;\r\n        }, mapper, type: GameDatabaseCollection.Games)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.RegisterType<ReleaseDate>\r\n            (\r\n                (date) => date.Serialize(),\r\n                (bson) => ReleaseDate.Deserialize(bson.AsString)\r\n            );\r\n\r\n            mapper.Entity<Game>().\r\n                Id(a => a.Id, false).\r\n                Ignore(a => a.Genres).\r\n                Ignore(a => a.Developers).\r\n                Ignore(a => a.Publishers).\r\n                Ignore(a => a.Tags).\r\n                Ignore(a => a.Features).\r\n                Ignore(a => a.Categories).\r\n                Ignore(a => a.Platforms).\r\n                Ignore(a => a.Series).\r\n                Ignore(a => a.AgeRatings).\r\n                Ignore(a => a.Regions).\r\n                Ignore(a => a.Source).\r\n                Ignore(a => a.ReleaseYear).\r\n                Ignore(a => a.UserScoreRating).\r\n                Ignore(a => a.CommunityScoreRating).\r\n                Ignore(a => a.CriticScoreRating).\r\n                Ignore(a => a.UserScoreGroup).\r\n                Ignore(a => a.CommunityScoreGroup).\r\n                Ignore(a => a.CriticScoreGroup).\r\n                Ignore(a => a.LastActivitySegment).\r\n                Ignore(a => a.AddedSegment).\r\n                Ignore(a => a.ModifiedSegment).\r\n                Ignore(a => a.PlaytimeCategory).\r\n                Ignore(a => a.IsCustomGame).\r\n                Ignore(a => a.InstallationStatus);\r\n        }\r\n\r\n        public override Game Add(string itemName)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override Game Add(string itemName, Func<Game, string, bool> existingComparer)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override IEnumerable<Game> Add(List<string> items)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override IEnumerable<Game> Add(List<string> itemsToAdd, Func<Game, string, bool> existingComparer)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override void Add(Game item)\r\n        {\r\n            item.Added = DateTime.Now;\r\n            item.Modified = item.Added;\r\n            base.Add(item);\r\n        }\r\n\r\n        public override void Add(IEnumerable<Game> items)\r\n        {\r\n            foreach (var item in items)\r\n            {\r\n                item.Added = DateTime.Now;\r\n                item.Modified = item.Added;\r\n            }\r\n\r\n            base.Add(items);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            var item = Get(id);\r\n            var result = base.Remove(id);\r\n            db.RemoveFile(item.Icon);\r\n            db.RemoveFile(item.CoverImage);\r\n\r\n            if (item.BackgroundImage.IsHttpUrl())\r\n            {\r\n                HttpFileCache.ClearCache(item.BackgroundImage);\r\n            }\r\n            else\r\n            {\r\n                db.RemoveFile(item.BackgroundImage);\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        public override bool Remove(Game item)\r\n        {\r\n            return Remove(item.Id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<Game> items)\r\n        {\r\n            foreach (var item in items)\r\n            {\r\n                // Get item from in case that passed platform doesn't have actual metadata.\r\n                var dbItem = Get(item.Id);\r\n                db.RemoveFile(dbItem.Icon);\r\n                db.RemoveFile(dbItem.CoverImage);\r\n\r\n                if (dbItem.BackgroundImage.IsHttpUrl())\r\n                {\r\n                    HttpFileCache.ClearCache(dbItem.BackgroundImage);\r\n                }\r\n                else\r\n                {\r\n                    db.RemoveFile(dbItem.BackgroundImage);\r\n                }\r\n            }\r\n\r\n            var result = base.Remove(items);\r\n            return result;\r\n        }\r\n\r\n        public override void Update(Game itemToUpdate)\r\n        {\r\n            var dbItem = Get(itemToUpdate.Id);\r\n            if (!dbItem.Icon.IsNullOrEmpty() && dbItem.Icon != itemToUpdate.Icon)\r\n            {\r\n                db.RemoveFile(dbItem.Icon);\r\n            }\r\n\r\n            if (!dbItem.CoverImage.IsNullOrEmpty() && dbItem.CoverImage != itemToUpdate.CoverImage)\r\n            {\r\n                db.RemoveFile(dbItem.CoverImage);\r\n            }\r\n\r\n            if (!dbItem.BackgroundImage.IsNullOrEmpty() && !dbItem.BackgroundImage.IsHttpUrl() && dbItem.BackgroundImage != itemToUpdate.BackgroundImage)\r\n            {\r\n                db.RemoveFile(dbItem.BackgroundImage);\r\n            }\r\n            else if (dbItem.BackgroundImage.IsHttpUrl() && dbItem.BackgroundImage != itemToUpdate.BackgroundImage)\r\n            {\r\n                HttpFileCache.ClearCache(dbItem.BackgroundImage);\r\n            }\r\n\r\n            base.Update(itemToUpdate);\r\n        }\r\n\r\n        public override void Update(IEnumerable<Game> itemsToUpdate)\r\n        {\r\n            foreach (var item in itemsToUpdate)\r\n            {\r\n                var dbItem = Get(item.Id);\r\n                if (!dbItem.Icon.IsNullOrEmpty() && dbItem.Icon != item.Icon)\r\n                {\r\n                    db.RemoveFile(dbItem.Icon);\r\n                }\r\n\r\n                if (!dbItem.CoverImage.IsNullOrEmpty() && dbItem.CoverImage != item.CoverImage)\r\n                {\r\n                    db.RemoveFile(dbItem.CoverImage);\r\n                }\r\n\r\n                if (!dbItem.BackgroundImage.IsNullOrEmpty())\r\n                {\r\n                    if (!dbItem.BackgroundImage.IsHttpUrl() && dbItem.BackgroundImage != item.BackgroundImage)\r\n                    {\r\n                        db.RemoveFile(dbItem.BackgroundImage);\r\n                    }\r\n                    else if (dbItem.BackgroundImage.IsHttpUrl() && dbItem.BackgroundImage != item.BackgroundImage)\r\n                    {\r\n                        HttpFileCache.ClearCache(dbItem.BackgroundImage);\r\n                    }\r\n                }\r\n            }\r\n\r\n            base.Update(itemsToUpdate);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/GamesSourcesCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class GamesSourcesCollection : ItemCollection<GameSource>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public GamesSourcesCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.Sources)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<GameSource>().Id(a => a.Id, false);\r\n        }\r\n\r\n        private void RemoveUsage(Guid sourceId)\r\n        {\r\n            foreach (var game in db.Games.Where(a => a.SourceId == sourceId))\r\n            {\r\n                game.SourceId = Guid.Empty;\r\n                db.Games.Update(game);\r\n            }\r\n        }\r\n\r\n        public override bool Remove(GameSource itemToRemove)\r\n        {\r\n            RemoveUsage(itemToRemove.Id);\r\n            return base.Remove(itemToRemove);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<GameSource> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                }\r\n            }\r\n\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/GenresCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class GenresCollection : ItemCollection<Genre>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public GenresCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.Genres)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<Genre>().Id(a => a.Id, false);\r\n        }\r\n\r\n        private void RemoveUsage(Guid genreId)\r\n        {\r\n            foreach (var game in db.Games.Where(a => a.GenreIds?.Contains(genreId) == true))\r\n            {\r\n                game.GenreIds.Remove(genreId);\r\n                db.Games.Update(game);\r\n            }\r\n        }\r\n\r\n        public override bool Remove(Genre itemToRemove)\r\n        {\r\n            RemoveUsage(itemToRemove.Id);\r\n            return base.Remove(itemToRemove);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<Genre> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                }\r\n            }\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/ImportExclusionsCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class ImportExclusionsCollection : ItemCollection<ImportExclusionItem>\r\n    {\r\n        public ImportExclusionsCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.ImportExclusions)\r\n        {\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<ImportExclusionItem>().Id(a => a.Id, false);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/ItemCollection.cs",
    "content": "﻿using LiteDB;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing SqlNado;\r\nusing System;\r\nusing System.Collections;\r\nusing System.Collections.Concurrent;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    // We currently use LiteDB for permanent storage.\r\n    // We don't use latest LiteDB 5, but instead latest LiteDB 4, because V5 has some issues:\r\n    //  - doesn't allow disabling of memory cache (which in our case just wastes memory)\r\n    //  - write speeds are slower\r\n    public class ItemCollection<TItem> : IItemCollection<TItem> where TItem : DatabaseObject\r\n    {\r\n        class EventBufferHandler<T> : IDisposable where T : DatabaseObject\r\n        {\r\n            private IItemCollection<T> collection;\r\n\r\n            public EventBufferHandler(IItemCollection<T> collection)\r\n            {\r\n                this.collection = collection;\r\n                collection.BeginBufferUpdate();\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                collection.EndBufferUpdate();\r\n            }\r\n        }\r\n\r\n        private ILogger logger = LogManager.GetLogger(typeof(TItem).Name + \"_coll\");\r\n        private readonly object collectionLock = new object();\r\n        private string storagePath;\r\n        private readonly Action<TItem> initMethod;\r\n        private bool isEventBufferEnabled = false;\r\n        private int bufferDepth = 0;\r\n        private List<TItem> AddedItemsEventBuffer = new List<TItem>();\r\n        private List<TItem> RemovedItemsEventBuffer = new List<TItem>();\r\n        private Dictionary<Guid, ItemUpdateEvent<TItem>> ItemUpdatesEventBuffer = new Dictionary<Guid, ItemUpdateEvent<TItem>>();\r\n        private readonly bool isPersistent = true;\r\n        internal LiteDatabase liteDb { get; private set; }\r\n        private LiteCollection<TItem> liteCollection;\r\n        private BsonMapper mapper;\r\n\r\n        public ConcurrentDictionary<Guid, TItem> Items { get; }\r\n\r\n        public int Count => Items.Count;\r\n\r\n        public bool IsReadOnly => false;\r\n\r\n        public GameDatabaseCollection CollectionType { get; } = GameDatabaseCollection.Uknown;\r\n\r\n        public TItem this[Guid id]\r\n        {\r\n            get => Get(id);\r\n            set\r\n            {\r\n                new NotSupportedException();\r\n            }\r\n        }\r\n\r\n        public event EventHandler<ItemCollectionChangedEventArgs<TItem>> ItemCollectionChanged;\r\n\r\n        public event EventHandler<ItemUpdatedEventArgs<TItem>> ItemUpdated;\r\n\r\n        internal bool IsEventsEnabled { get; set; } = true;\r\n\r\n        public ItemCollection(BsonMapper mapper, bool isPersistent = true, GameDatabaseCollection type = GameDatabaseCollection.Uknown)\r\n        {\r\n            this.isPersistent = isPersistent;\r\n            this.mapper = mapper;\r\n            Items = new ConcurrentDictionary<Guid, TItem>();\r\n            CollectionType = type;\r\n        }\r\n\r\n        public ItemCollection(Action<TItem> initMethod, BsonMapper mapper, bool isPersistent = true, GameDatabaseCollection type = GameDatabaseCollection.Uknown) : this(mapper, isPersistent, type)\r\n        {\r\n            this.initMethod = initMethod;\r\n        }\r\n\r\n        public ItemCollection(string path, BsonMapper mapper, GameDatabaseCollection type = GameDatabaseCollection.Uknown)\r\n        {\r\n            this.isPersistent = true;\r\n            this.mapper = mapper;\r\n            Items = new ConcurrentDictionary<Guid, TItem>();\r\n            InitializeCollection(path);\r\n            CollectionType = type;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            liteDb?.Dispose();\r\n        }\r\n\r\n        public void InitializeCollection(string path)\r\n        {\r\n            if (!string.IsNullOrEmpty(storagePath))\r\n            {\r\n                throw new Exception(\"Collection already initialized.\");\r\n            }\r\n\r\n            storagePath = path;\r\n            // This fixes an issue where people mess up their library with custom scripts\r\n            // which create collection files instead of directories :|\r\n            if (File.Exists(storagePath))\r\n            {\r\n                File.Delete(storagePath);\r\n            }\r\n\r\n            var dbPath = path + \".db\";\r\n            void openDb()\r\n            {\r\n                liteDb = new LiteDatabase($\"Filename={dbPath};Mode=Exclusive;Cache Size=0\", mapper);\r\n                liteCollection = liteDb.GetCollection<TItem>();\r\n                liteCollection.EnsureIndex(a => a.Id, true);\r\n            }\r\n\r\n            void loadCollections()\r\n            {\r\n                Parallel.ForEach(\r\n                    liteCollection.FindAll(),\r\n                    new ParallelOptions { MaxDegreeOfParallelism = 4 },\r\n                    (objectFile) =>\r\n                    {\r\n                        if (objectFile != null)\r\n                        {\r\n                            initMethod?.Invoke(objectFile);\r\n                            Items.TryAdd(objectFile.Id, objectFile);\r\n                        }\r\n                    });\r\n\r\n                // Also try to load other collection to see if db is corrupted\r\n                foreach (var collName in liteDb.GetCollectionNames().Where(a => a != liteCollection.Name))\r\n                {\r\n                    var coll = liteDb.GetCollection(collName);\r\n                    // One these would fail for known corruptions\r\n                    coll.Count();\r\n                    coll.FindAll().ToList();\r\n                }\r\n            }\r\n\r\n            openDb();\r\n\r\n            try\r\n            {\r\n                loadCollections();\r\n            }\r\n            catch (Exception liteEx) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(liteEx, $\"DB file {dbPath} is most likely damaged, trying to repair.\");\r\n                Items.Clear();\r\n                liteDb.Dispose();\r\n\r\n                var backupPath = dbPath + \".backup\";\r\n                File.Copy(dbPath, backupPath, true);\r\n\r\n                try\r\n                {\r\n                    var oldData = new Dictionary<string, List<BsonDocument>>();\r\n                    using (var dbStream = File.OpenRead(dbPath))\r\n                    {\r\n                        var reader = new LiteDBConversion.FileReaderV7(dbStream, null);\r\n                        foreach (var coll in reader.GetCollections())\r\n                        {\r\n                            oldData.Add(coll, reader.GetDocuments(coll).ToList());\r\n                        }\r\n                    }\r\n\r\n                    File.Delete(dbPath);\r\n                    using (var db = new LiteDatabase($\"Filename={dbPath};Mode=Exclusive;Cache Size=0\"))\r\n                    {\r\n                        foreach (var collName in oldData.Keys)\r\n                        {\r\n                            db.GetCollection(collName).InsertBulk(oldData[collName]);\r\n                        }\r\n                    }\r\n\r\n                    openDb();\r\n                    loadCollections();\r\n                    logger.Debug($\"{dbPath} restored successfully.\");\r\n                }\r\n                catch (Exception resExc)\r\n                {\r\n                    logger.Error(resExc, \"Failed to restore data from damaged db file.\");\r\n                    File.Delete(dbPath);\r\n                    File.Move(backupPath, dbPath);\r\n                }\r\n            }\r\n        }\r\n\r\n        internal string GetItemFilePath(Guid id)\r\n        {\r\n            return Path.Combine(storagePath, $\"{id.ToString()}.json\");\r\n        }\r\n\r\n        internal void SaveItemData(TItem item)\r\n        {\r\n            liteCollection.Upsert(item);\r\n        }\r\n\r\n        internal void SaveItemData(IEnumerable<TItem> items)\r\n        {\r\n            liteCollection.Upsert(items);\r\n        }\r\n\r\n        internal TItem GetItemData(Guid id)\r\n        {\r\n            return liteCollection.FindById(id);\r\n        }\r\n\r\n        public TItem Get(Guid id)\r\n        {\r\n            if (Items.TryGetValue(id, out var item))\r\n            {\r\n                return item;\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public bool ContainsItem(Guid id)\r\n        {\r\n            return Items?.ContainsKey(id) == true;\r\n        }\r\n\r\n        public List<TItem> Get(IList<Guid> ids)\r\n        {\r\n            var items = new List<TItem>(ids.Count);\r\n            foreach (var id in ids)\r\n            {\r\n                var item = Get(id);\r\n                if (item != null)\r\n                {\r\n                    items.Add(item);\r\n                }\r\n            }\r\n\r\n            return items;\r\n        }\r\n\r\n        public virtual TItem GetOrGenerate(MetadataProperty property)\r\n        {\r\n            if (property is MetadataNameProperty nameProp)\r\n            {\r\n                var existingItem = this.FirstOrDefault(a => GameFieldComparer.StringEquals(a.Name, nameProp.Name));\r\n                if (existingItem != null)\r\n                {\r\n                    return existingItem;\r\n                }\r\n                else\r\n                {\r\n                    return typeof(TItem).CrateInstance<TItem>(nameProp.Name);\r\n                }\r\n            }\r\n            else if (property is MetadataIdProperty idProp)\r\n            {\r\n                return this[idProp.Id];\r\n            }\r\n\r\n            throw new NotSupportedException($\"{property.GetType()} property type is not supported in this collection.\");\r\n        }\r\n\r\n        public virtual IEnumerable<TItem> GetOrGenerate(IEnumerable<MetadataProperty> properties)\r\n        {\r\n            var res = new List<TItem>();\r\n            foreach (var property in properties)\r\n            {\r\n                res.Add(GetOrGenerate(property));\r\n            }\r\n\r\n            return res;\r\n        }\r\n\r\n        public virtual TItem Add(MetadataProperty property)\r\n        {\r\n            if (property is MetadataNameProperty nameProp)\r\n            {\r\n                return Add(nameProp.Name, GameFieldComparer.FieldEquals);\r\n            }\r\n            else if (property is MetadataIdProperty idProp)\r\n            {\r\n                return this[idProp.Id];\r\n            }\r\n\r\n            throw new NotSupportedException($\"{property.GetType()} property type is not supported in this collection.\");\r\n        }\r\n\r\n        public virtual IEnumerable<TItem> Add(IEnumerable<MetadataProperty> properties)\r\n        {\r\n            var res = new List<TItem>();\r\n            foreach (var property in properties)\r\n            {\r\n                res.Add(Add(property));\r\n            }\r\n\r\n            return res;\r\n        }\r\n\r\n        public virtual TItem Add(string itemName, Func<TItem, string, bool> existingComparer)\r\n        {\r\n            if (string.IsNullOrEmpty(itemName)) throw new ArgumentNullException(nameof(itemName));\r\n            var existingItem = this.FirstOrDefault(a => existingComparer(a, itemName));\r\n            if (existingItem != null)\r\n            {\r\n                return existingItem;\r\n            }\r\n            else\r\n            {\r\n                var newItem = typeof(TItem).CrateInstance<TItem>(itemName);\r\n                Add(newItem);\r\n                return newItem;\r\n            }\r\n        }\r\n\r\n        public virtual TItem Add(string itemName)\r\n        {\r\n            return Add(itemName, (existingItem, newName) => existingItem.Name?.Equals(newName, StringComparison.InvariantCultureIgnoreCase) == true);\r\n        }\r\n\r\n        public virtual IEnumerable<TItem> Add(List<string> itemsToAdd, Func<TItem, string, bool> existingComparer)\r\n        {\r\n            var res = new List<TItem>();\r\n            var toAdd = new List<TItem>();\r\n            foreach (var itemName in itemsToAdd)\r\n            {\r\n                var existingItem = this.FirstOrDefault(a => existingComparer(a, itemName));\r\n                if (existingItem != null)\r\n                {\r\n                    res.Add(existingItem);\r\n                }\r\n                else\r\n                {\r\n                    var newItem = typeof(TItem).CrateInstance<TItem>(itemName);\r\n                    toAdd.Add(newItem);\r\n                    res.Add(newItem);\r\n                }\r\n            }\r\n\r\n            if (toAdd?.Any() == true)\r\n            {\r\n                Add(toAdd);\r\n            }\r\n\r\n            return res;\r\n        }\r\n\r\n        public virtual IEnumerable<TItem> Add(List<string> itemsToAdd)\r\n        {\r\n            return Add(itemsToAdd, (existingItem, newName) => existingItem.Name?.Equals(newName, StringComparison.InvariantCultureIgnoreCase) == true);\r\n        }\r\n\r\n        public virtual void Add(TItem itemToAdd)\r\n        {\r\n            if (Items.ContainsKey(itemToAdd.Id))\r\n            {\r\n                throw new Exception($\"Item {itemToAdd.Id} already exists.\");\r\n            }\r\n\r\n            lock (collectionLock)\r\n            {\r\n                if (isPersistent)\r\n                {\r\n                    SaveItemData(itemToAdd);\r\n                }\r\n\r\n                Items.TryAdd(itemToAdd.Id, itemToAdd);\r\n            }\r\n\r\n            OnCollectionChanged(new List<TItem>() { itemToAdd }, new List<TItem>());\r\n        }\r\n\r\n        public virtual void Add(IEnumerable<TItem> itemsToAdd)\r\n        {\r\n            if (itemsToAdd?.Any() != true)\r\n            {\r\n                return;\r\n            }\r\n\r\n            lock (collectionLock)\r\n            {\r\n                foreach (var item in itemsToAdd)\r\n                {\r\n                    if (Items.ContainsKey(item.Id))\r\n                    {\r\n                        throw new Exception($\"Item {item.Id} already exists.\");\r\n                    }\r\n\r\n                    if (isPersistent)\r\n                    {\r\n                        SaveItemData(item);\r\n                    }\r\n\r\n                    Items.TryAdd(item.Id, item);\r\n                }\r\n            }\r\n\r\n            OnCollectionChanged(itemsToAdd.ToList(), new List<TItem>());\r\n        }\r\n\r\n        public virtual bool Remove(Guid id)\r\n        {\r\n            var item = Get(id);\r\n            if (item == null)\r\n            {\r\n                throw new Exception($\"Item {item.Id} doesn't exists.\");\r\n            }\r\n\r\n            lock (collectionLock)\r\n            {\r\n                if (isPersistent)\r\n                {\r\n                    liteCollection.Delete(id);\r\n                }\r\n\r\n                Items.TryRemove(id, out var removed);\r\n            }\r\n\r\n            OnCollectionChanged(new List<TItem>(), new List<TItem>() { item });\r\n            return true;\r\n        }\r\n\r\n        public virtual bool Remove(TItem itemToRemove)\r\n        {\r\n            return Remove(itemToRemove.Id);\r\n        }\r\n\r\n        public virtual bool Remove(IEnumerable<TItem> itemsToRemove)\r\n        {\r\n            if (itemsToRemove?.Any() != true)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            lock (collectionLock)\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    var existing = Get(item.Id);\r\n                    if (existing == null)\r\n                    {\r\n                        throw new Exception($\"Item {item.Id} doesn't exists.\");\r\n                    }\r\n\r\n                    if (isPersistent)\r\n                    {\r\n                        liteCollection.Delete(item.Id);\r\n                    }\r\n\r\n                    Items.TryRemove(item.Id, out var removed);\r\n                }\r\n            }\r\n\r\n            OnCollectionChanged(new List<TItem>(), itemsToRemove.ToList());\r\n            return true;\r\n        }\r\n\r\n        public virtual void Update(TItem itemToUpdate)\r\n        {\r\n            TItem oldData = null;\r\n            TItem loadedItem;\r\n            lock (collectionLock)\r\n            {\r\n                if (isPersistent)\r\n                {\r\n                    try\r\n                    {\r\n                        oldData = GetItemData(itemToUpdate.Id);\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, \"Failed to read stored item data.\");\r\n                    }\r\n\r\n                    // This should never ever happen, but there are automatic crash reports of Playnite db files being corrupted.\r\n                    // This happens because of trash launchers from games like Zula,\r\n                    // which mess with Playnite process and dump their log entries to our files.\r\n                    // This will most likely cause some other issues, but at least it won't crash the whole app.\r\n                    if (oldData == null)\r\n                    {\r\n                        logger.Error(\"Failed to read stored item data.\");\r\n                        oldData = this[itemToUpdate.Id].GetClone();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    oldData = Get(itemToUpdate.Id);\r\n                }\r\n\r\n                if (oldData == null)\r\n                {\r\n                    throw new Exception($\"Item {oldData.Id} doesn't exists.\");\r\n                }\r\n\r\n                if (isPersistent)\r\n                {\r\n                    SaveItemData(itemToUpdate);\r\n                }\r\n\r\n                loadedItem = Get(itemToUpdate.Id);\r\n                if (!ReferenceEquals(loadedItem, itemToUpdate))\r\n                {\r\n                    itemToUpdate.CopyDiffTo(loadedItem);\r\n                }\r\n            }\r\n\r\n            OnItemUpdated(new List<ItemUpdateEvent<TItem>>() { new ItemUpdateEvent<TItem>(oldData, loadedItem) });\r\n        }\r\n\r\n        public virtual void Update(IEnumerable<TItem> itemsToUpdate)\r\n        {\r\n            var updates = new List<ItemUpdateEvent<TItem>>();\r\n            lock (collectionLock)\r\n            {\r\n                foreach (var item in itemsToUpdate)\r\n                {\r\n                    TItem oldData;\r\n                    if (isPersistent)\r\n                    {\r\n                        try\r\n                        {\r\n                            oldData = GetItemData(item.Id);\r\n                        }\r\n                        catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            // This should never ever happen, but there are automatic crash reports of Playnite db files being corrupted.\r\n                            // This happens because of trash launchers from games like Zula,\r\n                            // which mess with Playnite process and dump their log entries to our files.\r\n                            // This will most likely cause some other issues, but at least it won't crash the whole app.\r\n                            logger.Error(e, \"Failed to read stored item data.\");\r\n                            oldData = this[item.Id].GetClone();\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        oldData = Get(item.Id);\r\n                    }\r\n\r\n                    if (oldData == null)\r\n                    {\r\n                        throw new Exception($\"Item {oldData.Id} doesn't exists.\");\r\n                    }\r\n\r\n                    if (isPersistent)\r\n                    {\r\n                        SaveItemData(item);\r\n                    }\r\n\r\n                    var loadedItem = Get(item.Id);\r\n                    if (!ReferenceEquals(loadedItem, item))\r\n                    {\r\n                        item.CopyDiffTo(loadedItem);\r\n                    }\r\n\r\n                    updates.Add(new ItemUpdateEvent<TItem>(oldData, loadedItem));\r\n                }\r\n            }\r\n\r\n            OnItemUpdated(updates);\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public bool Contains(TItem item)\r\n        {\r\n            return Items.ContainsKey(item.Id);\r\n        }\r\n\r\n        public void CopyTo(TItem[] array, int arrayIndex)\r\n        {\r\n            Items.Values.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        public IEnumerator<TItem> GetEnumerator()\r\n        {\r\n            return Items.Values.GetEnumerator();\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return Items.Values.GetEnumerator();\r\n        }\r\n\r\n        internal void OnCollectionChanged(List<TItem> addedItems, List<TItem> removedItems)\r\n        {\r\n            if (!IsEventsEnabled)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (!isEventBufferEnabled)\r\n            {\r\n                ItemCollectionChanged?.Invoke(this, new ItemCollectionChangedEventArgs<TItem>(addedItems, removedItems));\r\n            }\r\n            else\r\n            {\r\n                AddedItemsEventBuffer.AddRange(addedItems);\r\n                RemovedItemsEventBuffer.AddRange(removedItems);\r\n            }\r\n        }\r\n\r\n        internal void OnItemUpdated(IEnumerable<ItemUpdateEvent<TItem>> updates)\r\n        {\r\n            if (!IsEventsEnabled)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (!isEventBufferEnabled)\r\n            {\r\n                ItemUpdated?.Invoke(this, new ItemUpdatedEventArgs<TItem>(updates));\r\n            }\r\n            else\r\n            {\r\n                foreach (var update in updates)\r\n                {\r\n                    if (ItemUpdatesEventBuffer.TryGetValue(update.NewData.Id, out var existing))\r\n                    {\r\n                        existing.NewData = update.NewData;\r\n                    }\r\n                    else\r\n                    {\r\n                        ItemUpdatesEventBuffer.Add(update.NewData.Id, update);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public void BeginBufferUpdate()\r\n        {\r\n            isEventBufferEnabled = true;\r\n            bufferDepth++;\r\n        }\r\n\r\n        public void EndBufferUpdate()\r\n        {\r\n            // In case nested buffers are used then we end only when top level one clear.\r\n            if (bufferDepth >= 1)\r\n            {\r\n                bufferDepth--;\r\n            }\r\n\r\n            if (bufferDepth == 0)\r\n            {\r\n                isEventBufferEnabled = false;\r\n                if (AddedItemsEventBuffer.Count > 0 || RemovedItemsEventBuffer.Count > 0)\r\n                {\r\n                    OnCollectionChanged(AddedItemsEventBuffer.ToList(), RemovedItemsEventBuffer.ToList());\r\n                    AddedItemsEventBuffer.Clear();\r\n                    RemovedItemsEventBuffer.Clear();\r\n                }\r\n\r\n                if (ItemUpdatesEventBuffer.Count > 0)\r\n                {\r\n                    OnItemUpdated(ItemUpdatesEventBuffer.Values);\r\n                    ItemUpdatesEventBuffer.Clear();\r\n                }\r\n            }\r\n        }\r\n\r\n        public IEnumerable<TItem> GetClone()\r\n        {\r\n            return this.Select(a => a.GetClone());\r\n        }\r\n\r\n        public IDisposable BufferedUpdate()\r\n        {\r\n            return new EventBufferHandler<TItem>(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/LiteDBFileReaderV7.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\r\nusing System.Text.RegularExpressions;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing static LiteDBConversion.Constants;\n\n// This is copy from LiteDB 5 version and it's only used for recovery of corrupted databases.\n// We use LiteDB 4 in Playnite, see description of ItemCollection<TItem> to see why.\n// LiteDB 4 has some super rare bug that can corrupt database when file is being open and process is hard killed,\n// even when journal is used and sharing is not enabled. People reported corrupted DBs when hard resettingg PCs while Playnite is running.\n// The corruption is very weird because V5 can read these files just fine during upgrade from V4 to V5.\n// So if we detect corruption we try to use this upgrade code to fix the db.\n// Standard \"raw\" reading of collection doesn't work when DB is damabged in this way so this is the only way how to recover data.\nnamespace LiteDBConversion\n{\r\n    internal class BsonReader\n    {\n        private bool _utcDate = false;\n\n        public BsonReader(bool utcDate)\n        {\n            _utcDate = utcDate;\n        }\n\n        /// <summary>\n        /// Main method - deserialize using ByteReader helper\n        /// </summary>\n        public LiteDB.BsonDocument Deserialize(byte[] bson)\n        {\n            return this.ReadDocument(new ByteReader(bson));\n        }\n\n        /// <summary>\n        /// Read a BsonDocument from reader\n        /// </summary>\n        public LiteDB.BsonDocument ReadDocument(ByteReader reader)\n        {\n            var length = reader.ReadInt32();\n            var end = reader.Position + length - 5;\n            var obj = new LiteDB.BsonDocument();\n\n            while (reader.Position < end)\n            {\n                var value = this.ReadElement(reader, out string name);\n                obj.RawValue[name] = value;\n            }\n\n            reader.ReadByte(); // zero\n\n            return obj;\n        }\n\n        /// <summary>\n        /// Read an BsonArray from reader\n        /// </summary>\n        public LiteDB.BsonArray ReadArray(ByteReader reader)\n        {\n            var length = reader.ReadInt32();\n            var end = reader.Position + length - 5;\n            var arr = new LiteDB.BsonArray();\n\n            while (reader.Position < end)\n            {\n                var value = this.ReadElement(reader, out string name);\n                arr.Add(value);\n            }\n\n            reader.ReadByte(); // zero\n\n            return arr;\n        }\n\n        /// <summary>\n        /// Reads an element (key-value) from an reader\n        /// </summary>\n        private LiteDB.BsonValue ReadElement(ByteReader reader, out string name)\n        {\n            var type = reader.ReadByte();\n            name = reader.ReadCString();\n\n            if (type == 0x01) // Double\n            {\n                return reader.ReadDouble();\n            }\n            else if (type == 0x02) // String\n            {\n                return reader.ReadBsonString();\n            }\n            else if (type == 0x03) // Document\n            {\n                return this.ReadDocument(reader);\n            }\n            else if (type == 0x04) // Array\n            {\n                return this.ReadArray(reader);\n            }\n            else if (type == 0x05) // Binary\n            {\n                var length = reader.ReadInt32();\n                var subType = reader.ReadByte();\n                var bytes = reader.ReadBytes(length);\n\n                switch (subType)\n                {\n                    case 0x00: return bytes;\n                    case 0x04: return new Guid(bytes);\n                }\n            }\n            else if (type == 0x07) // ObjectId\n            {\n                return new LiteDB.ObjectId(reader.ReadBytes(12));\n            }\n            else if (type == 0x08) // Boolean\n            {\n                return reader.ReadBoolean();\n            }\n            else if (type == 0x09) // DateTime\n            {\n                var ts = reader.ReadInt64();\n\n                // catch specific values for MaxValue / MinValue #19\n                if (ts == 253402300800000) return DateTime.MaxValue;\n                if (ts == -62135596800000) return DateTime.MinValue;\n\n                var date = LiteDB.BsonValue.UnixEpoch.AddMilliseconds(ts);\n\n                return _utcDate ? date : date.ToLocalTime();\n            }\n            else if (type == 0x0A) // Null\n            {\n                return LiteDB.BsonValue.Null;\n            }\n            else if (type == 0x10) // Int32\n            {\n                return reader.ReadInt32();\n            }\n            else if (type == 0x12) // Int64\n            {\n                return reader.ReadInt64();\n            }\n            else if (type == 0x13) // Decimal\n            {\n                return reader.ReadDecimal();\n            }\n            else if (type == 0xFF) // MinKey\n            {\n                return LiteDB.BsonValue.MinValue;\n            }\n            else if (type == 0x7F) // MaxKey\n            {\n                return LiteDB.BsonValue.MaxValue;\n            }\n\n            throw new NotSupportedException(\"BSON type not supported\");\n        }\n    }\r\n\r\n    internal class ByteReader\n    {\n        private byte[] _buffer;\n        private int _length;\n        private int _pos;\n\n        public int Position { get { return _pos; } set { _pos = value; } }\n\n        public ByteReader(byte[] buffer)\n        {\n            _buffer = buffer;\n            _length = buffer.Length;\n            _pos = 0;\n        }\n\n        public void Skip(int length)\n        {\n            _pos += length;\n        }\n\n        #region Native data types\n\n        public Byte ReadByte()\n        {\n            var value = _buffer[_pos];\n\n            _pos++;\n\n            return value;\n        }\n\n        public Boolean ReadBoolean()\n        {\n            var value = _buffer[_pos];\n\n            _pos++;\n\n            return value == 0 ? false : true;\n        }\n\n        public UInt16 ReadUInt16()\n        {\n            _pos += 2;\n            return BitConverter.ToUInt16(_buffer, _pos - 2);\n        }\n\n        public UInt32 ReadUInt32()\n        {\n            _pos += 4;\n            return BitConverter.ToUInt32(_buffer, _pos - 4);\n        }\n\n        public UInt64 ReadUInt64()\n        {\n            _pos += 8;\n            return BitConverter.ToUInt64(_buffer, _pos - 8);\n        }\n\n        public Int16 ReadInt16()\n        {\n            _pos += 2;\n            return BitConverter.ToInt16(_buffer, _pos - 2);\n        }\n\n        public Int32 ReadInt32()\n        {\n            _pos += 4;\n            return BitConverter.ToInt32(_buffer, _pos - 4);\n        }\n\n        public Int64 ReadInt64()\n        {\n            _pos += 8;\n            return BitConverter.ToInt64(_buffer, _pos - 8);\n        }\n\n        public Single ReadSingle()\n        {\n            _pos += 4;\n            return BitConverter.ToSingle(_buffer, _pos - 4);\n        }\n\n        public Double ReadDouble()\n        {\n            _pos += 8;\n            return BitConverter.ToDouble(_buffer, _pos - 8);\n        }\n\n        public Decimal ReadDecimal()\n        {\n            _pos += 16;\n            var a = BitConverter.ToInt32(_buffer, _pos - 16);\n            var b = BitConverter.ToInt32(_buffer, _pos - 12);\n            var c = BitConverter.ToInt32(_buffer, _pos - 8);\n            var d = BitConverter.ToInt32(_buffer, _pos - 4);\n            return new Decimal(new int[] { a, b, c, d });\n        }\n\n        public Byte[] ReadBytes(int count)\n        {\n            var buffer = new byte[count];\n\n            System.Buffer.BlockCopy(_buffer, _pos, buffer, 0, count);\n\n            _pos += count;\n\n            return buffer;\n        }\n\n        #endregion\n\n        #region Extended types\n\n        public string ReadString()\n        {\n            var length = this.ReadInt32();\n            var str = Encoding.UTF8.GetString(_buffer, _pos, length);\n            _pos += length;\n\n            return str;\n        }\n\n        public string ReadString(int length)\n        {\n            var str = Encoding.UTF8.GetString(_buffer, _pos, length);\n            _pos += length;\n\n            return str;\n        }\n\n        /// <summary>\n        /// Read BSON string add \\0x00 at and of string and add this char in length before\n        /// </summary>\n        public string ReadBsonString()\n        {\n            var length = this.ReadInt32();\n            var str = Encoding.UTF8.GetString(_buffer, _pos, length - 1);\n            _pos += length;\n\n            return str;\n        }\n\n        public string ReadCString()\n        {\n            var pos = _pos;\n            var length = 0;\n\n            while (true)\n            {\n                if (_buffer[pos] == 0x00)\n                {\n                    var str = Encoding.UTF8.GetString(_buffer, _pos, length);\n                    _pos += length + 1; // read last 0x00\n                    return str;\n                }\n                else if (pos > _length)\n                {\n                    return \"_\";\n                }\n\n                pos++;\n                length++;\n            }\n        }\n\n        public DateTime ReadDateTime()\n        {\n            // fix #921 converting index key into LocalTime\n            // this is not best solution because uctDate must be a global parameter\n            // this will be review in v5\n            var date = new DateTime(this.ReadInt64(), DateTimeKind.Utc);\n\n            return date.ToLocalTime();\n        }\n\n        public Guid ReadGuid()\n        {\n            return new Guid(this.ReadBytes(16));\n        }\n\n        public LiteDB.ObjectId ReadObjectId()\n        {\n            return new LiteDB.ObjectId(this.ReadBytes(12));\n        }\n\n        // Legacy PageAddress structure: [uint, ushort]\n        // public PageAddress ReadPageAddress()\n        // {\n        //     return new PageAddress(this.ReadUInt32(), this.ReadUInt16());\n        // }\n\n        public LiteDB.BsonValue ReadBsonValue(ushort length)\n        {\n            var type = (LiteDB.BsonType)this.ReadByte();\n\n            switch (type)\n            {\n                case LiteDB.BsonType.Null: return LiteDB.BsonValue.Null;\n\n                case LiteDB.BsonType.Int32: return this.ReadInt32();\n                case LiteDB.BsonType.Int64: return this.ReadInt64();\n                case LiteDB.BsonType.Double: return this.ReadDouble();\n                case LiteDB.BsonType.Decimal: return this.ReadDecimal();\n\n                case LiteDB.BsonType.String: return this.ReadString(length);\n\n                case LiteDB.BsonType.Document: return new BsonReader(false).ReadDocument(this);\n                case LiteDB.BsonType.Array: return new BsonReader(false).ReadArray(this);\n\n                case LiteDB.BsonType.Binary: return this.ReadBytes(length);\n                case LiteDB.BsonType.ObjectId: return this.ReadObjectId();\n                case LiteDB.BsonType.Guid: return this.ReadGuid();\n\n                case LiteDB.BsonType.Boolean: return this.ReadBoolean();\n                case LiteDB.BsonType.DateTime: return this.ReadDateTime();\n\n                case LiteDB.BsonType.MinValue: return LiteDB.BsonValue.MinValue;\n                case LiteDB.BsonType.MaxValue: return LiteDB.BsonValue.MaxValue;\n            }\n\n            throw new NotImplementedException();\n        }\n\n        #endregion\n    }\r\n\r\n    internal static class BsonDocumentExtensions\r\n    {\r\n        public static T GetOrDefault<K, T>(this IDictionary<K, T> dict, K key, T defaultValue = default(T))\n        {\n            if (dict.TryGetValue(key, out T result))\n            {\n                return result;\n            }\n\n            return defaultValue;\n        }\r\n\r\n        public static LiteDB.BsonValue Index(this LiteDB.BsonValue source, string key)\r\n        {\r\n            if (source is LiteDB.BsonDocument doc)\r\n            {\r\n                return doc.RawValue.GetOrDefault(key, LiteDB.BsonValue.Null);\r\n            }\r\n\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public static void WriteIndex(this LiteDB.BsonValue source, string key, LiteDB.BsonValue value)\r\n        {\r\n            if (source is LiteDB.BsonDocument doc)\r\n            {\r\n                doc.RawValue[key] = value ?? LiteDB.BsonValue.Null;\r\n            }\r\n            else\r\n            {\r\n                throw new NotSupportedException();\r\n            }\r\n        }\r\n\r\n        public static LiteDB.BsonValue Index(this LiteDB.BsonValue source, int index)\r\n        {\r\n            if (source is LiteDB.BsonArray array)\r\n            {\r\n                return array.RawValue[index];\r\n            }\r\n\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public static unsafe bool IsFullZero(this byte[] data)\n        {\n            fixed (byte* bytes = data)\n            {\n                int len = data.Length;\n                int rem = len % (sizeof(long) * 16);\n                long* b = (long*)bytes;\n                long* e = (long*)(bytes + len - rem);\n\n                while (b < e)\n                {\n                    if ((*(b) | *(b + 1) | *(b + 2) | *(b + 3) | *(b + 4) |\n                        *(b + 5) | *(b + 6) | *(b + 7) | *(b + 8) |\n                        *(b + 9) | *(b + 10) | *(b + 11) | *(b + 12) |\n                        *(b + 13) | *(b + 14) | *(b + 15)) != 0)\n                        return false;\n                    b += 16;\n                }\n\n                for (int i = 0; i < rem; i++)\n                    if (data[len - 1 - i] != 0)\n                        return false;\n\n                return true;\n            }\n        }\r\n    }\n\n    internal class IndexInfo\n    {\n        public string Collection { get; set; }\n        public string Name { get; set; }\n        public string Expression { get; set; }\n        public bool Unique { get; set; }\n    }\n\n    /// <summary>\n    /// Interface to read current or old datafile structure - Used to shirnk/upgrade datafile from old LiteDB versions\n    /// </summary>\n    interface IFileReader\n    {\n        /// <summary>\n        /// Get all collections name from database\n        /// </summary>\n        /// <returns></returns>\n        IEnumerable<string> GetCollections();\n\n        /// <summary>\n        /// Get all indexes from collection (except _id index)\n        /// </summary>\n        IEnumerable<IndexInfo> GetIndexes(string name);\n\n        /// <summary>\n        /// Get all documents from a collection\n        /// </summary>\n        IEnumerable<LiteDB.BsonDocument> GetDocuments(string collection);\n    }\n\n    internal class Constants\n    {\n        public const string HeaderPage_HEADER_INFO = \"** This is a LiteDB file **\";\n        public const int PageAddress_SIZE = 5;\r\n        public const int BasePage_SLOT_SIZE = 4;\r\n\r\n        public const int DataService_MAX_DATA_BYTES_PER_PAGE =\r\n            PAGE_SIZE - // 8192\r\n            PAGE_HEADER_SIZE - // [32 bytes]\r\n            BasePage_SLOT_SIZE - // [4 bytes]\r\n            DataBlock_DATA_BLOCK_FIXED_SIZE; // [6 bytes];\r\n\r\n        public const int DataBlock_DATA_BLOCK_FIXED_SIZE = 1 + // DataIndex\n                                                 PageAddress_SIZE; // NextBlock\r\n\r\n        public const int P_EXTEND = 0; // 00-00 [byte]\r\n        public const int P_NEXT_BLOCK = 1; // 01-05 [pageAddress]\r\n        public const int P_BUFFER = 6; // 06-EOF [byte[]]\n\n        /// <summary>\n        /// The size of each page in disk - use 8192 as all major databases\n        /// </summary>\n        public const int PAGE_SIZE = 8192;\n\n        /// <summary>\n        /// Header page size\n        /// </summary>\n        public const int PAGE_HEADER_SIZE = 32;\n\n        /// <summary>\n        /// Bytes used in encryption salt\n        /// </summary>\n        public const int ENCRYPTION_SALT_SIZE = 16;\n\n        /// <summary>\n        /// Define ShareCounter buffer as writable\n        /// </summary>\n        public static int BUFFER_WRITABLE = -1;\n\n        /// <summary>\n        /// Define index name max length\n        /// </summary>\n        public static int INDEX_NAME_MAX_LENGTH = 32;\n\n        /// <summary>\n        /// Max level used on skip list (index).\n        /// </summary>\n        public const int MAX_LEVEL_LENGTH = 32;\n\n        /// <summary>\n        /// Max size of a index entry - usde for string, binary, array and documents. Need fit in 1 byte length\n        /// </summary>\n        public const int MAX_INDEX_KEY_LENGTH = 1023;\n\n        /// <summary>\n        /// Get max length of 1 single index node\n        /// </summary>\n        public const int MAX_INDEX_LENGTH = 1400;\n\n        /// <summary>\n        /// Get how many slots collection pages will have for free list page (data/index)\n        /// </summary>\n        public const int PAGE_FREE_LIST_SLOTS = 5;\n\n        /// <summary>\n        /// Document limit size - 2048 data pages limit (about 16Mb - same size as MongoDB)\n        /// Using 2047 because first/last page can contain less than 8150 bytes.\n        /// </summary>\n        public const int MAX_DOCUMENT_SIZE = 2047 * DataService_MAX_DATA_BYTES_PER_PAGE;\n\n        /// <summary>\n        /// Define how many transactions can be open simultaneously\n        /// </summary>\n        public const int MAX_OPEN_TRANSACTIONS = 100;\n\n        /// <summary>\n        /// Define how many pages all transaction will consume, in memory, before persist in disk. This amount are shared across all open transactions\n        /// 100,000 ~= 1Gb memory\n        /// </summary>\n        public const int MAX_TRANSACTION_SIZE = 100_000; // 100_000 (default) - 1000 (for tests)\n\n        /// <summary>\n        /// Size, in PAGES, for each buffer array (used in MemoryStore)\n        /// It's an array to increase after each extend - limited in highest value\n        /// Each byte array will be created with this size * PAGE_SIZE\n        /// Use minimal 12 to allocate at least 85Kb per segment (will use LOH)\n        /// </summary>\n        public static int[] MEMORY_SEGMENT_SIZES = new int[] { 12, 50, 100, 500, 1000 }; // 8Mb per extend\n\n        /// <summary>\n        /// Define how many documents will be keep in memory until clear cache and remove support to orderby/groupby\n        /// </summary>\n        public const int VIRTUAL_INDEX_MAX_CACHE = 2000;\n\n        /// <summary>\n        /// Define how many bytes each merge sort container will be created\n        /// </summary>\n        public const int CONTAINER_SORT_SIZE = 100 * PAGE_SIZE;\n    }\n\n    /// <summary>\n    /// Internal class to read old LiteDB v4 database version (datafile v7 structure)\n    /// </summary>\n    internal class FileReaderV7 : IFileReader\n    {\n        // v7 uses 4k page size\n        private const int V7_PAGE_SIZE = 4096;\n\n        private readonly Stream _stream;\n        private readonly LiteDB.BsonDocument _header;\n\n        private byte[] _buffer = new byte[V7_PAGE_SIZE];\n\n        public FileReaderV7(Stream stream, string password)\n        {\n            _stream = stream;\n\n            // only userVersion was avaiable in old file format versions\n            _header = this.ReadPage(0);\n\n            if (password == null && _header[\"salt\"].AsBinary.IsFullZero() == false)\n            {\n                throw new LiteDB.LiteException(\"Current data file requires password\");\n            }\n        }\n\n        /// <summary>\n        /// Read all collection based on header page\n        /// </summary>\n        public IEnumerable<string> GetCollections()\n        {\n            return _header[\"collections\"].AsDocument.Keys;\n        }\n\n        /// <summary>\n        /// Read all indexes from all collection pages\n        /// </summary>\n        public IEnumerable<IndexInfo> GetIndexes(string collection)\n        {\n            var pageID = (uint)_header[\"collections\"].AsDocument[collection].AsInt32;\n            var page = this.ReadPage(pageID);\n\n            foreach (var index in page[\"indexes\"].AsArray)\n            {\n                string name = Regex.Replace(index.Index(\"name\").AsString, @\"[^a-z0-9]\", \"\", RegexOptions.IgnoreCase | RegexOptions.Compiled);\n                if (name.Length > INDEX_NAME_MAX_LENGTH)\n                {\n                    name = name.Substring(0, INDEX_NAME_MAX_LENGTH);\n                }\n\n                yield return new IndexInfo\n                {\n                    Collection = collection,\n                    Name = name,\n                    Expression = index.Index(\"expression\").AsString,\n                    Unique = index.Index(\"unique\").AsBoolean\n                };\n            }\n        }\n\n        /// <summary>\n        /// Get all document using an indexInfo as start point (_id index).\n        /// </summary>\n        public IEnumerable<LiteDB.BsonDocument> GetDocuments(string collection)\n        {\n            var colPageID = (uint)_header[\"collections\"].AsDocument[collection].AsInt32;\n            var col = this.ReadPage(colPageID);\n            var headPageID = (uint)col.Index(\"indexes\").Index(0).Index(\"headPageID\").AsInt32;\n\n            var indexPages = this.VisitIndexPages(headPageID);\n\n            foreach (var indexPageID in indexPages)\n            {\n                var indexPage = this.ReadPage(indexPageID);\n\n                foreach (var node in indexPage[\"nodes\"].AsArray)\n                {\n                    var dataBlock = node.Index(\"dataBlock\");\n\n                    // if datablock link to a data page\n                    if (dataBlock.Index(\"pageID\").AsInt32 != -1)\n                    {\n                        // read dataPage and data block\n                        var dataPage = this.ReadPage((uint)dataBlock.Index(\"pageID\").AsInt32);\n\n                        if (dataPage[\"pageType\"].AsInt32 != 4) continue;\n\n                        var block = dataPage[\"blocks\"].AsArray.FirstOrDefault(x => x.Index(\"index\") == dataBlock.Index(\"index\"))?.AsDocument;\n\n                        if (block == null) continue;\n\n                        // read byte[] from block or from extend pages\n                        var data = block[\"extendPageID\"] == -1 ?\n                            block[\"data\"].AsBinary :\n                            this.ReadExtendData((uint)block[\"extendPageID\"].AsInt32);\n\n                        if (data.Length == 0) continue;\n\n                        // BSON format still same from all version\n                        var doc = LiteDB.BsonSerializer.Deserialize(data);\n\n                        // change _id PK in _chunks collection\n                        if (collection == \"_chunks\")\n                        {\n                            var parts = doc[\"_id\"].AsString.Split('\\\\');\n\n                            if (!int.TryParse(parts[1], out var n)) throw new LiteDB.LiteException(\"_id\");\n\n                            doc[\"_id\"] = new LiteDB.BsonDocument\n                            {\n                                [\"f\"] = parts[0],\n                                [\"n\"] = n\n                            };\n                        }\n\n                        yield return doc;\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Read all database pages from v7 structure into a flexible BsonDocument - only read what really needs\n        /// </summary>\n        private LiteDB.BsonDocument ReadPage(uint pageID)\n        {\n            if (pageID * V7_PAGE_SIZE > _stream.Length) return null;\n\n            _stream.Position = pageID * V7_PAGE_SIZE; // v7 uses 4k page size\n\n            _stream.Read(_buffer, 0, V7_PAGE_SIZE);\n\n            // decrypt encrypted page (except header page - header are plain data)\n            var reader = new ByteReader(_buffer);\n\n            // reading page header\n            var page = new LiteDB.BsonDocument\n            {\n                [\"pageID\"] = (int)reader.ReadUInt32(),\n                [\"pageType\"] = (int)reader.ReadByte(),\n                [\"prevPageID\"] = (int)reader.ReadUInt32(),\n                [\"nextPageID\"] = (int)reader.ReadUInt32(),\n                [\"itemCount\"] = (int)reader.ReadUInt16()\n            };\n\n            // skip freeByte + reserved\n            reader.ReadBytes(2 + 8);\n\n            #region Header (1)\n\n            // read header\n            if (page[\"pageType\"] == 1)\n            {\n                var info = reader.ReadString(27);\n                var ver = reader.ReadByte();\n\n                if (string.CompareOrdinal(info, HeaderPage_HEADER_INFO) != 0 || ver != 7)\n                {\n                    throw new LiteDB.LiteException(\"\");\n                }\n\n                // skip ChangeID + FreeEmptyPageID + LastPageID\n                reader.ReadBytes(2 + 4 + 4);\n                page[\"userVersion\"] = (int)reader.ReadUInt16();\n                page[\"password\"] = reader.ReadBytes(20);\n                page[\"salt\"] = reader.ReadBytes(16);\n                page[\"collections\"] = new LiteDB.BsonDocument();\n\n                var cols = reader.ReadByte();\n\n                for (var i = 0; i < cols; i++)\n                {\n                    var name = reader.ReadString();\n                    var colPageID = reader.ReadUInt32();\n\n                    page[\"collections\"].WriteIndex(name, (int)colPageID);\n                }\n            }\n\n            #endregion\n\n            #region Collection (2)\n\n            // collection page\n            else if (page[\"pageType\"] == 2)\n            {\n                page[\"collectionName\"] = reader.ReadString();\n                page[\"indexes\"] = new LiteDB.BsonArray();\n                reader.ReadBytes(12);\n\n                for (var i = 0; i < 16; i++)\n                {\n                    var index = new LiteDB.BsonDocument();\n\n                    var field = reader.ReadString();\n                    var eq = field.IndexOf('=');\n\n                    if (eq > 0)\n                    {\n                        index[\"name\"] = field.Substring(0, eq);\n                        index[\"expression\"] = field.Substring(eq + 1);\n                    }\n                    else\n                    {\n                        index[\"name\"] = field;\n                        index[\"expression\"] = \"$.\" + field;\n                    }\n\n                    index[\"unique\"] = reader.ReadBoolean();\n                    index[\"headPageID\"] = (int)reader.ReadUInt32();\n\n                    // skip HeadNode (index) + TailNode + FreeIndexPageID\n                    reader.ReadBytes(2 + 6 + 4);\n\n                    if (field.Length > 0)\n                    {\n                        page[\"indexes\"].AsArray.Add(index);\n                    }\n                }\n            }\n\n            #endregion\n\n            #region Index (3)\n            else if (page[\"pageType\"] == 3)\n            {\n                page[\"nodes\"] = new LiteDB.BsonArray();\n\n                for (var i = 0; i < page[\"itemCount\"].AsInt32; i++)\n                {\n                    var node = new LiteDB.BsonDocument\n                    {\n                        [\"index\"] = (int)reader.ReadUInt16()\n                    };\n\n                    var levels = reader.ReadByte();\n\n                    // skip Slot + PrevNode + NextNode\n                    reader.ReadBytes(1 + 6 + 6);\n\n                    var length = reader.ReadUInt16();\n\n                    // skip DataType + KeyValue\n                    reader.ReadBytes(1 + length);\n\n                    node[\"dataBlock\"] = new LiteDB.BsonDocument\n                    {\n                        [\"pageID\"] = (int)reader.ReadUInt32(),\n                        [\"index\"] = (int)reader.ReadUInt16()\n                    };\n\n                    // reading Prev[0]\n                    node[\"prev\"] = new LiteDB.BsonDocument\n                    {\n                        [\"pageID\"] = (int)reader.ReadUInt32(),\n                        [\"index\"] = (int)reader.ReadUInt16()\n                    };\n\n                    // reading Next[0]\n                    node[\"next\"] = new LiteDB.BsonDocument\n                    {\n                        [\"pageID\"] = (int)reader.ReadUInt32(),\n                        [\"index\"] = (int)reader.ReadUInt16()\n                    };\n\n                    // skip Prev/Next[1..N]\n                    reader.ReadBytes((levels - 1) * (6 + 6));\n\n                    page[\"nodes\"].AsArray.Add(node);\n                }\n            }\n\n            #endregion\n\n            #region Data (4)\n            else if (page[\"pageType\"] == 4)\n            {\n                page[\"blocks\"] = new LiteDB.BsonArray();\n\n                for (var i = 0; i < page[\"itemCount\"].AsInt32; i++)\n                {\n                    var block = new LiteDB.BsonDocument\n                    {\n                        [\"index\"] = (int)reader.ReadUInt16(),\n                        [\"extendPageID\"] = (int)reader.ReadUInt32()\n                    };\n\n                    var length = reader.ReadUInt16();\n\n                    block[\"data\"] = reader.ReadBytes(length);\n\n                    page[\"blocks\"].AsArray.Add(block);\n                }\n            }\n\n            #endregion\n\n            #region Extend (5)\n            else if (page[\"pageType\"] == 5)\n            {\n                page[\"data\"] = reader.ReadBytes(page[\"itemCount\"].AsInt32);\n            }\n\n            #endregion\n\n            return page;\n        }\n\n        public int UserVersion => (int)_header[\"userVersion\"];\n\n        /// <summary>\n        /// Read extend data block\n        /// </summary>\n        private byte[] ReadExtendData(uint extendPageID)\n        {\n            // read all extended pages and build byte array\n            using (var buffer = new MemoryStream())\n            {\n                while (extendPageID != uint.MaxValue)\n                {\n                    var page = this.ReadPage(extendPageID);\n\n                    if (page[\"pageType\"].AsInt32 != 5) return new byte[0];\n\n                    buffer.Write(page[\"data\"].AsBinary, 0, page[\"itemCount\"].AsInt32);\n\n                    extendPageID = (uint)page[\"nextPageID\"].AsInt32;\n                }\n\n                return buffer.ToArray();\n            }\n        }\n\n        /// <summary>\n        /// Visit all index pages by starting index page. Get a list with all index pages from a collection\n        /// </summary>\n        private HashSet<uint> VisitIndexPages(uint startPageID)\n        {\n            var toVisit = new HashSet<uint>(new uint[] { startPageID });\n            var visited = new HashSet<uint>();\n\n            while (toVisit.Count > 0)\n            {\n                var indexPageID = toVisit.First();\n\n                toVisit.Remove(indexPageID);\n\n                var indexPage = this.ReadPage(indexPageID);\n\n                if (indexPage == null || indexPage[\"pageType\"] != 3) continue;\n\n                visited.Add(indexPageID);\n                foreach (var node in indexPage[\"nodes\"].AsArray)\n                {\n                    var prev = (uint)node.Index(\"prev\").Index(\"pageID\").AsInt32;\n                    var next = (uint)node.Index(\"next\").Index(\"pageID\").AsInt32;\n\n                    if (!visited.Contains(prev)) toVisit.Add(prev);\n                    if (!visited.Contains(next)) toVisit.Add(next);\n                }\n            }\n\n            return visited;\n        }\n    }\n}"
  },
  {
    "path": "source/Playnite/Database/Collections/PlatformsCollection.cs",
    "content": "﻿using Playnite.Emulators;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class PlatformsCollection : ItemCollection<Platform>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public PlatformsCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.Platforms)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<Platform>().Id(a => a.Id, false);\r\n        }\r\n\r\n        private void RemoveUsage(Guid platformId)\r\n        {\r\n            foreach (var game in db.Games.Where(a => a.PlatformIds?.Contains(platformId) == true))\r\n            {\r\n                game.PlatformIds.Remove(platformId);\r\n                db.Games.Update(game);\r\n            }\r\n\r\n            foreach (var emulator in db.Emulators)\r\n            {\r\n                if (!emulator.CustomProfiles.HasItems())\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                var updated = false;\r\n                foreach (var profile in emulator.CustomProfiles.Where(a => a.Platforms?.Contains(platformId) == true))\r\n                {\r\n                    profile.Platforms.Remove(platformId);\r\n                    updated = true;\r\n                }\r\n\r\n                if (updated)\r\n                {\r\n                    db.Emulators.Update(emulator);\r\n                }\r\n            }\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            var dbItem = Get(id);\r\n            db.RemoveFile(dbItem.Icon);\r\n            db.RemoveFile(dbItem.Cover);\r\n            db.RemoveFile(dbItem.Background);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(Platform item)\r\n        {\r\n            return Remove(item.Id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<Platform> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                    var dbItem = Get(item.Id);\r\n                    db.RemoveFile(dbItem.Icon);\r\n                    db.RemoveFile(dbItem.Cover);\r\n                    db.RemoveFile(dbItem.Background);\r\n                }\r\n            }\r\n\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n\r\n        public override void Update(IEnumerable<Platform> items)\r\n        {\r\n            foreach (var item in items)\r\n            {\r\n                var dbItem = Get(item.Id);\r\n                if (!dbItem.Icon.IsNullOrEmpty() && dbItem.Icon != item.Icon)\r\n                {\r\n                    db.RemoveFile(dbItem.Icon);\r\n                }\r\n\r\n                if (!dbItem.Cover.IsNullOrEmpty() && dbItem.Cover != item.Cover)\r\n                {\r\n                    db.RemoveFile(dbItem.Cover);\r\n                }\r\n\r\n                if (!dbItem.Background.IsNullOrEmpty() && dbItem.Background != item.Background)\r\n                {\r\n                    db.RemoveFile(dbItem.Background);\r\n                }\r\n            }\r\n\r\n            base.Update(items);\r\n        }\r\n\r\n        public override void Update(Platform item)\r\n        {\r\n            var dbItem = Get(item.Id);\r\n            if (!dbItem.Icon.IsNullOrEmpty() && dbItem.Icon != item.Icon)\r\n            {\r\n                db.RemoveFile(dbItem.Icon);\r\n            }\r\n\r\n            if (!dbItem.Cover.IsNullOrEmpty() && dbItem.Cover != item.Cover)\r\n            {\r\n                db.RemoveFile(dbItem.Cover);\r\n            }\r\n\r\n            if (!dbItem.Background.IsNullOrEmpty() && dbItem.Background != item.Background)\r\n            {\r\n                db.RemoveFile(dbItem.Background);\r\n            }\r\n\r\n            base.Update(item);\r\n        }\r\n\r\n        public override Platform Add(MetadataProperty property)\r\n        {\r\n            if (property is MetadataSpecProperty specProp)\r\n            {\r\n                var exPlat = this.FirstOrDefault(a => a.SpecificationId == specProp.Id);\r\n                if (exPlat != null)\r\n                {\r\n                    return exPlat;\r\n                }\r\n\r\n                var plat = Emulation.Platforms.FirstOrDefault(a => a.Id == specProp.Id || a.Name == specProp.Id);\r\n                if (plat != null)\r\n                {\r\n                    exPlat = this.FirstOrDefault(a => a.SpecificationId == plat.Id);\r\n                    if (exPlat != null)\r\n                    {\r\n                        return exPlat;\r\n                    }\r\n                    else\r\n                    {\r\n                        var newPlat = new Platform(plat.Name) { SpecificationId = plat.Id };\r\n                        Add(newPlat);\r\n                        return newPlat;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    var newPlat = new Platform(plat.Id);\r\n                    Add(newPlat);\r\n                    return newPlat;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return base.Add(property);\r\n            }\r\n        }\r\n\r\n        public override IEnumerable<Platform> Add(IEnumerable<MetadataProperty> properties)\r\n        {\r\n            foreach (var property in properties)\r\n            {\r\n                if (property is MetadataSpecProperty specProp)\r\n                {\r\n                    yield return Add(specProp);\r\n                }\r\n                else\r\n                {\r\n                    yield return base.Add(property);\r\n                }\r\n            }\r\n        }\r\n\r\n        public override Platform GetOrGenerate(MetadataProperty property)\r\n        {\r\n            if (property is MetadataSpecProperty specProp)\r\n            {\r\n                var exPlat = this.FirstOrDefault(a => a.SpecificationId == specProp.Id);\r\n                if (exPlat != null)\r\n                {\r\n                    return exPlat;\r\n                }\r\n\r\n                var plat = Emulation.Platforms.FirstOrDefault(a => a.Id == specProp.Id || a.Name == specProp.Id);\r\n                if (plat != null)\r\n                {\r\n                    exPlat = this.FirstOrDefault(a => a.SpecificationId == plat.Id);\r\n                    if (exPlat != null)\r\n                    {\r\n                        return exPlat;\r\n                    }\r\n                    else\r\n                    {\r\n                        return new Platform(plat.Name) { SpecificationId = plat.Id };\r\n                    }\r\n                }\r\n\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                return base.GetOrGenerate(property);\r\n            }\r\n        }\r\n\r\n        public override IEnumerable<Platform> GetOrGenerate(IEnumerable<MetadataProperty> properties)\r\n        {\r\n            foreach (var property in properties)\r\n            {\r\n                if (property is MetadataSpecProperty specProp)\r\n                {\r\n                    yield return GetOrGenerate(specProp);\r\n                }\r\n                else\r\n                {\r\n                    yield return base.GetOrGenerate(property);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/RegionsCollection.cs",
    "content": "﻿using Playnite.Emulators;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class RegionsCollection : ItemCollection<Region>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public RegionsCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.Regions)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<Region>().Id(a => a.Id, false);\r\n        }\r\n\r\n        private void RemoveUsage(Guid id)\r\n        {\r\n            foreach (var game in db.Games.Where(a => a.RegionIds?.Contains(id) == true))\r\n            {\r\n                game.RegionIds.Remove(id);\r\n                db.Games.Update(game);\r\n            }\r\n        }\r\n\r\n        public override bool Remove(Region itemToRemove)\r\n        {\r\n            RemoveUsage(itemToRemove.Id);\r\n            return base.Remove(itemToRemove);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<Region> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                }\r\n            }\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n\r\n        public override Region Add(MetadataProperty property)\r\n        {\r\n            if (property is MetadataSpecProperty specProp)\r\n            {\r\n                var exRegion = this.FirstOrDefault(a => a.SpecificationId == specProp.Id);\r\n                if (exRegion != null)\r\n                {\r\n                    return exRegion;\r\n                }\r\n\r\n                var reg = Emulation.Regions.FirstOrDefault(a => a.Id == specProp.Id || a.Name == specProp.Id);\r\n                if (reg != null)\r\n                {\r\n                    exRegion = this.FirstOrDefault(a => a.SpecificationId == reg.Id);\r\n                    if (exRegion != null)\r\n                    {\r\n                        return exRegion;\r\n                    }\r\n                    else\r\n                    {\r\n                        var newReg = new Region(reg.Name) { SpecificationId = reg.Id };\r\n                        Add(newReg);\r\n                        return newReg;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    var newReg = new Region(reg.Id);\r\n                    Add(newReg);\r\n                    return newReg;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return base.Add(property);\r\n            }\r\n        }\r\n\r\n        public override IEnumerable<Region> Add(IEnumerable<MetadataProperty> properties)\r\n        {\r\n            foreach (var property in properties)\r\n            {\r\n                if (property is MetadataSpecProperty specProp)\r\n                {\r\n                    yield return Add(specProp);\r\n                }\r\n                else\r\n                {\r\n                    yield return base.Add(property);\r\n                }\r\n            }\r\n        }\r\n\r\n        public override Region GetOrGenerate(MetadataProperty property)\r\n        {\r\n            if (property is MetadataSpecProperty specProp)\r\n            {\r\n                var exRegion = this.FirstOrDefault(a => a.SpecificationId == specProp.Id);\r\n                if (exRegion != null)\r\n                {\r\n                    return exRegion;\r\n                }\r\n\r\n                var reg = Emulation.Regions.FirstOrDefault(a => a.Id == specProp.Id || a.Name == specProp.Id);\r\n                if (reg != null)\r\n                {\r\n                    exRegion = this.FirstOrDefault(a => a.SpecificationId == reg.Id);\r\n                    if (exRegion != null)\r\n                    {\r\n                        return exRegion;\r\n                    }\r\n                    else\r\n                    {\r\n                        return new Region(reg.Name) { SpecificationId = reg.Id };\r\n                    }\r\n                }\r\n\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                return base.GetOrGenerate(property);\r\n            }\r\n        }\r\n\r\n        public override IEnumerable<Region> GetOrGenerate(IEnumerable<MetadataProperty> properties)\r\n        {\r\n            foreach (var property in properties)\r\n            {\r\n                if (property is MetadataSpecProperty specProp)\r\n                {\r\n                    yield return GetOrGenerate(specProp);\r\n                }\r\n                else\r\n                {\r\n                    yield return base.GetOrGenerate(property);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/SeriesCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class SeriesCollection : ItemCollection<Series>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public SeriesCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.Series)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<Series>().Id(a => a.Id, false);\r\n        }\r\n\r\n        private void RemoveUsage(Guid id)\r\n        {\r\n            foreach (var game in db.Games.Where(a => a.SeriesIds?.Contains(id) == true))\r\n            {\r\n                game.SeriesIds.Remove(id);\r\n                db.Games.Update(game);\r\n            }\r\n        }\r\n\r\n        public override bool Remove(Series itemToRemove)\r\n        {\r\n            RemoveUsage(itemToRemove.Id);\r\n            return base.Remove(itemToRemove);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<Series> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                }\r\n            }\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/Collections/TagsCollection.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class TagsCollection : ItemCollection<Tag>\r\n    {\r\n        private readonly GameDatabase db;\r\n\r\n        public TagsCollection(GameDatabase database, LiteDB.BsonMapper mapper) : base(mapper, type: GameDatabaseCollection.Tags)\r\n        {\r\n            db = database;\r\n        }\r\n\r\n        public static void MapLiteDbEntities(LiteDB.BsonMapper mapper)\r\n        {\r\n            mapper.Entity<Tag>().Id(a => a.Id, false);\r\n        }\r\n\r\n        private void RemoveUsage(Guid id)\r\n        {\r\n            foreach (var game in db.Games.Where(a => a.TagIds?.Contains(id) == true))\r\n            {\r\n                game.TagIds.Remove(id);\r\n                db.Games.Update(game);\r\n            }\r\n        }\r\n\r\n        public override bool Remove(Tag itemToRemove)\r\n        {\r\n            RemoveUsage(itemToRemove.Id);\r\n            return base.Remove(itemToRemove);\r\n        }\r\n\r\n        public override bool Remove(Guid id)\r\n        {\r\n            RemoveUsage(id);\r\n            return base.Remove(id);\r\n        }\r\n\r\n        public override bool Remove(IEnumerable<Tag> itemsToRemove)\r\n        {\r\n            if (itemsToRemove.HasItems())\r\n            {\r\n                foreach (var item in itemsToRemove)\r\n                {\r\n                    RemoveUsage(item.Id);\r\n                }\r\n            }\r\n            return base.Remove(itemsToRemove);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/DatabaseExplorer.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public enum ExplorerField\r\n    {\r\n        [Description(LOC.SettingsTopPanelFilterPresetsItem)]\r\n        Presets,\r\n        [Description(LOC.PlatformTitle)]\r\n        Platform,\r\n        [Description(LOC.GameProviderTitle)]\r\n        Library,\r\n        [Description(LOC.CategoryLabel)]\r\n        Category,\r\n        [Description(LOC.GameLastActivityTitle)]\r\n        LastActivity,\r\n        [Description(LOC.RecentActivityLabel)]\r\n        RecentActivity,\r\n        [Description(LOC.GenreLabel)]\r\n        Genre,\r\n        [Description(LOC.GameReleaseYearTitle)]\r\n        ReleaseYear,\r\n        [Description(LOC.DeveloperLabel)]\r\n        Developer,\r\n        [Description(LOC.PublisherLabel)]\r\n        Publisher,\r\n        [Description(LOC.TagLabel)]\r\n        Tag,\r\n        [Description(LOC.SeriesLabel)]\r\n        Series,\r\n        [Description(LOC.AgeRatingLabel)]\r\n        AgeRating,\r\n        [Description(LOC.RegionLabel)]\r\n        Region,\r\n        [Description(LOC.SourceLabel)]\r\n        Source,\r\n        [Description(LOC.TimePlayed)]\r\n        PlayTime,\r\n        [Description(LOC.InstallSizeLabel)]\r\n        InstallSize,\r\n        [Description(LOC.CompletionStatus)]\r\n        CompletionStatus,\r\n        [Description(LOC.UserScore)]\r\n        UserScore,\r\n        [Description(LOC.CriticScore)]\r\n        CriticScore,\r\n        [Description(LOC.CommunityScore)]\r\n        CommunityScore,\r\n        [Description(LOC.DateAddedLabel)]\r\n        Added,\r\n        [Description(LOC.DateModifiedLabel)]\r\n        Modified,\r\n        [Description(LOC.FeatureLabel)]\r\n        Feature,\r\n        [Description(LOC.GameNameTitle)]\r\n        Name,\r\n        [Description(LOC.GameInstallationStatus)]\r\n        InstallStatus\r\n    }\r\n\r\n    // TODO: Rewrite this mess.\r\n    public class DatabaseExplorer : ObservableObject\r\n    {\r\n        public class ExplorableField\r\n        {\r\n            public ExplorerField Field { get; }\r\n\r\n            public ExplorableField(ExplorerField field)\r\n            {\r\n                Field = field;\r\n            }\r\n\r\n            public override string ToString()\r\n            {\r\n                return Field.GetDescription();\r\n            }\r\n        }\r\n\r\n        public enum SelectionObjectType : int\r\n        {\r\n            All = 9998,\r\n            None = 9999\r\n        }\r\n\r\n        public class SelectionObject : ObservableObject\r\n        {\r\n            public string DisplayName { get; }\r\n            public object Value { get; }\r\n\r\n            public string Name\r\n            {\r\n                get => DisplayName.IsNullOrEmpty() ? Value.ToString() : DisplayName;\r\n            }\r\n\r\n            public SelectionObject(object value, string displayName)\r\n            {\r\n                Value = value;\r\n                DisplayName = displayName;\r\n            }\r\n\r\n            public SelectionObject(object value)\r\n            {\r\n                Value = value;\r\n            }\r\n        }\r\n\r\n        private readonly IGameDatabaseMain database;\r\n        private readonly ExtensionFactory extensions;\r\n        private readonly FilterSettings filters;\r\n        private readonly PlayniteSettings settings;\r\n        private readonly MainViewModelBase mainModel;\r\n        private bool ignoreObjectSelectionChanges = false;\r\n\r\n        public List<ExplorableField> Fields { get; set; }\r\n\r\n        private ExplorableField selectedField;\r\n        public ExplorableField SelectedField\r\n        {\r\n            get => selectedField;\r\n            set\r\n            {\r\n                if (value != selectedField)\r\n                {\r\n                    if (selectedField != null)\r\n                    {\r\n                        ApplyFilter(selectedField.Field, null);\r\n                    }\r\n\r\n                    selectedField = value;\r\n                    if (selectedField != null)\r\n                    {\r\n                        settings.ViewSettings.SelectedExplorerField = selectedField.Field;\r\n                        LoadValues(selectedField.Field);\r\n                    }\r\n\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n        }\r\n\r\n        private List<SelectionObject> fieldValues;\r\n        public List<SelectionObject> FieldValues\r\n        {\r\n            get => fieldValues;\r\n            set\r\n            {\r\n                fieldValues = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectionObject selectedFieldObject;\r\n        public SelectionObject SelectedFieldObject\r\n        {\r\n            get => selectedFieldObject;\r\n            set\r\n            {\r\n                selectedFieldObject = value;\r\n                if (selectedFieldObject != null && !ignoreObjectSelectionChanges)\r\n                {\r\n                    ApplyFilter(SelectedField.Field, selectedFieldObject);\r\n                }\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public DatabaseExplorer(\r\n            IGameDatabaseMain database,\r\n            ExtensionFactory extensions,\r\n            PlayniteSettings settings,\r\n            MainViewModelBase mainModel)\r\n        {\r\n            this.database = database;\r\n            this.extensions = extensions;\r\n            this.filters = settings.FilterSettings;\r\n            this.settings = settings;\r\n            this.mainModel = mainModel;\r\n            settings.PropertyChanged += Settings_PropertyChanged;\r\n\r\n            Fields = new List<ExplorableField>();\r\n            foreach (ExplorerField val in Enum.GetValues(typeof(ExplorerField)))\r\n            {\r\n                Fields.Add(new ExplorableField(val));\r\n            }\r\n\r\n            Fields = Fields.OrderBy(a => a.Field.GetDescription()).ToList();\r\n\r\n            if (database.IsOpen)\r\n            {\r\n                if (settings.ExplorerPanelVisible)\r\n                {\r\n                    SelectedField = Fields.FirstOrDefault(a => a.Field == settings.ViewSettings.SelectedExplorerField);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                database.DatabaseOpened += (s, e) =>\r\n                {\r\n                    if (settings.ExplorerPanelVisible)\r\n                    {\r\n                        SelectedField = Fields.FirstOrDefault(a => a.Field == settings.ViewSettings.SelectedExplorerField);\r\n                    }\r\n                };\r\n            }\r\n\r\n            database.Games.ItemUpdated += Games_ItemUpdated;\r\n            database.Games.ItemCollectionChanged += Games_ItemCollectionChanged;\r\n            database.Platforms.ItemCollectionChanged += (s, e) => DatabaseCollection_ItemCollectionChanged(ExplorerField.Platform, e);\r\n            database.Platforms.ItemUpdated += (s, e) => DatabaseCollection_ItemUpdated(ExplorerField.Platform, e);\r\n            database.Genres.ItemCollectionChanged += (s, e) => DatabaseCollection_ItemCollectionChanged(ExplorerField.Genre, e);\r\n            database.Genres.ItemUpdated += (s, e) => DatabaseCollection_ItemUpdated(ExplorerField.Genre, e);\r\n            database.AgeRatings.ItemCollectionChanged += (s, e) => DatabaseCollection_ItemCollectionChanged(ExplorerField.AgeRating, e);\r\n            database.AgeRatings.ItemUpdated += (s, e) => DatabaseCollection_ItemUpdated(ExplorerField.AgeRating, e);\r\n            database.Categories.ItemCollectionChanged += (s, e) => DatabaseCollection_ItemCollectionChanged(ExplorerField.Category, e);\r\n            database.Categories.ItemUpdated += (s, e) => DatabaseCollection_ItemUpdated(ExplorerField.Category, e);\r\n            database.Regions.ItemCollectionChanged += (s, e) => DatabaseCollection_ItemCollectionChanged(ExplorerField.Region, e);\r\n            database.Regions.ItemUpdated += (s, e) => DatabaseCollection_ItemUpdated(ExplorerField.Region, e);\r\n            database.Series.ItemCollectionChanged += (s, e) => DatabaseCollection_ItemCollectionChanged(ExplorerField.Series, e);\r\n            database.Series.ItemUpdated += (s, e) => DatabaseCollection_ItemUpdated(ExplorerField.Series, e);\r\n            database.Sources.ItemCollectionChanged += (s, e) => DatabaseCollection_ItemCollectionChanged(ExplorerField.Source, e);\r\n            database.Sources.ItemUpdated += (s, e) => DatabaseCollection_ItemUpdated(ExplorerField.Source, e);\r\n            database.Tags.ItemCollectionChanged += (s, e) => DatabaseCollection_ItemCollectionChanged(ExplorerField.Tag, e);\r\n            database.Tags.ItemUpdated += (s, e) => DatabaseCollection_ItemUpdated(ExplorerField.Tag, e);\r\n            database.Features.ItemCollectionChanged += (s, e) => DatabaseCollection_ItemCollectionChanged(ExplorerField.Feature, e);\r\n            database.Features.ItemUpdated += (s, e) => DatabaseCollection_ItemUpdated(ExplorerField.Feature, e);\r\n            database.FilterPresets.ItemCollectionChanged += (s, e) => DatabaseCollection_ItemCollectionChanged(ExplorerField.Presets, e);\r\n            database.FilterPresets.ItemUpdated += (s, e) => DatabaseCollection_ItemUpdated(ExplorerField.Presets, e);\r\n            (database.FilterPresets as FilterPresetsCollection).OnSettingsUpdated += Database_OnFilterSettingsUpdated;\r\n            database.Companies.ItemCollectionChanged += (s, e) =>\r\n            {\r\n                DatabaseCollection_ItemCollectionChanged(ExplorerField.Publisher, e);\r\n                DatabaseCollection_ItemCollectionChanged(ExplorerField.Developer, e);\r\n            };\r\n\r\n            database.Companies.ItemUpdated += (s, e) =>\r\n            {\r\n                DatabaseCollection_ItemUpdated(ExplorerField.Publisher, e);\r\n                DatabaseCollection_ItemUpdated(ExplorerField.Developer, e);\r\n            };\r\n\r\n            database.AgeRatingsInUseUpdated += (_, __) => Database_DatabaseCollectionInUseUpdated(ExplorerField.AgeRating);\r\n            database.CategoriesInUseUpdated += (_, __) => Database_DatabaseCollectionInUseUpdated(ExplorerField.Category);\r\n            database.DevelopersInUseUpdated += (_, __) => Database_DatabaseCollectionInUseUpdated(ExplorerField.Developer);\r\n            database.FeaturesInUseUpdated += (_, __) => Database_DatabaseCollectionInUseUpdated(ExplorerField.Feature);\r\n            database.GenresInUseUpdated += (_, __) => Database_DatabaseCollectionInUseUpdated(ExplorerField.Genre);\r\n            database.PlatformsInUseUpdated += (_, __) => Database_DatabaseCollectionInUseUpdated(ExplorerField.Platform);\r\n            database.PublishersInUseUpdated += (_, __) => Database_DatabaseCollectionInUseUpdated(ExplorerField.Publisher);\r\n            database.RegionsInUseUpdated += (_, __) => Database_DatabaseCollectionInUseUpdated(ExplorerField.Region);\r\n            database.SeriesInUseUpdated += (_, __) => Database_DatabaseCollectionInUseUpdated(ExplorerField.Series);\r\n            database.SourcesInUseUpdated += (_, __) => Database_DatabaseCollectionInUseUpdated(ExplorerField.Source);\r\n            database.TagsInUseUpdated += (_, __) => Database_DatabaseCollectionInUseUpdated(ExplorerField.Tag);\r\n        }\r\n\r\n        private void Database_OnFilterSettingsUpdated(object sender, FilterPresetsSettingsUpdateEvent e)\r\n        {\r\n            if (SelectedField?.Field != ExplorerField.Presets)\r\n            {\r\n                return;\r\n            }\r\n\r\n            LoadValues(ExplorerField.Presets);\r\n        }\r\n\r\n        private void Database_DatabaseCollectionInUseUpdated(ExplorerField field)\r\n        {\r\n            if (!settings.UsedFieldsOnlyOnFilterLists)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (settings.ExplorerPanelVisible && SelectedField.Field == field)\r\n            {\r\n                var oldSelection = SelectedFieldObject;\r\n                ignoreObjectSelectionChanges = true;\r\n                var refreshSelection = false;\r\n                LoadValues(field);\r\n                if (oldSelection != null && FieldValues.FirstOrDefault(a => a.Value.Equals(oldSelection.Value)) != null)\r\n                {\r\n                    SelectedFieldObject = FieldValues.FirstOrDefault(a => a.Value.Equals(oldSelection.Value));\r\n                }\r\n                else\r\n                {\r\n                    refreshSelection = true;\r\n                }\r\n\r\n                ignoreObjectSelectionChanges = false;\r\n                if (refreshSelection)\r\n                {\r\n                    SelectedFieldObject = FieldValues[0];\r\n                }\r\n            }\r\n        }\r\n\r\n        private void DatabaseCollection_ItemUpdated<T>(ExplorerField field, ItemUpdatedEventArgs<T> e) where T : DatabaseObject\r\n        {\r\n            if (settings.ExplorerPanelVisible && SelectedField.Field == field)\r\n            {\r\n                foreach (var item in FieldValues)\r\n                {\r\n                    item.OnPropertyChanged(nameof(SelectionObject.Name));\r\n                }\r\n            }\r\n        }\r\n\r\n        private void DatabaseCollection_ItemCollectionChanged<T>(ExplorerField field, ItemCollectionChangedEventArgs<T> e) where T : DatabaseObject\r\n        {\r\n            if (settings.UsedFieldsOnlyOnFilterLists && field != ExplorerField.Presets)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (settings.ExplorerPanelVisible && SelectedField.Field == field)\r\n            {\r\n                var oldSelection = SelectedFieldObject;\r\n                ignoreObjectSelectionChanges = true;\r\n                var refreshSelection = false;\r\n                LoadValues(field);\r\n                if (oldSelection != null && FieldValues.FirstOrDefault(a => a.Value.Equals(oldSelection.Value)) != null)\r\n                {\r\n                    SelectedFieldObject = FieldValues.FirstOrDefault(a => a.Value.Equals(oldSelection.Value));\r\n                }\r\n                else\r\n                {\r\n                    refreshSelection = true;\r\n                }\r\n\r\n                ignoreObjectSelectionChanges = false;\r\n                if (refreshSelection)\r\n                {\r\n                    if (FieldValues.HasItems())\r\n                    {\r\n                        SelectedFieldObject = FieldValues[0];\r\n                    }\r\n                    else\r\n                    {\r\n                        SelectedFieldObject = null;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Settings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(PlayniteSettings.ExplorerPanelVisible))\r\n            {\r\n                if (settings.ExplorerPanelVisible)\r\n                {\r\n                    SelectedField = Fields.FirstOrDefault(a => a.Field == settings.ViewSettings.SelectedExplorerField);\r\n                }\r\n                else\r\n                {\r\n                    SelectedField = null;\r\n                }\r\n            }\r\n            else if (e.PropertyName == nameof(PlayniteSettings.UsedFieldsOnlyOnFilterLists) && settings.ExplorerPanelVisible)\r\n            {\r\n                DatabaseCollection_ItemCollectionChanged<DatabaseObject>(SelectedField.Field, null);\r\n            }\r\n        }\r\n\r\n        private void Games_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<Game> e)\r\n        {\r\n            if (e.AddedItems.HasItems())\r\n            {\r\n                ProcessGameDataChages(e.AddedItems);\r\n            }\r\n        }\r\n\r\n        private void Games_ItemUpdated(object sender, ItemUpdatedEventArgs<Game> e)\r\n        {\r\n            ProcessGameDataChages(e.UpdatedItems.Select(a => a.NewData));\r\n        }\r\n\r\n        private void ProcessGameDataChages(IEnumerable<Game> gameUpdates)\r\n        {\r\n            if (!settings.ExplorerPanelVisible)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (SelectedField.Field == ExplorerField.ReleaseYear)\r\n            {\r\n                foreach (var change in gameUpdates)\r\n                {\r\n                    if (!IsReleaseYearLoaded(change.ReleaseYear))\r\n                    {\r\n                        UpdateReleaseDateValues();\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private bool IsRelevantGameFieldLoaded(Game game)\r\n        {\r\n            var relevantFieldChanged = false;\r\n            switch (SelectedField.Field)\r\n            {\r\n                case ExplorerField.Category:\r\n                    relevantFieldChanged = IsExplorableDbObjectLoaded(game.CategoryIds);\r\n                    break;\r\n                case ExplorerField.Genre:\r\n                    relevantFieldChanged = IsExplorableDbObjectLoaded(game.GenreIds);\r\n                    break;\r\n                case ExplorerField.Developer:\r\n                    relevantFieldChanged = IsExplorableDbObjectLoaded(game.DeveloperIds);\r\n                    break;\r\n                case ExplorerField.Publisher:\r\n                    relevantFieldChanged = IsExplorableDbObjectLoaded(game.PublisherIds);\r\n                    break;\r\n                case ExplorerField.Tag:\r\n                    relevantFieldChanged = IsExplorableDbObjectLoaded(game.TagIds);\r\n                    break;\r\n                case ExplorerField.Platform:\r\n                    relevantFieldChanged = IsExplorableDbObjectLoaded(game.PlatformIds);\r\n                    break;\r\n                case ExplorerField.Series:\r\n                    relevantFieldChanged = IsExplorableDbObjectLoaded(game.SeriesIds);\r\n                    break;\r\n                case ExplorerField.AgeRating:\r\n                    relevantFieldChanged = IsExplorableDbObjectLoaded(game.AgeRatingIds);\r\n                    break;\r\n                case ExplorerField.Region:\r\n                    relevantFieldChanged = IsExplorableDbObjectLoaded(game.RegionIds);\r\n                    break;\r\n                case ExplorerField.Source:\r\n                    relevantFieldChanged = IsExplorableDbObjectLoaded(game.SourceId);\r\n                    break;\r\n                case ExplorerField.ReleaseYear:\r\n                    relevantFieldChanged = IsReleaseYearLoaded(game.ReleaseYear);\r\n                    break;\r\n                case ExplorerField.Feature:\r\n                    relevantFieldChanged = IsExplorableDbObjectLoaded(game.FeatureIds);\r\n                    break;\r\n            }\r\n\r\n            return relevantFieldChanged;\r\n        }\r\n\r\n        private bool IsExplorableDbObjectLoaded(Guid id)\r\n        {\r\n            foreach (var val in FieldValues)\r\n            {\r\n                if (val.Value is DatabaseObject obj)\r\n                {\r\n                    if (obj.Id == id)\r\n                    {\r\n                        return true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        private bool IsExplorableDbObjectLoaded(List<Guid> ids)\r\n        {\r\n            if (!ids.HasItems())\r\n            {\r\n                return true;\r\n            }\r\n\r\n            return FieldValues.Where(a => a.Value is DatabaseObject).Select(a => ((DatabaseObject)a.Value).Id).Contains(ids);\r\n        }\r\n\r\n        private void UpdateReleaseDateValues()\r\n        {\r\n            var oldSelection = SelectedFieldObject;\r\n            ignoreObjectSelectionChanges = true;\r\n            LoadValues(ExplorerField.ReleaseYear);\r\n            if (oldSelection != null)\r\n            {\r\n                SelectedFieldObject = FieldValues.FirstOrDefault(a => a.Value.Equals(oldSelection.Value));\r\n            }\r\n\r\n            ignoreObjectSelectionChanges = false;\r\n        }\r\n\r\n        private bool IsReleaseYearLoaded(int? year)\r\n        {\r\n            if (year == null)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            foreach (var obj in FieldValues)\r\n            {\r\n                if (obj is SelectionObject y)\r\n                {\r\n                    if (y.Value == null && year == null)\r\n                    {\r\n                        return true;\r\n                    }\r\n\r\n                    if (int.TryParse(y.Value.ToString(), out var parsedYear))\r\n                    {\r\n                        if (parsedYear == year)\r\n                        {\r\n                            return true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        private IdItemFilterItemProperties GetIdFilter(SelectionObject filter)\r\n        {\r\n            if (filter?.Value == null)\r\n            {\r\n                return null;\r\n            }\r\n            else if (filter.Value is SelectionObjectType flt && flt == SelectionObjectType.All)\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                return new IdItemFilterItemProperties(((IIdentifiable)filter.Value).Id);\r\n            }\r\n        }\r\n\r\n        private string GetStringFilter(SelectionObject filter)\r\n        {\r\n            if (filter == null)\r\n            {\r\n                return null;\r\n            }\r\n            else if (filter.Value is SelectionObjectType ftl && ftl == SelectionObjectType.All)\r\n            {\r\n                return null;\r\n            }\r\n            else if (filter.Value is DatabaseObject obj && obj.Id == Guid.Empty)\r\n            {\r\n                return FilterSettings.MissingFieldString;\r\n            }\r\n            else\r\n            {\r\n                return filter.Value.ToString();\r\n            }\r\n        }\r\n\r\n        private StringFilterItemProperties GetStringListFilter(SelectionObject filter)\r\n        {\r\n            if (filter == null)\r\n            {\r\n                return null;\r\n            }\r\n            else if (filter.Value is SelectionObjectType flt && flt == SelectionObjectType.All)\r\n            {\r\n                return null;\r\n            }\r\n            else if (filter.Value is DatabaseObject obj && obj.Id == Guid.Empty)\r\n            {\r\n                return new StringFilterItemProperties(FilterSettings.MissingFieldString);\r\n            }\r\n            else\r\n            {\r\n                return new StringFilterItemProperties(filter.Value.ToString());\r\n            }\r\n        }\r\n\r\n        private EnumFilterItemProperties GetEnumFilter(SelectionObject filter)\r\n        {\r\n            if (filter == null)\r\n            {\r\n                return null;\r\n            }\r\n            else if (filter is SelectionObject flt && (SelectionObjectType)flt.Value == SelectionObjectType.All)\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                return new EnumFilterItemProperties((int)filter.Value);\r\n            }\r\n        }\r\n\r\n        private void ApplyFilter(ExplorerField field, SelectionObject filter)\r\n        {\r\n            if (!settings.ExplorerPanelVisible)\r\n            {\r\n                return;\r\n            }\r\n\r\n            switch (field)\r\n            {\r\n                case ExplorerField.Library:\r\n                    filters.Library = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.Category:\r\n                    filters.Category = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.Genre:\r\n                    filters.Genre = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.Developer:\r\n                    filters.Developer = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.Publisher:\r\n                    filters.Publisher = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.Tag:\r\n                    filters.Tag = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.Platform:\r\n                    filters.Platform = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.Series:\r\n                    filters.Series = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.AgeRating:\r\n                    filters.AgeRating = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.Region:\r\n                    filters.Region = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.Source:\r\n                    filters.Source = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.ReleaseYear:\r\n                    filters.ReleaseYear = GetStringListFilter(filter);\r\n                    break;\r\n                case ExplorerField.CompletionStatus:\r\n                    filters.CompletionStatuses = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.UserScore:\r\n                    filters.UserScore = GetEnumFilter(filter);\r\n                    break;\r\n                case ExplorerField.CommunityScore:\r\n                    filters.CommunityScore = GetEnumFilter(filter);\r\n                    break;\r\n                case ExplorerField.CriticScore:\r\n                    filters.CriticScore = GetEnumFilter(filter);\r\n                    break;\r\n                case ExplorerField.LastActivity:\r\n                    filters.LastActivity = GetEnumFilter(filter);\r\n                    break;\r\n                case ExplorerField.RecentActivity:\r\n                    filters.RecentActivity = GetEnumFilter(filter);\r\n                    break;\r\n                case ExplorerField.Added:\r\n                    filters.Added = GetEnumFilter(filter);\r\n                    break;\r\n                case ExplorerField.Modified:\r\n                    filters.Modified = GetEnumFilter(filter);\r\n                    break;\r\n                case ExplorerField.PlayTime:\r\n                    filters.PlayTime = GetEnumFilter(filter);\r\n                    break;\r\n                case ExplorerField.InstallSize:\r\n                    filters.InstallSize = GetEnumFilter(filter);\r\n                    break;\r\n                case ExplorerField.Feature:\r\n                    filters.Feature = GetIdFilter(filter);\r\n                    break;\r\n                case ExplorerField.Presets:\r\n                    if (filter?.Value != null)\r\n                    {\r\n                        mainModel.ActiveFilterPreset = filter.Value as FilterPreset;\r\n                    }\r\n                    else\r\n                    {\r\n                        mainModel.ActiveFilterPreset = null;\r\n                    }\r\n                    break;\r\n                case ExplorerField.Name:\r\n                    filters.Name = GetStringFilter(filter);\r\n                    break;\r\n                case ExplorerField.InstallStatus:\r\n                    var installed = false;\r\n                    var uninstalled = false;\r\n                    if (filter?.Value is bool instStat)\r\n                    {\r\n                        installed = instStat;\r\n                        uninstalled = !instStat;\r\n                    }\r\n\r\n                    filters.SuppressFilterChanges = true;\r\n                    filters.IsInstalled = installed;\r\n                    filters.IsUnInstalled = uninstalled;\r\n                    filters.SuppressFilterChanges = false;\r\n                    filters.OnFilterChanged(new List<string>\r\n                    {\r\n                        nameof(filters.IsInstalled),\r\n                        nameof(filters.IsUnInstalled)\r\n                    });\r\n                    break;\r\n                default:\r\n                    if (PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        throw new NotSupportedException();\r\n                    }\r\n                    else\r\n                    {\r\n                        break;\r\n                    }\r\n            }\r\n        }\r\n\r\n        private SelectionObject allObject = new SelectionObject(SelectionObjectType.All, ResourceProvider.GetString(\"LOCAll\"));\r\n        private SelectionObject noneDbObject = new SelectionObject(\r\n            new DatabaseObject()\r\n            {\r\n                Id = Guid.Empty,\r\n                Name = ResourceProvider.GetString(\"LOCNone\")\r\n            }, ResourceProvider.GetString(\"LOCNone\"));\r\n        private SelectionObject noneObject = new SelectionObject(SelectionObjectType.None, ResourceProvider.GetString(\"LOCNone\"));\r\n\r\n        private void LoadValues(ExplorerField field)\r\n        {\r\n            if (!database.IsOpen || !settings.ExplorerPanelVisible)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var values = new List<SelectionObject>()\r\n            {\r\n                allObject\r\n            };\r\n\r\n            switch (field)\r\n            {\r\n                case ExplorerField.Library:\r\n                    var libs = extensions.LibraryPlugins.ToList();\r\n                    libs.Add(new FakePlayniteLibraryPlugin());\r\n                    values.AddRange(libs.Select(a => new SelectionObject(a, a.Name)));\r\n                    break;\r\n                case ExplorerField.Category:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedCategories.Select(a => database.Categories[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.Categories.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.Genre:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedGenres.Select(a => database.Genres[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.Genres.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.Developer:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedDevelopers.Select(a => database.Companies[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.Companies.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.Publisher:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedPublishers.Select(a => database.Companies[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.Companies.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.Tag:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedTags.Select(a => database.Tags[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.Tags.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.Platform:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedPlatforms.Select(a => database.Platforms[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.Platforms.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.Series:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedSeries.Select(a => database.Series[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.Series.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.AgeRating:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedAgeRatings.Select(a => database.AgeRatings[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.AgeRatings.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.Region:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedRegions.Select(a => database.Regions[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.Regions.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.Source:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedSources.Select(a => database.Sources[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.Sources.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.ReleaseYear:\r\n                    values.Add(noneDbObject);\r\n                    var years = database.Games.Where(a => a.ReleaseYear != null).Select(a => a.ReleaseYear).Distinct().OrderBy(a => a.Value);\r\n                    values.AddRange(years.Select(a => new SelectionObject(a)));\r\n                    break;\r\n                case ExplorerField.CompletionStatus:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedCompletionStatuses.Select(a => database.CompletionStatuses[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.CompletionStatuses.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.UserScore:\r\n                case ExplorerField.CriticScore:\r\n                case ExplorerField.CommunityScore:\r\n                    values.AddRange(GenerateEnumValues(typeof(ScoreGroup)));\r\n                    break;\r\n                case ExplorerField.LastActivity:\r\n                case ExplorerField.RecentActivity:\r\n                case ExplorerField.Added:\r\n                case ExplorerField.Modified:\r\n                    values.AddRange(GenerateEnumValues(typeof(PastTimeSegment)));\r\n                    break;\r\n                case ExplorerField.PlayTime:\r\n                    values.AddRange(GenerateEnumValues(typeof(PlaytimeCategory)));\r\n                    break;\r\n                case ExplorerField.InstallSize:\r\n                    values.AddRange(GenerateEnumValues(typeof(InstallSizeGroup)));\r\n                    break;\r\n                case ExplorerField.Feature:\r\n                    values.Add(noneDbObject);\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        values.AddRange(database.UsedFeastures.Select(a => database.Features[a]).OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    else\r\n                    {\r\n                        values.AddRange(database.Features.OrderBy(a => a.Name).Select(a => new SelectionObject(a)));\r\n                    }\r\n                    break;\r\n                case ExplorerField.Presets:\r\n                    values.Clear();\r\n                    values.AddRange(database.GetSortedFilterPresets().Select(a => new SelectionObject(a)));\r\n                    break;\r\n                case ExplorerField.Name:\r\n                    values.Add(new SelectionObject(\"^#\", \"#\"));\r\n                    values.AddRange(Enumerable.Range('A', 26).Select(a => new SelectionObject(\"^\" + ((char)a).ToString(), ((char)a).ToString())));\r\n                    break;\r\n                case ExplorerField.InstallStatus:\r\n                    values.Add(new SelectionObject(true, LOC.GameIsInstalledTitle.GetLocalized()));\r\n                    values.Add(new SelectionObject(false, LOC.GameIsUnInstalledTitle.GetLocalized()));\r\n                    break;\r\n                default:\r\n                    if (PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        throw new NotSupportedException();\r\n                    }\r\n                    else\r\n                    {\r\n                        break;\r\n                    }\r\n            }\r\n\r\n            FieldValues = values;\r\n            if (field != ExplorerField.Presets)\r\n            {\r\n                SelectedFieldObject = allObject;\r\n            }\r\n        }\r\n\r\n        public IEnumerable<SelectionObject> GenerateEnumValues(Type enumType)\r\n        {\r\n            foreach (Enum status in Enum.GetValues(enumType))\r\n            {\r\n                yield return new SelectionObject(status, status.GetDescription());\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/DatabaseFileEvent.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public enum FileEvent\r\n    {\r\n        Added,\r\n        Removed\r\n    }\r\n\r\n    public class DatabaseFileEventArgs : EventArgs\r\n    {\r\n        public string FileId\r\n        {\r\n            get;\r\n        }\r\n\r\n        public FileEvent EventType\r\n        {\r\n            get;\r\n        }\r\n\r\n        public DatabaseFileEventArgs(string fileId, FileEvent eventType)\r\n        {\r\n            FileId = fileId;\r\n            EventType = eventType;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/DatabaseFilter.cs",
    "content": "﻿using Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class DatabaseFilter : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private static object syncLockYears = new object();\r\n        private static object syncLockGenres = new object();\r\n        private static object syncLockPlatforms = new object();\r\n        private static object syncLockAges = new object();\r\n        private static object syncLockCategories = new object();\r\n        private static object syncLockPublishers = new object();\r\n        private static object syncLockDevelopers = new object();\r\n        private static object syncLockRegions = new object();\r\n        private static object syncLockSeries = new object();\r\n        private static object syncLockSources = new object();\r\n        private static object syncLockTags = new object();\r\n        private static object syncLockFeatures = new object();\r\n        private static object syncLockCompletionStatuses = new object();\r\n        private readonly SynchronizationContext context;\r\n        private readonly IGameDatabaseMain database;\r\n        private readonly FilterSettings filter;\r\n        private readonly PlayniteSettings settings;\r\n\r\n        private bool missedDbUpdate = false;\r\n        private readonly List<GameDatabaseCollection> missedCollection = new List<GameDatabaseCollection>(Enum.GetValues(typeof(GameDatabaseCollection)).Length);\r\n        private bool ignoreDatabaseUpdates = false;\r\n        public bool IgnoreDatabaseUpdates\r\n        {\r\n            get => ignoreDatabaseUpdates;\r\n            set\r\n            {\r\n                ignoreDatabaseUpdates = value;\r\n                if (value == false && missedDbUpdate)\r\n                {\r\n                    UpdateAllCollections(missedCollection);\r\n                }\r\n\r\n                missedDbUpdate = false;\r\n                missedCollection.Clear();\r\n            }\r\n        }\r\n\r\n        #region Filter lists\r\n\r\n        public SelectableIdItemList<LibraryPlugin> Libraries { get; set; }\r\n\r\n        private SelectableDbItemList genres;\r\n        public SelectableDbItemList Genres\r\n        {\r\n            get => genres;\r\n            private set\r\n            {\r\n                genres = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableDbItemList platforms;\r\n        public SelectableDbItemList Platforms\r\n        {\r\n            get => platforms;\r\n            private set\r\n            {\r\n                platforms = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableDbItemList ageRatings;\r\n        public SelectableDbItemList AgeRatings\r\n        {\r\n            get => ageRatings;\r\n            private set\r\n            {\r\n                ageRatings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableDbItemList categories;\r\n        public SelectableDbItemList Categories\r\n        {\r\n            get => categories;\r\n            private set\r\n            {\r\n                categories = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableDbItemList publishers;\r\n        public SelectableDbItemList Publishers\r\n        {\r\n            get => publishers;\r\n            private set\r\n            {\r\n                publishers = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableDbItemList developers;\r\n        public SelectableDbItemList Developers\r\n        {\r\n            get => developers;\r\n            private set\r\n            {\r\n                developers = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableDbItemList regions;\r\n        public SelectableDbItemList Regions\r\n        {\r\n            get => regions;\r\n            private set\r\n            {\r\n                regions = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableDbItemList series;\r\n        public SelectableDbItemList Series\r\n        {\r\n            get => series;\r\n            private set\r\n            {\r\n                series = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableDbItemList sources;\r\n        public SelectableDbItemList Sources\r\n        {\r\n            get => sources;\r\n            private set\r\n            {\r\n                sources = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableDbItemList tags;\r\n        public SelectableDbItemList Tags\r\n        {\r\n            get => tags;\r\n            private set\r\n            {\r\n                tags = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableObjectList<NamedObject<string>> releaseYears;\r\n        public SelectableObjectList<NamedObject<string>> ReleaseYears\r\n        {\r\n            get => releaseYears;\r\n            private set\r\n            {\r\n                releaseYears = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableDbItemList features;\r\n        public SelectableDbItemList Features\r\n        {\r\n            get => features;\r\n            private set\r\n            {\r\n                features = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SelectableDbItemList completionStatuses;\r\n        public SelectableDbItemList CompletionStatuses\r\n        {\r\n            get => completionStatuses;\r\n            private set\r\n            {\r\n                completionStatuses = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        #endregion Filter lists\r\n\r\n        public DatabaseFilter(IGameDatabaseMain database, ExtensionFactory extensions, PlayniteSettings settings, FilterSettings filter)\r\n        {\r\n            this.context = SynchronizationContext.Current;\r\n            this.database = database;\r\n            this.settings = settings;\r\n            this.filter = filter;\r\n            this.settings.PropertyChanged += Settings_PropertyChanged;\r\n\r\n            if (database.IsOpen)\r\n            {\r\n                LoadFilterCollection();\r\n            }\r\n            else\r\n            {\r\n                database.DatabaseOpened += (s, e) => LoadFilterCollection();\r\n            }\r\n\r\n            var libs = extensions.LibraryPlugins.OrderBy(a => a.Name).ToList();\r\n            libs.Add(new FakePlayniteLibraryPlugin());\r\n            Libraries = new SelectableLibraryPluginList(libs);\r\n\r\n            // Remove filters for unloaded plugins\r\n            var missing = filter.Library?.Ids.Where(a => Libraries.FirstOrDefault(b => b.Item.Id == a) == null)?.ToList();\r\n            if (missing?.Any() == true)\r\n            {\r\n                if (filter.Library != null)\r\n                {\r\n                    missing.ForEach(a => filter.Library.Ids.Remove(a));\r\n                }\r\n            }\r\n\r\n            database.Games.ItemCollectionChanged += Games_ItemCollectionChanged;\r\n            database.Games.ItemUpdated += Games_ItemUpdated;\r\n            database.Genres.ItemCollectionChanged += (_, args) => FullUpdateAvailableFilterList(Genres, args, database.Genres, filter.Genre);\r\n            database.Platforms.ItemCollectionChanged += (_, args) => FullUpdateAvailableFilterList(Platforms, args, database.Platforms, filter.Platform);\r\n            database.AgeRatings.ItemCollectionChanged += (_, args) => FullUpdateAvailableFilterList(AgeRatings, args, database.AgeRatings, filter.AgeRating);\r\n            database.Categories.ItemCollectionChanged += (_, args) => FullUpdateAvailableFilterList(Categories, args, database.Categories, filter.Category);\r\n            database.Regions.ItemCollectionChanged += (_, args) => FullUpdateAvailableFilterList(Regions, args, database.Regions, filter.Region);\r\n            database.Series.ItemCollectionChanged += (_, args) => FullUpdateAvailableFilterList(Series, args, database.Series, filter.Series);\r\n            database.Sources.ItemCollectionChanged += (_, args) => FullUpdateAvailableFilterList(Sources, args, database.Sources, filter.Source);\r\n            database.Tags.ItemCollectionChanged += (_, args) => FullUpdateAvailableFilterList(Tags, args, database.Tags, filter.Tag);\r\n            database.Features.ItemCollectionChanged += (_, args) => FullUpdateAvailableFilterList(Features, args, database.Features, filter.Feature);\r\n            database.Companies.ItemCollectionChanged += (_, args) =>\r\n            {\r\n                FullUpdateAvailableFilterList(Publishers, args, database.Companies, filter.Publisher);\r\n                FullUpdateAvailableFilterList(Developers, args, database.Companies, filter.Developer);\r\n            };\r\n            database.CompletionStatuses.ItemCollectionChanged += (_, args) => FullUpdateAvailableFilterList(CompletionStatuses, args, database.CompletionStatuses, filter.CompletionStatuses);\r\n\r\n            database.AgeRatingsInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(AgeRatings, database.AgeRatings, database.UsedAgeRatings, filter.AgeRating);\r\n            database.CategoriesInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(Categories, database.Categories, database.UsedCategories, filter.Category);\r\n            database.DevelopersInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(Developers, database.Companies, database.UsedDevelopers, filter.Developer);\r\n            database.FeaturesInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(Features, database.Features, database.UsedFeastures, filter.Feature);\r\n            database.GenresInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(Genres, database.Genres, database.UsedGenres, filter.Genre);\r\n            database.PlatformsInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(Platforms, database.Platforms, database.UsedPlatforms, filter.Platform);\r\n            database.PublishersInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(Publishers, database.Companies, database.UsedPublishers, filter.Publisher);\r\n            database.RegionsInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(Regions, database.Regions, database.UsedRegions, filter.Region);\r\n            database.SeriesInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(Series, database.Series, database.UsedSeries, filter.Series);\r\n            database.SourcesInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(Sources, database.Sources, database.UsedSources, filter.Source);\r\n            database.TagsInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(Tags, database.Tags, database.UsedTags, filter.Tag);\r\n            database.CompletionStatusesInUseUpdated += (_, __) => InUseOnlyUpdateAvailableFilterList(CompletionStatuses, database.CompletionStatuses, database.UsedCompletionStatuses, filter.CompletionStatuses);\r\n        }\r\n\r\n        private void Settings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(PlayniteSettings.UsedFieldsOnlyOnFilterLists))\r\n            {\r\n                UpdateAllCollections();\r\n            }\r\n        }\r\n\r\n        internal void LoadFilterCollection()\r\n        {\r\n            var years = database.Games.Where(a => a.ReleaseYear != null).Select(a => a.ReleaseYear).Distinct().OrderBy(a => a.Value).\r\n                Select(a => new NamedObject<string>(a.ToString())).ToList();\r\n            years.Insert(0, new NamedObject<string>(FilterSettings.MissingFieldString, ResourceProvider.GetString(LOC.None)));\r\n            ReleaseYears = new SelectableObjectList<NamedObject<string>>(years, null);\r\n\r\n            if (settings.UsedFieldsOnlyOnFilterLists)\r\n            {\r\n                Genres = new SelectableDbItemList(database.Genres.Get(database.UsedGenres), null, null, true);\r\n                Platforms = new SelectableDbItemList(database.Platforms.Get(database.UsedPlatforms), null, null, true);\r\n                AgeRatings = new SelectableDbItemList(database.AgeRatings.Get(database.UsedAgeRatings), null, null, true);\r\n                Categories = new SelectableDbItemList(database.Categories.Get(database.UsedCategories), null, null, true);\r\n                Publishers = new SelectableDbItemList(database.Companies.Get(database.UsedPublishers), null, null, true);\r\n                Developers = new SelectableDbItemList(database.Companies.Get(database.UsedDevelopers), null, null, true);\r\n                Regions = new SelectableDbItemList(database.Regions.Get(database.UsedRegions), null, null, true);\r\n                Series = new SelectableDbItemList(database.Series.Get(database.UsedSeries), null, null, true);\r\n                Sources = new SelectableDbItemList(database.Sources.Get(database.UsedSources), null, null, true);\r\n                Tags = new SelectableDbItemList(database.Tags.Get(database.UsedTags), null, null, true);\r\n                Features = new SelectableDbItemList(database.Features.Get(database.UsedFeastures), null, null, true);\r\n                CompletionStatuses = new SelectableDbItemList(database.CompletionStatuses.Get(database.UsedCompletionStatuses), null, null, true);\r\n            }\r\n            else\r\n            {\r\n                Genres = new SelectableDbItemList(database.Genres, null, null, true);\r\n                Platforms = new SelectableDbItemList(database.Platforms, null, null, true);\r\n                AgeRatings = new SelectableDbItemList(database.AgeRatings, null, null, true);\r\n                Categories = new SelectableDbItemList(database.Categories, null, null, true);\r\n                Publishers = new SelectableDbItemList(database.Companies, null, null, true);\r\n                Developers = new SelectableDbItemList(database.Companies, null, null, true);\r\n                Regions = new SelectableDbItemList(database.Regions, null, null, true);\r\n                Series = new SelectableDbItemList(database.Series, null, null, true);\r\n                Sources = new SelectableDbItemList(database.Sources, null, null, true);\r\n                Tags = new SelectableDbItemList(database.Tags, null, null, true);\r\n                Features = new SelectableDbItemList(database.Features, null, null, true);\r\n                CompletionStatuses = new SelectableDbItemList(database.CompletionStatuses, null, null, true);\r\n            }\r\n\r\n            context.Send((a) =>\r\n            {\r\n                BindingOperations.EnableCollectionSynchronization(ReleaseYears, syncLockYears);\r\n                BindingOperations.EnableCollectionSynchronization(Genres, syncLockGenres);\r\n                BindingOperations.EnableCollectionSynchronization(Platforms, syncLockPlatforms);\r\n                BindingOperations.EnableCollectionSynchronization(AgeRatings, syncLockAges);\r\n                BindingOperations.EnableCollectionSynchronization(Categories, syncLockCategories);\r\n                BindingOperations.EnableCollectionSynchronization(Publishers, syncLockPublishers);\r\n                BindingOperations.EnableCollectionSynchronization(Developers, syncLockDevelopers);\r\n                BindingOperations.EnableCollectionSynchronization(Regions, syncLockRegions);\r\n                BindingOperations.EnableCollectionSynchronization(Series, syncLockSeries);\r\n                BindingOperations.EnableCollectionSynchronization(Sources, syncLockSources);\r\n                BindingOperations.EnableCollectionSynchronization(Tags, syncLockTags);\r\n                BindingOperations.EnableCollectionSynchronization(Features, syncLockFeatures);\r\n                BindingOperations.EnableCollectionSynchronization(CompletionStatuses, syncLockCompletionStatuses);\r\n            }, null);\r\n        }\r\n\r\n        private void Games_ItemUpdated(object sender, ItemUpdatedEventArgs<Game> e)\r\n        {\r\n            if (IgnoreDatabaseUpdates)\r\n            {\r\n                missedDbUpdate = true;\r\n                missedCollection.AddMissing(GameDatabaseCollection.Games);\r\n                return;\r\n            }\r\n\r\n            foreach (var update in e.UpdatedItems)\r\n            {\r\n                if (update.OldData.ReleaseDate != update.NewData.ReleaseDate && update.NewData.ReleaseDate != null)\r\n                {\r\n                    ReleaseYears.Add(new NamedObject<string>(update.NewData.ReleaseYear.ToString()));\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Games_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<Game> e)\r\n        {\r\n            if (IgnoreDatabaseUpdates)\r\n            {\r\n                missedDbUpdate = true;\r\n                missedCollection.AddMissing(GameDatabaseCollection.Games);\r\n                return;\r\n            }\r\n\r\n            foreach (var update in e.AddedItems)\r\n            {\r\n                if (update.ReleaseDate != null)\r\n                {\r\n                    ReleaseYears.Add(new NamedObject<string>(update.ReleaseYear.ToString()));\r\n                }\r\n            }\r\n        }\r\n\r\n        internal void UpdateAllCollections(List<GameDatabaseCollection> updateFields)\r\n        {\r\n            foreach (var field in updateFields)\r\n            {\r\n                UpdateAllCollections(field);\r\n            }\r\n        }\r\n\r\n        internal void UpdateAllCollections(GameDatabaseCollection field)\r\n        {\r\n            switch (field)\r\n            {\r\n                case GameDatabaseCollection.Games:\r\n                    var years = database.Games.Where(a => a.ReleaseYear != null).Select(a => a.ReleaseYear).Distinct().OrderBy(a => a.Value).Select(a => a.ToString()).\r\n                        Select(a => new NamedObject<string>(a.ToString())).ToList();\r\n                    years.Insert(0, new NamedObject<string>(FilterSettings.MissingFieldString, ResourceProvider.GetString(LOC.None)));\r\n                    ReleaseYears.SetItems(years, years.Where(a => filter.ReleaseYear?.Values?.Contains(a.Value) == true));\r\n                    break;\r\n                case GameDatabaseCollection.Platforms:\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        Platforms.SetItems(database.Platforms.Get(database.UsedPlatforms), filter.Platform?.Ids);\r\n                    }\r\n                    else\r\n                    {\r\n                        Platforms.SetItems(database.Platforms, filter.Platform?.Ids);\r\n                    }\r\n                    break;\r\n                case GameDatabaseCollection.Genres:\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        Genres.SetItems(database.Genres.Get(database.UsedGenres), filter.Genre?.Ids);\r\n                    }\r\n                    else\r\n                    {\r\n                        Genres.SetItems(database.Genres, filter.Genre?.Ids);\r\n                    }\r\n                    break;\r\n                case GameDatabaseCollection.Companies:\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        Developers.SetItems(database.Companies.Get(database.UsedDevelopers), filter.Developer?.Ids);\r\n                        Publishers.SetItems(database.Companies.Get(database.UsedPublishers), filter.Publisher?.Ids);\r\n                    }\r\n                    else\r\n                    {\r\n                        Developers.SetItems(database.Companies, filter.Developer?.Ids);\r\n                        Publishers.SetItems(database.Companies, filter.Publisher?.Ids);\r\n                    }\r\n                    break;\r\n                case GameDatabaseCollection.Tags:\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        Tags.SetItems(database.Tags.Get(database.UsedTags), filter.Tag?.Ids);\r\n                    }\r\n                    else\r\n                    {\r\n                        Tags.SetItems(database.Tags, filter.Tag?.Ids);\r\n                    }\r\n                    break;\r\n                case GameDatabaseCollection.Categories:\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        Categories.SetItems(database.Categories.Get(database.UsedCategories), filter.Category?.Ids);\r\n                    }\r\n                    else\r\n                    {\r\n                        Categories.SetItems(database.Categories, filter.Category?.Ids);\r\n                    }\r\n                    break;\r\n                case GameDatabaseCollection.Series:\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        Series.SetItems(database.Series.Get(database.UsedSeries), filter.Series?.Ids);\r\n                    }\r\n                    else\r\n                    {\r\n                        Series.SetItems(database.Series, filter.Series?.Ids);\r\n                    }\r\n                    break;\r\n                case GameDatabaseCollection.AgeRatings:\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        AgeRatings.SetItems(database.AgeRatings.Get(database.UsedAgeRatings), filter.AgeRating?.Ids);\r\n                    }\r\n                    else\r\n                    {\r\n                        AgeRatings.SetItems(database.AgeRatings, filter.AgeRating?.Ids);\r\n                    }\r\n                    break;\r\n                case GameDatabaseCollection.Regions:\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        Regions.SetItems(database.Regions.Get(database.UsedRegions), filter.Region?.Ids);\r\n                    }\r\n                    else\r\n                    {\r\n                        Regions.SetItems(database.Regions, filter.Region?.Ids);\r\n                    }\r\n                    break;\r\n                case GameDatabaseCollection.Sources:\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        Sources.SetItems(database.Sources.Get(database.UsedSources), filter.Source?.Ids);\r\n                    }\r\n                    else\r\n                    {\r\n                        Sources.SetItems(database.Sources, filter.Source?.Ids);\r\n                    }\r\n                    break;\r\n                case GameDatabaseCollection.Features:\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        Features.SetItems(database.Features.Get(database.UsedFeastures), filter.Feature?.Ids);\r\n                    }\r\n                    else\r\n                    {\r\n                        Features.SetItems(database.Features, filter.Feature?.Ids);\r\n                    }\r\n                    break;\r\n                case GameDatabaseCollection.CompletionStatuses:\r\n                    if (settings.UsedFieldsOnlyOnFilterLists)\r\n                    {\r\n                        CompletionStatuses.SetItems(database.CompletionStatuses.Get(database.UsedCompletionStatuses), filter.CompletionStatuses?.Ids);\r\n                    }\r\n                    else\r\n                    {\r\n                        CompletionStatuses.SetItems(database.CompletionStatuses, filter.CompletionStatuses?.Ids);\r\n                    }\r\n                    break;\r\n                default:\r\n                    if (PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        throw new NotSupportedException();\r\n                    }\r\n                    else\r\n                    {\r\n                        break;\r\n                    }\r\n            }\r\n        }\r\n\r\n        internal void UpdateAllCollections()\r\n        {\r\n            UpdateAllCollections(GameDatabaseCollection.Games);\r\n            UpdateAllCollections(GameDatabaseCollection.Platforms);\r\n            UpdateAllCollections(GameDatabaseCollection.Genres);\r\n            UpdateAllCollections(GameDatabaseCollection.Companies);\r\n            UpdateAllCollections(GameDatabaseCollection.Tags);\r\n            UpdateAllCollections(GameDatabaseCollection.Categories);\r\n            UpdateAllCollections(GameDatabaseCollection.Series);\r\n            UpdateAllCollections(GameDatabaseCollection.AgeRatings);\r\n            UpdateAllCollections(GameDatabaseCollection.Regions);\r\n            UpdateAllCollections(GameDatabaseCollection.Sources);\r\n            UpdateAllCollections(GameDatabaseCollection.Features);\r\n            UpdateAllCollections(GameDatabaseCollection.CompletionStatuses);\r\n        }\r\n\r\n        private void InUseOnlyUpdateAvailableFilterList<T>(\r\n            SelectableDbItemList targetList,\r\n            IItemCollection<T> sourceColletion,\r\n            List<Guid> usedList,\r\n            IdItemFilterItemProperties filter) where T : DatabaseObject\r\n        {\r\n            if (!settings.UsedFieldsOnlyOnFilterLists)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (IgnoreDatabaseUpdates)\r\n            {\r\n                missedDbUpdate = true;\r\n                missedCollection.AddMissing(sourceColletion.CollectionType);\r\n                return;\r\n            }\r\n\r\n            targetList.SetItems(sourceColletion.Get(usedList), filter?.Ids);\r\n        }\r\n\r\n        private void FullUpdateAvailableFilterList<T>(\r\n            SelectableDbItemList targetList,\r\n            ItemCollectionChangedEventArgs<T> args,\r\n            IItemCollection<T> sourceColletion,\r\n            IdItemFilterItemProperties filter) where T : DatabaseObject\r\n        {\r\n            if (settings.UsedFieldsOnlyOnFilterLists)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (IgnoreDatabaseUpdates)\r\n            {\r\n                missedDbUpdate = true;\r\n                missedCollection.AddMissing(sourceColletion.CollectionType);\r\n                return;\r\n            }\r\n\r\n            if (args.AddedItems.HasItems() || args.RemovedItems.HasItems())\r\n            {\r\n                targetList.SetItems(sourceColletion, filter?.Ids);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/DatabaseSettings.cs",
    "content": "﻿using LiteDB;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class DatabaseSettings\r\n    {\r\n        public int Version\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public DatabaseSettings()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/DatabaseStats.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class DatabaseStats : ObservableObject, IDisposable\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public int Installed { get; private set; } = 0;\r\n        public int UnInstalled { get; private set; } = 0;\r\n        public int Hidden { get; private set; } = 0;\r\n        public int Favorite { get; private set; } = 0;\r\n\r\n        public int Total\r\n        {\r\n            get\r\n            {\r\n                if (database == null)\r\n                {\r\n                    return 0;\r\n                }\r\n                else\r\n                {\r\n                    return database.Games.Count;\r\n                }\r\n            }\r\n        }\r\n\r\n        private IGameDatabaseMain database;\r\n\r\n        public DatabaseStats(IGameDatabaseMain database)\r\n        {\r\n            this.database = database;\r\n            database.Games.ItemUpdated += Database_GameUpdated;\r\n            database.Games.ItemCollectionChanged += Database_GamesCollectionChanged;\r\n            database.DatabaseOpened += Database_DatabaseOpened;\r\n            if (database.IsOpen)\r\n            {\r\n                Recalculate();\r\n            }\r\n        }\r\n\r\n        private void Recalculate()\r\n        {\r\n            if (database.Games == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            logger.Info(\"Completely recalculating database statistics...\");\r\n\r\n            Installed = 0;\r\n            UnInstalled = 0;\r\n            Hidden = 0;\r\n            Favorite = 0;\r\n\r\n            foreach (var game in database.Games)\r\n            {\r\n                if (game.IsInstalled)\r\n                {\r\n                    Installed++;\r\n                }\r\n                else\r\n                {\r\n                    UnInstalled++;\r\n                }\r\n\r\n                if (game.Hidden)\r\n                {\r\n                    Hidden++;\r\n                }\r\n\r\n                if (game.Favorite)\r\n                {\r\n                    Favorite++;\r\n                }\r\n            }\r\n\r\n            NotifiyAllChanged();\r\n        }\r\n\r\n        private void NotifiyAllChanged()\r\n        {\r\n            OnPropertyChanged(nameof(Installed));\r\n            OnPropertyChanged(nameof(UnInstalled));\r\n            OnPropertyChanged(nameof(Hidden));\r\n            OnPropertyChanged(nameof(Favorite));\r\n            OnPropertyChanged(nameof(Total));\r\n        }\r\n\r\n        private void Database_DatabaseOpened(object sender, EventArgs e)\r\n        {\r\n            Recalculate();\r\n        }\r\n\r\n        private void Database_GamesCollectionChanged(object sender, ItemCollectionChangedEventArgs<Game> args)\r\n        {\r\n            foreach (var game in args.RemovedItems)\r\n            {\r\n                IncrementalUpdate(game, -1);\r\n            }\r\n\r\n            foreach (var game in args.AddedItems)\r\n            {\r\n                IncrementalUpdate(game, 1);\r\n            }\r\n\r\n            NotifiyAllChanged();\r\n        }\r\n\r\n        private void Database_GameUpdated(object sender, ItemUpdatedEventArgs<Game> args)\r\n        {\r\n            foreach (var update in args.UpdatedItems)\r\n            {\r\n                if (update.OldData.Hidden != update.NewData.Hidden)\r\n                {\r\n                    Hidden = Hidden + (1 * (update.NewData.Hidden ? 1 : -1));\r\n                }\r\n\r\n                if (update.OldData.Favorite != update.NewData.Favorite)\r\n                {\r\n                    Favorite = Favorite + (1 * (update.NewData.Favorite ? 1 : -1));\r\n                }\r\n\r\n                if (update.OldData.IsInstalled != update.NewData.IsInstalled)\r\n                {\r\n                    Installed = Installed + (1 * (update.NewData.IsInstalled ? 1 : -1));\r\n                    UnInstalled = UnInstalled + (1 * (!update.NewData.IsInstalled ? 1 : -1));\r\n                }\r\n            }\r\n\r\n            OnPropertyChanged(nameof(Installed));\r\n            OnPropertyChanged(nameof(UnInstalled));\r\n            OnPropertyChanged(nameof(Hidden));\r\n            OnPropertyChanged(nameof(Favorite));\r\n        }\r\n\r\n        private void IncrementalUpdate(Game game, int modifier)\r\n        {\r\n            if (game.Hidden)\r\n            {\r\n                Hidden = Hidden + (1 * modifier);\r\n            }\r\n\r\n            if (game.Favorite)\r\n            {\r\n                Favorite = Favorite + (1 * modifier);\r\n            }\r\n\r\n            if (game.IsInstalled)\r\n            {\r\n                Installed = Installed + (1 * modifier);\r\n            }\r\n            else\r\n            {\r\n                UnInstalled = UnInstalled + (1 * modifier);\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            database.DatabaseOpened -= Database_DatabaseOpened;\r\n            database.Games.ItemCollectionChanged -= Database_GamesCollectionChanged;\r\n            database.Games.ItemUpdated -= Database_GameUpdated;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/EventBufferHandler.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class EventBufferHandler : IDisposable\r\n    {\r\n        private GameDatabase database;\r\n\r\n        public EventBufferHandler(GameDatabase db)\r\n        {\r\n            database = db;\r\n            db.BeginBufferUpdate();\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            database.EndBufferUpdate();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/GameDatabase.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Windows.Media.Imaging;\r\nusing Playnite.Emulators;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Common;\r\nusing Playnite.Settings;\r\nusing Playnite.SDK.Plugins;\r\nusing System.Net;\r\nusing Playnite.Common.Web;\r\nusing System.Drawing.Imaging;\r\nusing System.Threading;\r\nusing System.Collections.Concurrent;\r\nusing Playnite.Common.Media.Icons;\r\nusing System.Reflection;\r\nusing SdkModels = Playnite.SDK.Models;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    /// Not the greatest way of doing it but it's a superset of SDK exposed IGameDatabase.\r\n    /// The whole interface should not be exposed in the SDK since it contains a lot of \"internal\" members.\r\n    public interface IGameDatabaseMain : IGameDatabase\r\n    {\r\n        List<Guid> UsedPlatforms { get; }\r\n        List<Guid> UsedGenres { get; }\r\n        List<Guid> UsedDevelopers { get; }\r\n        List<Guid> UsedPublishers { get; }\r\n        List<Guid> UsedTags { get; }\r\n        List<Guid> UsedCategories { get; }\r\n        List<Guid> UsedSeries { get; }\r\n        List<Guid> UsedAgeRatings { get; }\r\n        List<Guid> UsedRegions { get; }\r\n        List<Guid> UsedSources { get; }\r\n        List<Guid> UsedFeastures { get; }\r\n        List<Guid> UsedCompletionStatuses { get; }\r\n\r\n        AppSoftwareCollection SoftwareApps { get; }\r\n\r\n        event EventHandler<DatabaseFileEventArgs> DatabaseFileChanged;\r\n        event EventHandler PlatformsInUseUpdated;\r\n        event EventHandler GenresInUseUpdated;\r\n        event EventHandler DevelopersInUseUpdated;\r\n        event EventHandler PublishersInUseUpdated;\r\n        event EventHandler TagsInUseUpdated;\r\n        event EventHandler CategoriesInUseUpdated;\r\n        event EventHandler AgeRatingsInUseUpdated;\r\n        event EventHandler SeriesInUseUpdated;\r\n        event EventHandler RegionsInUseUpdated;\r\n        event EventHandler SourcesInUseUpdated;\r\n        event EventHandler FeaturesInUseUpdated;\r\n        event EventHandler CompletionStatusesInUseUpdated;\r\n\r\n        void SetDatabasePath(string path);\r\n        void OpenDatabase();\r\n        string GetFileStoragePath(Guid parentId);\r\n        string GetFullFilePath(string dbPath);\r\n        string AddFile(MetadataFile file, Guid parentId, bool isImage, CancellationToken cancelToken);\r\n        string AddFile(string path, Guid parentId, bool isImage, CancellationToken cancelToken);\r\n        void RemoveFile(string dbPath);\r\n        BitmapSource GetFileAsImage(string dbPath, BitmapLoadProperties loadProperties = null);\r\n        void CopyFile(string dbPath, string targetPath);\r\n        void BeginBufferUpdate();\r\n        void EndBufferUpdate();\r\n        IDisposable BufferedUpdate();\r\n        List<Game> ImportGames(LibraryPlugin library, CancellationToken cancelToken, PlaytimeImportMode playtimeImportMode);\r\n        CompletionStatusSettings GetCompletionStatusSettings();\r\n        FilterPresetsSettings GetFilterPresetsSettings();\r\n        List<FilterPreset> GetSortedFilterPresets();\r\n        void SetCompletionStatusSettings(CompletionStatusSettings settings);\r\n        void SetFilterPresetsSettings(FilterPresetsSettings settings);\r\n        GameScannersSettings GetGameScannersSettings();\r\n        void SetGameScannersSettings(GameScannersSettings settings);\r\n        HashSet<string> GetImportedRomFiles(string emulatorDir);\r\n        HashSet<string> GetImportedExeFiles();\r\n        bool GetGameMatchesFilter(Game game, FilterSettings filterSettings, bool useFuzzyNameMatch);\r\n        IEnumerable<Game> GetFilteredGames(FilterSettings filterSettings, bool useFuzzyNameMatch);\r\n    }\r\n\r\n    public partial class GameDatabase : IGameDatabaseMain, IDisposable\r\n    {\r\n        public const double MaximumRecommendedIconSize = 0.1;\r\n        public const double MaximumRecommendedCoverSize = 1;\r\n        public const double MaximumRecommendedBackgroundSize = 4;\r\n\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        private static readonly Dictionary<string, Type> collectionsSpec = new Dictionary<string, Type>\r\n        {\r\n            { nameof(Platforms), typeof(PlatformsCollection) },\r\n            { nameof(Emulators), typeof(EmulatorsCollection) },\r\n            { nameof(Genres), typeof(GenresCollection) },\r\n            { nameof(Companies), typeof(CompaniesCollection) },\r\n            { nameof(Tags), typeof(TagsCollection) },\r\n            { nameof(Categories), typeof(CategoriesCollection) },\r\n            { nameof(AgeRatings), typeof(AgeRatingsCollection) },\r\n            { nameof(Series), typeof(SeriesCollection) },\r\n            { nameof(Regions), typeof(RegionsCollection) },\r\n            { nameof(Sources), typeof(GamesSourcesCollection) },\r\n            { nameof(Features), typeof(FeaturesCollection) },\r\n            { nameof(SoftwareApps), typeof(AppSoftwareCollection) },\r\n            { nameof(Games), typeof(GamesCollection) },\r\n            { nameof(GameScanners), typeof(GameScannersCollection) },\r\n            { nameof(FilterPresets), typeof(FilterPresetsCollection) },\r\n            { nameof(ImportExclusions), typeof(ImportExclusionsCollection) },\r\n            { nameof(CompletionStatuses), typeof(CompletionStatusesCollection) }\r\n        };\r\n\r\n        #region Locks\r\n\r\n        private readonly object databaseConfigFileLock = new object();\r\n        private readonly ConcurrentDictionary<string, object> fileLocks = new ConcurrentDictionary<string, object>();\r\n\r\n        #endregion Locks\r\n\r\n        #region Paths\r\n\r\n        public string DatabasePath\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        internal const string filesDirName = \"files\";\r\n        private const string settingsFileName = \"database.json\";\r\n        private const string gamesDirName = \"games\";\r\n        private const string platformsDirName = \"platforms\";\r\n        private const string emulatorsDirName = \"emulators\";\r\n        private const string genresDirName = \"genres\";\r\n        private const string companiesDirName = \"companies\";\r\n        private const string tagsDirName = \"tags\";\r\n        private const string featuresDirName = \"features\";\r\n        private const string categoriesDirName = \"categories\";\r\n        private const string seriesDirName = \"series\";\r\n        private const string ageRatingsDirName = \"ageratings\";\r\n        private const string regionsDirName = \"regions\";\r\n        private const string sourcesDirName = \"sources\";\r\n        private const string toolsDirName = \"tools\";\r\n        private const string gameScannersDirName = \"scanners\";\r\n        private const string filterPresetsDirName = \"filterpresets\";\r\n        private const string importExclusionsDirName = \"importexclusions\";\r\n        private const string completionStatusesDirName = \"completionstatuses\";\r\n\r\n        private string GamesDirectoryPath { get => Path.Combine(DatabasePath, gamesDirName); }\r\n        private string PlatformsDirectoryPath { get => Path.Combine(DatabasePath, platformsDirName); }\r\n        private string EmulatorsDirectoryPath { get => Path.Combine(DatabasePath, emulatorsDirName); }\r\n        private string GenresDirectoryPath { get => Path.Combine(DatabasePath, genresDirName); }\r\n        private string CompaniesDirectoryPath { get => Path.Combine(DatabasePath, companiesDirName); }\r\n        private string TagsDirectoryPath { get => Path.Combine(DatabasePath, tagsDirName); }\r\n        private string CategoriesDirectoryPath { get => Path.Combine(DatabasePath, categoriesDirName); }\r\n        private string AgeRatingsDirectoryPath { get => Path.Combine(DatabasePath, ageRatingsDirName); }\r\n        private string SeriesDirectoryPath { get => Path.Combine(DatabasePath, seriesDirName); }\r\n        private string RegionsDirectoryPath { get => Path.Combine(DatabasePath, regionsDirName); }\r\n        private string SourcesDirectoryPath { get => Path.Combine(DatabasePath, sourcesDirName); }\r\n        private string FilesDirectoryPath { get => Path.Combine(DatabasePath, filesDirName); }\r\n        private string DatabaseFileSettingsPath { get => Path.Combine(DatabasePath, settingsFileName); }\r\n        private string FeaturesDirectoryPath { get => Path.Combine(DatabasePath, featuresDirName); }\r\n        private string ToolsDirectoryPath { get => Path.Combine(DatabasePath, toolsDirName); }\r\n        private string GameScannersDirectoryPath { get => Path.Combine(DatabasePath, gameScannersDirName); }\r\n        private string FilterPresetsDirectoryPath { get => Path.Combine(DatabasePath, filterPresetsDirName); }\r\n        private string ImportExclusionsDirectoryPath { get => Path.Combine(DatabasePath, importExclusionsDirName); }\r\n        private string CompletionStatusesDirectoryPath { get => Path.Combine(DatabasePath, completionStatusesDirName); }\r\n\r\n        #endregion Paths\r\n\r\n        #region Lists\r\n\r\n        public IItemCollection<Game> Games { get; private set; }\r\n        public IItemCollection<Platform> Platforms { get; private set; }\r\n        public IItemCollection<Emulator> Emulators { get; private set; }\r\n        public IItemCollection<Genre> Genres { get; private set; }\r\n        public IItemCollection<Company> Companies { get; private set; }\r\n        public IItemCollection<Tag> Tags { get; private set; }\r\n        public IItemCollection<Category> Categories { get; private set; }\r\n        public IItemCollection<Series> Series { get; private set; }\r\n        public IItemCollection<AgeRating> AgeRatings { get; private set; }\r\n        public IItemCollection<Region> Regions { get; private set; }\r\n        public IItemCollection<GameSource> Sources { get; private set; }\r\n        public IItemCollection<GameFeature> Features { get; private set; }\r\n        public AppSoftwareCollection SoftwareApps { get; private set; }\r\n        public IItemCollection<GameScannerConfig> GameScanners { get; private set; }\r\n        public IItemCollection<FilterPreset> FilterPresets { get; private set; }\r\n        public IItemCollection<ImportExclusionItem> ImportExclusions { get; private set; }\r\n        public IItemCollection<CompletionStatus> CompletionStatuses { get; private set; }\r\n\r\n        public List<Guid> UsedPlatforms { get; } = new List<Guid>();\r\n        public List<Guid> UsedGenres { get; } = new List<Guid>();\r\n        public List<Guid> UsedDevelopers { get; } = new List<Guid>();\r\n        public List<Guid> UsedPublishers { get; } = new List<Guid>();\r\n        public List<Guid> UsedTags { get; } = new List<Guid>();\r\n        public List<Guid> UsedCategories { get; } = new List<Guid>();\r\n        public List<Guid> UsedSeries { get; } = new List<Guid>();\r\n        public List<Guid> UsedAgeRatings { get; } = new List<Guid>();\r\n        public List<Guid> UsedRegions { get; } = new List<Guid>();\r\n        public List<Guid> UsedSources { get; } = new List<Guid>();\r\n        public List<Guid> UsedFeastures { get; } = new List<Guid>();\r\n        public List<Guid> UsedCompletionStatuses { get; } = new List<Guid>();\r\n\r\n        #endregion Lists\r\n\r\n        public static GameDatabase Instance { get; private set; }\r\n\r\n        public bool IsOpen\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        private DatabaseSettings settings;\r\n        public DatabaseSettings Settings\r\n        {\r\n            get\r\n            {\r\n                if (settings == null)\r\n                {\r\n                    if (File.Exists(DatabaseFileSettingsPath))\r\n                    {\r\n                        lock (databaseConfigFileLock)\r\n                        {\r\n                            settings = Serialization.FromJson<DatabaseSettings>(FileSystem.ReadFileAsStringSafe(DatabaseFileSettingsPath));\r\n                            if (settings == null)\r\n                            {\r\n                                // This shouldn't in theory happen, but there are some wierd crash reports available for this.\r\n                                settings = new DatabaseSettings() { Version = NewFormatVersion };\r\n                            }\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        settings = new DatabaseSettings() { Version = NewFormatVersion };\r\n                    }\r\n                }\r\n\r\n                return settings;\r\n            }\r\n\r\n            set\r\n            {\r\n                lock (databaseConfigFileLock)\r\n                {\r\n                    settings = value;\r\n                    FileSystem.WriteStringToFileSafe(DatabaseFileSettingsPath, Serialization.ToJson(settings));\r\n                }\r\n            }\r\n        }\r\n\r\n        public static readonly ushort NewFormatVersion = 4;\r\n\r\n        #region Events\r\n\r\n        public event EventHandler DatabaseOpened;\r\n        public event EventHandler<DatabaseFileEventArgs> DatabaseFileChanged;\r\n\r\n        public event EventHandler PlatformsInUseUpdated;\r\n        public event EventHandler GenresInUseUpdated;\r\n        public event EventHandler DevelopersInUseUpdated;\r\n        public event EventHandler PublishersInUseUpdated;\r\n        public event EventHandler TagsInUseUpdated;\r\n        public event EventHandler CategoriesInUseUpdated;\r\n        public event EventHandler AgeRatingsInUseUpdated;\r\n        public event EventHandler SeriesInUseUpdated;\r\n        public event EventHandler RegionsInUseUpdated;\r\n        public event EventHandler SourcesInUseUpdated;\r\n        public event EventHandler FeaturesInUseUpdated;\r\n        public event EventHandler CompletionStatusesInUseUpdated;\r\n\r\n        #endregion Events\r\n\r\n        #region Initialization\r\n\r\n        private void LoadCollections()\r\n        {\r\n            using (var timer = new ExecutionTimer(\"DatabaseLoadCollections\"))\r\n            {\r\n                (Platforms as PlatformsCollection).InitializeCollection(PlatformsDirectoryPath);\r\n                (Emulators as EmulatorsCollection).InitializeCollection(EmulatorsDirectoryPath);\r\n                (Genres as GenresCollection).InitializeCollection(GenresDirectoryPath);\r\n                (Companies as CompaniesCollection).InitializeCollection(CompaniesDirectoryPath);\r\n                (Tags as TagsCollection).InitializeCollection(TagsDirectoryPath);\r\n                (Categories as CategoriesCollection).InitializeCollection(CategoriesDirectoryPath);\r\n                (AgeRatings as AgeRatingsCollection).InitializeCollection(AgeRatingsDirectoryPath);\r\n                (Series as SeriesCollection).InitializeCollection(SeriesDirectoryPath);\r\n                (Regions as RegionsCollection).InitializeCollection(RegionsDirectoryPath);\r\n                (Sources as GamesSourcesCollection).InitializeCollection(SourcesDirectoryPath);\r\n                (Features as FeaturesCollection).InitializeCollection(FeaturesDirectoryPath);\r\n                (Games as GamesCollection).InitializeCollection(GamesDirectoryPath);\r\n                SoftwareApps.InitializeCollection(ToolsDirectoryPath);\r\n                (GameScanners as GameScannersCollection).InitializeCollection(GameScannersDirectoryPath);\r\n                (FilterPresets as FilterPresetsCollection).InitializeCollection(FilterPresetsDirectoryPath);\r\n                (ImportExclusions as ImportExclusionsCollection).InitializeCollection(ImportExclusionsDirectoryPath);\r\n                (CompletionStatuses as CompletionStatusesCollection).InitializeCollection(CompletionStatusesDirectoryPath);\r\n\r\n                Games.ItemUpdated += Games_ItemUpdated;\r\n                Games.ItemCollectionChanged += Games_ItemCollectionChanged;\r\n                Platforms.ItemCollectionChanged += Platforms_ItemCollectionChanged;\r\n                Genres.ItemCollectionChanged += Genres_ItemCollectionChanged;\r\n                Companies.ItemCollectionChanged += Companies_ItemCollectionChanged;\r\n                Tags.ItemCollectionChanged += Tags_ItemCollectionChanged;\r\n                Categories.ItemCollectionChanged += Categories_ItemCollectionChanged;\r\n                AgeRatings.ItemCollectionChanged += AgeRatings_ItemCollectionChanged;\r\n                Series.ItemCollectionChanged += Series_ItemCollectionChanged;\r\n                Regions.ItemCollectionChanged += Regions_ItemCollectionChanged;\r\n                Sources.ItemCollectionChanged += Sources_ItemCollectionChanged;\r\n                Features.ItemCollectionChanged += Features_ItemCollectionChanged;\r\n                CompletionStatuses.ItemCollectionChanged += CompletionStatuses_ItemCollectionChanged;\r\n            }\r\n        }\r\n\r\n        private void LoadUsedItems()\r\n        {\r\n            foreach (var game in Games)\r\n            {\r\n                if (game.PlatformIds.HasItems())\r\n                {\r\n                    UsedPlatforms.AddMissing(game.PlatformIds.Where(a => Platforms.ContainsItem(a)));\r\n                }\r\n\r\n                if (game.GenreIds.HasItems())\r\n                {\r\n                    UsedGenres.AddMissing(game.GenreIds.Where(a => Genres.ContainsItem(a)));\r\n                }\r\n\r\n                if (game.DeveloperIds.HasItems())\r\n                {\r\n                    UsedDevelopers.AddMissing(game.DeveloperIds.Where(a => Companies.ContainsItem(a)));\r\n                }\r\n\r\n                if (game.PublisherIds.HasItems())\r\n                {\r\n                    UsedPublishers.AddMissing(game.PublisherIds.Where(a => Companies.ContainsItem(a)));\r\n                }\r\n\r\n                if (game.TagIds.HasItems())\r\n                {\r\n                    UsedTags.AddMissing(game.TagIds.Where(a => Tags.ContainsItem(a)));\r\n                }\r\n\r\n                if (game.CategoryIds.HasItems())\r\n                {\r\n                    UsedCategories.AddMissing(game.CategoryIds.Where(a => Categories.ContainsItem(a)));\r\n                }\r\n\r\n                if (game.SeriesIds.HasItems())\r\n                {\r\n                    UsedSeries.AddMissing(game.SeriesIds.Where(a => Series.ContainsItem(a)));\r\n                }\r\n\r\n                if (game.AgeRatingIds.HasItems())\r\n                {\r\n                    UsedAgeRatings.AddMissing(game.AgeRatingIds.Where(a => AgeRatings.ContainsItem(a)));\r\n                }\r\n\r\n                if (game.RegionIds.HasItems())\r\n                {\r\n                    UsedRegions.AddMissing(game.RegionIds.Where(a => Regions.ContainsItem(a)));\r\n                }\r\n\r\n                if (game.SourceId != Guid.Empty && Sources.ContainsItem(game.SourceId))\r\n                {\r\n                    UsedSources.AddMissing(game.SourceId);\r\n                }\r\n\r\n                if (game.FeatureIds.HasItems())\r\n                {\r\n                    UsedFeastures.AddMissing(game.FeatureIds.Where(a => Features.ContainsItem(a)));\r\n                }\r\n\r\n                if (game.CompletionStatusId != Guid.Empty && CompletionStatuses.ContainsItem(game.CompletionStatusId))\r\n                {\r\n                    UsedCompletionStatuses.AddMissing(game.CompletionStatusId);\r\n                }\r\n            }\r\n        }\r\n\r\n        #endregion Intialization\r\n\r\n        public GameDatabase() : this(null)\r\n        {\r\n        }\r\n\r\n        public static LiteDB.BsonMapper GetCollectionMapper()\r\n        {\r\n            var mapper = new LiteDB.BsonMapper()\r\n            {\r\n                SerializeNullValues = false,\r\n                TrimWhitespace = false,\r\n                EmptyStringToNull = true,\r\n                IncludeFields = false,\r\n                IncludeNonPublic = false\r\n            };\r\n\r\n            foreach (var col in collectionsSpec)\r\n            {\r\n                col.Value.\r\n                    GetMethod(nameof(GamesCollection.MapLiteDbEntities), BindingFlags.Public | BindingFlags.Static).\r\n                    Invoke(null, new object[] { mapper });\r\n            }\r\n\r\n            return mapper;\r\n        }\r\n\r\n        public GameDatabase(string path)\r\n        {\r\n            var mapper = GetCollectionMapper();\r\n            DatabasePath = GetFullDbPath(path);\r\n\r\n            foreach (var col in collectionsSpec)\r\n            {\r\n                var collection = Activator.CreateInstance(col.Value, this, mapper);\r\n                typeof(GameDatabase).GetProperty(col.Key).SetValue(this, collection);\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            if (!IsOpen)\r\n            {\r\n                return;\r\n            }\r\n\r\n            foreach (var col in collectionsSpec)\r\n            {\r\n                var prop = typeof(GameDatabase).GetProperty(col.Key);\r\n                typeof(IDisposable).GetMethod(nameof(IDisposable.Dispose)).Invoke(prop.GetValue(this), null);\r\n            }\r\n        }\r\n\r\n        public static string GetDefaultPath(bool portable, string userDataDirOverride)\r\n        {\r\n            if (!userDataDirOverride.IsNullOrWhiteSpace())\r\n            {\r\n                return Path.Combine(userDataDirOverride, \"library\");\r\n            }\r\n\r\n            if (portable)\r\n            {\r\n                return ExpandableVariables.PlayniteDirectory + @\"\\library\";\r\n            }\r\n            else\r\n            {\r\n                return @\"%AppData%\\Playnite\\library\";\r\n            }\r\n        }\r\n\r\n        private void CheckDbState()\r\n        {\r\n            if (!IsOpen)\r\n            {\r\n                throw new Exception(\"Database is not opened.\");\r\n            }\r\n        }\r\n\r\n        internal static DatabaseSettings GetSettingsFromDbPath(string dbPath)\r\n        {\r\n            var settingsPath = Path.Combine(dbPath, settingsFileName);\r\n            return Serialization.FromJson<DatabaseSettings>(FileSystem.ReadFileAsStringSafe(settingsPath));\r\n        }\r\n\r\n        internal static void SaveSettingsToDbPath(DatabaseSettings settings, string dbPath)\r\n        {\r\n            var settingsPath = Path.Combine(dbPath, settingsFileName);\r\n            FileSystem.WriteStringToFileSafe(settingsPath, Serialization.ToJson(settings));\r\n        }\r\n\r\n        // TODO: Remove this, we should only allow path to be set during instantiation.\r\n        public void SetDatabasePath(string path)\r\n        {\r\n            if (IsOpen)\r\n            {\r\n                throw new Exception(\"Cannot change database path when database is open.\");\r\n            }\r\n\r\n            DatabasePath = GetFullDbPath(path);\r\n        }\r\n\r\n        public static string GetFullDbPath(string path)\r\n        {\r\n            if (string.IsNullOrEmpty(path))\r\n            {\r\n                return path;\r\n            }\r\n\r\n            if (path.Contains(ExpandableVariables.PlayniteDirectory, StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                return path?.Replace(ExpandableVariables.PlayniteDirectory, PlaynitePaths.ProgramPath);\r\n            }\r\n            else if (path.Contains(\"%AppData%\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                return path?.Replace(\"%AppData%\", Environment.ExpandEnvironmentVariables(\"%AppData%\"), StringComparison.OrdinalIgnoreCase);\r\n            }\r\n            else if (!Paths.IsFullPath(path))\r\n            {\r\n                return Path.GetFullPath(path);\r\n            }\r\n            else\r\n            {\r\n                return path;\r\n            }\r\n        }\r\n\r\n        public void OpenDatabase()\r\n        {\r\n            if (string.IsNullOrEmpty(DatabasePath))\r\n            {\r\n                throw new Exception(\"Database path cannot be empty.\");\r\n            }\r\n\r\n            var dbExists = File.Exists(DatabaseFileSettingsPath);\r\n            logger.Info(\"Opening db \" + DatabasePath);\r\n\r\n            if (!FileSystem.CanWriteToFolder(DatabasePath))\r\n            {\r\n                throw new Exception($\"Can't write to \\\"{DatabasePath}\\\" folder.\");\r\n            }\r\n\r\n            // This fixes an issue where people mess up their library with custom scripts\r\n            // which create collection files instead of directories :|\r\n            if (File.Exists(FilesDirectoryPath))\r\n            {\r\n                File.Delete(FilesDirectoryPath);\r\n            }\r\n\r\n            if (!dbExists)\r\n            {\r\n                FileSystem.CreateDirectory(DatabasePath);\r\n                FileSystem.CreateDirectory(FilesDirectoryPath);\r\n            }\r\n\r\n            if (!dbExists)\r\n            {\r\n                Settings = new DatabaseSettings() { Version = NewFormatVersion };\r\n            }\r\n            else\r\n            {\r\n                if (Settings.Version > NewFormatVersion)\r\n                {\r\n                    throw new Exception($\"Database version {Settings.Version} is not supported.\");\r\n                }\r\n\r\n                if (GetMigrationRequired(DatabasePath))\r\n                {\r\n                    throw new Exception(\"Database must be migrated before opening.\");\r\n                }\r\n            }\r\n\r\n            LoadCollections();\r\n            LoadUsedItems();\r\n\r\n            // New DB setup\r\n            if (!dbExists)\r\n            {\r\n                // Generate default platforms\r\n                var platforms = Emulation.Platforms.Where(a => a.IgdbId != 0).Select(a => new Platform(a.Name) { SpecificationId = a.Id }).ToList();\r\n                if (platforms.HasItems())\r\n                {\r\n                    var col = Platforms as ItemCollection<Platform>;\r\n                    col.IsEventsEnabled = false;\r\n                    col.Add(platforms);\r\n                    col.IsEventsEnabled = true;\r\n                }\r\n\r\n                // Generate default regions\r\n                var regions = Emulation.Regions.Where(a => a.DefaultImport).Select(a => new Region(a.Name) { SpecificationId = a.Id }).ToList();\r\n                if (regions.HasItems())\r\n                {\r\n                    var col = Regions as ItemCollection<Region>;\r\n                    col.IsEventsEnabled = false;\r\n                    col.Add(regions);\r\n                    col.IsEventsEnabled = true;\r\n                }\r\n\r\n                // Generate default completion statuses\r\n                var compCol = CompletionStatuses as CompletionStatusesCollection;\r\n                var defStatuses = new string[] { \"Not Played\", \"Played\", \"Beaten\", \"Completed\", \"Playing\", \"Abandoned\", \"On Hold\", \"Plan to Play\" };\r\n                foreach (var status in defStatuses)\r\n                {\r\n                    compCol.IsEventsEnabled = false;\r\n                    compCol.Add(status);\r\n                    compCol.IsEventsEnabled = true;\r\n                }\r\n\r\n                var set = new CompletionStatusSettings\r\n                {\r\n                    DefaultStatus = compCol.First(a => a.Name == defStatuses[0]).Id,\r\n                    PlayedStatus = compCol.First(a => a.Name == defStatuses[1]).Id\r\n                };\r\n\r\n                compCol.SetSettings(set);\r\n\r\n                // Generate default filter presets\r\n                var filters = FilterPresets as FilterPresetsCollection;\r\n                filters.IsEventsEnabled = false;\r\n                filters.Add(new FilterPreset\r\n                {\r\n                    Name = \"All\",\r\n                    ShowInFullscreeQuickSelection = true,\r\n                    GroupingOrder = GroupableField.None,\r\n                    SortingOrder = SortOrder.Name,\r\n                    SortingOrderDirection = SortOrderDirection.Ascending,\r\n                    Settings = new FilterPresetSettings()\r\n                });\r\n\r\n                filters.Add(new FilterPreset\r\n                {\r\n                    Name = \"Recently Played\",\r\n                    ShowInFullscreeQuickSelection = true,\r\n                    GroupingOrder = GroupableField.None,\r\n                    SortingOrder = SortOrder.LastActivity,\r\n                    SortingOrderDirection = SortOrderDirection.Descending,\r\n                    Settings = new FilterPresetSettings { IsInstalled = true }\r\n                });\r\n\r\n                filters.Add(new FilterPreset\r\n                {\r\n                    Name = \"Favorites\",\r\n                    ShowInFullscreeQuickSelection = true,\r\n                    GroupingOrder = GroupableField.None,\r\n                    SortingOrder = SortOrder.Name,\r\n                    SortingOrderDirection = SortOrderDirection.Ascending,\r\n                    Settings = new FilterPresetSettings { Favorite = true }\r\n                });\r\n\r\n                filters.Add(new FilterPreset\r\n                {\r\n                    Name = \"Most Played\",\r\n                    ShowInFullscreeQuickSelection = true,\r\n                    GroupingOrder = GroupableField.None,\r\n                    SortingOrder = SortOrder.Playtime,\r\n                    SortingOrderDirection = SortOrderDirection.Descending,\r\n                    Settings = new FilterPresetSettings()\r\n                });\r\n\r\n                filters.IsEventsEnabled = true;\r\n            }\r\n\r\n            IsOpen = true;\r\n            if (PlayniteApplication.Current != null)\r\n            {\r\n                PlayniteApplication.Current.SyncContext.Send((_) => DatabaseOpened?.Invoke(this, null), null);\r\n            }\r\n            else\r\n            {\r\n                DatabaseOpened?.Invoke(this, null);\r\n            }\r\n        }\r\n\r\n        private void Games_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<Game> e)\r\n        {\r\n            if (e.AddedItems.HasItems())\r\n            {\r\n                foreach (var game in e.AddedItems)\r\n                {\r\n                    UpdateFieldsInUse(game.PlatformIds, UsedPlatforms, PlatformsInUseUpdated, Platforms);\r\n                    UpdateFieldsInUse(game.GenreIds, UsedGenres, GenresInUseUpdated, Genres);\r\n                    UpdateFieldsInUse(game.DeveloperIds, UsedDevelopers, DevelopersInUseUpdated, Companies);\r\n                    UpdateFieldsInUse(game.PublisherIds, UsedPublishers, PublishersInUseUpdated, Companies);\r\n                    UpdateFieldsInUse(game.TagIds, UsedTags, TagsInUseUpdated, Tags);\r\n                    UpdateFieldsInUse(game.CategoryIds, UsedCategories, CategoriesInUseUpdated, Categories);\r\n                    UpdateFieldsInUse(game.AgeRatingIds, UsedAgeRatings, AgeRatingsInUseUpdated, AgeRatings);\r\n                    UpdateFieldsInUse(game.SeriesIds, UsedSeries, SeriesInUseUpdated, Series);\r\n                    UpdateFieldsInUse(game.RegionIds, UsedRegions, RegionsInUseUpdated, Regions);\r\n                    UpdateFieldsInUse(game.SourceId, UsedSources, SourcesInUseUpdated, Sources);\r\n                    UpdateFieldsInUse(game.FeatureIds, UsedFeastures, FeaturesInUseUpdated, Features);\r\n                    UpdateFieldsInUse(game.CompletionStatusId, UsedCompletionStatuses, CompletionStatusesInUseUpdated, CompletionStatuses);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Games_ItemUpdated(object sender, ItemUpdatedEventArgs<Game> e)\r\n        {\r\n            foreach (var upd in e.UpdatedItems)\r\n            {\r\n                UpdateFieldsInUse(upd.NewData.PlatformIds, UsedPlatforms, PlatformsInUseUpdated, Platforms);\r\n                UpdateFieldsInUse(upd.NewData.GenreIds, UsedGenres, GenresInUseUpdated, Genres);\r\n                UpdateFieldsInUse(upd.NewData.DeveloperIds, UsedDevelopers, DevelopersInUseUpdated, Companies);\r\n                UpdateFieldsInUse(upd.NewData.PublisherIds, UsedPublishers, PublishersInUseUpdated, Companies);\r\n                UpdateFieldsInUse(upd.NewData.TagIds, UsedTags, TagsInUseUpdated, Tags);\r\n                UpdateFieldsInUse(upd.NewData.CategoryIds, UsedCategories, CategoriesInUseUpdated, Categories);\r\n                UpdateFieldsInUse(upd.NewData.AgeRatingIds, UsedAgeRatings, AgeRatingsInUseUpdated, AgeRatings);\r\n                UpdateFieldsInUse(upd.NewData.SeriesIds, UsedSeries, SeriesInUseUpdated, Series);\r\n                UpdateFieldsInUse(upd.NewData.RegionIds, UsedRegions, RegionsInUseUpdated, Regions);\r\n                UpdateFieldsInUse(upd.NewData.SourceId, UsedSources, SourcesInUseUpdated, Sources);\r\n                UpdateFieldsInUse(upd.NewData.FeatureIds, UsedFeastures, FeaturesInUseUpdated, Features);\r\n                UpdateFieldsInUse(upd.NewData.CompletionStatusId, UsedCompletionStatuses, CompletionStatusesInUseUpdated, CompletionStatuses);\r\n            }\r\n        }\r\n\r\n        private void UpdateFieldsInUse(Guid sourceData, List<Guid> useCollection, EventHandler handler, IItemCollection dbItems)\r\n        {\r\n            if (sourceData != Guid.Empty && dbItems.ContainsItem(sourceData))\r\n            {\r\n                if (useCollection.AddMissing(sourceData))\r\n                {\r\n                    handler?.Invoke(this, EventArgs.Empty);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void UpdateFieldsInUse(List<Guid> sourceData, List<Guid> useCollection, EventHandler handler, IItemCollection dbItems)\r\n        {\r\n            if (sourceData.HasItems())\r\n            {\r\n                if (useCollection.AddMissing(sourceData.Where(a => dbItems.ContainsItem(a)).ToArray()))\r\n                {\r\n                    handler?.Invoke(this, EventArgs.Empty);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void UpdateRemovedFieldsInUse<T>(List<T> removedObjects, List<Guid> useCollection, EventHandler handler) where T : DatabaseObject\r\n        {\r\n            if (removedObjects.HasItems())\r\n            {\r\n                var someRemoved = false;\r\n                foreach (var item in removedObjects)\r\n                {\r\n                    if (useCollection.Remove(item.Id))\r\n                    {\r\n                        someRemoved = true;\r\n                    }\r\n                }\r\n\r\n                if (someRemoved)\r\n                {\r\n                    handler?.Invoke(this, EventArgs.Empty);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Features_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<GameFeature> e)\r\n        {\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedFeastures, FeaturesInUseUpdated);\r\n        }\r\n\r\n        private void Sources_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<GameSource> e)\r\n        {\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedSources, SourcesInUseUpdated);\r\n        }\r\n\r\n        private void Regions_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<Region> e)\r\n        {\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedRegions, RegionsInUseUpdated);\r\n        }\r\n\r\n        private void Series_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<Series> e)\r\n        {\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedSeries, SeriesInUseUpdated);\r\n        }\r\n\r\n        private void AgeRatings_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<AgeRating> e)\r\n        {\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedAgeRatings, AgeRatingsInUseUpdated);\r\n        }\r\n\r\n        private void Categories_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<Category> e)\r\n        {\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedCategories, CategoriesInUseUpdated);\r\n        }\r\n\r\n        private void Tags_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<Tag> e)\r\n        {\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedTags, TagsInUseUpdated);\r\n        }\r\n\r\n        private void Companies_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<Company> e)\r\n        {\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedDevelopers, DevelopersInUseUpdated);\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedPublishers, PublishersInUseUpdated);\r\n        }\r\n\r\n        private void Genres_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<Genre> e)\r\n        {\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedGenres, GenresInUseUpdated);\r\n        }\r\n\r\n        private void Platforms_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<Platform> e)\r\n        {\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedPlatforms, PlatformsInUseUpdated);\r\n        }\r\n\r\n        private void CompletionStatuses_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<CompletionStatus> e)\r\n        {\r\n            UpdateRemovedFieldsInUse(e.RemovedItems, UsedCompletionStatuses, CompletionStatusesInUseUpdated);\r\n        }\r\n\r\n        #region Files\r\n\r\n        public string GetFileStoragePath(Guid parentId)\r\n        {\r\n            var path = Path.Combine(FilesDirectoryPath, parentId.ToString());\r\n            FileSystem.CreateDirectory(path, false);\r\n            return path;\r\n        }\r\n\r\n        public string GetFullFilePath(string dbPath)\r\n        {\r\n            return Path.Combine(FilesDirectoryPath, dbPath);\r\n        }\r\n\r\n        public string AddFile(MetadataFile file, Guid parentId, bool isImage, CancellationToken cancelToken)\r\n        {\r\n            if (!file.HasImageData)\r\n            {\r\n                logger.Error(\"Cannot add file to database, no file data provided.\");\r\n                return null;\r\n            }\r\n\r\n            string localPath = null;\r\n            try\r\n            {\r\n                localPath = file.GetLocalFile(cancelToken);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to get local file from metadata file\");\r\n            }\r\n\r\n            if (localPath.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n\r\n            var finalFile = AddFile(localPath, parentId, isImage, cancelToken);\r\n            if (localPath.StartsWith(PlaynitePaths.TempPath))\r\n            {\r\n                FileSystem.DeleteFile(localPath);\r\n            }\r\n\r\n            return finalFile;\r\n        }\r\n\r\n        public string AddFile(string path, Guid parentId, bool isImage, CancellationToken cancelToken)\r\n        {\r\n            CheckDbState();\r\n            var targetDir = Path.Combine(FilesDirectoryPath, parentId.ToString());\r\n            var dbPath = string.Empty;\r\n\r\n            if (path.IsHttpUrl())\r\n            {\r\n                var extension = Path.GetExtension(new Uri(path).AbsolutePath);\r\n                var fileName = Guid.NewGuid().ToString() + extension;\r\n                var downPath = Path.Combine(targetDir, fileName);\r\n\r\n                try\r\n                {\r\n                    HttpDownloader.DownloadFile(path, downPath, cancelToken);\r\n                    if (cancelToken.IsCancellationRequested)\r\n                    {\r\n                        FileSystem.DeleteFile(downPath);\r\n                        return null;\r\n                    }\r\n\r\n                    if (FileSystem.GetFileSize(downPath) == 0)\r\n                    {\r\n                        FileSystem.DeleteFile(downPath);\r\n                        return null;\r\n                    }\r\n\r\n                    if (isImage)\r\n                    {\r\n                        var converted = Images.ConvertToCompatibleFormat(downPath, Path.Combine(targetDir, Path.GetFileNameWithoutExtension(fileName)));\r\n                        if (converted.IsNullOrEmpty())\r\n                        {\r\n                            FileSystem.DeleteFile(downPath);\r\n                            return null;\r\n                        }\r\n                        else if (converted == downPath)\r\n                        {\r\n                            dbPath = Path.Combine(parentId.ToString(), fileName);\r\n                        }\r\n                        else\r\n                        {\r\n                            dbPath = Path.Combine(parentId.ToString(), Path.GetFileName(converted));\r\n                            FileSystem.DeleteFile(downPath);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        dbPath = Path.Combine(parentId.ToString(), fileName);\r\n                    }\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    FileSystem.DeleteFile(downPath);\r\n                    logger.Error(e, $\"Failed to add http {path} file to database.\");\r\n                    return null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                try\r\n                {\r\n                    var fileName = Path.GetFileName(path);\r\n                    // Re-use file if already part of db folder, don't copy.\r\n                    if (Paths.AreEqual(targetDir, Path.GetDirectoryName(path)))\r\n                    {\r\n                        dbPath = Path.Combine(parentId.ToString(), fileName);\r\n                    }\r\n                    else\r\n                    {\r\n                        fileName = Guid.NewGuid().ToString() + Path.GetExtension(fileName);\r\n                        if (isImage)\r\n                        {\r\n                            var converted = Images.ConvertToCompatibleFormat(path, Path.Combine(targetDir, Path.GetFileNameWithoutExtension(fileName)));\r\n                            if (converted.IsNullOrEmpty())\r\n                            {\r\n                                return null;\r\n                            }\r\n                            else if (converted == path)\r\n                            {\r\n                                FileSystem.CopyFile(path, Path.Combine(targetDir, fileName));\r\n                                dbPath = Path.Combine(parentId.ToString(), fileName);\r\n                            }\r\n                            else\r\n                            {\r\n                                dbPath = Path.Combine(parentId.ToString(), Path.GetFileName(converted));\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            FileSystem.CopyFile(path, Path.Combine(targetDir, fileName));\r\n                            dbPath = Path.Combine(parentId.ToString(), fileName);\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to add {path} file to database.\");\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            DatabaseFileChanged?.Invoke(this, new DatabaseFileEventArgs(dbPath, FileEvent.Added));\r\n            return dbPath;\r\n        }\r\n\r\n        public void RemoveFile(string dbPath)\r\n        {\r\n            if (string.IsNullOrEmpty(dbPath))\r\n            {\r\n                return;\r\n            }\r\n\r\n            CheckDbState();\r\n            var filePath = GetFullFilePath(dbPath);\r\n            if (!File.Exists(filePath))\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                lock (GetFileLock(dbPath))\r\n                {\r\n                    try\r\n                    {\r\n                        FileSystem.DeleteFileSafe(filePath);\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to remove old database file {dbPath}.\");\r\n                    }\r\n\r\n                    try\r\n                    {\r\n                        var dir = Path.GetDirectoryName(filePath);\r\n                        if (FileSystem.IsDirectoryEmpty(dir))\r\n                        {\r\n                            FileSystem.DeleteDirectory(dir);\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        // Getting crash reports from Path.GetDirectoryName for some reason.\r\n                        logger.Error(e, \"Failed to clean up directory after removing file\");\r\n                    }\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                ReleaseFileLock(dbPath);\r\n            }\r\n\r\n            DatabaseFileChanged?.Invoke(this, new DatabaseFileEventArgs(dbPath, FileEvent.Removed));\r\n        }\r\n\r\n        public BitmapSource GetFileAsImage(string dbPath, BitmapLoadProperties loadProperties = null)\r\n        {\r\n            CheckDbState();\r\n            var filePath = GetFullFilePath(dbPath);\r\n            if (!File.Exists(filePath))\r\n            {\r\n                return null;\r\n            }\r\n\r\n            try\r\n            {\r\n                lock (GetFileLock(dbPath))\r\n                {\r\n                    using (var fStream = FileSystem.OpenReadFileStreamSafe(filePath))\r\n                    {\r\n                        return BitmapExtensions.BitmapFromStream(fStream, loadProperties);\r\n                    }\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                ReleaseFileLock(dbPath);\r\n            }\r\n        }\r\n\r\n        public void CopyFile(string dbPath, string targetPath)\r\n        {\r\n            CheckDbState();\r\n            var filePath = GetFullFilePath(dbPath);\r\n\r\n            try\r\n            {\r\n                lock (GetFileLock(dbPath))\r\n                {\r\n                    FileSystem.PrepareSaveFile(targetPath);\r\n                    File.Copy(filePath, targetPath);\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                ReleaseFileLock(dbPath);\r\n            }\r\n        }\r\n\r\n        #endregion Files\r\n\r\n        public void BeginBufferUpdate()\r\n        {\r\n            Platforms.BeginBufferUpdate();\r\n            Genres.BeginBufferUpdate();\r\n            Companies.BeginBufferUpdate();\r\n            Tags.BeginBufferUpdate();\r\n            Categories.BeginBufferUpdate();\r\n            Series.BeginBufferUpdate();\r\n            AgeRatings.BeginBufferUpdate();\r\n            Regions.BeginBufferUpdate();\r\n            Sources.BeginBufferUpdate();\r\n            Emulators.BeginBufferUpdate();\r\n            Features.BeginBufferUpdate();\r\n            Games.BeginBufferUpdate();\r\n            SoftwareApps.BeginBufferUpdate();\r\n            GameScanners.BeginBufferUpdate();\r\n            FilterPresets.BeginBufferUpdate();\r\n            ImportExclusions.BeginBufferUpdate();\r\n            CompletionStatuses.BeginBufferUpdate();\r\n        }\r\n\r\n        public void EndBufferUpdate()\r\n        {\r\n            Platforms.EndBufferUpdate();\r\n            Genres.EndBufferUpdate();\r\n            Companies.EndBufferUpdate();\r\n            Tags.EndBufferUpdate();\r\n            Categories.EndBufferUpdate();\r\n            Series.EndBufferUpdate();\r\n            AgeRatings.EndBufferUpdate();\r\n            Regions.EndBufferUpdate();\r\n            Sources.EndBufferUpdate();\r\n            Emulators.EndBufferUpdate();\r\n            Features.EndBufferUpdate();\r\n            Games.EndBufferUpdate();\r\n            SoftwareApps.EndBufferUpdate();\r\n            GameScanners.EndBufferUpdate();\r\n            FilterPresets.EndBufferUpdate();\r\n            ImportExclusions.EndBufferUpdate();\r\n            CompletionStatuses.EndBufferUpdate();\r\n        }\r\n\r\n        public IDisposable BufferedUpdate()\r\n        {\r\n            return new EventBufferHandler(this);\r\n        }\r\n\r\n        private Game GameInfoToGame(GameMetadata game, Guid pluginId)\r\n        {\r\n            var toAdd = new Game()\r\n            {\r\n                PluginId = pluginId,\r\n                Name = game.Name,\r\n                GameId = game.GameId,\r\n                Description = game.Description,\r\n                InstallDirectory = game.InstallDirectory,\r\n                SortingName = game.SortingName,\r\n                GameActions = game.GameActions == null ? null : new ObservableCollection<GameAction>(game.GameActions),\r\n                ReleaseDate = game.ReleaseDate,\r\n                Links = game.Links == null ? null : new ObservableCollection<Link>(game.Links),\r\n                Roms = game.Roms == null ? null : new ObservableCollection<GameRom>(game.Roms),\r\n                IsInstalled = game.IsInstalled,\r\n                Playtime = game.Playtime,\r\n                PlayCount = game.PlayCount,\r\n                LastActivity = game.LastActivity,\r\n                Version = game.Version,\r\n                UserScore = game.UserScore,\r\n                CriticScore = game.CriticScore,\r\n                CommunityScore = game.CommunityScore,\r\n                Hidden = game.Hidden,\r\n                Favorite = game.Favorite,\r\n                InstallSize = game.InstallSize\r\n            };\r\n\r\n            if (game.Platforms?.Any() == true)\r\n            {\r\n                toAdd.PlatformIds = Platforms.Add(game.Platforms).Select(a => a.Id).ToList();\r\n            }\r\n\r\n            if (game.Regions?.Any() == true)\r\n            {\r\n                toAdd.RegionIds = Regions.Add(game.Regions).Select(a => a.Id).ToList();\r\n            }\r\n\r\n            if (game.Developers?.Any() == true)\r\n            {\r\n                toAdd.DeveloperIds = Companies.Add(game.Developers).Select(a => a.Id).ToList();\r\n            }\r\n\r\n            if (game.Publishers?.Any() == true)\r\n            {\r\n                toAdd.PublisherIds = Companies.Add(game.Publishers).Select(a => a.Id).ToList();\r\n            }\r\n\r\n            if (game.Genres?.Any() == true)\r\n            {\r\n                toAdd.GenreIds = Genres.Add(game.Genres).Select(a => a.Id).ToList();\r\n            }\r\n\r\n            if (game.Categories?.Any() == true)\r\n            {\r\n                toAdd.CategoryIds = Categories.Add(game.Categories).Select(a => a.Id).ToList();\r\n            }\r\n\r\n            if (game.Tags?.Any() == true)\r\n            {\r\n                toAdd.TagIds = Tags.Add(game.Tags).Select(a => a.Id).ToList();\r\n            }\r\n\r\n            if (game.Features?.Any() == true)\r\n            {\r\n                toAdd.FeatureIds = Features.Add(game.Features).Select(a => a.Id).ToList();\r\n            }\r\n\r\n            if (game.AgeRatings?.Any() == true)\r\n            {\r\n                toAdd.AgeRatingIds = AgeRatings.Add(game.AgeRatings).Select(a => a.Id).ToList();\r\n            }\r\n\r\n            if (game.Series?.Any() == true)\r\n            {\r\n                toAdd.SeriesIds = Series.Add(game.Series).Select(a => a.Id).ToList();\r\n            }\r\n\r\n            if (game.Source != null)\r\n            {\r\n                toAdd.SourceId = Sources.Add(game.Source).Id;\r\n            }\r\n\r\n            if (game.CompletionStatus != null)\r\n            {\r\n                toAdd.CompletionStatusId = CompletionStatuses.Add(game.CompletionStatus).Id;\r\n            }\r\n\r\n            return toAdd;\r\n        }\r\n\r\n        public Game ImportGame(GameMetadata game)\r\n        {\r\n            return ImportGame(game, Guid.Empty);\r\n        }\r\n\r\n        public Game ImportGame(GameMetadata game, LibraryPlugin sourcePlugin)\r\n        {\r\n            return ImportGame(game, sourcePlugin.Id);\r\n        }\r\n\r\n        public Game ImportGame(GameMetadata game, Guid pluginId)\r\n        {\r\n            var toAdd = GameInfoToGame(game, pluginId);\r\n\r\n            if (game.Icon != null)\r\n            {\r\n                toAdd.Icon = AddFile(game.Icon, toAdd.Id, true, CancellationToken.None);\r\n            }\r\n\r\n            if (game.CoverImage != null)\r\n            {\r\n                toAdd.CoverImage = AddFile(game.CoverImage, toAdd.Id, true, CancellationToken.None);\r\n            }\r\n\r\n            if (game.BackgroundImage != null)\r\n            {\r\n                toAdd.BackgroundImage = AddFile(game.BackgroundImage, toAdd.Id, true, CancellationToken.None);\r\n            }\r\n\r\n            toAdd.IncludeLibraryPluginAction = true;\r\n            Games.Add(toAdd);\r\n            return toAdd;\r\n        }\r\n\r\n        public List<Game> ImportGames(LibraryPlugin library, CancellationToken cancelToken, PlaytimeImportMode playtimeImportMode)\r\n        {\r\n            using (BufferedUpdate())\r\n            {\r\n                var statusSettings = GetCompletionStatusSettings();\r\n                bool updateCompletionStatus(Game game, CompletionStatusSettings settings)\r\n                {\r\n                    var updated = false;\r\n                    if ((game.Playtime > 0 && (game.CompletionStatusId == Guid.Empty || game.CompletionStatusId == settings.DefaultStatus)) &&\r\n                        game.CompletionStatusId != statusSettings.PlayedStatus)\r\n                    {\r\n                        game.CompletionStatusId = statusSettings.PlayedStatus;\r\n                        updated = true;\r\n                    }\r\n                    else if ((game.Playtime == 0 && game.CompletionStatusId == Guid.Empty) &&\r\n                        game.CompletionStatusId != statusSettings.DefaultStatus)\r\n                    {\r\n                        game.CompletionStatusId = statusSettings.DefaultStatus;\r\n                        updated = true;\r\n                    }\r\n\r\n                    return updated;\r\n                }\r\n\r\n                if (library.Properties?.HasCustomizedGameImport == true)\r\n                {\r\n                    var importedGames = library.ImportGames(new LibraryImportGamesArgs { CancelToken = cancelToken })?.ToList() ?? new List<Game>();\r\n                    foreach (var game in importedGames)\r\n                    {\r\n                        updateCompletionStatus(game, statusSettings);\r\n                    }\r\n\r\n                    return importedGames;\r\n                }\r\n                else\r\n                {\r\n                    var addedGames = new List<Game>();\r\n                    foreach (var newGame in library.GetGames(new LibraryGetGamesArgs { CancelToken = cancelToken }) ?? new List<GameMetadata>())\r\n                    {\r\n                        if (ImportExclusions[ImportExclusionItem.GetId(newGame.GameId, library.Id)] != null)\r\n                        {\r\n                            logger.Debug($\"Excluding {newGame.Name} {library.Name} from import.\");\r\n                            continue;\r\n                        }\r\n\r\n                        var existingGame = Games.FirstOrDefault(a => a.GameId == newGame.GameId && a.PluginId == library.Id);\r\n                        if (existingGame == null)\r\n                        {\r\n                            logger.Info(string.Format(\"Adding new game {0} from {1} plugin\", newGame.GameId, library.Name));\r\n                            try\r\n                            {\r\n                                if (newGame.Playtime != 0)\r\n                                {\r\n                                    var originalPlaytime = newGame.Playtime;\r\n                                    newGame.Playtime = 0;\r\n                                    if (playtimeImportMode == PlaytimeImportMode.Always ||\r\n                                        playtimeImportMode == PlaytimeImportMode.NewImportsOnly)\r\n                                    {\r\n                                        newGame.Playtime = originalPlaytime;\r\n                                    }\r\n                                }\r\n\r\n                                var importedGame = ImportGame(newGame, library.Id);\r\n                                addedGames.Add(importedGame);\r\n                                if (updateCompletionStatus(importedGame, statusSettings))\r\n                                {\r\n                                    Games.Update(importedGame);\r\n                                }\r\n                            }\r\n                            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                            {\r\n                                logger.Error(e, \"Failed to import game into database.\");\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            var existingGameUpdated = false;\r\n                            if (!existingGame.IsCustomGame && !existingGame.OverrideInstallState)\r\n                            {\r\n                                if (existingGame.IsInstalled != newGame.IsInstalled)\r\n                                {\r\n                                    existingGame.IsInstalled = newGame.IsInstalled;\r\n                                    existingGameUpdated = true;\r\n                                }\r\n\r\n                                if (string.Equals(existingGame.InstallDirectory, newGame.InstallDirectory, StringComparison.OrdinalIgnoreCase) == false)\r\n                                {\r\n                                    existingGame.InstallDirectory = newGame.InstallDirectory;\r\n                                    existingGameUpdated = true;\r\n                                }\r\n                            }\r\n\r\n                            if (playtimeImportMode == PlaytimeImportMode.Always && newGame.Playtime > 0)\r\n                            {\r\n                                if (existingGame.Playtime != newGame.Playtime)\r\n                                {\r\n                                    existingGame.Playtime = newGame.Playtime;\r\n                                    existingGameUpdated = true;\r\n                                }\r\n\r\n                                // The LastActivity value of the newGame is only applied if newer than\r\n                                // the existing game, to prevent cases of DRM free games being launched without\r\n                                // the client or offline, which would prevent the date from being updated in the service\r\n                                if (newGame.LastActivity != null &&\r\n                                    (existingGame.LastActivity == null || newGame.LastActivity > existingGame.LastActivity))\r\n                                {\r\n                                    existingGame.LastActivity = newGame.LastActivity;\r\n                                    existingGameUpdated = true;\r\n                                }\r\n\r\n                                if (updateCompletionStatus(existingGame, statusSettings))\r\n                                {\r\n                                    existingGameUpdated = true;\r\n                                }\r\n                            }\r\n\r\n                            if (!existingGame.IsInstalled && newGame.InstallSize != null && newGame.InstallSize > 0 &&\r\n                                existingGame.InstallSize != newGame.InstallSize)\r\n                            {\r\n                                existingGame.InstallSize = newGame.InstallSize;\r\n                                existingGameUpdated = true;\r\n                            }\r\n\r\n                            if (existingGameUpdated)\r\n                            {\r\n                                Games.Update(existingGame);\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    return addedGames;\r\n                }\r\n            }\r\n        }\r\n\r\n        public List<FilterPreset> GetSortedFilterPresets()\r\n        {\r\n            if (!IsOpen)\r\n            {\r\n                return new List<FilterPreset>();\r\n            }\r\n\r\n            var filterPresetsSettings = (FilterPresets as FilterPresetsCollection).GetSettings();\r\n            var sortingOrder = filterPresetsSettings.SortingOrder;\r\n            var savedSortedList = FilterPresets\r\n                .Where(x => sortingOrder.Contains(x.Id))\r\n                .OrderBy(x => sortingOrder.IndexOf(x.Id))\r\n                .ToList();\r\n            var unsavedSortedList = FilterPresets\r\n                .Where(x => !sortingOrder.Contains(x.Id))\r\n                .OrderBy(x => x.Name);\r\n\r\n            savedSortedList.AddRange(unsavedSortedList);\r\n            return savedSortedList;\r\n        }\r\n\r\n        public FilterPresetsSettings GetFilterPresetsSettings()\r\n        {\r\n            return (FilterPresets as FilterPresetsCollection).GetSettings();\r\n        }\r\n\r\n        public void SetFilterPresetsSettings(FilterPresetsSettings settings)\r\n        {\r\n            (FilterPresets as FilterPresetsCollection).SetSettings(settings);\r\n        }\r\n\r\n        public CompletionStatusSettings GetCompletionStatusSettings()\r\n        {\r\n            return (CompletionStatuses as CompletionStatusesCollection).GetSettings();\r\n        }\r\n\r\n        public void SetCompletionStatusSettings(CompletionStatusSettings settings)\r\n        {\r\n            (CompletionStatuses as CompletionStatusesCollection).SetSettings(settings);\r\n        }\r\n\r\n        public GameScannersSettings GetGameScannersSettings()\r\n        {\r\n            return (GameScanners as GameScannersCollection).GetSettings();\r\n        }\r\n\r\n        public void SetGameScannersSettings(GameScannersSettings settings)\r\n        {\r\n            (GameScanners as GameScannersCollection).SetSettings(settings);\r\n        }\r\n\r\n        public static void GenerateSampleData(IGameDatabase database)\r\n        {\r\n            database.Platforms.Add(\"Windows\");\r\n            database.AgeRatings.Add(\"18+\");\r\n            database.Categories.Add(\"Category\");\r\n            database.Companies.Add(\"BioWare\");\r\n            database.Companies.Add(\"LucasArts\");\r\n            database.Genres.Add(\"RPG\");\r\n            database.Regions.Add(\"EU\");\r\n            database.Series.Add(\"Star Wars\");\r\n            database.Sources.Add(\"Retails\");\r\n            database.Tags.Add(\"Star Wars\");\r\n            database.Features.Add(\"Single Player\");\r\n\r\n            var designGame = new Game($\"Star Wars: Knights of the Old Republic\")\r\n            {\r\n                ReleaseDate = new ReleaseDate(2009, 9, 5),\r\n                PlatformIds = new List<Guid> { database.Platforms.First().Id },\r\n                PlayCount = 20,\r\n                Playtime = 115200,\r\n                LastActivity = DateTime.Today,\r\n                IsInstalled = true,\r\n                AgeRatingIds =  new List<Guid> { database.AgeRatings.First().Id },\r\n                CategoryIds = new List<Guid> { database.Categories.First().Id },\r\n                DeveloperIds = new List<Guid> { database.Companies.First().Id },\r\n                PublisherIds = new List<Guid> { database.Companies.Last().Id },\r\n                GenreIds = new List<Guid> { database.Genres.First().Id },\r\n                RegionIds =  new List<Guid> { database.Regions.First().Id },\r\n                SeriesIds = new List<Guid> { database.Series.First().Id },\r\n                SourceId = database.Sources.First().Id,\r\n                TagIds = new List<Guid> { database.Tags.First().Id },\r\n                FeatureIds = new List<Guid> { database.Features.First().Id },\r\n                Description = \"Star Wars: Knights of the Old Republic (often abbreviated as KotOR) is the first installment in the Knights of the Old Republic series. KotOR is the first computer role-playing game set in the Star Wars universe.\",\r\n                Version = \"1.2\",\r\n                CommunityScore = 95,\r\n                CriticScore = 50,\r\n                UserScore = 15,\r\n                Links = new ObservableCollection<Link> { new Link(\"Wiki\", \"\"), new Link(\"HomePage\", \"\") }\r\n            };\r\n\r\n            database.Games.Add(designGame);\r\n        }\r\n\r\n        private object GetFileLock(string filePath)\r\n        {\r\n            if (fileLocks.TryGetValue(filePath, out object fileLock))\r\n            {\r\n                return fileLock;\r\n            }\r\n            else\r\n            {\r\n                var lc = new object();\r\n                fileLocks.TryAdd(filePath, lc);\r\n                return lc;\r\n            }\r\n        }\r\n\r\n        private void ReleaseFileLock(string filePath)\r\n        {\r\n            fileLocks.TryRemove(filePath, out var removed);\r\n        }\r\n\r\n        public HashSet<string> GetImportedRomFiles(string emulatorDir)\r\n        {\r\n            var importedRoms = new HashSet<string>();\r\n            foreach (var game in Games.Where(a => a.Roms.HasItems()))\r\n            {\r\n                try\r\n                {\r\n                    foreach (var rom in game.Roms)\r\n                    {\r\n                        if (rom.Path.IsNullOrWhiteSpace())\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        var path = game.ExpandVariables(rom.Path, true, emulatorDir).ToLowerInvariant();\r\n                        string absPath = null;\r\n                        try\r\n                        {\r\n                            absPath = Path.GetFullPath(path);\r\n                        }\r\n                        catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            logger.Error(e, $\"Failed to get absolute ROM path:\\n{rom.Path}\\n{path}\");\r\n                        }\r\n\r\n                        if (!absPath.IsNullOrEmpty())\r\n                        {\r\n                            importedRoms.Add(absPath);\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, \"Failed to get roms from a game.\");\r\n                    logger.Debug(Serialization.ToJson(game.Roms));\r\n                }\r\n            }\r\n\r\n            return importedRoms;\r\n        }\r\n\r\n        public HashSet<string> GetImportedExeFiles()\r\n        {\r\n            var imported = new HashSet<string>();\r\n            foreach (var game in Games.Where(a => a.IsInstalled && a.GameActions.HasItems()))\r\n            {\r\n                // Since path can be defined in various partial forms between cation field,\r\n                // we are going to support only format that's automtically generated by scan folder process.\r\n                foreach (var action in game.GameActions.Where(a => a.Type == GameActionType.File && !a.Path.IsNullOrWhiteSpace()))\r\n                {\r\n                    imported.Add(game.ExpandVariables(action.Path, true) + action.Arguments ?? string.Empty);\r\n                }\r\n            }\r\n\r\n            return imported;\r\n        }\r\n\r\n        public void SetAsSingletonInstance()\r\n        {\r\n            if (Instance != null)\r\n            {\r\n                throw new Exception(\"Database singleton intance already exists.\");\r\n            }\r\n\r\n            Instance = this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/GameDatabaseMigration.cs",
    "content": "﻿using LiteDB;\r\nusing Newtonsoft.Json.Linq;\r\nusing Playnite.Common;\r\nusing Playnite.Database.OldModels;\r\nusing Playnite.Emulators;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\nusing SdkModels = Playnite.SDK.Models;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public partial class GameDatabase\r\n    {\r\n        public static void MigrateNewDatabaseFormat(string databasePath)\r\n        {\r\n            var dbSettings = GetSettingsFromDbPath(databasePath);\r\n            var gamesDir = Path.Combine(databasePath, gamesDirName);\r\n\r\n            // 1 to 2\r\n            if (dbSettings.Version == 1 && NewFormatVersion > 1)\r\n            {\r\n                void convetList<T>(Dictionary<string, object> game, string origKey, string newKey, Dictionary<string, T> convertedList) where T : Ver2_DatabaseObject\r\n                {\r\n                    if (game.TryGetValue(origKey, out var storedObj))\r\n                    {\r\n                        if (storedObj == null)\r\n                        {\r\n                            return;\r\n                        }\r\n\r\n                        var gameObjs = new List<Guid>();\r\n                        var oldLIst = (storedObj as JArray).ToObject<List<string>>();\r\n                        foreach (var oldObj in oldLIst)\r\n                        {\r\n                            if (string.IsNullOrEmpty(oldObj))\r\n                            {\r\n                                continue;\r\n                            }\r\n\r\n                            if (convertedList.TryGetValue(oldObj, out var curObj))\r\n                            {\r\n                                if (!gameObjs.Contains(curObj.Id))\r\n                                {\r\n                                    gameObjs.Add(curObj.Id);\r\n                                }\r\n                            }\r\n                            else\r\n                            {\r\n                                var newObj = typeof(T).CrateInstance<T>(oldObj);\r\n                                gameObjs.Add(newObj.Id);\r\n                                convertedList.Add(oldObj, newObj);\r\n                            }\r\n                        }\r\n\r\n                        game.Remove(origKey);\r\n                        game[newKey] = gameObjs;\r\n                    }\r\n                }\r\n\r\n                void covertObject<T>(Dictionary<string, object> game, string origKey, string newKey, Dictionary<string, T> convertedList) where T : Ver2_DatabaseObject\r\n                {\r\n                    if (game.TryGetValue(origKey, out var storedObj))\r\n                    {\r\n                        var oldObj = storedObj as string;\r\n                        if (!string.IsNullOrEmpty(oldObj))\r\n                        {\r\n                            if (convertedList.TryGetValue(oldObj, out var curObj))\r\n                            {\r\n                                game[newKey] = curObj.Id;\r\n                            }\r\n                            else\r\n                            {\r\n                                var newObj = typeof(T).CrateInstance<T>(oldObj);\r\n                                game[newKey] = newObj.Id;\r\n                                convertedList.Add(oldObj, newObj);\r\n                            }\r\n                        }\r\n\r\n                        game.Remove(origKey);\r\n                    }\r\n                }\r\n\r\n                void saveCollection<T>(Dictionary<string, T> collection, string collPath) where T : Ver2_DatabaseObject\r\n                {\r\n                    if (collection.Any())\r\n                    {\r\n                        foreach (var item in collection.Values)\r\n                        {\r\n                            FileSystem.WriteStringToFileSafe(Path.Combine(collPath, item.Id + \".json\"), Serialization.ToJson(item));\r\n                        }\r\n                    }\r\n                }\r\n\r\n                var allGenres = new Dictionary<string, Ver2_Genre>(StringComparer.CurrentCultureIgnoreCase);\r\n                var allCompanies = new Dictionary<string, Ver2_Company>(StringComparer.CurrentCultureIgnoreCase);\r\n                var allTags = new Dictionary<string, Ver2_Tag>(StringComparer.CurrentCultureIgnoreCase);\r\n                var allCategories = new Dictionary<string, Ver2_Category>(StringComparer.CurrentCultureIgnoreCase);\r\n                var allSeries = new Dictionary<string, Ver2_Series>(StringComparer.CurrentCultureIgnoreCase);\r\n                var allRatings = new Dictionary<string, Ver2_AgeRating>(StringComparer.CurrentCultureIgnoreCase);\r\n                var allRegions = new Dictionary<string, Ver2_Region>(StringComparer.CurrentCultureIgnoreCase);\r\n                var allSources = new Dictionary<string, Ver2_GameSource>(StringComparer.CurrentCultureIgnoreCase);\r\n\r\n                // Convert following object to Id representations and store them in separete lists:\r\n                foreach (var file in Directory.EnumerateFiles(gamesDir, \"*.json\"))\r\n                {\r\n                    var game = Serialization.FromJson<Dictionary<string, object>>(FileSystem.ReadFileAsStringSafe(file));\r\n                    if (game == null)\r\n                    {\r\n                        // Some users have 0 sized game files for uknown reason.\r\n                        File.Delete(file);\r\n                        continue;\r\n                    }\r\n\r\n                    // Genres\r\n                    convetList(game, nameof(OldModels.NewVer1.OldGame.Genres), nameof(Ver2_Game.GenreIds), allGenres);\r\n\r\n                    // Developers\r\n                    convetList(game, nameof(OldModels.NewVer1.OldGame.Developers), nameof(Ver2_Game.DeveloperIds), allCompanies);\r\n\r\n                    // Publishers\r\n                    convetList(game, nameof(OldModels.NewVer1.OldGame.Publishers), nameof(Ver2_Game.PublisherIds), allCompanies);\r\n\r\n                    // Tags\r\n                    convetList(game, nameof(OldModels.NewVer1.OldGame.Tags), nameof(Ver2_Game.TagIds), allTags);\r\n\r\n                    // Categories\r\n                    convetList(game, nameof(OldModels.NewVer1.OldGame.Categories), nameof(Ver2_Game.CategoryIds), allCategories);\r\n\r\n                    // Series\r\n                    covertObject(game, nameof(OldModels.NewVer1.OldGame.Series), nameof(Ver2_Game.SeriesId), allSeries);\r\n\r\n                    // AgeRating\r\n                    covertObject(game, nameof(OldModels.NewVer1.OldGame.AgeRating), nameof(Ver2_Game.AgeRatingId), allRatings);\r\n\r\n                    // Region\r\n                    covertObject(game, nameof(OldModels.NewVer1.OldGame.Region), nameof(Ver2_Game.RegionId), allRegions);\r\n\r\n                    // Source\r\n                    covertObject(game, nameof(OldModels.NewVer1.OldGame.Source), nameof(Ver2_Game.SourceId), allSources);\r\n\r\n                    FileSystem.WriteStringToFileSafe(file, Serialization.ToJson(game));\r\n                }\r\n\r\n                saveCollection(allGenres, Path.Combine(databasePath, genresDirName));\r\n                saveCollection(allCompanies, Path.Combine(databasePath, companiesDirName));\r\n                saveCollection(allTags, Path.Combine(databasePath, tagsDirName));\r\n                saveCollection(allCategories, Path.Combine(databasePath, categoriesDirName));\r\n                saveCollection(allSeries, Path.Combine(databasePath, seriesDirName));\r\n                saveCollection(allRatings, Path.Combine(databasePath, ageRatingsDirName));\r\n                saveCollection(allRegions, Path.Combine(databasePath, regionsDirName));\r\n                saveCollection(allSources, Path.Combine(databasePath, sourcesDirName));\r\n\r\n                dbSettings.Version = 2;\r\n                SaveSettingsToDbPath(dbSettings, databasePath);\r\n            }\r\n\r\n            // 2 to 3\r\n            if (dbSettings.Version == 2 && NewFormatVersion > 2)\r\n            {\r\n                var mapper = new BsonMapper()\r\n                {\r\n                    SerializeNullValues = false,\r\n                    TrimWhitespace = false,\r\n                    EmptyStringToNull = true,\r\n                    IncludeFields = false,\r\n                    IncludeNonPublic = false\r\n                };\r\n\r\n                void convertList<TOld, TNew>(string dir, Action<TOld, TNew> propertyMapper = null) where TOld : Ver2_DatabaseObject where TNew : DatabaseObject\r\n                {\r\n                    var dbFile = dir + \".db\";\r\n                    if (File.Exists(dbFile))\r\n                    {\r\n                        logger.Warn($\"Migration database file {dbFile} already exists!\");\r\n                        File.Delete(dbFile);\r\n                    }\r\n\r\n                    using (var db = new LiteDatabase($\"Filename={dbFile};Mode=Exclusive;Journal=false\", mapper))\r\n                    {\r\n                        var col = db.GetCollection<TNew>();\r\n                        col.EnsureIndex(a => a.Id, true);\r\n                        foreach (var file in Directory.GetFiles(dir, \"*.json\"))\r\n                        {\r\n                            if (Guid.TryParse(Path.GetFileNameWithoutExtension(file), out _))\r\n                            {\r\n                                TOld oldItem = null;\r\n                                try\r\n                                {\r\n                                    oldItem = Serialization.FromJsonFile<TOld>(file);\r\n                                }\r\n                                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                                {\r\n                                    logger.Error(e, $\"Failed to load old database file {file}.\");\r\n                                    continue;\r\n                                }\r\n\r\n                                if (oldItem == null)\r\n                                {\r\n                                    logger.Warn($\"Failed to load old database file {file}, it's empty.\");\r\n                                    continue;\r\n                                }\r\n\r\n                                // No idea how these get created, most likely by some 3rd party extension.\r\n                                // They cause several issues so don't migrate them.\r\n                                if (oldItem.Name.IsNullOrWhiteSpace())\r\n                                {\r\n                                    logger.Warn($\"Failed to load old database file {file}, has empty name.\");\r\n                                    continue;\r\n                                }\r\n\r\n                                var newItem = typeof(TNew).CrateInstance<TNew>(oldItem.Name);\r\n                                newItem.Id = oldItem.Id;\r\n                                propertyMapper?.Invoke(oldItem, newItem);\r\n                                col.Insert(newItem);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                LiteDatabase createDb<T>(string dir) where T : DatabaseObject\r\n                {\r\n                    var dbFile = dir + \".db\";\r\n                    if (File.Exists(dbFile))\r\n                    {\r\n                        logger.Warn($\"Migration database file {dbFile} already exists!\");\r\n                        File.Delete(dbFile);\r\n                    }\r\n\r\n                    var db = new LiteDatabase($\"Filename={dbFile};Mode=Exclusive;Journal=false\", mapper);\r\n                    var col = db.GetCollection<T>();\r\n                    col.EnsureIndex(a => a.Id, true);\r\n                    return db;\r\n                }\r\n\r\n                // Convert completion statuses\r\n                CompletionStatusesCollection.MapLiteDbEntities(mapper);\r\n                var convertedCompStatuses = new List<CompletionStatus>();\r\n                using (var db = createDb<CompletionStatus>(Path.Combine(databasePath, completionStatusesDirName)))\r\n                {\r\n                    var col = db.GetCollection<CompletionStatus>();\r\n                    foreach (Ver2_CompletionStatus value in Enum.GetValues(typeof(Ver2_CompletionStatus)))\r\n                    {\r\n                        var newStatus = new CompletionStatus(value.GetDescription());\r\n                        convertedCompStatuses.Add(newStatus);\r\n                        col.Insert(newStatus);\r\n                    }\r\n\r\n                    var setCol = db.GetCollection<CompletionStatusSettings>();\r\n                    setCol.Insert(new CompletionStatusSettings\r\n                    {\r\n                        DefaultStatus = convertedCompStatuses[0].Id,\r\n                        PlayedStatus = convertedCompStatuses[1].Id\r\n                    });\r\n                }\r\n\r\n                // Generate default filter presets\r\n                FilterPresetsCollection.MapLiteDbEntities(mapper);\r\n                using (var db = createDb<FilterPreset>(Path.Combine(databasePath, filterPresetsDirName)))\r\n                {\r\n                    var col = db.GetCollection<FilterPreset>();\r\n                    col.InsertBulk(new List<FilterPreset>\r\n                    {\r\n                        new FilterPreset\r\n                        {\r\n                            Name = \"All\",\r\n                            ShowInFullscreeQuickSelection = true,\r\n                            GroupingOrder = GroupableField.None,\r\n                            SortingOrder = SortOrder.Name,\r\n                            SortingOrderDirection = SortOrderDirection.Ascending,\r\n                            Settings = new FilterPresetSettings()\r\n                        },\r\n                        new FilterPreset\r\n                        {\r\n                            Name = \"Recently Played\",\r\n                            ShowInFullscreeQuickSelection = true,\r\n                            GroupingOrder = GroupableField.None,\r\n                            SortingOrder = SortOrder.LastActivity,\r\n                            SortingOrderDirection = SortOrderDirection.Descending,\r\n                            Settings = new FilterPresetSettings { IsInstalled = true }\r\n                        },\r\n                        new FilterPreset\r\n                        {\r\n                            Name = \"Favorites\",\r\n                            ShowInFullscreeQuickSelection = true,\r\n                            GroupingOrder = GroupableField.None,\r\n                            SortingOrder = SortOrder.Name,\r\n                            SortingOrderDirection = SortOrderDirection.Ascending,\r\n                            Settings = new FilterPresetSettings { Favorite = true }\r\n                        },\r\n                        new FilterPreset\r\n                        {\r\n                            Name = \"Most Played\",\r\n                            ShowInFullscreeQuickSelection = true,\r\n                            GroupingOrder = GroupableField.None,\r\n                            SortingOrder = SortOrder.Playtime,\r\n                            SortingOrderDirection = SortOrderDirection.Descending,\r\n                            Settings = new FilterPresetSettings()\r\n                        }\r\n                    });\r\n                }\r\n\r\n                // Convert import exclusion list\r\n                ImportExclusionsCollection.MapLiteDbEntities(mapper);\r\n                using (var db = createDb<CompletionStatus>(Path.Combine(databasePath, importExclusionsDirName)))\r\n                {\r\n                    var listPath = Path.Combine(PlaynitePaths.ConfigRootPath, \"exclusionList.json\");\r\n                    if (File.Exists(listPath))\r\n                    {\r\n                        Ver2_ImportExclusionList exclusionList = null;\r\n                        try\r\n                        {\r\n                            exclusionList = Serialization.FromJsonFile<Ver2_ImportExclusionList>(listPath);\r\n                        }\r\n                        catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            logger.Error(e, \"Failed to load old exclusion list.\");\r\n                        }\r\n\r\n                        if (exclusionList != null)\r\n                        {\r\n                            var col = db.GetCollection<ImportExclusionItem>();\r\n                            col.Insert(exclusionList.Items.Select(a => new ImportExclusionItem(a.GameId, a.GameName, a.LibraryId, a.LibraryName)));\r\n                            File.Delete(listPath);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                var dirToConvert = new string[] {\r\n                    \"games\", \"platforms\", \"emulators\", \"genres\", \"companies\", \"tags\", \"features\",\r\n                    \"categories\", \"series\", \"ageratings\", \"regions\", \"sources\", \"tools\" };\r\n                foreach (var dir in Directory.GetDirectories(databasePath))\r\n                {\r\n                    switch (Path.GetFileName(dir))\r\n                    {\r\n                        case \"games\":\r\n                            GameAction convertAction(Ver2_GameAction oldAction)\r\n                            {\r\n                                var newAction = new GameAction\r\n                                {\r\n                                    Name = oldAction.Name,\r\n                                    Type = (GameActionType)oldAction.Type,\r\n                                    AdditionalArguments = oldAction.AdditionalArguments,\r\n                                    Arguments = oldAction.Arguments,\r\n                                    EmulatorId = oldAction.EmulatorId,\r\n                                    OverrideDefaultArgs = oldAction.OverrideDefaultArgs,\r\n                                    Path = oldAction.Path,\r\n                                    WorkingDir = oldAction.WorkingDir\r\n                                };\r\n\r\n                                if (oldAction.EmulatorProfileId != Guid.Empty)\r\n                                {\r\n                                    newAction.EmulatorProfileId = CustomEmulatorProfile.ProfilePrefix + oldAction.EmulatorProfileId;\r\n                                }\r\n\r\n                                return newAction;\r\n                            }\r\n\r\n                            string convertScript(string source, Ver2_ScriptLanguage runtime)\r\n                            {\r\n                                if (source.IsNullOrWhiteSpace())\r\n                                {\r\n                                    return null;\r\n                                }\r\n\r\n                                if (runtime == Ver2_ScriptLanguage.PowerShell)\r\n                                {\r\n                                    return source;\r\n                                }\r\n                                else if (runtime == Ver2_ScriptLanguage.Batch)\r\n                                {\r\n                                    source = \"$scriptPath = (Join-Path $env:TEMP 'playniteScript.bat')\\n@\\\"\\n\" + source + \"\\n\\\"@ | Out-File $scriptPath -Encoding ascii\\n\";\r\n                                    source = source + \"Start-Process \\\"cmd.exe\\\" \\\"/c $scriptPath\\\" -Wait\";\r\n                                    source = \"# Batch support has been removed in Playnite 9\\n# This conversion was automatically generated\\n\" + source;\r\n                                    return source;\r\n                                }\r\n                                else\r\n                                {\r\n                                    source = \"throw \\\"IronPython support has been removed in Playnite 9\\\"\\n\" + source;\r\n                                    source = source.Replace(\"\\n\", \"\\n#\");\r\n                                    return source;\r\n                                }\r\n                            }\r\n\r\n                            GamesCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_Game, Game>(dir, (oldGame, newGame) =>\r\n                            {\r\n                                newGame.BackgroundImage = oldGame.BackgroundImage;\r\n                                newGame.Description = oldGame.Description;\r\n                                newGame.Notes = oldGame.Notes;\r\n                                newGame.GenreIds = oldGame.GenreIds;\r\n                                newGame.Hidden = oldGame.Hidden;\r\n                                newGame.Favorite = oldGame.Favorite;\r\n                                newGame.Icon = oldGame.Icon;\r\n                                newGame.CoverImage = oldGame.CoverImage;\r\n                                newGame.InstallDirectory = oldGame.InstallDirectory;\r\n                                newGame.LastActivity = oldGame.LastActivity;\r\n                                newGame.SortingName = oldGame.SortingName;\r\n                                newGame.GameId = oldGame.GameId;\r\n                                newGame.PluginId = oldGame.PluginId;\r\n                                newGame.PublisherIds = oldGame.PublisherIds;\r\n                                newGame.DeveloperIds = oldGame.DeveloperIds;\r\n                                newGame.CategoryIds = oldGame.CategoryIds;\r\n                                newGame.TagIds = oldGame.TagIds;\r\n                                newGame.FeatureIds = oldGame.FeatureIds;\r\n                                newGame.IsInstalled = oldGame.IsInstalled;\r\n                                newGame.Playtime = (ulong)oldGame.Playtime;\r\n                                newGame.Added = oldGame.Added;\r\n                                newGame.Modified = oldGame.Modified;\r\n                                newGame.PlayCount = (ulong)oldGame.PlayCount;\r\n                                newGame.Version = oldGame.Version;\r\n                                newGame.SourceId = oldGame.SourceId;\r\n                                newGame.UserScore = oldGame.UserScore;\r\n                                newGame.CommunityScore = oldGame.CommunityScore;\r\n                                newGame.CriticScore = oldGame.CriticScore;\r\n                                newGame.UseGlobalGameStartedScript = oldGame.UseGlobalGameStartedScript;\r\n                                newGame.UseGlobalPostScript = oldGame.UseGlobalPostScript;\r\n                                newGame.UseGlobalPreScript = oldGame.UseGlobalPreScript;\r\n                                newGame.Manual = oldGame.Manual;\r\n\r\n                                newGame.CompletionStatusId = convertedCompStatuses[(int)oldGame.CompletionStatus].Id;\r\n                                newGame.PreScript = convertScript(oldGame.PreScript, oldGame.ActionsScriptLanguage);\r\n                                newGame.PostScript = convertScript(oldGame.PostScript, oldGame.ActionsScriptLanguage);\r\n                                newGame.GameStartedScript = convertScript(oldGame.GameStartedScript, oldGame.ActionsScriptLanguage);\r\n\r\n                                var allActions = new List<GameAction>();\r\n                                if (oldGame.PlayAction != null)\r\n                                {\r\n                                    newGame.IncludeLibraryPluginAction = oldGame.PlayAction.IsHandledByPlugin;\r\n                                    if (!oldGame.PlayAction.IsHandledByPlugin)\r\n                                    {\r\n                                        var playAction = convertAction(oldGame.PlayAction);\r\n                                        playAction.Name = \"Play\";\r\n                                        playAction.IsPlayAction = true;\r\n                                        allActions.Add(playAction);\r\n                                    }\r\n                                }\r\n\r\n                                oldGame.OtherActions?.Where(a => a != null).ForEach(a => allActions.Add(convertAction(a)));\r\n                                if (allActions.HasItems())\r\n                                {\r\n                                    newGame.GameActions = allActions.ToObservable();\r\n                                }\r\n\r\n                                if (!oldGame.GameImagePath.IsNullOrEmpty())\r\n                                {\r\n                                    string romName = null;\r\n                                    try\r\n                                    {\r\n                                        romName = Path.GetFileNameWithoutExtension(oldGame.GameImagePath);\r\n                                    }\r\n                                    catch (Exception e)\r\n                                    {\r\n                                        // This sometimes crashes on weird ROM paths\r\n                                        logger.Error(e, $\"Failed to get rom name from {oldGame.GameImagePath}\");\r\n                                    }\r\n\r\n                                    newGame.Roms = new ObservableCollection<GameRom> { new GameRom(romName ?? oldGame.Name, oldGame.GameImagePath) };\r\n                                }\r\n\r\n                                if (oldGame.ReleaseDate != null)\r\n                                {\r\n                                    newGame.ReleaseDate = new ReleaseDate(oldGame.ReleaseDate.Value);\r\n                                }\r\n\r\n                                if (oldGame.PlatformId != Guid.Empty)\r\n                                {\r\n                                    newGame.PlatformIds = new List<Guid> { oldGame.PlatformId };\r\n                                }\r\n\r\n                                if (oldGame.SeriesId != Guid.Empty)\r\n                                {\r\n                                    newGame.SeriesIds = new List<Guid> { oldGame.SeriesId };\r\n                                }\r\n\r\n                                if (oldGame.AgeRatingId != Guid.Empty)\r\n                                {\r\n                                    newGame.AgeRatingIds = new List<Guid> { oldGame.AgeRatingId };\r\n                                }\r\n\r\n                                if (oldGame.RegionId != Guid.Empty)\r\n                                {\r\n                                    newGame.RegionIds = new List<Guid> { oldGame.RegionId };\r\n                                }\r\n\r\n                                if (oldGame.Links.HasItems())\r\n                                {\r\n                                    newGame.Links = oldGame.Links.Where(a => a != null).Select(a => new Link(a.Name, a.Url)).ToObservable();\r\n                                }\r\n                            });\r\n                            break;\r\n\r\n                        case \"platforms\":\r\n                            PlatformsCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_Platform, Platform>(dir, (oldPlat, newPlat) =>\r\n                            {\r\n                                newPlat.Icon = oldPlat.Icon;\r\n                                newPlat.Cover = oldPlat.Cover;\r\n                                newPlat.Background = oldPlat.Background;\r\n                                if (newPlat.Name == \"PC\")\r\n                                {\r\n                                    newPlat.Name = \"PC (Windows)\";\r\n                                }\r\n                                else if (newPlat.Name == \"DOS\")\r\n                                {\r\n                                    newPlat.Name = \"PC (DOS)\";\r\n                                }\r\n\r\n                                var platSpec = Emulation.Platforms.FirstOrDefault(a => a.Name.Equals(newPlat.Name, StringComparison.OrdinalIgnoreCase));\r\n                                if (platSpec != null)\r\n                                {\r\n                                    newPlat.SpecificationId = platSpec.Id;\r\n                                }\r\n                            });\r\n                            break;\r\n\r\n                        case \"emulators\":\r\n                            EmulatorsCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_Emulator, Emulator>(dir, (oldEmu, newEmu) =>\r\n                            {\r\n                                if (!oldEmu.Profiles.HasItems())\r\n                                {\r\n                                    return;\r\n                                }\r\n\r\n                                newEmu.CustomProfiles = new ObservableCollection<CustomEmulatorProfile>();\r\n                                foreach (var oldProfile in oldEmu.Profiles)\r\n                                {\r\n                                    newEmu.CustomProfiles.Add(new CustomEmulatorProfile\r\n                                    {\r\n                                        Id = CustomEmulatorProfile.ProfilePrefix + oldProfile.Id,\r\n                                        Name = oldProfile.Name,\r\n                                        Platforms = oldProfile.Platforms,\r\n                                        ImageExtensions = oldProfile.ImageExtensions,\r\n                                        Executable = oldProfile.Executable,\r\n                                        Arguments = oldProfile.Arguments,\r\n                                        WorkingDirectory = oldProfile.WorkingDirectory\r\n                                    });\r\n                                }\r\n\r\n                                if (!newEmu.CustomProfiles[0].WorkingDirectory.IsNullOrEmpty())\r\n                                {\r\n                                    newEmu.InstallDir = newEmu.CustomProfiles[0].WorkingDirectory;\r\n                                }\r\n                            });\r\n                            break;\r\n\r\n                        case \"genres\":\r\n                            GenresCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_Genre, Genre>(dir);\r\n                            break;\r\n\r\n                        case \"companies\":\r\n                            CompaniesCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_Company, Company>(dir);\r\n                            break;\r\n\r\n                        case \"tags\":\r\n                            TagsCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_Tag, Tag>(dir);\r\n                            break;\r\n\r\n                        case \"features\":\r\n                            FeaturesCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_GameFeature, GameFeature>(dir);\r\n                            break;\r\n\r\n                        case \"categories\":\r\n                            CategoriesCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_Category, Category>(dir);\r\n                            break;\r\n\r\n                        case \"series\":\r\n                            SeriesCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_Series, Series>(dir);\r\n                            break;\r\n\r\n                        case \"ageratings\":\r\n                            AgeRatingsCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_AgeRating, AgeRating>(dir);\r\n                            break;\r\n\r\n                        case \"regions\":\r\n                            RegionsCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_Region, Region>(dir, (oldRegion, newRegion) =>\r\n                            {\r\n                                var regSpec = Emulation.Regions.FirstOrDefault(a => a.Name.Equals(newRegion.Name, StringComparison.OrdinalIgnoreCase));\r\n                                if (regSpec != null)\r\n                                {\r\n                                    newRegion.SpecificationId = regSpec.Id;\r\n                                }\r\n                            });\r\n                            break;\r\n\r\n                        case \"sources\":\r\n                            GamesSourcesCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_GameSource, GameSource>(dir);\r\n                            break;\r\n\r\n                        case \"tools\":\r\n                            AppSoftwareCollection.MapLiteDbEntities(mapper);\r\n                            convertList<Ver2_AppSoftware, AppSoftware>(dir, (oldApp, newApp) =>\r\n                            {\r\n                                newApp.Arguments = oldApp.Arguments;\r\n                                newApp.Icon = oldApp.Icon;\r\n                                newApp.Path = oldApp.Path;\r\n                                newApp.WorkingDir = oldApp.WorkingDir;\r\n                            });\r\n                            break;\r\n                    }\r\n                }\r\n\r\n                foreach (var dir in Directory.GetDirectories(databasePath))\r\n                {\r\n                    if (!dirToConvert.Contains(Path.GetFileName(dir)))\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    try\r\n                    {\r\n                        Directory.Delete(dir, true);\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, \"Failed to delete old database files.\");\r\n                    }\r\n                }\r\n\r\n                dbSettings.Version = 3;\r\n                SaveSettingsToDbPath(dbSettings, databasePath);\r\n            }\r\n\r\n            // 3 to 4\r\n            // No data format change, only to cleanup mess caused by bug #2618\r\n            if (dbSettings.Version == 3 && NewFormatVersion > 3)\r\n            {\r\n                var filesDir = Path.Combine(databasePath, filesDirName);\r\n                if (Directory.Exists(filesDir))\r\n                {\r\n                    foreach (var dir in Directory.GetDirectories(filesDir))\r\n                    {\r\n                        try\r\n                        {\r\n                            Directory.GetFiles(dir, \"*.exe\").ForEach(a =>\r\n                            {\r\n                                // Only delete files named as guid as those are 99% made by 2618 bug\r\n                                // People sometimes put foreign files into libary folder :|, so we don't want to delete something else.\r\n                                if (Guid.TryParse(Path.GetFileNameWithoutExtension(a), out var _))\r\n                                {\r\n                                    File.Delete(a);\r\n                                }\r\n                            });\r\n                        }\r\n                        catch (Exception e)\r\n                        {\r\n                            logger.Error(e, \"Failed to delete file.\");\r\n                        }\r\n                    }\r\n                }\r\n\r\n                dbSettings.Version = 4;\r\n                SaveSettingsToDbPath(dbSettings, databasePath);\r\n            }\r\n        }\r\n\r\n        public static bool GetMigrationRequired(string databasePath)\r\n        {\r\n            if (string.IsNullOrEmpty(databasePath))\r\n            {\r\n                throw new ArgumentNullException(nameof(databasePath));\r\n            }\r\n\r\n            var fullPath = GetFullDbPath(databasePath);\r\n            var settingsPath = Path.Combine(fullPath, \"database.json\");\r\n            if (!File.Exists(settingsPath))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            var st = Serialization.FromJson<DatabaseSettings>(FileSystem.ReadFileAsStringSafe(settingsPath));\r\n            if (st == null)\r\n            {\r\n                // This shouldn't in theory happen, but there are some wierd crash reports available for this.\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                return st.Version < NewFormatVersion;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/GameDatabase_Filters.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public partial class GameDatabase : IGameDatabaseMain, IDisposable\r\n    {\r\n        public bool GetGameMatchesFilter(Game game, FilterPresetSettings filterSettings)\r\n        {\r\n            return GetGameMatchesFilter(game, FilterSettings.FromSdkFilterSettings(filterSettings), false);\r\n        }\r\n\r\n        public IEnumerable<Game> GetFilteredGames(FilterPresetSettings filterSettings)\r\n        {\r\n            return GetFilteredGames(FilterSettings.FromSdkFilterSettings(filterSettings), false);\r\n        }\r\n\r\n        public bool GetGameMatchesFilter(Game game, FilterPresetSettings filterSettings, bool useFuzzyNameMatch)\r\n        {\r\n            return GetGameMatchesFilter(game, FilterSettings.FromSdkFilterSettings(filterSettings), useFuzzyNameMatch);\r\n        }\r\n\r\n        public IEnumerable<Game> GetFilteredGames(FilterPresetSettings filterSettings, bool useFuzzyNameMatch)\r\n        {\r\n            return GetFilteredGames(FilterSettings.FromSdkFilterSettings(filterSettings), useFuzzyNameMatch);\r\n        }\r\n\r\n        public bool GetGameMatchesFilter(Game game, FilterSettings filterSettings, bool useFuzzyNameMatch)\r\n        {\r\n            return new FilterMatcher(filterSettings, useFuzzyNameMatch).Match(game);\r\n        }\r\n\r\n        public IEnumerable<Game> GetFilteredGames(FilterSettings filterSettings, bool useFuzzyNameMatch)\r\n        {\r\n            var fm = new FilterMatcher(filterSettings, useFuzzyNameMatch);\r\n            foreach (var game in Games)\r\n            {\r\n                if (fm.Match(game))\r\n                {\r\n                    yield return game;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    internal class FilterMatcher\r\n    {\r\n        private readonly FilterSettings filterSettings;\r\n        private readonly bool useFuzzyNameMatch;\r\n\r\n        public FilterMatcher(FilterSettings filterSettings, bool useFuzzyNameMatch)\r\n        {\r\n            this.filterSettings = filterSettings;\r\n            this.useFuzzyNameMatch = useFuzzyNameMatch;\r\n        }\r\n\r\n        public bool Match(Game game)\r\n        {\r\n            if (!MatchInstallStatus(game))\r\n                return false;\r\n\r\n            if (!MatchFavorite(game))\r\n                return false;\r\n\r\n            if (!MatchHidden(game))\r\n                return false;\r\n\r\n            if (!MatchLibrary(game))\r\n                return false;\r\n\r\n            if (!MatchName(game))\r\n                return false;\r\n\r\n            if (!MatchReleaseYear(game))\r\n                return false;\r\n\r\n            if (!MatchPlaytime(game))\r\n                return false;\r\n\r\n            if (!MatchInstallSize(game))\r\n                return false;\r\n\r\n            if (!MatchVersion(game))\r\n                return false;\r\n\r\n            if (!MatchCompletionStatus(game))\r\n                return false;\r\n\r\n            if (!MatchLastActivity(game))\r\n                return false;\r\n\r\n            if (!MatchRecentActivity(game))\r\n                return false;\r\n\r\n            if (!MatchDateAdded(game))\r\n                return false;\r\n\r\n            if (!MatchDateModified(game))\r\n                return false;\r\n\r\n            if (!MatchUserScore(game))\r\n                return false;\r\n\r\n            if (!MatchCommunityScore(game))\r\n                return false;\r\n\r\n            if (!MatchCriticScore(game))\r\n                return false;\r\n\r\n            if (!MatchSeries(game))\r\n                return false;\r\n\r\n            if (!MatchRegions(game))\r\n                return false;\r\n\r\n            if (!MatchSource(game))\r\n                return false;\r\n\r\n            if (!MatchAgeRatings(game))\r\n                return false;\r\n\r\n            if (!MatchGenres(game))\r\n                return false;\r\n\r\n            if (!MatchPlatforms(game))\r\n                return false;\r\n\r\n            if (!MatchPublishers(game))\r\n                return false;\r\n\r\n            if (!MatchDevelopers(game))\r\n                return false;\r\n\r\n            if (!MatchCategories(game))\r\n                return false;\r\n\r\n            if (!MatchTags(game))\r\n                return false;\r\n\r\n            if (!MatchFeatures(game))\r\n                return false;\r\n\r\n            return true;\r\n        }\r\n\r\n        private bool MatchInstallStatus(Game game)\r\n        {\r\n            if (filterSettings.IsInstalled == filterSettings.IsUnInstalled)\r\n                return true;\r\n\r\n            if (filterSettings.IsInstalled && game.IsInstalled)\r\n                return true;\r\n\r\n            if (filterSettings.IsUnInstalled && !game.IsInstalled)\r\n                return true;\r\n\r\n            return false;\r\n        }\r\n\r\n        private bool MatchFavorite(Game game) => !filterSettings.Favorite || (filterSettings.Favorite && game.Favorite);\r\n\r\n        private bool MatchHidden(Game game) => filterSettings.Hidden == game.Hidden;\r\n\r\n        private bool MatchLibrary(Game game)\r\n        {\r\n            if (filterSettings.Library?.IsSet != true)\r\n                return true;\r\n\r\n            return filterSettings.Library.Ids.Contains(game.PluginId);\r\n        }\r\n\r\n        private bool MatchName(Game game)\r\n        {\r\n            if (filterSettings.Name.IsNullOrEmpty())\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if (game.Name.IsNullOrEmpty())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (filterSettings.Name.Length >= 2 && filterSettings.Name[0] == '^')\r\n            {\r\n                return game.GetNameGroup() == filterSettings.Name[1];\r\n            }\r\n\r\n            if (!useFuzzyNameMatch || filterSettings.Name[0] == '!')\r\n            {\r\n                return game.Name.IndexOf(filterSettings.Name.Substring(1), StringComparison.OrdinalIgnoreCase) >= 0;\r\n            }\r\n\r\n            return SearchViewModel.MatchTextFilter(filterSettings.Name, game.Name, true);\r\n        }\r\n\r\n        private bool MatchReleaseYear(Game game)\r\n        {\r\n            if (filterSettings.ReleaseYear?.IsSet != true)\r\n                return true;\r\n\r\n            if (game.ReleaseDate == null)\r\n            {\r\n                return filterSettings.ReleaseYear.Values.Contains(FilterSettings.MissingFieldString);\r\n            }\r\n\r\n            return filterSettings.ReleaseYear.Values.Contains(game.ReleaseYear.ToString());\r\n        }\r\n\r\n        private bool MatchPlaytime(Game game) => MatchEnumField(filterSettings.PlayTime, (int)game.PlaytimeCategory);\r\n\r\n        private bool MatchInstallSize(Game game) => MatchEnumField(filterSettings.InstallSize, (int)game.InstallSizeGroup);\r\n\r\n        private bool MatchVersion(Game game)\r\n        {\r\n            if (filterSettings.Version.IsNullOrEmpty())\r\n                return true;\r\n\r\n            return game.Version?.Contains(filterSettings.Version, StringComparison.OrdinalIgnoreCase) == true;\r\n        }\r\n\r\n        private bool MatchCompletionStatus(Game game) => IsFilterMatchingSingle(filterSettings.CompletionStatuses, game.CompletionStatusId, game.CompletionStatus);\r\n\r\n        private bool MatchLastActivity(Game game) => MatchEnumField(filterSettings.LastActivity, (int)game.LastActivitySegment);\r\n\r\n        private bool MatchRecentActivity(Game game) => MatchEnumField(filterSettings.RecentActivity, (int)game.RecentActivitySegment);\r\n\r\n        private bool MatchDateAdded(Game game) => MatchEnumField(filterSettings.Added, (int)game.AddedSegment);\r\n\r\n        private bool MatchDateModified(Game game) => MatchEnumField(filterSettings.Modified, (int)game.ModifiedSegment);\r\n\r\n        private bool MatchUserScore(Game game) => IsScoreFilterMatching(filterSettings.UserScore, game.UserScoreGroup);\r\n\r\n        private bool MatchCommunityScore(Game game) => IsScoreFilterMatching(filterSettings.CommunityScore, game.CommunityScoreGroup);\r\n\r\n        private bool MatchCriticScore(Game game) => IsScoreFilterMatching(filterSettings.CriticScore, game.CriticScoreGroup);\r\n\r\n        private bool MatchSeries(Game game) => IsFilterMatchingList(filterSettings.Series, game.SeriesIds, game.Series);\r\n\r\n        private bool MatchRegions(Game game) => IsFilterMatchingList(filterSettings.Region, game.RegionIds, game.Regions);\r\n\r\n        private bool MatchSource(Game game) => IsFilterMatchingSingle(filterSettings.Source, game.SourceId, game.Source);\r\n\r\n        private bool MatchAgeRatings(Game game) => IsFilterMatchingList(filterSettings.AgeRating, game.AgeRatingIds, game.AgeRatings);\r\n\r\n        private bool MatchGenres(Game game) => IsFilterMatchingList(filterSettings.Genre, game.GenreIds, game.Genres);\r\n\r\n        private bool MatchPlatforms(Game game) => IsFilterMatchingList(filterSettings.Platform, game.PlatformIds, game.Platforms);\r\n\r\n        private bool MatchPublishers(Game game) => IsFilterMatchingList(filterSettings.Publisher, game.PublisherIds, game.Publishers);\r\n\r\n        private bool MatchDevelopers(Game game) => IsFilterMatchingList(filterSettings.Developer, game.DeveloperIds, game.Developers);\r\n\r\n        private bool MatchCategories(Game game) => IsFilterMatchingList(filterSettings.Category, game.CategoryIds, game.Categories);\r\n\r\n        private bool MatchTags(Game game) => IsFilterMatchingList(filterSettings.Tag, game.TagIds, game.Tags);\r\n\r\n        private bool MatchFeatures(Game game) => IsFilterMatchingList(filterSettings.Feature, game.FeatureIds, game.Features);\r\n\r\n        private static bool MatchEnumField(EnumFilterItemProperties enumFilter, int enumFieldValue)\r\n        {\r\n            if (enumFilter?.IsSet != true)\r\n                return true;\r\n\r\n            return enumFilter.Values.Contains(enumFieldValue);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Match a filter dropdown selection to a field that has 1 possible value (OR filtering logic)\r\n        /// </summary>\r\n        /// <param name=\"filter\"></param>\r\n        /// <param name=\"idData\"></param>\r\n        /// <param name=\"objectData\"></param>\r\n        /// <returns></returns>\r\n        private static bool IsFilterMatchingSingle(IdItemFilterItemProperties filter, Guid idData, DatabaseObject objectData)\r\n        {\r\n            if (filter == null || !filter.IsSet)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if (!filter.Text.IsNullOrEmpty())\r\n            {\r\n                if (objectData == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                return filter.Texts.ContainsPartOfString(objectData.Name);\r\n            }\r\n\r\n            if (filter.Ids.HasItems())\r\n            {\r\n                return filter.Ids.Contains(idData);\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Match a filter dropdown selection to a field that has multiple possible values\r\n        /// </summary>\r\n        /// <param name=\"filter\"></param>\r\n        /// <param name=\"gamePropertyIds\"></param>\r\n        /// <param name=\"gamePropertyObjects\"></param>\r\n        /// <returns></returns>\r\n        private bool IsFilterMatchingList(IdItemFilterItemProperties filter, List<Guid> gamePropertyIds, IReadOnlyCollection<DatabaseObject> gamePropertyObjects)\r\n        {\r\n            if (filter == null || !filter.IsSet)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if (!filter.Text.IsNullOrEmpty())\r\n            {\r\n                if (gamePropertyObjects == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                bool gameHasItemWithStringMatch(string t)\r\n                {\r\n                    return gamePropertyObjects.Any(o => o.Name.Contains(t, StringComparison.InvariantCultureIgnoreCase));\r\n                }\r\n\r\n                if (filterSettings.UseAndFilteringStyle)\r\n                {\r\n                    return filter.Texts.All(gameHasItemWithStringMatch);\r\n                }\r\n                else\r\n                {\r\n                    return filter.Texts.Any(gameHasItemWithStringMatch);\r\n                }\r\n            }\r\n\r\n            if (filter.Ids.HasItems())\r\n            {\r\n                bool gameHasItemWithIdMatch(Guid filterId)\r\n                {\r\n                    if (filterId == Guid.Empty)\r\n                    {\r\n                        return gamePropertyIds == null || gamePropertyIds.Count == 0;\r\n                    }\r\n\r\n                    return gamePropertyIds?.Contains(filterId) == true;\r\n                }\r\n\r\n                if (filterSettings.UseAndFilteringStyle)\r\n                {\r\n                    return filter.Ids.All(gameHasItemWithIdMatch);\r\n                }\r\n                else\r\n                {\r\n                    return filter.Ids.Any(gameHasItemWithIdMatch);\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        private static bool IsScoreFilterMatching(EnumFilterItemProperties filter, ScoreGroup score)\r\n        {\r\n            if (filter?.IsSet != true)\r\n                return true;\r\n\r\n            return filter.Values?.Contains((int)score) == true;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/Database/GameFieldComparer.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class GameFieldComparer : IEqualityComparer<string>\r\n    {\r\n        private static readonly Regex regex = new Regex(@\"[\\s-]\", RegexOptions.Compiled);\r\n        public static readonly GameFieldComparer Instance = new GameFieldComparer();\r\n\r\n        public bool Equals(string x, string y)\r\n        {\r\n            return StringEquals(x, y);\r\n        }\r\n\r\n        public static bool StringEquals(string x, string y)\r\n        {\r\n            if (x.IsNullOrEmpty() && y.IsNullOrEmpty())\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if (!x.IsNullOrEmpty() && y.IsNullOrEmpty())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (x.IsNullOrEmpty() && !y.IsNullOrEmpty())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return string.Equals(\r\n                regex.Replace(x, \"\"),\r\n                regex.Replace(y, \"\"),\r\n                StringComparison.InvariantCultureIgnoreCase);\r\n        }\r\n\r\n        public static bool FieldEquals<T>(T x, string y) where T : DatabaseObject\r\n        {\r\n            return StringEquals(x.Name, y);\r\n        }\r\n\r\n        public static bool FieldEquals<T>(T x, T y) where T : DatabaseObject\r\n        {\r\n            return StringEquals(x.Name, y.Name);\r\n        }\r\n\r\n        public int GetHashCode(string obj)\r\n        {\r\n            return regex.Replace(obj, \"\").ToLower().GetHashCode();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/InMemoryGameDatabase.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite.Database\r\n{\r\n    public class InMemoryItemCollection<TItem> : ItemCollection<TItem> where TItem : DatabaseObject\r\n    {\r\n        public InMemoryItemCollection() : base(null, false)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class InMemoryGameDatabase : IGameDatabaseMain\r\n    {\r\n        public IItemCollection<Game> Games { get; } = new InMemoryItemCollection<Game>();\r\n        public IItemCollection<Platform> Platforms { get; } = new InMemoryItemCollection<Platform>();\r\n        public IItemCollection<Emulator> Emulators { get; } = new InMemoryItemCollection<Emulator>();\r\n        public IItemCollection<Genre> Genres { get; } = new InMemoryItemCollection<Genre>();\r\n        public IItemCollection<Company> Companies { get; } = new InMemoryItemCollection<Company>();\r\n        public IItemCollection<Tag> Tags { get; } = new InMemoryItemCollection<Tag>();\r\n        public IItemCollection<Category> Categories { get; } = new InMemoryItemCollection<Category>();\r\n        public IItemCollection<Series> Series { get; } = new InMemoryItemCollection<Series>();\r\n        public IItemCollection<AgeRating> AgeRatings { get; } = new InMemoryItemCollection<AgeRating>();\r\n        public IItemCollection<Region> Regions { get; } = new InMemoryItemCollection<Region>();\r\n        public IItemCollection<GameSource> Sources { get; } = new InMemoryItemCollection<GameSource>();\r\n        public IItemCollection<GameFeature> Features { get; } = new InMemoryItemCollection<GameFeature>();\r\n        public IItemCollection<GameScannerConfig> GameScanners { get; } = new InMemoryItemCollection<GameScannerConfig>();\r\n        public IItemCollection<CompletionStatus> CompletionStatuses => new InMemoryItemCollection<CompletionStatus>();\r\n        public IItemCollection<ImportExclusionItem> ImportExclusions => new InMemoryItemCollection<ImportExclusionItem>();\r\n        public IItemCollection<FilterPreset> FilterPresets => new InMemoryItemCollection<FilterPreset>();\r\n        public bool IsOpen => true;\r\n\r\n        public AppSoftwareCollection SoftwareApps => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedPlatforms => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedGenres => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedDevelopers => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedPublishers => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedTags => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedCategories => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedSeries => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedAgeRatings => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedRegions => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedSources => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedFeastures => throw new NotImplementedException();\r\n\r\n        public List<Guid> UsedCompletionStatuses => throw new NotImplementedException();\r\n\r\n#pragma warning disable CS0067\r\n        public event EventHandler DatabaseOpened;\r\n        public event EventHandler<DatabaseFileEventArgs> DatabaseFileChanged;\r\n        public event EventHandler PlatformsInUseUpdated;\r\n        public event EventHandler GenresInUseUpdated;\r\n        public event EventHandler DevelopersInUseUpdated;\r\n        public event EventHandler PublishersInUseUpdated;\r\n        public event EventHandler TagsInUseUpdated;\r\n        public event EventHandler CategoriesInUseUpdated;\r\n        public event EventHandler AgeRatingsInUseUpdated;\r\n        public event EventHandler SeriesInUseUpdated;\r\n        public event EventHandler RegionsInUseUpdated;\r\n        public event EventHandler SourcesInUseUpdated;\r\n        public event EventHandler FeaturesInUseUpdated;\r\n        public event EventHandler CompletionStatusesInUseUpdated;\r\n#pragma warning restore CS0067\r\n\r\n        public InMemoryGameDatabase()\r\n        {\r\n        }\r\n\r\n        public Game ImportGame(GameMetadata game)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public Game ImportGame(GameMetadata game, LibraryPlugin sourcePlugin)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void SetDatabasePath(string path)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void OpenDatabase()\r\n        {\r\n        }\r\n\r\n        public string GetFileStoragePath(Guid parentId)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public string GetFullFilePath(string dbPath)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public string AddFile(MetadataFile file, Guid parentId, bool isImage, CancellationToken cancelToken)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public string AddFile(string path, Guid parentId, bool isImage, CancellationToken cancelToken)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void RemoveFile(string dbPath)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public BitmapSource GetFileAsImage(string dbPath, BitmapLoadProperties loadProperties = null)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void CopyFile(string dbPath, string targetPath)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void BeginBufferUpdate()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void EndBufferUpdate()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public IDisposable BufferedUpdate()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public List<Game> ImportGames(LibraryPlugin library, CancellationToken cancelToken, PlaytimeImportMode playtimeImportMode)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public List<FilterPreset> GetSortedFilterPresets()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public FilterPresetsSettings GetFilterPresetsSettings()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void SetFilterPresetsSettings(FilterPresetsSettings settings)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public CompletionStatusSettings GetCompletionStatusSettings()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void SetCompletionStatusSettings(CompletionStatusSettings settings)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public GameScannersSettings GetGameScannersSettings()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void SetGameScannersSettings(GameScannersSettings settings)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public HashSet<string> GetImportedRomFiles(string emulatorDir)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public bool GetGameMatchesFilter(Game game, FilterPresetSettings filterSettings, bool useFuzzyNameMatch)\r\n        {\r\n            return true;\r\n        }\r\n\r\n        public IEnumerable<Game> GetFilteredGames(FilterPresetSettings filterSettings)\r\n        {\r\n            yield break;\r\n        }\r\n\r\n        public IEnumerable<Game> GetFilteredGames(FilterPresetSettings filterSettings, bool useFuzzyNameMatch)\r\n        {\r\n            yield break;\r\n        }\r\n\r\n        public bool GetGameMatchesFilter(Game game, FilterSettings filterSettings, bool useFuzzyNameMatch)\r\n        {\r\n            return true;\r\n        }\r\n\r\n        public IEnumerable<Game> GetFilteredGames(FilterSettings filterSettings, bool useFuzzyNameMatch)\r\n        {\r\n            yield break;\r\n        }\r\n\r\n        public bool GetGameMatchesFilter(Game game, FilterPresetSettings filterSettings)\r\n        {\r\n            return true;\r\n        }\r\n\r\n        public HashSet<string> GetImportedExeFiles()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/OldModels/NewVer1/OldCompletionStatus.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database.OldModels.NewVer1\r\n{\r\n    /// <summary>\r\n    /// Represents game completion status.\r\n    /// </summary>\r\n    public enum OldCompletionStatus\r\n    {\r\n        /// <summary>\r\n        /// Game has not been played yet.\r\n        /// </summary>\r\n        NotPlayed,\r\n        /// <summary>\r\n        /// Game has been played.\r\n        /// </summary>\r\n        Played,\r\n        /// <summary>\r\n        /// Main storyline has been beaten.\r\n        /// </summary>\r\n        Beaten,\r\n        /// <summary>\r\n        /// Game has been fully completed.\r\n        /// </summary>\r\n        Completed\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/OldModels/NewVer1/OldDatabaseObject.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database.OldModels.NewVer1\r\n{\r\n    /// <summary>\r\n    /// Represents base database object item.\r\n    /// </summary>\r\n    public class OldDatabaseObject : ObservableObject\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets identifier of database object.\r\n        /// </summary>\r\n        public Guid Id { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"OldDatabaseObject\"/>.\r\n        /// </summary>\r\n        public OldDatabaseObject()\r\n        {\r\n            Id = Guid.NewGuid();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/OldModels/NewVer1/OldGame.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Collections.Concurrent;\r\nusing Newtonsoft.Json;\r\n\r\nnamespace Playnite.Database.OldModels.NewVer1\r\n{\r\n    /// <summary>\r\n    /// Represents Playnite game object.\r\n    /// </summary>\r\n    public class OldGame : OldDatabaseObject\r\n    {\r\n        private string backgroundImage;\r\n        /// <summary>\r\n        /// Gets or sets background image. Local file path, HTTP URL or database file ids are supported.\r\n        /// </summary>\r\n        public string BackgroundImage\r\n        {\r\n            get\r\n            {\r\n                return backgroundImage;\r\n            }\r\n\r\n            set\r\n            {\r\n                backgroundImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }       \r\n        \r\n        private string description;\r\n        /// <summary>\r\n        /// Gets or sets HTML game description.\r\n        /// </summary>\r\n        public string Description\r\n        {\r\n            get\r\n            {\r\n                return description;\r\n            }\r\n\r\n            set\r\n            {\r\n                description = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ComparableList<string> developers;\r\n        /// <summary>\r\n        /// Gets or sets list of developers.\r\n        /// </summary>\r\n        public ComparableList<string> Developers\r\n        {\r\n            get\r\n            {\r\n                return developers;\r\n            }\r\n\r\n            set\r\n            {\r\n                developers = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ComparableList<string> genres;\r\n        /// <summary>\r\n        /// Gets or sets list of genres.\r\n        /// </summary>\r\n        public ComparableList<string> Genres\r\n        {\r\n            get\r\n            {\r\n                return genres;\r\n            }\r\n\r\n            set\r\n            {\r\n                genres = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool hidden;\r\n        /// <summary>\r\n        /// Gets or sets value indicating if the game is hidden in library.\r\n        /// </summary>\r\n        public bool Hidden\r\n        {\r\n            get\r\n            {\r\n                return hidden;\r\n            }\r\n\r\n            set\r\n            {\r\n                hidden = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool favorite;\r\n        /// <summary>\r\n        /// Gets or sets avlue indicating if the game is marked as favorite in library.\r\n        /// </summary>\r\n        public bool Favorite\r\n        {\r\n            get\r\n            {\r\n                return favorite;\r\n            }\r\n\r\n            set\r\n            {\r\n                favorite = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        \r\n        private string icon;\r\n        /// <summary>\r\n        /// Gets or sets game icon. Local file path, HTTP URL or database file ids are supported.\r\n        /// </summary>\r\n        public string Icon\r\n        {\r\n            get\r\n            {\r\n                return icon;\r\n            }\r\n\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string coverImage;\r\n        /// <summary>\r\n        /// Gets or sets game cover image. Local file path, HTTP URL or database file ids are supported.\r\n        /// </summary>\r\n        public string CoverImage\r\n        {\r\n            get\r\n            {\r\n                return coverImage;\r\n            }\r\n\r\n            set\r\n            {\r\n                coverImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string installDirectory;\r\n        /// <summary>\r\n        /// Gets or sets game installation directory path.\r\n        /// </summary>\r\n        public string InstallDirectory\r\n        {\r\n            get\r\n            {\r\n                if (string.IsNullOrEmpty(installDirectory))\r\n                {\r\n                    if (PlayAction != null)\r\n                    {\r\n                        return PlayAction.WorkingDir;\r\n                    }\r\n                }\r\n\r\n                return installDirectory;\r\n            }\r\n\r\n            set\r\n            {\r\n                installDirectory = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string gameImagePath;\r\n        /// <summary>\r\n        /// Gets or sets game's ISO, ROM or other type of executable image path.\r\n        /// </summary>\r\n        public string GameImagePath\r\n        {\r\n            get\r\n            {\r\n                return gameImagePath;\r\n            }\r\n\r\n            set\r\n            {\r\n                gameImagePath = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateTime? lastActivity;\r\n        /// <summary>\r\n        /// Gets or sets last played date.\r\n        /// </summary>\r\n        public DateTime? LastActivity\r\n        {\r\n            get\r\n            {\r\n                return lastActivity;\r\n            }\r\n\r\n            set\r\n            {\r\n                lastActivity = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string name;\r\n        /// <summary>\r\n        /// Gets or sets game name.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get\r\n            {\r\n                return name;\r\n            }\r\n\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string sortingName;\r\n        /// <summary>\r\n        /// Gets or sets optional name used for sorting the game by name.\r\n        /// </summary>\r\n        public string SortingName\r\n        {\r\n            get\r\n            {\r\n                return sortingName;\r\n            }\r\n\r\n            set\r\n            {\r\n                sortingName = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string gameId;\r\n        /// <summary>\r\n        /// Gets or sets provider id. For example game's Steam ID.\r\n        /// </summary>\r\n        public string GameId\r\n        {\r\n            get\r\n            {\r\n                return gameId;\r\n            }\r\n\r\n            set\r\n            {\r\n                gameId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid pluginId = Guid.Empty;\r\n        /// <summary>\r\n        /// Gets or sets id of plugin responsible for handling this game.\r\n        /// </summary>\r\n        public Guid PluginId\r\n        {\r\n            get\r\n            {\r\n                return pluginId;\r\n            }\r\n\r\n            set\r\n            {\r\n                pluginId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<OldGameAction> otherActions;\r\n        /// <summary>\r\n        /// Gets or sets list of additional game actions.\r\n        /// </summary>\r\n        public ObservableCollection<OldGameAction> OtherActions\r\n        {\r\n            get\r\n            {\r\n                return otherActions;\r\n            }\r\n\r\n            set\r\n            {\r\n                otherActions = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private OldGameAction playAction;\r\n        /// <summary>\r\n        /// Gets or sets game action used to starting the game.\r\n        /// </summary>\r\n        public OldGameAction PlayAction\r\n        {\r\n            get\r\n            {\r\n                return playAction;\r\n            }\r\n\r\n            set\r\n            {\r\n                playAction = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid platformId;\r\n        /// <summary>\r\n        /// Gets or sets platform id.\r\n        /// </summary>\r\n        public Guid PlatformId\r\n        {\r\n            get\r\n            {\r\n                return platformId;\r\n            }\r\n\r\n            set\r\n            {\r\n                platformId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ComparableList<string> publishers;\r\n        /// <summary>\r\n        /// Gets or sets list of publishers.\r\n        /// </summary>\r\n        public ComparableList<string> Publishers\r\n        {\r\n            get\r\n            {\r\n                return publishers;\r\n            }\r\n\r\n            set\r\n            {\r\n                publishers = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateTime? releaseDate;\r\n        /// <summary>\r\n        /// Gets or set game's release date.\r\n        /// </summary>\r\n        public DateTime? ReleaseDate\r\n        {\r\n            get\r\n            {\r\n                return releaseDate;\r\n            }\r\n\r\n            set\r\n            {\r\n                releaseDate = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ComparableList<string> categories;\r\n        /// <summary>\r\n        /// Gets or sets game categories.\r\n        /// </summary>\r\n        public ComparableList<string> Categories\r\n        {\r\n            get\r\n            {\r\n                return categories;\r\n            }\r\n\r\n            set\r\n            {\r\n                categories = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ComparableList<string> tags;\r\n        /// <summary>\r\n        /// Gets or sets list of tags.\r\n        /// </summary>\r\n        public ComparableList<string> Tags\r\n        {\r\n            get\r\n            {\r\n                return tags;\r\n            }\r\n\r\n            set\r\n            {\r\n                tags = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<OldLink> links;\r\n        /// <summary>\r\n        /// Gets or sets list of game related web links.\r\n        /// </summary>\r\n        public ObservableCollection<OldLink> Links\r\n        {\r\n            get\r\n            {\r\n                return links;\r\n            }\r\n\r\n            set\r\n            {\r\n                links = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isInstalling;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a game is being installed..\r\n        /// </summary>\r\n        public bool IsInstalling\r\n        {\r\n            get => isInstalling;\r\n            set\r\n            {\r\n                isInstalling = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isUninstalling;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a game is being uninstalled.\r\n        /// </summary>\r\n        public bool IsUninstalling\r\n        {\r\n            get => isUninstalling;\r\n            set\r\n            {\r\n                isUninstalling = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isLaunching;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a game is being launched.\r\n        /// </summary>\r\n        public bool IsLaunching\r\n        {\r\n            get => isLaunching;\r\n            set\r\n            {\r\n                isLaunching = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isRunning;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a game is currently running.\r\n        /// </summary>\r\n        public bool IsRunning\r\n        {\r\n            get => isRunning;\r\n            set\r\n            {\r\n                isRunning = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isInstalled;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a game is installed.\r\n        /// </summary>\r\n        public bool IsInstalled\r\n        {\r\n            get => isInstalled;\r\n            set\r\n            {\r\n                isInstalled = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets value indicating wheter the game is custom game.\r\n        /// </summary>\r\n        [JsonIgnore]\r\n        public bool IsCustomGame\r\n        {\r\n            get => PluginId == Guid.Empty;\r\n        }\r\n\r\n        private long playtime = 0;\r\n        /// <summary>\r\n        /// Gets or sets played time in seconds.\r\n        /// </summary>\r\n        public long Playtime\r\n        {\r\n            get\r\n            {\r\n                return playtime;\r\n            }\r\n\r\n            set\r\n            {\r\n                playtime = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateTime? added;\r\n        /// <summary>\r\n        /// Gets or sets date when game was added into library.\r\n        /// </summary>\r\n        public DateTime? Added\r\n        {\r\n            get\r\n            {\r\n                return added;\r\n            }\r\n\r\n            set\r\n            {\r\n                added = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateTime? modified;\r\n        /// <summary>\r\n        /// Gets or sets date of last modification made to a game.\r\n        /// </summary>\r\n        public DateTime? Modified\r\n        {\r\n            get\r\n            {\r\n                return modified;\r\n            }\r\n\r\n            set\r\n            {\r\n                modified = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private long playCount = 0;\r\n        /// <summary>\r\n        /// Gets or sets a number indicating how many times the game has been played.\r\n        /// </summary>\r\n        public long PlayCount\r\n        {\r\n            get\r\n            {\r\n                return playCount;\r\n            }\r\n\r\n            set\r\n            {\r\n                playCount = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string series;\r\n        /// <summary>\r\n        /// Gets or sets game series.\r\n        /// </summary>\r\n        public string Series\r\n        {\r\n            get\r\n            {\r\n                return series;\r\n            }\r\n\r\n            set\r\n            {\r\n                series = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string version;\r\n        /// <summary>\r\n        /// Gets or sets game version.\r\n        /// </summary>\r\n        public string Version\r\n        {\r\n            get\r\n            {\r\n                return version;\r\n            }\r\n\r\n            set\r\n            {\r\n                version = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string ageRating;\r\n        /// <summary>\r\n        /// Gets or sets age rating for a game.\r\n        /// </summary>\r\n        public string AgeRating\r\n        {\r\n            get\r\n            {\r\n                return ageRating;\r\n            }\r\n\r\n            set\r\n            {\r\n                ageRating = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string region;\r\n        /// <summary>\r\n        /// Gets or sets game region.\r\n        /// </summary>\r\n        public string Region\r\n        {\r\n            get\r\n            {\r\n                return region;\r\n            }\r\n\r\n            set\r\n            {\r\n                region = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string source;\r\n        /// <summary>\r\n        /// Gets or sets source of the game.\r\n        /// </summary>\r\n        public string Source\r\n        {\r\n            get\r\n            {\r\n                return source;\r\n            }\r\n\r\n            set\r\n            {\r\n                source = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private OldCompletionStatus completionStatus = OldCompletionStatus.NotPlayed;\r\n        /// <summary>\r\n        /// Gets or sets game completion status.\r\n        /// </summary>\r\n        public OldCompletionStatus CompletionStatus\r\n        {\r\n            get\r\n            {\r\n                return completionStatus;\r\n            }\r\n\r\n            set\r\n            {\r\n                completionStatus = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int? userScore = null;\r\n        /// <summary>\r\n        /// Gets or sets user's rating score.\r\n        /// </summary>\r\n        public int? UserScore\r\n        {\r\n            get\r\n            {\r\n                return userScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                userScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int? criticScore = null;\r\n        /// <summary>\r\n        /// Gets or sets critic based rating score.\r\n        /// </summary>\r\n        public int? CriticScore\r\n        {\r\n            get\r\n            {\r\n                return criticScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                criticScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int? communityScore = null;\r\n        /// <summary>\r\n        /// Gets or sets community rating score.\r\n        /// </summary>\r\n        public int? CommunityScore\r\n        {\r\n            get\r\n            {\r\n                return communityScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                communityScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of a Game object.\r\n        /// </summary>\r\n        public OldGame() : base()\r\n        {\r\n            GameId = Guid.NewGuid().ToString();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of a Game object with specific name.\r\n        /// </summary>\r\n        /// <param name=\"name\">Game name.</param>\r\n        public OldGame(string name) : this()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// \r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/OldModels/NewVer1/OldGameAction.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database.OldModels.NewVer1\r\n{\r\n    /// <summary>\r\n    /// Represents game action type.\r\n    /// </summary>\r\n    public enum OldGameActionType : int\r\n    {\r\n        /// <summary>\r\n        /// Game action executes a file.\r\n        /// </summary>\r\n        File = 0,\r\n        /// <summary>\r\n        /// Game action navigates to a web based URL.\r\n        /// </summary>\r\n        URL = 1,\r\n        /// <summary>\r\n        /// Game action starts an emulator.\r\n        /// </summary>\r\n        Emulator = 2\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents executable game action.\r\n    /// </summary>\r\n    public class OldGameAction : ObservableObject\r\n    {\r\n        private OldGameActionType type;\r\n        /// <summary>\r\n        /// Gets or sets task type.\r\n        /// </summary>\r\n        public OldGameActionType Type\r\n        {\r\n            get => type;\r\n            set\r\n            {\r\n                type = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string arguments;\r\n        /// <summary>\r\n        /// Gets or sets executable arguments for File type tasks.\r\n        /// </summary>\r\n        public string Arguments\r\n        {\r\n            get => arguments;\r\n            set\r\n            {\r\n                arguments = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string additionalArguments;\r\n        /// <summary>\r\n        /// Gets or sets additional executable arguments used for Emulator action type.\r\n        /// </summary>\r\n        public string AdditionalArguments\r\n        {\r\n            get => additionalArguments;\r\n            set\r\n            {\r\n                additionalArguments = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool overrideDefaultArgs;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter emulator arguments should be completely overwritten with action arguments.\r\n        /// Applies only to Emulator action type.\r\n        /// </summary>\r\n        public bool OverrideDefaultArgs\r\n        {\r\n            get => overrideDefaultArgs;\r\n            set\r\n            {\r\n                overrideDefaultArgs = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string path;\r\n        /// <summary>\r\n        /// Gets or sets executable path for File action type or URL for URL action type.\r\n        /// </summary>\r\n        public string Path\r\n        {\r\n            get => path;\r\n            set\r\n            {\r\n                path = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string workingDir;\r\n        /// <summary>\r\n        /// Gets or sets working directory for File action type executable.\r\n        /// </summary>\r\n        public string WorkingDir\r\n        {\r\n            get => workingDir;\r\n            set\r\n            {\r\n                workingDir = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string name;\r\n        /// <summary>\r\n        /// Gets or sets action name.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get => name;\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isHandledByPlugin;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a action's execution should be handled by a plugin.\r\n        /// </summary>        \r\n        public bool IsHandledByPlugin\r\n        {\r\n            get => isHandledByPlugin;\r\n            set\r\n            {\r\n                isHandledByPlugin = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid emulatorId;\r\n        /// <summary>\r\n        /// Gets or sets emulator id for Emulator action type execution.\r\n        /// </summary>     \r\n        public Guid EmulatorId\r\n        {\r\n            get => emulatorId;\r\n            set\r\n            {\r\n                emulatorId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid emulatorProfileId;\r\n        /// <summary>\r\n        /// Gets or sets emulator profile id for Emulator action type execution.\r\n        /// </summary>\r\n        public Guid EmulatorProfileId\r\n        {\r\n            get => emulatorProfileId;\r\n            set\r\n            {\r\n                emulatorProfileId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n        \r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            switch (Type)\r\n            {\r\n                case OldGameActionType.File:\r\n                    return $\"File: {Path}, {Arguments}, {WorkingDir}\";\r\n                case OldGameActionType.URL:\r\n                    return $\"Url: {Path}\";\r\n                case OldGameActionType.Emulator:\r\n                    return $\"Emulator: {EmulatorId}, {EmulatorProfileId}, {OverrideDefaultArgs}, {AdditionalArguments}\";\r\n                default:\r\n                    return Path;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/OldModels/NewVer1/OldLink.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database.OldModels.NewVer1\r\n{\r\n    /// <summary>\r\n    /// Represents web link.\r\n    /// </summary>\r\n    public class OldLink : ObservableObject\r\n    {\r\n        private string name;\r\n        /// <summary>\r\n        /// Gets or sets name of the link.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get => name;\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string url;\r\n        /// <summary>\r\n        /// Gets or sets web based URL.\r\n        /// </summary>\r\n        public string Url\r\n        {\r\n            get => url;\r\n            set\r\n            {\r\n                url = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Link.\r\n        /// </summary>\r\n        public OldLink()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Link with specific values.\r\n        /// </summary>\r\n        /// <param name=\"name\">Link name.</param>\r\n        /// <param name=\"url\">Link URL.</param>\r\n        public OldLink(string name, string url)\r\n        {\r\n            Name = name;\r\n            Url = url;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Database/OldModels/Ver2.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Database.OldModels\r\n{\r\n    public enum Ver2_ScriptLanguage\r\n    {\r\n        /// <summary>\r\n        /// Represents PowerShell scripting language.\r\n        /// </summary>\r\n        PowerShell,\r\n        /// <summary>\r\n        /// Represents IronPython scripting language.\r\n        /// </summary>\r\n        IronPython,\r\n        /// <summary>\r\n        /// Represents Batch scripting language.\r\n        /// </summary>\r\n        [Description(\"Batch (.bat script)\")]\r\n        Batch\r\n    }\r\n\r\n    public class Ver2_ImportExclusionList\r\n    {\r\n        public List<Ver2_ImportExclusionItem> Items { get; set; }\r\n    }\r\n\r\n    public class Ver2_ImportExclusionItem\r\n    {\r\n        public string GameId { get; set; }\r\n        public string GameName { get; set; }\r\n        public Guid LibraryId { get; set; }\r\n        public string LibraryName { get; set; }\r\n    }\r\n\r\n    public interface Ver2_IIdentifiable\r\n    {\r\n        /// <summary>\r\n        /// Gets unique object identifier.\r\n        /// </summary>\r\n        Guid Id { get; }\r\n    }\r\n\r\n    public class Ver2_DatabaseObject : ObservableObject, IComparable, Ver2_IIdentifiable\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets identifier of database object.\r\n        /// </summary>\r\n        public Guid Id { get; set; }\r\n\r\n        private string name;\r\n        /// <summary>\r\n        /// Gets or sets name.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get\r\n            {\r\n                return name;\r\n            }\r\n\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_DatabaseObject\"/>.\r\n        /// </summary>\r\n        public Ver2_DatabaseObject()\r\n        {\r\n            Id = Guid.NewGuid();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Compares Names of database object.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public int CompareTo(object obj)\r\n        {\r\n            var objName = (obj as Ver2_DatabaseObject).Name;\r\n            if (string.IsNullOrEmpty(Name) && string.IsNullOrEmpty(objName))\r\n            {\r\n                return 0;\r\n            }\r\n\r\n            if (string.IsNullOrEmpty(Name))\r\n            {\r\n                return 1;\r\n            }\r\n\r\n            if (string.IsNullOrEmpty(objName))\r\n            {\r\n                return -1;\r\n            }\r\n\r\n            return string.Compare(Name, objName, true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// DO NOT use for actual equality check, this only checks if db Ids are equal!\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public override bool Equals(object obj)\r\n        {\r\n            if (obj is Ver2_DatabaseObject dbObj)\r\n            {\r\n                return dbObj.Id == Id;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override int GetHashCode()\r\n        {\r\n            if (Id == Guid.Empty)\r\n            {\r\n                return 0;\r\n            }\r\n            else\r\n            {\r\n                return Id.GetHashCode();\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name ?? string.Empty;\r\n        }\r\n    }\r\n\r\n    public class Ver2_AgeRating : Ver2_DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_AgeRating\"/>.\r\n        /// </summary>\r\n        public Ver2_AgeRating() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_AgeRating\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\">Rating name.</param>\r\n        public Ver2_AgeRating(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty age rating.\r\n        /// </summary>\r\n        public static readonly Ver2_AgeRating Empty = new Ver2_AgeRating { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n\r\n    public class Ver2_AppSoftware : Ver2_DatabaseObject\r\n    {\r\n        private string icon;\r\n        /// <summary>\r\n        /// Gets or sets application icon.\r\n        /// </summary>\r\n        public string Icon\r\n        {\r\n            get => icon;\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string arguments;\r\n        /// <summary>\r\n        /// Gets or sets application arguments.\r\n        /// </summary>\r\n        public string Arguments\r\n        {\r\n            get => arguments;\r\n            set\r\n            {\r\n                arguments = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string path;\r\n        /// <summary>\r\n        /// Gets or sets application path.\r\n        /// </summary>\r\n        public string Path\r\n        {\r\n            get => path;\r\n            set\r\n            {\r\n                path = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string workingDir;\r\n        /// <summary>\r\n        /// Gets or sets application working directory.\r\n        /// </summary>\r\n        public string WorkingDir\r\n        {\r\n            get => workingDir;\r\n            set\r\n            {\r\n                workingDir = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_AppSoftware\"/>.\r\n        /// </summary>\r\n        public Ver2_AppSoftware() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_AppSoftware\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Ver2_AppSoftware(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n    }\r\n\r\n    public class Ver2_Category : Ver2_DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Category\"/>.\r\n        /// </summary>\r\n        public Ver2_Category() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Category\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\">Category name.</param>\r\n        public Ver2_Category(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty category.\r\n        /// </summary>\r\n        public static readonly Ver2_Category Empty = new Ver2_Category { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n\r\n    public class Ver2_Company : Ver2_DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Company\"/>.\r\n        /// </summary>\r\n        public Ver2_Company() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Company\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Ver2_Company(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public static readonly Ver2_Company Empty = new Ver2_Company { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n\r\n    public class Ver2_Developer : Ver2_Company\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Developer\"/>.\r\n        /// </summary>\r\n        public Ver2_Developer() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Developer\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Ver2_Developer(string name) : base()\r\n        {\r\n        }\r\n    }\r\n\r\n    public class Ver2_Publisher : Ver2_Company\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Publisher\"/>.\r\n        /// </summary>\r\n        public Ver2_Publisher() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Publisher\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Ver2_Publisher(string name) : base()\r\n        {\r\n        }\r\n    }\r\n\r\n    public enum Ver2_CompletionStatus : int\r\n    {\r\n        [Description(\"Not Played\")]\r\n        NotPlayed = 0,\r\n        /// <summary>\r\n        /// Represents Played completion status.\r\n        /// </summary>\r\n        [Description(\"Played\")]\r\n        Played = 1,\r\n        /// <summary>\r\n        /// Represents Beaten completion status.\r\n        /// </summary>\r\n        [Description(\"Beaten\")]\r\n        Beaten = 2,\r\n        /// <summary>\r\n        /// Represents Completed completion status.\r\n        /// </summary>\r\n        [Description(\"Completed\")]\r\n        Completed = 3,\r\n        /// <summary>\r\n        /// Represents Playing completion status.\r\n        /// </summary>\r\n        [Description(\"Playing\")]\r\n        Playing = 4,\r\n        /// <summary>\r\n        /// Represents Abandoned completion status.\r\n        /// </summary>\r\n        [Description(\"Abandoned\")]\r\n        Abandoned = 5,\r\n        /// <summary>\r\n        /// Represents \"On hold\" completion status.\r\n        /// </summary>\r\n        [Description(\"On Hold\")]\r\n        OnHold = 6,\r\n        /// <summary>\r\n        /// Represents \"Plan to Play\" completion status.\r\n        /// </summary>\r\n        [Description(\"Plan to Play\")]\r\n        PlanToPlay = 7\r\n    }\r\n\r\n    public class Ver2_EmulatorProfile : Ver2_DatabaseObject, IEquatable<Ver2_EmulatorProfile>\r\n    {\r\n        private List<Guid> platforms;\r\n        /// <summary>\r\n        /// Gets or sets platforms supported by profile.\r\n        /// </summary>\r\n        public List<Guid> Platforms\r\n        {\r\n            get => platforms;\r\n            set\r\n            {\r\n                platforms = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<string> imageExtensions;\r\n        /// <summary>\r\n        /// Gets or sets file extension supported by profile.\r\n        /// </summary>\r\n        public List<string> ImageExtensions\r\n        {\r\n            get => imageExtensions;\r\n            set\r\n            {\r\n                imageExtensions = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string executable;\r\n        /// <summary>\r\n        /// Gets or sets executable path used to launch emulator.\r\n        /// </summary>\r\n        public string Executable\r\n        {\r\n            get => executable;\r\n            set\r\n            {\r\n                executable = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string arguments;\r\n        /// <summary>\r\n        /// Gets or sets arguments for emulator executable.\r\n        /// </summary>\r\n        public string Arguments\r\n        {\r\n            get => arguments;\r\n            set\r\n            {\r\n                arguments = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string workingDirectory;\r\n        /// <summary>\r\n        /// Gets or sets working directory of emulator process.\r\n        /// </summary>\r\n        public string WorkingDirectory\r\n        {\r\n            get => workingDirectory;\r\n            set\r\n            {\r\n                workingDirectory = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of EmulatorProfile.\r\n        /// </summary>\r\n        public Ver2_EmulatorProfile() : base()\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(Ver2_EmulatorProfile other)\r\n        {\r\n            if (other is null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!Platforms.IsListEqual(other.Platforms))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!ImageExtensions.IsListEqual(other.ImageExtensions))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Executable, other.Executable, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Arguments, other.Arguments, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(WorkingDirectory, other.WorkingDirectory, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Name, other.Name, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents system emulator.\r\n    /// </summary>\r\n    public class Ver2_Emulator : Ver2_DatabaseObject\r\n    {\r\n        private ObservableCollection<Ver2_EmulatorProfile> profile;\r\n        /// <summary>\r\n        /// Gets or sets list of emulator profiles.\r\n        /// </summary>\r\n        public ObservableCollection<Ver2_EmulatorProfile> Profiles\r\n        {\r\n            get => profile;\r\n            set\r\n            {\r\n                profile = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Emulator.\r\n        /// </summary>\r\n        public Ver2_Emulator() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Emulator with specific name.\r\n        /// </summary>\r\n        /// <param name=\"name\">Emulator name.</param>\r\n        public Ver2_Emulator(string name) : this()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n\r\n    public enum Ver2_GameField\r\n    {\r\n        ///\r\n        BackgroundImage,\r\n        ///\r\n        Description,\r\n        ///\r\n        GenreIds,\r\n        ///\r\n        Hidden,\r\n        ///\r\n        Favorite,\r\n        ///\r\n        Icon,\r\n        ///\r\n        CoverImage,\r\n        ///\r\n        InstallDirectory,\r\n        ///\r\n        GameImagePath,\r\n        ///\r\n        LastActivity,\r\n        ///\r\n        SortingName,\r\n        ///\r\n        Gameid,\r\n        ///\r\n        PluginId,\r\n        ///\r\n        OtherActions,\r\n        ///\r\n        PlayAction,\r\n        ///\r\n        PlatformId,\r\n        ///\r\n        PublisherIds,\r\n        ///\r\n        DeveloperIds,\r\n        ///\r\n        ReleaseDate,\r\n        ///\r\n        CategoryIds,\r\n        ///\r\n        TagIds,\r\n        ///\r\n        Links,\r\n        ///\r\n        IsInstalling,\r\n        ///\r\n        IsUninstalling,\r\n        ///\r\n        IsLaunching,\r\n        ///\r\n        IsRunning,\r\n        ///\r\n        IsInstalled,\r\n        ///\r\n        IsCustomGame,\r\n        ///\r\n        Playtime,\r\n        ///\r\n        Added,\r\n        ///\r\n        Modified,\r\n        ///\r\n        PlayCount,\r\n        ///\r\n        SeriesId,\r\n        ///\r\n        Version,\r\n        ///\r\n        AgeRatingId,\r\n        ///\r\n        RegionId,\r\n        ///\r\n        SourceId,\r\n        ///\r\n        CompletionStatus,\r\n        ///\r\n        UserScore,\r\n        ///\r\n        CriticScore,\r\n        ///\r\n        CommunityScore,\r\n        ///\r\n        Genres,\r\n        ///\r\n        Developers,\r\n        ///\r\n        Publishers,\r\n        ///\r\n        Tags,\r\n        ///\r\n        Categories,\r\n        ///\r\n        Platform,\r\n        ///\r\n        Series,\r\n        ///\r\n        AgeRating,\r\n        ///\r\n        Region,\r\n        ///\r\n        Source,\r\n        ///\r\n        ReleaseYear,\r\n        ///\r\n        ActionsScriptLanguage,\r\n        ///\r\n        PreScript,\r\n        ///\r\n        PostScript,\r\n        ///\r\n        Name,\r\n        ///\r\n        Features,\r\n        ///\r\n        FeatureIds,\r\n        ///\r\n        UseGlobalPostScript,\r\n        ///\r\n        UseGlobalPreScript,\r\n        ///\r\n        UserScoreRating,\r\n        ///\r\n        CommunityScoreRating,\r\n        ///\r\n        CriticScoreRating,\r\n        ///\r\n        UserScoreGroup,\r\n        ///\r\n        CommunityScoreGroup,\r\n        ///\r\n        CriticScoreGroup,\r\n        ///\r\n        LastActivitySegment,\r\n        ///\r\n        AddedSegment,\r\n        ///\r\n        ModifiedSegment,\r\n        ///\r\n        PlaytimeCategory,\r\n        ///\r\n        InstallationStatus,\r\n        ///\r\n        None,\r\n        ///\r\n        GameStartedScript,\r\n        ///\r\n        UseGlobalGameStartedScript,\r\n        ///\r\n        Notes,\r\n        ///\r\n        Manual\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents Playnite game object.\r\n    /// </summary>\r\n    public class Ver2_Game : Ver2_DatabaseObject\r\n    {\r\n        private string backgroundImage;\r\n        /// <summary>\r\n        /// Gets or sets background image. Local file path, HTTP URL or database file ids are supported.\r\n        /// </summary>\r\n        public string BackgroundImage\r\n        {\r\n            get\r\n            {\r\n                return backgroundImage;\r\n            }\r\n\r\n            set\r\n            {\r\n                backgroundImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string description;\r\n        /// <summary>\r\n        /// Gets or sets HTML game description.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string Description\r\n        {\r\n            get\r\n            {\r\n                return description;\r\n            }\r\n\r\n            set\r\n            {\r\n                description = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string notes;\r\n        /// <summary>\r\n        /// Gets or sets user notes.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string Notes\r\n        {\r\n            get\r\n            {\r\n                return notes;\r\n            }\r\n\r\n            set\r\n            {\r\n                notes = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> genreIds;\r\n        /// <summary>\r\n        /// Gets or sets list of genres.\r\n        /// </summary>\r\n        public List<Guid> GenreIds\r\n        {\r\n            get\r\n            {\r\n                return genreIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                genreIds = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool hidden;\r\n        /// <summary>\r\n        /// Gets or sets value indicating if the game is hidden in library.\r\n        /// </summary>\r\n        public bool Hidden\r\n        {\r\n            get\r\n            {\r\n                return hidden;\r\n            }\r\n\r\n            set\r\n            {\r\n                hidden = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool favorite;\r\n        /// <summary>\r\n        /// Gets or sets avlue indicating if the game is marked as favorite in library.\r\n        /// </summary>\r\n        public bool Favorite\r\n        {\r\n            get\r\n            {\r\n                return favorite;\r\n            }\r\n\r\n            set\r\n            {\r\n                favorite = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string icon;\r\n        /// <summary>\r\n        /// Gets or sets game icon. Local file path, HTTP URL or database file ids are supported.\r\n        /// </summary>\r\n        public string Icon\r\n        {\r\n            get\r\n            {\r\n                return icon;\r\n            }\r\n\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string coverImage;\r\n        /// <summary>\r\n        /// Gets or sets game cover image. Local file path, HTTP URL or database file ids are supported.\r\n        /// </summary>\r\n        public string CoverImage\r\n        {\r\n            get\r\n            {\r\n                return coverImage;\r\n            }\r\n\r\n            set\r\n            {\r\n                coverImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string installDirectory;\r\n        /// <summary>\r\n        /// Gets or sets game installation directory path.\r\n        /// </summary>\r\n        public string InstallDirectory\r\n        {\r\n            get\r\n            {\r\n                if (string.IsNullOrEmpty(installDirectory))\r\n                {\r\n                    if (PlayAction != null)\r\n                    {\r\n                        return PlayAction.WorkingDir;\r\n                    }\r\n                }\r\n\r\n                return installDirectory;\r\n            }\r\n\r\n            set\r\n            {\r\n                installDirectory = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string gameImagePath;\r\n        /// <summary>\r\n        /// Gets or sets game's ISO, ROM or other type of executable image path.\r\n        /// </summary>\r\n        public string GameImagePath\r\n        {\r\n            get\r\n            {\r\n                return gameImagePath;\r\n            }\r\n\r\n            set\r\n            {\r\n                gameImagePath = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateTime? lastActivity;\r\n        /// <summary>\r\n        /// Gets or sets last played date.\r\n        /// </summary>\r\n        public DateTime? LastActivity\r\n        {\r\n            get\r\n            {\r\n                return lastActivity;\r\n            }\r\n\r\n            set\r\n            {\r\n                lastActivity = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string sortingName;\r\n        /// <summary>\r\n        /// Gets or sets optional name used for sorting the game by name.\r\n        /// </summary>\r\n        public string SortingName\r\n        {\r\n            get\r\n            {\r\n                return sortingName;\r\n            }\r\n\r\n            set\r\n            {\r\n                sortingName = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string gameId;\r\n        /// <summary>\r\n        /// Gets or sets provider id. For example game's Steam ID.\r\n        /// </summary>\r\n        public string GameId\r\n        {\r\n            get\r\n            {\r\n                return gameId;\r\n            }\r\n\r\n            set\r\n            {\r\n                gameId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid pluginId = Guid.Empty;\r\n        /// <summary>\r\n        /// Gets or sets id of plugin responsible for handling this game.\r\n        /// </summary>\r\n        public Guid PluginId\r\n        {\r\n            get\r\n            {\r\n                return pluginId;\r\n            }\r\n\r\n            set\r\n            {\r\n                pluginId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<Ver2_GameAction> otherActions;\r\n        /// <summary>\r\n        /// Gets or sets list of additional game actions.\r\n        /// </summary>\r\n        public ObservableCollection<Ver2_GameAction> OtherActions\r\n        {\r\n            get\r\n            {\r\n                return otherActions;\r\n            }\r\n\r\n            set\r\n            {\r\n                otherActions = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Ver2_GameAction playAction;\r\n        /// <summary>\r\n        /// Gets or sets game action used to starting the game.\r\n        /// </summary>\r\n        public Ver2_GameAction PlayAction\r\n        {\r\n            get\r\n            {\r\n                return playAction;\r\n            }\r\n\r\n            set\r\n            {\r\n                playAction = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid platformId;\r\n        /// <summary>\r\n        /// Gets or sets platform id.\r\n        /// </summary>\r\n        public Guid PlatformId\r\n        {\r\n            get\r\n            {\r\n                return platformId;\r\n            }\r\n\r\n            set\r\n            {\r\n                platformId = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Ver2_Platform));\r\n            }\r\n        }\r\n\r\n        private List<Guid> publisherIds;\r\n        /// <summary>\r\n        /// Gets or sets list of publishers.\r\n        /// </summary>\r\n        public List<Guid> PublisherIds\r\n        {\r\n            get\r\n            {\r\n                return publisherIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                publisherIds = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> developerIds;\r\n        /// <summary>\r\n        /// Gets or sets list of developers.\r\n        /// </summary>\r\n        public List<Guid> DeveloperIds\r\n        {\r\n            get\r\n            {\r\n                return developerIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                developerIds = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateTime? releaseDate;\r\n        /// <summary>\r\n        /// Gets or set game's release date.\r\n        /// </summary>\r\n        public DateTime? ReleaseDate\r\n        {\r\n            get\r\n            {\r\n                return releaseDate;\r\n            }\r\n\r\n            set\r\n            {\r\n                releaseDate = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> categoryIds;\r\n        /// <summary>\r\n        /// Gets or sets game categories.\r\n        /// </summary>\r\n        public List<Guid> CategoryIds\r\n        {\r\n            get\r\n            {\r\n                return categoryIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                categoryIds = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> tagIds;\r\n        /// <summary>\r\n        /// Gets or sets list of tags.\r\n        /// </summary>\r\n        public List<Guid> TagIds\r\n        {\r\n            get\r\n            {\r\n                return tagIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                tagIds = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> featureIds;\r\n        /// <summary>\r\n        /// Gets or sets list of game features.\r\n        /// </summary>\r\n        public List<Guid> FeatureIds\r\n        {\r\n            get\r\n            {\r\n                return featureIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                featureIds = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<Ver2_Link> links;\r\n        /// <summary>\r\n        /// Gets or sets list of game related web links.\r\n        /// </summary>\r\n        public ObservableCollection<Ver2_Link> Links\r\n        {\r\n            get\r\n            {\r\n                return links;\r\n            }\r\n\r\n            set\r\n            {\r\n                links = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isInstalling;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a game is being installed..\r\n        /// </summary>\r\n        public bool IsInstalling\r\n        {\r\n            get => isInstalling;\r\n            set\r\n            {\r\n                isInstalling = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isUninstalling;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a game is being uninstalled.\r\n        /// </summary>\r\n        public bool IsUninstalling\r\n        {\r\n            get => isUninstalling;\r\n            set\r\n            {\r\n                isUninstalling = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isLaunching;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a game is being launched.\r\n        /// </summary>\r\n        public bool IsLaunching\r\n        {\r\n            get => isLaunching;\r\n            set\r\n            {\r\n                isLaunching = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isRunning;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a game is currently running.\r\n        /// </summary>\r\n        public bool IsRunning\r\n        {\r\n            get => isRunning;\r\n            set\r\n            {\r\n                isRunning = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isInstalled;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a game is installed.\r\n        /// </summary>\r\n        public bool IsInstalled\r\n        {\r\n            get => isInstalled;\r\n            set\r\n            {\r\n                isInstalled = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Ver2_InstallationStatus));\r\n            }\r\n        }\r\n\r\n        private long playtime = 0;\r\n        /// <summary>\r\n        /// Gets or sets played time in seconds.\r\n        /// </summary>\r\n        public long Playtime\r\n        {\r\n            get\r\n            {\r\n                return playtime;\r\n            }\r\n\r\n            set\r\n            {\r\n                playtime = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Ver2_PlaytimeCategory));\r\n            }\r\n        }\r\n\r\n        private DateTime? added;\r\n        /// <summary>\r\n        /// Gets or sets date when game was added into library.\r\n        /// </summary>\r\n        public DateTime? Added\r\n        {\r\n            get\r\n            {\r\n                return added;\r\n            }\r\n\r\n            set\r\n            {\r\n                added = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateTime? modified;\r\n        /// <summary>\r\n        /// Gets or sets date of last modification made to a game.\r\n        /// </summary>\r\n        public DateTime? Modified\r\n        {\r\n            get\r\n            {\r\n                return modified;\r\n            }\r\n\r\n            set\r\n            {\r\n                modified = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private long playCount = 0;\r\n        /// <summary>\r\n        /// Gets or sets a number indicating how many times the game has been played.\r\n        /// </summary>\r\n        public long PlayCount\r\n        {\r\n            get\r\n            {\r\n                return playCount;\r\n            }\r\n\r\n            set\r\n            {\r\n                playCount = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid seriesId;\r\n        /// <summary>\r\n        /// Gets or sets game series.\r\n        /// </summary>\r\n        public Guid SeriesId\r\n        {\r\n            get\r\n            {\r\n                return seriesId;\r\n            }\r\n\r\n            set\r\n            {\r\n                seriesId = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Ver2_Series));\r\n            }\r\n        }\r\n\r\n        private string version;\r\n        /// <summary>\r\n        /// Gets or sets game version.\r\n        /// </summary>\r\n        public string Version\r\n        {\r\n            get\r\n            {\r\n                return version;\r\n            }\r\n\r\n            set\r\n            {\r\n                version = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid ageRatingId;\r\n        /// <summary>\r\n        /// Gets or sets age rating for a game.\r\n        /// </summary>\r\n        public Guid AgeRatingId\r\n        {\r\n            get\r\n            {\r\n                return ageRatingId;\r\n            }\r\n\r\n            set\r\n            {\r\n                ageRatingId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid regionId;\r\n        /// <summary>\r\n        /// Gets or sets game region.\r\n        /// </summary>\r\n        public Guid RegionId\r\n        {\r\n            get\r\n            {\r\n                return regionId;\r\n            }\r\n\r\n            set\r\n            {\r\n                regionId = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Ver2_Region));\r\n            }\r\n        }\r\n\r\n        private Guid sourceId;\r\n        /// <summary>\r\n        /// Gets or sets source of the game.\r\n        /// </summary>\r\n        public Guid SourceId\r\n        {\r\n            get\r\n            {\r\n                return sourceId;\r\n            }\r\n\r\n            set\r\n            {\r\n                sourceId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Ver2_CompletionStatus completionStatus = Ver2_CompletionStatus.NotPlayed;\r\n        /// <summary>\r\n        /// Gets or sets game completion status.\r\n        /// </summary>\r\n        public Ver2_CompletionStatus CompletionStatus\r\n        {\r\n            get\r\n            {\r\n                return completionStatus;\r\n            }\r\n\r\n            set\r\n            {\r\n                completionStatus = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int? userScore = null;\r\n        /// <summary>\r\n        /// Gets or sets user's rating score.\r\n        /// </summary>\r\n        public int? UserScore\r\n        {\r\n            get\r\n            {\r\n                return userScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                userScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int? criticScore = null;\r\n        /// <summary>\r\n        /// Gets or sets critic based rating score.\r\n        /// </summary>\r\n        public int? CriticScore\r\n        {\r\n            get\r\n            {\r\n                return criticScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                criticScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int? communityScore = null;\r\n        /// <summary>\r\n        /// Gets or sets community rating score.\r\n        /// </summary>\r\n        public int? CommunityScore\r\n        {\r\n            get\r\n            {\r\n                return communityScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                communityScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Ver2_ScriptLanguage actionsScriptLanguage = Ver2_ScriptLanguage.PowerShell;\r\n        /// <summary>\r\n        /// Gets or sets scripting language for <see cref=\"PreScript\"/> and <see cref=\"PostScript\"/> scripts.\r\n        /// </summary>\r\n        public Ver2_ScriptLanguage ActionsScriptLanguage\r\n        {\r\n            get => actionsScriptLanguage;\r\n            set\r\n            {\r\n                actionsScriptLanguage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string preScript;\r\n        /// <summary>\r\n        /// Gets or sets pre-action script.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string PreScript\r\n        {\r\n            get => preScript;\r\n            set\r\n            {\r\n                preScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string postScript;\r\n        /// <summary>\r\n        /// Gets or sets post-action script.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string PostScript\r\n        {\r\n            get => postScript;\r\n            set\r\n            {\r\n                postScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string gameStartedScript;\r\n        /// <summary>\r\n        /// Gets or sets script to be executed after game started.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string GameStartedScript\r\n        {\r\n            get => gameStartedScript;\r\n            set\r\n            {\r\n                gameStartedScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool useGlobalPostScript = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether global post script should be executed.\r\n        /// </summary>\r\n        [DefaultValue(true)]\r\n        public bool UseGlobalPostScript\r\n        {\r\n            get => useGlobalPostScript;\r\n            set\r\n            {\r\n                useGlobalPostScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool useGlobalPreScript = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether global pre script should be executed.\r\n        /// </summary>\r\n        [DefaultValue(true)]\r\n        public bool UseGlobalPreScript\r\n        {\r\n            get => useGlobalPreScript;\r\n            set\r\n            {\r\n                useGlobalPreScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool useGameStartedScript = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether global pre script should be executed.\r\n        /// </summary>\r\n        [DefaultValue(true)]\r\n        public bool UseGlobalGameStartedScript\r\n        {\r\n            get => useGameStartedScript;\r\n            set\r\n            {\r\n                useGameStartedScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string manual;\r\n        /// <summary>\r\n        /// Gets or sets game manual.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string Manual\r\n        {\r\n            get\r\n            {\r\n                return manual;\r\n            }\r\n\r\n            set\r\n            {\r\n                manual = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of a Game object.\r\n        /// </summary>\r\n        public Ver2_Game() : base()\r\n        {\r\n            GameId = Guid.NewGuid().ToString();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of a Game object with specific name.\r\n        /// </summary>\r\n        /// <param name=\"name\">Game name.</param>\r\n        public Ver2_Game(string name) : this()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n\r\n    public enum Ver2_GameActionType : int\r\n    {\r\n        /// <summary>\r\n        /// Game action executes a file.\r\n        /// </summary>\r\n        File = 0,\r\n        /// <summary>\r\n        /// Game action navigates to a web based URL.\r\n        /// </summary>\r\n        URL = 1,\r\n        /// <summary>\r\n        /// Game action starts an emulator.\r\n        /// </summary>\r\n        Emulator = 2\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents executable game action.\r\n    /// </summary>\r\n    public class Ver2_GameAction : ObservableObject, IEquatable<Ver2_GameAction>\r\n    {\r\n        private readonly Guid id = Guid.NewGuid();\r\n\r\n        private Ver2_GameActionType type;\r\n        /// <summary>\r\n        /// Gets or sets task type.\r\n        /// </summary>\r\n        public Ver2_GameActionType Type\r\n        {\r\n            get => type;\r\n            set\r\n            {\r\n                type = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string arguments;\r\n        /// <summary>\r\n        /// Gets or sets executable arguments for File type tasks.\r\n        /// </summary>\r\n        public string Arguments\r\n        {\r\n            get => arguments;\r\n            set\r\n            {\r\n                arguments = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string additionalArguments;\r\n        /// <summary>\r\n        /// Gets or sets additional executable arguments used for Emulator action type.\r\n        /// </summary>\r\n        public string AdditionalArguments\r\n        {\r\n            get => additionalArguments;\r\n            set\r\n            {\r\n                additionalArguments = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool overrideDefaultArgs;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter emulator arguments should be completely overwritten with action arguments.\r\n        /// Applies only to Emulator action type.\r\n        /// </summary>\r\n        public bool OverrideDefaultArgs\r\n        {\r\n            get => overrideDefaultArgs;\r\n            set\r\n            {\r\n                overrideDefaultArgs = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string path;\r\n        /// <summary>\r\n        /// Gets or sets executable path for File action type or URL for URL action type.\r\n        /// </summary>\r\n        public string Path\r\n        {\r\n            get => path;\r\n            set\r\n            {\r\n                path = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string workingDir;\r\n        /// <summary>\r\n        /// Gets or sets working directory for File action type executable.\r\n        /// </summary>\r\n        public string WorkingDir\r\n        {\r\n            get => workingDir;\r\n            set\r\n            {\r\n                workingDir = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string name;\r\n        /// <summary>\r\n        /// Gets or sets action name.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get => name;\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isHandledByPlugin;\r\n        /// <summary>\r\n        /// Gets or sets value indicating wheter a action's execution should be handled by a plugin.\r\n        /// </summary>\r\n        public bool IsHandledByPlugin\r\n        {\r\n            get => isHandledByPlugin;\r\n            set\r\n            {\r\n                isHandledByPlugin = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid emulatorId;\r\n        /// <summary>\r\n        /// Gets or sets emulator id for Emulator action type execution.\r\n        /// </summary>\r\n        public Guid EmulatorId\r\n        {\r\n            get => emulatorId;\r\n            set\r\n            {\r\n                emulatorId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid emulatorProfileId;\r\n        /// <summary>\r\n        /// Gets or sets emulator profile id for Emulator action type execution.\r\n        /// </summary>\r\n        public Guid EmulatorProfileId\r\n        {\r\n            get => emulatorProfileId;\r\n            set\r\n            {\r\n                emulatorProfileId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            switch (Type)\r\n            {\r\n                case Ver2_GameActionType.File:\r\n                    return $\"File: {Path}, {Arguments}, {WorkingDir}\";\r\n                case Ver2_GameActionType.URL:\r\n                    return $\"Url: {Path}\";\r\n                case Ver2_GameActionType.Emulator:\r\n                    return $\"Emulator: {EmulatorId}, {EmulatorProfileId}, {OverrideDefaultArgs}, {AdditionalArguments}\";\r\n                default:\r\n                    return Path;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Compares two <see cref=\"Ver2_GameAction\"/> objects for equality.\r\n        /// </summary>\r\n        /// <param name=\"obj1\"></param>\r\n        /// <param name=\"obj2\"></param>\r\n        /// <returns></returns>\r\n        public static bool Equals(Ver2_GameAction obj1, Ver2_GameAction obj2)\r\n        {\r\n            if (obj1 == null && obj2 == null)\r\n            {\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return obj1?.Equals(obj2) == true;\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(Ver2_GameAction other)\r\n        {\r\n            if (other is null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (Type != other.Type)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Arguments, other.Arguments, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(AdditionalArguments, other.AdditionalArguments, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Path, other.Path, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(WorkingDir, other.WorkingDir, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Name, other.Name, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (IsHandledByPlugin != other.IsHandledByPlugin)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (EmulatorId != other.EmulatorId)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (EmulatorProfileId != other.EmulatorProfileId)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (OverrideDefaultArgs != other.OverrideDefaultArgs)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n\r\n    public class Ver2_GameFeature : Ver2_DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_GameFeature\"/>.\r\n        /// </summary>\r\n        public Ver2_GameFeature() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_GameFeature\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Ver2_GameFeature(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty tag.\r\n        /// </summary>\r\n        public static readonly Ver2_GameFeature Empty = new Ver2_GameFeature { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n\r\n    public class Ver2_GameSource : Ver2_DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_GameSource\"/>.\r\n        /// </summary>\r\n        public Ver2_GameSource() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_GameSource\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Ver2_GameSource(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty game source.\r\n        /// </summary>\r\n        public static readonly Ver2_GameSource Empty = new Ver2_GameSource { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n\r\n    public class Ver2_Genre : Ver2_DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Genre\"/>.\r\n        /// </summary>\r\n        public Ver2_Genre() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Genre\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Ver2_Genre(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty genre.\r\n        /// </summary>\r\n        public static readonly Ver2_Genre Empty = new Ver2_Genre { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n\r\n    public enum Ver2_InstallationStatus\r\n    {\r\n        /// <summary>\r\n        /// Game is installed.\r\n        /// </summary>\r\n        [Description(\"LOCGameIsInstalledTitle\")]\r\n        Installed = 0,\r\n\r\n        /// <summary>\r\n        /// Game is not installed.\r\n        /// </summary>\r\n        [Description(\"LOCGameIsUnInstalledTitle\")]\r\n        Uninstalled = 1\r\n    }\r\n\r\n    public class Ver2_Link : ObservableObject, IEquatable<Ver2_Link>\r\n    {\r\n        private string name;\r\n        /// <summary>\r\n        /// Gets or sets name of the link.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get => name;\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string url;\r\n        /// <summary>\r\n        /// Gets or sets web based URL.\r\n        /// </summary>\r\n        public string Url\r\n        {\r\n            get => url;\r\n            set\r\n            {\r\n                url = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Link.\r\n        /// </summary>\r\n        public Ver2_Link()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Link with specific values.\r\n        /// </summary>\r\n        /// <param name=\"name\">Link name.</param>\r\n        /// <param name=\"url\">Link URL.</param>\r\n        public Ver2_Link(string name, string url)\r\n        {\r\n            Name = name;\r\n            Url = url;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(Ver2_Link other)\r\n        {\r\n            if (other is null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Name, other.Name, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Url, other.Url, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n\r\n    public enum Ver2_PastTimeSegment : int\r\n    {\r\n        /// <summary>\r\n        /// Idicates time occurig today.\r\n        /// </summary>\r\n        [Description(\"LOCToday\")]\r\n        Today = 0,\r\n\r\n        /// <summary>\r\n        /// Idicates time occurig yesterday.\r\n        /// </summary>\r\n        [Description(\"LOCYesterday\")]\r\n        Yesterday = 1,\r\n\r\n        /// <summary>\r\n        /// Idicates time occurig past week.\r\n        /// </summary>\r\n        [Description(\"LOCPastWeek\")]\r\n        PastWeek = 2,\r\n\r\n        /// <summary>\r\n        /// Idicates time occurig past month.\r\n        /// </summary>\r\n        [Description(\"LOCPastMonth\")]\r\n        PastMonth = 3,\r\n\r\n        /// <summary>\r\n        /// Idicates time occurig past year.\r\n        /// </summary>\r\n        [Description(\"LOCPastYear\")]\r\n        PastYear = 4,\r\n\r\n        /// <summary>\r\n        /// Idicates time occurig past year.\r\n        /// </summary>\r\n        [Description(\"LOCMoreThenYear\")]\r\n        MoreThenYear = 5,\r\n\r\n        /// <summary>\r\n        /// Idicates time that never happened.\r\n        /// </summary>\r\n        [Description(\"LOCNever\")]\r\n        Never = 6\r\n    }\r\n\r\n    public class Ver2_Platform : Ver2_DatabaseObject\r\n    {\r\n        private string icon;\r\n        /// <summary>\r\n        /// Gets or sets platform icon.\r\n        /// </summary>\r\n        public string Icon\r\n        {\r\n            get => icon;\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string cover;\r\n        /// <summary>\r\n        /// Gets or sets default game cover.\r\n        /// </summary>\r\n        public string Cover\r\n        {\r\n            get => cover;\r\n            set\r\n            {\r\n                cover = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string background;\r\n        /// <summary>\r\n        /// Gets or sets default game background image.\r\n        /// </summary>\r\n        public string Background\r\n        {\r\n            get => background;\r\n            set\r\n            {\r\n                background = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Platform.\r\n        /// </summary>\r\n        public Ver2_Platform() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Platform with specific name.\r\n        /// </summary>\r\n        /// <param name=\"name\">Platform name.</param>\r\n        public Ver2_Platform(string name) : this()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty platform.\r\n        /// </summary>\r\n        public static readonly Ver2_Platform Empty = new Ver2_Platform { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n\r\n    public enum Ver2_PlaytimeCategory : int\r\n    {\r\n        /// <summary>\r\n        /// Not playtime.\r\n        /// </summary>\r\n        [Description(\"LOCPlayedNone\")]\r\n        NotPlayed = 0,\r\n\r\n        /// <summary>\r\n        /// Less then an hour played.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytimeLessThenAnHour\")]\r\n        LessThenHour = 1,\r\n\r\n        /// <summary>\r\n        /// Played 1 to 10 hours.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytime1to10\")]\r\n        O1_10 = 2,\r\n\r\n        /// <summary>\r\n        /// Played 10 to 100 hours.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytime10to100\")]\r\n        O10_100 = 3,\r\n\r\n        /// <summary>\r\n        /// Played 100 to 500 hours.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytime100to500\")]\r\n        O100_500 = 4,\r\n\r\n        /// <summary>\r\n        /// Played 500 to 1000 hours.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytime500to1000\")]\r\n        O500_1000 = 5,\r\n\r\n        /// <summary>\r\n        /// Played more then 1000 hours.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytime1000plus\")]\r\n        O1000plus = 6\r\n    }\r\n\r\n    public class Ver2_Region : Ver2_DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Region\"/>.\r\n        /// </summary>\r\n        public Ver2_Region() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Region\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Ver2_Region(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty region.\r\n        /// </summary>\r\n        public static readonly Ver2_Region Empty = new Ver2_Region { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n\r\n    public enum Ver2_ScoreRating\r\n    {\r\n        /// <summary>\r\n        /// No score.\r\n        /// </summary>\r\n        None,\r\n        /// <summary>\r\n        /// Negative rating.\r\n        /// </summary>\r\n        Negative,\r\n        /// <summary>\r\n        /// Positive rating.\r\n        /// </summary>\r\n        Positive,\r\n        /// <summary>\r\n        /// Mixed rating.\r\n        /// </summary>\r\n        Mixed\r\n    }\r\n\r\n    /// <summary>\r\n    /// Scpecifies rating score groups.\r\n    /// </summary>\r\n    public enum Ver2_ScoreGroup : int\r\n    {\r\n        /// <summary>\r\n        /// Score rage from 0 to 10.\r\n        /// </summary>\r\n        [Description(\"0x\")]\r\n        O0x = 0,\r\n\r\n        /// <summary>\r\n        /// Score rage from 10 to 20.\r\n        /// </summary>\r\n        [Description(\"1x\")]\r\n        O1x = 1,\r\n\r\n        /// <summary>\r\n        /// Score rage from 20 to 30.\r\n        /// </summary>\r\n        [Description(\"2x\")]\r\n        O2x = 2,\r\n\r\n        /// <summary>\r\n        /// Score rage from 30 to 40.\r\n        /// </summary>\r\n        [Description(\"3x\")]\r\n        O3x = 3,\r\n\r\n        /// <summary>\r\n        /// Score rage from 40 to 50.\r\n        /// </summary>\r\n        [Description(\"4x\")]\r\n        O4x = 4,\r\n\r\n        /// <summary>\r\n        /// Score rage from 50 to 60.\r\n        /// </summary>\r\n        [Description(\"5x\")]\r\n        O5x = 5,\r\n\r\n        /// <summary>\r\n        /// Score rage from 60 to 70.\r\n        /// </summary>\r\n        [Description(\"6x\")]\r\n        O6x = 6,\r\n\r\n        /// <summary>\r\n        /// Score rage from 70 to 80.\r\n        /// </summary>\r\n        [Description(\"7x\")]\r\n        O7x = 7,\r\n\r\n        /// <summary>\r\n        /// Score rage from 80 to 90.\r\n        /// </summary>\r\n        [Description(\"8x\")]\r\n        O8x = 8,\r\n\r\n        /// <summary>\r\n        /// Score rage from 90 to 100.\r\n        /// </summary>\r\n        [Description(\"9x\")]\r\n        O9x = 9,\r\n\r\n        /// <summary>\r\n        /// No score.\r\n        /// </summary>\r\n        [Description(\"LOCNone\")]\r\n        None = 10\r\n    }\r\n\r\n    public class Ver2_Series : Ver2_DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Series\"/>.\r\n        /// </summary>\r\n        public Ver2_Series() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Series\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Ver2_Series(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty series.\r\n        /// </summary>\r\n        public static readonly Ver2_Series Empty = new Ver2_Series { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n\r\n    public class Ver2_Tag : Ver2_DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Tag\"/>.\r\n        /// </summary>\r\n        public Ver2_Tag() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Ver2_Tag\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Ver2_Tag(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty tag.\r\n        /// </summary>\r\n        public static readonly Ver2_Tag Empty = new Ver2_Tag { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/DateTimes.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public static class DateTimes\r\n    {\r\n        public interface IDateTimes\r\n        {\r\n            DateTime Now { get; }\r\n            DateTime Today { get; }\r\n        }\r\n\r\n        public class DefaultDateProvider : IDateTimes\r\n        {\r\n            public DateTime Now => DateTime.Now;\r\n            public DateTime Today => DateTime.Today;\r\n        }\r\n\r\n        public class TempDateTime : IDisposable\r\n        {\r\n            public TempDateTime(IDateTimes customDates)\r\n            {\r\n                DateTimes.dateProvider = customDates;\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                DateTimes.dateProvider = DateTimes.defaultDateProvider;\r\n            }\r\n        }\r\n\r\n        private static IDateTimes defaultDateProvider = new DefaultDateProvider();\r\n        private static IDateTimes dateProvider = defaultDateProvider;\r\n\r\n        public static DateTime Now => dateProvider.Now;\r\n        public static DateTime Today => dateProvider.Today;\r\n\r\n        public static IDisposable UseCustomDates(IDateTimes dates)\r\n        {\r\n            return new TempDateTime(dates);\r\n        }\r\n\r\n        public static string ToDisplayString(this DateTime date, DateFormattingOptions options = null)\r\n        {\r\n            try\r\n            {\r\n                if (options == null)\r\n                {\r\n                    return date.ToString(Common.Constants.DateUiFormat);\r\n                }\r\n\r\n                if (options.PastWeekRelativeFormat)\r\n                {\r\n                    var today = Today;\r\n                    var dayDiff = (today - date.Date).TotalDays;\r\n\r\n                    if (dayDiff == 0)\r\n                    {\r\n                        return LOC.Today.GetLocalized();\r\n                    }\r\n\r\n                    if (dayDiff == 1)\r\n                    {\r\n                        return LOC.Yesterday.GetLocalized();\r\n                    }\r\n\r\n                    if (dayDiff > 1 && dayDiff < 7)\r\n                    {\r\n                        switch (date.DayOfWeek)\r\n                        {\r\n                            case DayOfWeek.Sunday:\r\n                                return LOC.Sunday.GetLocalized();\r\n                            case DayOfWeek.Monday:\r\n                                return LOC.Monday.GetLocalized();\r\n                            case DayOfWeek.Tuesday:\r\n                                return LOC.Tuesday.GetLocalized();\r\n                            case DayOfWeek.Wednesday:\r\n                                return LOC.Wednesday.GetLocalized();\r\n                            case DayOfWeek.Thursday:\r\n                                return LOC.Thursday.GetLocalized();\r\n                            case DayOfWeek.Friday:\r\n                                return LOC.Friday.GetLocalized();\r\n                            case DayOfWeek.Saturday:\r\n                                return LOC.Saturday.GetLocalized();\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return date.ToString(options.Format ?? Common.Constants.DateUiFormat);\r\n            }\r\n            catch (ArgumentOutOfRangeException)\r\n            {\r\n                // This is for rare cases where this fails on error similar to this:\r\n                // Specified time is not supported in this calendar. It should be between 04/30/1900 00:00:00 (Gregorian date) and 11/16/2077 23:59:59 (Gregorian date), inclusive.\r\n                // TODO: handle properly\r\n                return \"unsupported\";\r\n            }\r\n        }\r\n\r\n        public static string ToDisplayString(this ReleaseDate date, ReleaseDateFormattingOptions options = null)\r\n        {\r\n            if (date.Month == null && date.Day == null)\r\n            {\r\n                return date.Year.ToString();\r\n            }\r\n\r\n            if (date.Month != null && date.Day == null)\r\n            {\r\n                return date.Date.ToString(options.PartialFormat ?? Common.Constants.DefaultPartialReleaseDateTimeFormat);\r\n            }\r\n\r\n            return date.Date.ToDisplayString(options);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Diagnostic.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.IO.Compression;\r\nusing System.Text;\r\n\r\nnamespace Playnite\r\n{\r\n    public static class Diagnostic\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        private static List<string> GetPlayniteFilesList()\r\n        {\r\n            var progPath = PlaynitePaths.ProgramPath;\r\n            var allFiles = new List<string>();\r\n            foreach (var file in Directory.GetFiles(progPath, \"*.*\", SearchOption.TopDirectoryOnly))\r\n            {\r\n                try\r\n                {\r\n                    var fInfo = new FileInfo(file);\r\n                    allFiles.Add(fInfo.Name + \", \" + fInfo.Length);\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get information about Playnite file {file}\");\r\n                }\r\n            }\r\n\r\n            return allFiles;\r\n        }\r\n\r\n        private static string GetManifestInfo(string rootDir, string manFileName)\r\n        {\r\n            if (!Directory.Exists(rootDir))\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            var total = new StringBuilder();\r\n            foreach (var dir in Directory.GetDirectories(rootDir))\r\n            {\r\n                var manifest = Path.Combine(dir, manFileName);\r\n                if (File.Exists(manifest))\r\n                {\r\n                    total.Append(Path.GetFileName(dir));\r\n                    total.AppendLine();\r\n                    total.AppendLine(\"--------------------------\");\r\n                    total.Append(File.ReadAllText(manifest));\r\n                    total.AppendLine();\r\n                    total.AppendLine();\r\n                }\r\n            }\r\n\r\n            return total.ToString();\r\n        }\r\n\r\n        public static void CreateDiagPackage(string path, string userActionsDescription, DiagnosticPackageInfo packageInfo)\r\n        {\r\n            var diagTemp = Path.Combine(PlaynitePaths.TempPath, \"diag\");\r\n            FileSystem.CreateDirectory(diagTemp, true);\r\n            FileSystem.DeleteFile(path);\r\n\r\n            ZipFile.CreateFromDirectory(diagTemp, path);\r\n            using (FileStream zipToOpen = new FileStream(path, FileMode.Open))\r\n            {\r\n                using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))\r\n                {\r\n                    // Package info\r\n                    var packagePath = Path.Combine(diagTemp, DiagnosticPackageInfo.PackageInfoFileName);\r\n                    File.WriteAllText(packagePath, Serialization.ToJson(packageInfo));\r\n                    archive.CreateEntryFromFile(packagePath, Path.GetFileName(packagePath));\r\n\r\n                    // Config\r\n                    if (Directory.Exists(PlaynitePaths.ConfigRootPath))\r\n                    {\r\n                        foreach (var cfg in Directory.GetFiles(PlaynitePaths.ConfigRootPath, \"*.json\"))\r\n                        {\r\n                            var fileInfo = new FileInfo(cfg);\r\n                            archive.CreateEntryFromFile(cfg, fileInfo.Name);\r\n                        }\r\n                    }\r\n\r\n                    // Extension configs\r\n                    if (Directory.Exists(PlaynitePaths.ExtensionsDataPath))\r\n                    {\r\n                        foreach (var cfg in Directory.GetFiles(PlaynitePaths.ExtensionsDataPath, \"config.json\", SearchOption.AllDirectories))\r\n                        {\r\n                            var fileInfo = new FileInfo(cfg);\r\n                            archive.CreateEntryFromFile(cfg, Path.Combine(\"extensions\", fileInfo.Directory.Name, fileInfo.Name));\r\n                        }\r\n                    }\r\n\r\n                    // Installed extensions/themes\r\n                    try\r\n                    {\r\n                        var extensionsPath = Path.Combine(diagTemp, \"extensions.txt\");\r\n                        File.AppendAllText(extensionsPath, \"----- User data extensions: -----\\n\\n\");\r\n                        File.AppendAllText(extensionsPath, GetManifestInfo(PlaynitePaths.ExtensionsUserDataPath, PlaynitePaths.ExtensionManifestFileName));\r\n                        File.AppendAllText(extensionsPath, GetManifestInfo(PlaynitePaths.ThemesUserDataPath, PlaynitePaths.ThemeManifestFileName));\r\n                        if (PlayniteSettings.IsPortable)\r\n                        {\r\n                            File.AppendAllText(extensionsPath, \"\\n\\n----- Program dir extensions: -----\\n\\n\");\r\n                            File.AppendAllText(extensionsPath, GetManifestInfo(PlaynitePaths.ExtensionsProgramPath, PlaynitePaths.ExtensionManifestFileName));\r\n                            File.AppendAllText(extensionsPath, GetManifestInfo(PlaynitePaths.ThemesProgramPath, PlaynitePaths.ThemeManifestFileName));\r\n                        }\r\n\r\n                        archive.CreateEntryFromFile(extensionsPath, Path.GetFileName(extensionsPath));\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, \"Failed to package extensions list.\");\r\n                    }\r\n\r\n                    // System Info\r\n                    try\r\n                    {\r\n                        var infoPath = Path.Combine(diagTemp, \"sysinfo.txt\");\r\n                        File.WriteAllText(infoPath, Serialization.ToJson(Computer.GetSystemInfo(), true));\r\n                        archive.CreateEntryFromFile(infoPath, Path.GetFileName(infoPath));\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, \"Failed gather system info.\");\r\n                    }\r\n\r\n                    // Playnite info\r\n                    var playnitePath = Path.Combine(diagTemp, \"playniteInfo.txt\");\r\n                    var playniteInfo = new Dictionary<string, object>\r\n                    {\r\n                        { \"Version\", Updater.CurrentVersion.ToString() },\r\n                        { \"Portable\", PlayniteSettings.IsPortable },\r\n                        { \"Memory\", (PlayniteProcess.WorkingSetMemory / 1024f) / 1024f },\r\n                        { \"Path\", PlayniteProcess.Path },\r\n                        { \"Cmdline\", PlayniteProcess.Cmdline },\r\n                        { \"Elevated\", PlayniteEnvironment.IsElevated },\r\n                        { \"Playnite.DesktopApp.exe_MD5\", FileSystem.GetMD5(PlaynitePaths.DesktopExecutablePath) },\r\n                        { \"Playnite.FullscreenApp.exe_MD5\", FileSystem.GetMD5(PlaynitePaths.FullscreenExecutablePath) },\r\n                        { \"Playnite.dll_MD5\", FileSystem.GetMD5(PlaynitePaths.PlayniteAssemblyPath) },\r\n                        { \"Playnite.SDK.dll_MD5\", FileSystem.GetMD5(PlaynitePaths.PlayniteSDKAssemblyPath) }\r\n                    };\r\n\r\n                    File.WriteAllText(playnitePath, Serialization.ToJson(playniteInfo, true));\r\n                    archive.CreateEntryFromFile(playnitePath, Path.GetFileName(playnitePath));\r\n\r\n                    // Program file list\r\n                    try\r\n                    {\r\n                        var fileListPath = Path.Combine(diagTemp, \"fileList.txt\");\r\n                        File.WriteAllText(fileListPath, string.Join(Environment.NewLine, GetPlayniteFilesList()));\r\n                        archive.CreateEntryFromFile(fileListPath, Path.GetFileName(fileListPath));\r\n                    }\r\n                    catch (Exception e)\r\n                    {\r\n                        logger.Error(e, \"Failed to pack app file list.\");\r\n                    }\r\n\r\n                    // User actions description\r\n                    if (!string.IsNullOrWhiteSpace(userActionsDescription))\r\n                    {\r\n                        var descriptionPath = Path.Combine(diagTemp, \"userActions.txt\");\r\n                        File.WriteAllText(descriptionPath, userActionsDescription);\r\n                        archive.CreateEntryFromFile(descriptionPath, Path.GetFileName(descriptionPath));\r\n                    }\r\n\r\n                    void addCefLog(string logPath, ZipArchive archiveObj)\r\n                    {\r\n                        try\r\n                        {\r\n                            var cefEntry = archive.CreateEntry(Path.GetFileName(logPath));\r\n                            using (var cefS = new FileStream(logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))\r\n                            using (var writer = new StreamWriter(cefEntry.Open()))\r\n                            {\r\n                                cefS.CopyTo(writer.BaseStream);\r\n                            }\r\n                        }\r\n                        catch (Exception e)\r\n                        {\r\n                            logger.Error(e, \"Failed to pack CEF log.\");\r\n                        }\r\n                    }\r\n\r\n                    // Add log files\r\n                    foreach (var logFile in Directory.GetFiles(PlaynitePaths.ConfigRootPath, \"*.log\", SearchOption.TopDirectoryOnly))\r\n                    {\r\n                        if (Path.GetFileName(logFile) == \"cef.log\" || Path.GetFileName(logFile) == \"debug.log\")\r\n                        {\r\n                            addCefLog(logFile, archive);\r\n                        }\r\n                        else\r\n                        {\r\n                            archive.CreateEntryFromFile(logFile, Path.GetFileName(logFile));\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            FileSystem.DeleteDirectory(diagTemp);\r\n        }\r\n\r\n        public static void CreateLogPackage(string path)\r\n        {\r\n            FileSystem.DeleteFile(path);\r\n            using (FileStream zipToOpen = new FileStream(path, FileMode.Create))\r\n            using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))\r\n            {\r\n                foreach (var logFile in Directory.GetFiles(PlaynitePaths.ConfigRootPath, \"*.log\", SearchOption.TopDirectoryOnly))\r\n                {\r\n                    if (Path.GetFileName(logFile) == \"cef.log\" || Path.GetFileName(logFile) == \"debug.log\")\r\n                    {\r\n                        continue;\r\n                    }\r\n                    else\r\n                    {\r\n                        archive.CreateEntryFromFile(logFile, Path.GetFileName(logFile));\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static bool IsHResultCloudError(int hresult)\r\n        {\r\n            return hresult == unchecked((int)0x80070166) || // ERROR_CLOUD_FILE_SYNC_ROOT_METADATA_CORRUPT\r\n                   hresult == unchecked((int)0x8007016A) || // ERROR_CLOUD_FILE_PROVIDER_NOT_RUNNING\r\n                   hresult == unchecked((int)0x8007016B) || // ERROR_CLOUD_FILE_METADATA_CORRUPT\r\n                   hresult == unchecked((int)0x8007016C) || // ERROR_CLOUD_FILE_METADATA_TOO_LARGE\r\n                   hresult == unchecked((int)0x8007016D) || // ERROR_CLOUD_FILE_PROPERTY_BLOB_TOO_LARGE\r\n                   hresult == unchecked((int)0x8007016E) || // ERROR_CLOUD_FILE_PROPERTY_BLOB_CHECKSUM_MISMATCH\r\n                   hresult == unchecked((int)0x80070176) || // ERROR_CLOUD_FILE_TOO_MANY_PROPERTY_BLOBS\r\n                   hresult == unchecked((int)0x80070177) || // ERROR_CLOUD_FILE_PROPERTY_VERSION_NOT_SUPPORTED\r\n                   hresult == unchecked((int)0x80070179) || // ERROR_CLOUD_FILE_NOT_IN_SYNC\r\n                   hresult == unchecked((int)0x8007017A) || // ERROR_CLOUD_FILE_ALREADY_CONNECTED\r\n                   hresult == unchecked((int)0x8007017B) || // ERROR_CLOUD_FILE_NOT_SUPPORTED\r\n                   hresult == unchecked((int)0x8007017C) || // ERROR_CLOUD_FILE_INVALID_REQUEST\r\n                   hresult == unchecked((int)0x8007017D) || // ERROR_CLOUD_FILE_READ_ONLY_VOLUME\r\n                   hresult == unchecked((int)0x8007017E) || // ERROR_CLOUD_FILE_CONNECTED_PROVIDER_ONLY\r\n                   hresult == unchecked((int)0x8007017F) || // ERROR_CLOUD_FILE_VALIDATION_FAILED\r\n                   hresult == unchecked((int)0x80070182) || // ERROR_CLOUD_FILE_AUTHENTICATION_FAILED\r\n                   hresult == unchecked((int)0x80070183) || // ERROR_CLOUD_FILE_INSUFFICIENT_RESOURCES\r\n                   hresult == unchecked((int)0x80070184) || // ERROR_CLOUD_FILE_NETWORK_UNAVAILABLE\r\n                   hresult == unchecked((int)0x80070185) || // ERROR_CLOUD_FILE_UNSUCCESSFUL\r\n                   hresult == unchecked((int)0x80070186) || // ERROR_CLOUD_FILE_NOT_UNDER_SYNC_ROOT\r\n                   hresult == unchecked((int)0x80070187) || // ERROR_CLOUD_FILE_IN_USE\r\n                   hresult == unchecked((int)0x80070188) || // ERROR_CLOUD_FILE_PINNED\r\n                   hresult == unchecked((int)0x80070189) || // ERROR_CLOUD_FILE_REQUEST_ABORTED\r\n                   hresult == unchecked((int)0x8007018A) || // ERROR_CLOUD_FILE_PROPERTY_CORRUPT\r\n                   hresult == unchecked((int)0x8007018B) || // ERROR_CLOUD_FILE_ACCESS_DENIED\r\n                   hresult == unchecked((int)0x8007018C) || // ERROR_CLOUD_FILE_INCOMPATIBLE_HARDLINKS\r\n                   hresult == unchecked((int)0x8007018D) || // ERROR_CLOUD_FILE_PROPERTY_LOCK_CONFLICT\r\n                   hresult == unchecked((int)0x8007018E) || // ERROR_CLOUD_FILE_REQUEST_CANCELED\r\n                   hresult == unchecked((int)0x80070194) || // ERROR_CLOUD_FILE_PROVIDER_TERMINATED\r\n                   hresult == unchecked((int)0x800701AA) || // ERROR_CLOUD_FILE_REQUEST_TIMEOUT\r\n                   hresult == unchecked((int)0x800701B2) || // ERROR_CLOUD_FILE_DEHYDRATION_DISALLOWED\r\n                   hresult == unchecked((int)0x800701DB);   // ERROR_CLOUD_FILE_US_MESSAGE_TIMEOUT\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/DiagnosticPackageInfo.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class DiagnosticPackageInfo\r\n    {\r\n        public static readonly string PackageInfoFileName = \"packageInfo.txt\";\r\n\r\n        public string PlayniteVersion { get; set; }\r\n        public bool IsCrashPackage { get; set; } = false;\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/DialogsFactory.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite\r\n{\r\n    public class Dialogs\r\n    {\r\n        public static IDialogsFactory DialogsHandler { get; private set; }\r\n\r\n        public static void SetHandler(IDialogsFactory factory)\r\n        {\r\n            DialogsHandler = factory;\r\n        }\r\n\r\n        public static MessageBoxResult ShowErrorMessage(string messageBoxText, string caption)\r\n        {\r\n            return DialogsHandler.ShowErrorMessage(messageBoxText, caption);\r\n        }\r\n\r\n        public static MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon)\r\n        {\r\n            return DialogsHandler.ShowMessage(messageBoxText, caption, button, icon);\r\n        }\r\n\r\n        public static MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button)\r\n        {\r\n            return DialogsHandler.ShowMessage(messageBoxText, caption, button);\r\n        }\r\n\r\n        public static MessageBoxResult ShowMessage(string messageBoxText, string caption)\r\n        {\r\n            return DialogsHandler.ShowMessage(messageBoxText, caption);\r\n        }\r\n\r\n        public static MessageBoxResult ShowMessage(string messageBoxText)\r\n        {\r\n            return DialogsHandler.ShowMessage(messageBoxText);\r\n        }\r\n\r\n        public static string SelectFolder()\r\n        {\r\n            return DialogsHandler.SelectFolder();\r\n        }\r\n\r\n        public static string SelectFile(string filter)\r\n        {\r\n            return DialogsHandler.SelectFile(filter);\r\n        }\r\n\r\n        public static List<string> SelectFiles(string filter)\r\n        {\r\n            return DialogsHandler.SelectFiles(filter);\r\n        }\r\n\r\n        public static string SelectIconFile()\r\n        {\r\n            return DialogsHandler.SelectIconFile();\r\n        }\r\n\r\n        public static string SelectImagefile()\r\n        {\r\n            return DialogsHandler.SelectImagefile();\r\n        }\r\n\r\n        public static string SaveFile(string filter)\r\n        {\r\n            return DialogsHandler.SaveFile(filter);\r\n        }\r\n\r\n        public static string SaveFile(string filter, bool promptOverwrite)\r\n        {\r\n            return DialogsHandler.SaveFile(filter, promptOverwrite);\r\n        }\r\n\r\n        public static StringSelectionDialogResult SelectString(string messageBoxText, string caption, string defaultInput)\r\n        {\r\n            return DialogsHandler.SelectString(messageBoxText, caption, defaultInput);\r\n        }\r\n\r\n        public static StringSelectionDialogResult SelectString(string messageBoxText, string caption, string defaultInput, List<MessageBoxToggle> options)\r\n        {\r\n            return DialogsHandler.SelectString(messageBoxText, caption, defaultInput, options);\r\n        }\r\n\r\n        public static void ShowSelectableString(string messageBoxText, string caption, string defaultInput)\r\n        {\r\n            DialogsHandler.ShowSelectableString(messageBoxText, caption, defaultInput);\r\n        }\r\n\r\n        public static GlobalProgressResult ActivateGlobalProgress(Action<GlobalProgressActionArgs> progresAction, GlobalProgressOptions progressOptions)\r\n        {\r\n            return DialogsHandler.ActivateGlobalProgress(progresAction, progressOptions);\r\n        }\r\n\r\n        public static GlobalProgressResult ActivateGlobalProgress(Func<GlobalProgressActionArgs, Task> progresAction, GlobalProgressOptions progressOptions)\r\n        {\r\n            return DialogsHandler.ActivateGlobalProgress(progresAction, progressOptions);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/DiscordManager.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class DiscordManager : IDisposable\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private DiscordRPC.DiscordRpcClient discord;\r\n        private bool isConnected = false;\r\n        private bool isConnecting = false;\r\n\r\n        public bool IsPresenceEnabled { get; set; } = false;\r\n\r\n        public DiscordManager(bool presenceEnabled = false)\r\n        {\r\n            IsPresenceEnabled = presenceEnabled;\r\n            if (IsPresenceEnabled)\r\n            {\r\n                InitializeDiscord();\r\n            }\r\n        }\r\n\r\n        private void InitializeDiscord()\r\n        {\r\n            discord = new DiscordRPC.DiscordRpcClient(\"689105200262414377\");\r\n            discord.OnError += (a, s) =>\r\n            {\r\n                logger.Error($\"{s.Code}, {s.Type}, {s.Message}\");\r\n            };\r\n\r\n            discord.OnConnectionEstablished += (a, s) =>\r\n            {\r\n                isConnected = true;\r\n                isConnecting = false;\r\n            };\r\n\r\n            discord.OnConnectionFailed += (a, s) =>\r\n            {\r\n                isConnecting = false;\r\n                isConnected = false;\r\n                discord.Deinitialize();\r\n                discord.Dispose();\r\n                logger.Error(\"Discord connection failed\");\r\n            };\r\n\r\n            isConnecting = true;\r\n            discord.Initialize();\r\n        }\r\n\r\n        public void SetPresence(string gameName)\r\n        {\r\n            if (!IsPresenceEnabled)\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                if (!isConnected && !isConnecting)\r\n                {\r\n                    InitializeDiscord();\r\n                }\r\n\r\n                var pres = discord.CurrentPresence;\r\n\r\n                discord.SetPresence(new DiscordRPC.RichPresence\r\n                {\r\n                    Details = gameName,\r\n                    Assets = new DiscordRPC.Assets\r\n                    {\r\n                        LargeImageKey = \"playnite-avatar\",\r\n                        LargeImageText = \"Playnite game library manager.\"\r\n                    }\r\n                });\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to set Discord presence\");\r\n            }\r\n        }\r\n\r\n        public void ClearPresence()\r\n        {\r\n            if (!IsPresenceEnabled)\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                if (!isConnected && !isConnecting)\r\n                {\r\n                    InitializeDiscord();\r\n                }\r\n\r\n                var pres = discord.CurrentPresence;\r\n                discord.ClearPresence();\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to clear Discord presence\");\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            discord?.Dispose();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/EasyAntiCheat.cs",
    "content": "﻿using Newtonsoft.Json;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class EasyAntiCheatLauncherSettings\r\n    {\r\n        [JsonProperty(PropertyName = \"title\")]\r\n        public string Title { get; set; }\r\n\r\n        [JsonProperty(PropertyName = \"executable\")]\r\n        public string Executable { get; set; }\r\n\r\n        [JsonProperty(PropertyName = \"logo_position\")]\r\n        public string LogoPosition { get; set; }\r\n\r\n        [JsonProperty(PropertyName = \"parameters\")]\r\n        public string Parameters { get; set; }\r\n\r\n        [JsonProperty(PropertyName = \"use_cmdline_parameters\")]\r\n        public string UseCmdlineParameters { get; set; }\r\n\r\n        [JsonProperty(PropertyName = \"working_directory\")]\r\n        public string WorkingDirectory { get; set; }\r\n\r\n        [JsonProperty(PropertyName = \"wait_for_game_process_exit\")]\r\n        public string WaitForGameProcessExit { get; set; }\r\n\r\n        [JsonProperty(PropertyName = \"hide_splash_screen\")]\r\n        public string HideSplashScreen { get; set; }\r\n\r\n        [JsonProperty(PropertyName = \"ide_ui_controls\")]\r\n        public string IdeUiControls { get; set; }\r\n    }\r\n\r\n    public class EasyAntiCheat\r\n    {\r\n        public static EasyAntiCheatLauncherSettings GetLauncherSettings(string gameDirectory)\r\n        {\r\n            var settingsPath = Path.Combine(gameDirectory, \"EasyAntiCheat\", \"Launcher\", \"Settings.json\");\r\n            if (!File.Exists(settingsPath))\r\n            {\r\n                throw new FileNotFoundException($\"EAC launcher settings not found: {settingsPath}\");\r\n            }\r\n\r\n            return Serialization.FromJson<EasyAntiCheatLauncherSettings>(File.ReadAllText(settingsPath));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ElementTreeHelper.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Media;\r\n\r\nnamespace Playnite\r\n{\r\n    public class ElementTreeHelper\r\n    {\r\n        public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject\r\n        {\r\n            if (depObj == null)\r\n            {\r\n                yield return null;\r\n            }\r\n\r\n            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)\r\n            {\r\n                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);\r\n                if (child != null && child is T)\r\n                {\r\n                    yield return (T)child;\r\n                }\r\n\r\n                foreach (T childOfChild in FindVisualChildren<T>(child))\r\n                {\r\n                    yield return childOfChild;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static IEnumerable<DependencyObject> FindLogicalChildren(DependencyObject depObj)\r\n        {\r\n            if (depObj == null)\r\n            {\r\n                yield return null;\r\n            }\r\n\r\n            foreach (var child in LogicalTreeHelper.GetChildren(depObj))\r\n            {\r\n                if (child is DependencyObject)\r\n                {\r\n                    yield return child as DependencyObject;\r\n\r\n                    foreach (var childOfChild in FindLogicalChildren(child as DependencyObject))\r\n                    {\r\n                        yield return childOfChild;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/4DO/emulator.yaml",
    "content": "Id: 4do\r\nName: 4DO\r\nWebsite: 'https://sourceforge.net/projects/fourdo/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '-StartLoadFile \"{ImagePath}\" --StartFullScreen'  \r\n    Platforms: [3do]\r\n    ImageExtensions: [cue, bin, iso]\r\n    InstallationFile: ^4do\\.exe$\r\n    StartupExecutable: ^4do\\.exe$\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Altirra/emulator.yaml",
    "content": "Id: altirra\r\nName: Altirra\r\nWebsite: 'http://www.virtualdub.org/altirra.html'\r\nProfiles:\r\n  - Name: Atari 8-bit\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [atari_8bit]\r\n    ImageExtensions: [atr, atx, xfd, dcm, pro, cas, wav, rom, bin, car, xex, obx, com, arc, sap, zip]\r\n    StartupExecutable: ^altirra\\.exe$\r\n  - Name: Atari 5200\r\n    StartupArguments: '/hardware:5200 /kernel:5200 \"{ImagePath}\"'\r\n    Platforms: [atari_5200]\r\n    ImageExtensions: [rom, bin, car, a52, zip]\r\n    StartupExecutable: ^altirra\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Atari800/emulator.yaml",
    "content": "Id: atari800\r\nName: Atari800\r\nWebsite: 'https://atari800.github.io/'\r\nProfiles:\r\n  - Name: Default    \r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [atari_8bit, atari_5200]\r\n    ImageExtensions: [xfd, atr, atx, cdm, cas, bin, a52]\r\n    StartupExecutable: ^atari800\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/BGB/emulator.yaml",
    "content": "Id: bgb\r\nName: BGB\r\nWebsite: 'https://bgb.bircd.org'\r\nProfiles:\r\n  - Name: Game Boy\r\n    StartupArguments: '-rom \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy]\r\n    ImageExtensions: [zip, gb]\r\n    StartupExecutable: ^bgb\\.exe$\r\n  - Name: Game Boy Color\r\n    StartupArguments: '-rom \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboycolor]\r\n    ImageExtensions: [zip, gbc]\r\n    StartupExecutable: ^bgb\\.exe$\r\n  - Name: Game Boy 64-bit\r\n    StartupArguments: '-rom \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy]\r\n    ImageExtensions: [zip, gb]\r\n    StartupExecutable: ^bgb64\\.exe$\r\n  - Name: Game Boy Color 64-bit\r\n    StartupArguments: '-rom \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboycolor]\r\n    ImageExtensions: [zip, gbc]\r\n    StartupExecutable: ^bgb64\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/BigPEmu/emulator.yaml",
    "content": "Id: bigpemu\r\nName: BigPEmu\r\nWebsite: 'https://www.richwhitehouse.com/jaguar/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'  \r\n    Platforms: [atari_jaguar]\r\n    ImageExtensions: [j64, cof, rom, jag, abs, zip, cue, cdi]\r\n    StartupExecutable: ^BigPEmu\\.exe$\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/BizHawk/emulator.yaml",
    "content": "Id: bizhawk\r\nName: BizHawk\r\nWebsite: 'http://tasvideos.org/Bizhawk.html/'\r\nProfiles:\r\n  - Name: Apple II\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [apple_2]\r\n    ImageExtensions: [dsk, do, po, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Atari 2600\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [atari_2600]\r\n    ImageExtensions: [a26, zip, rar, 7z, gz, bin]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Atari 7800\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [atari_7800]\r\n    ImageExtensions: [a78, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Atari Jaguar\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [atari_jaguar]\r\n    ImageExtensions: [j64, jag, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Atari Lynx\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [atari_lynx]\r\n    ImageExtensions: [lnx, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Coleco ColecoVision\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [coleco_vision]\r\n    ImageExtensions: [col, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Commodore 64\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [commodore_64]\r\n    ImageExtensions: [prg, d64, g64, crt, tap, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: GCE Vectrex\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [vectrex]\r\n    ImageExtensions: [vec, zip]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Magnavox Odyssey 2\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [magnavox_odyssey_2]\r\n    ImageExtensions: [o2, bin, zip]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Mattel Intellivision\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [mattel_intellivision]\r\n    ImageExtensions: [int, bin, rom, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: NEC TurboGrafx 16\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [nec_turbografx_16]\r\n    ImageExtensions: [pce, cue, ccd, mds, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: NEC TurboGrafx-CD\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [nec_turbografx_cd]\r\n    ImageExtensions: [cue, ccd, mds]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Nintendo DS/DSi\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [nintendo_ds, nintendo_dsi]\r\n    ImageExtensions: [nds, zip]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Nintendo Entertainment System\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [nes, fds, unf, nsf, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Nintendo Game Boy\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [nintendo_gameboy]\r\n    ImageExtensions: [gb, sgb, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Nintendo Game Boy Color\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [nintendo_gameboycolor]\r\n    ImageExtensions: [gbc, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Nintendo Game Boy Advance\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [nintendo_gameboyadvance]\r\n    ImageExtensions: [gba, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Nintendo Virtual Boy\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [nintendo_virtualboy]\r\n    ImageExtensions: [vb, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Nintendo 64\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [nintendo_64]\r\n    ImageExtensions: [z64, v64, n64, zip]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: PC Engine SuperGrafx\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [nec_supergrafx]\r\n    ImageExtensions: [sgx, zip, rar, 7z, gz, pce]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Sega Game Gear\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [sega_gamegear]\r\n    ImageExtensions: [gg, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Sega Genesis\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [sega_genesis]\r\n    ImageExtensions: [gen, md, smd, 32x, bin, cue, ccd, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Sega Master System\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [sega_mastersystem]\r\n    ImageExtensions: [sms, gg, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Sega Saturn\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [sega_saturn]\r\n    ImageExtensions: [iso, bin, cue]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: SNK Neo Geo Pocket\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [snk_neogeopocket]\r\n    ImageExtensions: [ngp, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: SNK Neo Geo Pocket Color\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [snk_neogeopocket_color]\r\n    ImageExtensions: [ngc, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Sony PlayStation\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [cue, ccd, mds, m3u]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Super Nintendo Entertainment System\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [smc, sfc, xml, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Uzebox\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [uzebox]\r\n    ImageExtensions: [uze, zip]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: WonderSwan\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [bandai_wonderswan]\r\n    ImageExtensions: [ws, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: WonderSwan Color\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [bandai_wonderswan_color]\r\n    ImageExtensions: [wsc, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n\r\n  - Name: Sinclair ZX Spectrum\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [sinclair_zxspectrum]\r\n    ImageExtensions: [tzx, tap, dsk, pzx, csw, wav, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n    \r\n  - Name: Texas Instruments TI-83\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [ti_83]\r\n    ImageExtensions: [83g, 83l, 83p, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n    \r\n  - Name: TIC-80\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [tic_80]\r\n    ImageExtensions: [tic, zip, rar, 7z, gz]\r\n    StartupExecutable: ^EmuHawk\\.exe$\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/BlastEm/emulator.yaml",
    "content": "Id: blastem\r\nName: BlastEm\r\nWebsite: 'https://www.retrodev.com/blastem/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '-fullscreen \"{ImagePath}\"'\r\n    Platforms: [sega_genesis]\r\n    ImageExtensions: [bin, md, zip]\r\n    StartupExecutable: ^blastem\\.exe$\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Cemu/emulator.yaml",
    "content": "Id: cemu\r\nName: Cemu\r\nWebsite: 'https://cemu.info/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '-g \"{ImagePath}\" -f'\r\n    Platforms: [nintendo_wiiu]\r\n    ImageExtensions: [wud, wux, rpx, wua]\r\n    StartupExecutable: ^cemu.*\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Citra/emulator.yaml",
    "content": "Id: citra\r\nName: Citra\r\nWebsite: 'https://citra-emu.org/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_3ds]\r\n    ImageExtensions: [3ds, 3dsx, cci, cxi, elf, cia]\r\n    StartupExecutable: ^citra-qt\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Cxbx-Reloaded/emulator.yaml",
    "content": "Id: cxbx-reloaded\r\nName: Cxbx-Reloaded\r\nWebsite: 'https://cxbx-reloaded.co.uk'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [xbox]\r\n    ImageExtensions: [xbe]\r\n    StartupExecutable: ^cxbx\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/DOSBox/emulator.yaml",
    "content": "Id: dosbox\nName: DOSBox\nWebsite: 'https://www.dosbox.com/'\nProfiles:\n  - Name: Default\n    StartupArguments: '-conf \"{ImagePath}\" -noconsole'\n    Platforms: [pc_dos]\n    StartupExecutable: ^dosbox\\.exe$\n    ImageExtensions: [conf]"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/DeSmuME/emulator.yaml",
    "content": "Id: desmume\r\nName: DeSmuME\r\nWebsite: 'https://desmume.org/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_ds]\r\n    ImageExtensions: [nds, zip, 7z, rar, gz]\r\n    StartupExecutable: ^DeSmuME.*\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Dolphin/emulator.yaml",
    "content": "Id: dolphin\r\nName: Dolphin\r\nWebsite: 'https://dolphin-emu.org/'\r\nProfiles:\r\n  - Name: Nintendo GameCube\r\n    StartupArguments: '--exec=\"{ImagePath}\" --batch'\r\n    Platforms: [nintendo_gamecube]\r\n    ImageExtensions: [elf, dol, gcm, tgc, ciso, gcz, iso, wad, dff, rvz, m3u]\r\n    StartupExecutable: ^Dolphin\\.exe$\r\n  - Name: Nintendo Wii\r\n    StartupArguments: '--exec=\"{ImagePath}\" --batch'\r\n    Platforms: [nintendo_wii]\r\n    ImageExtensions: [elf, dol, tgc, wbfs, ciso, gcz, iso, wad, dff, rvz, wia, m3u]\r\n    StartupExecutable: ^Dolphin\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/DuckStation/emulator.yaml",
    "content": "Id: duckstation\nName: DuckStation\nWebsite: 'https://github.com/stenzek/duckstation'\nProfiles:\n  - Name: Default\n    Platforms: [sony_playstation]\n    StartupArguments: '-batch -fullscreen \"{ImagePath}\"'\n    ImageExtensions: [bin, img, exe, chd, psexe, m3u, cue, pbp, iso]\n    StartupExecutable: ^duckstation-qt-x64-ReleaseLTCG\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/FCEUX/emulator.yaml",
    "content": "Id: fceux\r\nName: FCEUX\r\nWebsite: 'http://www.fceux.com'\r\nProfiles:\r\n  - Name: NES 32bit\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [7z, zip, rar, tar, nes, fds, nsf, unf, nez, unif]\r\n    StartupExecutable: ^fceux\\.exe$\r\n  - Name: NES 64bit\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [7z, zip, rar, tar, nes, fds, nsf, unf, nez, unif]\r\n    StartupExecutable: ^fceux64\\.exe$\r\n  - Name: QT 64bit\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [7z, zip, rar, tar, nes, fds, nsf, unf, nez, unif]\r\n    StartupExecutable: ^qfceux\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/FS-UAE/emulator.yaml",
    "content": "Id: fs-uae\r\nName: FS-UAE\r\nWebsite: 'https://fs-uae.net/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [commodore_amiga, commodore_amiga_cd32]\r\n    ImageExtensions: [iso, ccd, cue, chd, mds, nrg, adf, adz, gz, dms, ipf, scp, fdi, lha, lzx]\r\n    StartupExecutable: ^fs-uae\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/FlashPlayerProjector/emulator.yaml",
    "content": "Id: flashplayerprojector\r\nName: Flash Player Projector\r\nWebsite: 'https://www.adobe.com/support/flashplayer/debug_downloads.html'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [adobe_flash]\r\n    ImageExtensions: [swf]\r\n    StartupExecutable: ^flashplayer.*\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Flycast/emulator.yaml",
    "content": "Id: flycast\nName: Flycast\nWebsite: 'https://github.com/flyinghead/flycast'\nProfiles:\n  - Name: Default\n    StartupArguments: '\"{ImagePath}\"'\n    Platforms: [sega_dreamcast]\n    ImageExtensions: [gdi, cdi, chd, zip]\n    StartupExecutable: ^flycast\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Fuse/emulator.yaml",
    "content": "Id: fuse\r\nName: Fuse\r\nWebsite: 'http://fuse-emulator.sourceforge.net/'\r\nProfiles:\r\n  - Name: Sinclair ZX Spectrum\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sinclair_zxspectrum]\r\n    ImageExtensions: [tzx, tap, z80, rzx, scl, trd]\r\n    StartupExecutable: ^fuse\\.exe$\r\n  - Name: Sinclair ZX Spectrum +3\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sinclair_zxspectrum3]\r\n    ImageExtensions: [tzx, tap, z80, rzx, scl, trd]\r\n    StartupExecutable: ^fuse\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/GBE+/emulator.yaml",
    "content": "Id: gbe+\r\nName: GBE+\r\nWebsite: 'https://github.com/shonumi/gbe-plus'\r\nProfiles:\r\n  - Name: Game Boy\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy]\r\n    ImageExtensions: [gb]\r\n    StartupExecutable: ^gbe_plus_qt*\\.exe$\r\n\r\n  - Name: Game Boy Color\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboycolor]\r\n    ImageExtensions: [gbc]\r\n    StartupExecutable: ^gbe_plus_qt*\\.exe$\r\n\r\n  - Name: Game Boy Advance\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboyadvance]\r\n    ImageExtensions: [gba]\r\n    StartupExecutable: ^gbe_plus_qt*\\.exe$\r\n\r\n  - Name: Nintendo DS\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_ds]\r\n    ImageExtensions: [nds]\r\n    StartupExecutable: ^gbe_plus_qt*\\.exe$\r\n\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Gambatte/emulator.yaml",
    "content": "Id: gambatte\r\nName: Gambatte\r\nWebsite: 'https://github.com/sinamas/gambatte'\r\nProfiles:\r\n  - Name: Game Boy\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy]\r\n    ImageExtensions: [gb, dmg, zip, gz]\r\n    StartupExecutable: ^gambatte\\.exe$\r\n    \r\n  - Name: Game Boy Color\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboycolor]\r\n    ImageExtensions: [gbc, sgb, zip, gz]\r\n    StartupExecutable: ^gambatte\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/KegaFusion/emulator.yaml",
    "content": "Id: kegafusion\r\nName: Kega Fusion\r\nWebsite: 'https://www.carpeludum.com/kega-fusion/'\r\nProfiles:\r\n  - Name: Sega Genesis\r\n    StartupArguments: '\"{ImagePath}\" -auto -fullscreen'\r\n    Platforms: [sega_genesis]\r\n    ImageExtensions: [bin, smd, md, raw, gen, zip]\r\n    StartupExecutable: ^Fusion\\.exe$\r\n\r\n  - Name: Sega 32X\r\n    StartupArguments: '\"{ImagePath}\" -auto -fullscreen'\r\n    Platforms: [sega_32x]\r\n    ImageExtensions: [32x, raw, zip]\r\n    StartupExecutable: ^Fusion\\.exe$\r\n\r\n  - Name: Sega CD\r\n    StartupArguments: '\"{ImagePath}\" -auto -fullscreen'\r\n    Platforms: [sega_cd]\r\n    ImageExtensions: [cue, bin, iso, raw, zip]\r\n    StartupExecutable: ^Fusion\\.exe$\r\n\r\n  - Name: Sega Master System\r\n    StartupArguments: '\"{ImagePath}\" -auto -fullscreen'\r\n    Platforms: [sega_mastersystem]\r\n    ImageExtensions: [sms, sg, sc, mv, bin, raw, zip]\r\n    StartupExecutable: ^Fusion\\.exe$\r\n\r\n  - Name: Sega Game Gear\r\n    StartupArguments: '\"{ImagePath}\" -auto -fullscreen'\r\n    Platforms: [sega_gamegear]\r\n    ImageExtensions: [bin, gg, raw, zip]\r\n    StartupExecutable: ^Fusion\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Lime3DS/emulator.yaml",
    "content": "Id: lime3ds\nName: Lime3DS\nWebsite: 'https://github.com/Lime3DS/lime3ds-archive'\nProfiles:\n  - Name: Default\n    StartupArguments: '\"{ImagePath}\"'\n    Platforms: [nintendo_3ds]\n    ImageExtensions: [3ds, 3dsx, cci, cxi, elf, cia]\n    StartupExecutable: ^lime3ds\\.exe$\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/LocaleEmulator/emulator.yaml",
    "content": "Id: localeemulator\r\nName: Locale Emulator\r\nWebsite: 'https://pooi.moe/Locale-Emulator/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [pc_windows]\r\n    ImageExtensions: [exe]\r\n    StartupExecutable: ^LEProc\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/M64Py/emulator.yaml",
    "content": "Id: m64py\nName: M64Py\nWebsite: 'https://m64py.sourceforge.net/'\nProfiles:\n  - Name: Default\n    StartupArguments: '\"{ImagePath}\"'\n    Platforms: [nintendo_64]\n    StartupExecutable: ^m64py\\.exe$\n    ImageExtensions: [gzip, bzip2, zip, rar, 7z, n64, z64, v64, ndd, d64]"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Mednafen/emulator.yaml",
    "content": "Id: mednafen\r\nName: Mednafen\r\nWebsite: 'https://mednafen.github.io/'\r\nProfiles:\r\n  - Name: Apple II\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [apple_2]\r\n    ImageExtensions: [d13, sk, do, po, woz, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Atari Lynx\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [atari_lynx]\r\n    ImageExtensions: [lnx, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: NEC TurboGrafx 16\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nec_turbografx_16]\r\n    ImageExtensions: [pce, zip, m3u]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: NEC TurboGrafx-CD\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nec_turbografx_cd]\r\n    ImageExtensions: [cue, ccd, chd, m3u]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: NEC PC-FX\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nec_pcfx]\r\n    ImageExtensions: [cue, ccd, chd, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Nintendo Entertainment System\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [nes, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Nintendo Game Boy\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy]\r\n    ImageExtensions: [gb, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Nintendo Game Boy Color\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboycolor]\r\n    ImageExtensions: [gbc, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Nintendo Game Boy Advance\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboyadvance]\r\n    ImageExtensions: [gba, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Nintendo Virtual Boy\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_virtualboy]\r\n    ImageExtensions: [vb, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: PC Engine SuperGrafx\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nec_supergrafx]\r\n    ImageExtensions: [sgx, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Sega Game Gear\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sega_gamegear]\r\n    ImageExtensions: [sgg, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Sega Genesis\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sega_genesis]\r\n    ImageExtensions: [gen, md, bin, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Sega Master System\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sega_mastersystem]\r\n    ImageExtensions: [sms, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Sega Saturn\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sega_saturn]\r\n    ImageExtensions: [chd, iso, bin, cue, m3u]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: SNK Neo Geo Pocket\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [snk_neogeopocket]\r\n    ImageExtensions: [ngp, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: SNK Neo Geo Pocket Color\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [snk_neogeopocket_color]\r\n    ImageExtensions: [ngc, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Sony PlayStation\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [chd, cue, ccd, mds, m3u]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Super Nintendo Entertainment System\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [smc, sfc, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Bandai WonderSwan\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [bandai_wonderswan]\r\n    ImageExtensions: [ws, zip]\r\n    StartupExecutable: ^mednafen\\.exe$\r\n\r\n  - Name: Bandai WonderSwan Color\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [bandai_wonderswan_color]\r\n    ImageExtensions: [wsc, zip]\r\n    StartupExecutable: ^mednafen\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Mesen/emulator.yaml",
    "content": "Id: mesen\r\nName: Mesen\r\nWebsite: 'https://www.mesen.ca/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '/fullscreen \"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [nes, unf, fds, nsf, nsfe, zip, 7z, ips, bps, ups]\r\n    StartupExecutable: ^Mesen\\.exe$\r\n  - Name: Game Boy\r\n    StartupArguments: '/fullscreen \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy]\r\n    ImageExtensions: [gb, gbs, zip]\r\n    StartupExecutable: ^Mesen\\.exe$\r\n  - Name: Game Boy Color\r\n    StartupArguments: '/fullscreen \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboycolor]\r\n    ImageExtensions: [gbc, zip]\r\n    StartupExecutable: ^Mesen\\.exe$\r\n  - Name: NES\r\n    StartupArguments: '/fullscreen \"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [nes, fds, unif, studybox, nsf, nsfe, zip]\r\n    StartupExecutable: ^Mesen\\.exe$\r\n  - Name: PC Engine\r\n    StartupArguments: '/fullscreen \"{ImagePath}\"'\r\n    Platforms: [nec_turbografx_16]\r\n    ImageExtensions: [pce, hes, zip]\r\n    StartupExecutable: ^Mesen\\.exe$\r\n  - Name: PC Engine CD\r\n    StartupArguments: '/fullscreen \"{ImagePath}\"'\r\n    Platforms: [nec_turbografx_cd]\r\n    ImageExtensions: [cue, zip]\r\n    StartupExecutable: ^Mesen\\.exe$\r\n  - Name: PC Engine SuperGrafx\r\n    StartupArguments: '/fullscreen \"{ImagePath}\"'\r\n    Platforms: [nec_supergrafx]\r\n    ImageExtensions: [pce, sgx, zip]\r\n    StartupExecutable: ^Mesen\\.exe$\r\n  - Name: SNES\r\n    StartupArguments: '/fullscreen \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [sfc, fig, smc, spc, zip]\r\n    StartupExecutable: ^Mesen\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Mesen-S/emulator.yaml",
    "content": "Id: mesen-s\r\nName: Mesen-S\r\nWebsite: 'https://github.com/SourMesen/Mesen-S'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [sfc, smc, zip, 7z]\r\n    StartupExecutable: ^Mesen-S\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/NanoboyAdvance/emulator.yaml",
    "content": "Id: nanoboyadvance\nName: NanoboyAdvance\nWebsite: 'https://github.com/fleroviux/NanoboyAdvance'\nProfiles:\n  - Name: Default\n    StartupArguments: '\"{ImagePath}\"'\n    Platforms: [nintendo_gameboyadvance]\n    ImageExtensions: [gba, zip]\n    StartupExecutable: ^NanoboyAdvance\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Nestopia/emulator.yaml",
    "content": "Id: nestopia\r\nName: Nestopia\r\nWebsite: 'http://nestopia.sourceforge.net/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [nes, unf, fds, nsf, zip]\r\n    StartupExecutable: ^nestopia\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/NullDC/emulator.yaml",
    "content": "Id: nulldc\r\nName: NullDC\r\nWebsite: 'http://segaretro.org/NullDC'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '-config nullDC_GUI:Fullscreen=1 -config nullDC:Emulator.Autostart=1 -config ImageReader:LoadDefaultImage=1 -config ImageReader:DefaultImage=\"{ImagePath}\"'\r\n    Platforms: [sega_dreamcast]\r\n    ImageExtensions: [iso, bwt, cdi, b5t, b6t, ccd, cue, mds, nrg, pdi, gdi]\r\n    StartupExecutable: ^nullDC.*\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/PCSX2/emulator.yaml",
    "content": "Id: pcsx2\r\nName: PCSX2\r\nWebsite: 'https://pcsx2.net/'\r\nProfiles:\r\n  - Name: Default 32bit\r\n    StartupArguments: '\"{ImagePath}\" --nogui --fullboot --fullscreen'\r\n    Platforms: [sony_playstation2]\r\n    ImageExtensions: [iso, bin, mdf, nrg, img, gz, cso, chd, m3u]\r\n    StartupExecutable: ^pcsx2\\.exe$\r\n  - Name: Default 64bit\r\n    StartupArguments: '\"{ImagePath}\" --nogui --fullboot --fullscreen'\r\n    Platforms: [sony_playstation2]\r\n    ImageExtensions: [iso, bin, mdf, nrg, img, gz, cso, chd, m3u]\r\n    StartupExecutable: ^pcsx2x64\\.exe$\r\n  - Name: Default QT\r\n    StartupArguments: '-fullscreen -slowboot -- {ImagePath}'\r\n    Platforms: [sony_playstation2]\r\n    ImageExtensions: [iso, bin, mdf, nrg, img, gz, cso, chd, m3u]\r\n    StartupExecutable: ^pcsx2-qt\\.exe$\r\n  - Name: 64bit AVX2\r\n    StartupArguments: '\"{ImagePath}\" --nogui --fullboot --fullscreen'\r\n    Platforms: [sony_playstation2]\r\n    ImageExtensions: [iso, bin, mdf, nrg, img, gz, cso, chd, m3u]\r\n    StartupExecutable: ^pcsx2x64-avx2\\.exe$\r\n  - Name: 64bit AVX2 QT\r\n    StartupArguments: '-fullscreen -slowboot -- {ImagePath}'\r\n    Platforms: [sony_playstation2]\r\n    ImageExtensions: [iso, bin, mdf, nrg, img, gz, cso, chd, m3u]\r\n    StartupExecutable: ^pcsx2-qtx64-avx2\\.exe$\r\n  - Name: 64bit SSE4 QT\r\n    StartupArguments: '-fullscreen -slowboot -- {ImagePath}'\r\n    Platforms: [sony_playstation2]\r\n    ImageExtensions: [iso, bin, mdf, nrg, img, gz, cso, chd, m3u]\r\n    StartupExecutable: ^pcsx2-qtx64\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/PCSXR-PGXP/emulator.yaml",
    "content": "Id: pcsxr-pgxp\r\nName: PCSXR-PGXP\r\nWebsite: 'https://github.com/iCatButler/pcsxr/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '-cdfile \"{ImagePath}\" -nogui -slowboot'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [bin, iso, img, cue]\r\n    StartupExecutable: ^pcsxr-pgxp\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/PCem/emulator.yaml",
    "content": "Id: pcem\r\nName: PCem\r\nWebsite: 'https://pcem-emulator.co.uk/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '--config \"{ImagePath}\"'\r\n    Platforms: [pc_windows, pc_dos]\r\n    ImageExtensions: [cfg]  \r\n    StartupExecutable: ^pcem\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/PPSSPP/emulator.yaml",
    "content": "Id: ppsspp\r\nName: PPSSPP\r\nWebsite: 'https://www.ppsspp.org/'\r\nProfiles:\r\n  - Name: 64bit\r\n    StartupArguments: '\"{ImagePath}\" --pause-menu-exit --fullscreen'\r\n    Platforms: [sony_psp]\r\n    ImageExtensions: [iso, cso, pbp, chd]\r\n    StartupExecutable: ^PPSSPPWindows64\\.exe$\r\n  - Name: 32bit\r\n    StartupArguments: '\"{ImagePath}\" --pause-menu-exit --fullscreen'\r\n    Platforms: [sony_psp]\r\n    ImageExtensions: [iso, cso, pbp, chd]\r\n    StartupExecutable: ^PPSSPPWindows\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Project64/emulator.yaml",
    "content": "Id: project64\r\nName: Project64\r\nWebsite: 'https://www.pj64-emu.com/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    ImageExtensions: [rom, n64, v64, z64, jap, pal, usa, zip, 7z]\r\n    Platforms: [nintendo_64]\r\n    StartupExecutable: ^Project64\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/RPCS3/emulator.yaml",
    "content": "Id: rpcs3\r\nName: RPCS3\r\nWebsite: 'https://rpcs3.net/'\r\nProfiles:\r\n  - Name: Default\r\n    Platforms: [sony_playstation3]\r\n    ProfileFiles: ['qt\\plugins\\platforms\\qwindows.dll']\r\n    StartupExecutable: ^rpcs3.*\\.exe$\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    ScriptGameImport: true\r\n  - Name: Default QT6\r\n    Platforms: [sony_playstation3]\r\n    ProfileFiles: ['qt6\\plugins\\platforms\\qwindows.dll']\r\n    StartupExecutable: ^rpcs3.*\\.exe$\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    ScriptGameImport: true"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/RPCS3/importGames.ps1",
    "content": "param(\r\n    $ImportArgs\r\n)\r\n\r\nif (-not [System.IO.Directory]::Exists($ImportArgs.ScanDirectory))\r\n{\r\n    return\r\n}\r\n\r\nfunction Get-NullTerminatedString\r\n{\r\n    param([Array]$bytes, [int]$offset)\r\n\r\n    $strBytes = @()\r\n    for ($j = $offset; $j -lt $bytes.Count; $j++)\r\n    {\r\n        $b = $bytes[$j]\r\n        if($b -eq 0) { break } #strings end on null terminator\r\n        $strBytes += $b\r\n    }\r\n    return [System.Text.Encoding]::UTF8.GetString($strBytes)\r\n}\r\n\r\nfunction Get-ParamSfoValue\r\n{\r\n    param([string]$path, [string]$key)\r\n\r\n    #thanks to https://psdevwiki.com/ps3/PARAM.SFO\r\n    [byte[]]$bytes = Get-Content -LiteralPath $path -Encoding Byte -Raw\r\n    $keyTableOffset = [System.BitConverter]::ToUInt32($bytes, 0x08)\r\n    $dataTableOffset = [System.BitConverter]::ToUInt32($bytes, 0x0c)\r\n\r\n    $indexTableOffset = 0x14\r\n    $indexRowLength = 0x10\r\n\r\n    #go through each index table row\r\n    for ($i = $indexTableOffset; $i -lt $keyTableOffset; $i += $indexRowLength)\r\n    {\r\n        $relativeKeyOffset = [System.BitConverter]::ToUInt16($bytes, $i)\r\n        $foundKey = Get-NullTerminatedString $bytes ($keyTableOffset + $relativeKeyOffset)\r\n        if($foundKey -ne $key)\r\n        {\r\n            continue\r\n        }\r\n\r\n        $dataFormat = [System.BitConverter]::ToUInt16($bytes, $i + 0x02)\r\n        $dataLength = [System.BitConverter]::ToUInt32($bytes, $i + 0x04)\r\n        $relativeDataOffset = [System.BitConverter]::ToUInt32($bytes, $i + 0x0c)\r\n        if ($dataFormat -eq 1028) #uint32\r\n        {\r\n            $data = [System.BitConverter]::ToUInt32($bytes, $dataTableOffset + $relativeDataOffset)\r\n        }\r\n        else #string (usually null-terminated)\r\n        {\r\n            $data = [System.Text.Encoding]::UTF8.GetString($bytes, $dataTableOffset + $relativeDataOffset, $dataLength).Trim(\"`0\")\r\n        }\r\n        return $data\r\n    }\r\n    return $null\r\n}\r\n\r\n[array]$games = Get-ChildItem -LiteralPath $ImportArgs.ScanDirectory -Recurse | Where { $_.Name -eq \"ISO.BIN.EDAT\" -or $_.Name -eq \"EBOOT.BIN\" -or $_.Extension -ieq \".iso\" }\r\nforeach ($game in $games)\r\n{\r\n    $anyFunc = [Func[string,bool]]{ param($a) $a.Equals($game.FullName, 'OrdinalIgnoreCase') }\r\n    if ([System.Linq.Enumerable]::Any($ImportArgs.ImportedFiles, $anyFunc))\r\n    {\r\n        continue\r\n    }\r\n\r\n    $scannedGame = New-Object \"Playnite.Emulators.ScriptScannedGame\"\r\n    $scannedGame.Path = $game.FullName\r\n    \r\n    if ($game.Extension -ieq '.iso')\r\n    {\r\n        try\r\n        {\r\n            $DiskImage = Mount-DiskImage -ImagePath $game.FullName -StorageType ISO -NoDriveLetter -PassThru\r\n            New-PSDrive -Name ISOFile -PSProvider FileSystem -Root (Get-Volume -DiskImage $DiskImage).UniqueId | Out-Null\r\n            Push-Location ISOFile: | Out-Null\r\n\r\n            try\r\n            {\r\n                $paramSfoPath = (Get-ChildItem ISOFile: -Filter \"param.sfo\" -Recurse -File | Where { $_.DirectoryName -like \"*PS3_GAME*\" })[0].FullName\r\n\r\n                $scannedGame.Serial = Get-ParamSfoValue $paramSfoPath \"TITLE_ID\"\r\n                if ($null -ne $scannedGame.Serial)\r\n                {\r\n                    $scannedGame.Name = Get-ParamSfoValue $paramSfoPath \"TITLE\"\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                Pop-Location | Out-Null\r\n                Remove-PSDrive ISOFile | Out-Null\r\n                Dismount-DiskImage -StorageType ISO -ImagePath $DiskImage.ImagePath | Out-Null\r\n            }\r\n        }\r\n        catch\r\n        {\r\n            $__logger.Error($_.Exception, \"Failed to scan PS3 .iso PARAM.SFO file $paramSfoPath\")\r\n            $__logger.Error($_.ScriptStackTrace)\r\n            \r\n            $scannedGame.Name = [System.IO.Path]::GetFileNameWithoutExtension($game.Name)\r\n            if ($game.Name -match '(BLUS|BLES|NPUB|NPEB)\\d{5}')\r\n            {\r\n                $scannedGame.Serial = $matches[0]\r\n            }\r\n        }\r\n\r\n        $scannedGame\r\n    }\r\n    else\r\n    {\r\n        $parentDir = $game.Directory.Parent.FullName\r\n        $paramSfoPath = Join-Path $parentDir \"PARAM.SFO\"\r\n    \r\n        if (Test-Path -LiteralPath $paramSfoPath -PathType Leaf)\r\n        {\r\n            try\r\n            {\r\n                $scannedGame.Serial = Get-ParamSfoValue $paramSfoPath \"TITLE_ID\"\r\n                if ($null -ne $scannedGame.Serial)\r\n                {\r\n                    $scannedGame.Name = Get-ParamSfoValue $paramSfoPath \"TITLE\"\r\n                    $scannedGame\r\n                }\r\n            }\r\n            catch\r\n            {\r\n                $__logger.Error($_.Exception, \"Failed to scan PS3 PARAM.SFO file $paramSfoPath\")\r\n                $__logger.Error($_.ScriptStackTrace)\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Reicast/emulator.yaml",
    "content": "Id: reicast\r\nName: Reicast\r\nWebsite: 'https://reicast.com/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sega_dreamcast]\r\n    ImageExtensions: [gdi, cdi, chd]\r\n    StartupExecutable: ^reicast.*\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/RetroArch/emulator.yaml",
    "content": "﻿Id: retroarch\r\nName: RetroArch\r\nWebsite: 'http://www.retroarch.com/'\r\nProfiles:\r\n  - Name: 4DO\r\n    StartupArguments: '-L \".\\cores\\4do_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [3do]\r\n    ImageExtensions: [7z, bin, chd, cue, iso, zip]\r\n    ProfileFiles: ['cores\\4do_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: a5200\r\n    StartupArguments: '-L \".\\cores\\a5200_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [atari_5200]\r\n    ImageExtensions: [7z, a52, bin, zip]\r\n    ProfileFiles: ['cores\\a5200_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Atari800\r\n    StartupArguments: '-L \".\\cores\\atari800_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [atari_5200, atari_8bit]\r\n    ImageExtensions: [7z, a52, atr, atx, bin, car, cas, com, dcm, m3u, rom, xex, xfd, zip]\r\n    ProfileFiles: ['cores\\atari800_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle bsnes\r\n    StartupArguments: '-L \".\\cores\\mednafen_snes_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bs, fig, sfc, smc, st, zip]\r\n    ProfileFiles: ['cores\\mednafen_snes_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle GBA\r\n    StartupArguments: '-L \".\\cores\\mednafen_gba_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboyadvance]\r\n    ImageExtensions: [7z, agb, bin, gba, zip]\r\n    ProfileFiles: ['cores\\mednafen_gba_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle Lynx\r\n    StartupArguments: '-L \".\\cores\\mednafen_lynx_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [atari_lynx]\r\n    ImageExtensions: [7z, lnx, lyx, o, zip]\r\n    ProfileFiles: ['cores\\mednafen_lynx_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle NeoPop\r\n    StartupArguments: '-L \".\\cores\\mednafen_ngp_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [snk_neogeopocket, snk_neogeopocket_color]\r\n    ImageExtensions: [7z, ngc, ngp, ngpc, npc, zip]\r\n    ProfileFiles: ['cores\\mednafen_ngp_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle PC-FX\r\n    StartupArguments: '-L \".\\cores\\mednafen_pcfx_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nec_pcfx]\r\n    ImageExtensions: [7z, ccd, chd, cue, toc, zip]\r\n    ProfileFiles: ['cores\\mednafen_pcfx_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle PCE\r\n    StartupArguments: '-L \".\\cores\\mednafen_pce_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nec_supergrafx, nec_turbografx_16, nec_turbografx_cd]\r\n    ImageExtensions: [7z, ccd, chd, cue, m3u, pce, sgx, toc, zip]\r\n    ProfileFiles: ['cores\\mednafen_pce_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle PCE Fast\r\n    StartupArguments: '-L \".\\cores\\mednafen_pce_fast_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nec_turbografx_16, nec_turbografx_cd]\r\n    ImageExtensions: [7z, ccd, chd, cue, m3u, pce, toc, zip]\r\n    ProfileFiles: ['cores\\mednafen_pce_fast_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle PSX\r\n    StartupArguments: '-L \".\\cores\\mednafen_psx_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [7z, ccd, chd, cue, exe, m3u, pbp, toc, zip]\r\n    ProfileFiles: ['cores\\mednafen_psx_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle PSX HW\r\n    StartupArguments: '-L \".\\cores\\mednafen_psx_hw_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [7z, ccd, chd, cue, exe, m3u, pbp, toc, zip]\r\n    ProfileFiles: ['cores\\mednafen_psx_hw_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle Saturn\r\n    StartupArguments: '-L \".\\cores\\mednafen_saturn_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_saturn]\r\n    ImageExtensions: [7z, ccd, chd, cue, m3u, toc, zip]\r\n    ProfileFiles: ['cores\\mednafen_saturn_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle Supafaust\r\n    StartupArguments: '-L \".\\cores\\mednafen_supafaust_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bsx, dx2, fig, gd3, gd7, sfc, smc, swc, zip]\r\n    ProfileFiles: ['cores\\mednafen_supafaust_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle SuperGrafx\r\n    StartupArguments: '-L \".\\cores\\mednafen_supergrafx_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nec_supergrafx, nec_turbografx_16, nec_turbografx_cd]\r\n    ImageExtensions: [7z, ccd, chd, cue, pce, sgx, zip]\r\n    ProfileFiles: ['cores\\mednafen_supergrafx_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle VB\r\n    StartupArguments: '-L \".\\cores\\mednafen_vb_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_virtualboy]\r\n    ImageExtensions: [7z, bin, vb, vboy, zip]\r\n    ProfileFiles: ['cores\\mednafen_vb_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Beetle WonderSwan\r\n    StartupArguments: '-L \".\\cores\\mednafen_wswan_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [bandai_wonderswan, bandai_wonderswan_color]\r\n    ImageExtensions: [7z, pc2, pcv2, ws, wsc, zip]\r\n    ProfileFiles: ['cores\\mednafen_wswan_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: BlastEm\r\n    StartupArguments: '-L \".\\cores\\blastem_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_genesis]\r\n    ImageExtensions: [68k, 7z, bin, gen, md, sgd, smd, zip]\r\n    ProfileFiles: ['cores\\blastem_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: blueMSX\r\n    StartupArguments: '-L \".\\cores\\bluemsx_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [microsoft_msx, microsoft_msx2]\r\n    ImageExtensions: [7z, cas, col, dsk, m3u, mx1, mx2, ri, rom, sc, sf, sg, zip]\r\n    ProfileFiles: ['cores\\bluemsx_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: bnes/higan\r\n    StartupArguments: '-L \".\\cores\\bnes_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [7z, nes, zip]\r\n    ProfileFiles: ['cores\\bnes_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Boytacean\r\n    StartupArguments: '-L \".\\cores\\boytacean_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor]\r\n    ImageExtensions: [7z, gb, gbc, zip]\r\n    ProfileFiles: ['cores\\boytacean_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: bsnes\r\n    StartupArguments: '-L \".\\cores\\bsnes_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bs, fig, gb, gbc, sfc, smc, swc, zip]\r\n    ProfileFiles: ['cores\\bsnes_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: bsnes 2014 Accuracy\r\n    StartupArguments: '-L \".\\cores\\bsnes2014_accuracy_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bml, bs, gb, gbc, sfc, smc, st, zip]\r\n    ProfileFiles: ['cores\\bsnes2014_accuracy_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: bsnes 2014 Balanced\r\n    StartupArguments: '-L \".\\cores\\bsnes2014_balanced_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bml, bs, gb, gbc, sfc, smc, st, zip]\r\n    ProfileFiles: ['cores\\bsnes2014_balanced_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: bsnes 2014 Performance\r\n    StartupArguments: '-L \".\\cores\\bsnes2014_performance_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bml, bs, gb, gbc, sfc, smc, st, zip]\r\n    ProfileFiles: ['cores\\bsnes2014_performance_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: bsnes C++98 (v085)\r\n    StartupArguments: '-L \".\\cores\\bsnes_cplusplus98_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bs, gb, gbc, sfc, smc, st, zip]\r\n    ProfileFiles: ['cores\\bsnes_cplusplus98_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: bsnes-hd beta\r\n    StartupArguments: '-L \".\\cores\\bsnes_hd_beta_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bs, fig, gb, gbc, sfc, smc, swc, zip]\r\n    ProfileFiles: ['cores\\bsnes_hd_beta_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: bsnes-jg\r\n    StartupArguments: '-L \".\\cores\\bsnes-jg_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bs, gb, gbc, sfc, smc, st, zip]\r\n    ProfileFiles: ['cores\\bsnes-jg_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: bsnes-mercury Accuracy\r\n    StartupArguments: '-L \".\\cores\\bsnes_mercury_accuracy_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bml, bs, gb, gbc, sfc, smc, st, zip]\r\n    ProfileFiles: ['cores\\bsnes_mercury_accuracy_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: bsnes-mercury Balanced\r\n    StartupArguments: '-L \".\\cores\\bsnes_mercury_balanced_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bml, bs, gb, gbc, sfc, smc, st, zip]\r\n    ProfileFiles: ['cores\\bsnes_mercury_balanced_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: bsnes-mercury Performance\r\n    StartupArguments: '-L \".\\cores\\bsnes_mercury_performance_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bml, bs, gb, gbc, sfc, smc, st, zip]\r\n    ProfileFiles: ['cores\\bsnes_mercury_performance_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Caprice32\r\n    StartupArguments: '-L \".\\cores\\cap32_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [amstrad_cpc]\r\n    ImageExtensions: [7z, cdt, cpr, dsk, m3u, sna, tap, voc, zip]\r\n    ProfileFiles: ['cores\\cap32_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: ChimeraSNES\r\n    StartupArguments: '-L \".\\cores\\chimerasnes_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bs, bsx, dx2, fig, gd3, gd7, sfc, smc, st, swc, zip]\r\n    ProfileFiles: ['cores\\chimerasnes_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Citra\r\n    StartupArguments: '-L \".\\cores\\citra_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_3ds]\r\n    ImageExtensions: [3ds, 3dsx, 7z, app, axf, cci, cxi, elf, zip]\r\n    ProfileFiles: ['cores\\citra_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Citra 2018\r\n    StartupArguments: '-L \".\\cores\\citra2018_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_3ds]\r\n    ImageExtensions: [3ds, 3dsx, 7z, app, axf, cci, cxi, elf, zip]\r\n    ProfileFiles: ['cores\\citra2018_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Citra Canary/Experimental\r\n    StartupArguments: '-L \".\\cores\\citra_canary_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_3ds]\r\n    ImageExtensions: [3ds, 3dsx, 7z, app, axf, cci, cxi, elf, zip]\r\n    ProfileFiles: ['cores\\citra_canary_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: CrocoDS\r\n    StartupArguments: '-L \".\\cores\\crocods_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [amstrad_cpc]\r\n    ImageExtensions: [7z, dsk, kcr, sna, zip]\r\n    ProfileFiles: ['cores\\crocods_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: DeSmuME\r\n    StartupArguments: '-L \".\\cores\\desmume_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_ds]\r\n    ImageExtensions: [7z, bin, ids, nds, zip]\r\n    ProfileFiles: ['cores\\desmume_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: DeSmuME 2015\r\n    StartupArguments: '-L \".\\cores\\desmume2015_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_ds]\r\n    ImageExtensions: [7z, bin, ids, nds, zip]\r\n    ProfileFiles: ['cores\\desmume2015_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: DirectXBox\r\n    StartupArguments: '-L \".\\cores\\directxbox_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [xbox]\r\n    ImageExtensions: [7z, iso, zip]\r\n    ProfileFiles: ['cores\\directxbox_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Dolphin\r\n    StartupArguments: '-L \".\\cores\\dolphin_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gamecube, nintendo_wii]\r\n    ImageExtensions: [7z, ciso, dff, dol, elf, gcm, gcz, iso, m3u, rvz, tgc, wad, wbfs, wia, zip]\r\n    ProfileFiles: ['cores\\dolphin_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Dolphin Launcher\r\n    StartupArguments: '-L \".\\cores\\dolphin_launcher_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gamecube, nintendo_wii]\r\n    ImageExtensions: [7z, ciso, dol, elf, gcm, gcz, iso, wad, wbfs, zip]\r\n    ProfileFiles: ['cores\\dolphin_launcher_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: DOSBox\r\n    StartupArguments: '-L \".\\cores\\dosbox_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [pc_dos]\r\n    ImageExtensions: [7z, bat, com, conf, exe, zip]\r\n    ProfileFiles: ['cores\\dosbox_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: DOSBox-core\r\n    StartupArguments: '-L \".\\cores\\dosbox_core_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [pc_dos]\r\n    ImageExtensions: [/, 7z, bat, com, conf, cue, exe, img, iso, zip]\r\n    ProfileFiles: ['cores\\dosbox_core_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: DOSBox-Pure\r\n    StartupArguments: '-L \".\\cores\\dosbox_pure_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [pc_dos]\r\n    ImageExtensions: [/, 7z, bat, chd, com, conf, cue, dosz, exe, ima, img, ins, iso, jrc, m3u, m3u8, tc, vhd, zip]\r\n    ProfileFiles: ['cores\\dosbox_pure_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: DOSBox-SVN\r\n    StartupArguments: '-L \".\\cores\\dosbox_svn_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [pc_dos]\r\n    ImageExtensions: [/, 7z, bat, com, conf, cue, exe, img, iso, zip]\r\n    ProfileFiles: ['cores\\dosbox_svn_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: DOSBox-SVN CE\r\n    StartupArguments: '-L \".\\cores\\dosbox_svn_ce_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [pc_dos]\r\n    ImageExtensions: [7z, bat, com, conf, cue, exe, iso, zip]\r\n    ProfileFiles: ['cores\\dosbox_svn_ce_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: DoubleCherryGB\r\n    StartupArguments: '-L \".\\cores\\DoubleCherryGB_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor]\r\n    ImageExtensions: [7z, cgb, dmg, gb, gbc, sgb, zip]\r\n    ProfileFiles: ['cores\\DoubleCherryGB_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: DuckStation\r\n    StartupArguments: '-L \".\\cores\\duckstation_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [7z, bin, chd, cue, ecm, exe, img, iso, m3u, mds, pbp, psexe, psf, zip]\r\n    ProfileFiles: ['cores\\duckstation_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Emux GB\r\n    StartupArguments: '-L \".\\cores\\emux_gb_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor]\r\n    ImageExtensions: [7z, bin, gb, gbc, rom, zip]\r\n    ProfileFiles: ['cores\\emux_gb_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Emux NES\r\n    StartupArguments: '-L \".\\cores\\emux_nes_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [7z, bin, nes, rom, zip]\r\n    ProfileFiles: ['cores\\emux_nes_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Emux SMS\r\n    StartupArguments: '-L \".\\cores\\emux_sms_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_mastersystem]\r\n    ImageExtensions: [7z, bin, bms, rom, sms, zip]\r\n    ProfileFiles: ['cores\\emux_sms_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: FCEUmm\r\n    StartupArguments: '-L \".\\cores\\fceumm_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_famicom_disk, nintendo_nes]\r\n    ImageExtensions: [7z, fds, nes, unf, unif, zip]\r\n    ProfileFiles: ['cores\\fceumm_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: fixGB\r\n    StartupArguments: '-L \".\\cores\\fixgb_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor]\r\n    ImageExtensions: [7z, gb, gbc, gbs, zip]\r\n    ProfileFiles: ['cores\\fixgb_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: fixNES\r\n    StartupArguments: '-L \".\\cores\\fixnes_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_famicom_disk, nintendo_nes]\r\n    ImageExtensions: [7z, fds, nes, nsf, qd, zip]\r\n    ProfileFiles: ['cores\\fixnes_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Flycast\r\n    StartupArguments: '-L \".\\cores\\flycast_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_dreamcast]\r\n    ImageExtensions: [7z, bin, cdi, chd, cue, dat, elf, gdi, lst, m3u, zip]\r\n    ProfileFiles: ['cores\\flycast_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Flycast GLES2\r\n    StartupArguments: '-L \".\\cores\\flycast_gles2_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_dreamcast]\r\n    ImageExtensions: [7z, bin, cdi, chd, cue, dat, elf, gdi, iso, lst, m3u, zip]\r\n    ProfileFiles: ['cores\\flycast_gles2_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: fMSX\r\n    StartupArguments: '-L \".\\cores\\fmsx_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [microsoft_msx, microsoft_msx2]\r\n    ImageExtensions: [7z, cas, dsk, fdi, m3u, mx1, mx2, rom, zip]\r\n    ProfileFiles: ['cores\\fmsx_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: FreeIntv\r\n    StartupArguments: '-L \".\\cores\\freeintv_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [mattel_intellivision]\r\n    ImageExtensions: [7z, bin, int, rom, zip]\r\n    ProfileFiles: ['cores\\freeintv_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Frodo\r\n    StartupArguments: '-L \".\\cores\\frodo_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_64]\r\n    ImageExtensions: [7z, d64, lnx, lyx, p00, t64, x64, zip]\r\n    ProfileFiles: ['cores\\frodo_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: FS-UAE\r\n    StartupArguments: '-L \".\\cores\\fsuae_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_amiga]\r\n    ImageExtensions: [7z, adf, fs-uae, ipf, zip]\r\n    ProfileFiles: ['cores\\fsuae_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Fuse\r\n    StartupArguments: '-L \".\\cores\\fuse_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sinclair_zxspectrum, sinclair_zxspectrum3]\r\n    ImageExtensions: [7z, dck, dsk, rzx, scl, sna, szx, tap, trd, tzx, z80, zip]\r\n    ProfileFiles: ['cores\\fuse_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Gambatte\r\n    StartupArguments: '-L \".\\cores\\gambatte_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor]\r\n    ImageExtensions: [7z, dmg, gb, gbc, zip]\r\n    ProfileFiles: ['cores\\gambatte_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Gearboy\r\n    StartupArguments: '-L \".\\cores\\gearboy_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor]\r\n    ImageExtensions: [7z, cgb, dmg, gb, gbc, sgb, zip]\r\n    ProfileFiles: ['cores\\gearboy_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Gearcoleco\r\n    StartupArguments: '-L \".\\cores\\gearcoleco_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [coleco_vision]\r\n    ImageExtensions: [7z, bin, col, cv, rom, zip]\r\n    ProfileFiles: ['cores\\gearcoleco_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Gearsystem\r\n    StartupArguments: '-L \".\\cores\\gearsystem_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [coleco_vision, sega_gamegear, sega_mastersystem, sega_sg1000]\r\n    ImageExtensions: [7z, bin, gg, rom, sg, sms, zip]\r\n    ProfileFiles: ['cores\\gearsystem_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Genesis Plus GX\r\n    StartupArguments: '-L \".\\cores\\genesis_plus_gx_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_cd, sega_gamegear, sega_genesis, sega_mastersystem]\r\n    ImageExtensions: [68k, 7z, bin, bms, chd, cue, gen, gg, iso, m3u, md, mdx, sg, sgd, smd, sms, zip]\r\n    ProfileFiles: ['cores\\genesis_plus_gx_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Genesis Plus GX Wide\r\n    StartupArguments: '-L \".\\cores\\genesis_plus_gx_wide_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_cd, sega_gamegear, sega_genesis, sega_mastersystem]\r\n    ImageExtensions: [68k, 7z, bin, bms, chd, cue, gen, gg, iso, m3u, md, mdx, sg, sgd, smd, sms, zip]\r\n    ProfileFiles: ['cores\\genesis_plus_gx_wide_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: gpSP\r\n    StartupArguments: '-L \".\\cores\\gpsp_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboyadvance]\r\n    ImageExtensions: [7z, bin, gba, zip]\r\n    ProfileFiles: ['cores\\gpsp_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Handy\r\n    StartupArguments: '-L \".\\cores\\handy_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [atari_lynx]\r\n    ImageExtensions: [7z, lnx, lyx, o, zip]\r\n    ProfileFiles: ['cores\\handy_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Hatari\r\n    StartupArguments: '-L \".\\cores\\hatari_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [atari_falcon030, atari_st]\r\n    ImageExtensions: [7z, dim, gem, ide, ipf, m3u, msa, st, stx, vhd, zip]\r\n    ProfileFiles: ['cores\\hatari_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: higan (Super Famicom Accuracy)\r\n    StartupArguments: '-L \".\\cores\\higan_sfc_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor, nintendo_super_nes]\r\n    ImageExtensions: [7z, bml, gb, gbc, rom, sfc, smc, zip]\r\n    ProfileFiles: ['cores\\higan_sfc_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Holani\r\n    StartupArguments: '-L \".\\cores\\holani_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [atari_lynx]\r\n    ImageExtensions: [7z, lnx, o, zip]\r\n    ProfileFiles: ['cores\\holani_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Ishiiruka\r\n    StartupArguments: '-L \".\\cores\\ishiiruka_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gamecube, nintendo_wii]\r\n    ImageExtensions: [7z, ciso, dff, dol, elf, gcm, gcz, iso, tgc, wad, wbfs, zip]\r\n    ProfileFiles: ['cores\\ishiiruka_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Kronos\r\n    StartupArguments: '-L \".\\cores\\kronos_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_saturn]\r\n    ImageExtensions: [7z, ccd, chd, cue, iso, m3u, mds, zip]\r\n    ProfileFiles: ['cores\\kronos_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: melonDS\r\n    StartupArguments: '-L \".\\cores\\melonds_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_ds]\r\n    ImageExtensions: [7z, dsi, ids, nds, zip]\r\n    ProfileFiles: ['cores\\melonds_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: melonDS DS\r\n    StartupArguments: '-L \".\\cores\\melondsds_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_ds]\r\n    ImageExtensions: [7z, dsi, ids, nds, zip]\r\n    ProfileFiles: ['cores\\melondsds_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Mesen\r\n    StartupArguments: '-L \".\\cores\\mesen_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_famicom_disk, nintendo_nes]\r\n    ImageExtensions: [7z, fds, nes, unf, unif, zip]\r\n    ProfileFiles: ['cores\\mesen_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Mesen-S\r\n    StartupArguments: '-L \".\\cores\\mesen-s_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor, nintendo_super_nes]\r\n    ImageExtensions: [7z, bs, fig, gb, gbc, sfc, smc, swc, zip]\r\n    ProfileFiles: ['cores\\mesen-s_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Meteor\r\n    StartupArguments: '-L \".\\cores\\meteor_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboyadvance]\r\n    ImageExtensions: [7z, gba, zip]\r\n    ProfileFiles: ['cores\\meteor_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: mGBA\r\n    StartupArguments: '-L \".\\cores\\mgba_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboyadvance, nintendo_gameboycolor]\r\n    ImageExtensions: [7z, gb, gba, gbc, zip]\r\n    ProfileFiles: ['cores\\mgba_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Mupen64Plus-Next\r\n    StartupArguments: '-L \".\\cores\\mupen64plus_next_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_64]\r\n    ImageExtensions: [7z, bin, n64, ndd, u1, v64, z64, zip]\r\n    ProfileFiles: ['cores\\mupen64plus_next_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Mupen64Plus-Next - Nintendo - Nintendo 64 (Mupen64Plus-Next GLES2)\r\n    StartupArguments: '-L \".\\cores\\mupen64plus_next_gles2_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_64]\r\n    ImageExtensions: [7z, bin, n64, ndd, u1, v64, z64, zip]\r\n    ProfileFiles: ['cores\\mupen64plus_next_gles2_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Mupen64Plus-Next (Develop)\r\n    StartupArguments: '-L \".\\cores\\mupen64plus_next_develop_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_64]\r\n    ImageExtensions: [7z, bin, n64, ndd, u1, v64, z64, zip]\r\n    ProfileFiles: ['cores\\mupen64plus_next_develop_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Mupen64Plus-Next GLES3\r\n    StartupArguments: '-L \".\\cores\\mupen64plus_next_gles3_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_64]\r\n    ImageExtensions: [7z, bin, n64, ndd, u1, v64, z64, zip]\r\n    ProfileFiles: ['cores\\mupen64plus_next_gles3_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Neko Project II\r\n    StartupArguments: '-L \".\\cores\\nekop2_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nec_pc98]\r\n    ImageExtensions: [2hd, 7z, 88d, 98d, cmd, d88, d98, dup, fdd, fdi, hdd, hdi, hdm, nhd, tfd, thd, xdf, zip]\r\n    ProfileFiles: ['cores\\nekop2_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Neko Project II Kai\r\n    StartupArguments: '-L \".\\cores\\np2kai_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nec_pc98]\r\n    ImageExtensions: [2hd, 7z, 88d, 98d, cmd, d88, d98, dup, fdd, fdi, hdd, hdi, hdm, hdn, nhd, tfd, thd, xdf, zip]\r\n    ProfileFiles: ['cores\\np2kai_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: NeoCD\r\n    StartupArguments: '-L \".\\cores\\neocd_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [snk_neogeo_cd]\r\n    ImageExtensions: [7z, chd, cue, zip]\r\n    ProfileFiles: ['cores\\neocd_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: nes\r\n    StartupArguments: '-L \".\\cores\\nes_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [7z, nes, zip]\r\n    ProfileFiles: ['cores\\nes_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Nestopia\r\n    StartupArguments: '-L \".\\cores\\nestopia_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_famicom_disk, nintendo_nes]\r\n    ImageExtensions: [7z, fds, nes, unf, unif, zip]\r\n    ProfileFiles: ['cores\\nestopia_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: NooDS\r\n    StartupArguments: '-L \".\\cores\\noods_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_ds]\r\n    ImageExtensions: [7z, nds, zip]\r\n    ProfileFiles: ['cores\\noods_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: nSide (Super Famicom Balanced)\r\n    StartupArguments: '-L \".\\cores\\higan_sfc_balanced_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor, nintendo_super_nes]\r\n    ImageExtensions: [7z, bml, gb, gbc, rom, sfc, smc, zip]\r\n    ProfileFiles: ['cores\\higan_sfc_balanced_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Opera\r\n    StartupArguments: '-L \".\\cores\\opera_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [3do]\r\n    ImageExtensions: [7z, bin, chd, cue, iso, zip]\r\n    ProfileFiles: ['cores\\opera_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Panda3DS\r\n    StartupArguments: '-L \".\\cores\\panda3ds_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_3ds]\r\n    ImageExtensions: [3ds, 3dsx, 7z, app, axf, cci, cxi, elf, zip]\r\n    ProfileFiles: ['cores\\panda3ds_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: ParaLLEl (Debug)\r\n    StartupArguments: '-L \".\\cores\\parallel_n64_debug_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_64]\r\n    ImageExtensions: [7z, bin, n64, ndd, u1, v64, z64, zip]\r\n    ProfileFiles: ['cores\\parallel_n64_debug_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: ParaLLEl N64\r\n    StartupArguments: '-L \".\\cores\\parallel_n64_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_64]\r\n    ImageExtensions: [7z, bin, n64, ndd, u1, v64, z64, zip]\r\n    ProfileFiles: ['cores\\parallel_n64_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PCem\r\n    StartupArguments: '-L \".\\cores\\pcem_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [pc_dos]\r\n    ImageExtensions: [7z, bat, com, conf, exe, zip]\r\n    ProfileFiles: ['cores\\pcem_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PCSX ReARMed [Interpreter]\r\n    StartupArguments: '-L \".\\cores\\pcsx_rearmed_interpreter_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [7z, bin, cbn, chd, cue, img, mdf, pbp, toc, zip]\r\n    ProfileFiles: ['cores\\pcsx_rearmed_interpreter_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PCSX ReARMed [NEON]\r\n    StartupArguments: '-L \".\\cores\\pcsx_rearmed_libretro_neon.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [7z, bin, cbn, chd, cue, img, m3u, mdf, pbp, toc, zip]\r\n    ProfileFiles: ['cores\\pcsx_rearmed_libretro_neon.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PCSX ReARMed [NEON] - Sony - PlayStation (PCSX ReARMed) [NEON]\r\n    StartupArguments: '-L \".\\cores\\pcsx_rearmed_neon_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [7z, bin, cbn, chd, cue, img, m3u, mdf, pbp, toc, zip]\r\n    ProfileFiles: ['cores\\pcsx_rearmed_neon_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PCSX-ReARMed\r\n    StartupArguments: '-L \".\\cores\\pcsx_rearmed_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [7z, bin, cbn, ccd, chd, cue, exe, img, iso, m3u, mdf, pbp, toc, zip]\r\n    ProfileFiles: ['cores\\pcsx_rearmed_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PCSX1\r\n    StartupArguments: '-L \".\\cores\\pcsx1_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [7z, bin, cbn, cue, img, m3u, mdf, pbp, toc, zip]\r\n    ProfileFiles: ['cores\\pcsx1_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PCSX2\r\n    StartupArguments: '-L \".\\cores\\pcsx2_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation2]\r\n    ImageExtensions: [7z, bin, chd, ciso, cso, cue, dump, elf, gz, img, iso, m3u, mdf, nrg, zip]\r\n    ProfileFiles: ['cores\\pcsx2_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PicoDrive\r\n    StartupArguments: '-L \".\\cores\\picodrive_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_32x, sega_cd, sega_genesis, sega_mastersystem]\r\n    ImageExtensions: [32x, 68k, 7z, bin, chd, cue, gen, gg, iso, m3u, md, pco, sc, sg, sgd, smd, sms, zip]\r\n    ProfileFiles: ['cores\\picodrive_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Play!\r\n    StartupArguments: '-L \".\\cores\\play_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation2]\r\n    ImageExtensions: [7z, chd, cso, cue, elf, iso, isz, zip]\r\n    ProfileFiles: ['cores\\play_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Potator\r\n    StartupArguments: '-L \".\\cores\\potator_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [watara_supervision]\r\n    ImageExtensions: [7z, bin, sv, zip]\r\n    ProfileFiles: ['cores\\potator_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PPSSPP\r\n    StartupArguments: '-L \".\\cores\\ppsspp_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_psp]\r\n    ImageExtensions: [7z, chd, cso, elf, iso, pbp, prx, zip]\r\n    ProfileFiles: ['cores\\ppsspp_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: ProSystem\r\n    StartupArguments: '-L \".\\cores\\prosystem_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [atari_7800]\r\n    ImageExtensions: [7z, a78, bin, cdf, zip]\r\n    ProfileFiles: ['cores\\prosystem_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PUAE\r\n    StartupArguments: '-L \".\\cores\\puae_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_amiga]\r\n    ImageExtensions: [7z, adf, adz, ccd, chd, cue, dms, fdi, hdf, hdz, info, ipf, iso, lha, m3u, mds, nrg, rp9, slave, uae, zip]\r\n    ProfileFiles: ['cores\\puae_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PUAE 2021\r\n    StartupArguments: '-L \".\\cores\\puae2021_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_amiga]\r\n    ImageExtensions: [7z, adf, adz, ccd, chd, cue, dms, fdi, hdf, hdz, info, ipf, iso, lha, m3u, mds, nrg, rp9, slave, uae, zip]\r\n    ProfileFiles: ['cores\\puae2021_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: PX68k\r\n    StartupArguments: '-L \".\\cores\\px68k_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sharp_x68000]\r\n    ImageExtensions: [2hd, 7z, 88d, cmd, d88, dim, dup, hdf, hdm, img, m3u, xdf, zip]\r\n    ProfileFiles: ['cores\\px68k_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: QuickNES\r\n    StartupArguments: '-L \".\\cores\\quicknes_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [7z, nes, zip]\r\n    ProfileFiles: ['cores\\quicknes_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: RACE\r\n    StartupArguments: '-L \".\\cores\\race_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [snk_neogeopocket, snk_neogeopocket_color]\r\n    ImageExtensions: [7z, ngc, ngp, ngpc, npc, zip]\r\n    ProfileFiles: ['cores\\race_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Redream\r\n    StartupArguments: '-L \".\\cores\\redream_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_dreamcast]\r\n    ImageExtensions: [7z, cdi, chd, gdi, zip]\r\n    ProfileFiles: ['cores\\redream_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: RetroDream\r\n    StartupArguments: '-L \".\\cores\\retrodream_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_dreamcast]\r\n    ImageExtensions: [7z, cdi, chd, gdi, zip]\r\n    ProfileFiles: ['cores\\retrodream_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Rustation\r\n    StartupArguments: '-L \".\\cores\\rustation_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [7z, ccd, cue, exe, m3u, toc, zip]\r\n    ProfileFiles: ['cores\\rustation_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: SameBoy\r\n    StartupArguments: '-L \".\\cores\\sameboy_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor]\r\n    ImageExtensions: [7z, gb, gbc, zip]\r\n    ProfileFiles: ['cores\\sameboy_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Sinclair ZX 81\r\n    StartupArguments: '-L \".\\cores\\81_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sinclair_zx81]\r\n    ImageExtensions: [7z, p, t81, tzx, zip]\r\n    ProfileFiles: ['cores\\81_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: SMS Plus GX\r\n    StartupArguments: '-L \".\\cores\\smsplus_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [coleco_vision, sega_gamegear, sega_mastersystem, sega_sg1000]\r\n    ImageExtensions: [7z, bin, col, gg, rom, sg, sms, zip]\r\n    ProfileFiles: ['cores\\smsplus_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Snes9x\r\n    StartupArguments: '-L \".\\cores\\snes9x_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bs, fig, sfc, smc, st, swc, zip]\r\n    ProfileFiles: ['cores\\snes9x_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Snes9x 2002\r\n    StartupArguments: '-L \".\\cores\\snes9x2002_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bsx, dx2, fig, gd3, gd7, sfc, smc, swc, zip]\r\n    ProfileFiles: ['cores\\snes9x2002_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Snes9x 2005\r\n    StartupArguments: '-L \".\\cores\\snes9x2005_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bsx, dx2, fig, gd3, gd7, sfc, smc, swc, zip]\r\n    ProfileFiles: ['cores\\snes9x2005_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Snes9x 2005 Plus\r\n    StartupArguments: '-L \".\\cores\\snes9x2005_plus_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bsx, dx2, fig, gd3, gd7, sfc, smc, swc, zip]\r\n    ProfileFiles: ['cores\\snes9x2005_plus_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Snes9x 2010\r\n    StartupArguments: '-L \".\\cores\\snes9x2010_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [7z, bsx, dx2, fig, gd3, gd7, sfc, smc, swc, zip]\r\n    ProfileFiles: ['cores\\snes9x2010_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Stella\r\n    StartupArguments: '-L \".\\cores\\stella_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [atari_2600]\r\n    ImageExtensions: [7z, a26, bin, zip]\r\n    ProfileFiles: ['cores\\stella_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Stella 2014\r\n    StartupArguments: '-L \".\\cores\\stella2014_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [atari_2600]\r\n    ImageExtensions: [7z, a26, bin, zip]\r\n    ProfileFiles: ['cores\\stella2014_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Stella 2023\r\n    StartupArguments: '-L \".\\cores\\stella2023_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [atari_2600]\r\n    ImageExtensions: [7z, a26, bin, zip]\r\n    ProfileFiles: ['cores\\stella2023_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: SwanStation\r\n    StartupArguments: '-L \".\\cores\\swanstation_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [7z, bin, chd, cue, ecm, exe, img, iso, m3u, mds, pbp, psexe, psf, zip]\r\n    ProfileFiles: ['cores\\swanstation_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: TempGBA\r\n    StartupArguments: '-L \".\\cores\\tempgba_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboyadvance]\r\n    ImageExtensions: [7z, agb, bin, gba, gbz, zip]\r\n    ProfileFiles: ['cores\\tempgba_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: TGB Dual\r\n    StartupArguments: '-L \".\\cores\\tgbdual_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor]\r\n    ImageExtensions: [7z, cgb, dmg, gb, gbc, sgb, zip]\r\n    ProfileFiles: ['cores\\tgbdual_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: theodore\r\n    StartupArguments: '-L \".\\cores\\theodore_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [thomson_mo5, thomson_to7]\r\n    ImageExtensions: [7z, fd, k7, m5, m7, rom, sap, zip]\r\n    ProfileFiles: ['cores\\theodore_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: UAE4ARM\r\n    StartupArguments: '-L \".\\cores\\uae4arm_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_amiga]\r\n    ImageExtensions: [7z, adf, adz, ccd, cue, dms, hdf, ipf, iso, lha, uae, wrp, zip]\r\n    ProfileFiles: ['cores\\uae4arm_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: VBA Next\r\n    StartupArguments: '-L \".\\cores\\vba_next_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboyadvance]\r\n    ImageExtensions: [7z, gba, zip]\r\n    ProfileFiles: ['cores\\vba_next_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: VBA-M\r\n    StartupArguments: '-L \".\\cores\\vbam_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboyadvance, nintendo_gameboycolor]\r\n    ImageExtensions: [7z, cgb, dmg, gb, gba, gbc, sgb, zip]\r\n    ProfileFiles: ['cores\\vbam_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: vecx\r\n    StartupArguments: '-L \".\\cores\\vecx_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [vectrex]\r\n    ImageExtensions: [7z, bin, vec, zip]\r\n    ProfileFiles: ['cores\\vecx_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: VICE SDL\r\n    StartupArguments: '-L \".\\cores\\x64sdl_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_64]\r\n    ImageExtensions: [7z, bin, crt, d64, d6z, d71, d7z, d80, d81, d82, d8z, g41, g4z, g64, g6z, gz, p00, prg, t64, tap, x64, x6z, zip]\r\n    ProfileFiles: ['cores\\x64sdl_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: VICE x128\r\n    StartupArguments: '-L \".\\cores\\vice_x128_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_64]\r\n    ImageExtensions: [7z, bin, cmd, crt, d2m, d4m, d64, d6z, d71, d7z, d80, d81, d82, d8z, g41, g4z, g64, g6z, gz, m3u, nbz, nib, p00, prg, t64, tap, vfl, vsf, x64, x6z, zip]\r\n    ProfileFiles: ['cores\\vice_x128_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: VICE x64\r\n    StartupArguments: '-L \".\\cores\\vice_x64_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_64]\r\n    ImageExtensions: [7z, bin, cmd, crt, d2m, d4m, d64, d6z, d71, d7z, d80, d81, d82, d8z, g41, g4z, g64, g6z, gz, m3u, nbz, nib, p00, prg, t64, tap, vfl, vsf, x64, x6z, zip]\r\n    ProfileFiles: ['cores\\vice_x64_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: VICE x64sc\r\n    StartupArguments: '-L \".\\cores\\vice_x64sc_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_64]\r\n    ImageExtensions: [7z, bin, cmd, crt, d2m, d4m, d64, d6z, d71, d7z, d80, d81, d82, d8z, g41, g4z, g64, g6z, gz, m3u, nbz, nib, p00, prg, t64, tap, vfl, vsf, x64, x6z, zip]\r\n    ProfileFiles: ['cores\\vice_x64sc_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: VICE xcbm2\r\n    StartupArguments: '-L \".\\cores\\vice_xcbm2_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_cbm2]\r\n    ImageExtensions: [7z, bin, cmd, crt, d2m, d4m, d64, d6z, d71, d7z, d80, d81, d82, d8z, g41, g4z, g64, g6z, gz, m3u, nbz, nib, p00, prg, t64, tap, vfl, vsf, x64, x6z, zip]\r\n    ProfileFiles: ['cores\\vice_xcbm2_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: VICE xcbm5x0\r\n    StartupArguments: '-L \".\\cores\\vice_xcbm5x0_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_cbm5x0]\r\n    ImageExtensions: [7z, bin, cmd, crt, d2m, d4m, d64, d6z, d71, d7z, d80, d81, d82, d8z, g41, g4z, g64, g6z, gz, m3u, nbz, nib, p00, prg, t64, tap, vfl, vsf, x64, x6z, zip]\r\n    ProfileFiles: ['cores\\vice_xcbm5x0_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: VICE xpet\r\n    StartupArguments: '-L \".\\cores\\vice_xpet_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_pet]\r\n    ImageExtensions: [7z, bin, cmd, crt, d2m, d4m, d64, d6z, d71, d7z, d80, d81, d82, d8z, g41, g4z, g64, g6z, gz, m3u, nbz, nib, p00, prg, t64, tap, vfl, vsf, x64, x6z, zip]\r\n    ProfileFiles: ['cores\\vice_xpet_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: VICE xscpu64\r\n    StartupArguments: '-L \".\\cores\\vice_xscpu64_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_64]\r\n    ImageExtensions: [7z, bin, cmd, crt, d2m, d4m, d64, d6z, d71, d7z, d80, d81, d82, d8z, g41, g4z, g64, g6z, gz, m3u, nbz, nib, p00, prg, t64, tap, vfl, vsf, x64, x6z, zip]\r\n    ProfileFiles: ['cores\\vice_xscpu64_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: VICE xvic\r\n    StartupArguments: '-L \".\\cores\\vice_xvic_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [commodore_vci20]\r\n    ImageExtensions: [20, 40, 60, 7z, a0, b0, bin, cmd, crt, d2m, d4m, d64, d6z, d71, d7z, d80, d81, d82, d8z, g41, g4z, g64, g6z, gz, m3u, nbz, nib, p00, prg, rom, t64, tap, vfl, vsf, x64, x6z, zip]\r\n    ProfileFiles: ['cores\\vice_xvic_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Virtual Jaguar\r\n    StartupArguments: '-L \".\\cores\\virtualjaguar_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [atari_jaguar]\r\n    ImageExtensions: [7z, abs, bin, cof, j64, jag, prg, rom, zip]\r\n    ProfileFiles: ['cores\\virtualjaguar_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: virtualxt\r\n    StartupArguments: '-L \".\\cores\\virtualxt_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [pc_dos]\r\n    ImageExtensions: [7z, img, zip]\r\n    ProfileFiles: ['cores\\virtualxt_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: YabaSanshiro\r\n    StartupArguments: '-L \".\\cores\\yabasanshiro_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_saturn]\r\n    ImageExtensions: [7z, bin, ccd, chd, cue, iso, mds, zip]\r\n    ProfileFiles: ['cores\\yabasanshiro_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n\r\n  - Name: Yabause\r\n    StartupArguments: '-L \".\\cores\\yabause_libretro.dll\" \"{ImagePath}\"'\r\n    Platforms: [sega_saturn]\r\n    ImageExtensions: [7z, bin, ccd, chd, cue, iso, m3u, mds, zip]\r\n    ProfileFiles: ['cores\\yabause_libretro.dll']\r\n    StartupExecutable: ^retroarch\\.exe$\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/RosaliesMupenGui/emulator.yaml",
    "content": "Id: rosaliesmupengui\nName: Rosalie's Mupen GUI\nWebsite: 'https://github.com/Rosalie241/RMG'\nProfiles:\n  - Name: Default\n    StartupArguments: '--fullscreen --quit-after-emulation \"{ImagePath}\"'\n    ImageExtensions: [n64, z64, v64, ndd, d64, zip]\n    Platforms: [nintendo_64]\n    StartupExecutable: ^RMG\\.exe$\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Ruffle/emulator.yaml",
    "content": "Id: ruffle\r\nName: Ruffle\r\nWebsite: 'https://ruffle.rs/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [adobe_flash]\r\n    ImageExtensions: [swf]\r\n    StartupExecutable: ^ruffle\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Ryujinx/emulator.yaml",
    "content": "Id: ryujinx\r\nName: Ryujinx\r\nWebsite: 'https://ryujinx.org/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_switch]\r\n    ImageExtensions: [xci, nsp]\r\n    StartupExecutable: ^ryujinx\\.exe$\r\n  - Name: Avalonia\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_switch]\r\n    ImageExtensions: [xci, nsp]\r\n    StartupExecutable: ^ryujinx\\.ava\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/SameBoy/emulator.yaml",
    "content": "Id: sameboy\r\nName: SameBoy\r\nWebsite: 'https://sameboy.github.io/'\r\nProfiles:\r\n  - Name: Nintendo - Game Boy\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy]\r\n    ImageExtensions: [gb]\r\n    StartupExecutable: ^sameboy\\.exe$\r\n\r\n  - Name: Nintendo - Game Boy Color\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboycolor]\r\n    ImageExtensions: [gbc]\r\n    StartupExecutable: ^sameboy\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/ScummVM/emulator.yaml",
    "content": "Id: scummvm\r\nName: ScummVM\r\nWebsite: 'https://www.scummvm.org/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '-f {ImageName}'\r\n    Platforms: [pc_dos, pc_windows]\r\n    StartupExecutable: ^scummvm\\.exe$\r\n    ScriptGameImport: true"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/ScummVM/importGames.ps1",
    "content": "param(\r\n    $ImportArgs\r\n)\r\n\r\nfunction Get-IniContent()\r\n{\r\n    param(\r\n        $filePath\r\n    )\r\n\r\n    $ini = @{}\r\n    switch -regex -file $FilePath\r\n    {\r\n        \"^\\[(.+)\\]\" # Section\r\n        {\r\n            $section = $matches[1]\r\n            $ini[$section] = @{}\r\n            $CommentCount = 0\r\n        }\r\n        \"^(;.*)$\" # Comment\r\n        {\r\n            $value = $matches[1]\r\n            $CommentCount = $CommentCount + 1\r\n            $name = \"Comment\" + $CommentCount\r\n            $ini[$section][$name] = $value\r\n        } \r\n        \"(.+?)\\s*=(.*)\" # Key\r\n        {\r\n            $name,$value = $matches[1..2]\r\n            $ini[$section][$name] = $value\r\n        }\r\n    }\r\n\r\n    return $ini\r\n}\r\n\r\n#switch the below $scummvmConfig lines to change the default and fallback scan directories.\r\n$scummvmConfig = Join-Path $ImportArgs.ScanDirectory \"scummvm.ini\" #Import Directory\r\nif (!(Test-Path $scummvmConfig))\r\n{\r\n    $scummvmConfig = Join-Path $env:APPDATA \"ScummVM\\scummvm.ini\" #Default (appdata) directory\r\n    if (!(Test-Path $scummvmConfig))\r\n    {\r\n        $ImportArgs.PlayniteApi.Dialogs.ShowErrorMessage(\"Couldn't find ScummVM config file at $scummvmConfig\", \"\") | Out-Null\r\n        return\r\n    }\r\n}\r\n\r\n$config = Get-IniContent $scummvmConfig\r\nforeach ($key in $config.Keys)\r\n{\r\n    if ($config[$key].gameid)\r\n    {\r\n        $romPath = Join-Path $config[$key].path $key\r\n        if (-not [System.IO.Path]::IsPathRooted($romPath)) # Check if it's a relative path\r\n        {\r\n            $romPath = Join-Path $ImportArgs.ScanDirectory $romPath\r\n        }\r\n\t\t\r\n        $anyFunc = [Func[string,bool]]{ param($a) [System.IO.Path]::GetFullPath($a) -ieq [System.IO.Path]::GetFullPath($romPath) }\t\r\n        if ([System.Linq.Enumerable]::Any($ImportArgs.ImportedFiles, $anyFunc))\r\n        {\r\n            continue\r\n        }\r\n\r\n        $scannedGame = New-Object \"Playnite.Emulators.ScriptScannedGame\"\r\n        $scannedGame.Name = ($config[$key].description -replace \"\\(.*\\)\").Trim()\r\n        $scannedGame.Path = $romPath\r\n        $scannedGame\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Snes9X/emulator.yaml",
    "content": "Id: snes9x\r\nName: Snes9X\r\nWebsite: 'http://www.snes9x.com/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\" -fullscreen'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [zip, gz, jma, sfc, smc]\r\n    StartupExecutable: ^snes9x.*\\.exe$\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Stella/emulator.yaml",
    "content": "Id: stella\r\nName: Stella\r\nWebsite: 'https://stella-emu.github.io/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '-fullscreen 1 \"{ImagePath}\"'\r\n    Platforms: [atari_2600]\r\n    ImageExtensions: [bin, a26, zip]\r\n    StartupExecutable: ^Stella\\.exe$\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/VirtualJaguar/emulator.yaml",
    "content": "Id: virtualjaguar\r\nName: Virtual Jaguar\r\nWebsite: 'https://icculus.org/virtualjaguar/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\" --fullscreen'\r\n    Platforms: [atari_jaguar]\r\n    ImageExtensions: [abs, rom, jag, bin]\r\n    StartupExecutable: ^virtualjaguar\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/VisualBoyAdvance/emulator.yaml",
    "content": "Id: visualboyadvance\r\nName: VisualBoyAdvance\r\nWebsite: 'https://sourceforge.net/projects/vba/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor, nintendo_gameboyadvance]\r\n    ImageExtensions: [zip, 7z, rar, bin, elf, mb, gba, agb, dmg, gb, gbc, cgb, sgb]\r\n    StartupExecutable: ^visualboyadvance\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/VisualBoyAdvance-M/emulator.yaml",
    "content": "Id: visualboyadvance-m\r\nName: VisualBoyAdvance-M\r\nWebsite: 'https://vba-m.com/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy, nintendo_gameboycolor, nintendo_gameboyadvance]\r\n    ImageExtensions: [zip, 7z, rar, bin, elf, mb, gba, agb, dmg, gb, gbc, cgb, sgb]\r\n    StartupExecutable: ^visualboyadvance-m\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Vita3K/emulator.yaml",
    "content": "Id: vita3k\r\nName: Vita3K\r\nWebsite: 'https://vita3k.org/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sony_vita]\r\n    ImageExtensions: [vpk]\r\n    StartupExecutable: ^Vita3K.*\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/WinUAE/emulator.yaml",
    "content": "Id: winuae\r\nName: WinUAE\r\nWebsite: 'http://www.winuae.net/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '-s use_gui=no -s gfx_fullscreen_amiga=true -0 \"{ImagePath}\"'\r\n    Platforms: [commodore_amiga]\r\n    ImageExtensions: [iso, ccd, cue, chd, mds, nrg, adf, adz, gz, dms, ipf, scp, fdi, lha]\r\n    StartupExecutable: ^winuae.*\\.exe$\r\n\r\n  - Name: Amiga CD32\r\n    StartupArguments: '-s use_gui=no -s gfx_fullscreen_amiga=true -s quickstart=cd32,0 -cdimage=\"{ImagePath}\"'\r\n    Platforms: [commodore_amiga_cd32]\r\n    ImageExtensions: [cue, chd, iso, ccd, mds, nrg]\r\n    StartupExecutable: ^winuae.*\\.exe$\r\n\r\n  - Name: Amiga 500\r\n    StartupArguments: '-s use_gui=no -s gfx_fullscreen_amiga=true -s quickstart=a500,0 -0 \"{ImagePath}\"'\r\n    Platforms: [commodore_amiga]\r\n    ImageExtensions: [adf, adz, gz, dms, ipf, scp, fdi, lha]\r\n    StartupExecutable: ^winuae.*\\.exe$\r\n\r\n  - Name: Amiga 1200\r\n    StartupArguments: '-s use_gui=no -s gfx_fullscreen_amiga=true -s quickstart=a1200,0 -0 \"{ImagePath}\"'\r\n    Platforms: [commodore_amiga]\r\n    ImageExtensions: [iso, ccd, cue, chd, mds, nrg, adf, adz, gz, dms, ipf, scp, fdi, lha]\r\n    StartupExecutable: ^winuae.*\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/WinVice/emulator.yaml",
    "content": "Id: winvice\r\nName: WinVice\r\nWebsite: 'https://vice-emu.sourceforge.io/'\r\nProfiles:      \r\n  - Name: Commodore 128\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [commodore_64]\r\n    ImageExtensions: [d64, d71, d80, d81, d82, g64, g41, x64, d1m, d2m, d4m, p64, t64, tap, prg, p00, crt, bin, zip, gz, d6z, d7z, d8z, g6z, g4z, x6z]\r\n    StartupExecutable: ^x128\\.exe$\r\n\r\n  - Name: Commodore 64\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [commodore_64]\r\n    ImageExtensions: [d64, d71, d80, d81, d82, g64, g41, x64, d1m, d2m, d4m, p64, t64, tap, prg, p00, crt, bin, zip, gz, d6z, d7z, d8z, g6z, g4z, x6z]\r\n    StartupExecutable: ^x64\\.exe$\r\n\r\n  - Name: Commodore 64 (accurate)\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [commodore_64]\r\n    ImageExtensions: [d64, d71, d80, d81, d82, g64, g41, x64, d1m, d2m, d4m, p64, t64, tap, prg, p00, crt, bin, zip, gz, d6z, d7z, d8z, g6z, g4z, x6z]\r\n    StartupExecutable: ^x64sc\\.exe$\r\n\r\n  - Name: Commodore PLUS4\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [commodore_plus4]\r\n    ImageExtensions: [d64, d71, d80, d81, d82, g64, g41, x64,  d1m, d2m, d4m, p64, t64, tap, prg, p00, crt, bin, zip, gz, d6z, d7z, d8z, g6z, g4z, x6z]\r\n    StartupExecutable: ^xplus4\\.exe$\r\n\r\n  - Name: Commodore VIC20\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [commodore_vci20]\r\n    ImageExtensions: [d64, d71, d80, d81, d82, g64, g41, x64, d1m, d2m, d4m, p64, t64, tap, prg, p00, crt, bin, zip, gz, d6z, d7z, d8z, g6z, g4z, x6z]\r\n    StartupExecutable: ^xvic\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Xemu/emulator.yaml",
    "content": "Id: xemu\r\nName: Xemu\r\nWebsite: 'https://xemu.app/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '-dvd_path \"{ImagePath}\" -full-screen'\r\n    Platforms: [xbox]\r\n    ImageExtensions: [iso, xiso]\r\n    StartupExecutable: ^xemu\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Xenia/emulator.yaml",
    "content": "Id: xenia\r\nName: Xenia\r\nWebsite: 'https://xenia.jp/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [xbox360]\r\n    ImageExtensions: [iso, xex, cci, cxi, elf, zar, <none>]\r\n    StartupExecutable: ^xenia\\.exe$\r\n  - Name: Canary\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [xbox360]\r\n    ImageExtensions: [iso, xex, cci, cxi, elf, zar, <none>]\r\n    StartupExecutable: ^xenia_canary\\.exe$\r\n"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Yabuse/emulator.yaml",
    "content": "Id: yabuse\r\nName: Yabause\r\nWebsite: 'https://yabause.org/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '--iso=\"{ImagePath}\"'\r\n    Platforms: [sega_saturn]\r\n    ImageExtensions: [iso, cue, bin, mds]\r\n    StartupExecutable: ^yabause.*\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/Ymir/emulator.yaml",
    "content": "Id: ymir\nName: Ymir\nWebsite: 'https://github.com/StrikerX3/Ymir'\nProfiles:\n  - Name: Default\n    Platforms: [sega_saturn]\n    StartupArguments: '-d \"{ImagePath}\" -f'\n    ImageExtensions: [chd, cue, ccd, mdf, iso]\n    StartupExecutable: ^ymir-sdl3\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/ZSNES/emulator.yaml",
    "content": "Id: zsnes\r\nName: ZSNES\r\nWebsite: 'https://www.zsnes.com/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [zip, smc, sfc, swc, fig, mgd, mgh, ufo, bin, gd3, gd7, dx2, usa, eur, jap, aus, st, bs, 048, 058, 078]\r\n    StartupExecutable: ^zsnesw\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/ares/emulator.yaml",
    "content": "Id: ares\nName: ares\nWebsite: 'https://ares-emu.net/'\nProfiles:\n  - Name: Atari - Atari 2600\n    StartupArguments: '--system \"Atari 2600\" \"{ImagePath}\" --fullscreen'\n    Platforms: [atari_2600]\n    ImageExtensions: [zip, a26]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Bandai - WonderSwan\n    StartupArguments: '--system \"WonderSwan\" \"{ImagePath}\" --fullscreen'\n    Platforms: [bandai_wonderswan]\n    ImageExtensions: [zip, ws]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Bandai - WonderSwan Color\n    StartupArguments: '--system \"WonderSwan Color\" \"{ImagePath}\" --fullscreen'\n    Platforms: [bandai_wonderswan_color]\n    ImageExtensions: [zip, wsc]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Coleco - ColecoVision\n    StartupArguments: '--system \"ColecoVision\" \"{ImagePath}\" --fullscreen'\n    Platforms: [coleco_vision]\n    ImageExtensions: [zip, cv, col]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Microsoft - MSX\n    StartupArguments: '--system \"MSX\" \"{ImagePath}\" --fullscreen'\n    Platforms: [microsoft_msx]\n    ImageExtensions: [zip, msx]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Microsoft - MSX2\n    StartupArguments: '--system \"MSX2\" \"{ImagePath}\" --fullscreen'\n    Platforms: [microsoft_msx2]\n    ImageExtensions: [zip, msx2]\n    StartupExecutable: ^ares\\.exe$\n  - Name: NEC - PC Engine\n    StartupArguments: '--system \"PC Engine\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nec_turbografx_16]\n    ImageExtensions: [zip, pce]\n    StartupExecutable: ^ares\\.exe$\n  - Name: NEC - PC Engine CD\n    StartupArguments: '--system \"PC Engine CD\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nec_turbografx_cd]\n    ImageExtensions: [cue, chd]\n    StartupExecutable: ^ares\\.exe$\n  - Name: NEC - SuperGrafx\n    StartupArguments: '--system \"SuperGrafx\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nec_supergrafx]\n    ImageExtensions: [zip, sgx]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Nintendo - Nintendo 64\n    StartupArguments: '--system \"Nintendo 64\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nintendo_64]\n    ImageExtensions: [zip, n64, v64, z64]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Nintendo - Nintendo 64DD\n    StartupArguments: '--system \"Nintendo 64DD\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nintendo_64]\n    ImageExtensions: [zip, n64dd, ndd]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Nintendo - Game Boy\n    StartupArguments: '--system \"Game Boy\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nintendo_gameboy]\n    ImageExtensions: [zip, gb]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Nintendo - Game Boy Advance\n    StartupArguments: '--system \"Game Boy Advance\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nintendo_gameboyadvance]\n    ImageExtensions: [zip, gba]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Nintendo - Game Boy Color\n    StartupArguments: '--system \"Game Boy Color\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nintendo_gameboycolor]\n    ImageExtensions: [zip, gbc]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Nintendo - Famicom\n    StartupArguments: '--system \"Famicom\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nintendo_nes]\n    ImageExtensions: [zip, fc, nes, unf, unif]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Nintendo - Famicom Disk System\n    StartupArguments: '--system \"Famicom Disk System\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nintendo_nes]\n    ImageExtensions: [zip, fds]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Nintendo - Sufami Turbo\n    StartupArguments: '--system \"Sufami Turbo\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nintendo_super_nes]\n    ImageExtensions: [zip, st]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Nintendo - Super Famicom\n    StartupArguments: '--system \"Super Famicom\" \"{ImagePath}\" --fullscreen'\n    Platforms: [nintendo_super_nes]\n    ImageExtensions: [zip, sfc, smc, swc, fig]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Sega - Game Gear\n    StartupArguments: '--system \"Game Gear\" \"{ImagePath}\" --fullscreen'\n    Platforms: [sega_gamegear]\n    ImageExtensions: [zip, gg]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Sega - Master System\n    StartupArguments: '--system \"Master System\" \"{ImagePath}\" --fullscreen'\n    Platforms: [sega_mastersystem]\n    ImageExtensions: [zip, ms, sms]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Sega - Mega 32X\n    StartupArguments: '--system \"Mega 32X\" \"{ImagePath}\" --fullscreen'\n    Platforms: [sega_32x]\n    ImageExtensions: [zip, 32X]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Sega - Mega CD\n    StartupArguments: '--system \"Mega CD\" \"{ImagePath}\" --fullscreen'\n    Platforms: [sega_cd]\n    ImageExtensions: [cue, chd]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Sega - Mega Drive\n    StartupArguments: '--system \"Mega Drive\" \"{ImagePath}\" --fullscreen'\n    Platforms: [sega_genesis]\n    ImageExtensions: [zip, md, smd, gen, bin]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Sega - Saturn\n    StartupArguments: '--system \"Saturn\" \"{ImagePath}\" --fullscreen'\n    Platforms: [sega_saturn]\n    ImageExtensions: [cue, chd]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Sega - SG-1000\n    StartupArguments: '--system \"SG-1000\" \"{ImagePath}\" --fullscreen'\n    Platforms: [sega_sg1000]\n    ImageExtensions: [sg1000, sg, zip]\n    StartupExecutable: ^ares\\.exe$\n  - Name: SNK - Neo Geo AES\n    StartupArguments: '--system \"Neo Geo\" \"{ImagePath}\" --fullscreen'\n    Platforms: [snk_neogeo_aes]\n    ImageExtensions: [zip, ng]\n    StartupExecutable: ^ares\\.exe$\n  - Name: SNK - Neo Geo Pocket\n    StartupArguments: '--system \"Neo Geo Pocket\" \"{ImagePath}\" --fullscreen'\n    Platforms: [snk_neogeopocket]\n    ImageExtensions: [zip, ngp]\n    StartupExecutable: ^ares\\.exe$\n  - Name: SNK - Neo Geo Pocket Color\n    StartupArguments: '--system \"Neo Geo Pocket Color\" \"{ImagePath}\" --fullscreen'\n    Platforms: [snk_neogeopocket_color]\n    ImageExtensions: [zip, ngpc, ngc]\n    StartupExecutable: ^ares\\.exe$\n  - Name: Sony - PlayStation\n    StartupArguments: '--system \"PlayStation\" \"{ImagePath}\" --fullscreen'\n    Platforms: [sony_playstation]\n    ImageExtensions: [cue, chd, exe]\n    StartupExecutable: ^ares\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/blueMSX/emulator.yaml",
    "content": "Id: bluemsx\nName: blueMSX\nWebsite: 'http://bluemsx.msxblue.com/index.htm'\nProfiles:\n  - Name: ColecoVision\n    StartupArguments: '/rom1 \"{ImagePath}\" /fullscreen /machine \"COL - ColecoVision\"'\n    Platforms: [coleco_vision]\n    ImageExtensions: [zip, col]\n    StartupExecutable: ^blueMSX\\.exe$\n  - Name: MSX\n    StartupArguments: '/rom1 \"{ImagePath}\" /fullscreen /machine \"MSX2+\"'\n    Platforms: [microsoft_msx]\n    ImageExtensions: [zip, rom]\n    StartupExecutable: ^blueMSX\\.exe$\n  - Name: MSX2\n    StartupArguments: '/rom1 \"{ImagePath}\" /fullscreen /machine \"MSX2+\"'\n    Platforms: [microsoft_msx2]\n    ImageExtensions: [zip, rom]\n    StartupExecutable: ^blueMSX\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/bsnes/emulator.yaml",
    "content": "Id: bsnes\r\nName: bsnes\r\nWebsite: 'https://bsnes.dev/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '--fullscreen \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [sfc, smc, zip, 7z]\r\n    StartupExecutable: ^bsnes\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/bsnes-hd/emulator.yaml",
    "content": "Id: bsnes-hd\r\nName: bsnes-hd\r\nWebsite: 'https://github.com/DerKoun/bsnes-hd'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '--fullscreen \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [sfc, smc, zip]\r\n    StartupExecutable: ^bsnes_hd\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/bsnes-mt/emulator.yaml",
    "content": "Id: bsnes-mt\r\nName: bsnes-mt\r\nWebsite: 'https://tanalin.com/en/projects/bsnes-mt/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '--fullscreen \"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [sfc, smc, zip, 7z]\r\n    StartupExecutable: ^bsnes-mt\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/decaf-emu/emulator.yaml",
    "content": "Id: decaf-emu\r\nName: decaf-emu\r\nWebsite: 'https://github.com/decaf-emu/decaf-emu'\r\nProfiles:       \r\n  - Name: Default \r\n    StartupArguments: 'play \"{ImagePath}\"'\r\n    Platforms: [nintendo_wiiu]\r\n    ImageExtensions: [wud, rpx]\r\n    StartupExecutable: ^decaf-sdl\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/ePSXe/emulator.yaml",
    "content": "Id: epsxe\r\nName: ePSXe\r\nWebsite: 'https://www.epsxe.com/'\r\nProfiles:\r\n  - Name: Default\r\n    Platforms: [sony_playstation]\r\n    ImageExtensions: [bin, iso, img, pbp, zip, cue]\r\n    InstallationFile: ^ePSXe\\.exe$\r\n    StartupExecutable: ^ePSXe\\.exe$\r\n    StartupArguments: '-nogui -slowboot -loadbin \"{ImagePath}\"'"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/gopher64/emulator.yaml",
    "content": "Id: gopher64\r\nName: gopher64\r\nWebsite: 'https://github.com/gopher64/gopher64'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\" -f'\r\n    Platforms: [nintendo_64]\r\n    ImageExtensions: [zip,7z,z64,n64,v64]\r\n    StartupExecutable: ^gopher64-windows-x86_64\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/higan/emulator.yaml",
    "content": "Id: higan\r\nName: higan\r\nWebsite: 'https://higan.dev/'\r\nProfiles:\r\n  - Name: Nintendo - NES\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_nes]\r\n    ImageExtensions: [zip, nes]\r\n    StartupExecutable: ^higan.*\\.exe$\r\n\r\n  - Name: Nintendo - SNES\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_super_nes]\r\n    ImageExtensions: [sfc, smc, bs, zip]\r\n    StartupExecutable: ^higan.*\\.exe$\r\n\r\n  - Name: Nintendo - Game Boy\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy]\r\n    ImageExtensions: [zip, gb]\r\n    StartupExecutable: ^higan.*\\.exe$\r\n\r\n  - Name: Nintendo - Game Boy Color\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboycolor]\r\n    ImageExtensions: [zip, gbc]\r\n    StartupExecutable: ^higan.*\\.exe$\r\n\r\n  - Name: Nintendo - Game Boy Advance\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboyadvance]\r\n    ImageExtensions: [zip, gba]\r\n    StartupExecutable: ^higan.*\\.exe$\r\n\r\n  - Name: Sega - Master System\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sega_mastersystem]\r\n    ImageExtensions: [zip, sms]\r\n    StartupExecutable: ^higan.*\\.exe$\r\n\r\n  - Name: Sega - Mega Drive\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sega_genesis]\r\n    ImageExtensions: [zip, bin, smd, md] \r\n    StartupExecutable: ^higan.*\\.exe$\r\n\r\n  - Name: Sega - Game Gear\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sega_gamegear]\r\n    ImageExtensions: [zip, gg]\r\n    StartupExecutable: ^higan.*\\.exe$\r\n\r\n  - Name: NEC - PC Engine\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nec_turbografx_16, nec_turbografx_cd]\r\n    ImageExtensions: [zip, pce, cue, ccd, chd]\r\n    StartupExecutable: ^higan.*\\.exe$\r\n\r\n  - Name: PC Engine SuperGrafx\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nec_supergrafx]\r\n    ImageExtensions: [zip, pce]\r\n    StartupExecutable: ^higan.*\\.exe$\r\n\r\n  - Name: Bandai - WonderSwan\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [bandai_wonderswan]\r\n    ImageExtensions: [zip, ws]\r\n    StartupExecutable: ^higan.*\\.exe$\r\n\r\n  - Name: Bandai - WonderSwan Color\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [bandai_wonderswan_color]\r\n    ImageExtensions: [zip, wsc]\r\n    StartupExecutable: ^higan.*\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/jgenesis/emulator.yaml",
    "content": "Id: jgenesis\nName: jgenesis\nWebsite: 'https://github.com/jsgroth/jgenesis'\nProfiles:\n  - Name: Master System\n    StartupExecutable: ^jgenesis-cli\\.exe$\n    StartupArguments: '--hardware MasterSystem --fullscreen -f \"{ImagePath}\"'\n    Platforms: [sega_mastersystem]\n    ImageExtensions: [sms, zip, 7z]\n\n  - Name: Game Gear\n    StartupExecutable: ^jgenesis-cli\\.exe$\n    StartupArguments: '--hardware MasterSystem --fullscreen -f \"{ImagePath}\"'\n    Platforms: [sega_gamegear]\n    ImageExtensions: [gg, zip, 7z]\n\n  - Name: Genesis\n    StartupExecutable: ^jgenesis-cli\\.exe$\n    StartupArguments: '--hardware Genesis --fullscreen -f \"{ImagePath}\"'\n    Platforms: [sega_genesis]\n    ImageExtensions: [gen, md, bin, smd, zip, 7z]\n\n  - Name: Sega CD\n    StartupExecutable: ^jgenesis-cli\\.exe$\n    StartupArguments: '--hardware SegaCd --fullscreen -f \"{ImagePath}\"'\n    Platforms: [sega_cd]\n    ImageExtensions: [cue, chd, zip, 7z]\n\n  - Name: Sega 32X\n    StartupExecutable: ^jgenesis-cli\\.exe$\n    StartupArguments: '--hardware Sega32X --fullscreen -f \"{ImagePath}\"'\n    Platforms: [sega_32x]\n    ImageExtensions: [32x, bin, zip, 7z]\n\n  - Name: NES\n    StartupExecutable: ^jgenesis-cli\\.exe$\n    StartupArguments: '--hardware Nes --fullscreen -f \"{ImagePath}\"'\n    Platforms: [nintendo_nes]\n    ImageExtensions: [nes, zip, 7z]\n\n  - Name: SNES\n    StartupExecutable: ^jgenesis-cli\\.exe$\n    StartupArguments: '--hardware Snes --fullscreen -f \"{ImagePath}\"'\n    Platforms: [nintendo_super_nes]\n    ImageExtensions: [sfc, smc, zip, 7z]\n\n  - Name: Game Boy\n    StartupExecutable: ^jgenesis-cli\\.exe$\n    StartupArguments: '--hardware GameBoy --fullscreen -f \"{ImagePath}\"'\n    Platforms: [nintendo_gameboy]\n    ImageExtensions: [gb, zip, 7z]\n\n  - Name: Game Boy Color\n    StartupExecutable: ^jgenesis-cli\\.exe$\n    StartupArguments: '--hardware GameBoy --fullscreen -f \"{ImagePath}\"'\n    Platforms: [nintendo_gameboycolor]\n    ImageExtensions: [gbc, zip, 7z]"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/m64p/emulator.yaml",
    "content": "Id: m64p\r\nName: m64p\r\nWebsite: 'https://m64p.github.io/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '--nogui \"{ImagePath}\"'\r\n    ImageExtensions: [n64, v64, z64, zip, 7z]\r\n    Platforms: [nintendo_64]\r\n    StartupExecutable: ^mupen64plus-gui\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/mGBA/emulator.yaml",
    "content": "Id: mgba\r\nName: mGBA\r\nWebsite: 'https://mgba.io/'\r\nProfiles:\r\n  - Name: Nintendo Game Boy\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboy]\r\n    ImageExtensions: [zip, 7z, rar, bin, gb, dmg]\r\n    StartupExecutable: ^mGBA.exe$\r\n\r\n  - Name: Nintendo Game Boy Color\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboycolor]\r\n    ImageExtensions: [zip, 7z, rar, bin, gbc, cgb, sgb]\r\n    StartupExecutable: ^mGBA.exe$\r\n\r\n  - Name: Nintendo Game Boy Advance\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_gameboyadvance]\r\n    ImageExtensions: [zip, 7z, rar, bin, elf, mb, gba, agb]\r\n    StartupExecutable: ^mGBA.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/melonDS/emulator.yaml",
    "content": "Id: melonds\r\nName: melonDS\r\nWebsite: 'http://melonds.kuribo64.net/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\" -f'\r\n    Platforms: [nintendo_ds, nintendo_dsi]\r\n    ImageExtensions: [nds, zip]\r\n    StartupExecutable: ^melonDS\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/puNES/emulator.yaml",
    "content": "Id: punes\nName: puNES\nWebsite: 'https://github.com/punesemu/puNES'\nProfiles:\n  - Name: Default\n    StartupArguments: '\"{ImagePath}\"'\n    ImageExtensions: [7zip, rar, nes, unf, unif, fds, nsf, nfse, fm2, zip]\n    Platforms: [nintendo_nes]\n    StartupExecutable: ^punes64\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/redream/emulator.yaml",
    "content": "Id: redream\r\nName: redream\r\nWebsite: 'https://redream.io/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [sega_dreamcast]\r\n    ImageExtensions: [cdi, gdi, chd, cue]\r\n    ProfileFiles: [flash.bin]\r\n    StartupExecutable: ^redream\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/shadPS4/emulator.yaml",
    "content": "Id: shadps4\nName: shadPS4\nWebsite: 'https://shadps4.net//'\nProfiles:\n  - Name: Default QT\n    Platforms: [sony_playstation4]\n    ProfileFiles: ['platforms\\qwindows.dll']\n    StartupExecutable: ^shadPS4.*\\.exe$\n    StartupArguments: '-g \"{ImagePath}\"'\n    ScriptGameImport: true"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/shadPS4/importGames.ps1",
    "content": "param(\n    $ImportArgs\n)\n\nif (-not [System.IO.Directory]::Exists($ImportArgs.ScanDirectory))\n{\n    return\n}\n\nfunction Get-NullTerminatedString\n{\n    param([Array]$bytes, [int]$offset)\n\n    $strBytes = @()\n    for ($j = $offset; $j -lt $bytes.Count; $j++)\n    {\n        $b = $bytes[$j]\n        if($b -eq 0) { break } #strings end on null terminator\n        $strBytes += $b\n    }\n    return [System.Text.Encoding]::UTF8.GetString($strBytes)\n}\n\nfunction Get-ParamSfoValue\n{\n    param([string]$path, [string]$key)\n\n    #thanks to https://psdevwiki.com/ps4/PARAM.SFO\n    [byte[]]$bytes = Get-Content -LiteralPath $path -Encoding Byte -Raw\n    $keyTableOffset = [System.BitConverter]::ToUInt32($bytes, 0x08)\n    $dataTableOffset = [System.BitConverter]::ToUInt32($bytes, 0x0c)\n\n    $indexTableOffset = 0x14\n    $indexRowLength = 0x10\n\n    #go through each index table row\n    for ($i = $indexTableOffset; $i -lt $keyTableOffset; $i += $indexRowLength)\n    {\n        $relativeKeyOffset = [System.BitConverter]::ToUInt16($bytes, $i)\n        $foundKey = Get-NullTerminatedString $bytes ($keyTableOffset + $relativeKeyOffset)\n        if($foundKey -ne $key)\n        {\n            continue\n        }\n\n        $dataFormat = [System.BitConverter]::ToUInt16($bytes, $i + 0x02)\n        $dataLength = [System.BitConverter]::ToUInt32($bytes, $i + 0x04)\n        $relativeDataOffset = [System.BitConverter]::ToUInt32($bytes, $i + 0x0c)\n        if ($dataFormat -eq 1028) #uint32\n        {\n            $data = [System.BitConverter]::ToUInt32($bytes, $dataTableOffset + $relativeDataOffset)\n        }\n        else #string (usually null-terminated)\n        {\n            $data = [System.Text.Encoding]::UTF8.GetString($bytes, $dataTableOffset + $relativeDataOffset, $dataLength).Trim(\"`0\")\n        }\n        return $data\n    }\n    return $null\n}\n\n[array]$games = Get-ChildItem -LiteralPath $ImportArgs.ScanDirectory -Recurse | Where-Object { $_.DirectoryName -match 'CUSA\\d+$' -and ($_.Name -eq \"ISO.BIN.EDAT\" -or $_.Name -eq \"EBOOT.BIN\") }\nforeach ($game in $games)\n{\n    $anyFunc = [Func[string,bool]]{ param($a) $a.Equals($game.FullName, 'OrdinalIgnoreCase') }\n    if ([System.Linq.Enumerable]::Any($ImportArgs.ImportedFiles, $anyFunc))\n    {\n        continue\n    }\n\n    $scannedGame = New-Object \"Playnite.Emulators.ScriptScannedGame\"\n    $scannedGame.Path = $game.FullName\n    $paramSfoPath = Join-Path $game.Directory \"sce_sys\\param.sfo\"\n\n    if (Test-Path -LiteralPath $paramSfoPath -PathType Leaf)\n    {\n        try\n        {\n            $scannedGame.Serial = Get-ParamSfoValue $paramSfoPath \"TITLE_ID\"\n            if ($null -ne $scannedGame.Serial)\n            {\n                $scannedGame.Name = Get-ParamSfoValue $paramSfoPath \"TITLE\"\n                $scannedGame\n            }\n        }\n        catch\n        {\n            $__logger.Error($_.Exception, \"Failed to scan PS4 PARAM.SFO file $paramSfoPath\")\n            $__logger.Error($_.ScriptStackTrace)\n        }\n    }\n}"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/simple64/emulator.yaml",
    "content": "Id: simple64\nName: simple64\nWebsite: 'https://simple64.github.io/'\nProfiles:\n  - Name: Default\n    StartupArguments: '--nogui \"{ImagePath}\"'\n    ImageExtensions: [n64, v64, z64, rom, zip, 7z]\n    Platforms: [nintendo_64]\n    StartupExecutable: ^simple64-gui\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Emulators/yuzu/emulator.yaml",
    "content": "Id: yuzu\r\nName: yuzu\r\nWebsite: 'https://yuzu-emu.org/'\r\nProfiles:\r\n  - Name: Default\r\n    StartupArguments: '\"{ImagePath}\"'\r\n    Platforms: [nintendo_switch]\r\n    ImageExtensions: [nso, nro, nca, xci, nsp]\r\n    StartupExecutable: ^yuzu\\.exe$"
  },
  {
    "path": "source/Playnite/Emulation/Platforms.yaml",
    "content": "﻿- Name: 3DO Interactive Multiplayer\r\n  Id: 3do\r\n  IgdbId: 50\r\n  Databases: [The 3DO Company - 3DO]\r\n  Emulators: [4do, retroarch]\r\n  \r\n- Name: Adobe Flash\r\n  Id: adobe_flash\r\n  Emulators: [flashplayerprojector, ruffle]\r\n  \r\n- Name: Amstrad CPC\r\n  Id: amstrad_cpc\r\n  IgdbId: 25\r\n  Databases: [Amstrad - CPC]\r\n  Emulators: [retroarch]\r\n  \r\n- Name: Apple II\r\n  Id: apple_2\r\n  IgdbId: 75\r\n  Emulators: [bizhawk, mednafen]\r\n  \r\n- Name: Atari 2600\r\n  Id: atari_2600\r\n  IgdbId: 59\r\n  Databases: [Atari - 2600]\r\n  Emulators: [ares, bizhawk, retroarch, stella]\r\n  \r\n- Name: Atari 5200\r\n  Id: atari_5200\r\n  IgdbId: 66\r\n  Databases: [Atari - 5200]\r\n  Emulators: [altirra, atari800, retroarch]\r\n  \r\n- Name: Atari 7800\r\n  Id: atari_7800\r\n  IgdbId: 60\r\n  Databases: [Atari - 7800]\r\n  Emulators: [bizhawk, retroarch]\r\n  \r\n- Name: Atari 8-bit\r\n  Id: atari_8bit\r\n  IgdbId: 65\r\n  Emulators: [altirra, atari800, retroarch]\r\n  \r\n- Name: Atari Falcon030\r\n  Id: atari_falcon030\r\n  Emulators: [retroarch]\r\n  \r\n- Name: Atari Jaguar\r\n  Id: atari_jaguar\r\n  IgdbId: 62\r\n  Databases: [Atari - Jaguar]\r\n  Emulators: [bizhawk, retroarch, virtualjaguar]\r\n  \r\n- Name: Atari Lynx\r\n  Id: atari_lynx\r\n  IgdbId: 61\r\n  Databases: [Atari - Lynx]\r\n  Emulators: [bizhawk, mednafen, retroarch]\r\n  \r\n- Name: Atari ST/STE\r\n  Id: atari_st\r\n  IgdbId: 63\r\n  Databases: [Atari - ST]\r\n  Emulators: [retroarch]\r\n  \r\n- Name: Bandai WonderSwan Color\r\n  Id: bandai_wonderswan_color\r\n  IgdbId: 123\r\n  Databases: [Bandai - WonderSwan Color]\r\n  Emulators: [ares, bizhawk, higan, mednafen, retroarch]\r\n  \r\n- Name: Bandai WonderSwan\r\n  Id: bandai_wonderswan\r\n  IgdbId: 57\r\n  Databases: [Bandai - WonderSwan]\r\n  Emulators: [ares, bizhawk, higan, mednafen, retroarch]\r\n  \r\n- Name: Coleco ColecoVision\r\n  Id: coleco_vision\r\n  IgdbId: 68\r\n  Databases: [Coleco - ColecoVision]\r\n  Emulators: [ares, bizhawk, bluemsx, fbalpha, retroarch]\r\n  \r\n- Name: Commodore 64\r\n  Id: commodore_64\r\n  IgdbId: 15\r\n  Databases: [Commodore - 64, Commodore - 64 (PP), Commodore - 64 (Tapes)]\r\n  Emulators: [bizhawk, retroarch, winvice]\r\n  \r\n- Name: Commodore Amiga CD32\r\n  Id: commodore_amiga_cd32\r\n  IgdbId: 114\r\n  Databases: [Commodore - Amiga]\r\n  Emulators: [fs-uae, winuae]\r\n  \r\n- Name: Commodore Amiga\r\n  Id: commodore_amiga\r\n  IgdbId: 16\r\n  Databases: [Commodore - Amiga]\r\n  Emulators: [fs-uae, retroarch, winuae]\r\n  \r\n- Name: Commodore CBM-5x0\r\n  Id: commodore_cbm5x0\r\n  Databases: [Commodore - CBM-5x0]\r\n  Emulators: [retroarch]\r\n  \r\n- Name: Commodore CBM-II\r\n  Id: commodore_cbm2\r\n  Databases: [Commodore - CBM-II]\r\n  Emulators: [retroarch]\r\n  \r\n- Name: Commodore PET\r\n  Id: commodore_pet\r\n  IgdbId: 90\r\n  Emulators: [retroarch, winvice]\r\n  \r\n- Name: Commodore Plus/4\r\n  Id: commodore_plus4\r\n  IgdbId: 94\r\n  Databases: [Commodore - Plus-4]\r\n  Emulators: [winvice]\r\n  \r\n- Name: Commodore VIC20\r\n  Id: commodore_vci20\r\n  IgdbId: 71\r\n  Databases: [Commodore - VIC-20]\r\n  Emulators: [retroarch, winvice]\r\n  \r\n- Name: GCE Vectrex\r\n  Id: vectrex\r\n  IgdbId: 67\r\n  Databases: [GCE - Vectrex]\r\n  Emulators: [bizhawk, retroarch]\r\n  \r\n- Name: Macintosh\r\n  Id: macintosh\r\n  IgdbId: 14\r\n  \r\n- Name: Magnavox Odyssey 2\r\n  Id: magnavox_odyssey_2\r\n  IgdbId: 133\r\n  Databases: [Magnavox - Odyssey2]\r\n  Emulators: [bizhawk]\r\n  \r\n- Name: Mattel Intellivision\r\n  Id: mattel_intellivision\r\n  IgdbId: 67\r\n  Databases: [Mattel - Intellivision]\r\n  Emulators: [bizhawk, retroarch]\r\n  \r\n- Name: Microsoft MSX\r\n  Id: microsoft_msx\r\n  IgdbId: 27\r\n  Databases: [Microsoft - MSX]\r\n  Emulators: [ares, bluemsx, retroarch]\r\n  \r\n- Name: Microsoft MSX2\r\n  Id: microsoft_msx2\r\n  IgdbId: 53\r\n  Databases: [Microsoft - MSX2]\r\n  Emulators: [ares, bluemsx, retroarch]\r\n  \r\n- Name: Microsoft Xbox 360\r\n  Id: xbox360\r\n  IgdbId: 12\r\n  Databases: [Microsoft - Xbox 360, Microsoft - XBOX 360 (Digital), Microsoft - XBOX 360 (Games on Demand)]\r\n  Emulators: [xenia]\r\n  \r\n- Name: Microsoft Xbox One\r\n  Id: xbox_one\r\n  IgdbId: 49\r\n  \r\n- Name: Microsoft Xbox Series\r\n  Id: xbox_series\r\n  IgdbId: 169\r\n  \r\n- Name: Microsoft Xbox\r\n  Id: xbox\r\n  IgdbId: 11\r\n  Databases: [Microsoft - Xbox]\r\n  Emulators: [cxbx-reloaded, retroarch, xemu]\r\n  \r\n- Name: NEC PC-98\r\n  Id: nec_pc98\r\n  IgdbId: 149\r\n  Databases: [NEC - PC-98]\r\n  Emulators: [retroarch]\r\n  \r\n- Name: NEC PC-FX\r\n  Id: nec_pcfx\r\n  IgdbId: 274\r\n  Databases: [NEC - PC-FX]\r\n  Emulators: [mednafen, retroarch]\r\n  \r\n- Name: NEC SuperGrafx\r\n  Id: nec_supergrafx\r\n  IgdbId: 128\r\n  Databases: [NEC - PC Engine SuperGrafx]\r\n  Emulators: [ares, bizhawk, higan, mednafen, mesen, retroarch]\r\n  \r\n- Name: NEC TurboGrafx 16\r\n  Id: nec_turbografx_16\r\n  IgdbId: 86\r\n  Databases: [NEC - PC Engine - TurboGrafx 16]\r\n  Emulators: [ares, bizhawk, higan, mednafen, mesen, retroarch]\r\n  \r\n- Name: NEC TurboGrafx-CD\r\n  Id: nec_turbografx_cd\r\n  IgdbId: 150\r\n  Databases: [NEC - PC Engine CD - TurboGrafx-CD]\r\n  Emulators: [ares, bizhawk, higan, mednafen, mesen, retroarch]\r\n  \r\n- Name: Nintendo 3DS\r\n  Id: nintendo_3ds\r\n  IgdbId: 37\r\n  Databases: [Nintendo - Nintendo 3DS, Nintendo - Nintendo 3DS (Digital)]\r\n  Emulators: [citra, retroarch]\r\n  \r\n- Name: Nintendo 64\r\n  Id: nintendo_64\r\n  IgdbId: 4\r\n  Databases: [Nintendo - Nintendo 64, Nintendo - Nintendo 64DD]\r\n  Emulators: [ares, bizhawk, m64p, m64py, project64, retroarch, rosaliesmupengui, simple64, gopher64]\r\n  \r\n- Name: Nintendo DS\r\n  Id: nintendo_ds\r\n  IgdbId: 20\r\n  Databases: [Nintendo - Nintendo DS, Nintendo - Nintendo DS (Download Play)]\r\n  Emulators: [bizhawk, desmume, gbe+, melonds, retroarch]\r\n  \r\n- Name: Nintendo DSi\r\n  Id: nintendo_dsi\r\n  IgdbId: 159\r\n  Databases: [Nintendo - Nintendo DSi, Nintendo - Nintendo DSi (Digital)]\r\n  Emulators: [bizhawk, melonds]\r\n  \r\n- Name: Nintendo Entertainment System\r\n  Id: nintendo_nes\r\n  IgdbId: 18\r\n  Databases: [Nintendo - Nintendo Entertainment System]\r\n  Emulators: [ares, bizhawk, fceux, higan, jgenesis, mednafen, mesen, nestopia, punes, retroarch]\r\n  \r\n- Name: Nintendo Family Computer Disk System\r\n  Id: nintendo_famicom_disk\r\n  IgdbId: 51\r\n  Databases: [Nintendo - Family Computer Disk System]\r\n  Emulators: [fceux, retroarch]\r\n  \r\n- Name: Nintendo Game Boy Advance\r\n  Id: nintendo_gameboyadvance\r\n  IgdbId: 24\r\n  Databases: [Nintendo - Game Boy Advance]\r\n  Emulators: [ares, bizhawk, gbe+, higan, mednafen, mgba, nanoboyadvance, retroarch, visualboyadvance, visualboyadvance-m]\r\n  \r\n- Name: Nintendo Game Boy Color\r\n  Id: nintendo_gameboycolor\r\n  IgdbId: 22\r\n  Databases: [Nintendo - Game Boy Color]\r\n  Emulators: [ares, bgb, bizhawk, gambatte, gbe+, higan, jgenesis, mednafen, mesen, mgba, retroarch, sameboy, visualboyadvance, visualboyadvance-m]\r\n  \r\n- Name: Nintendo Game Boy\r\n  Id: nintendo_gameboy\r\n  IgdbId: 33\r\n  Databases: [Nintendo - Game Boy]\r\n  Emulators: [ares, bgb, bizhawk, gambatte, gbe+, higan, jgenesis, mednafen, mesen, mgba, retroarch, sameboy, visualboyadvance, visualboyadvance-m]\r\n  \r\n- Name: Nintendo GameCube\r\n  Id: nintendo_gamecube\r\n  IgdbId: 21\r\n  Databases: [Nintendo - GameCube]\r\n  Emulators: [dolphin, retroarch]\r\n  \r\n- Name: Nintendo SNES\r\n  Id: nintendo_super_nes\r\n  IgdbId: 19\r\n  Databases: [Nintendo - Super Nintendo Entertainment System]\r\n  Emulators: [ares, bizhawk, bsnes, bsnes-hd, bsnes-mt, higan, jgenesis, mednafen, mesen, mesen-s, retroarch, snes9x, zsnes]\r\n  \r\n- Name: Nintendo Switch\r\n  Id: nintendo_switch\r\n  IgdbId: 130\r\n\r\n- Name: Nintendo Switch 2\r\n  Id: nintendo_switch2\r\n  IgdbId: 508\r\n  \r\n- Name: Nintendo Virtual Boy\r\n  Id: nintendo_virtualboy\r\n  IgdbId: 87\r\n  Databases: [Nintendo - Virtual Boy]\r\n  Emulators: [bizhawk, mednafen, retroarch]\r\n  \r\n- Name: Nintendo Wii U\r\n  Id: nintendo_wiiu\r\n  IgdbId: 41\r\n  Databases: [Nintendo - Wii U, Nintendo - Wii U (Digital)]\r\n  Emulators: [cemu, decaf-emu]\r\n  \r\n- Name: Nintendo Wii\r\n  Id: nintendo_wii\r\n  IgdbId: 5\r\n  Databases: [Nintendo - Wii, Nintendo - Wii (Digital)]\r\n  Emulators: [dolphin, retroarch]\r\n  \r\n- Name: PC (DOS)\r\n  Id: pc_dos\r\n  IgdbId: 13\r\n  Databases: [DOS]\r\n  Emulators: [dosbox, pcem, retroarch, scummvm]\r\n  \r\n- Name: PC (Linux)\r\n  Id: pc_linux\r\n  IgdbId: 3\r\n  \r\n- Name: PC (Windows)\r\n  Id: pc_windows\r\n  IgdbId: 6\r\n  Emulators: [pcem, scummvm]\r\n  \r\n- Name: Sega 32X\r\n  Id: sega_32x\r\n  IgdbId: 30\r\n  Databases: [Sega - 32X]\r\n  Emulators: [ares, jgenesis, kegafusion, retroarch]\r\n  \r\n- Name: Sega CD\r\n  Id: sega_cd\r\n  IgdbId: 78\r\n  Databases: [Sega - Mega-CD - Sega CD]\r\n  Emulators: [ares, jgenesis, kegafusion, retroarch]\r\n  \r\n- Name: Sega Dreamcast\r\n  Id: sega_dreamcast\r\n  IgdbId: 23\r\n  Databases: [Sega - Dreamcast]\r\n  Emulators: [demul, flycast, nulldc, redream, reicast, retroarch]\r\n  \r\n- Name: Sega Game Gear\r\n  Id: sega_gamegear\r\n  IgdbId: 35\r\n  Databases: [Sega - Game Gear]\r\n  Emulators: [ares, bizhawk, higan, jgenesis, kegafusion, mednafen, retroarch]\r\n  \r\n- Name: Sega Genesis\r\n  Id: sega_genesis\r\n  IgdbId: 29\r\n  Databases: [Sega - Mega Drive - Genesis]\r\n  Emulators: [bizhawk, blastem, higan, jgenesis, kegafusion, mednafen, retroarch, ares]\r\n  \r\n- Name: Sega Master System\r\n  Id: sega_mastersystem\r\n  IgdbId: 64\r\n  Databases: [Sega - Master System - Mark III]\r\n  Emulators: [ares, bizhawk, higan, jgenesis, kegafusion, mednafen, retroarch]\r\n  \r\n- Name: Sega Saturn\r\n  Id: sega_saturn\r\n  IgdbId: 32\r\n  Databases: [Sega - Saturn]\r\n  Emulators: [ares, bizhawk, mednafen, retroarch, yabuse, ymir]\r\n  \r\n- Name: Sega SG-1000\r\n  Id: sega_sg1000\r\n  IgdbId: 84\r\n  Databases: [Sega - SG-1000]\r\n  Emulators: [ares, retroarch]\r\n  \r\n- Name: Sharp X68000\r\n  Id: sharp_x68000\r\n  IgdbId: 121\r\n  Databases: [Sharp - X68000]\r\n  Emulators: [retroarch]\r\n  \r\n- Name: Sinclair ZX Spectrum +3\r\n  Id: sinclair_zxspectrum3\r\n  Databases: [Sinclair - ZX Spectrum +3]\r\n  Emulators: [fuse, retroarch]\r\n  \r\n- Name: Sinclair ZX Spectrum\r\n  Id: sinclair_zxspectrum\r\n  IgdbId: 26\r\n  Databases: [Sinclair - ZX Spectrum]\r\n  Emulators: [bizhawk, fuse, retroarch]\r\n  \r\n- Name: Sinclair ZX81\r\n  Id: sinclair_zx81\r\n  IgdbId: 373\r\n  Databases: [Sinclair - ZX 81]\r\n  Emulators: [retroarch]\r\n  \r\n- Name: SNK Neo Geo AES\r\n  Id: snk_neogeo_aes\r\n  IgdbId: 80\r\n  Emulators: [ares]\r\n  \r\n- Name: SNK Neo Geo CD\r\n  Id: snk_neogeo_cd\r\n  IgdbId: 136\r\n  Databases: [SNK - Neo Geo CD]\r\n  Emulators: [retroarch]\r\n  \r\n- Name: SNK Neo Geo Pocket Color\r\n  Id: snk_neogeopocket_color\r\n  IgdbId: 120\r\n  Databases: [SNK - Neo Geo Pocket Color]\r\n  Emulators: [ares, bizhawk, mednafen, retroarch]\r\n  \r\n- Name: SNK Neo Geo Pocket\r\n  Id: snk_neogeopocket\r\n  IgdbId: 119\r\n  Databases: [SNK - Neo Geo Pocket]\r\n  Emulators: [ares, bizhawk, mednafen, retroarch]\r\n  \r\n- Name: Sony PlayStation 2\r\n  Id: sony_playstation2\r\n  IgdbId: 8\r\n  Databases: [Sony - PlayStation 2]\r\n  Emulators: [pcsx2, retroarch]\r\n  \r\n- Name: Sony PlayStation 3\r\n  Id: sony_playstation3\r\n  IgdbId: 9\r\n  Databases: [Sony - PlayStation 3, Sony - PlayStation 3 (PSN)]\r\n  Emulators: [rpcs3]\r\n  \r\n- Name: Sony PlayStation 4\r\n  Id: sony_playstation4\r\n  IgdbId: 48\r\n  Emulators: [shadps4]\r\n  \r\n- Name: Sony PlayStation 5\r\n  Id: sony_playstation5\r\n  IgdbId: 167\r\n  \r\n- Name: Sony PlayStation Portable\r\n  Id: sony_psp\r\n  IgdbId: 38\r\n  Databases: [Sony - PlayStation Portable, Sony - PlayStation Portable (PSN), Sony - PlayStation Portable (PSX2PSP)]\r\n  Emulators: [ppsspp, retroarch]\r\n  \r\n- Name: Sony PlayStation Vita\r\n  Id: sony_vita\r\n  IgdbId: 46\r\n  Databases: [Sony - PlayStation Vita, Sony - PlayStation Vita (PSN)]\r\n  Emulators: [vita3k]\r\n  \r\n- Name: Sony PlayStation\r\n  Id: sony_playstation\r\n  IgdbId: 7\r\n  Databases: [Sony - PlayStation]\r\n  Emulators: [ares, bizhawk, duckstation, epsxe, mednafen, pcsxr-pgxp, retroarch]\r\n  \r\n- Name: Texas Instruments TI-83\r\n  Id: ti_83\r\n  Databases: [TIC-80]\r\n  Emulators: [bizhawk]\r\n  \r\n- Name: Thomson MO5\r\n  Id: thomson_mo5\r\n  IgdbId: 156\r\n  Databases: [Thomson - MOTO]\r\n  Emulators: [retroarch]\r\n  \r\n- Name: Thomson TO7\r\n  Id: thomson_to7\r\n  Databases: [Thomson - MOTO]\r\n  Emulators: [retroarch]\r\n  \r\n- Name: TIC-80\r\n  Id: tic_80\r\n  Emulators: [bizhawk]\r\n  \r\n- Name: Uzebox\r\n  Id: uzebox\r\n  Databases: [Uzebox]\r\n  Emulators: [bizhawk]\r\n\r\n- Name: Watara Supervision\r\n  Id: watara_supervision\r\n  Databases: [Watara - Supervision]\r\n  Emulators: [retroarch]\r\n\r\n- Name: Philips CD-i\r\n  Id: philips_cdi\r\n  IgdbId: 117\r\n\r\n- Name: Pokémon mini\r\n  Id: pokemon_mini\r\n  IgdbId: 166"
  },
  {
    "path": "source/Playnite/Emulation/Regions.yaml",
    "content": "- Id: australia\r\n  Name: Australia\r\n  Codes: [A, AU, Australia]\r\n  IgdbId: 3\r\n- Id: asia\r\n  Name: Asia\r\n  Codes: [As, Asia]\r\n  IgdbId: 7\r\n- Id: brazil\r\n  Name: Brazil\r\n  Codes: [B, BR, Brazil]\r\n- Id: canada\r\n  Name: Canada\r\n  Codes: [C, CA, Canada]\r\n- Id: china\r\n  Name: China\r\n  Codes: [Ch, CN, China]\r\n  IgdbId: 6\r\n- Id: netherlands\r\n  Name: Netherlands\r\n  Codes: [D, Nl, Netherlands]\r\n- Id: europe\r\n  Name: Europe\r\n  Codes: [E, EU, Europe]\r\n  DefaultImport: true\r\n  IgdbId: 1\r\n- Id: france\r\n  Name: France\r\n  Codes: [F, FR, France]\r\n- Id: germany\r\n  Name: Germany\r\n  Codes: [G, DE, Germany]\r\n- Id: greece\r\n  Name: Greece\r\n  Codes: [Gr, Greece]\r\n- Id: holland\r\n  Name: Holland\r\n  Codes: [H, Holland]\r\n- Id: hongKong\r\n  Name: Hong Kong\r\n  Codes: [HK, \"Hong Kong\"]\r\n- Id: italy\r\n  Name: Italy\r\n  Codes: [I, IT, Italy]\r\n- Id: japan\r\n  Name: Japan\r\n  Codes: [J, JP, Japan]\r\n  DefaultImport: true\r\n  IgdbId: 5\r\n- Id: korea\r\n  Name: Korea\r\n  Codes: [K, KR, Korea]\r\n- Id: newZealand\r\n  Name: New Zealand\r\n  Codes: [NZ, \"New Zealand\"]\r\n  IgdbId: 4\r\n- Id: norway\r\n  Name: Norway\r\n  Codes: [No, Norway]\r\n- Id: russia\r\n  Name: Russia\r\n  Codes: [R, RU, Russia]\r\n- Id: spain\r\n  Name: Spain\r\n  Codes: [S, ES, Spain]\r\n- Id: sweden\r\n  Name: Sweden\r\n  Codes: [Sw, SE, Sweden]\r\n- Id: usa\r\n  Name: USA\r\n  Codes: [U, NA, USA, US]\r\n  DefaultImport: true\r\n  IgdbId: 2\r\n- Id: unitedKingdom\r\n  Name: United Kingdom\r\n  Codes: [UK, GB, \"United Kingdom\"]\r\n- Id: world\r\n  Name: World\r\n  Codes: [W, World]\r\n  DefaultImport: true\r\n  IgdbId: 8\r\n"
  },
  {
    "path": "source/Playnite/Emulators/DatModels.cs",
    "content": "﻿using SqlNado;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing YamlDotNet.Serialization;\r\n\r\nnamespace Playnite.Emulators\r\n{\r\n    public class DatGame\r\n    {\r\n        [SQLiteColumn(IsPrimaryKey = true, AutoIncrements = true)]\r\n        public int Id { get; set; }\r\n\r\n        [DatProperty(\"name\")]\r\n        public string Name { get; set; }\r\n\r\n        [DatProperty(\"region\")]\r\n        public string Region { get; set; }\r\n\r\n        [DatProperty(\"releaseyear\")]\r\n        public string ReleaseYear { get; set; }\r\n\r\n        [SQLiteIndex(nameof(Serial))]\r\n        [DatProperty(\"serial\")]\r\n        public string Serial { get; set; }\r\n\r\n        [SQLiteIndex(nameof(RomCrc))]\r\n        [DatProperty(\"rom.crc\")]\r\n        public string RomCrc { get; set; }\r\n\r\n        [DatProperty(\"rom.name\")]\r\n        public string RomName { get; set; }\r\n\r\n        [YamlIgnore]\r\n        [SQLiteColumn(Ignore = true)]\r\n        [DatProperty(\"rom.serial\")]\r\n        public string RomSerial { get; set; }\r\n\r\n        [YamlIgnore]\r\n        [SQLiteColumn(Ignore = true)]\r\n        [DatProperty(\"origin\")]\r\n        public string Origin { get; set; }\r\n\r\n        [YamlIgnore]\r\n        [SQLiteColumn(Ignore = true)]\r\n        [DatProperty(\"comment\")]\r\n        public string Comment { get; set; }\r\n\r\n        //[DatProperty(\"rom.size\")]\r\n        //public long RomSize { get; set; }\r\n\r\n        //[DatProperty(\"rom.md5\")]\r\n        //public string RomMd5 { get; set; }\r\n\r\n        //[DatProperty(\"rom.sha1\")]\r\n        //public string RomSha1 { get; set; }\r\n\r\n        [YamlIgnore]\r\n        [SQLiteColumn(Ignore = true)]\r\n        public string SanitizedName => Name.IsNullOrEmpty() ? string.Empty : Emulators.RomName.SanitizeName(Name);\r\n\r\n        public override string ToString()\r\n        {\r\n            return $\"{Serial} {RomCrc} {Name}\";\r\n        }\r\n\r\n        public void CopyTo(DatGame target)\r\n        {\r\n            if (!Name.IsNullOrEmpty() && target.Name.IsNullOrEmpty())\r\n            {\r\n                target.Name = Name;\r\n            }\r\n\r\n            if (!Origin.IsNullOrEmpty() && Region.IsNullOrEmpty() && target.Region.IsNullOrEmpty())\r\n            {\r\n                target.Region = Origin;\r\n            }\r\n\r\n            if (!Region.IsNullOrEmpty() && target.Region.IsNullOrEmpty())\r\n            {\r\n                target.Region = Region;\r\n            }\r\n\r\n            if (!ReleaseYear.IsNullOrEmpty() && target.ReleaseYear.IsNullOrEmpty())\r\n            {\r\n                target.ReleaseYear = ReleaseYear;\r\n            }\r\n\r\n            if (!RomSerial.IsNullOrEmpty() && target.Serial.IsNullOrEmpty())\r\n            {\r\n                target.Serial = RomSerial;\r\n            }\r\n\r\n            if (!Serial.IsNullOrEmpty() && target.Serial.IsNullOrEmpty())\r\n            {\r\n                target.Serial = Serial;\r\n            }\r\n        }\r\n\r\n        public void FixData()\r\n        {\r\n            if (Serial.IsNullOrEmpty() && !RomSerial.IsNullOrEmpty())\r\n            {\r\n                Serial = RomSerial;\r\n            }\r\n\r\n            if (Region.IsNullOrEmpty() && !Origin.IsNullOrEmpty())\r\n            {\r\n                Region = Origin;\r\n            }\r\n\r\n            if (Name.IsNullOrEmpty() && !Comment.IsNullOrEmpty())\r\n            {\r\n                Name = Comment;\r\n            }\r\n        }\r\n    }\r\n\r\n    public class DatPropertyAttribute : Attribute\r\n    {\r\n        public string Name { get; }\r\n\r\n        public DatPropertyAttribute(string name)\r\n        {\r\n            Name = name;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Emulators/Emulation.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Emulators\r\n{\r\n    public class Emulation : IEmulationAPI\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private static string platformsFile => Path.Combine(PlaynitePaths.ProgramPath, \"Emulation\", \"Platforms.yaml\");\r\n        private static string regionsFile => Path.Combine(PlaynitePaths.ProgramPath, \"Emulation\", \"Regions.yaml\");\r\n        private static string emulatorDefDir => Path.Combine(PlaynitePaths.ProgramPath, \"Emulation\", \"Emulators\");\r\n\r\n        public const string StartupScriptFileName = \"startGame.ps1\";\r\n        public const string GameImportScriptFileName = \"importGames.ps1\";\r\n\r\n        #region IEmulationAPI\r\n\r\n        IList<EmulatedPlatform> IEmulationAPI.Platforms => Platforms.GetClone();\r\n        IList<EmulatedRegion> IEmulationAPI.Regions => Regions.GetClone();\r\n        IList<EmulatorDefinition> IEmulationAPI.Emulators => Definitions.GetClone();\r\n\r\n        EmulatedPlatform IEmulationAPI.GetPlatform(string platformsId)\r\n        {\r\n            return GetPlatform(platformsId).GetClone();\r\n        }\r\n\r\n        EmulatedRegion IEmulationAPI.GetRegion(string regionId)\r\n        {\r\n            return GetRegion(regionId).GetClone();\r\n        }\r\n\r\n        EmulatorDefinition IEmulationAPI.GetEmulator(string emulatorDefinitionId)\r\n        {\r\n            return GetDefition(emulatorDefinitionId).GetClone();\r\n        }\r\n\r\n        #endregion IEmulationAPI\r\n\r\n        private static List<EmulatedPlatform> platforms;\r\n        public static IList<EmulatedPlatform> Platforms\r\n        {\r\n            get\r\n            {\r\n                if (platforms != null)\r\n                {\r\n                    return platforms;\r\n                }\r\n\r\n                if (File.Exists(platformsFile))\r\n                {\r\n                    try\r\n                    {\r\n                        platforms = Serialization.FromYamlFile<List<EmulatedPlatform>>(platformsFile);\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        platforms = new List<EmulatedPlatform>();\r\n                        logger.Error(e, $\"Failed to emulated platforms list.\");\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    logger.Error(\"Emulation platforms file not found!\");\r\n                    platforms = new List<EmulatedPlatform>();\r\n                }\r\n\r\n                return platforms.AsReadOnly();\r\n            }\r\n        }\r\n\r\n        public static EmulatedPlatform GetPlatform(string platformsId)\r\n        {\r\n            return Platforms.FirstOrDefault(a => a.Id == platformsId);\r\n        }\r\n\r\n        public static EmulatedPlatform GetPlatformByDatabase(string databaseName)\r\n        {\r\n            return Platforms.FirstOrDefault(a => a.Databases?.ContainsString(databaseName, StringComparison.OrdinalIgnoreCase) == true);\r\n        }\r\n\r\n        private static List<EmulatedRegion> regions;\r\n        public static IList<EmulatedRegion> Regions\r\n        {\r\n            get\r\n            {\r\n                if (regions != null)\r\n                {\r\n                    return regions;\r\n                }\r\n\r\n                if (File.Exists(regionsFile))\r\n                {\r\n                    try\r\n                    {\r\n                        regions = Serialization.FromYamlFile<List<EmulatedRegion>>(regionsFile);\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        regions = new List<EmulatedRegion>();\r\n                        logger.Error(e, $\"Failed to emulated regions list.\");\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    logger.Error(\"Emulation regions file not found!\");\r\n                    regions = new List<EmulatedRegion>();\r\n                }\r\n\r\n                return regions.AsReadOnly();\r\n            }\r\n        }\r\n\r\n        public static EmulatedRegion GetRegion(string regionsId)\r\n        {\r\n            return Regions.FirstOrDefault(a => a.Id == regionsId);\r\n        }\r\n\r\n        public static EmulatedRegion GetRegionByCode(string code)\r\n        {\r\n            return Regions.FirstOrDefault(a => a.Codes.ContainsString(code, StringComparison.OrdinalIgnoreCase));\r\n        }\r\n\r\n        private static List<EmulatorDefinition> definitions;\r\n        public static IList<EmulatorDefinition> Definitions\r\n        {\r\n            get\r\n            {\r\n                if (definitions != null)\r\n                {\r\n                    return definitions;\r\n                }\r\n\r\n                definitions = new List<EmulatorDefinition>();\r\n                if (!Directory.Exists(emulatorDefDir))\r\n                {\r\n                    return definitions;\r\n                }\r\n\r\n                try\r\n                {\r\n                    foreach (var dir in Directory.GetDirectories(emulatorDefDir))\r\n                    {\r\n                        var manifest = Path.Combine(dir, \"emulator.yaml\");\r\n                        try\r\n                        {\r\n                            var data = Serialization.FromYamlFile<EmulatorDefinition>(manifest);\r\n                            data.DirectoryName = Path.GetFileName(dir);\r\n                            definitions.Add(data);\r\n                        }\r\n                        catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            logger.Error(e, $\"Failed to load emulator definition file {manifest}\");\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    definitions = new List<EmulatorDefinition>();\r\n                    logger.Error(e, \"Failed to load emulator definitions.\");\r\n                }\r\n\r\n                return definitions.AsReadOnly();\r\n            }\r\n        }\r\n\r\n        public static EmulatorDefinition GetDefition(string emulatorId)\r\n        {\r\n            if (emulatorId.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return Definitions.FirstOrDefault(a => a.Id == emulatorId);\r\n        }\r\n\r\n        public static EmulatorDefinitionProfile GetProfile(string emulatorId, string profileName)\r\n        {\r\n            if (emulatorId.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return Definitions.FirstOrDefault(a => a.Id == emulatorId)?.Profiles?.FirstOrDefault(a => a.Name == profileName);\r\n        }\r\n\r\n        public static bool IsEmuProfileValid(SDK.Models.Emulator emulator, string profileId)\r\n        {\r\n            if (profileId.StartsWith(SDK.Models.CustomEmulatorProfile.ProfilePrefix))\r\n            {\r\n                return emulator.CustomProfiles?.Any(a => a.Id == profileId) == true;\r\n            }\r\n            else\r\n            {\r\n                return GetProfile(emulator.BuiltInConfigId, profileId) != null;\r\n            }\r\n        }\r\n\r\n        public static string GetExecutable(string directory, EmulatorDefinitionProfile profile, bool relative)\r\n        {\r\n            if (!Directory.Exists(directory))\r\n            {\r\n                throw new Exception($\"{directory} not found.\");\r\n            }\r\n\r\n            var fileEnumerator = new SafeFileEnumerator(directory, \"*.*\", SearchOption.AllDirectories);\r\n            foreach (var file in fileEnumerator)\r\n            {\r\n                if (file.Attributes.HasFlag(FileAttributes.Directory))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                var relativePath = file.FullName.Replace(Path.GetDirectoryName(file.FullName), \"\").Trim(Path.DirectorySeparatorChar);\r\n                var regex = new Regex(profile.StartupExecutable, RegexOptions.IgnoreCase);\r\n                if (regex.IsMatch(relativePath))\r\n                {\r\n                    if (relative)\r\n                    {\r\n                        return relativePath;\r\n                    }\r\n                    else\r\n                    {\r\n                        return file.FullName;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static string GetStartupScriptPath(EmulatorDefinition emulator)\r\n        {\r\n            return Path.Combine(emulatorDefDir, emulator.DirectoryName, \"startGame.ps1\");\r\n        }\r\n\r\n        public static string GetGameImportScriptPath(EmulatorDefinition emulator)\r\n        {\r\n            return Path.Combine(emulatorDefDir, emulator.DirectoryName, \"importGames.ps1\");\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Emulators/EmulationDatabase.cs",
    "content": "﻿using Playnite.SDK;\r\nusing SqlNado;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Emulators\r\n{\r\n    public class EmulationDatabase\r\n    {\r\n        public interface IEmulationDatabaseReader : IDisposable\r\n        {\r\n            string DatabaseName { get; }\r\n            IEnumerable<DatGame> GetByCrc(string checksum);\r\n            IEnumerable<DatGame> GetBySerial(string serial);\r\n            IEnumerable<DatGame> GetByRomName(string romName);\r\n            IEnumerable<DatGame> GetByRomNamePartial(string romNamePart);\r\n            void ClearStatementCache();\r\n        }\r\n\r\n        public class EmulationDatabaseReader : IEmulationDatabaseReader\r\n        {\r\n            private readonly SQLiteDatabase db;\r\n\r\n            public string DatabaseName { get; }\r\n\r\n            public EmulationDatabaseReader(string dbPath)\r\n            {\r\n                DatabaseName = Path.GetFileNameWithoutExtension(dbPath);\r\n                db = new SQLiteDatabase(dbPath, SQLiteOpenOptions.SQLITE_OPEN_READONLY);\r\n            }\r\n\r\n            public void ClearStatementCache()\r\n            {\r\n                db.ClearStatementsCache();\r\n            }\r\n\r\n            public IEnumerable<DatGame> GetByCrc(string checksum)\r\n            {\r\n                if (db.TableExists(\"DatGame\"))\r\n                {\r\n                    return db.Load<DatGame>($\"WHERE UPPER({nameof(DatGame.RomCrc)}) = '{checksum.ToUpper().Replace(\"'\", \"''\")}'\");\r\n                }\r\n                else\r\n                {\r\n                    return new List<DatGame>();\r\n                }\r\n            }\r\n\r\n            public IEnumerable<DatGame> GetBySerial(string serial)\r\n            {\r\n                if (db.TableExists(\"DatGame\"))\r\n                {\r\n                    return db.Load<DatGame>($\"WHERE UPPER({nameof(DatGame.Serial)}) = '{serial.ToUpper().Replace(\"'\", \"''\")}'\");\r\n                }\r\n                else\r\n                {\r\n                    return new List<DatGame>();\r\n                }\r\n            }\r\n\r\n            public IEnumerable<DatGame> GetByRomName(string romName)\r\n            {\r\n                if (db.TableExists(\"DatGame\"))\r\n                {\r\n                    return db.Load<DatGame>($\"WHERE UPPER({nameof(DatGame.RomName)}) = '{romName.ToUpper().Replace(\"'\", \"''\")}'\");\r\n                }\r\n                else\r\n                {\r\n                    return new List<DatGame>();\r\n                }\r\n            }\r\n\r\n            public IEnumerable<DatGame> GetByRomNamePartial(string romNamePart)\r\n            {\r\n                if (db.TableExists(\"DatGame\"))\r\n                {\r\n                    return db.Load<DatGame>($\"WHERE INSTR(UPPER({nameof(DatGame.RomName)}), '{romNamePart.ToUpper().Replace(\"'\", \"''\")}') > 0\");\r\n                }\r\n                else\r\n                {\r\n                    return new List<DatGame>();\r\n                }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                db.Dispose();\r\n            }\r\n        }\r\n\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        public static EmulationDatabaseReader GetDatabase(string databaseName, string databaseDir)\r\n        {\r\n            var dbFile = Path.Combine(databaseDir, $\"{databaseName}.db\");\r\n            if (File.Exists(dbFile))\r\n            {\r\n                return new EmulationDatabaseReader(dbFile);\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Emulators/Scanner.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.Native;\r\nusing Playnite.Scripting.PowerShell;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Emulators\r\n{\r\n    public class ScannedEmulator : ObservableObject\r\n    {\r\n        public class ScannedEmulatorProfile : ObservableObject\r\n        {\r\n            private bool import = true;\r\n            public bool Import\r\n            {\r\n                get => import;\r\n                set\r\n                {\r\n                    import = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n\r\n            public string Name { get; set; }\r\n            public string ProfileName { get; set; }\r\n        }\r\n\r\n        private bool import = true;\r\n        public bool Import\r\n        {\r\n            get => import;\r\n            set\r\n            {\r\n                import = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public string Name { get; set; }\r\n        public string Id { get; set; }\r\n        public string InstallDir { get; set; }\r\n        public List<ScannedEmulatorProfile> Profiles { get; set; }\r\n    }\r\n\r\n    public class EmulatorScanner\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        public static List<ScannedEmulator> SearchForEmulators(string path, IList<EmulatorDefinition> definitions, CancellationToken cancelToken)\r\n        {\r\n            logger.Info($\"Looking for emulators in {path}, using {definitions.Count} definitions.\");\r\n            var imported = new Dictionary<string, ScannedEmulator>();\r\n            foreach (var file in new SafeFileEnumerator(path, \"*\", SearchOption.AllDirectories))\r\n            {\r\n                if (cancelToken.IsCancellationRequested)\r\n                {\r\n                    return new List<ScannedEmulator>();\r\n                }\r\n\r\n                if (file.Attributes.HasFlag(FileAttributes.Directory))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                foreach (var definition in definitions)\r\n                {\r\n                    var currentDir = Path.GetDirectoryName(file.FullName);\r\n                    var importId = definition.Id + currentDir;\r\n                    foreach (var defProfile in definition.Profiles)\r\n                    {\r\n                        var detectionStr = defProfile.InstallationFile;\r\n                        if (detectionStr.IsNullOrEmpty())\r\n                        {\r\n                            detectionStr = defProfile.StartupExecutable;\r\n                        }\r\n\r\n                        if (detectionStr.IsNullOrEmpty() && !PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        var reqMet = true;\r\n                        var regex = new Regex(detectionStr, RegexOptions.IgnoreCase);\r\n                        if (regex.IsMatch(file.Name))\r\n                        {\r\n                            if (defProfile.ProfileFiles?.Any() == true)\r\n                            {\r\n                                foreach (var reqFile in defProfile.ProfileFiles)\r\n                                {\r\n                                    if (!FileSystem.FileExists(Path.Combine(currentDir, reqFile)))\r\n                                    {\r\n                                        reqMet = false;\r\n                                        break;\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            reqMet = false;\r\n                        }\r\n\r\n                        if (reqMet)\r\n                        {\r\n                            imported.TryGetValue(importId, out var currentEmulator);\r\n                            if (currentEmulator == null)\r\n                            {\r\n                                currentEmulator = new ScannedEmulator()\r\n                                {\r\n                                    Name = definition.Name,\r\n                                    InstallDir = currentDir,\r\n                                    Id = definition.Id,\r\n                                    Profiles = new List<ScannedEmulator.ScannedEmulatorProfile>()\r\n                                };\r\n\r\n                                if (currentDir.StartsWith(PlaynitePaths.ProgramPath, StringComparison.OrdinalIgnoreCase))\r\n                                {\r\n                                    currentEmulator.InstallDir = currentDir.Replace(PlaynitePaths.ProgramPath, ExpandableVariables.PlayniteDirectory, StringComparison.OrdinalIgnoreCase);\r\n                                }\r\n\r\n                                imported.Add(importId, currentEmulator);\r\n                            }\r\n\r\n                            currentEmulator.Profiles.Add(new ScannedEmulator.ScannedEmulatorProfile\r\n                            {\r\n                                ProfileName = defProfile.Name,\r\n                                Name = defProfile.Name\r\n                            });\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return imported.Values.ToList();\r\n        }\r\n    }\r\n\r\n    public class GameScanner\r\n    {\r\n        public class ScanExclusion\r\n        {\r\n            public string Path;\r\n            public bool Absolute = true;\r\n            public bool MatchByRegex = false;\r\n        }\r\n\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private static readonly string[] supportedArchiveExt = new string[] { \"rar\", \"7z\", \"zip\", \"tar\", \"bzip2\", \"gzip\", \"lzip\" };\r\n        private readonly Dictionary<string, bool> isGoogleDriveCache = new Dictionary<string, bool>();\r\n        private readonly GameScannerConfig scanner;\r\n        private List<ScanExclusion> fileExclusions;\r\n        private List<ScanExclusion> directoryExclusions;\r\n\r\n        private readonly IGameDatabaseMain database;\r\n        internal HashSet<string> importedFiles;\r\n        private readonly Func<List<string>, List<EmulationDatabase.IEmulationDatabaseReader>> emuDbProvider;\r\n\r\n        public GameScanner(\r\n            GameScannerConfig scanner,\r\n            IGameDatabaseMain database,\r\n            Func<List<string>, List<EmulationDatabase.IEmulationDatabaseReader>> emuDbProvider = null)\r\n        {\r\n            this.scanner = scanner;\r\n            this.database = database;\r\n            if (emuDbProvider == null)\r\n            {\r\n                this.emuDbProvider = GetEmulationDbs;\r\n            }\r\n            else\r\n            {\r\n                this.emuDbProvider = emuDbProvider;\r\n            }\r\n        }\r\n\r\n        public List<ScannedGame> Scan(\r\n            CancellationToken cancelToken,\r\n            out List<Platform> newPlatforms,\r\n            out List<Region> newRegions,\r\n            Action<string> fileScanCallback = null)\r\n        {\r\n            List<ScannedGame> games;\r\n            newPlatforms = new List<Platform>();\r\n            newRegions = new List<Region>();\r\n\r\n            var emulator = database.Emulators[scanner.EmulatorId];\r\n            if (emulator == null)\r\n            {\r\n                throw new Exception(\"Emulator not found.\");\r\n            }\r\n\r\n            if (scanner.EmulatorProfileId.IsNullOrEmpty())\r\n            {\r\n                throw new Exception(\"No emulator profile specified.\");\r\n            }\r\n\r\n            importedFiles = database.GetImportedRomFiles(emulator.InstallDir);\r\n            var globalScanConfig = database.GetGameScannersSettings();\r\n            var crcExclusions = string.Join(\";\",\r\n                ListExtensions.Merge(globalScanConfig.CrcExcludeFileTypes, scanner.CrcExcludeFileTypes).\r\n                Select(a => a.ToLower().Trim()).ToHashSet());\r\n            var dirToScan = PlaynitePaths.ExpandVariables(scanner.Directory, emulator.InstallDir, true);\r\n\r\n            fileExclusions = ParseExclusions(dirToScan, scanner.ExcludedFiles);\r\n            directoryExclusions = ParseExclusions(dirToScan, scanner.ExcludedDirectories);\r\n\r\n            CustomEmulatorProfile customProfile = null;\r\n            BuiltInEmulatorProfile builtinProfile = null;\r\n            EmulatorDefinitionProfile builtinProfileDef = null;\r\n            if (scanner.EmulatorProfileId.StartsWith(CustomEmulatorProfile.ProfilePrefix, StringComparison.Ordinal))\r\n            {\r\n                customProfile = emulator.CustomProfiles?.FirstOrDefault(a => a.Id == scanner.EmulatorProfileId);\r\n                if (customProfile == null)\r\n                {\r\n                    throw new Exception(\"Assigned custom emulator profile not found.\");\r\n                }\r\n\r\n                games = ScanDirectory(\r\n                    dirToScan,\r\n                    emulator,\r\n                    customProfile,\r\n                    cancelToken,\r\n                    crcExclusions,\r\n                    scanner.ScanSubfolders,\r\n                    scanner.ScanInsideArchives,\r\n                    scanner.MergeRelatedFiles,\r\n                    fileScanCallback);\r\n            }\r\n            else if (scanner.EmulatorProfileId.StartsWith(BuiltInEmulatorProfile.ProfilePrefix, StringComparison.Ordinal))\r\n            {\r\n                builtinProfile = emulator.BuiltinProfiles?.FirstOrDefault(a => a.Id == scanner.EmulatorProfileId);\r\n                if (builtinProfile == null)\r\n                {\r\n                    throw new Exception(\"Assigned built-in emulator profile not found.\");\r\n                }\r\n\r\n                builtinProfileDef = Emulation.GetProfile(emulator.BuiltInConfigId, builtinProfile.BuiltInProfileName);\r\n                if (builtinProfileDef == null)\r\n                {\r\n                    throw new Exception(\"Assigned built-in emulator profile definition not found.\");\r\n                }\r\n\r\n                games = ScanDirectory(\r\n                    dirToScan,\r\n                    emulator,\r\n                    builtinProfile,\r\n                    cancelToken,\r\n                    crcExclusions,\r\n                    scanner.ScanSubfolders,\r\n                    scanner.ScanInsideArchives,\r\n                    scanner.MergeRelatedFiles,\r\n                    fileScanCallback);\r\n            }\r\n            else\r\n            {\r\n                throw new Exception(\"Emulator profile format not supported.\");\r\n            }\r\n\r\n            foreach (var game in games)\r\n            {\r\n                game.SourceEmulator = emulator;\r\n                game.SourceConfig = scanner;\r\n                var assignedRegions = new List<EmulatedRegion>();\r\n                var assignedPlatforms = new List<EmulatedPlatform>();\r\n                foreach (var rom in game.Roms)\r\n                {\r\n                    // REGIONS\r\n                    if (rom.DbData?.Region.IsNullOrEmpty() == false)\r\n                    {\r\n                        var region = Emulation.GetRegionByCode(rom.DbData.Region);\r\n                        if (region != null)\r\n                        {\r\n                            assignedRegions.AddMissing(region);\r\n                        }\r\n                    }\r\n                    else if (rom.Name.Properties.HasItems())\r\n                    {\r\n                        foreach (var prop in rom.Name.Properties)\r\n                        {\r\n                            var region = Emulation.GetRegionByCode(prop);\r\n                            if (region != null)\r\n                            {\r\n                                assignedRegions.AddMissing(region);\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    // PLATFORMS\r\n                    if (rom.DbData != null)\r\n                    {\r\n                        var platform = Emulation.GetPlatformByDatabase(rom.DbDataSource);\r\n                        if (platform != null)\r\n                        {\r\n                            assignedPlatforms.AddMissing(platform);\r\n                        }\r\n                    }\r\n                    else if (builtinProfileDef != null)\r\n                    {\r\n                        assignedPlatforms.AddMissing(Emulation.GetPlatform(builtinProfileDef.Platforms.First()));\r\n                    }\r\n\r\n                    rom.Path = Paths.TrimLongPathPrefix(rom.Path);\r\n                }\r\n\r\n                game.Regions = new List<Region>();\r\n                foreach (var asRegion in assignedRegions)\r\n                {\r\n                    var dbRegion = database.Regions.FirstOrDefault(a => a.SpecificationId == asRegion.Id);\r\n                    if (dbRegion != null)\r\n                    {\r\n                        game.Regions.Add(dbRegion);\r\n                    }\r\n                    else\r\n                    {\r\n                        var generatedReg = newRegions.FirstOrDefault(a => a.SpecificationId == asRegion.Id);\r\n                        if (generatedReg == null)\r\n                        {\r\n                            var newReg = new Region(asRegion.Name) { SpecificationId = asRegion.Id };\r\n                            newRegions.Add(newReg);\r\n                            game.Regions.Add(newReg);\r\n                        }\r\n                        else\r\n                        {\r\n                            game.Regions.Add(generatedReg);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                game.Platforms = new List<Platform>();\r\n                if (scanner.OverridePlatformId != Guid.Empty)\r\n                {\r\n                    var dbPlatform = database.Platforms[scanner.OverridePlatformId];\r\n                    if (dbPlatform != null)\r\n                    {\r\n                        game.Platforms.Add(dbPlatform);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    if (builtinProfile != null)\r\n                    {\r\n                        foreach (var asPlatform in assignedPlatforms)\r\n                        {\r\n                            var dbPlatform = database.Platforms.FirstOrDefault(a => a.SpecificationId == asPlatform.Id);\r\n                            if (dbPlatform != null)\r\n                            {\r\n                                game.Platforms.Add(dbPlatform);\r\n                            }\r\n                            else\r\n                            {\r\n                                var generatedPlat = newPlatforms.FirstOrDefault(a => a.SpecificationId == asPlatform.Id);\r\n                                if (generatedPlat == null)\r\n                                {\r\n                                    var newPlat = new Platform(asPlatform.Name) { SpecificationId = asPlatform.Id };\r\n                                    newPlatforms.Add(newPlat);\r\n                                    game.Platforms.Add(newPlat);\r\n                                }\r\n                                else\r\n                                {\r\n                                    game.Platforms.Add(generatedPlat);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if (customProfile.Platforms.HasItems())\r\n                    {\r\n                        foreach (var asPlatform in customProfile.Platforms)\r\n                        {\r\n                            var dbPlatform = database.Platforms[asPlatform];\r\n                            if (dbPlatform != null)\r\n                            {\r\n                                game.Platforms.Add(dbPlatform);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                var releaseYear = game.Roms.FirstOrDefault(a => a.DbData?.ReleaseYear.IsNullOrEmpty() == false)?.DbData.ReleaseYear;\r\n                if (!releaseYear.IsNullOrEmpty())\r\n                {\r\n                    if (ReleaseDate.TryDeserialize(releaseYear, out var releaseDate))\r\n                    {\r\n                        game.ReleaseDate = releaseDate;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return games;\r\n        }\r\n\r\n        public static List<ScanExclusion> ParseExclusions(string rootDir, List<string> exclusions)\r\n        {\r\n            var result = new List<ScanExclusion>();\r\n            if (!exclusions.HasItems())\r\n            {\r\n                return result;\r\n            }\r\n\r\n            foreach (var excl in exclusions)\r\n            {\r\n                if (excl.IsNullOrWhiteSpace())\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                var exclusion = new ScanExclusion();\r\n                for (int i = 0; i < excl.Length; i++)\r\n                {\r\n                    if (excl[i] == '>')\r\n                    {\r\n                        exclusion.Absolute = false;\r\n                    }\r\n                    else if (excl[i] == '?')\r\n                    {\r\n                        exclusion.MatchByRegex = true;\r\n                    }\r\n                    else\r\n                    {\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (exclusion.Absolute)\r\n                {\r\n                    if (exclusion.MatchByRegex)\r\n                    {\r\n                        exclusion.Path = Regex.Escape(rootDir.EndWithDirSeparator()) + excl.TrimStart('>', '?').Trim();\r\n                    }\r\n                    else\r\n                    {\r\n                        exclusion.Path = Path.Combine(rootDir, excl.TrimStart('>', '?').Trim());\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    exclusion.Path = excl.TrimStart('>', '?').Trim();\r\n                }\r\n\r\n                result.Add(exclusion);\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        public static List<string> GetFileExclusionMatches(List<string> files, List<ScanExclusion> exclusions)\r\n        {\r\n            var matches = new List<string>();\r\n            foreach (var excFile in exclusions)\r\n            {\r\n                if (excFile.MatchByRegex)\r\n                {\r\n                    // exclusion parser already appends root path if needed so same match can be done here\r\n                    // for any level match and absolute path match\r\n                    var match = files.Where(a => Regex.IsMatch(a, excFile.Path, RegexOptions.IgnoreCase));\r\n                    matches.AddMissing(match);\r\n                }\r\n                else if (excFile.Absolute)\r\n                {\r\n                    var match = files.FirstOrDefault(a => a.Equals(excFile.Path, StringComparison.OrdinalIgnoreCase));\r\n                    if (match != null)\r\n                    {\r\n                        matches.AddMissing(match);\r\n                    }\r\n                }\r\n                else if (!excFile.Absolute)\r\n                {\r\n                    var comp = excFile.Path.PrefixWithDirSeparator();\r\n                    var match = files.Where(a => a.EndsWith(comp, StringComparison.OrdinalIgnoreCase));\r\n                    matches.AddMissing(match);\r\n                }\r\n                else\r\n                {\r\n                    throw new Exception(\"Uknown file exclusion configuration.\");\r\n                }\r\n            }\r\n\r\n            return matches;\r\n        }\r\n\r\n        public static List<string> GetDirectoryExclusionMatches(List<string> dirs, List<ScanExclusion> exclusions)\r\n        {\r\n            var matches = new List<string>();\r\n            foreach (var excDir in exclusions)\r\n            {\r\n                if (excDir.MatchByRegex)\r\n                {\r\n                    // exclusion parser already appends root path if needed so same match can be done here\r\n                    // for any level match and absolute path match\r\n                    var match = dirs.Where(a => Regex.IsMatch(a.TrimEnd(Paths.DirectorySeparators), excDir.Path, RegexOptions.IgnoreCase));\r\n                    matches.AddMissing(match);\r\n                }\r\n                else if (excDir.Absolute && !excDir.MatchByRegex)\r\n                {\r\n                    var match = dirs.FirstOrDefault(a => a.TrimEnd(Paths.DirectorySeparators).Equals(excDir.Path.TrimEnd(Paths.DirectorySeparators), StringComparison.OrdinalIgnoreCase));\r\n                    if (match != null)\r\n                    {\r\n                        matches.AddMissing(match);\r\n                    }\r\n                }\r\n                else if (!excDir.Absolute && !excDir.MatchByRegex)\r\n                {\r\n                    var comp = excDir.Path.PrefixWithDirSeparator().TrimEnd(Paths.DirectorySeparators);\r\n                    var match = dirs.Where(a => a.TrimEnd(Paths.DirectorySeparators).EndsWith(comp, StringComparison.OrdinalIgnoreCase));\r\n                    matches.AddMissing(match);\r\n                }\r\n            }\r\n\r\n            return matches;\r\n        }\r\n\r\n        private List<ScannedGame> ScanDirectory(\r\n            string directory,\r\n            Emulator emulator,\r\n            BuiltInEmulatorProfile profile,\r\n            CancellationToken cancelToken,\r\n            string crcExludePatterns,\r\n            bool scanSubfolders,\r\n            bool scanArchives,\r\n            bool mergeRelatedFiles,\r\n            Action<string> fileScanCallback = null)\r\n        {\r\n            var emuProf = Emulation.GetProfile(emulator.BuiltInConfigId, profile.BuiltInProfileName);\r\n            if (emuProf == null)\r\n            {\r\n                throw new Exception($\"Emulator {emulator.BuiltInConfigId} and profile {profile.BuiltInProfileName} not found.\");\r\n            }\r\n\r\n            if (emuProf.ScriptGameImport)\r\n            {\r\n                object scannedGames = null;\r\n                Exception failExc = null;\r\n                var importRuntime = new PowerShellRuntime(\"Emu game import\");\r\n                var scriptTask = Task.Run(() =>\r\n                {\r\n                    try\r\n                    {\r\n                        scannedGames = importRuntime.ExecuteFile(\r\n                            Emulation.GetGameImportScriptPath(Emulation.GetDefition(emulator.BuiltInConfigId)),\r\n                            emulator.InstallDir,\r\n                            new Dictionary<string, object>\r\n                            {\r\n                                { \"CancelToken\", cancelToken },\r\n                                { \"Emulator\", emulator },\r\n                                { \"EmulatorProfile\", emuProf },\r\n                                { \"ScanDirectory\", directory },\r\n                                { \"PlayniteApi\", SDK.API.Instance },\r\n                                { \"ImportedFiles\", importedFiles }\r\n                            });\r\n                    }\r\n                    catch (Exception e)\r\n                    {\r\n                        failExc = e;\r\n                        logger.Error(e, \"Failed to scan directory using emulator.\");\r\n                    }\r\n                    finally\r\n                    {\r\n                        importRuntime.Dispose();\r\n                    }\r\n                });\r\n\r\n                while (true)\r\n                {\r\n                    Thread.Sleep(200);\r\n                    if (cancelToken.IsCancellationRequested)\r\n                    {\r\n                        scriptTask.Wait(5000);\r\n                        if (!importRuntime.IsDisposed)\r\n                        {\r\n                            importRuntime.Dispose();\r\n                        }\r\n\r\n                        return new List<ScannedGame>();\r\n                    }\r\n\r\n                    if (failExc != null)\r\n                    {\r\n                        throw failExc;\r\n                    }\r\n\r\n                    if (scriptTask.IsCompleted)\r\n                    {\r\n                        return ParseScriptScanResult(\r\n                            scannedGames, emuProf);\r\n                    }\r\n\r\n                    if (scriptTask.IsCanceled || scriptTask.IsFaulted)\r\n                    {\r\n                        return new List<ScannedGame>();\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return ScanDirectory(\r\n                    directory,\r\n                    emuProf.ImageExtensions?.Select(a => a.Trim()).ToList(),\r\n                    emuProf.Platforms,\r\n                    cancelToken,\r\n                    crcExludePatterns,\r\n                    scanSubfolders,\r\n                    scanArchives,\r\n                    mergeRelatedFiles,\r\n                    fileScanCallback);\r\n            }\r\n        }\r\n\r\n        private List<ScannedGame> ScanDirectory(\r\n            string directory,\r\n            Emulator emulator,\r\n            CustomEmulatorProfile profile,\r\n            CancellationToken cancelToken,\r\n            string crcExludePatterns,\r\n            bool scanSubfolders,\r\n            bool scanArchives,\r\n            bool mergeRelatedFiles,\r\n            Action<string> fileScanCallback = null)\r\n        {\r\n            if (profile == null)\r\n            {\r\n                throw new Exception($\"No profile provided.\");\r\n            }\r\n\r\n            if (!profile.ImageExtensions.HasItems())\r\n            {\r\n                return new List<ScannedGame>();\r\n            }\r\n\r\n            var platforms = profile.Platforms?.Select(a => database.Platforms[a]?.SpecificationId).Where(a => !a.IsNullOrEmpty()).ToList();\r\n            return ScanDirectory(\r\n                directory,\r\n                profile.ImageExtensions.Select(a => a.Trim()).ToList(),\r\n                platforms,\r\n                cancelToken,\r\n                crcExludePatterns,\r\n                scanSubfolders,\r\n                scanArchives,\r\n                mergeRelatedFiles,\r\n                fileScanCallback);\r\n        }\r\n\r\n        private List<ScannedGame> ScanDirectory(\r\n            string directory,\r\n            List<string> supportedExtensions,\r\n            List<string> scanPlatforms,\r\n            CancellationToken cancelToken,\r\n            string crcExludePatterns,\r\n            bool scanSubfolders,\r\n            bool scanArchives,\r\n            bool mergeRelatedFiles,\r\n            Action<string> fileScanCallback = null)\r\n        {\r\n            logger.Info($\"Scanning emulated directory {directory}.\");\r\n            if (!FileSystem.DirectoryExists(directory))\r\n            {\r\n                throw new Exception($\"Can't scan emulation directory, {directory} doesn't exist.\");\r\n            }\r\n\r\n            var emuDbs = emuDbProvider(scanPlatforms);\r\n            var resultGames = new List<ScannedGame>();\r\n\r\n            try\r\n            {\r\n                ScanDirectoryBase(\r\n                    directory,\r\n                    supportedExtensions,\r\n                    emuDbs,\r\n                    resultGames,\r\n                    cancelToken,\r\n                    crcExludePatterns,\r\n                    scanSubfolders,\r\n                    scanArchives,\r\n                    mergeRelatedFiles,\r\n                    fileScanCallback);\r\n            }\r\n            finally\r\n            {\r\n                emuDbs.ForEach(a => a.Dispose());\r\n            }\r\n\r\n            return resultGames;\r\n        }\r\n\r\n        internal void ScanDirectoryBase(\r\n            string directory,\r\n            List<string> supportedExtensions,\r\n            List<EmulationDatabase.IEmulationDatabaseReader> databases,\r\n            List<ScannedGame> resultGames,\r\n            CancellationToken cancelToken,\r\n            string crcExludePatterns,\r\n            bool scanSubfolders,\r\n            bool scanArchives,\r\n            bool mergeRelatedFiles,\r\n            Action<string> fileScanCallback = null)\r\n        {\r\n            void addRom(ScannedRom rom)\r\n            {\r\n                if (mergeRelatedFiles)\r\n                {\r\n                    var existing = resultGames.FirstOrDefault(a => a.Name == rom.Name.SanitizedName);\r\n                    if (existing != null)\r\n                    {\r\n                        existing.Roms.Add(rom);\r\n                    }\r\n                    else\r\n                    {\r\n                        resultGames.Add(new ScannedGame\r\n                        {\r\n                            Name = rom.Name.SanitizedName,\r\n                            Roms = new ObservableCollection<ScannedRom> { rom }\r\n                        });\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    resultGames.Add(new ScannedGame\r\n                    {\r\n                        Name = rom.Name.SanitizedName,\r\n                        Roms = new ObservableCollection<ScannedRom> { rom }\r\n                    });\r\n                }\r\n            }\r\n\r\n            List<string> files;\r\n            List<string> dirs;\r\n            try\r\n            {\r\n                directory = Paths.FixPathLength(directory);\r\n                files = Directory.GetFiles(directory).ToList();\r\n                dirs = Directory.GetDirectories(directory).ToList();\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to enumarete directory entires.\");\r\n                return;\r\n            }\r\n\r\n            fileScanCallback?.Invoke(directory);\r\n            if (fileExclusions.HasItems())\r\n            {\r\n                var matches = GetFileExclusionMatches(files, fileExclusions);\r\n                if (matches.HasItems())\r\n                {\r\n                    matches.ForEach(a => files.Remove(a));\r\n                }\r\n            }\r\n\r\n            void processPlayListFile(string filePath, Func<string, List<string>> playListParser)\r\n            {\r\n                var fileExt = Path.GetExtension(filePath).TrimStart('.');\r\n                files.Remove(filePath);\r\n\r\n                try\r\n                {\r\n                    var childFiles = playListParser(filePath);\r\n                    foreach (var child in childFiles ?? new List<string>())\r\n                    {\r\n                        var existingFile = files.FirstOrDefault(a => a.Equals(child, StringComparison.OrdinalIgnoreCase));\r\n                        if (existingFile != null)\r\n                        {\r\n                            files.Remove(existingFile);\r\n                        }\r\n                    }\r\n\r\n                    if (importedFiles.ContainsString(Path.GetFullPath(filePath), StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    if (!childFiles.HasItems())\r\n                    {\r\n                        logger.Trace($\"Detected playlist file with no referenced files: {filePath}\");\r\n                        addRom(new ScannedRom(filePath));\r\n                        return;\r\n                    }\r\n\r\n                    Tuple<DatGame, string> romData = null;\r\n                    foreach (var childPath in childFiles)\r\n                    {\r\n                        if (cancelToken.IsCancellationRequested)\r\n                        {\r\n                            return;\r\n                        }\r\n\r\n                        if (!FileSystem.FileExists(childPath))\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        fileScanCallback?.Invoke(childPath);\r\n                        var crcScan = true;\r\n                        if (databases.HasItems())\r\n                        {\r\n                            if (scanner.ExcludeOnlineFiles && !IsFileDataAvailable(childPath))\r\n                            {\r\n                                if (scanner.UseSimplifiedOnlineFileScan)\r\n                                {\r\n                                    crcScan = false;\r\n                                }\r\n                                else\r\n                                {\r\n                                    logger.Trace($\"Skipping scan of {childPath} rom, scan of online files is disabled.\");\r\n                                    continue;\r\n                                }\r\n                            }\r\n\r\n                            if (crcScan && Paths.MathcesFilePattern(childPath, crcExludePatterns))\r\n                            {\r\n                                logger.Trace($\"Skipping crc check of {childPath}. Excluded by pattern settings.\");\r\n                                crcScan = false;\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            crcScan = false;\r\n                        }\r\n\r\n                        romData = LookupGameInDb(\r\n                            childPath,\r\n                            Path.GetExtension(childPath).TrimStart('.'),\r\n                            supportedExtensions,\r\n                            databases,\r\n                            crcScan,\r\n                            scanArchives);\r\n                        if (romData != null)\r\n                        {\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    if (romData != null)\r\n                    {\r\n                        logger.Trace($\"Detected rom with db info:{filePath}\\n{romData.Item1}\");\r\n                        addRom(new ScannedRom(filePath, romData.Item1, romData.Item2));\r\n                    }\r\n                    else\r\n                    {\r\n                        logger.Trace($\"Detected rom: {filePath}\");\r\n                        addRom(new ScannedRom(filePath));\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to process {fileExt} playlist file {filePath}\");\r\n                }\r\n\r\n                fileScanCallback?.Invoke(directory);\r\n            }\r\n\r\n            // Cue files have priority since they will potentionaliy remove additional .bin files to match\r\n            if (supportedExtensions.ContainsString(\"cue\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                // ToList is needed here because we are potentionally modifing original files collection when playlist files are excluded\r\n                foreach (var cueFile in files.Where(a => a.EndsWith(\".cue\", StringComparison.OrdinalIgnoreCase)).ToList())\r\n                {\r\n                    processPlayListFile(cueFile, (cFile) => CueSheet.GetFileEntries(cFile).Select(a => Path.Combine(directory, a.Path)).ToList());\r\n                }\r\n            }\r\n\r\n            // The same as with cue but for m3u playlist\r\n            if (supportedExtensions.ContainsString(\"m3u\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                // ToList is needed here because we are potentionally modifing original files collection when playlist files are excluded\r\n                foreach (var m3uFile in files.ToList().Where(a => a.EndsWith(\".m3u\", StringComparison.OrdinalIgnoreCase)).ToList())\r\n                {\r\n                    processPlayListFile(m3uFile, (mFile) => M3U.GetEntries(mFile).Select(a => Path.Combine(directory, a.Path)).ToList());\r\n                }\r\n            }\r\n\r\n            // gdi files are basically cue files for Dreamcast dumps\r\n            if (supportedExtensions.ContainsString(\"gdi\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                // ToList is needed here because we are potentionally modifing original files collection when playlist files are excluded\r\n                foreach (var gdiFile in files.ToList().Where(a => a.EndsWith(\".gdi\", StringComparison.OrdinalIgnoreCase)).ToList())\r\n                {\r\n                    processPlayListFile(gdiFile, (mFile) => GdiFile.GetEntries(mFile).Select(a => Path.Combine(directory, a.Path)).ToList());\r\n                }\r\n            }\r\n\r\n            foreach (var file in files)\r\n            {\r\n                if (cancelToken.IsCancellationRequested)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                string ext = null;\r\n                foreach (var supportedExt in supportedExtensions)\r\n                {\r\n                    // This is done this way to support nested extensions like PICO-8's .p8.png\r\n                    if (file.EndsWith(\".\" + supportedExt, StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        ext = supportedExt;\r\n                        break;\r\n                    }\r\n                    else if (supportedExt == \"<none>\" && Path.GetExtension(file).IsNullOrEmpty())\r\n                    {\r\n                        ext = \"<none>\";\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (ext == null)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (!supportedExtensions.ContainsString(ext, StringComparison.OrdinalIgnoreCase))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (importedFiles.ContainsString(Path.GetFullPath(file), StringComparison.OrdinalIgnoreCase))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                try\r\n                {\r\n                    var crcScan = true;\r\n                    if (databases.HasItems())\r\n                    {\r\n                        if (scanner.ExcludeOnlineFiles && !IsFileDataAvailable(file))\r\n                        {\r\n                            if (scanner.UseSimplifiedOnlineFileScan)\r\n                            {\r\n                                crcScan = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                logger.Trace($\"Skipping scan of {file} rom, scan of online files is disabled.\");\r\n                                continue;\r\n                            }\r\n                        }\r\n\r\n                        if (crcScan && Paths.MathcesFilePattern(file, crcExludePatterns))\r\n                        {\r\n                            logger.Trace($\"Skipping crc check of {file}. Excluded by pattern settings.\");\r\n                            crcScan = false;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        crcScan = false;\r\n                    }\r\n\r\n                    if (crcScan)\r\n                    {\r\n                        fileScanCallback?.Invoke(file);\r\n                    }\r\n\r\n                    var romData = LookupGameInDb(\r\n                        file,\r\n                        ext,\r\n                        supportedExtensions,\r\n                        databases,\r\n                        crcScan,\r\n                        scanArchives);\r\n                    if (romData != null)\r\n                    {\r\n                        logger.Trace($\"Detected rom with db info:{file}\\n{romData.Item1}\");\r\n                        addRom(new ScannedRom(file, romData.Item1, romData.Item2));\r\n                    }\r\n                    else\r\n                    {\r\n                        logger.Trace($\"Detected rom: {file}\");\r\n                        addRom(new ScannedRom(file, ext));\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed scan rom file {file}\");\r\n                }\r\n\r\n                fileScanCallback?.Invoke(directory);\r\n            }\r\n\r\n            if (scanSubfolders)\r\n            {\r\n                if (directoryExclusions.HasItems())\r\n                {\r\n                    var matches = GetDirectoryExclusionMatches(dirs, directoryExclusions);\r\n                    if (matches.HasItems())\r\n                    {\r\n                        matches.ForEach(a => dirs.Remove(a));\r\n                    }\r\n                }\r\n\r\n                foreach (var dir in dirs)\r\n                {\r\n                    if (cancelToken.IsCancellationRequested)\r\n                    {\r\n                        break;\r\n                    }\r\n\r\n                    ScanDirectoryBase(\r\n                        dir,\r\n                        supportedExtensions,\r\n                        databases,\r\n                        resultGames,\r\n                        cancelToken,\r\n                        crcExludePatterns,\r\n                        scanSubfolders,\r\n                        scanArchives,\r\n                        mergeRelatedFiles,\r\n                        fileScanCallback);\r\n                }\r\n            }\r\n        }\r\n\r\n        private Tuple<DatGame, string> LookupGameInDb(\r\n            string file,\r\n            string fileExt,\r\n            List<string> supportedExtensions,\r\n            List<EmulationDatabase.IEmulationDatabaseReader> databases,\r\n            bool scanCrc,\r\n            bool scanArchives)\r\n        {\r\n            if (databases.HasItems())\r\n            {\r\n                file = Paths.FixPathLength(file);\r\n                DatGame datRec = null;\r\n                string datRecSource = null;\r\n                List<string> crcs = new List<string>();\r\n\r\n                if (scanCrc)\r\n                {\r\n                    if (IsSupportedArchiveExtension(fileExt) && scanArchives)\r\n                    {\r\n                        var archFiles = Archive.GetArchiveFiles(file);\r\n                        var supportedFiles = archFiles.Where(a =>\r\n                            supportedExtensions.ContainsString(Path.GetExtension(a).TrimStart('.'), StringComparison.OrdinalIgnoreCase));\r\n                        foreach (var supportedFile in supportedFiles)\r\n                        {\r\n                            logger.Trace($\"Getting rom crc from archive file '{supportedFile}'\\r\\n {file}\");\r\n                            var streams = Archive.GetEntryStream(file, supportedFile);\r\n                            if (streams != null)\r\n                            {\r\n                                using (streams.Item2)\r\n                                using (streams.Item1)\r\n                                {\r\n                                    crcs.AddMissing(FileSystem.GetCRC32(streams.Item1));\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        if (!crcs.HasItems())\r\n                        {\r\n                            logger.Trace($\"Failed to get crc info from archive: {file}\");\r\n                            crcs.Add(FileSystem.GetCRC32(file));\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        logger.Trace($\"Getting rom crc from file: {file}\");\r\n                        crcs.Add(FileSystem.GetCRC32(file));\r\n                    }\r\n                }\r\n\r\n                foreach (var db in databases)\r\n                {\r\n                    // This is quick fix for high memory usage due to SQLNado's statement cache use.\r\n                    // This is mostly caused on our side because how ineffiently this whole ROM db lookup stuff is implemented\r\n                    // and it should be rewritten, but that's going to be done in P11.\r\n                    db.ClearStatementCache();\r\n                    foreach (var crc in crcs)\r\n                    {\r\n                        datRec = db.GetByCrc(crc).FirstOrDefault();\r\n                        if (datRec != null)\r\n                        {\r\n                            datRecSource = db.DatabaseName;\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    if (datRecSource != null)\r\n                    {\r\n                        break;\r\n                    }\r\n\r\n                    var fileName = Path.GetFileName(file);\r\n                    datRec = db.GetByRomName(fileName).FirstOrDefault();\r\n                    if (datRec != null)\r\n                    {\r\n                        datRecSource = db.DatabaseName;\r\n                        break;\r\n                    }\r\n\r\n                    // This is mainly for XBLA games that have those weird file names\r\n                    datRec = db.GetByRomNamePartial(fileName).FirstOrDefault();\r\n                    if (datRec != null)\r\n                    {\r\n                        datRecSource = db.DatabaseName;\r\n                        break;\r\n                    }\r\n\r\n                    // For rare cases where ROM file name is the same as game's serial\r\n                    datRec = db.GetBySerial(Path.GetFileNameWithoutExtension(file)).FirstOrDefault();\r\n                    if (datRec != null)\r\n                    {\r\n                        datRecSource = db.DatabaseName;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (datRec == null)\r\n                {\r\n                    return null;\r\n                }\r\n                else\r\n                {\r\n                    return new Tuple<DatGame, string>(datRec, datRecSource);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        private List<EmulationDatabase.IEmulationDatabaseReader> GetEmulationDbs(List<string> platformIds)\r\n        {\r\n            var supportedPlatforms = Emulation.Platforms.Where(a => platformIds?.Contains(a.Id) == true);\r\n            var supportedDatabases = supportedPlatforms.Where(a => a.Databases.HasItems()).SelectMany(a => a.Databases).Distinct();\r\n            var emuDbs = new List<EmulationDatabase.IEmulationDatabaseReader>();\r\n            foreach (var supDb in supportedDatabases)\r\n            {\r\n                var db = EmulationDatabase.GetDatabase(supDb, PlaynitePaths.EmulationDatabasePath);\r\n                if (db != null)\r\n                {\r\n                    emuDbs.Add(db);\r\n                }\r\n            }\r\n\r\n            return emuDbs;\r\n        }\r\n\r\n        private static ScannedGame ParseScripScannedGame(\r\n            ScriptScannedGame scriptGame,\r\n            List<EmulationDatabase.IEmulationDatabaseReader> emuDbs)\r\n        {\r\n            var game = new ScannedGame();\r\n            game.Name = scriptGame.Name ?? scriptGame.Serial;\r\n            game.Roms = new ObservableCollection<ScannedRom>();\r\n            game.ScriptSource = scriptGame;\r\n\r\n            if (scriptGame.Serial.IsNullOrEmpty())\r\n            {\r\n                game.Roms.Add(new ScannedRom(scriptGame.Path));\r\n            }\r\n            else\r\n            {\r\n                DatGame datRec = null;\r\n                string datRecSource = null;\r\n                foreach (var db in emuDbs)\r\n                {\r\n                    datRec = db.GetBySerial(scriptGame.Serial).FirstOrDefault();\r\n                    if (datRec != null)\r\n                    {\r\n                        datRecSource = db.DatabaseName;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (datRec == null)\r\n                {\r\n                    game.Roms.Add(new ScannedRom(scriptGame.Path));\r\n                }\r\n                else\r\n                {\r\n                    var romData = new ScannedRom(scriptGame.Path, datRec, datRecSource);\r\n                    game.Roms.Add(romData);\r\n                    game.Name = romData.Name.SanitizedName;\r\n                }\r\n            }\r\n\r\n            return game;\r\n        }\r\n\r\n        private List<ScannedGame> ParseScriptScanResult(\r\n            object scanResult,\r\n            EmulatorDefinitionProfile emuProf)\r\n        {\r\n            if (scanResult == null)\r\n            {\r\n                return new List<ScannedGame>();\r\n            }\r\n\r\n            if (!(scanResult is ScriptScannedGame) && !(scanResult is List<object>))\r\n            {\r\n                if (PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    throw new Exception($\"Scanning script returned unknown data type {scanResult.GetType()}\");\r\n                }\r\n                else\r\n                {\r\n                    logger.Error($\"Scanning script returned unknown data type {scanResult.GetType()}\");\r\n                    return new List<ScannedGame>();\r\n                }\r\n            }\r\n\r\n            var emuDbs = emuDbProvider(emuProf.Platforms);\r\n            try\r\n            {\r\n                if (scanResult is ScriptScannedGame game)\r\n                {\r\n                    return new List<ScannedGame>() { ParseScripScannedGame(game, emuDbs) };\r\n                }\r\n                else if (scanResult is List<object> games)\r\n                {\r\n                    var result = new List<ScannedGame>();\r\n                    foreach (ScriptScannedGame scannedGame in games)\r\n                    {\r\n                        result.Add(ParseScripScannedGame(scannedGame, emuDbs));\r\n                    }\r\n\r\n                    return result;\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                emuDbs.ForEach(a => a.Dispose());\r\n            }\r\n\r\n            return new List<ScannedGame>();\r\n        }\r\n\r\n        private static bool IsSupportedArchiveExtension(string extension)\r\n        {\r\n            return supportedArchiveExt.ContainsString(extension, StringComparison.OrdinalIgnoreCase);\r\n        }\r\n\r\n        private bool IsFileDataAvailable(string path)\r\n        {\r\n            if (!Paths.IsFullPath(path))\r\n            {\r\n                path = Path.GetFullPath(path);\r\n            }\r\n\r\n            if (!FileSystem.FileExists(path))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            var longPath = @\"\\\\?\\\" + path;\r\n            var att = Kernel32.GetFileAttributesW(longPath);\r\n            if ((Winnt.FILE_ATTRIBUTE_OFFLINE & att) > 0)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            // Used by OneDrive\r\n            if ((Winnt.FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS & att) > 0)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if ((Winnt.FILE_ATTRIBUTE_SPARSE_FILE & att) > 0)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            // GoogleDrive file check\r\n            var driveLetter = Path.GetPathRoot(path);\r\n            if (!isGoogleDriveCache.TryGetValue(driveLetter, out var isGoogleDrive))\r\n            {\r\n                var drive = DriveInfo.GetDrives().First(a => string.Equals(a.Name, driveLetter, StringComparison.OrdinalIgnoreCase));\r\n                isGoogleDrive = drive.VolumeLabel?.Contains(\"Google\") == true;\r\n                isGoogleDriveCache.Add(driveLetter, isGoogleDrive);\r\n            }\r\n\r\n            if (isGoogleDrive)\r\n            {\r\n                // Based on undocumented file metadata\r\n                // https://stackoverflow.com/questions/51439810/get-google-drive-files-links-using-drive-file-stream/52107704#52107704\r\n                longPath = longPath += \":user.drive.itemprotostr\";\r\n                try\r\n                {\r\n                    // Downloaded files (even partially) will have \"content-entry\" property\r\n                    var fileMetadata = File.ReadAllText(longPath);\r\n                    return fileMetadata.Contains(\"key: \\\"content-entry\\\"\");\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get file metadata from Google Drive file. {longPath}\");\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n\r\n    public class ScriptScannedGame\r\n    {\r\n        public string Path { get; set; }\r\n        public string Serial { get; set; }\r\n        public string Name { get; set; }\r\n    }\r\n\r\n    public class ScannedGame : ObservableObject\r\n    {\r\n        #region backing fields\r\n        private bool import = true;\r\n        private ObservableCollection<ScannedRom> roms;\r\n        private List<Platform> platforms;\r\n        private List<Region> regions;\r\n        private string name;\r\n        private GameScannerConfig sourceConfig;\r\n        private ReleaseDate? releaseDate;\r\n        private ScriptScannedGame scriptSource;\r\n        private Emulator sourceEmulator;\r\n        #endregion backing fields\r\n\r\n        public bool Import                              { get => import; set => SetValue(ref import, value); }\r\n        public ObservableCollection<ScannedRom> Roms    { get => roms; set => SetValue(ref roms, value); }\r\n        public List<Platform> Platforms                 { get => platforms; set => SetValue(ref platforms, value); }\r\n        public List<Region> Regions                     { get => regions; set => SetValue(ref regions, value); }\r\n        public string Name                              { get => name; set => SetValue(ref name, value); }\r\n        public GameScannerConfig SourceConfig           { get => sourceConfig; set => SetValue(ref sourceConfig, value); }\r\n        public ReleaseDate? ReleaseDate                 { get => releaseDate; set => SetValue(ref releaseDate, value); }\r\n        public ScriptScannedGame ScriptSource           { get => scriptSource; set => SetValue(ref scriptSource, value); }\r\n        public Emulator SourceEmulator                  { get => sourceEmulator; set => SetValue(ref sourceEmulator, value); }\r\n\r\n        public Game ToGame()\r\n        {\r\n            var game = new Game(Name)\r\n            {\r\n                IsInstalled = true,\r\n                ReleaseDate = ReleaseDate\r\n            };\r\n\r\n            if (Platforms.HasItems())\r\n            {\r\n                game.PlatformIds = Platforms.Select(a => a.Id).ToList();\r\n            }\r\n\r\n            if (Regions.HasItems())\r\n            {\r\n                game.RegionIds = Regions.Select(a => a.Id).ToList();\r\n            }\r\n\r\n            var playAction = new GameAction\r\n            {\r\n                Type = GameActionType.Emulator,\r\n                EmulatorId = SourceConfig.EmulatorId,\r\n                EmulatorProfileId = SourceConfig.EmulatorProfileId,\r\n                IsPlayAction = true,\r\n                Name = Name\r\n            };\r\n\r\n            if (sourceConfig.PlayActionSettings == ScannerConfigPlayActionSettings.SelectProfiteOnStart)\r\n            {\r\n                playAction.EmulatorProfileId = null;\r\n            }\r\n            else if (sourceConfig.PlayActionSettings == ScannerConfigPlayActionSettings.SelectEmulatorOnStart)\r\n            {\r\n                playAction.EmulatorProfileId = null;\r\n                playAction.EmulatorId = Guid.Empty;\r\n            }\r\n\r\n            game.GameActions = new ObservableCollection<GameAction> { playAction };\r\n            if (Roms.HasItems())\r\n            {\r\n                var commonPath = Paths.GetCommonDirectory(Roms.Select(a => a.Path).ToArray());\r\n                game.Roms = new ObservableCollection<GameRom>();\r\n\r\n                var toReplace = string.Empty;\r\n                var varToReplace = string.Empty;\r\n                if (sourceConfig.ImportWithRelativePaths)\r\n                {\r\n                    var emuDir = GameExtensions.ExpandVariables(new Game(), SourceEmulator.InstallDir, true) ?? string.Empty;\r\n                    if (commonPath.StartsWith(emuDir, StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        varToReplace = ExpandableVariables.EmulatorDirectory.EndWithDirSeparator();\r\n                        toReplace = emuDir.EndWithDirSeparator();\r\n                    }\r\n                    else if (commonPath.StartsWith(PlaynitePaths.ProgramPath, StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        varToReplace = ExpandableVariables.PlayniteDirectory.EndWithDirSeparator();\r\n                        toReplace = PlaynitePaths.ProgramPath.EndWithDirSeparator();\r\n                    }\r\n                }\r\n\r\n                if (sourceConfig.ImportWithRelativePaths && !toReplace.IsNullOrEmpty())\r\n                {\r\n                    game.InstallDirectory = commonPath.Replace(toReplace, varToReplace, StringComparison.OrdinalIgnoreCase);\r\n                }\r\n                else\r\n                {\r\n                    game.InstallDirectory = commonPath;\r\n                }\r\n\r\n                foreach (var rom in Roms.Where(a => a.Import))\r\n                {\r\n                    var gameRom = new GameRom();\r\n                    if (rom.Name.DiscName.IsNullOrEmpty())\r\n                    {\r\n                        gameRom.Name = rom.Name.SanitizedName;\r\n                    }\r\n                    else\r\n                    {\r\n                        if (rom.Name.Properties.Count > 1)\r\n                        {\r\n                            gameRom.Name = rom.Name.DiscName + \" - \" + string.Join(\" - \", rom.Name.Properties.Where(a => a != rom.Name.DiscName));\r\n                        }\r\n                        else\r\n                        {\r\n                            gameRom.Name = rom.Name.DiscName;\r\n                        }\r\n                    }\r\n\r\n                    if (commonPath.IsNullOrEmpty())\r\n                    {\r\n                        gameRom.Path = rom.Path;\r\n                    }\r\n                    else\r\n                    {\r\n                        gameRom.Path = rom.Path.Replace(commonPath, ExpandableVariables.InstallationDirectory.EndWithDirSeparator(), StringComparison.OrdinalIgnoreCase);\r\n                    }\r\n\r\n                    game.Roms.Add(gameRom);\r\n                }\r\n            }\r\n\r\n            return game;\r\n        }\r\n    }\r\n\r\n    public class ScannedRom : ObservableObject\r\n    {\r\n        #region backing fields\r\n        private bool import = true;\r\n        #endregion backing fields\r\n\r\n        public bool Import { get => import; set => SetValue(ref import, value); }\r\n        public DatGame DbData { get; set; }\r\n        public RomName Name { get; set; }\r\n        public string Path { get; set; }\r\n        public string DbDataSource { get; set; }\r\n\r\n        public ScannedRom(string path)\r\n        {\r\n            Path = path;\r\n            Name = new RomName(System.IO.Path.GetFileNameWithoutExtension(path));\r\n        }\r\n\r\n        public ScannedRom(string path, string scannedExtension)\r\n        {\r\n            Path = path;\r\n            if (path.EndsWith(\".\" + scannedExtension, StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                var fileName = System.IO.Path.GetFileName(path);\r\n                if (scannedExtension.Equals(\"gz\", StringComparison.OrdinalIgnoreCase))\r\n                {\r\n                    fileName = fileName.TrimEndString(\".gz\", StringComparison.OrdinalIgnoreCase);\r\n                    var trimIndex = fileName.LastIndexOf(\".\", StringComparison.OrdinalIgnoreCase);\r\n                    if (trimIndex < 0)\r\n                    {\r\n                        Name = new RomName(fileName);\r\n                    }\r\n                    else\r\n                    {\r\n                        Name = new RomName(fileName.Substring(0, trimIndex));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    Name = new RomName(fileName.Substring(0, fileName.LastIndexOf(\".\" + scannedExtension, StringComparison.OrdinalIgnoreCase)));\r\n                }\r\n            }\r\n            else\r\n            {\r\n                Name = new RomName(System.IO.Path.GetFileNameWithoutExtension(path));\r\n            }\r\n        }\r\n\r\n        public ScannedRom(string path, DatGame dbData, string dbDataSource)\r\n        {\r\n            Path = path;\r\n            DbData = dbData;\r\n            DbDataSource = dbDataSource;\r\n            if (!dbData.Name.IsNullOrEmpty())\r\n            {\r\n                Name = new RomName(dbData.Name);\r\n            }\r\n            else if (!dbData.RomName.IsNullOrEmpty())\r\n            {\r\n                Name = new RomName(dbData.RomName);\r\n            }\r\n            else\r\n            {\r\n                Name = new RomName(System.IO.Path.GetFileNameWithoutExtension(path));\r\n            }\r\n        }\r\n\r\n        public ScannedRom()\r\n        {\r\n        }\r\n    }\r\n\r\n    public class RomName\r\n    {\r\n        private static readonly Regex propsRegex = new Regex(@\"\\[(.*?)\\]|\\((.*?)\\)\", RegexOptions.Compiled);\r\n        private static readonly char[] propertySplitter = new char[] { ',' };\r\n\r\n        public string Name { get; set; }\r\n        public string SanitizedName { get; set; }\r\n        public string DiscName { get; set; }\r\n        public List<string> Properties { get; set; } = new List<string>();\r\n\r\n        public RomName()\r\n        {\r\n        }\r\n\r\n        public RomName(string originalName)\r\n        {\r\n            if (originalName.IsNullOrEmpty())\r\n            {\r\n                throw new ArgumentNullException(nameof(originalName));\r\n            }\r\n\r\n            SanitizedName = SanitizeName(originalName);\r\n            Name = originalName;\r\n            var matches = propsRegex.Matches(originalName);\r\n            if (matches.Count > 0)\r\n            {\r\n                foreach (Match match in matches)\r\n                {\r\n                    for (int i = 1; i < match.Groups.Count; i++)\r\n                    {\r\n                        if (!match.Groups[i].Value.IsNullOrEmpty())\r\n                        {\r\n                            Properties.AddRange(match.Groups[i].Value.Split(propertySplitter, StringSplitOptions.RemoveEmptyEntries).Select(a => a.Trim()));\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            DiscName = Properties.FirstOrDefault(a =>\r\n                a.StartsWith(\"disc\", StringComparison.InvariantCultureIgnoreCase) ||\r\n                a.StartsWith(\"disk\", StringComparison.InvariantCultureIgnoreCase) ||\r\n                a.StartsWith(\"side\", StringComparison.InvariantCultureIgnoreCase));\r\n            if (DiscName == null)\r\n            {\r\n                DiscName = originalName;\r\n            }\r\n        }\r\n\r\n        public static string SanitizeName(string name)\r\n        {\r\n            var newName = propsRegex.Replace(name, string.Empty);\r\n            return newName.\r\n                Replace('’', '\\'').\r\n                RemoveTrademarks().\r\n                Replace(\"_\", \" \").\r\n                Trim();\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Exceptions.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Management.Automation;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\nusing Microsoft.CSharp.RuntimeBinder;\r\n\r\nnamespace Playnite\r\n{\r\n    public class NotSupportedInFullscreenException : Exception\r\n    {\r\n        public NotSupportedInFullscreenException() : base(\"Not supported in Fullscreen mode.\")\r\n        {\r\n        }\r\n        public NotSupportedInFullscreenException(string message) : base(message)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class NotSupportedInDesktopException : Exception\r\n    {\r\n        public NotSupportedInDesktopException() : base(\"Not supported in Desktop mode.\")\r\n        {\r\n        }\r\n        public NotSupportedInDesktopException(string message) : base(message)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class ExceptionInfo\r\n    {\r\n        public bool IsLiteDbCorruptionCrash;\r\n        public bool IsExtensionCrash;\r\n        public ExtensionManifest CrashExtension;\r\n        public int PlayniteStackCalls;\r\n    }\r\n\r\n    public class Exceptions\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        public static ExceptionInfo GetExceptionInfo(Exception exception, ExtensionFactory extensions)\r\n        {\r\n            ExceptionInfo innerCrash = null;\r\n            if (exception.InnerException != null)\r\n            {\r\n                innerCrash = GetExceptionInfoImpl(exception.InnerException, extensions);\r\n                if (innerCrash.IsExtensionCrash || innerCrash.IsLiteDbCorruptionCrash)\r\n                    return innerCrash;\r\n            }\r\n\r\n            var crashInfo = GetExceptionInfoImpl(exception, extensions);\r\n            // This usually happens if an exception occurs in XAML because of faulty custom theme.\r\n            // The only stack entry would be Playnite's entry point or no entry at all.\r\n            if ((innerCrash?.PlayniteStackCalls ?? 0 + crashInfo.PlayniteStackCalls) <= 1)\r\n                crashInfo.IsExtensionCrash = true;\r\n\r\n            return crashInfo;\r\n        }\r\n\r\n        private static ExceptionInfo GetExceptionInfoImpl(Exception exception, ExtensionFactory extensions)\r\n        {\r\n            var crashInfo = new ExceptionInfo();\r\n\r\n            try\r\n            {\r\n                if (// Seems to happen with extensions that use reflection that fails at runtime\r\n                    exception is RuntimeBinderException ||\r\n                    // This happens with systems that use extensions/themes with integrated media player\r\n                    // but the actual system player used by media player is broken somehow.\r\n                    exception.StackTrace?.Contains(\"MediaPlayerState\") == true ||\r\n                    // Seems to happen with script extensions somehow calling PowerShell, or from PS, via blocking ProgressDialog\r\n                    exception is PSInvalidOperationException)\r\n                {\r\n                    crashInfo.IsExtensionCrash = true;\r\n                    return crashInfo;\r\n                }\r\n\r\n                var stack = new StackTrace(exception);\r\n                var crashModules = new List<Module>();\r\n                foreach (var frame in stack.GetFrames())\r\n                {\r\n                    var module = frame.GetMethod()?.Module;\r\n                    if (module == null)\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    if (module.Name.StartsWith(\"Playnite\"))\r\n                    {\r\n                        crashInfo.PlayniteStackCalls++;\r\n                    }\r\n\r\n                    crashModules.AddMissing(module);\r\n                }\r\n\r\n                LoadedPlugin extDesc = null;\r\n                foreach (var module in crashModules)\r\n                {\r\n                    extDesc = extensions?.Plugins?.FirstOrDefault(a =>\r\n                        module.Name == a.Value.Description.Module ||\r\n                        Paths.AreEqual(a.Value.Description.DirectoryPath, Path.GetDirectoryName(module.Assembly.Location))).Value;\r\n                    if (extDesc != null)\r\n                    {\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                var liteDbCrash = exception is LiteDB.LiteException || exception.Message.Contains(\"LiteDB.\");\r\n                crashInfo.IsLiteDbCorruptionCrash = liteDbCrash;\r\n                if (extDesc != null)\r\n                {\r\n                    crashInfo.IsExtensionCrash = true;\r\n                    crashInfo.CrashExtension = extDesc.Description;\r\n                }\r\n\r\n                return crashInfo;\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed check crash stack trace.\");\r\n                return crashInfo;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/ControlExtensions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace System.Windows.Controls\r\n{\r\n    public static class ControlExtensions\r\n    {\r\n        public static T GetTemplateItem<T>(this Control control, string name)\r\n        {\r\n            var item = control.Template.FindName(name, control);\r\n            return item is T t ? t : default;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/GameExtensions.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Controllers;\r\nusing Playnite.Database;\r\nusing Playnite.Emulators;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public static class EmulatorProfileExtensions\r\n    {\r\n        public static CustomEmulatorProfile ExpandVariables(this CustomEmulatorProfile profile, Game game, string emulatorDir, string romPath)\r\n        {\r\n            var g = game.GetCopy();\r\n            g.Roms = new System.Collections.ObjectModel.ObservableCollection<GameRom> { new GameRom(\"\", romPath) };\r\n            var expaded = profile.GetCopy();\r\n            expaded.Arguments = g.ExpandVariables(expaded.Arguments, false, emulatorDir);\r\n            expaded.WorkingDirectory = g.ExpandVariables(expaded.WorkingDirectory, true, emulatorDir);\r\n            expaded.Executable = g.ExpandVariables(expaded.Executable, true, emulatorDir);\r\n            expaded.TrackingPath = g.ExpandVariables(expaded.TrackingPath, true, emulatorDir);\r\n            return expaded;\r\n        }\r\n    }\r\n\r\n    public static class GameActionExtensions\r\n    {\r\n        public static GameAction ExpandVariables(this GameAction action, Game game)\r\n        {\r\n            var expaded = action.GetCopy();\r\n            expaded.AdditionalArguments = game.ExpandVariables(expaded.AdditionalArguments);\r\n            expaded.Arguments = game.ExpandVariables(expaded.Arguments);\r\n            expaded.WorkingDir = game.ExpandVariables(expaded.WorkingDir, true);\r\n            expaded.TrackingPath = game.ExpandVariables(expaded.TrackingPath, true);\r\n            if (expaded.Type != GameActionType.URL)\r\n            {\r\n                expaded.Path = game.ExpandVariables(expaded.Path, true);\r\n            }\r\n\r\n            return expaded;\r\n        }\r\n    }\r\n\r\n    public static class GameExtensions\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public static Game GetGameFromExecutable(string path)\r\n        {\r\n            if (!File.Exists(path))\r\n            {\r\n                throw new FileNotFoundException($\"Cannot create game from executable, {path} not found.\");\r\n            }\r\n\r\n            var game = new Game();\r\n            if (string.Equals(Path.GetExtension(path), \".lnk\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                var prog = Programs.GetLnkShortcutData(path);\r\n                var fileInfo = new FileInfo(prog.Path);\r\n                if (!fileInfo.Exists && prog.Path.Contains(\"Program Files (x86)\"))\r\n                {\r\n                    var newPath = prog.Path.Replace(\"Program Files (x86)\", \"Program Files\");\r\n                    if (File.Exists(newPath))\r\n                    {\r\n                        fileInfo = new FileInfo(newPath);\r\n                        if (prog.WorkDir.Contains(\"Program Files (x86)\"))\r\n                        {\r\n                            prog.WorkDir.Replace(\"Program Files (x86)\", \"Program Files\");\r\n                        }\r\n                    }\r\n                }\r\n\r\n                game.GameId = path.MD5();\r\n                game.Name = Path.GetFileNameWithoutExtension(path);\r\n                game.InstallDirectory = prog.WorkDir.IsNullOrEmpty() ? fileInfo.Directory.FullName : prog.WorkDir;\r\n                game.GameActions = new System.Collections.ObjectModel.ObservableCollection<GameAction>\r\n                {\r\n                    new GameAction()\r\n                    {\r\n                        Type = GameActionType.File,\r\n                        WorkingDir = ExpandableVariables.InstallationDirectory,\r\n                        Path = fileInfo.FullName.Replace(game.InstallDirectory.EndWithDirSeparator(), ExpandableVariables.InstallationDirectory.EndWithDirSeparator()),\r\n                        Arguments = prog.Arguments,\r\n                        IsPlayAction = true,\r\n                        Name = game.Name\r\n                    }\r\n                };\r\n\r\n                if (!prog.Icon.IsNullOrEmpty())\r\n                {\r\n                    var iconPath = Regex.Replace(prog.Icon, @\",\\d+$\", \"\");\r\n                    if (File.Exists(iconPath))\r\n                    {\r\n                        game.Icon = iconPath;\r\n                    }\r\n                    else if (iconPath.Contains(\"Program Files (x86)\"))\r\n                    {\r\n                        iconPath = iconPath.Replace(\"Program Files (x86)\", \"Program Files\");\r\n                        if (File.Exists(iconPath))\r\n                        {\r\n                            game.Icon = iconPath;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else if (string.Equals(Path.GetExtension(path), \".url\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                var urlData = IniParser.Parse(File.ReadAllLines(path));\r\n                var shortcut = urlData[\"InternetShortcut\"];\r\n                if (shortcut == null)\r\n                {\r\n                    throw new Exception(\"URL file doesn't have shortcut definition section.\");\r\n                }\r\n\r\n                game.Name = Path.GetFileNameWithoutExtension(path);\r\n                game.Icon = shortcut[\"IconFile\"];\r\n                game.GameActions = new System.Collections.ObjectModel.ObservableCollection<GameAction>\r\n                {\r\n                    new GameAction()\r\n                    {\r\n                        Type = GameActionType.URL,\r\n                        Path = shortcut[\"URL\"],\r\n                        IsPlayAction = true,\r\n                        Name = game.Name\r\n                    }\r\n                };\r\n            }\r\n            else\r\n            {\r\n                var file = new FileInfo(path);\r\n                var versionInfo = FileVersionInfo.GetVersionInfo(path);\r\n                var programName = !string.IsNullOrEmpty(versionInfo.ProductName?.Trim()) ? versionInfo.ProductName : new DirectoryInfo(file.DirectoryName).Name;\r\n                game.Name = programName;\r\n                game.InstallDirectory = file.DirectoryName;\r\n                game.GameActions = new System.Collections.ObjectModel.ObservableCollection<GameAction>\r\n                {\r\n                    new GameAction()\r\n                    {\r\n                        Type = GameActionType.File,\r\n                        WorkingDir = ExpandableVariables.InstallationDirectory,\r\n                        Path = file.FullName.Replace(game.InstallDirectory.EndWithDirSeparator(), ExpandableVariables.InstallationDirectory.EndWithDirSeparator()),\r\n                        IsPlayAction = true,\r\n                        Name = game.Name\r\n                    }\r\n                };\r\n            };\r\n\r\n            game.IsInstalled = true;\r\n            return game;\r\n        }\r\n\r\n        public static Game ExpandGame(this Game game, bool fixSeparators = false, string emulatorDir = null, string romPath = null)\r\n        {\r\n            var g = game.GetCopy();\r\n            g.InstallDirectory = g.StringExpand(g.InstallDirectory, fixSeparators, emulatorDir, romPath);\r\n            g.Roms.ForEach(rom => rom.Path = g.StringExpand(rom.Path, fixSeparators, emulatorDir, romPath));\r\n            return g;\r\n        }\r\n\r\n        public static GameMetadata ExpandGame(this GameMetadata game)\r\n        {\r\n            var g = game.GetClone();\r\n            g.InstallDirectory = g.StringExpand(g.InstallDirectory);\r\n            g.Roms.ForEach(rom => rom.Path = g.StringExpand(rom.Path));\r\n            return g;\r\n        }\r\n\r\n        public static string ExpandVariables(this Game game, string inputString, bool fixSeparators = false, string emulatorDir = null, string romPath = null)\r\n        {\r\n            var g = game.ExpandGame(fixSeparators, emulatorDir, romPath);\r\n            return StringExpand(g, inputString, fixSeparators, emulatorDir, romPath);\r\n        }\r\n\r\n        // TODO rework this whole mess into something better and more maintainable :|\r\n        private static string StringExpand(this Game game, string inputString, bool fixSeparators = false, string emulatorDir = null, string romPath = null)\r\n        {\r\n            if (string.IsNullOrWhiteSpace(inputString) || !inputString.Contains('{'))\r\n            {\r\n                return inputString;\r\n            }\r\n\r\n            var result = inputString;\r\n            if (!game.InstallDirectory.IsNullOrWhiteSpace())\r\n            {\r\n                result = result.Replace(ExpandableVariables.InstallationDirectory, game.InstallDirectory);\r\n                result = result.Replace(ExpandableVariables.InstallationDirName, game.InstallDirectory.Split(Paths.DirectorySeparators, StringSplitOptions.RemoveEmptyEntries).LastOrDefault());\r\n            }\r\n\r\n            if (romPath.IsNullOrWhiteSpace() && game.Roms.HasItems())\r\n            {\r\n                var customPath = game.Roms[0].Path;\r\n                if (!customPath.IsNullOrEmpty() && !Paths.ContainsInvalidPathChars(customPath))\r\n                {\r\n                    result = result.Replace(ExpandableVariables.ImagePath, customPath);\r\n                    result = result.Replace(ExpandableVariables.ImageNameNoExtension, Path.GetFileNameWithoutExtension(customPath));\r\n                    result = result.Replace(ExpandableVariables.ImageName, Path.GetFileName(customPath));\r\n                }\r\n            }\r\n            else if (!romPath.IsNullOrWhiteSpace() && !Paths.ContainsInvalidPathChars(romPath))\r\n            {\r\n                result = result.Replace(ExpandableVariables.ImagePath, romPath);\r\n                result = result.Replace(ExpandableVariables.ImageNameNoExtension, Path.GetFileNameWithoutExtension(romPath));\r\n                result = result.Replace(ExpandableVariables.ImageName, Path.GetFileName(romPath));\r\n            }\r\n\r\n            result = result.Replace(ExpandableVariables.PlayniteDirectory, PlaynitePaths.ProgramPath);\r\n            result = result.Replace(ExpandableVariables.Name, game.Name);\r\n            result = result.Replace(ExpandableVariables.PluginId, game.PluginId.ToString());\r\n            result = result.Replace(ExpandableVariables.GameId, game.GameId);\r\n            result = result.Replace(ExpandableVariables.DatabaseId, game.Id.ToString());\r\n            result = result.Replace(ExpandableVariables.Version, game.Version);\r\n            result = result.Replace(ExpandableVariables.EmulatorDirectory, emulatorDir ?? string.Empty);\r\n            var plats = game.Platforms;\r\n            if (plats.HasItems())\r\n            {\r\n                result = result.Replace(ExpandableVariables.Platform, plats?[0].Name);\r\n            }\r\n\r\n            return fixSeparators ? Paths.FixSeparators(result) : result;\r\n        }\r\n\r\n        public static string ExpandVariables(this GameMetadata game, string inputString, bool fixSeparators = false)\r\n        {\r\n            var g = game.ExpandGame();\r\n            return StringExpand(g, inputString, fixSeparators);\r\n        }\r\n\r\n        private static string StringExpand(this GameMetadata game, string inputString, bool fixSeparators = false)\r\n        {\r\n            if (string.IsNullOrEmpty(inputString) || !inputString.Contains('{'))\r\n            {\r\n                return inputString;\r\n            }\r\n\r\n            var result = inputString;\r\n            if (!game.InstallDirectory.IsNullOrWhiteSpace())\r\n            {\r\n                result = result.Replace(ExpandableVariables.InstallationDirectory, game.InstallDirectory);\r\n                result = result.Replace(ExpandableVariables.InstallationDirName, game.InstallDirectory.Split(Paths.DirectorySeparators, StringSplitOptions.RemoveEmptyEntries).LastOrDefault());\r\n            }\r\n\r\n            if (game.Roms.HasItems())\r\n            {\r\n                var romPath = game.Roms[0].Path;\r\n                if (!romPath.IsNullOrEmpty())\r\n                {\r\n                    result = result.Replace(ExpandableVariables.ImagePath, romPath);\r\n                    result = result.Replace(ExpandableVariables.ImageNameNoExtension, Path.GetFileNameWithoutExtension(romPath));\r\n                    result = result.Replace(ExpandableVariables.ImageName, Path.GetFileName(romPath));\r\n                }\r\n            }\r\n\r\n            result = result.Replace(ExpandableVariables.PlayniteDirectory, PlaynitePaths.ProgramPath);\r\n            result = result.Replace(ExpandableVariables.Name, game.Name);\r\n            result = result.Replace(ExpandableVariables.GameId, game.GameId);\r\n            result = result.Replace(ExpandableVariables.Version, game.Version);\r\n            if (game.Platforms.HasItems() && game.Platforms.First() is MetadataNameProperty prop)\r\n            {\r\n                result = result.Replace(ExpandableVariables.Platform, prop.Name);\r\n            }\r\n\r\n            return fixSeparators ? Paths.FixSeparators(result) : result;\r\n        }\r\n\r\n        public static string GetIdentifierInfo(this Game game)\r\n        {\r\n            return $\"{game.Name}, {game.Id}, {game.GameId}, {game.PluginId}\";\r\n        }\r\n\r\n        public static string GetRawExecutablePath(this Game game)\r\n        {\r\n            try\r\n            {\r\n                var playAction = game.GameActions?.FirstOrDefault(a => a.IsPlayAction && a.Type == GameActionType.File);\r\n                if (playAction == null)\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                playAction = playAction.ExpandVariables(game);\r\n                if (playAction.Type == GameActionType.File)\r\n                {\r\n                    if (string.IsNullOrEmpty(playAction.WorkingDir))\r\n                    {\r\n                        if (Paths.IsValidFilePath(playAction.Path))\r\n                        {\r\n                            return Path.GetFullPath(playAction.Path);\r\n                        }\r\n                        else\r\n                        {\r\n                            return null;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if (Path.IsPathRooted(playAction.Path))\r\n                        {\r\n                            return playAction.Path;\r\n                        }\r\n                        else\r\n                        {\r\n                            var combined = Path.Combine(playAction.WorkingDir, playAction.Path);\r\n                            return Path.GetFullPath(combined);\r\n                        }\r\n                    }\r\n                }\r\n                else if (playAction.Type == GameActionType.URL)\r\n                {\r\n                    return playAction.Path;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to get executable from game data.\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static Dictionary<Emulator, List<EmulatorProfile>> GetCompatibleEmulators(this Game game, GameDatabase database)\r\n        {\r\n            var emulators = new Dictionary<Emulator, List<EmulatorProfile>>();\r\n            if (!game.Platforms.HasItems())\r\n            {\r\n                return emulators;\r\n            }\r\n\r\n            foreach (var emulator in database.Emulators)\r\n            {\r\n                var profiles = game.GetCompatibleProfiles(emulator);\r\n                if (profiles.HasItems())\r\n                {\r\n                    emulators.Add(emulator, new List<EmulatorProfile>(profiles));\r\n                }\r\n            }\r\n\r\n            return emulators;\r\n        }\r\n\r\n        public static List<EmulatorProfile> GetCompatibleProfiles(this Game game, Emulator emulator)\r\n        {\r\n            var profiles = new List<EmulatorProfile>();\r\n            if (!game.Platforms.HasItems())\r\n            {\r\n                return profiles;\r\n            }\r\n\r\n            foreach (var profile in emulator.CustomProfiles ?? new ObservableCollection<CustomEmulatorProfile>())\r\n            {\r\n                if (profile.Platforms?.Intersect(game.PlatformIds).HasItems() == true)\r\n                {\r\n                    profiles.Add(profile);\r\n                }\r\n            }\r\n\r\n            foreach (var profile in emulator.BuiltinProfiles ?? new ObservableCollection<BuiltInEmulatorProfile>())\r\n            {\r\n                var profDef = Emulation.GetProfile(emulator.BuiltInConfigId, profile.BuiltInProfileName);\r\n                if (profDef == null)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (game.Platforms.Where(a => !a.SpecificationId.IsNullOrEmpty()).Any(a => profDef.Platforms.Contains(a.SpecificationId)))\r\n                {\r\n                    profiles.Add(profile);\r\n                }\r\n            }\r\n\r\n            return profiles;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/IProvideValueTarget.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Extensions\r\n{\r\n    public static class IProvideValueTargetExtensions\r\n    {\r\n        public static Type GetTargetType(IProvideValueTarget provider)\r\n        {\r\n            if (provider.TargetProperty == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            var type = provider.TargetProperty.GetType();\r\n            if (type == typeof(DependencyProperty))\r\n            {\r\n                type = ((DependencyProperty)provider.TargetProperty).PropertyType;\r\n            }\r\n            else if (typeof(PropertyInfo).IsAssignableFrom(provider.TargetProperty.GetType()))\r\n            {\r\n                type = ((PropertyInfo)provider.TargetProperty).PropertyType;\r\n            }\r\n\r\n            return type;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/Markup/Api.cs",
    "content": "﻿using Playnite.API.DesignData;\r\nusing Playnite.Converters;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Extensions.Markup\r\n{\r\n    public class Api : BindingExtension\r\n    {\r\n        public Api() : this(null)\r\n        {\r\n        }\r\n\r\n        public Api(string path) : base(path)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))\r\n            {\r\n                Source = new DesignPlayniteAPI();\r\n                PathRoot = null;\r\n            }\r\n            else\r\n            {\r\n                Source = PlayniteApplication.Current;\r\n                PathRoot = nameof(PlayniteApplication.PlayniteApiGlobal);\r\n            }\r\n\r\n            if (!path.IsNullOrEmpty())\r\n            {\r\n                PathRoot += \".\";\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/Markup/BindingExtension.cs",
    "content": "﻿using Playnite.Converters;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Extensions.Markup\r\n{\r\n    public class BindingExtension : MarkupExtension\r\n    {\r\n        internal Binding binding;\r\n        public string PathRoot { get; set; }\r\n        public object Source { get; set; }\r\n        public string Path { get; set; }\r\n        public object TargetNullValue { get; set; }\r\n        public object FallbackValue { get; set; }\r\n        public int Delay { get; set; }\r\n        public BindingMode Mode { get; set; } = BindingMode.OneWay;\r\n        public IValueConverter Converter { get; set; }\r\n        public object ConverterParameter { get; set; }\r\n        public string StringFormat { get; set; }\r\n\r\n        public BindingExtension()\r\n        {\r\n        }\r\n\r\n        public BindingExtension(string path)\r\n        {\r\n            Path = path;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            binding = new Binding()\r\n            {\r\n                Path = new PropertyPath(PathRoot + Path),\r\n                Delay = Delay,\r\n                Mode = Mode\r\n            };\r\n\r\n            if (Source != null)\r\n            {\r\n                binding.Source = Source;\r\n            }\r\n\r\n            if (TargetNullValue != null)\r\n            {\r\n                binding.TargetNullValue = TargetNullValue;\r\n            }\r\n\r\n            if (FallbackValue != null)\r\n            {\r\n                binding.FallbackValue = FallbackValue;\r\n            }\r\n\r\n            if (Converter != null)\r\n            {\r\n                binding.Converter = Converter;\r\n            }\r\n\r\n            if (ConverterParameter != null)\r\n            {\r\n                binding.ConverterParameter = ConverterParameter;\r\n            }\r\n\r\n            if (!StringFormat.IsNullOrEmpty())\r\n            {\r\n                binding.StringFormat = StringFormat;\r\n            }\r\n\r\n            var provider = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;\r\n            if (ServiceProvider.IsTargetTemplate(serviceProvider))\r\n            {\r\n                return this;\r\n            }\r\n            else\r\n            {\r\n                var targetType = IProvideValueTargetExtensions.GetTargetType(provider);\r\n                if (targetType == typeof(Visibility) && Converter == null)\r\n                {\r\n                    binding.Converter = new BooleanToVisibilityConverter();\r\n                }\r\n\r\n                if (provider.TargetProperty == null)\r\n                {\r\n                    return binding;\r\n                }\r\n                else if (provider.TargetProperty.GetType() == typeof(DependencyProperty))\r\n                {\r\n                    return BindingOperations.SetBinding(\r\n                        provider.TargetObject as DependencyObject,\r\n                        provider.TargetProperty as DependencyProperty,\r\n                        binding);\r\n                }\r\n                else\r\n                {\r\n                    if (targetType == typeof(BindingBase))\r\n                    {\r\n                        return binding;\r\n                    }\r\n                }\r\n\r\n                return this;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/Markup/MainViewModel.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.Extensions.Markup\r\n{\r\n    public class MainViewModel<TAppViewModel, TDesignViewModel, TApp> : BindingExtension\r\n    {\r\n        public bool DirectValue { get; set; } = false;\r\n\r\n        public MainViewModel() : this(null)\r\n        {\r\n        }\r\n\r\n        public MainViewModel(string path) : base(path)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))\r\n            {\r\n                Source = typeof(TDesignViewModel).CrateInstance<TDesignViewModel>();\r\n                PathRoot = null;\r\n            }\r\n            else\r\n            {\r\n                Source = PlayniteApplication.Current;\r\n                PathRoot = \"MainModel\";\r\n            }\r\n\r\n            if (!path.IsNullOrEmpty())\r\n            {\r\n                PathRoot += \".\";\r\n            }\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            if (ServiceProvider.IsTargetTemplate(serviceProvider))\r\n            {\r\n                return this;\r\n            }\r\n\r\n            if (DirectValue)\r\n            {\r\n                if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))\r\n                {\r\n                    return typeof(TAppViewModel).GetProperty(Path).GetValue(Source, null);\r\n                }\r\n                else\r\n                {\r\n                    var src = typeof(TApp).GetProperty(\"MainModel\").GetValue(PlayniteApplication.Current, null);\r\n                    return typeof(TAppViewModel).GetProperty(Path).GetValue(src, null);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return base.ProvideValue(serviceProvider);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/Markup/PluginConverter.cs",
    "content": "﻿using Playnite.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Extensions.Markup\r\n{\r\n    public class PluginConverter : MarkupExtension\r\n    {\r\n        public string Converter { get; set; }\r\n        public string Plugin { get; set; }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return new PluginConverterProvider(Plugin, Converter);\r\n        }\r\n    }\r\n\r\n    // This intermediary class is needed because markup extensions are resolved when theme's xaml is loaded,\r\n    // which happens before plugins are loaded.\r\n    public class PluginConverterProvider : IValueConverter\r\n    {\r\n        private bool converterRequested = false;\r\n        private IValueConverter actualConverter;\r\n\r\n        private readonly string converterName;\r\n        private readonly string pluginSource;\r\n\r\n        public PluginConverterProvider(string plugin, string converter)\r\n        {\r\n            pluginSource = plugin;\r\n            converterName = converter;\r\n        }\r\n\r\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            return GetConverter()?.Convert(value, targetType, parameter, culture) ?? DependencyProperty.UnsetValue;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            return GetConverter()?.ConvertBack(value, targetType, parameter, culture) ?? DependencyProperty.UnsetValue;\r\n        }\r\n\r\n        private IValueConverter GetConverter()\r\n        {\r\n            if (converterRequested)\r\n            {\r\n                return actualConverter;\r\n            }\r\n\r\n            var pSource = PlayniteApplication.Current?.Extensions?.ConvertersSupportList.FirstOrDefault(a => a.SourceName == pluginSource);\r\n            actualConverter = null;\r\n            if (pSource != null)\r\n            {\r\n                actualConverter = pSource.Converters?.FirstOrDefault(a => a.GetType().Name == converterName);\r\n            }\r\n\r\n            converterRequested = true;\r\n            return actualConverter;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/Markup/PluginSettings.cs",
    "content": "﻿using Playnite.Plugins;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Extensions.Markup\r\n{\r\n    public class PluginSettings : BindingExtension\r\n    {\r\n        public string Plugin { get; set; }\r\n\r\n        public PluginSettings() : this(null)\r\n        {\r\n        }\r\n\r\n        public PluginSettings(string path) : base(path)\r\n        {\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            if (ServiceProvider.IsTargetTemplate(serviceProvider))\r\n            {\r\n                return this;\r\n            }\r\n\r\n            if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))\r\n            {\r\n                Source = \"\";\r\n                PathRoot = \"\";\r\n                return base.ProvideValue(serviceProvider);\r\n            }\r\n\r\n            var pSource = PlayniteApplication.Current.Extensions?.SettingsSupportList.FirstOrDefault(a => a.SourceName == Plugin);\r\n            if (pSource == null || pSource.SettingsRoot.IsNullOrEmpty())\r\n            {\r\n                PlayniteApplication.Current.ExtensionsLoaded += Current_ExtensionsLoaded;\r\n                Source = \"\";\r\n                PathRoot = \"\";\r\n                return base.ProvideValue(serviceProvider);\r\n            }\r\n            else\r\n            {\r\n                Source = pSource.Source;\r\n                PathRoot = $\"{pSource.SettingsRoot}.\";\r\n                return base.ProvideValue(serviceProvider);\r\n            }\r\n        }\r\n\r\n        private void Current_ExtensionsLoaded(object sender, EventArgs e)\r\n        {\r\n            PlayniteApplication.Current.ExtensionsLoaded -= Current_ExtensionsLoaded;\r\n            var pSource = PlayniteApplication.Current?.Extensions?.SettingsSupportList.FirstOrDefault(a => a.SourceName == Plugin);\r\n            if (pSource != null)\r\n            {\r\n                PathRoot = $\"{pSource.SettingsRoot}.\";\r\n                binding.Path = new PropertyPath(PathRoot + Path);\r\n                binding.Source = pSource.Source;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/Markup/PluginStatus.cs",
    "content": "﻿using Playnite.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Extensions.Markup\r\n{\r\n    public class PluginStatus : BindingExtension\r\n    {\r\n        public string Status { get; set; }\r\n        public string Plugin { get; set; }\r\n\r\n        public PluginStatus() : this(null)\r\n        {\r\n        }\r\n\r\n        public PluginStatus(string path) : base(path)\r\n        {\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            if (ServiceProvider.IsTargetTemplate(serviceProvider))\r\n            {\r\n                return this;\r\n            }\r\n\r\n            Source = PlayniteApplication.Current;\r\n            Path = $\"{nameof(PlayniteApplication.ExtensionsStatusBinder)}[{Plugin}].{nameof(ExtensionsStatusBinder.Status.IsInstalled)}\";\r\n            return base.ProvideValue(serviceProvider);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/Markup/Settings.cs",
    "content": "﻿using Playnite.Converters;\r\nusing Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Extensions.Markup\r\n{\r\n    public class SettingsBinding : Binding\r\n    {\r\n        public SettingsBinding() : this(null)\r\n        {\r\n        }\r\n\r\n        public SettingsBinding(string path) : base(path)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))\r\n            {\r\n                Source = new PlayniteSettings();\r\n            }\r\n            else\r\n            {\r\n                Source = PlayniteApplication.Current.AppSettings;\r\n            }\r\n        }\r\n    }\r\n\r\n    public class Settings : BindingExtension\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private static readonly Dictionary<string, PropertyInfo> directValuePropCache = new Dictionary<string, PropertyInfo>();\r\n        public bool DirectValue { get; set; } = false;\r\n\r\n        public Settings() : this(null)\r\n        {\r\n        }\r\n\r\n        public Settings(string path) : base(path)\r\n        {\r\n            if (DesignerTools.IsInDesignMode)\r\n            {\r\n                Source = new PlayniteSettings();\r\n                PathRoot = null;\r\n            }\r\n            else\r\n            {\r\n                Source = PlayniteApplication.Current;\r\n                PathRoot = nameof(PlayniteApplication.AppSettings);\r\n            }\r\n\r\n            if (!path.IsNullOrEmpty())\r\n            {\r\n                PathRoot += \".\";\r\n            }\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            if (ServiceProvider.IsTargetTemplate(serviceProvider))\r\n            {\r\n                return this;\r\n            }\r\n\r\n            if (DirectValue)\r\n            {\r\n                // Doesn't support nested properties!\r\n                var src = Source;\r\n                if (!DesignerTools.IsInDesignMode)\r\n                {\r\n                    src = PlayniteApplication.Current.AppSettings;\r\n                }\r\n\r\n                if (directValuePropCache.TryGetValue(Path, out var prop))\r\n                {\r\n                    return prop?.GetValue(src, null);\r\n                }\r\n                else\r\n                {\r\n                    var newProp = typeof(PlayniteSettings).GetProperty(Path);\r\n                    directValuePropCache.Add(Path, newProp);\r\n                    if (newProp != null)\r\n                    {\r\n                        return newProp.GetValue(src, null);\r\n                    }\r\n                    else\r\n                    {\r\n                        logger.Error($\"Failed to get value of \\\"{Path}\\\" path from app settings.\");\r\n                        return null;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return base.ProvideValue(serviceProvider);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/Markup/ThemeFile.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Extensions;\r\nusing Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.ComponentModel.Design;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Markup;\r\nusing System.Windows.Media;\r\nusing System.Xaml;\r\nusing System.Diagnostics;\r\nusing System.Text.RegularExpressions;\r\nusing CommandLine;\r\n\r\nnamespace Playnite.Extensions.Markup\r\n{\r\n    public class ThemeFile : MarkupExtension\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private static FileInfo lastUserTheme = null;\r\n        private static bool? lastUserThemeFound = null;\r\n\r\n        internal ThemeManifest CurrentTheme { get; set; }\r\n        internal ThemeManifest DefaultTheme { get; set; }\r\n\r\n        public string RelativePath { get; set; }\r\n\r\n        public ThemeFile(ApplicationMode mode)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))\r\n            {\r\n                DefaultTheme = GetDesignTimeDefaultTheme(mode);\r\n            }\r\n            else\r\n            {\r\n                DefaultTheme = ThemeManager.DefaultTheme;\r\n                CurrentTheme = ThemeManager.CurrentTheme;\r\n            }\r\n        }\r\n\r\n        public ThemeFile(string path, ApplicationMode mode) : this(mode)\r\n        {\r\n            RelativePath = path;\r\n        }\r\n\r\n        public static ThemeManifest GetDesignTimeDefaultTheme(ApplicationMode mode)\r\n        {\r\n            if (lastUserThemeFound == null)\r\n            {\r\n                if (Process.GetCurrentProcess().TryGetParentId(out var parentId))\r\n                {\r\n                    var proc = Process.GetProcessById(parentId);\r\n                    var cmdline = proc.GetCommandLine();\r\n                    var regEx = Regex.Match(cmdline, @\"([^\"\"]+\\.sln?)\"\"\");\r\n                    if (regEx.Success)\r\n                    {\r\n                        var spath = regEx.Groups[1].Value;\r\n                        if (spath.Contains($\"Themes\\\\{mode.GetDescription()}\"))\r\n                        {\r\n                            lastUserTheme = new FileInfo(spath);\r\n                            lastUserThemeFound = true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (lastUserThemeFound == true)\r\n            {\r\n                return new ThemeManifest()\r\n                {\r\n                    DirectoryName = lastUserTheme.DirectoryName,\r\n                    DirectoryPath = lastUserTheme.Directory.FullName,\r\n                    Name = \"Default\"\r\n                };\r\n            }\r\n\r\n            lastUserThemeFound = false;\r\n            var defaultTheme = \"Default\";\r\n            var projectName = mode == ApplicationMode.Fullscreen ? \"Playnite.FullscreenApp\" : \"Playnite.DesktopApp\";\r\n            var slnPath = Path.Combine(Environment.GetEnvironmentVariable(\"PLAYNITE_SLN\", EnvironmentVariableTarget.User), projectName);\r\n            var themePath = Path.Combine(slnPath, \"Themes\", ThemeManager.GetThemeRootDir(mode), defaultTheme);\r\n            return new ThemeManifest()\r\n            {\r\n                DirectoryName = defaultTheme,\r\n                DirectoryPath = themePath,\r\n                Name = defaultTheme\r\n            };\r\n        }\r\n\r\n        public static string GetFilePath(string relPath, bool checkExistance = true, bool matchByRegex = false)\r\n        {\r\n            return GetFilePath(relPath, ThemeManager.DefaultTheme, ThemeManager.CurrentTheme, checkExistance, matchByRegex);\r\n        }\r\n\r\n        public static string GetFilePath(string relPath, ThemeManifest defaultTheme, bool checkExistance = true, bool matchByRegex = false)\r\n        {\r\n            return GetFilePath(relPath, defaultTheme, ThemeManager.CurrentTheme, checkExistance, matchByRegex);\r\n        }\r\n\r\n        public static string GetFilePath(string relPath, ThemeManifest defaultTheme, ThemeManifest currentTheme, bool checkExistance = true, bool matchByRegex = false)\r\n        {\r\n            if (matchByRegex)\r\n            {\r\n                relPath = relPath.TrimStart(new char[] { Path.DirectorySeparatorChar });\r\n                string searchFile(string dir)\r\n                {\r\n                    foreach (var file in Directory.EnumerateFiles(dir, \"*.*\", SearchOption.AllDirectories))\r\n                    {\r\n                        if (Regex.IsMatch(file.Replace(dir, string.Empty, StringComparison.OrdinalIgnoreCase), relPath, RegexOptions.IgnoreCase))\r\n                        {\r\n                            return file;\r\n                        }\r\n                    }\r\n\r\n                    return null;\r\n                }\r\n\r\n                if (currentTheme != null)\r\n                {\r\n                    var match = searchFile(currentTheme.DirectoryPath.EndWithDirSeparator());\r\n                    if (!match.IsNullOrEmpty())\r\n                    {\r\n                        return match;\r\n                    }\r\n                }\r\n\r\n                if (defaultTheme != null)\r\n                {\r\n                    var match = searchFile(defaultTheme.DirectoryPath.EndWithDirSeparator());\r\n                    if (!match.IsNullOrEmpty())\r\n                    {\r\n                        return match;\r\n                    }\r\n                }\r\n\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                relPath = Paths.FixSeparators(relPath).TrimStart(new char[] { Path.DirectorySeparatorChar });\r\n                string searchFile(string dir)\r\n                {\r\n                    var themePath = Path.Combine(dir, relPath);\r\n                    if (File.Exists(themePath) && checkExistance)\r\n                    {\r\n                        return themePath;\r\n                    }\r\n                    else if (!checkExistance)\r\n                    {\r\n                        return themePath;\r\n                    }\r\n\r\n                    return null;\r\n                }\r\n\r\n                if (currentTheme != null)\r\n                {\r\n                    var match = searchFile(currentTheme.DirectoryPath);\r\n                    if (!match.IsNullOrEmpty())\r\n                    {\r\n                        return match;\r\n                    }\r\n                }\r\n\r\n                if (defaultTheme != null)\r\n                {\r\n                    var match = searchFile(defaultTheme.DirectoryPath);\r\n                    if (!match.IsNullOrEmpty())\r\n                    {\r\n                        return match;\r\n                    }\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            string path = GetFilePath(RelativePath, DefaultTheme, CurrentTheme);\r\n            if (path.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n\r\n            var provider = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;\r\n            var type = IProvideValueTargetExtensions.GetTargetType(provider);\r\n            var converter = TypeDescriptor.GetConverter(type);\r\n\r\n            try\r\n            {\r\n                return converter.ConvertFrom(path);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to provide value for theme file {path}\");\r\n                return null;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/Markup/ThemeFileBinding.cs",
    "content": "﻿using Playnite.API.DesignData;\r\nusing Playnite.Converters;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Extensions.Markup\r\n{\r\n    public class ThemeFileBinding : BindingExtension\r\n    {\r\n        public string PathFormat { get; set; }\r\n\r\n        public ThemeFileBinding() : this(null)\r\n        {\r\n        }\r\n\r\n        public ThemeFileBinding(string path) : base(path)\r\n        {\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            if (ServiceProvider.IsTargetTemplate(serviceProvider))\r\n            {\r\n                return this;\r\n            }\r\n\r\n            if (!PathFormat.IsNullOrEmpty() && !(Converter is GenericTypeConverter))\r\n            {\r\n                if (Converter != null)\r\n                {\r\n                    Converter = new GenericTypeConverter\r\n                    {\r\n                        StringFormat = ThemeFile.GetFilePath(PathFormat, false),\r\n                        TestAsFilePath = true,\r\n                        CustomConverter = Converter\r\n                    };\r\n                }\r\n                else\r\n                {\r\n                    Converter = new GenericTypeConverter\r\n                    {\r\n                        StringFormat = ThemeFile.GetFilePath(PathFormat, false),\r\n                        TestAsFilePath = true\r\n                    };\r\n                }\r\n            }\r\n\r\n            return base.ProvideValue(serviceProvider);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Extensions/ServiceProvider.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.Extensions\r\n{\r\n    public class ServiceProvider\r\n    {\r\n        public static bool IsTargetTemplate(IServiceProvider serviceProvider)\r\n        {\r\n            var provider = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;\r\n            return provider.TargetObject.GetType().FullName == \"System.Windows.SharedDp\";\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/FakePlayniteLibraryPlugin.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite\r\n{\r\n    public class FakePlayniteLibraryPlugin : LibraryPlugin\r\n    {\r\n        public override string Name => \"Playnite\";\r\n\r\n        public override Guid Id => Guid.Empty;\r\n\r\n        public FakePlayniteLibraryPlugin() : base(null)\r\n        {\r\n        }\r\n\r\n        public override IEnumerable<GameMetadata> GetGames(LibraryGetGamesArgs args)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/GameTools.cs",
    "content": "﻿using NLog;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class MultiEditGame : Game\r\n    {\r\n        public List<Guid> DistinctGenreIds { get; set; }\r\n        public List<Guid> DistinctDeveloperIds { get; set; }\r\n        public List<Guid> DistinctPublisherIds { get; set; }\r\n        public List<Guid> DistinctCategoryIds { get; set; }\r\n        public List<Guid> DistinctTagIds { get; set; }\r\n        public List<Guid> DistinctFeatureIds { get; set; }\r\n        public List<Guid> DistinctPlatformIds { get; set; }\r\n        public List<Guid> DistinctRegionIds { get; set; }\r\n        public List<Guid> DistinctAgeRatingIds { get; set; }\r\n        public List<Guid> DistinctSeriesIds { get; set; }\r\n    }\r\n\r\n    public class GameTools\r\n    {\r\n        public static MultiEditGame GetMultiGameEditObject(IEnumerable<Game> games)\r\n        {\r\n            var dummyGame = new MultiEditGame();\r\n            if (games?.Any() != true)\r\n            {\r\n                return dummyGame;\r\n            }\r\n\r\n            var firstGame = games.First();\r\n\r\n            var firstName = firstGame.Name;\r\n            if (games.All(a => a.Name == firstName) == true)\r\n            {\r\n                dummyGame.Name = firstName;\r\n            }\r\n\r\n            var firstSortingName = firstGame.SortingName;\r\n            if (games.All(a => a.SortingName == firstSortingName) == true)\r\n            {\r\n                dummyGame.SortingName = firstSortingName;\r\n            }\r\n\r\n            dummyGame.GenreIds = ListExtensions.GetCommonItems(games.Select(a => a.GenreIds)).ToList();\r\n            dummyGame.DistinctGenreIds = ListExtensions.GetDistinctItems(games.Select(a => a.GenreIds)).ToList();\r\n\r\n            dummyGame.DeveloperIds = ListExtensions.GetCommonItems(games.Select(a => a.DeveloperIds)).ToList();\r\n            dummyGame.DistinctDeveloperIds = ListExtensions.GetDistinctItems(games.Select(a => a.DeveloperIds)).ToList();\r\n\r\n            dummyGame.PublisherIds = ListExtensions.GetCommonItems(games.Select(a => a.PublisherIds)).ToList();\r\n            dummyGame.DistinctPublisherIds = ListExtensions.GetDistinctItems(games.Select(a => a.PublisherIds)).ToList();\r\n\r\n            dummyGame.CategoryIds = ListExtensions.GetCommonItems(games.Select(a => a.CategoryIds)).ToList();\r\n            dummyGame.DistinctCategoryIds = ListExtensions.GetDistinctItems(games.Select(a => a.CategoryIds)).ToList();\r\n\r\n            dummyGame.TagIds = ListExtensions.GetCommonItems(games.Select(a => a.TagIds)).ToList();\r\n            dummyGame.DistinctTagIds = ListExtensions.GetDistinctItems(games.Select(a => a.TagIds)).ToList();\r\n\r\n            dummyGame.FeatureIds = ListExtensions.GetCommonItems(games.Select(a => a.FeatureIds)).ToList();\r\n            dummyGame.DistinctFeatureIds = ListExtensions.GetDistinctItems(games.Select(a => a.FeatureIds)).ToList();\r\n\r\n            dummyGame.PlatformIds = ListExtensions.GetCommonItems(games.Select(a => a.PlatformIds)).ToList();\r\n            dummyGame.DistinctPlatformIds = ListExtensions.GetDistinctItems(games.Select(a => a.PlatformIds)).ToList();\r\n\r\n            dummyGame.SeriesIds = ListExtensions.GetCommonItems(games.Select(a => a.SeriesIds)).ToList();\r\n            dummyGame.DistinctSeriesIds = ListExtensions.GetDistinctItems(games.Select(a => a.SeriesIds)).ToList();\r\n\r\n            dummyGame.AgeRatingIds = ListExtensions.GetCommonItems(games.Select(a => a.AgeRatingIds)).ToList();\r\n            dummyGame.DistinctAgeRatingIds = ListExtensions.GetDistinctItems(games.Select(a => a.AgeRatingIds)).ToList();\r\n\r\n            dummyGame.RegionIds = ListExtensions.GetCommonItems(games.Select(a => a.RegionIds)).ToList();\r\n            dummyGame.DistinctRegionIds = ListExtensions.GetDistinctItems(games.Select(a => a.RegionIds)).ToList();\r\n\r\n            var firstReleaseDate = firstGame.ReleaseDate;\r\n            if (games.All(a => a.ReleaseDate == firstReleaseDate) == true)\r\n            {\r\n                dummyGame.ReleaseDate = firstReleaseDate;\r\n            }\r\n\r\n            var firstDescription = firstGame.Description;\r\n            if (games.All(a => a.Description == firstDescription) == true)\r\n            {\r\n                dummyGame.Description = firstDescription;\r\n            }\r\n\r\n            var firstNotes = firstGame.Notes;\r\n            if (games.All(a => a.Notes == firstNotes) == true)\r\n            {\r\n                dummyGame.Notes = firstNotes;\r\n            }\r\n\r\n            var firstManual = firstGame.Manual;\r\n            if (games.All(a => a.Manual == firstManual) == true)\r\n            {\r\n                dummyGame.Manual = firstManual;\r\n            }\r\n\r\n            var firstLastActivity = firstGame.LastActivity;\r\n            if (games.All(a => a.LastActivity == firstLastActivity) == true)\r\n            {\r\n                dummyGame.LastActivity = firstLastActivity;\r\n            }\r\n\r\n            var firstPlaytime = firstGame.Playtime;\r\n            if (games.All(a => a.Playtime == firstPlaytime) == true)\r\n            {\r\n                dummyGame.Playtime = firstPlaytime;\r\n            }\r\n\r\n            var firstAdded = firstGame.Added;\r\n            if (games.All(a => a.Added == firstAdded) == true)\r\n            {\r\n                dummyGame.Added = firstAdded;\r\n            }\r\n\r\n            var firstPlayCount = firstGame.PlayCount;\r\n            if (games.All(a => a.PlayCount == firstPlayCount) == true)\r\n            {\r\n                dummyGame.PlayCount = firstPlayCount;\r\n            }\r\n\r\n            var firstInstallSize = firstGame.InstallSize;\r\n            if (games.All(a => a.InstallSize == firstInstallSize) == true)\r\n            {\r\n                dummyGame.InstallSize = firstInstallSize;\r\n            }\r\n\r\n            var firstVersion = firstGame.Version;\r\n            if (games.All(a => a.Version == firstVersion) == true)\r\n            {\r\n                dummyGame.Version = firstVersion;\r\n            }\r\n\r\n            var firstSource = firstGame.SourceId;\r\n            if (games.All(a => a.SourceId == firstSource) == true)\r\n            {\r\n                dummyGame.SourceId = firstSource;\r\n            }\r\n\r\n            var firstCompletionStatus = firstGame.CompletionStatusId;\r\n            if (games.All(a => a.CompletionStatusId == firstCompletionStatus) == true)\r\n            {\r\n                dummyGame.CompletionStatusId = firstCompletionStatus;\r\n            }\r\n\r\n            var firstUserScore = firstGame.UserScore;\r\n            if (games.All(a => a.UserScore == firstUserScore) == true)\r\n            {\r\n                dummyGame.UserScore = firstUserScore;\r\n            }\r\n\r\n            var firstCriticScore = firstGame.CriticScore;\r\n            if (games.All(a => a.CriticScore == firstCriticScore) == true)\r\n            {\r\n                dummyGame.CriticScore = firstCriticScore;\r\n            }\r\n\r\n            var firstCommunityScore = firstGame.CommunityScore;\r\n            if (games.All(a => a.CommunityScore == firstCommunityScore) == true)\r\n            {\r\n                dummyGame.CommunityScore = firstCommunityScore;\r\n            }\r\n\r\n            var firstHidden = firstGame.Hidden;\r\n            if (games.All(a => a.Hidden == firstHidden) == true)\r\n            {\r\n                dummyGame.Hidden = firstHidden;\r\n            }\r\n\r\n            var firstInstalled = firstGame.IsInstalled;\r\n            if (games.All(a => a.IsInstalled == firstInstalled) == true)\r\n            {\r\n                dummyGame.IsInstalled = firstInstalled;\r\n            }\r\n\r\n            var firstInstallDir = firstGame.InstallDirectory;\r\n            if (games.All(a => a.InstallDirectory == firstInstallDir) == true)\r\n            {\r\n                dummyGame.InstallDirectory = firstInstallDir;\r\n            }\r\n\r\n            var firstFavorite = firstGame.Favorite;\r\n            if (games.All(a => a.Favorite == firstFavorite) == true)\r\n            {\r\n                dummyGame.Favorite = firstFavorite;\r\n            }\r\n\r\n            var firstPreScript = firstGame.PreScript;\r\n            if (games.All(a => string.Equals(a.PreScript, firstPreScript, StringComparison.Ordinal)))\r\n            {\r\n                dummyGame.PreScript = firstPreScript;\r\n            }\r\n\r\n            var firstPostScript = firstGame.PostScript;\r\n            if (games.All(a => string.Equals(a.PostScript, firstPostScript, StringComparison.Ordinal)))\r\n            {\r\n                dummyGame.PostScript = firstPostScript;\r\n            }\r\n\r\n            var firstGameStartedScript = firstGame.GameStartedScript;\r\n            if (games.All(a => string.Equals(a.GameStartedScript, firstGameStartedScript, StringComparison.Ordinal)))\r\n            {\r\n                dummyGame.GameStartedScript = firstGameStartedScript;\r\n            }\r\n\r\n            var firstUseGlobalPreSrc = firstGame.UseGlobalPreScript;\r\n            if (games.All(a => a.UseGlobalPreScript == firstUseGlobalPreSrc) == true)\r\n            {\r\n                dummyGame.UseGlobalPreScript = firstUseGlobalPreSrc;\r\n            }\r\n\r\n            var firstUseGlobalPostSrc = firstGame.UseGlobalPostScript;\r\n            if (games.All(a => a.UseGlobalPostScript == firstUseGlobalPostSrc) == true)\r\n            {\r\n                dummyGame.UseGlobalPostScript = firstUseGlobalPostSrc;\r\n            }\r\n\r\n            var firstUseGlobalGameStartedSrc = firstGame.UseGlobalGameStartedScript;\r\n            if (games.All(a => a.UseGlobalGameStartedScript == firstUseGlobalGameStartedSrc) == true)\r\n            {\r\n                dummyGame.UseGlobalGameStartedScript = firstUseGlobalGameStartedSrc;\r\n            }\r\n\r\n            var firstIncludeLibraryPluginAction = firstGame.IncludeLibraryPluginAction;\r\n            if (games.All(a => a.IncludeLibraryPluginAction == firstIncludeLibraryPluginAction) == true)\r\n            {\r\n                dummyGame.IncludeLibraryPluginAction = firstIncludeLibraryPluginAction;\r\n            }\r\n\r\n            return dummyGame;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/GamesCollectionView.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK.Plugins;\r\n\r\nnamespace Playnite\r\n{\r\n    public abstract class BaseCollectionView : ObservableObject, IDisposable\r\n    {\r\n        public static ILogger Logger = LogManager.GetLogger();\r\n        private ExtensionFactory extensions;\r\n        private FilterSettings filterSettings;\r\n        private readonly PlayniteSettings settings;\r\n\r\n        public IGameDatabaseMain Database { get; private set; }\r\n        public RangeObservableCollection<GamesCollectionViewEntry> Items { get; private set; }\r\n        public bool IgnoreViewConfigChanges { get; set; } = false;\r\n\r\n        private ListCollectionView collectionView;\r\n        public ListCollectionView CollectionView\r\n        {\r\n            get => collectionView;\r\n            private set\r\n            {\r\n                collectionView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public BaseCollectionView(IGameDatabaseMain database, ExtensionFactory extensions, FilterSettings filterSettings, PlayniteSettings settings)\r\n        {\r\n            Database = database;\r\n            this.extensions = extensions;\r\n            this.filterSettings = filterSettings;\r\n            this.settings = settings;\r\n            Items = new RangeObservableCollection<GamesCollectionViewEntry>();\r\n            filterSettings.FilterChanged += FilterSettings_FilterChanged;\r\n            CollectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(Items);\r\n            CollectionView.Filter = Filter;\r\n        }\r\n\r\n        public virtual void Dispose()\r\n        {\r\n            filterSettings.FilterChanged -= FilterSettings_FilterChanged;\r\n            Items = null;\r\n        }\r\n\r\n        private bool Filter(object item)\r\n        {\r\n            if (!(item is GamesCollectionViewEntry entry))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Database.GetGameMatchesFilter(entry.Game, filterSettings, settings.FuzzyMatchingInNameFilter);\r\n        }\r\n\r\n        private void FilterSettings_FilterChanged(object sender, FilterChangedEventArgs e)\r\n        {\r\n            if (IgnoreViewConfigChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            Logger.Debug(\"Refreshing collection view filter.\");\r\n            CollectionView.Refresh();\r\n        }\r\n\r\n        public LibraryPlugin GetLibraryPlugin(Game game)\r\n        {\r\n            if (game.PluginId != Guid.Empty &&\r\n                extensions.Plugins.TryGetValue(game.PluginId, out var plugin) &&\r\n                plugin.Plugin is LibraryPlugin libPlugin)\r\n            {\r\n                return libPlugin;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public abstract void RefreshView();\r\n\r\n        public void NotifyItemPropertyChanges(params string[] changedProperties)\r\n        {\r\n            if (!Items.HasItems())\r\n            {\r\n                return;\r\n            }\r\n\r\n            Logger.Trace(\"NotifyItemPropertyChanges: \");\r\n            changedProperties.ForEach(prop => Logger.Trace(prop));\r\n            foreach (var item in Items)\r\n            {\r\n                changedProperties.ForEach(prop => item.OnPropertyChanged(prop));\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/GamesCollectionViewEntry.cs",
    "content": "﻿using Playnite.Converters;\r\nusing Playnite.Database;\r\nusing Playnite.Extensions.Markup;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite\r\n{\r\n    public class GamesCollectionViewEntry : INotifyPropertyChanged, IDisposable\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly PlayniteSettings settings;\r\n\r\n        public static BitmapLoadProperties DetailsListIconProperties { get; private set; }\r\n        public static BitmapLoadProperties GridViewCoverProperties { get; private set; }\r\n        public static BitmapLoadProperties BackgroundImageProperties { get; private set; }\r\n        public static BitmapLoadProperties FullscreenListCoverProperties { get; private set; }\r\n\r\n        public LibraryPlugin LibraryPlugin { get; }\r\n        public Guid Id => Game.Id;\r\n        public Guid PluginId => Game.PluginId;\r\n        public string GameId => Game.GameId;\r\n        public ComparableDbItemList<Tag> Tags => new ComparableDbItemList<Tag>(Game.Tags);\r\n        public ComparableDbItemList<GameFeature> Features => new ComparableDbItemList<GameFeature>(Game.Features);\r\n        public ComparableDbItemList<Genre> Genres => new ComparableDbItemList<Genre>(Game.Genres);\r\n        public ComparableDbItemList<Company> Developers => new ComparableDbItemList<Company>(Game.Developers);\r\n        public ComparableDbItemList<Company> Publishers => new ComparableDbItemList<Company>(Game.Publishers);\r\n        public ComparableDbItemList<Category> Categories => new ComparableDbItemList<Category>(Game.Categories);\r\n        public ComparableDbItemList<AgeRating> AgeRatings => new ComparableDbItemList<AgeRating>(Game.AgeRatings);\r\n        public ComparableDbItemList<Series> Series => new ComparableDbItemList<Series>(Game.Series);\r\n        public ComparableDbItemList<Region> Regions => new ComparableDbItemList<Region>(Game.Regions);\r\n        public ComparableDbItemList<Platform> Platforms => new ComparableDbItemList<Platform>(Game.Platforms);\r\n        public ReleaseDate? ReleaseDate => Game.ReleaseDate;\r\n        public int? ReleaseYear => Game.ReleaseYear;\r\n        public DateTime? LastActivity => Game.LastActivity;\r\n        public ObservableCollection<Link> Links => Game.Links;\r\n        public string Icon => Game.Icon;\r\n        public string CoverImage => Game.CoverImage;\r\n        public string BackgroundImage => Game.BackgroundImage;\r\n        public bool Hidden => Game.Hidden;\r\n        public bool Favorite => Game.Favorite;\r\n        public string InstallDirectory => Game.InstallDirectory;\r\n        public ObservableCollection<GameAction> GameActions => Game.GameActions;\r\n        public string DisplayName => Game.Name;\r\n        public string Description => Game.Description;\r\n        public string Notes => Game.Notes;\r\n        public bool IsInstalled => Game.IsInstalled;\r\n        public bool IsInstalling => Game.IsInstalling;\r\n        public bool IsUninstalling => Game.IsUninstalling;\r\n        public bool IsLaunching => Game.IsLaunching;\r\n        public bool IsRunning => Game.IsRunning;\r\n        public bool IsCustomGame => Game.IsCustomGame;\r\n        public ulong Playtime => Game.Playtime;\r\n        public DateTime? Added => Game.Added;\r\n        public DateTime? Modified => Game.Modified;\r\n        public ulong PlayCount => Game.PlayCount;\r\n        public ulong? InstallSize => Game.InstallSize;\r\n        public string Version => Game.Version;\r\n        public int? UserScore => Game.UserScore;\r\n        public int? CriticScore => Game.CriticScore;\r\n        public int? CommunityScore => Game.CommunityScore;\r\n        public ScoreGroup UserScoreGroup => Game.UserScoreGroup;\r\n        public ScoreGroup CriticScoreGroup => Game.CriticScoreGroup;\r\n        public ScoreGroup CommunityScoreGroup => Game.CommunityScoreGroup;\r\n        public ScoreRating UserScoreRating => Game.UserScoreRating;\r\n        public ScoreRating CriticScoreRating => Game.CriticScoreRating;\r\n        public ScoreRating CommunityScoreRating => Game.CommunityScoreRating;\r\n        public PastTimeSegment LastActivitySegment => Game.LastActivitySegment;\r\n        public PastTimeSegment AddedSegment => Game.AddedSegment;\r\n        public PastTimeSegment ModifiedSegment => Game.ModifiedSegment;\r\n        public PastTimeSegment RecentActivitySegment => Game.RecentActivitySegment;\r\n        public PlaytimeCategory PlaytimeCategory => Game.PlaytimeCategory;\r\n        public InstallationStatus InstallationState => Game.InstallationStatus;\r\n        public char NameGroup => Game.GetNameGroup();\r\n        public DateTime? RecentActivity => Game.RecentActivity;\r\n        public string InstallDriveGroup => Game.GetInstallDriveGroup();\r\n        public InstallSizeGroup InstallSizeGroup => Game.GetInstallSizeGroup();\r\n        public bool OverrideInstallState => Game.OverrideInstallState;\r\n\r\n        public List<Guid> CategoryIds => Game.CategoryIds;\r\n        public List<Guid> GenreIds => Game.GenreIds;\r\n        public List<Guid> DeveloperIds => Game.DeveloperIds;\r\n        public List<Guid> PublisherIds => Game.PublisherIds;\r\n        public List<Guid> TagIds => Game.TagIds;\r\n        public List<Guid> SeriesIds => Game.SeriesIds;\r\n        public List<Guid> AgeRatingIds => Game.AgeRatingIds;\r\n        public List<Guid> RegionIds => Game.RegionIds;\r\n        public Guid SourceId => Game.SourceId;\r\n        public List<Guid> PlatformIds => Game.PlatformIds;\r\n        public List<Guid> FeatureIds => Game.FeatureIds;\r\n        public Guid CompletionStatusId => Game.CompletionStatusId;\r\n        public ObservableCollection<GameRom> Roms => Game.Roms;\r\n        public string RomList => Game.Roms.HasItems() ? string.Join(\", \", Game.Roms.Select(a => a.Path)) : string.Empty;\r\n\r\n        public object LibraryIcon => GetImageObject(LibraryPlugin?.LibraryIcon, true);\r\n        public object IconObject => GetImageObject(Game.Icon, false);\r\n        public object CoverImageObject => GetImageObject(Game.CoverImage, false);\r\n        public object DefaultIconObject => GetDefaultIcon(false);\r\n        public object DefaultCoverImageObject => GetDefaultCoverImage(false);\r\n\r\n        public object IconObjectCached => GetImageObject(Game.Icon, true);\r\n        public object CoverImageObjectCached => GetImageObject(Game.CoverImage, true);\r\n        public object DefaultIconObjectCached => GetDefaultIcon(true);\r\n        public object DefaultCoverImageObjectCached => GetDefaultCoverImage(true);\r\n\r\n        public string DisplayBackgroundImage => GetBackgroundImage();\r\n        public object DisplayBackgroundImageObject => GetBackgroundImageObject(BackgroundImageProperties);\r\n\r\n        public object DetailsListIconObjectCached => GetImageObject(Game.Icon, true, DetailsListIconProperties);\r\n        public object GridViewCoverObjectCached => GetImageObject(Game.CoverImage, true, GridViewCoverProperties);\r\n        public object DefaultDetailsListIconObjectCached => GetDefaultIcon(true, DetailsListIconProperties);\r\n        public object DefaultGridViewCoverObjectCached => GetDefaultCoverImage(true, GridViewCoverProperties);\r\n\r\n        public object FullscreenListItemCoverObject => GetImageObject(\r\n            Game.CoverImage,\r\n            settings.Fullscreen.ImageScalerMode != ImageLoadScaling.None,\r\n            FullscreenListCoverProperties);\r\n        public object DefaultFullscreenListItemCoverObject => GetDefaultCoverImage(true, FullscreenListCoverProperties);\r\n\r\n        public Series Serie\r\n        {\r\n            get; private set;\r\n        } = Playnite.SDK.Models.Series.Empty;\r\n\r\n        public Platform Platform\r\n        {\r\n            get; private set;\r\n        } = Platform.Empty;\r\n\r\n        public Region Region\r\n        {\r\n            get; private set;\r\n        } = Region.Empty;\r\n\r\n        public GameSource Source\r\n        {\r\n            get => Game.Source ?? GameSource.Empty;\r\n        }\r\n\r\n        public CompletionStatus CompletionStatus\r\n        {\r\n            get => Game.CompletionStatus ?? CompletionStatus.Empty;\r\n        }\r\n\r\n        public AgeRating AgeRating\r\n        {\r\n            get; private set;\r\n        } = AgeRating.Empty;\r\n\r\n        public Category Category\r\n        {\r\n            get; private set;\r\n        } = Category.Empty;\r\n\r\n        public Genre Genre\r\n        {\r\n            get; private set;\r\n        } = Genre.Empty;\r\n\r\n        public Company Developer\r\n        {\r\n            get; private set;\r\n        } = Company.Empty;\r\n\r\n        public Company Publisher\r\n        {\r\n            get; private set;\r\n        } = Company.Empty;\r\n\r\n        public Tag Tag\r\n        {\r\n            get; private set;\r\n        } = Tag.Empty;\r\n\r\n        public GameFeature Feature\r\n        {\r\n            get; private set;\r\n        } = GameFeature.Empty;\r\n\r\n        public string Name\r\n        {\r\n            get\r\n            {\r\n                return string.IsNullOrEmpty(Game.SortingName) ? Game.Name : Game.SortingName;\r\n            }\r\n        }\r\n\r\n        public Game Game\r\n        {\r\n            get;\r\n        }\r\n\r\n        public string Library\r\n        {\r\n            get;\r\n        }\r\n\r\n        public event PropertyChangedEventHandler PropertyChanged;\r\n\r\n        public GamesCollectionViewEntry(Game game, LibraryPlugin plugin, PlayniteSettings settings, bool readOnly = false)\r\n        {\r\n            this.settings = settings;\r\n            LibraryPlugin = plugin;\r\n            Library = string.IsNullOrEmpty(plugin?.Name) ? \"Playnite\" : plugin.Name;\r\n            Game = game;\r\n            if (!readOnly)\r\n            {\r\n                Game.PropertyChanged += Game_PropertyChanged;\r\n            }\r\n        }\r\n\r\n        public static void InitItemViewProperties(PlayniteApplication app, PlayniteSettings settings)\r\n        {\r\n            logger.Debug(\"Reloading collection item view properties.\");\r\n            // Use optimized rendering only for Desktop mode where we know pixel perfect data\r\n            if (app.Mode == ApplicationMode.Desktop)\r\n            {\r\n                DetailsListIconProperties = new BitmapLoadProperties(\r\n                    0,\r\n                    Convert.ToInt32(settings.DetailsViewListIconSize),\r\n                    app.DpiScale);\r\n                GridViewCoverProperties = new BitmapLoadProperties(\r\n                    Convert.ToInt32(settings.GridItemWidth),\r\n                    0,\r\n                    app.DpiScale,\r\n                    settings.ImageScalerMode);\r\n            }\r\n            else\r\n            {\r\n                FullscreenListCoverProperties = GetFullscreenItemRenderSettings(app, settings);\r\n            }\r\n\r\n            BackgroundImageProperties = new BitmapLoadProperties(\r\n                app.CurrentScreen.WorkingArea.Width,\r\n                0,\r\n                app.DpiScale,\r\n                settings.ImageScalerMode);\r\n        }\r\n\r\n        private static BitmapLoadProperties GetFullscreenItemRenderSettings(PlayniteApplication app, PlayniteSettings settings)\r\n        {\r\n            if (app == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            var dpi = app.DpiScale;\r\n            var properties = new BitmapLoadProperties(0, 0, null, settings.Fullscreen.ImageScalerMode);\r\n            if (settings.Fullscreen.HorizontalLayout)\r\n            {\r\n                properties.MaxDecodePixelWidth = app.CurrentScreen.Bounds.Width / (settings.Fullscreen.Columns == 0 ? 1 : settings.Fullscreen.Columns);\r\n                properties.MaxDecodePixelWidth = (int)Math.Round(properties.MaxDecodePixelWidth / dpi.DpiScaleX);\r\n            }\r\n            else\r\n            {\r\n                properties.MaxDecodePixelHeight = app.CurrentScreen.Bounds.Height / (settings.Fullscreen.Rows == 0 ? 1 : settings.Fullscreen.Rows);\r\n                properties.MaxDecodePixelHeight = (int)Math.Round(properties.MaxDecodePixelHeight / dpi.DpiScaleY);\r\n            }\r\n\r\n            return properties;\r\n        }\r\n\r\n        public static GamesCollectionViewEntry GetAdvancedGroupedEntry(\r\n            Game game,\r\n            LibraryPlugin plugin,\r\n            Type colGroupType,\r\n            Guid groupObjId,\r\n            IGameDatabase database,\r\n            PlayniteSettings settings)\r\n        {\r\n            if (colGroupType == typeof(Genre))\r\n            {\r\n                var obj = database.Genres.Get(groupObjId);\r\n                if (obj != null)\r\n                {\r\n                    return new GamesCollectionViewEntry(game, plugin, settings) { Genre = obj };\r\n                }\r\n            }\r\n            else if (colGroupType == typeof(Developer))\r\n            {\r\n                var obj = database.Companies.Get(groupObjId);\r\n                if (obj != null)\r\n                {\r\n                    return new GamesCollectionViewEntry(game, plugin, settings) { Developer = obj };\r\n                }\r\n            }\r\n            else if (colGroupType == typeof(Publisher))\r\n            {\r\n                var obj = database.Companies.Get(groupObjId);\r\n                if (obj != null)\r\n                {\r\n                    return new GamesCollectionViewEntry(game, plugin, settings) { Publisher = obj };\r\n                }\r\n            }\r\n            else if (colGroupType == typeof(Tag))\r\n            {\r\n                var obj = database.Tags.Get(groupObjId);\r\n                if (obj != null)\r\n                {\r\n                    return new GamesCollectionViewEntry(game, plugin, settings) { Tag = obj };\r\n                }\r\n            }\r\n            else if (colGroupType == typeof(GameFeature))\r\n            {\r\n                var obj = database.Features.Get(groupObjId);\r\n                if (obj != null)\r\n                {\r\n                    return new GamesCollectionViewEntry(game, plugin, settings) { Feature = obj };\r\n                }\r\n            }\r\n            else if (colGroupType == typeof(Category))\r\n            {\r\n                var obj = database.Categories.Get(groupObjId);\r\n                if (obj != null)\r\n                {\r\n                    return new GamesCollectionViewEntry(game, plugin, settings) { Category = obj };\r\n                }\r\n            }\r\n            else if (colGroupType == typeof(Platform))\r\n            {\r\n                var obj = database.Platforms.Get(groupObjId);\r\n                if (obj != null)\r\n                {\r\n                    return new GamesCollectionViewEntry(game, plugin, settings) { Platform = obj };\r\n                }\r\n            }\r\n            else if (colGroupType == typeof(AgeRating))\r\n            {\r\n                var obj = database.AgeRatings.Get(groupObjId);\r\n                if (obj != null)\r\n                {\r\n                    return new GamesCollectionViewEntry(game, plugin, settings) { AgeRating = obj };\r\n                }\r\n            }\r\n            else if (colGroupType == typeof(Series))\r\n            {\r\n                var obj = database.Series.Get(groupObjId);\r\n                if (obj != null)\r\n                {\r\n                    return new GamesCollectionViewEntry(game, plugin, settings) { Serie = obj };\r\n                }\r\n            }\r\n            else if (colGroupType == typeof(Region))\r\n            {\r\n                var obj = database.Regions.Get(groupObjId);\r\n                if (obj != null)\r\n                {\r\n                    return new GamesCollectionViewEntry(game, plugin, settings) { Region = obj };\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            Game.PropertyChanged -= Game_PropertyChanged;\r\n        }\r\n\r\n        private void Game_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            OnPropertyChanged(e.PropertyName);\r\n        }\r\n\r\n        public void OnPropertyChanged(string propertyName)\r\n        {\r\n            if (propertyName == nameof(Game.SortingName) || propertyName == nameof(Game.Name))\r\n            {\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Game.Name)));\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DisplayName)));\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(NameGroup)));\r\n            }\r\n\r\n            if (propertyName == nameof(Game.Icon))\r\n            {\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IconObject)));\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IconObjectCached)));\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DetailsListIconObjectCached)));\r\n            }\r\n\r\n            if (propertyName == nameof(Game.CoverImage))\r\n            {\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CoverImageObject)));\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CoverImageObjectCached)));\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(GridViewCoverObjectCached)));\r\n            }\r\n\r\n            if (propertyName == nameof(Game.BackgroundImage))\r\n            {\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DisplayBackgroundImage)));\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DisplayBackgroundImageObject)));\r\n            }\r\n\r\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\r\n        }\r\n\r\n        private object GetImageObject(string data, bool cached, BitmapLoadProperties loadProperties = null)\r\n        {\r\n            return ImageSourceManager.GetImage(data, cached, loadProperties);\r\n        }\r\n\r\n        public object GetDefaultIcon(bool cached, BitmapLoadProperties loadProperties = null)\r\n        {\r\n            var icon = GetDefaultIconFile(Game, settings, GameDatabase.Instance, LibraryPlugin);\r\n            if (icon.IsNullOrEmpty())\r\n            {\r\n                return ImageSourceManager.GetResourceImage(\"DefaultGameIcon\", cached, loadProperties);\r\n            }\r\n            else\r\n            {\r\n                return ImageSourceManager.GetImage(icon, cached);\r\n            }\r\n        }\r\n\r\n        public static string GetDefaultIconFile(Game game, PlayniteSettings settings, IGameDatabaseMain database, LibraryPlugin plugin)\r\n        {\r\n            if (settings.DefaultIconSource == DefaultIconSourceOptions.None)\r\n            {\r\n                return null;\r\n            }\r\n            else if (settings.DefaultIconSource == DefaultIconSourceOptions.Library && plugin?.LibraryIcon.IsNullOrEmpty() == false)\r\n            {\r\n                return plugin.LibraryIcon;\r\n            }\r\n            else if (settings.DefaultIconSource == DefaultIconSourceOptions.Platform)\r\n            {\r\n                var plat = game.Platforms?.FirstOrDefault(a => !a.Icon.IsNullOrEmpty());\r\n                if (plat != null)\r\n                {\r\n                    return database?.GetFullFilePath(plat.Icon);\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public object GetDefaultCoverImage(bool cached, BitmapLoadProperties loadProperties = null)\r\n        {\r\n            if (settings.DefaultCoverSource == DefaultCoverSourceOptions.None)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            if (settings.DefaultCoverSource == DefaultCoverSourceOptions.Platform)\r\n            {\r\n                var plat = Game.Platforms?.FirstOrDefault(a => !a.Cover.IsNullOrEmpty());\r\n                if (plat != null)\r\n                {\r\n                    return ImageSourceManager.GetImage(plat.Cover, cached);\r\n                }\r\n            }\r\n\r\n            return ImageSourceManager.GetResourceImage(\"DefaultGameCover\", cached, loadProperties);\r\n        }\r\n\r\n        public string GetBackgroundImage()\r\n        {\r\n            if (!Game.BackgroundImage.IsNullOrEmpty())\r\n            {\r\n                return Game.BackgroundImage;\r\n            }\r\n\r\n            if (settings.DefaultBackgroundSource == DefaultBackgroundSourceOptions.None)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            if (settings.DefaultBackgroundSource == DefaultBackgroundSourceOptions.Cover && !CoverImage.IsNullOrEmpty())\r\n            {\r\n                return CoverImage;\r\n            }\r\n\r\n            if (settings.DefaultBackgroundSource == DefaultBackgroundSourceOptions.Platform)\r\n            {\r\n                var plat = Game.Platforms?.FirstOrDefault(a => !a.Background.IsNullOrEmpty());\r\n                if (plat != null)\r\n                {\r\n                    return plat.Background;\r\n                }\r\n            }\r\n\r\n            if (settings.DefaultBackgroundSource == DefaultBackgroundSourceOptions.Library && LibraryPlugin?.LibraryBackground.IsNullOrEmpty() == false)\r\n            {\r\n                return LibraryPlugin.LibraryBackground;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public object GetBackgroundImageObject(BitmapLoadProperties loadProperties = null)\r\n        {\r\n            var imagePath = GetBackgroundImage();\r\n            if (imagePath.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                if (loadProperties == null)\r\n                {\r\n                    return new BitmapLoadProperties(0, 0) { Source = imagePath };\r\n                }\r\n                else\r\n                {\r\n                    return new BitmapLoadProperties(loadProperties.MaxDecodePixelWidth, 0, loadProperties.DpiScale, loadProperties.Scaling)\r\n                    {\r\n                        Source = imagePath\r\n                    };\r\n                }\r\n            }\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n\r\n        public static explicit operator Game(GamesCollectionViewEntry entry)\r\n        {\r\n            return entry.Game;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/GamesEditor.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.Plugins;\r\nusing Playnite.Controllers;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Settings;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Windows;\r\nusing System.Windows.Shell;\r\nusing Playnite.Scripting;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Collections.Concurrent;\r\nusing Playnite.SDK.Exceptions;\r\nusing System.Drawing.Imaging;\r\nusing Playnite.SDK.Plugins;\r\nusing System.Collections.ObjectModel;\r\nusing Playnite.Scripting.PowerShell;\r\nusing Playnite.Windows;\r\nusing System.Windows.Input;\r\nusing System.Security.Cryptography;\r\n\r\nnamespace Playnite\r\n{\r\n    public enum GameScriptType\r\n    {\r\n        [Description(LOC.ScriptTypeStarting)]\r\n        Starting,\r\n        [Description(LOC.ScriptTypeStarted)]\r\n        Started,\r\n        [Description(LOC.ScriptTypeExit)]\r\n        Exit,\r\n        [Description(\"\")]\r\n        None\r\n    }\r\n\r\n    public interface IActionSelector\r\n    {\r\n        object SelectPlayAction(List<PlayController> controllers, List<GameAction> actions);\r\n        InstallController SelectInstallAction(List<InstallController> pluginActions);\r\n        UninstallController SelectUninstallAction(List<UninstallController> pluginActions);\r\n    }\r\n\r\n    public class ClientShutdownJob\r\n    {\r\n        public Guid PluginId { get; set; }\r\n        public CancellationTokenSource CancelToken { get; set; }\r\n        public Task CancelTask { get; set; }\r\n    }\r\n\r\n    public class RunningGame\r\n    {\r\n        public Guid Id { get; set; }\r\n        public bool LauchedFromUI { get; set; }\r\n\r\n        public RunningGame(Guid id, bool lauchedFromUI)\r\n        {\r\n            Id = id;\r\n            LauchedFromUI = lauchedFromUI;\r\n        }\r\n    }\r\n\r\n    public class GamesEditor : ObservableObject, IDisposable\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private static bool showedPowerShellError = false;\r\n        private IResourceProvider resources = new ResourceProvider();\r\n        private GameControllerFactory controllers;\r\n        private readonly ConcurrentDictionary<Guid, ClientShutdownJob> shutdownJobs = new ConcurrentDictionary<Guid, ClientShutdownJob>();\r\n        private readonly ConcurrentDictionary<Guid, DateTime> gameStartups = new ConcurrentDictionary<Guid, DateTime>();\r\n        private readonly ConcurrentDictionary<Guid, IPowerShellRuntime> scriptRuntimes = new ConcurrentDictionary<Guid, IPowerShellRuntime>();\r\n        private readonly IActionSelector actionSelector;\r\n        private bool wasHdrEnabled;\r\n\r\n        public PlayniteApplication Application;\r\n\r\n        public ExtensionFactory Extensions { get; private set; }\r\n        public GameDatabase Database { get; private set; }\r\n        public IDialogsFactory Dialogs { get; private set; }\r\n        public PlayniteSettings AppSettings { get; private set; }\r\n        public Dictionary<Guid, RunningGame> RunningGames { get; } = new Dictionary<Guid, RunningGame>();\r\n\r\n        public List<Game> QuickLaunchItems\r\n        {\r\n            get\r\n            {\r\n                if (AppSettings.QuickLaunchItems > 0)\r\n                {\r\n                    return Database.Games.\r\n                        Where(a => a.LastActivity != null && a.IsInstalled &&\r\n                            (!a.Hidden || (a.Hidden && AppSettings.ShowHiddenInQuickLaunch))).\r\n                        OrderByDescending(a => a.LastActivity).\r\n                        Take(AppSettings.QuickLaunchItems).\r\n                        ToList();\r\n                }\r\n                else\r\n                {\r\n                    return new List<Game>();\r\n                }\r\n            }\r\n        }\r\n\r\n        public List<Game> FavoriteQuickLaunchItems\r\n        {\r\n            get\r\n            {\r\n                return Database.Games.\r\n                    Where(a => a.Favorite && a.IsInstalled &&\r\n                        (!a.Hidden || (a.Hidden && AppSettings.ShowHiddenInQuickLaunch))).\r\n                    OrderBy(a => a.Name).\r\n                    ToList();\r\n            }\r\n        }\r\n\r\n        public GamesEditor(\r\n            GameDatabase database,\r\n            GameControllerFactory controllerFactory,\r\n            PlayniteSettings appSettings,\r\n            IDialogsFactory dialogs,\r\n            ExtensionFactory extensions,\r\n            PlayniteApplication app,\r\n            IActionSelector actionSelector)\r\n        {\r\n            this.Dialogs = dialogs;\r\n            this.Database = database;\r\n            this.AppSettings = appSettings;\r\n            this.Extensions = extensions;\r\n            this.Application = app;\r\n            this.actionSelector = actionSelector;\r\n            controllers = controllerFactory;\r\n            controllers.Installed += Controllers_Installed;\r\n            controllers.InstallationCancelled += Controllers_InstallationCancelled;\r\n            controllers.Uninstalled += Controllers_Uninstalled;\r\n            controllers.Started += Controllers_Started;\r\n            controllers.Stopped += Controllers_Stopped;\r\n            AppSettings.PropertyChanged += AppSettings_PropertyChanged;\r\n        }\r\n\r\n        private void AppSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(PlayniteSettings.ShowHiddenInQuickLaunch) ||\r\n                e.PropertyName == nameof(PlayniteSettings.QuickLaunchItems))\r\n            {\r\n                UpdateJumpList();\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            foreach (var controller in controllers.PlayControllers)\r\n            {\r\n                UpdateGameState(controller.Game.Id, null, false, false, false, false);\r\n            }\r\n\r\n            foreach (var controller in controllers.InstallControllers)\r\n            {\r\n                UpdateGameState(controller.Game.Id, null, false, false, false, false);\r\n            }\r\n\r\n\r\n            controllers.Installed -= Controllers_Installed;\r\n            controllers.InstallationCancelled -= Controllers_InstallationCancelled;\r\n            controllers.Uninstalled -= Controllers_Uninstalled;\r\n            controllers.Started -= Controllers_Started;\r\n            controllers.Stopped -= Controllers_Stopped;\r\n        }\r\n\r\n        public void StartContextAction(Game game)\r\n        {\r\n            if (game.IsInstalled)\r\n            {\r\n                PlayGame(game, true);\r\n            }\r\n            else\r\n            {\r\n                InstallGame(game);\r\n            }\r\n        }\r\n\r\n        public void PlayGame(Game game, bool launchedFromUI)\r\n        {\r\n            if (!game.IsInstalled)\r\n            {\r\n                InstallGame(game);\r\n                return;\r\n            }\r\n\r\n            logger.Info($\"Starting {game.GetIdentifierInfo()}\");\r\n            var dbGame = Database.Games.Get(game.Id);\r\n            if (dbGame == null)\r\n            {\r\n                Dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCGameStartErrorNoGame\"), game.Name),\r\n                    resources.GetString(\"LOCGameError\"),\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n                UpdateJumpList();\r\n                return;\r\n            }\r\n\r\n            PlayController controller = null;\r\n\r\n            try\r\n            {\r\n                if (game.IsRunning || game.IsLaunching)\r\n                {\r\n                    logger.Warn(\"Failed to start the game, game is already running/launching.\");\r\n                    return;\r\n                }\r\n\r\n                var gameActions = GetPlayActions(game);\r\n                if (!gameActions.Item1.HasItems() && !gameActions.Item2.HasItems())\r\n                {\r\n                    Dialogs.ShowErrorMessage(LOC.ErrorNoPlayAction, LOC.GameError);\r\n                    return;\r\n                }\r\n\r\n                object playAction = null;\r\n                if ((gameActions.Item1.Count + gameActions.Item2.Count) > 1)\r\n                {\r\n                    playAction = actionSelector.SelectPlayAction(gameActions.Item1, gameActions.Item2);\r\n                }\r\n                else\r\n                {\r\n                    if (gameActions.Item1.Count > 0)\r\n                    {\r\n                        playAction = gameActions.Item1[0];\r\n                    }\r\n                    else\r\n                    {\r\n                        playAction = gameActions.Item2[0];\r\n                    }\r\n                }\r\n\r\n                if (playAction == null)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                try\r\n                {\r\n                    scriptRuntimes.TryAdd(game.Id, new PowerShellRuntime($\"{game.Name} {game.Id} runtime\"));\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    // This should really only happen on Windows 7 without PS 5.1 installed, which is very small percentage of users.\r\n                    // It should not prevent game startup.\r\n                    logger.Error(e, \"Failed to create PowerShell runtime.\");\r\n                    if (!showedPowerShellError)\r\n                    {\r\n                        Dialogs.ShowErrorMessage(resources.GetString(LOC.PowerShellCreationError) + \"\\n\\n\" + e.Message, \"\");\r\n                        showedPowerShellError = true;\r\n                    }\r\n\r\n                    scriptRuntimes.TryAdd(game.Id, new DummyPowerShellRuntime());\r\n                }\r\n\r\n                if (playAction is AutomaticPlayController)\r\n                {\r\n                    logger.Debug(\"Using automatic plugin controller to start a game.\");\r\n                    controller = new GenericPlayController(Database, game, scriptRuntimes[game.Id], Application.PlayniteApiGlobal);\r\n                }\r\n                else if (playAction is PlayController plugAction)\r\n                {\r\n                    logger.Debug(\"Using plugin to start a game.\");\r\n                    controller = plugAction;\r\n                }\r\n                else if (playAction is EmulationPlayAction)\r\n                {\r\n                    logger.Debug(\"Using generic controller to start emulated game.\");\r\n                    controller = new GenericPlayController(Database, game, scriptRuntimes[game.Id], Application.PlayniteApiGlobal);\r\n                }\r\n                else if (playAction is GameAction gameAction)\r\n                {\r\n                    logger.Debug(\"Using generic controller start a game.\");\r\n                    controller = new GenericPlayController(Database, game, scriptRuntimes[game.Id], Application.PlayniteApiGlobal);\r\n                }\r\n                else\r\n                {\r\n                    logger.Error($\"Uknown controller found to start a game: {controller.GetType()}\");\r\n                }\r\n\r\n                foreach (var item in gameActions.Item1)\r\n                {\r\n                    if (item != controller)\r\n                    {\r\n                        item.Dispose();\r\n                    }\r\n                }\r\n\r\n                if (controller == null)\r\n                {\r\n                    scriptRuntimes.TryRemove(game.Id, out _);\r\n                    Dialogs.ShowErrorMessage(LOC.ErrorStartupNoController, LOC.StartupError);\r\n                    return;\r\n                }\r\n\r\n                void cancelStartup(string message)\r\n                {\r\n                    logger.Warn(message);\r\n                    controllers.InvokeOnGameStartupCancelled(this, game.GetCopy());\r\n                    controllers.RemovePlayController(game.Id);\r\n                    UpdateGameState(game.Id, null, null, null, null, false);\r\n                }\r\n\r\n                controllers.RemovePlayController(game.Id);\r\n                controllers.AddController(controller);\r\n                RunningGames.Add(game.Id, new RunningGame(game.Id, launchedFromUI));\r\n                UpdateGameState(game.Id, null, null, null, null, true);\r\n\r\n                var startingArgs = new SDK.Events.OnGameStartingEventArgs\r\n                {\r\n                    Game = game.GetCopy(),\r\n                    SourceAction = (playAction as GameAction)?.GetClone(),\r\n                    SelectedRomFile = (playAction as EmulationPlayAction)?.SelectedRomPath\r\n                };\r\n\r\n                controllers.InvokeOnStarting(this, startingArgs);\r\n                if (startingArgs.CancelStartup)\r\n                {\r\n                    cancelStartup(\"Game startup cancelled by an extension.\");\r\n                    return;\r\n                }\r\n\r\n                if (!game.IsCustomGame && shutdownJobs.TryGetValue(game.PluginId, out var existingJob))\r\n                {\r\n                    logger.Debug($\"Starting game with existing client shutdown job, canceling job {game.PluginId}.\");\r\n                    existingJob.CancelToken.Cancel();\r\n                    shutdownJobs.TryRemove(game.PluginId, out var _);\r\n                }\r\n\r\n                var scriptVars = new Dictionary<string, object>\r\n                {\r\n                    {  \"StartingArgs\", startingArgs },\r\n                    {  \"SourceAction\", startingArgs.SourceAction },\r\n                    {  \"SelectedRomFile\", startingArgs.SelectedRomFile }\r\n                };\r\n\r\n                //Get the current system HDR status only if this is the first game launched with HDR controlled by Playnite\r\n                if (!controllers.PlayControllers.Any(c => c.Game.Id != game.Id && c.Game.EnableSystemHdr))\r\n                {\r\n                    wasHdrEnabled = HdrUtilities.IsHdrEnabled();\r\n                }\r\n\r\n                if (game.EnableSystemHdr)\r\n                {\r\n                    HdrUtilities.SetHdrEnabled(true);\r\n                }\r\n\r\n                if (!ExecuteScriptAction(scriptRuntimes[game.Id], AppSettings.PreScript, game, game.UseGlobalPreScript, true, GameScriptType.Starting, scriptVars))\r\n                {\r\n                    cancelStartup(\"Game startup cancelled because global game script failed.\");\r\n                    return;\r\n                }\r\n\r\n                if (startingArgs.CancelStartup)\r\n                {\r\n                    cancelStartup(\"Game startup cancelled by global game script.\");\r\n                    return;\r\n                }\r\n\r\n                if (!ExecuteScriptAction(scriptRuntimes[game.Id], game.PreScript, game, true, false, GameScriptType.Starting, scriptVars))\r\n                {\r\n                    cancelStartup(\"Game startup cancelled because game script failed.\");\r\n                    return;\r\n                }\r\n\r\n                if (startingArgs.CancelStartup)\r\n                {\r\n                    cancelStartup(\"Game startup cancelled by game script.\");\r\n                    return;\r\n                }\r\n\r\n                if (controller is GenericPlayController genCtrl)\r\n                {\r\n                    if (playAction is EmulationPlayAction emuAct)\r\n                    {\r\n                        genCtrl.StartEmulator(emuAct, true, startingArgs);\r\n                    }\r\n                    else if (playAction is AutomaticPlayController autoAction)\r\n                    {\r\n                        genCtrl.Start(autoAction);\r\n                    }\r\n                    else if (playAction is GameAction act)\r\n                    {\r\n                        genCtrl.Start(act, true, startingArgs);\r\n                    }\r\n                    else\r\n                    {\r\n                        throw new NotSupportedException(\"Uknown play action type.\");\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    controller.Play(new PlayActionArgs());\r\n                }\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Cannot start game: \");\r\n                Dialogs.ShowMessage(\r\n                    resources.GetString(LOC.GameStartError).Format(exc.Message), LOC.GameError,\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n                if (controller != null)\r\n                {\r\n                    controllers.RemoveController(controller);\r\n                    UpdateGameState(game.Id, null, null, null, null, false);\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            UpdateJumpList();\r\n        }\r\n\r\n        public void ActivateAction(Game game, GameAction action)\r\n        {\r\n            try\r\n            {\r\n                switch (action.Type)\r\n                {\r\n                    case GameActionType.URL:\r\n                        ProcessStarter.StartUrl(action.Path);\r\n                        break;\r\n                    case GameActionType.File:\r\n                    case GameActionType.Emulator:\r\n                    case GameActionType.Script:\r\n                        using (var scriptRuntime = new PowerShellRuntime(\"Custom action runtime\"))\r\n                        using (var controller = new GenericPlayController(Database, game, scriptRuntime, Application.PlayniteApiGlobal))\r\n                        {\r\n                            if (action.Type == GameActionType.Emulator)\r\n                            {\r\n                                var emulator = Database.Emulators[action.EmulatorId];\r\n                                if (emulator == null)\r\n                                {\r\n                                    throw new Exception($\"Emulator not found.\");\r\n                                }\r\n\r\n                                var prof = emulator.AllProfiles.FirstOrDefault(a => a.Id == action.EmulatorProfileId);\r\n                                var newAction = action.GetClone<GameAction, EmulationPlayAction>();\r\n                                newAction.SelectedEmulatorProfile = prof ?? throw new Exception(\"Specified emulator config does't exists.\");\r\n                                newAction.SelectedRomPath = game.Roms.HasItems() ? game.Roms[0].Path : string.Empty;\r\n                                controller.StartEmulator(newAction, false, new SDK.Events.OnGameStartingEventArgs\r\n                                {\r\n                                    Game = game,\r\n                                    SelectedRomFile = newAction.SelectedRomPath,\r\n                                    SourceAction = action\r\n                                });\r\n                            }\r\n                            else\r\n                            {\r\n                                controller.Start(action, false,  new SDK.Events.OnGameStartingEventArgs\r\n                                {\r\n                                    Game = game,\r\n                                    SourceAction = action\r\n                                });\r\n                            }\r\n                        }\r\n                        break;\r\n                    default:\r\n                        throw new NotImplementedException();\r\n                }\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Cannot activate action: \");\r\n                Dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCGameStartActionError\"), exc.Message),\r\n                    resources.GetString(\"LOCGameError\"),\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n            }\r\n        }\r\n\r\n        public void OpenGameLocation(Game game)\r\n        {\r\n            if (string.IsNullOrEmpty(game.InstallDirectory))\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                var installDirectory = game.InstallDirectory;\r\n                if (FileSystem.DirectoryExistsOnAnyDrive(installDirectory, out var newPath) &&\r\n                    !string.Equals(newPath, installDirectory, StringComparison.OrdinalIgnoreCase))\r\n                {\r\n                    logger.Warn(\"Replaced missing game dir with new one:\\n{0}\\n{1}\".Format(installDirectory, newPath));\r\n                    installDirectory = newPath;\r\n                }\r\n\r\n                string emuDir = null;\r\n                if (game.InstallDirectory.Contains(ExpandableVariables.EmulatorDirectory, StringComparison.OrdinalIgnoreCase))\r\n                {\r\n                    var action = game.GameActions.FirstOrDefault(a => a.IsPlayAction && a.Type == GameActionType.Emulator && a.EmulatorId != Guid.Empty);\r\n                    if (action != null)\r\n                    {\r\n                        var emu = Database.Emulators[action.EmulatorId];\r\n                        if (emu != null)\r\n                        {\r\n                            emuDir = Paths.FixSeparators(emu.InstallDir.Replace(ExpandableVariables.PlayniteDirectory, PlaynitePaths.ProgramPath, StringComparison.OrdinalIgnoreCase));\r\n                        }\r\n                    }\r\n                }\r\n\r\n                installDirectory = game.ExpandVariables(installDirectory, true, emuDir);\r\n                Commands.GlobalCommands.NavigateDirectoryCommand.Execute(installDirectory);\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Cannot open game location: \");\r\n                Dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCGameOpenLocationError\"), exc.Message),\r\n                    resources.GetString(\"LOCGameError\"),\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n            }\r\n        }\r\n\r\n        public void UpdateGameSize(Game game, bool onlyIfDataMissing, bool updateGameOnLibrary, bool checkLastScanDate)\r\n        {\r\n            if (!game.IsInstalled)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (game.InstallSize != null && onlyIfDataMissing)\r\n            {\r\n                return;\r\n            }\r\n\r\n            ulong? scanSize;\r\n            try\r\n            {\r\n                scanSize = CalculateGameSize(game, checkLastScanDate);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, $\"Failed to get InstallSize from game {game.Name} with install dir {game.InstallDirectory}\");\r\n                throw;\r\n            }\r\n\r\n            if (scanSize == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            game.LastSizeScanDate = DateTime.Now;\r\n            if (game.InstallSize != scanSize)\r\n            {\r\n                game.InstallSize = scanSize;\r\n            }\r\n\r\n            if (updateGameOnLibrary)\r\n            {\r\n                Database.Games.Update(game);\r\n            }\r\n        }\r\n\r\n        public ulong? CalculateGameSize(Game game, bool checkLastScanDate)\r\n        {\r\n            long size = 0;\r\n            if (game.Roms.HasItems())\r\n            {\r\n                var expandedGame = GetExpandedGameForRomsSizeScan(game);\r\n                var romsFilesPaths = new List<string>();\r\n                foreach (var rom in expandedGame.Roms)\r\n                {\r\n                    if (rom.Path.IsNullOrWhiteSpace() || !FileSystem.FileExists(rom.Path))\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    if (rom.Path.EndsWith(\".cue\", StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        AddPlaylistRomFilesPathsToList(rom, romsFilesPaths, CueSheet.GetFileEntries(rom.Path).Select(a => a.Path));\r\n                    }\r\n                    else if (rom.Path.EndsWith(\".m3u\", StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        AddPlaylistRomFilesPathsToList(rom, romsFilesPaths, M3U.GetEntries(rom.Path).Select(a => a.Path));\r\n                    }\r\n                    else if (rom.Path.EndsWith(\".gdi\", StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        AddPlaylistRomFilesPathsToList(rom, romsFilesPaths, GdiFile.GetEntries(rom.Path).Select(a => a.Path));\r\n                    }\r\n                    else\r\n                    {\r\n                        romsFilesPaths.Add(rom.Path);\r\n                    }\r\n                }\r\n\r\n                if (!romsFilesPaths.HasItems())\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                if (checkLastScanDate)\r\n                {\r\n                    var addedAfterLastCheck = expandedGame.LastSizeScanDate == null || expandedGame.Added != null && expandedGame.Added > expandedGame.LastSizeScanDate;\r\n                    if (!addedAfterLastCheck && expandedGame.LastSizeScanDate != null\r\n                        && !romsFilesPaths.Any(x => FileSystem.FileGetLastWriteTime(x) > expandedGame.LastSizeScanDate))\r\n                    {\r\n                        return null;\r\n                    }\r\n                }\r\n\r\n                foreach (var romFilePath in romsFilesPaths)\r\n                {\r\n                    if (AppSettings.InstallSizeScanUseSizeOnDisk)\r\n                    {\r\n                        size += FileSystem.GetFileSizeOnDisk(romFilePath);\r\n                    }\r\n                    else\r\n                    {\r\n                        size += FileSystem.GetFileSize(romFilePath);\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (game.InstallDirectory.IsNullOrEmpty())\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                var expandedGame = game.ExpandGame();\r\n                if (!FileSystem.DirectoryExists(expandedGame.InstallDirectory))\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                if (checkLastScanDate)\r\n                {\r\n                    var addedAfterLastCheck = expandedGame.LastSizeScanDate == null || expandedGame.Added != null && expandedGame.Added > expandedGame.LastSizeScanDate;\r\n                    if (!addedAfterLastCheck && expandedGame.LastSizeScanDate != null && FileSystem.DirectoryGetLastWriteTime(expandedGame.InstallDirectory) < expandedGame.LastSizeScanDate)\r\n                    {\r\n                        return null;\r\n                    }\r\n                }\r\n\r\n                size = FileSystem.GetDirectorySize(expandedGame.InstallDirectory, AppSettings.InstallSizeScanUseSizeOnDisk);\r\n            }\r\n\r\n            return (ulong)size;\r\n        }\r\n\r\n        private void AddPlaylistRomFilesPathsToList(GameRom rom, List<string> pathsList, IEnumerable<string> playlistChildren)\r\n        {\r\n            if (!playlistChildren.HasItems())\r\n            {\r\n                return;\r\n            }\r\n\r\n            var rootDir = Path.GetDirectoryName(rom.Path);\r\n            pathsList.AddRange\r\n            (\r\n                playlistChildren\r\n                .Select(a => Path.Combine(rootDir, a))\r\n                .Where(x => FileSystem.FileExists(x))\r\n             );\r\n        }\r\n\r\n        public Game GetExpandedGameForRomsSizeScan(Game game)\r\n        {\r\n            if (game.GameActions == null)\r\n            {\r\n                return game.ExpandGame();\r\n            }\r\n\r\n            var emulatorAction = game.GameActions.FirstOrDefault(x => x.Type == GameActionType.Emulator);\r\n            if (emulatorAction == null)\r\n            {\r\n                return game.ExpandGame();\r\n            }\r\n\r\n            var emulator = Database.Emulators[emulatorAction.EmulatorId];\r\n            if (emulator != null)\r\n            {\r\n                return game.ExpandGame(false, emulator.InstallDir);\r\n            }\r\n\r\n            return game.ExpandGame();\r\n        }\r\n\r\n        public void UpdateGameSizeWithDialog(Game game, bool onlyIfDataMissing, bool updateGameOnLibrary)\r\n        {\r\n            var textTitle = string.Format(ResourceProvider.GetString(\"LOCCalculatingInstallSizeOfGameMessage\"), game.Name);\r\n            Dialogs.ActivateGlobalProgress((a) =>\r\n            {\r\n                try\r\n                {\r\n                    UpdateGameSize(game, onlyIfDataMissing, updateGameOnLibrary, false);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    Dialogs.ShowMessage(\r\n                        string.Format(resources.GetString(\"LOCCalculateGameSizeError\"), e.Message),\r\n                        resources.GetString(\"LOCCalculateGameSizeErrorCaption\"),\r\n                        MessageBoxButton.OK, MessageBoxImage.Error);\r\n                }\r\n            }, new GlobalProgressOptions(textTitle, false) { IsIndeterminate = true });\r\n        }\r\n\r\n        public void UpdateGamesSizeWithDialog(List<Game> games, bool onlyIfDataMissing)\r\n        {\r\n            var textTitle = ResourceProvider.GetString(\"LOCCalculatingInstallSizeMessage\");\r\n            var errorStrings = new List<string>();\r\n            var errorsCount = 0;\r\n            Dialogs.ActivateGlobalProgress((a) =>\r\n            {\r\n                a.ProgressMaxValue = games.Count();\r\n                using (Database.BufferedUpdate())\r\n                {\r\n                    foreach (var game in games)\r\n                    {\r\n                        if (a.CancelToken.IsCancellationRequested)\r\n                        {\r\n                            break;\r\n                        }\r\n\r\n                        a.CurrentProgressValue++;\r\n                        a.Text = $\"{textTitle}\\n\\n{game.Name}\\n{a.CurrentProgressValue}/{a.ProgressMaxValue}\";\r\n\r\n                        try\r\n                        {\r\n                            UpdateGameSize(game, onlyIfDataMissing, true, false);\r\n                        }\r\n                        catch (Exception e)\r\n                        {\r\n                            errorsCount++;\r\n                            if (errorStrings.Count < 10)\r\n                            {\r\n                                errorStrings.Add($\"{game.Name}: {e.Message}\");\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }, new GlobalProgressOptions(textTitle, true) { IsIndeterminate = false });\r\n\r\n            if (errorsCount > 0)\r\n            {\r\n                var errorMessage = ResourceProvider.GetString(\"LOCCalculateGamesSizeErrorMessage\").Format(errorsCount)\r\n                    + $\"\\n\\n\" + string.Join(\"\\n\", errorStrings);\r\n                if (errorsCount > 10)\r\n                {\r\n                    errorMessage += \"\\n...\";\r\n                }\r\n\r\n                Dialogs.ShowMessage(\r\n                    errorMessage,\r\n                    resources.GetString(\"LOCCalculateGameSizeErrorCaption\"),\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n            }\r\n        }\r\n\r\n        public void SetHideGame(Game game, bool state)\r\n        {\r\n            game.Hidden = state;\r\n            Database.Games.Update(game);\r\n        }\r\n\r\n        public void SetHideGames(List<Game> games, bool state)\r\n        {\r\n            using (Database.BufferedUpdate())\r\n            {\r\n                foreach (var game in games)\r\n                {\r\n                    SetHideGame(game, state);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void SetHdrSupport(Game game, bool state)\r\n        {\r\n            game.EnableSystemHdr = state;\r\n            Database.Games.Update(game);\r\n        }\r\n\r\n        public void SetHdrSupport(List<Game> games, bool state)\r\n        {\r\n            using (Database.BufferedUpdate())\r\n            {\r\n                foreach (var game in games)\r\n                {\r\n                    SetHdrSupport(game, state);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ToggleHideGame(Game game)\r\n        {\r\n            game.Hidden = !game.Hidden;\r\n            Database.Games.Update(game);\r\n        }\r\n\r\n        public void ToggleHideGames(List<Game> games)\r\n        {\r\n            using (Database.BufferedUpdate())\r\n            {\r\n                foreach (var game in games)\r\n                {\r\n                    ToggleHideGame(game);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void SetFavoriteGame(Game game, bool state)\r\n        {\r\n            game.Favorite = state;\r\n            Database.Games.Update(game);\r\n        }\r\n\r\n        public void SetFavoriteGames(List<Game> games, bool state)\r\n        {\r\n            using (Database.BufferedUpdate())\r\n            {\r\n                foreach (var game in games)\r\n                {\r\n                    SetFavoriteGame(game, state);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ToggleHdrGame(Game game)\r\n        {\r\n            game.EnableSystemHdr = !game.EnableSystemHdr;\r\n            Database.Games.Update(game);\r\n        }\r\n\r\n        public void ToggleFavoriteGame(Game game)\r\n        {\r\n            game.Favorite = !game.Favorite;\r\n            Database.Games.Update(game);\r\n        }\r\n\r\n        public void ToggleFavoriteGame(List<Game> games)\r\n        {\r\n            using (Database.BufferedUpdate())\r\n            {\r\n                foreach (var game in games)\r\n                {\r\n                    ToggleFavoriteGame(game);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void SetCompletionStatus(Game game, CompletionStatus status)\r\n        {\r\n            if (game.CompletionStatusId != status.Id)\r\n            {\r\n                game.CompletionStatusId = status.Id;\r\n                Database.Games.Update(game);\r\n            }\r\n        }\r\n\r\n        public void SetCompletionStatus(List<Game> games, CompletionStatus status)\r\n        {\r\n            using (Database.BufferedUpdate())\r\n            {\r\n                foreach (var game in games)\r\n                {\r\n                    SetCompletionStatus(game, status);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void RemoveGame(Game game)\r\n        {\r\n            if (game.IsInstalling || game.IsRunning || game.IsLaunching || game.IsUninstalling)\r\n            {\r\n                Dialogs.ShowMessage(\r\n                    \"LOCGameRemoveRunningError\",\r\n                    \"LOCGameError\",\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n                return;\r\n            }\r\n\r\n            var addToExclusionList = false;\r\n            if (game.IsCustomGame)\r\n            {\r\n                if (Dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCGameRemoveAskMessage\"), game.Name),\r\n                    \"LOCGameRemoveAskTitle\",\r\n                    MessageBoxButton.YesNo,\r\n                    MessageBoxImage.Question) != MessageBoxResult.Yes)\r\n                {\r\n                    return;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var options = new List<MessageBoxOption>\r\n                {\r\n                    new MessageBoxOption(\"LOCRemoveAskAddToExlusionListYesResponse\"),\r\n                    new MessageBoxOption(\"LOCYesLabel\", true),\r\n                    new MessageBoxOption(\"LOCNoLabel\", false, true)\r\n                };\r\n                var result = Dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCGameRemoveAskMessageIgnoreOption\"), game.Name),\r\n                    \"LOCGameRemoveAskTitle\",\r\n                    MessageBoxImage.Question,\r\n                    options);\r\n                if (result == options[0])\r\n                {\r\n                    addToExclusionList = true;\r\n                }\r\n                else if (result == null || result == options[2])\r\n                {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (Database.Games[game.Id] == null)\r\n            {\r\n                logger.Warn($\"Failed to remove game {game.Name} {game.Id}, game doesn't exists anymore.\");\r\n            }\r\n            else\r\n            {\r\n                Database.Games.Remove(game);\r\n                if (addToExclusionList)\r\n                {\r\n                    var exclusion = new ImportExclusionItem(game.GameId, game.Name, game.PluginId, Extensions.GetLibraryPlugin(game.PluginId)?.Name);\r\n                    if (Database.ImportExclusions[exclusion.Id] == null)\r\n                    {\r\n                        Database.ImportExclusions.Add(exclusion);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public void RemoveGames(List<Game> games)\r\n        {\r\n            if (!games.HasItems())\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (games.Exists(a => a.IsInstalling || a.IsRunning || a.IsLaunching || a.IsUninstalling))\r\n            {\r\n                Dialogs.ShowMessage(\r\n                    \"LOCGameRemoveRunningError\",\r\n                    \"LOCGameError\",\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n                return;\r\n            }\r\n\r\n            var addToExclusionList = false;\r\n            if (games.All(a => a.IsCustomGame))\r\n            {\r\n                if (Dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCGamesRemoveAskMessage\"), games.Count()),\r\n                    \"LOCGameRemoveAskTitle\",\r\n                    MessageBoxButton.YesNo,\r\n                    MessageBoxImage.Question) != MessageBoxResult.Yes)\r\n                {\r\n                    return;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var options = new List<MessageBoxOption>\r\n                {\r\n                    new MessageBoxOption(\"LOCRemoveAskAddToExlusionListYesResponse\"),\r\n                    new MessageBoxOption(\"LOCYesLabel\", true),\r\n                    new MessageBoxOption(\"LOCNoLabel\", false, true)\r\n                };\r\n                var result = Dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCGamesRemoveAskMessageIgnoreOption\"), games.Count()),\r\n                    \"LOCGameRemoveAskTitle\",\r\n                    MessageBoxImage.Question,\r\n                    options);\r\n                if (result == options[0])\r\n                {\r\n                    addToExclusionList = true;\r\n                }\r\n                else if (result == options[2])\r\n                {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            foreach (var game in games.ToList())\r\n            {\r\n                if (Database.Games[game.Id] == null)\r\n                {\r\n                    logger.Warn($\"Failed to remove game {game.Name} {game.Id}, game doesn't exists anymore.\");\r\n                    games.Remove(game);\r\n                }\r\n\r\n                if (addToExclusionList && !game.IsCustomGame)\r\n                {\r\n                    var exclusion = new ImportExclusionItem(game.GameId, game.Name, game.PluginId, Extensions.GetLibraryPlugin(game.PluginId)?.Name);\r\n                    if (Database.ImportExclusions[exclusion.Id] == null)\r\n                    {\r\n                        Database.ImportExclusions.Add(exclusion);\r\n                    }\r\n                }\r\n            }\r\n\r\n            Database.Games.Remove(games);\r\n        }\r\n\r\n        public void CreateDesktopShortcut(List<Game> games)\r\n        {\r\n            foreach (var game in games)\r\n            {\r\n                CreateDesktopShortcut(game);\r\n            }\r\n        }\r\n\r\n        public void CreateDesktopShortcut(Game game)\r\n        {\r\n            try\r\n            {\r\n                var path = Environment.ExpandEnvironmentVariables(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), Paths.GetSafePathName(game.Name) + \".url\"));\r\n                string icon = string.Empty;\r\n\r\n                if (!game.Icon.IsNullOrEmpty())\r\n                {\r\n                    icon = Database.GetFullFilePath(game.Icon);\r\n                }\r\n                else\r\n                {\r\n                    icon = GamesCollectionViewEntry.GetDefaultIconFile(game, AppSettings, Database, Extensions.GetLibraryPlugin(game.PluginId));\r\n                    if (!File.Exists(icon))\r\n                    {\r\n                        icon = string.Empty;\r\n                    }\r\n                }\r\n\r\n                if (File.Exists(icon))\r\n                {\r\n                    if (Path.GetExtension(icon) != \".ico\")\r\n                    {\r\n                        FileSystem.CreateDirectory(PlaynitePaths.IconsCachePath);\r\n                        var targetIconPath = Path.Combine(PlaynitePaths.IconsCachePath, game.Id + \".ico\");\r\n                        BitmapExtensions.ConvertToIcon(icon, targetIconPath);\r\n                        if (File.Exists(targetIconPath))\r\n                        {\r\n                            icon = targetIconPath;\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    icon = PlaynitePaths.DesktopExecutablePath;\r\n                }\r\n\r\n                var args = new CmdLineOptions() { Start = game.Id.ToString() }.ToString();\r\n                Programs.CreateUrlShortcut($\"playnite://playnite/start/{game.Id}\", icon, path);\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to create shortcut: \");\r\n                Dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCGameShortcutError\"), exc.Message),\r\n                    resources.GetString(\"LOCGameError\"),\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n            }\r\n        }\r\n\r\n        public void OpenManual(Game game)\r\n        {\r\n            if (game.Manual.IsNullOrEmpty())\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                var manualPath = game.ExpandVariables(game.Manual, fixSeparators: true);\r\n                if (!manualPath.IsUri() && !File.Exists(manualPath))\r\n                {\r\n                    manualPath = Path.Combine(Database.GetFileStoragePath(game.Id), manualPath);\r\n                }\r\n\r\n                if (manualPath.IsUri())\r\n                {\r\n                    ProcessStarter.StartUrl(manualPath);\r\n                }\r\n                else\r\n                {\r\n                    ProcessStarter.StartProcess(manualPath);\r\n                }\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to open manual.\");\r\n                Dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCManualOpenError\"), exc.Message),\r\n                    resources.GetString(\"LOCGameError\"),\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n            }\r\n        }\r\n\r\n        public void CreateDesktopShortcuts(List<Game> games)\r\n        {\r\n            foreach (var game in games)\r\n            {\r\n                CreateDesktopShortcut(game);\r\n            }\r\n        }\r\n\r\n        public void InstallGame(Game game)\r\n        {\r\n            logger.Info($\"Installing {game.GetIdentifierInfo()}\");\r\n            InstallController controller = null;\r\n            try\r\n            {\r\n                var installControllers = GetInstallActions(game);\r\n                if (!installControllers.HasItems())\r\n                {\r\n                    Dialogs.ShowErrorMessage(LOC.ErrorNoInstallAction, LOC.GameError);\r\n                    return;\r\n                }\r\n\r\n                if (installControllers.Count > 1)\r\n                {\r\n                    controller = actionSelector.SelectInstallAction(installControllers);\r\n                }\r\n                else\r\n                {\r\n                    controller = installControllers[0];\r\n                }\r\n\r\n                if (controller == null)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                controllers.RemoveInstallController(game.Id);\r\n                controllers.AddController(controller);\r\n                UpdateGameState(game.Id, null, null, true, null, null);\r\n                controller.Install(new InstallActionArgs());\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Cannot install game: \");\r\n                Dialogs.ShowMessage(\r\n                    resources.GetString(LOC.GameInstallError).Format(exc.Message), LOC.GameError,\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n                if (controller != null)\r\n                {\r\n                    controllers.RemoveController(controller);\r\n                    UpdateGameState(game.Id, null, null, false, null, null);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void UnInstallGame(Game game)\r\n        {\r\n            if (game.IsRunning || game.IsLaunching)\r\n            {\r\n                Dialogs.ShowMessage(LOC.GameUninstallRunningError, LOC.GameError,\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n                return;\r\n            }\r\n\r\n            logger.Info($\"Uninstalling {game.GetIdentifierInfo()}\");\r\n            UninstallController controller = null;\r\n\r\n            try\r\n            {\r\n                var uninstallControllers = GetUninstallActions(game);\r\n                if (!uninstallControllers.HasItems())\r\n                {\r\n                    Dialogs.ShowErrorMessage(LOC.ErrorNoInstallAction, LOC.GameError);\r\n                    return;\r\n                }\r\n\r\n                if (uninstallControllers.Count > 1)\r\n                {\r\n                    controller = actionSelector.SelectUninstallAction(uninstallControllers);\r\n                }\r\n                else\r\n                {\r\n                    controller = uninstallControllers[0];\r\n                }\r\n\r\n                if (controller == null)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                controllers.RemoveInstallController(game.Id);\r\n                controllers.AddController(controller);\r\n                UpdateGameState(game.Id, null, null, null, true, null);\r\n                controller.Uninstall(new UninstallActionArgs());\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Cannot un-install game: \");\r\n                Dialogs.ShowMessage(\r\n                    resources.GetString(LOC.GameUninstallError).Format(exc.Message), LOC.GameError,\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n                if (controller != null)\r\n                {\r\n                    controllers.RemoveController(controller);\r\n                    UpdateGameState(game.Id, null, null, null, false, null);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void UpdateJumpList()\r\n        {\r\n            try\r\n            {\r\n                var jumpList = new JumpList();\r\n                jumpList.ShowFrequentCategory = false;\r\n                jumpList.ShowRecentCategory = false;\r\n\r\n                if (AppSettings.QuickLaunchItems > 0)\r\n                {\r\n                    var catString = resources.GetString(LOC.QuickFilterRecentlyPlayed);\r\n                    foreach (var lastGame in QuickLaunchItems)\r\n                    {\r\n                        var args = new CmdLineOptions() { Start = lastGame.Id.ToString() }.ToString();\r\n                        JumpTask task = new JumpTask\r\n                        {\r\n                            Title = lastGame.Name,\r\n                            Arguments = args,\r\n                            Description = string.Empty,\r\n                            CustomCategory = catString,\r\n                            ApplicationPath = PlaynitePaths.DesktopExecutablePath\r\n                        };\r\n\r\n                        if (lastGame.Icon?.EndsWith(\".ico\", StringComparison.OrdinalIgnoreCase) == true)\r\n                        {\r\n                            task.IconResourcePath = Database.GetFullFilePath(lastGame.Icon);\r\n                        }\r\n                        else\r\n                        {\r\n                            task.IconResourcePath = lastGame.GetRawExecutablePath();\r\n                        }\r\n\r\n                        jumpList.JumpItems.Add(task);\r\n                    }\r\n\r\n                    JumpTask fullscreen = new JumpTask\r\n                    {\r\n                        Title = resources.GetString(LOC.MenuOpenFullscreen),\r\n                        ApplicationPath = PlaynitePaths.FullscreenExecutablePath\r\n                    };\r\n\r\n                    jumpList.JumpItems.Add(fullscreen);\r\n\r\n                    JumpList.SetJumpList(System.Windows.Application.Current, jumpList);\r\n                }\r\n                else\r\n                {\r\n                    JumpList.SetJumpList(System.Windows.Application.Current, new JumpList());\r\n                }\r\n\r\n                jumpList.Apply();\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to set jump list data.\");\r\n            }\r\n        }\r\n\r\n        public void CancelGameMonitoring(Game game)\r\n        {\r\n            var wasRunningOrLaunching = game.IsRunning || game.IsLaunching;\r\n            controllers.RemoveInstallController(game.Id);\r\n            controllers.RemoveUninstallController(game.Id);\r\n            controllers.RemovePlayController(game.Id);\r\n            var dbGame = Database.Games.Get(game.Id);\r\n            dbGame.IsRunning = false;\r\n            dbGame.IsLaunching = false;\r\n            dbGame.IsInstalling = false;\r\n            dbGame.IsUninstalling = false;\r\n            ulong ellapsedTime = 0;\r\n            if (gameStartups.TryRemove(game.Id, out var startupTime))\r\n            {\r\n                // This shouldn't be a problem, but there was one crash report with startup type being more recent\r\n                if (startupTime < DateTime.Now)\r\n                {\r\n                    ellapsedTime = Convert.ToUInt64((DateTime.Now - startupTime).TotalSeconds);\r\n                    dbGame.Playtime += ellapsedTime;\r\n                }\r\n            }\r\n\r\n            if (scriptRuntimes.TryRemove(game.Id, out var runtime))\r\n            {\r\n                runtime.Dispose();\r\n            }\r\n\r\n            Database.Games.Update(dbGame);\r\n            if (wasRunningOrLaunching)\r\n            {\r\n                RunningGames.Remove(game.Id);\r\n                Extensions.InvokeOnGameStopped(game, ellapsedTime, true);\r\n            }\r\n\r\n            if (AppSettings.DiscordPresenceEnabled)\r\n            {\r\n                Application.Discord?.ClearPresence();\r\n            }\r\n        }\r\n\r\n        private void UpdateGameState(Guid id, bool? installed, bool? running, bool? installing, bool? uninstalling, bool? launching)\r\n        {\r\n            if (running == true || launching == true)\r\n            {\r\n                RunningGames.AddMissing(id, new RunningGame(id, true));\r\n            }\r\n            else if (running == false || launching == false)\r\n            {\r\n                RunningGames.Remove(id);\r\n            }\r\n\r\n            var game = Database.Games.Get(id);\r\n            if (installed != null)\r\n            {\r\n                game.IsInstalled = installed.Value;\r\n            }\r\n\r\n            if (running != null)\r\n            {\r\n                game.IsRunning = running.Value;\r\n            }\r\n\r\n            if (installing != null)\r\n            {\r\n                game.IsInstalling = installing.Value;\r\n            }\r\n\r\n            if (uninstalling != null)\r\n            {\r\n                game.IsUninstalling = uninstalling.Value;\r\n            }\r\n\r\n            if (launching != null)\r\n            {\r\n                game.IsLaunching = launching.Value;\r\n            }\r\n\r\n            if (running == true)\r\n            {\r\n                game.LastActivity = DateTime.Now;\r\n                game.PlayCount += 1;\r\n                var comSettings = Database.GetCompletionStatusSettings();\r\n                if (comSettings.PlayedStatus == Constants.MaxGuidVal)\r\n                {\r\n                    // Do nothing option\r\n                }\r\n                else if (game.CompletionStatusId == Guid.Empty || game.CompletionStatusId == comSettings.DefaultStatus)\r\n                {\r\n                    game.CompletionStatusId = comSettings.PlayedStatus;\r\n                }\r\n            }\r\n\r\n            Database.Games.Update(game);\r\n        }\r\n\r\n        private void Controllers_Started(object sender, GameStartedEventArgs args)\r\n        {\r\n            var game = args.Source.Game;\r\n            logger.Info($\"Started {game.Name} game.\");\r\n            UpdateGameState(game.Id, null, true, null, null, false);\r\n            gameStartups.TryAdd(game.Id, DateTime.Now);\r\n\r\n            var scriptVars = new Dictionary<string, object>\r\n            {\r\n                { \"SourceAction\", (args.Source as GenericPlayController)?.StartingArgs?.SourceAction?.GetClone() },\r\n                { \"SelectedRomFile\", (args.Source as GenericPlayController)?.StartingArgs?.SelectedRomFile },\r\n                { \"StartedProcessId\", args.StartedProcessId }\r\n            };\r\n\r\n            ExecuteScriptAction(scriptRuntimes[game.Id], game.GameStartedScript, game, true, false, GameScriptType.Started, scriptVars);\r\n            ExecuteScriptAction(scriptRuntimes[game.Id], AppSettings.GameStartedScript, game, game.UseGlobalGameStartedScript, true, GameScriptType.Started, scriptVars);\r\n\r\n            if (Application.Mode == ApplicationMode.Desktop)\r\n            {\r\n                if (AppSettings.AfterLaunch == AfterLaunchOptions.Close)\r\n                {\r\n                    Application.Quit();\r\n                }\r\n                else if (AppSettings.AfterLaunch == AfterLaunchOptions.Minimize)\r\n                {\r\n                    Application.Minimize();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (AppSettings.AfterLaunch == AfterLaunchOptions.Close)\r\n                {\r\n                    Application.Quit();\r\n                    return;\r\n                }\r\n\r\n                AppSettings.Fullscreen.IsMusicMuted = true;\r\n                if (AppSettings.Fullscreen.MinimizeAfterGameStartup)\r\n                {\r\n                    Application.Minimize();\r\n                }\r\n\r\n                PlayniteApplication.Current.IsActive = false;\r\n            }\r\n\r\n            if (AppSettings.DiscordPresenceEnabled)\r\n            {\r\n                Application.Discord?.SetPresence(game.Name);\r\n            }\r\n        }\r\n\r\n        private void Controllers_Stopped(object sender, GameStoppedEventArgs args)\r\n        {\r\n            var game = args.Source.Game;\r\n            logger.Info($\"Game {game.Name} stopped after {args.SessionLength} seconds.\");\r\n\r\n            // I have no idea under what conditions this could happen, but there are couple crash reports with this.\r\n            if (!RunningGames.TryGetValue(game.Id, out var runningGame))\r\n            {\r\n                logger.Error($\"Got controller stopped event for a game that's not registered as running {game.Id}\");\r\n                return;\r\n            }\r\n\r\n            RunningGames.Remove(game.Id);\r\n            var dbGame = Database.Games.Get(game.Id);\r\n            dbGame.IsRunning = false;\r\n            dbGame.IsLaunching = false;\r\n            dbGame.Playtime += args.SessionLength;\r\n            Database.Games.Update(dbGame);\r\n            controllers.RemoveController(args.Source);\r\n            gameStartups.TryRemove(game.Id, out _);\r\n\r\n            var restore = false;\r\n            if (Application.Mode == ApplicationMode.Desktop && AppSettings.AfterGameClose == AfterGameCloseOptions.Restore)\r\n            {\r\n                restore = true;\r\n            }\r\n            if (Application.Mode == ApplicationMode.Desktop && AppSettings.AfterGameClose == AfterGameCloseOptions.RestoreOnlyFromUI && runningGame.LauchedFromUI)\r\n            {\r\n                restore = true;\r\n            }\r\n            else if (Application.Mode == ApplicationMode.Fullscreen)\r\n            {\r\n                restore = true;\r\n                AppSettings.Fullscreen.IsMusicMuted = false;\r\n            }\r\n\r\n            if (restore)\r\n            {\r\n                // This delay apparently fixes issues with Playnite not restoring properly after game exits.\r\n                // The window will restore, but application will not regain active state.\r\n                // This was mainly reported to happen with some emulators, like RPCS3, no idea why.\r\n                Thread.Sleep(1000);\r\n                Application.Restore();\r\n            }\r\n\r\n            if (AppSettings.DiscordPresenceEnabled)\r\n            {\r\n                Application.Discord?.ClearPresence();\r\n            }\r\n\r\n            // Reset HDR if there are no more active games with HDR controlled by Playnite\r\n            // and the game being closed has HDR controlled by Playnite\r\n            if (!controllers.PlayControllers.Any(c => c.Game.EnableSystemHdr) && game.EnableSystemHdr)\r\n            {\r\n                HdrUtilities.SetHdrEnabled(wasHdrEnabled);\r\n            }\r\n\r\n            var scriptVars = new Dictionary<string, object>();\r\n            if (args.Source is GenericPlayController genCtrl)\r\n            {\r\n                scriptVars[\"SourceAction\"] = genCtrl.StartingArgs?.SourceAction?.GetClone();\r\n                scriptVars[\"SelectedRomFile\"] = genCtrl.StartingArgs?.SelectedRomFile;\r\n            }\r\n\r\n            ExecuteScriptAction(scriptRuntimes[game.Id], game.PostScript, game, true, false, GameScriptType.Exit, scriptVars);\r\n            ExecuteScriptAction(scriptRuntimes[game.Id], AppSettings.PostScript, game, game.UseGlobalPostScript, true, GameScriptType.Exit, scriptVars);\r\n            if (scriptRuntimes.TryRemove(game.Id, out var runtime))\r\n            {\r\n                runtime.Dispose();\r\n            }\r\n\r\n            Extensions.InvokeOnGameStopped(game, args.SessionLength, false);\r\n            if (Application.Mode == ApplicationMode.Desktop && AppSettings.AfterGameClose == AfterGameCloseOptions.Exit)\r\n            {\r\n                Application.Quit();\r\n            }\r\n\r\n            if (AppSettings.ClientAutoShutdown.ShutdownClients && !game.IsCustomGame)\r\n            {\r\n                if (args.SessionLength <= AppSettings.ClientAutoShutdown.MinimalSessionTime)\r\n                {\r\n                    logger.Debug(\"Game session was too short for client to be shutdown.\");\r\n                }\r\n                else if (Database.Games.Any(x => (x.IsRunning || x.IsInstalling || x.IsUninstalling) && x.PluginId == game.PluginId))\r\n                {\r\n                    logger.Debug(\"Shutdown process canceled because another game from library was detected as having game action active.\");\r\n                }\r\n                else\r\n                {\r\n                    var plugin = Extensions.GetLibraryPlugin(game.PluginId);\r\n                    if (plugin?.Properties?.CanShutdownClient == true &&\r\n                        AppSettings.ClientAutoShutdown.ShutdownPlugins.Contains(plugin.Id))\r\n                    {\r\n                        if (shutdownJobs.TryGetValue(game.PluginId, out var existingJob))\r\n                        {\r\n                            existingJob.CancelToken.Cancel();\r\n                            shutdownJobs.TryRemove(game.PluginId, out var _);\r\n                        }\r\n\r\n                        var newJob = new ClientShutdownJob\r\n                        {\r\n                            PluginId = plugin.Id,\r\n                            CancelToken = new CancellationTokenSource()\r\n                        };\r\n\r\n                        var task = new Task(async () =>\r\n                        {\r\n                            var ct = newJob.CancelToken;\r\n                            var libPlugin = plugin;\r\n                            var timeout = AppSettings.ClientAutoShutdown.GraceTimeout;\r\n                            var curTime = 0;\r\n                            logger.Info($\"Scheduled {libPlugin.Name} to be closed after {timeout} seconds.\");\r\n\r\n                            while (curTime < timeout)\r\n                            {\r\n                                if (ct.IsCancellationRequested)\r\n                                {\r\n                                    logger.Debug($\"Client {libPlugin.Name} shutdown canceled.\");\r\n                                    return;\r\n                                }\r\n\r\n                                await Task.Delay(1000);\r\n                                curTime++;\r\n                            }\r\n\r\n                            if (curTime >= timeout)\r\n                            {\r\n                                try\r\n                                {\r\n                                    shutdownJobs.TryRemove(libPlugin.Id, out var _);\r\n                                    libPlugin.Client.Shutdown();\r\n                                }\r\n                                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                                {\r\n                                    logger.Error(e, $\"Failed to shutdown {libPlugin.Name} client.\");\r\n                                }\r\n                            }\r\n                        });\r\n\r\n                        newJob.CancelTask = task;\r\n                        shutdownJobs.TryAdd(plugin.Id, newJob);\r\n                        newJob.CancelTask.Start();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Controllers_Installed(object sender, GameInstalledEventArgs args)\r\n        {\r\n            var game = args.Source.Game;\r\n            logger.Info($\"Game {game.Name} installed.\");\r\n\r\n            var dbGame = Database.Games.Get(game.Id);\r\n            dbGame.IsInstalling = false;\r\n            dbGame.IsInstalled = true;\r\n            if (args.InstalledInfo != null)\r\n            {\r\n                dbGame.InstallDirectory = args.InstalledInfo.InstallDirectory;\r\n                if (args.InstalledInfo.Roms.HasItems())\r\n                {\r\n                    dbGame.Roms = args.InstalledInfo.Roms.ToObservable();\r\n                }\r\n            }\r\n\r\n            try\r\n            {\r\n                UpdateGameSize(dbGame, false, false, false);\r\n            }\r\n            catch\r\n            {\r\n                // Already logged\r\n            }\r\n\r\n            Database.Games.Update(dbGame);\r\n            controllers.RemoveController(args.Source);\r\n        }\r\n\r\n        private void Controllers_InstallationCancelled(object sender, GameInstallationCancelledEventArgs args)\r\n        {\r\n            var game = args.Source.Game;\r\n            logger.Info($\"Game {game.Name} installation cancelled.\");\r\n\r\n            var dbGame = Database.Games.Get(game.Id);\r\n            dbGame.IsInstalling = false;\r\n            Database.Games.Update(dbGame);\r\n            controllers.RemoveController(args.Source);\r\n        }\r\n\r\n        private void Controllers_Uninstalled(object sender, GameUninstalledEventArgs args)\r\n        {\r\n            var game = args.Source.Game;\r\n            logger.Info($\"Game {game.Name} uninstalled.\");\r\n\r\n            var dbGame = Database.Games.Get(game.Id);\r\n            dbGame.IsUninstalling = false;\r\n            dbGame.IsInstalled = false;\r\n            dbGame.InstallDirectory = string.Empty;\r\n            Database.Games.Update(dbGame);\r\n            controllers.RemoveController(args.Source);\r\n        }\r\n\r\n        public bool ExecuteScriptAction(\r\n            IPowerShellRuntime runtime,\r\n            string script,\r\n            Game game,\r\n            bool execute,\r\n            bool global,\r\n            GameScriptType type,\r\n            Dictionary<string, object> vars = null)\r\n        {\r\n            if (!execute || script.IsNullOrWhiteSpace())\r\n            {\r\n                return true;\r\n            }\r\n\r\n            try\r\n            {\r\n                if (runtime == null)\r\n                {\r\n                    throw new Exception(\"Cannot execute script, no runtime given.\");\r\n                }\r\n\r\n                if (!PowerShellRuntime.IsInstalled)\r\n                {\r\n                    throw new Exception(resources.GetString(\"LOCErrorPowerShellNotInstalled\"));\r\n                }\r\n\r\n                var scriptVars = new Dictionary<string, object>\r\n                {\r\n                    {  \"PlayniteApi\", Application.PlayniteApiGlobal },\r\n                    {  \"Game\", game.GetCopy() }\r\n                };\r\n\r\n                vars?.ForEach(a => scriptVars.AddOrUpdate(a.Key, a.Value));\r\n                var expandedScript = game.ExpandVariables(script);\r\n                var dir = game.ExpandVariables(game.InstallDirectory, true);\r\n                if (!dir.IsNullOrEmpty() && Directory.Exists(dir))\r\n                {\r\n                    runtime.Execute(expandedScript, dir, scriptVars);\r\n                }\r\n                else\r\n                {\r\n                    runtime.Execute(expandedScript, variables: scriptVars);\r\n                }\r\n\r\n                return true;\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, global ? \"Failed to execute global script.\" : \"Failed to execute game script.\");\r\n                logger.Debug(script);\r\n                var message = type.GetDescription() + Environment.NewLine + exc.Message;\r\n                if (exc is ScriptRuntimeException scriptExc)\r\n                {\r\n                    message = message + Environment.NewLine + Environment.NewLine + scriptExc.ScriptStackTrace;\r\n                }\r\n\r\n                Dialogs.ShowMessage(\r\n                    message,\r\n                    resources.GetString(global ? LOC.ErrorGlobalScriptAction : LOC.ErrorGameScriptAction),\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public Tuple<List<PlayController>, List<GameAction>> GetPlayActions(Game game)\r\n        {\r\n            var controllers = new List<PlayController>();\r\n            var actions = new List<GameAction>();\r\n            foreach (var plugin in Extensions.Plugins.Values)\r\n            {\r\n                if (!game.IncludeLibraryPluginAction && plugin.Plugin.Id == game.PluginId)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                try\r\n                {\r\n                    var ctrls = plugin.Plugin.GetPlayActions(new GetPlayActionsArgs { Game = game })?.ToList();\r\n                    if (ctrls.HasItems())\r\n                    {\r\n                        controllers.AddRange(ctrls);\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get play actions from {plugin.Description.Name}\");\r\n                    continue;\r\n                }\r\n            }\r\n\r\n            if (game.GameActions.HasItems())\r\n            {\r\n                var selectEmuAdded = false;\r\n                var multipleRoms = game.Roms?.Count > 1;\r\n                var romList = game.Roms.HasItems() ? game.Roms : new ObservableCollection<GameRom> { new GameRom() };\r\n\r\n                void addAction(string name, EmulatorProfile profile, EmulationPlayAction baseData)\r\n                {\r\n                    foreach (var rom in romList)\r\n                    {\r\n                        var newAction = baseData.GetClone();\r\n                        newAction.Name = multipleRoms ? $\"{name}: {rom.Name}\" : name;\r\n                        newAction.SelectedEmulatorProfile = profile;\r\n                        newAction.SelectedRomPath = rom.Path;\r\n                        actions.Add(newAction);\r\n                    }\r\n                }\r\n\r\n                foreach (var action in game.GameActions.Where(a => a.IsPlayAction))\r\n                {\r\n                    if (action.Type == GameActionType.Emulator)\r\n                    {\r\n                        if (action.EmulatorId == Guid.Empty)\r\n                        {\r\n                            if (selectEmuAdded)\r\n                            {\r\n                                continue;\r\n                            }\r\n\r\n                            var supportedEmus = game.GetCompatibleEmulators(Database);\r\n                            if (!supportedEmus.HasItems())\r\n                            {\r\n                                continue;\r\n                            }\r\n\r\n                            selectEmuAdded = true;\r\n                            foreach (var supEmu in supportedEmus.OrderBy(a => a.Key.Name))\r\n                            {\r\n                                var emu = supEmu.Key;\r\n                                var profiles = supEmu.Value;\r\n                                var profCount = profiles.Count;\r\n                                foreach (var profile in profiles.OrderBy(a => a.Name))\r\n                                {\r\n                                    addAction(profCount == 1 ? emu.Name : $\"{emu.Name}: {profile.Name}\", profile, new EmulationPlayAction\r\n                                    {\r\n                                        EmulatorId = emu.Id,\r\n                                        EmulatorProfileId = profile.Id\r\n                                    });\r\n                                }\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            var emu = Database.Emulators[action.EmulatorId];\r\n                            if (emu == null)\r\n                            {\r\n                                continue;\r\n                            }\r\n\r\n                            if (action.EmulatorProfileId == null)\r\n                            {\r\n                                var profiles = game.GetCompatibleProfiles(emu);\r\n                                profiles.ForEach(profile =>\r\n                                    addAction($\"{action.Name}: {profile.Name}\", profile, action.GetClone<GameAction, EmulationPlayAction>()));\r\n                            }\r\n                            else\r\n                            {\r\n                                var prof = emu.AllProfiles.FirstOrDefault(a => a.Id == action.EmulatorProfileId);\r\n                                if (prof == null)\r\n                                {\r\n                                    logger.Error($\"Specified emulator config does't exists {action.EmulatorProfileId}\");\r\n                                }\r\n                                else\r\n                                {\r\n                                    addAction(action.Name, prof, action.GetClone<GameAction, EmulationPlayAction>());\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        actions.Add(action);\r\n                    }\r\n                }\r\n            }\r\n\r\n            return new Tuple<List<PlayController>, List<GameAction>>(controllers, actions);\r\n        }\r\n\r\n        public List<InstallController> GetInstallActions(Game game)\r\n        {\r\n            var allActions = new List<InstallController>();\r\n            foreach (var plugin in Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    var actions = plugin.Plugin.GetInstallActions(new GetInstallActionsArgs { Game = game })?.ToList();\r\n                    if (actions.HasItems())\r\n                    {\r\n                        allActions.AddRange(actions);\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get install actions from {plugin.Description.Name}\");\r\n                }\r\n            }\r\n\r\n            return allActions;\r\n        }\r\n\r\n        public List<UninstallController> GetUninstallActions(Game game)\r\n        {\r\n            var allActions = new List<UninstallController>();\r\n            foreach (var plugin in Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    var actions = plugin.Plugin.GetUninstallActions(new GetUninstallActionsArgs { Game = game })?.ToList();\r\n                    if (actions.HasItems())\r\n                    {\r\n                        allActions.AddRange(actions);\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get install actions from {plugin.Description.Name}\");\r\n                }\r\n            }\r\n\r\n            return allActions;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/GlobalTaskHandler.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public static class GlobalTaskHandler\r\n    {\r\n        private static CancellationTokenSource cancelToken = new CancellationTokenSource();\r\n        public static CancellationTokenSource CancelToken\r\n        {\r\n            get => cancelToken;\r\n            set\r\n            {\r\n                cancelToken?.Dispose();\r\n                cancelToken = value;\r\n            }\r\n        }\r\n\r\n        public static Task ProgressTask;\r\n\r\n        public static bool IsActive\r\n        {\r\n            get => ProgressTask?.Status == TaskStatus.Running || ProgressTask?.Status == TaskStatus.WaitingForActivation;\r\n        }\r\n\r\n        public static void CancelAndWait()\r\n        {\r\n            if (IsActive)\r\n            {\r\n                CancelToken?.Cancel();\r\n                ProgressTask?.Wait();\r\n            }\r\n        }\r\n\r\n        public static bool? CancelAndWait(int millisecondsTimeout)\r\n        {\r\n            if (IsActive)\r\n            {\r\n                CancelToken?.Cancel();\r\n                return ProgressTask?.Wait(millisecondsTimeout);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public async static Task CancelAndWaitAsync()\r\n        {\r\n            if (IsActive)\r\n            {\r\n                CancelToken?.Cancel();\r\n                await ProgressTask;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/GoogleImageDownloader.cs",
    "content": "﻿using AngleSharp.Parser.Html;\r\nusing Flurl;\r\nusing Newtonsoft.Json;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.WebView;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class GoogleImage\r\n    {\r\n        [JsonProperty(\"ow\")]\r\n        public uint Width { get; set; }\r\n\r\n        [JsonProperty(\"oh\")]\r\n        public uint Height { get; set; }\r\n\r\n        [JsonProperty(\"ou\")]\r\n        public string ImageUrl { get; set; }\r\n\r\n        [JsonProperty(\"tu\")]\r\n        public string ThumbUrl { get; set; }\r\n\r\n        public string Size => $\"{Width}x{Height}\";\r\n    }\r\n\r\n    public class GoogleImageDownloader : IDisposable\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        private readonly OffscreenWebView webView;\r\n        public GoogleImageDownloader()\r\n        {\r\n            webView = new OffscreenWebView();\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            webView.Dispose();\r\n        }\r\n\r\n        public async Task<List<GoogleImage>> GetImages(string searchTerm, SafeSearchSettings safeSearch, bool transparent = false)\r\n        {\r\n            var images = new List<GoogleImage>();\r\n            var parser = new HtmlParser();\r\n            var url = new Url(@\"https://www.google.com/search\");\r\n            url.SetQueryParam(\"tbm\", \"isch\");\r\n            url.SetQueryParam(\"client\", \"firefox-b-d\");\r\n            url.SetQueryParam(\"source\", \"lnt\");\r\n            url.SetQueryParam(\"q\", searchTerm);\r\n\r\n            if (safeSearch == SafeSearchSettings.On)\r\n            {\r\n                url.SetQueryParam(\"safe\", \"on\");\r\n            }\r\n            else if (safeSearch == SafeSearchSettings.Off)\r\n            {\r\n                url.SetQueryParam(\"safe\", \"off\");\r\n            }\r\n\r\n            if (transparent)\r\n            {\r\n                url.SetQueryParam(\"tbs\", \"ic:trans\");\r\n            }\r\n\r\n            webView.NavigateAndWait(url.ToString());\r\n            if (webView.GetCurrentAddress().StartsWith(@\"https://consent.google.com\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                // This rejects Google's consent form for cookies\r\n                await webView.EvaluateScriptAsync(@\"document.getElementsByTagName('form')[0].submit();\");\r\n                await Task.Delay(3000);\r\n                webView.NavigateAndWait(url.ToString());\r\n            }\r\n\r\n            var googleContent = await webView.GetPageSourceAsync();\r\n            if (googleContent.Contains(\".rg_meta\", StringComparison.Ordinal))\r\n            {\r\n                var document = parser.Parse(googleContent);\r\n                foreach (var imageElem in document.QuerySelectorAll(\".rg_meta\"))\r\n                {\r\n                    images.Add(Serialization.FromJson<GoogleImage>(imageElem.InnerHtml));\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var formatted = Regex.Replace(googleContent, @\"\\r\\n?|\\n\", string.Empty);\r\n                var matches = Regex.Matches(formatted, @\"\\[\"\"(https:\\/\\/encrypted-[^,]+?)\"\",\\d+,\\d+\\],\\[\"\"(http.+?)\"\",(\\d+),(\\d+)\\]\");\r\n                foreach (Match match in matches)\r\n                {\r\n                    var data = Serialization.FromJson<List<List<object>>>($\"[{match.Value}]\");\r\n                    var imageUrl = data[1][0].ToString();\r\n                    if (images.Any(a => a.ImageUrl.Equals(imageUrl, StringComparison.OrdinalIgnoreCase)))\r\n                        continue;\r\n\r\n                    images.Add(new GoogleImage\r\n                    {\r\n                        ThumbUrl = data[0][0].ToString(),\r\n                        ImageUrl = imageUrl,\r\n                        Height = uint.Parse(data[1][1].ToString()),\r\n                        Width = uint.Parse(data[1][2].ToString())\r\n                    });\r\n                }\r\n            }\r\n\r\n            if (!images.HasItems())\r\n            {\r\n                logger.Error(\"Failed to parse any Google image results.\");\r\n                logger.Debug(googleContent);\r\n            }\r\n\r\n            return images;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/HdrUtilities.cs",
    "content": "﻿using Playnite.Common;\nusing Playnite.Native;\nusing Playnite.SDK;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Playnite\n{\n    public class HdrUtilities\n    {\n        private static readonly ILogger logger = LogManager.GetLogger();\n\n        /// <summary>\n        /// Determines if HDR is supported on the primary display\n        /// </summary>\n        /// <returns>True if HDR is supported on the primary display, false if unknown or not supported</returns>\n        public static bool IsHdrSupported()\n        {\n            if (Computer.WindowsVersion < WindowsVersion.Win10)\n            {\n                return false;\n            }\n\n            try\n            {\n                DISPLAYCONFIG_PATH_TARGET_INFO? targetInfo = GetPrimaryDisplayTargetInfo();\n                if (!targetInfo.HasValue)\n                {\n                    logger.Error(\"Failed to retrieve primary display target info\");\n                    return false;\n                }\n\n                (bool isHdrSupported, _) = GetHdrStatus(targetInfo.Value);\n                return isHdrSupported;\n            }\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\n            {\n                logger.Error(e, \"Failed to check if HDR is supported\");\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Determines if HDR is enabled on the primary display\n        /// </summary>\n        /// <returns>True if HDR is enabled on the primary display, false if unknown or not supported</returns>\n        public static bool IsHdrEnabled()\n        {\n            if (Computer.WindowsVersion < WindowsVersion.Win10)\n            {\n                return false;\n            }\n\n            try\n            {\n                DISPLAYCONFIG_PATH_TARGET_INFO? targetInfo = GetPrimaryDisplayTargetInfo();\n                if (!targetInfo.HasValue)\n                {\n                    logger.Error(\"Failed to retrieve primary display target info\");\n                    return false;\n                }\n\n                (_, bool isHdrEnabled) = GetHdrStatus(targetInfo.Value);\n                return isHdrEnabled;\n            }\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\n            {\n                logger.Error(e, \"Failed to check if HDR is enabled\");\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Enables/disables HDR on the primary display\n        /// </summary>\n        /// <param name=\"enable\">True if enabling HDR, false if disabling HDR</param>\n        public static void SetHdrEnabled(bool enable)\n        {\n            if (Computer.WindowsVersion < WindowsVersion.Win10)\n            {\n                return;\n            }\n\n            try\n            {\n                DISPLAYCONFIG_PATH_TARGET_INFO? targetInfo = GetPrimaryDisplayTargetInfo();\n                if (!targetInfo.HasValue)\n                {\n                    logger.Error(\"Failed to retrieve primary display target info\");\n                    return;\n                }\n\n                if (IsHdrSupported())\n                {\n                    //Enable or Disable HDR\n                    var newColorInfo = new DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE\n                    {\n                        header =\n                        {\n                            type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_SET_ADVANCED_COLOR_STATE,\n                            adapterId = targetInfo.Value.adapterId,\n                            id = targetInfo.Value.id,\n                            size = (uint)Marshal.SizeOf<DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE>()\n                        },\n                        enableAdvancedColor = enable\n                    };\n\n                    User32.DisplayConfigSetDeviceInfo(ref newColorInfo.header);\n                }\n            }\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\n            {\n                logger.Error(e, \"Failed to set HDR state\");\n            }\n        }\n\n        private static bool IsPrimaryDisplayMode(DISPLAYCONFIG_MODE_INFO mode)\n        {\n            return\n                mode.infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE &&\n                mode.modeInfo.sourceMode.position.x == 0 &&\n                mode.modeInfo.sourceMode.position.y == 0;\n        }\n\n        private static DISPLAYCONFIG_PATH_TARGET_INFO? GetPrimaryDisplayTargetInfo()\n        {\n            var result = User32.GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, out uint pathCount, out uint modeCount);\n            if (result != WinError.ERROR_SUCCESS)\n            {\n                logger.Error(\"Failed to retrieve display config buffer sizes\");\n                return null;\n            }\n\n            var paths = new DISPLAYCONFIG_PATH_INFO[pathCount];\n            var modes = new DISPLAYCONFIG_MODE_INFO[modeCount];\n\n            result = User32.QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, ref pathCount, paths, ref modeCount, modes, IntPtr.Zero);\n            if (result != WinError.ERROR_SUCCESS)\n            {\n                logger.Error(\"Failed to retrieve display config info\");\n                return null;\n            }\n\n            var primaryDisplayMode = modes\n                 .FirstOrDefault(IsPrimaryDisplayMode);\n\n            var targetInfo =\n                paths.FirstOrDefault(p => p.sourceInfo.id == primaryDisplayMode.id)\n                .targetInfo;\n\n            return targetInfo;\n        }\n\n        private static (bool, bool) GetHdrStatus(DISPLAYCONFIG_PATH_TARGET_INFO targetInfo)\n        {\n            //Retrieve current HDR state\n            var colorInfo = new DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO\n            {\n                header =\n                {\n                    type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO,\n                    adapterId = targetInfo.adapterId,\n                    id = targetInfo.id,\n                    size = (uint)Marshal.SizeOf<DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO>()\n                }\n            };\n\n            var result = User32.DisplayConfigGetDeviceInfo(ref colorInfo);\n            if (result != WinError.ERROR_SUCCESS)\n            {\n                logger.Error(\"Failed to retrieve advanced color info\");\n                return (false, false);\n            }\n\n            return (colorInfo.advancedColorSupported, colorInfo.advancedColorEnabled);\n        }\n    }\n}\n"
  },
  {
    "path": "source/Playnite/HotKey.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite\r\n{\r\n    public class HotKey\r\n    {\r\n        public Key Key { get; }\r\n        public ModifierKeys Modifiers { get; }\r\n\r\n        public HotKey(Key key, ModifierKeys modifiers)\r\n        {\r\n            Key = key;\r\n            Modifiers = modifiers;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            var str = \"\";\r\n            if (Modifiers.HasFlag(ModifierKeys.Control))\r\n            {\r\n                str += \"Ctrl + \";\r\n            }\r\n\r\n            if (Modifiers.HasFlag(ModifierKeys.Shift))\r\n            {\r\n                str += \"Shift + \";\r\n            }\r\n\r\n            if (Modifiers.HasFlag(ModifierKeys.Alt))\r\n            {\r\n                str += \"Alt + \";\r\n            }\r\n\r\n            if (Modifiers.HasFlag(ModifierKeys.Windows))\r\n            {\r\n                str += \"Win + \";\r\n            }\r\n\r\n            return str += Key.ToString();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/HttpFileCache.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Common.Web;\r\nusing Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Net;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class HttpFileCache\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private static readonly object cacheLock = new object();\r\n\r\n        public static string CacheDirectory { get; set; } = PlaynitePaths.ImagesCachePath;\r\n\r\n        private static string GetFileNameFromUrl(string url)\r\n        {\r\n            var uri = new Uri(url);\r\n            var extension = Path.GetExtension(uri.Segments[uri.Segments.Length - 1]);\r\n            var md5 = url.MD5();\r\n            return md5 + extension;\r\n        }\r\n\r\n        public static string GetWebFile(string url)\r\n        {\r\n            if (string.IsNullOrEmpty(url))\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            var cacheFile = Path.Combine(CacheDirectory, GetFileNameFromUrl(url));\r\n            lock (cacheLock)\r\n            {\r\n                if (File.Exists(cacheFile) && (new FileInfo(cacheFile)).Length != 0)\r\n                {\r\n                    logger.Debug($\"Returning {url} from file cache {cacheFile}.\");\r\n                    return cacheFile;\r\n                }\r\n                else\r\n                {\r\n                    FileSystem.CreateDirectory(CacheDirectory);\r\n\r\n                    try\r\n                    {\r\n                        HttpDownloader.DownloadFile(url, cacheFile);\r\n                        return cacheFile;\r\n                    }\r\n                    catch (WebException e)\r\n                    {\r\n                        if (e.Response == null)\r\n                        {\r\n                            throw;\r\n                        }\r\n\r\n                        var response = (HttpWebResponse)e.Response;\r\n                        if (response.StatusCode != HttpStatusCode.NotFound)\r\n                        {\r\n                            throw;\r\n                        }\r\n                        else\r\n                        {\r\n                            return string.Empty;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void ClearCache(string url)\r\n        {\r\n            if (string.IsNullOrEmpty(url))\r\n            {\r\n                return;\r\n            }\r\n\r\n            lock (cacheLock)\r\n            {\r\n                var cacheFile = Path.Combine(CacheDirectory, GetFileNameFromUrl(url));\r\n                if (File.Exists(cacheFile))\r\n                {\r\n                    logger.Debug($\"Removing {url} from file cache: {cacheFile}\");\r\n                    try\r\n                    {\r\n                        FileSystem.DeleteFileSafe(cacheFile);\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to remove {url} from cache.\");\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ImageSourceManager.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Imaging;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite\r\n{\r\n    public class ImageSourceManager\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private static GameDatabase database;\r\n        public static MemoryCache Cache = new MemoryCache(Units.MegaBytesToBytes(100));\r\n        private const string btmpPropsFld = \"bitmappros\";\r\n\r\n        public static void SetDatabase(GameDatabase db)\r\n        {\r\n            if (database != null)\r\n            {\r\n                database.DatabaseFileChanged -= Database_DatabaseFileChanged;\r\n            }\r\n\r\n            database = db;\r\n            database.DatabaseFileChanged += Database_DatabaseFileChanged;\r\n        }\r\n\r\n        private static void Database_DatabaseFileChanged(object sender, DatabaseFileEventArgs args)\r\n        {\r\n            if (args.EventType == FileEvent.Removed)\r\n            {\r\n                Cache.TryRemove(args.FileId, out var file);\r\n            }\r\n        }\r\n\r\n        public static string GetImagePath(string source)\r\n        {\r\n            if (source.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n\r\n            if (source.StartsWith(\"resources:\") || source.StartsWith(\"pack://\"))\r\n            {\r\n                try\r\n                {\r\n                    var imagePath = source;\r\n                    if (source.StartsWith(\"resources:\"))\r\n                    {\r\n                        imagePath = source.Replace(\"resources:\", \"pack://application:,,,\");\r\n                    }\r\n\r\n                    return imagePath;\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, \"Failed to create bitmap from resources \" + source);\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            if (StringExtensions.IsHttpUrl(source))\r\n            {\r\n                try\r\n                {\r\n                    var cachedFile = HttpFileCache.GetWebFile(source);\r\n                    if (string.IsNullOrEmpty(cachedFile))\r\n                    {\r\n                        logger.Warn(\"Web file not found: \" + source);\r\n                        return null;\r\n                    }\r\n\r\n                    return cachedFile;\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(exc, $\"Failed to create bitmap from {source} file.\");\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            if (File.Exists(source))\r\n            {\r\n                return source;\r\n            }\r\n\r\n            if (database == null)\r\n            {\r\n                logger.Error(\"Cannot load database image, database not found.\");\r\n                return null;\r\n            }\r\n\r\n            try\r\n            {\r\n                return database.GetFullFilePath(source);\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, $\"Failed to get bitmap from {source} database file.\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static BitmapSource GetResourceImage(string resourceKey, bool cached, BitmapLoadProperties loadProperties = null)\r\n        {\r\n            if (cached && Cache.TryGet(resourceKey, out var image))\r\n            {\r\n                BitmapLoadProperties existingMetadata = null;\r\n                if (image.Metadata.TryGetValue(btmpPropsFld, out object metaValue))\r\n                {\r\n                    existingMetadata = (BitmapLoadProperties)metaValue;\r\n                }\r\n\r\n                if (existingMetadata?.MaxDecodePixelWidth == loadProperties?.MaxDecodePixelWidth)\r\n                {\r\n                    return image.CacheObject as BitmapSource;\r\n                }\r\n                else\r\n                {\r\n                    Cache.TryRemove(resourceKey);\r\n                }\r\n            }\r\n\r\n            var resource = ResourceProvider.GetResource(resourceKey) as BitmapSource;\r\n            if (loadProperties?.MaxDecodePixelWidth > 0 && resource?.PixelWidth > loadProperties?.MaxDecodePixelWidth)\r\n            {\r\n                resource = resource.GetClone(loadProperties);\r\n            }\r\n\r\n            if (cached && resource != null)\r\n            {\r\n                long imageSize = 0;\r\n                try\r\n                {\r\n                    imageSize = resource.GetSizeInMemory();\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to get image memory size: {resourceKey}\");\r\n                }\r\n\r\n                if (imageSize > 0)\r\n                {\r\n                    Cache.TryAdd(resourceKey, resource, imageSize, new Dictionary<string, object>\r\n                    {\r\n                        { btmpPropsFld, loadProperties }\r\n                    });\r\n                }\r\n            }\r\n\r\n            return resource;\r\n        }\r\n\r\n        public static BitmapSource GetImage(string source, bool cached, BitmapLoadProperties loadProperties = null)\r\n        {\r\n            if (DesignerTools.IsInDesignMode)\r\n            {\r\n                cached = false;\r\n            }\r\n\r\n            if (source.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n\r\n            if (cached && Cache.TryGet(source, out var image))\r\n            {\r\n                BitmapLoadProperties existingMetadata = null;\r\n                if (image.Metadata.TryGetValue(btmpPropsFld, out object metaValue))\r\n                {\r\n                    existingMetadata = (BitmapLoadProperties)metaValue;\r\n                }\r\n\r\n                if (existingMetadata == loadProperties)\r\n                {\r\n                    return image.CacheObject as BitmapSource;\r\n                }\r\n                else\r\n                {\r\n                    Cache.TryRemove(source);\r\n                }\r\n            }\r\n\r\n            if (source.StartsWith(\"resources:\") || source.StartsWith(\"pack://\"))\r\n            {\r\n                try\r\n                {\r\n                    var imagePath = source;\r\n                    if (source.StartsWith(\"resources:\"))\r\n                    {\r\n                        imagePath = source.Replace(\"resources:\", \"pack://application:,,,\");\r\n                    }\r\n\r\n                    var streamInfo = Application.GetResourceStream(new Uri(imagePath));\r\n                    using (var stream = streamInfo.Stream)\r\n                    {\r\n                        var imageData = BitmapExtensions.BitmapFromStream(stream, loadProperties);\r\n                        if (imageData != null)\r\n                        {\r\n                            if (cached)\r\n                            {\r\n                                Cache.TryAdd(source, imageData, imageData.GetSizeInMemory(),\r\n                                    new Dictionary<string, object>\r\n                                    {\r\n                                    { btmpPropsFld, loadProperties }\r\n                                    });\r\n                            }\r\n\r\n                            return imageData;\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, \"Failed to create bitmap from resources \" + source);\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            if (StringExtensions.IsHttpUrl(source))\r\n            {\r\n                try\r\n                {\r\n                    var cachedFile = HttpFileCache.GetWebFile(source);\r\n                    if (string.IsNullOrEmpty(cachedFile))\r\n                    {\r\n                        logger.Warn(\"Web file not found: \" + source);\r\n                        return null;\r\n                    }\r\n\r\n                    return BitmapExtensions.BitmapFromFile(cachedFile, loadProperties);\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(exc, $\"Failed to create bitmap from {source} file.\");\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            if (File.Exists(source))\r\n            {\r\n                try\r\n                {\r\n                    var imageData = BitmapExtensions.BitmapFromFile(source, loadProperties);\r\n                    if (imageData != null)\r\n                    {\r\n                        if (cached)\r\n                        {\r\n                            Cache.TryAdd(source, imageData, imageData.GetSizeInMemory(),\r\n                                new Dictionary<string, object>\r\n                                {\r\n                                    { btmpPropsFld, loadProperties }\r\n                                });\r\n                        }\r\n\r\n                        return imageData;\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, \"Failed to create bitmap from \" + source);\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            try\r\n            {\r\n                if (database == null)\r\n                {\r\n                    logger.Error(\"Cannot load database image, database not found.\");\r\n                    return null;\r\n                }\r\n\r\n                try\r\n                {\r\n                    var imageData = database.GetFileAsImage(source, loadProperties);\r\n                    if (imageData == null)\r\n                    {\r\n                        logger.Warn(\"Image not found in database: \" + source);\r\n                        return null;\r\n                    }\r\n                    else\r\n                    {\r\n                        if (cached)\r\n                        {\r\n                            Cache.TryAdd(source, imageData, imageData.GetSizeInMemory(),\r\n                                new Dictionary<string, object>\r\n                                {\r\n                                    { btmpPropsFld, loadProperties }\r\n                                });\r\n                        }\r\n\r\n                        return imageData;\r\n                    }\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(exc, $\"Failed to get bitmap from {source} database file.\");\r\n                    return null;\r\n                }\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to load image from database.\");\r\n                return null;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Input/GameController.cs",
    "content": "﻿using Playnite.Native;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Events;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Input;\r\nusing System.Windows.Interop;\r\nusing static SDL2.SDL;\r\n\r\nnamespace Playnite.Input\r\n{\r\n\r\n\r\n    public class GameControllerGesture : InputGesture\r\n    {\r\n        public static event EventHandler ConfirmationBindingChanged;\r\n        public static event EventHandler CancellationBindingChanged;\r\n\r\n        private static ControllerInput confirmationBinding = ControllerInput.A;\r\n        public static ControllerInput ConfirmationBinding\r\n        {\r\n            get => confirmationBinding;\r\n            set\r\n            {\r\n                confirmationBinding = value;\r\n                ConfirmationBindingChanged?.Invoke(null, EventArgs.Empty);\r\n            }\r\n        }\r\n\r\n        private static ControllerInput cancellationBinding = ControllerInput.B;\r\n        public static ControllerInput CancellationBinding\r\n        {\r\n            get => cancellationBinding;\r\n            set\r\n            {\r\n                cancellationBinding = value;\r\n                CancellationBindingChanged?.Invoke(null, EventArgs.Empty);\r\n            }\r\n        }\r\n\r\n        private readonly ControllerInput button;\r\n\r\n        public GameControllerGesture(ControllerInput button)\r\n        {\r\n            this.button = button;\r\n        }\r\n\r\n        public override bool Matches(object targetElement, InputEventArgs inputEventArgs)\r\n        {\r\n            if (inputEventArgs is GameControllerInputEventArgs args)\r\n            {\r\n                return args.ButtonState == ControllerInputState.Pressed && args.Button == button;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    [System.Runtime.InteropServices.Guid(\"36CB2F69-F227-4165-8CEE-6C10BC575524\")]\r\n    public class GameControllerManager : IDisposable\r\n    {\r\n        public class InputState\r\n        {\r\n            public Stopwatch Watch { get; set; } = new Stopwatch();\r\n            public bool IsReSending { get; set; } = false;\r\n        }\r\n\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        public bool SimulateNavigationKeys { get; set; } = true;\r\n        public bool SimulateAllKeys { get; set; } = false;\r\n        public bool StandardProcessingEnabled { get; set; } = true;\r\n\r\n        public event EventHandler<OnControllerButtonStateChangedArgs> ButtonChanged;\r\n        public event EventHandler<OnControllerConnectedArgs> ControllerConnected;\r\n        public event EventHandler<OnControllerDisconnectedArgs> ControllerDisconnected;\r\n        public event EventHandler ControllersChanged;\r\n\r\n        private readonly OnControllerButtonStateChangedArgs controllerButtonStateChangedArgs = new OnControllerButtonStateChangedArgs();\r\n        private readonly OnControllerConnectedArgs controllerConnectedArgs = new OnControllerConnectedArgs();\r\n        private readonly OnControllerDisconnectedArgs controllerDisconnectedArgs = new OnControllerDisconnectedArgs();\r\n\r\n        private readonly int resendDelay = 700;\r\n        private readonly int resendRate = 80;\r\n\r\n        private readonly Dictionary<ControllerInput, uint> keyboardMap = new Dictionary<ControllerInput, uint>()\r\n        {\r\n            {  ControllerInput.A, Winuser.VK_RETURN },\r\n            {  ControllerInput.B, 0 },\r\n            {  ControllerInput.Back, 0 },\r\n            {  ControllerInput.DPadDown, Winuser.VK_DOWN },\r\n            {  ControllerInput.DPadLeft, Winuser.VK_LEFT },\r\n            {  ControllerInput.DPadRight, Winuser.VK_RIGHT },\r\n            {  ControllerInput.DPadUp, Winuser.VK_UP },\r\n            {  ControllerInput.Guide, 0 },\r\n            {  ControllerInput.LeftShoulder, 0 },\r\n            {  ControllerInput.LeftStick, 0 },\r\n            {  ControllerInput.LeftStickDown, Winuser.VK_DOWN },\r\n            {  ControllerInput.LeftStickLeft, Winuser.VK_LEFT },\r\n            {  ControllerInput.LeftStickRight, Winuser.VK_RIGHT },\r\n            {  ControllerInput.LeftStickUp, Winuser.VK_UP },\r\n            {  ControllerInput.RightShoulder, 0 },\r\n            {  ControllerInput.RightStick, 0 },\r\n            {  ControllerInput.RightStickDown, 0 },\r\n            {  ControllerInput.RightStickLeft, 0 },\r\n            {  ControllerInput.RightStickRight, 0 },\r\n            {  ControllerInput.RightStickUp, 0 },\r\n            {  ControllerInput.Start, 0 },\r\n            {  ControllerInput.TriggerLeft, Winuser.VK_PRIOR },\r\n            {  ControllerInput.TriggerRight, Winuser.VK_NEXT },\r\n            {  ControllerInput.X, 0 },\r\n            {  ControllerInput.Y, 0 }\r\n        };\r\n\r\n        private readonly Dictionary<ControllerInput, InputState> keyWatches = new Dictionary<ControllerInput, InputState>()\r\n        {\r\n            {  ControllerInput.A, new InputState() },\r\n            {  ControllerInput.B, new InputState() },\r\n            {  ControllerInput.Back, new InputState() },\r\n            {  ControllerInput.DPadDown, new InputState() },\r\n            {  ControllerInput.DPadLeft, new InputState() },\r\n            {  ControllerInput.DPadRight, new InputState() },\r\n            {  ControllerInput.DPadUp, new InputState() },\r\n            {  ControllerInput.Guide, new InputState() },\r\n            {  ControllerInput.LeftShoulder, new InputState() },\r\n            {  ControllerInput.LeftStick, new InputState() },\r\n            {  ControllerInput.LeftStickDown, new InputState() },\r\n            {  ControllerInput.LeftStickLeft, new InputState() },\r\n            {  ControllerInput.LeftStickRight, new InputState() },\r\n            {  ControllerInput.LeftStickUp, new InputState() },\r\n            {  ControllerInput.RightShoulder, new InputState() },\r\n            {  ControllerInput.RightStick, new InputState() },\r\n            {  ControllerInput.RightStickDown, new InputState() },\r\n            {  ControllerInput.RightStickLeft, new InputState() },\r\n            {  ControllerInput.RightStickRight, new InputState() },\r\n            {  ControllerInput.RightStickUp, new InputState() },\r\n            {  ControllerInput.Start, new InputState() },\r\n            {  ControllerInput.TriggerLeft, new InputState() },\r\n            {  ControllerInput.TriggerRight, new InputState() },\r\n            {  ControllerInput.X, new InputState() },\r\n            {  ControllerInput.Y, new InputState() }\r\n        };\r\n\r\n        private readonly SynchronizationContext context;\r\n\r\n        private readonly InputManager inputManager;\r\n        private bool isDisposed = false;\r\n\r\n        public class LoadedGameController : GamepadController\r\n        {\r\n            public IntPtr Controller { get; }\r\n            public IntPtr Joystic { get; }\r\n            public new bool Enabled { get; set; }\r\n\r\n            public readonly Dictionary<ControllerInput, ControllerInputState> LastInputState = new Dictionary<ControllerInput, ControllerInputState>()\r\n            {\r\n                {  ControllerInput.A, ControllerInputState.Released },\r\n                {  ControllerInput.B, ControllerInputState.Released },\r\n                {  ControllerInput.Back, ControllerInputState.Released },\r\n                {  ControllerInput.DPadDown, ControllerInputState.Released },\r\n                {  ControllerInput.DPadLeft, ControllerInputState.Released },\r\n                {  ControllerInput.DPadRight, ControllerInputState.Released },\r\n                {  ControllerInput.DPadUp, ControllerInputState.Released },\r\n                {  ControllerInput.Guide, ControllerInputState.Released },\r\n                {  ControllerInput.LeftShoulder, ControllerInputState.Released },\r\n                {  ControllerInput.LeftStick, ControllerInputState.Released },\r\n                {  ControllerInput.LeftStickDown, ControllerInputState.Released },\r\n                {  ControllerInput.LeftStickLeft, ControllerInputState.Released },\r\n                {  ControllerInput.LeftStickRight, ControllerInputState.Released },\r\n                {  ControllerInput.LeftStickUp, ControllerInputState.Released },\r\n                {  ControllerInput.RightShoulder, ControllerInputState.Released },\r\n                {  ControllerInput.RightStick, ControllerInputState.Released },\r\n                {  ControllerInput.RightStickDown, ControllerInputState.Released },\r\n                {  ControllerInput.RightStickLeft, ControllerInputState.Released },\r\n                {  ControllerInput.RightStickRight, ControllerInputState.Released },\r\n                {  ControllerInput.RightStickUp, ControllerInputState.Released },\r\n                {  ControllerInput.Start, ControllerInputState.Released },\r\n                {  ControllerInput.TriggerLeft, ControllerInputState.Released },\r\n                {  ControllerInput.TriggerRight, ControllerInputState.Released },\r\n                {  ControllerInput.X, ControllerInputState.Released },\r\n                {  ControllerInput.Y, ControllerInputState.Released }\r\n            };\r\n\r\n            public LoadedGameController(IntPtr controller, IntPtr joystic, int instanceId, string path, string name)\r\n            {\r\n                Controller = controller;\r\n                Joystic = joystic;\r\n                InstanceId = instanceId;\r\n                Path = path;\r\n                Name = name;\r\n            }\r\n        }\r\n\r\n        public readonly List<LoadedGameController> Controllers = new List<LoadedGameController>();\r\n\r\n        public GameControllerManager(InputManager input, List<string> disabledList)\r\n        {\r\n            inputManager = input;\r\n            context = SynchronizationContext.Current;\r\n\r\n            for (int i = 0; i < SDL_NumJoysticks(); i++)\r\n            {\r\n                if (SDL_IsGameController(i) == SDL_bool.SDL_TRUE)\r\n                {\r\n                    AddController(i, disabledList);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ProcessInputs()\r\n        {\r\n            if (isDisposed)\r\n            {\r\n                return;\r\n            }\r\n\r\n            SDL_GameControllerUpdate();\r\n            foreach (var controller in Controllers)\r\n            {\r\n                if (controller.Enabled)\r\n                {\r\n                    ProcessState(controller);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void AddController(int joyIndex, List<string> disabledList)\r\n        {\r\n            if (isDisposed)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var controller = SDL_GameControllerOpen(joyIndex);\r\n            var joystick = SDL_GameControllerGetJoystick(controller);\r\n            var con = new LoadedGameController(controller, joystick, SDL_JoystickInstanceID(joystick), SDL_JoystickPath(joystick), SDL_JoystickName(joystick));\r\n            con.Enabled = !disabledList.Contains(con.Path);\r\n            Controllers.Add(con);\r\n            logger.Info($\"Added controller {con.InstanceId}, {con.Name}, {con.Path}\");\r\n            controllerConnectedArgs.Controller = con;\r\n            context.Send((a) =>\r\n            {\r\n                ControllersChanged?.Invoke(this, EventArgs.Empty);\r\n                ControllerConnected?.Invoke(this, controllerConnectedArgs);\r\n            }, null);\r\n        }\r\n\r\n        public void RemoveController(int instanceId)\r\n        {\r\n            if (isDisposed)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var controller = Controllers.FirstOrDefault(a => a.InstanceId == instanceId);\r\n            if (controller == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            SDL_GameControllerClose(controller.Controller);\r\n            Controllers.Remove(controller);\r\n            logger.Info($\"Removed controller {instanceId}, {controller.Name}, {controller.Path}\");\r\n            controllerDisconnectedArgs.Controller = controller;\r\n            context.Send((a) =>\r\n            {\r\n                ControllersChanged?.Invoke(this, EventArgs.Empty);\r\n                ControllerDisconnected?.Invoke(this, controllerDisconnectedArgs);\r\n            }, null);\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            isDisposed = true;\r\n            foreach (var controller in Controllers)\r\n            {\r\n                SDL_GameControllerClose(controller.Controller);\r\n            }\r\n        }\r\n\r\n        private uint MapPadToKeyboard(ControllerInput input)\r\n        {\r\n            if (input == GameControllerGesture.ConfirmationBinding)\r\n            {\r\n                return Winuser.VK_RETURN;\r\n            }\r\n            else if (input == GameControllerGesture.CancellationBinding)\r\n            {\r\n                // I don't remember anymore why we don't map B to ESC, but it's probably because of some WPF FS mode hack BS\r\n                return 0;\r\n            }\r\n            else\r\n            {\r\n                return keyboardMap[input];\r\n            }\r\n        }\r\n\r\n        private void ProcessState(LoadedGameController controller)\r\n        {\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_A), ControllerInput.A, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_B), ControllerInput.B, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_BACK), ControllerInput.Back, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_GUIDE), ControllerInput.Guide, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSHOULDER), ControllerInput.LeftShoulder, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSTICK), ControllerInput.LeftStick, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER), ControllerInput.RightShoulder, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSTICK), ControllerInput.RightStick, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_START), ControllerInput.Start, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_X), ControllerInput.X, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_Y), ControllerInput.Y, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_DOWN), ControllerInput.DPadDown, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_LEFT), ControllerInput.DPadLeft, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_RIGHT), ControllerInput.DPadRight, controller);\r\n            ProcessButtonState(SDL_GameControllerGetButton(controller.Controller, SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_UP), ControllerInput.DPadUp, controller);\r\n\r\n            ProcessAxisState(SDL_GameControllerGetAxis(controller.Controller, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_TRIGGERLEFT), ControllerInput.TriggerLeft, true, controller);\r\n            ProcessAxisState(SDL_GameControllerGetAxis(controller.Controller, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_TRIGGERRIGHT), ControllerInput.TriggerRight, true, controller);\r\n            var state = SDL_GameControllerGetAxis(controller.Controller, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_LEFTX);\r\n            ProcessAxisState(state, ControllerInput.LeftStickLeft, false, controller);\r\n            ProcessAxisState(state, ControllerInput.LeftStickRight, true, controller);\r\n            state = SDL_GameControllerGetAxis(controller.Controller, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_LEFTY);\r\n            ProcessAxisState(state, ControllerInput.LeftStickUp, false, controller);\r\n            ProcessAxisState(state, ControllerInput.LeftStickDown, true, controller);\r\n            state = SDL_GameControllerGetAxis(controller.Controller, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_RIGHTX);\r\n            ProcessAxisState(state, ControllerInput.RightStickLeft, false, controller);\r\n            ProcessAxisState(state, ControllerInput.RightStickRight, true, controller);\r\n            state = SDL_GameControllerGetAxis(controller.Controller, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_RIGHTY);\r\n            ProcessAxisState(state, ControllerInput.RightStickUp, false, controller);\r\n            ProcessAxisState(state, ControllerInput.RightStickDown, true, controller);\r\n        }\r\n\r\n        private bool IsButtonNotNavigation(ControllerInput button)\r\n        {\r\n            return button == ControllerInput.A ||\r\n                   button == ControllerInput.B ||\r\n                   button == ControllerInput.Back ||\r\n                   button == ControllerInput.Guide ||\r\n                   button == ControllerInput.LeftShoulder ||\r\n                   button == ControllerInput.LeftStick ||\r\n                   button == ControllerInput.None ||\r\n                   button == ControllerInput.RightShoulder ||\r\n                   button == ControllerInput.RightStick ||\r\n                   button == ControllerInput.Start ||\r\n                   button == ControllerInput.X ||\r\n                   button == ControllerInput.Y;\r\n        }\r\n\r\n        private bool ShouldResendKey(ControllerInput button)\r\n        {\r\n            var state = keyWatches[button];\r\n            var sendInput = false;\r\n            var elapsed = state.Watch.ElapsedMilliseconds;\r\n            if (!state.Watch.IsRunning)\r\n            {\r\n                sendInput = true;\r\n                state.Watch.Start();\r\n            }\r\n            else\r\n            {\r\n                if (IsButtonNotNavigation(button))\r\n                {\r\n                    sendInput = false;\r\n                }\r\n                else\r\n                {\r\n                    if (!state.IsReSending && elapsed < resendDelay)\r\n                    {\r\n                        sendInput = false;\r\n                    }\r\n                    else if (!state.IsReSending && elapsed > resendDelay)\r\n                    {\r\n                        state.IsReSending = true;\r\n                        state.Watch.Restart();\r\n                        sendInput = true;\r\n                    }\r\n                    else\r\n                    {\r\n                        if (state.IsReSending && elapsed > resendRate)\r\n                        {\r\n                            state.Watch.Restart();\r\n                            sendInput = true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return sendInput;\r\n        }\r\n\r\n        private void ResetButtonResend(ControllerInput button)\r\n        {\r\n            var state = keyWatches[button];\r\n            state.Watch.Reset();\r\n            state.IsReSending = false;\r\n        }\r\n\r\n        private void ProcessButtonState(byte currentState, ControllerInput button, LoadedGameController controller)\r\n        {\r\n            var pressed = false;\r\n            if (currentState == 1)\r\n            {\r\n                pressed = true;\r\n            }\r\n            else if (currentState < 0)\r\n            {\r\n                logger.Error($\"Failed to get controller button state: {SDL_GetError()}\");\r\n            }\r\n\r\n            if (IsButtonNotNavigation(button))\r\n            {\r\n                var lastState = controller.LastInputState[button];\r\n                if (pressed && lastState == ControllerInputState.Released)\r\n                {\r\n                    SendControllerInput(button, true, controller);\r\n                    SimulateKeyInput(MapPadToKeyboard(button), true);\r\n                }\r\n                else if (!pressed && lastState == ControllerInputState.Pressed)\r\n                {\r\n                    SendControllerInput(button, false, controller);\r\n                    SimulateKeyInput(MapPadToKeyboard(button), false);\r\n                }\r\n\r\n                controller.LastInputState[button] = pressed ? ControllerInputState.Pressed : ControllerInputState.Released;\r\n            }\r\n            else\r\n            {\r\n                if (pressed && ShouldResendKey(button))\r\n                {\r\n                    SendControllerInput(button, true, controller);\r\n                    controller.LastInputState[button] = ControllerInputState.Pressed;\r\n                    SimulateKeyInput(MapPadToKeyboard(button), true);\r\n                }\r\n                else if (!pressed && controller.LastInputState[button] == ControllerInputState.Pressed)\r\n                {\r\n                    ResetButtonResend(button);\r\n                    SendControllerInput(button, false, controller);\r\n                    controller.LastInputState[button] = ControllerInputState.Released;\r\n                    SimulateKeyInput(MapPadToKeyboard(button), false);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void ProcessAxisState(short currentState, ControllerInput button, bool positive, LoadedGameController controller)\r\n        {\r\n            var pressed = false;\r\n            // SDL2 docs:\r\n            // The state is a value ranging from -32768 to 32767. Triggers, however, range from 0 to 32767 (they never return a negative value).\r\n            if (button == ControllerInput.TriggerLeft || button == ControllerInput.TriggerRight)\r\n            {\r\n                pressed = currentState > 16383;\r\n            }\r\n            else\r\n            {\r\n                if (positive)\r\n                {\r\n                    pressed = currentState > 16383;\r\n                }\r\n                else\r\n                {\r\n                    pressed = currentState < -16383;\r\n                }\r\n            }\r\n\r\n            if (pressed && ShouldResendKey(button))\r\n            {\r\n                SendControllerInput(button, true, controller);\r\n                controller.LastInputState[button] = ControllerInputState.Pressed;\r\n                SimulateKeyInput(MapPadToKeyboard(button), true);\r\n            }\r\n            else if (!pressed && controller.LastInputState[button] == ControllerInputState.Pressed)\r\n            {\r\n                ResetButtonResend(button);\r\n                SendControllerInput(button, false, controller);\r\n                controller.LastInputState[button] = ControllerInputState.Released;\r\n                SimulateKeyInput(MapPadToKeyboard(button), false);\r\n            }\r\n        }\r\n\r\n        private void SendControllerInput(ControllerInput button, bool pressed, LoadedGameController controller)\r\n        {\r\n            context.Post((a) =>\r\n            {\r\n                if (StandardProcessingEnabled)\r\n                {\r\n                    if (InputManager.Current.PrimaryKeyboardDevice?.ActiveSource == null)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    var args = new GameControllerInputEventArgs(Key.None, pressed ? ControllerInputState.Pressed : ControllerInputState.Released, button);\r\n                    inputManager.ProcessInput(args);\r\n                }\r\n\r\n                controllerButtonStateChangedArgs.Controller = controller;\r\n                controllerButtonStateChangedArgs.Button = button;\r\n                controllerButtonStateChangedArgs.State = pressed ? ControllerInputState.Pressed : ControllerInputState.Released;\r\n                ButtonChanged?.Invoke(null, controllerButtonStateChangedArgs);\r\n            }, null);\r\n        }\r\n\r\n        private void SendKeyInput(uint key, bool pressed)\r\n        {\r\n            if (!StandardProcessingEnabled)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (key == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var windowHandle = IntPtr.Zero;\r\n            context.Send((_) =>\r\n            {\r\n                var window = WindowManager.CurrentWindow;\r\n                if (window == null)\r\n                {\r\n                    windowHandle = IntPtr.Zero;\r\n                }\r\n                else\r\n                {\r\n                    var helper = new WindowInteropHelper(window);\r\n                    windowHandle = helper.Handle;\r\n                }\r\n            }, null);\r\n\r\n            if (windowHandle == IntPtr.Zero)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (pressed)\r\n            {\r\n                User32.SendMessage(windowHandle, Winuser.WM_KEYDOWN, key, IntPtr.Zero);\r\n            }\r\n            else\r\n            {\r\n                User32.SendMessage(windowHandle, Winuser.WM_KEYUP, key, IntPtr.Zero);\r\n            }\r\n        }\r\n\r\n        private void SimulateKeyInput(uint key, bool pressed)\r\n        {\r\n            if (!StandardProcessingEnabled)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (SimulateAllKeys || (SimulateNavigationKeys && IsKeysDirectionKey(key)))\r\n            {\r\n                SendKeyInput(key, pressed);\r\n            }\r\n        }\r\n\r\n        private bool IsKeysDirectionKey(uint key)\r\n        {\r\n            switch (key)\r\n            {\r\n                case Winuser.VK_UP:\r\n                case Winuser.VK_DOWN:\r\n                case Winuser.VK_LEFT:\r\n                case Winuser.VK_RIGHT:\r\n                case Winuser.VK_PRIOR:\r\n                case Winuser.VK_NEXT:\r\n                    return true;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    public class GameControllerInputEventArgs : KeyEventArgs\r\n    {\r\n        public ControllerInputState ButtonState\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public ControllerInput Button\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public GameControllerInputEventArgs(Key key, ControllerInputState state, ControllerInput button) :\r\n            base(InputManager.Current.PrimaryKeyboardDevice, InputManager.Current.PrimaryKeyboardDevice.ActiveSource, Environment.TickCount, key)\r\n        {\r\n            ButtonState = state;\r\n            Button = button;\r\n            RoutedEvent = state == ControllerInputState.Pressed ? Keyboard.KeyDownEvent : Keyboard.KeyUpEvent;\r\n        }\r\n    }\r\n\r\n    public class GameControllerInputBinding : InputBinding\r\n    {\r\n        public static readonly DependencyProperty ButtonProperty =\r\n            DependencyProperty.Register(\r\n                nameof(Button),\r\n                typeof(ControllerInput),\r\n                typeof(GameControllerInputBinding),\r\n                new UIPropertyMetadata(ControllerInput.None, new PropertyChangedCallback(OnButtonPropertyChanged)));\r\n\r\n        public ControllerInput Button\r\n        {\r\n            get\r\n            {\r\n                return (ControllerInput)GetValue(ButtonProperty);\r\n            }\r\n            set\r\n            {\r\n                SetValue(ButtonProperty, value);\r\n            }\r\n        }\r\n\r\n        public override InputGesture Gesture\r\n        {\r\n            get\r\n            {\r\n                return base.Gesture as GameControllerGesture;\r\n            }\r\n            set\r\n            {\r\n                var gesture = value as GameControllerGesture;\r\n                base.Gesture = gesture;\r\n            }\r\n        }\r\n\r\n        public GameControllerInputBinding()\r\n        {\r\n        }\r\n\r\n        public GameControllerInputBinding(ICommand command, ControllerInput button)\r\n        {\r\n            Command = command;\r\n            Button = button;\r\n        }\r\n\r\n        private static void OnButtonPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var binding = (GameControllerInputBinding)d;\r\n            binding.Gesture = new GameControllerGesture((ControllerInput)e.NewValue);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Input/MouseWheelGesture.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.Input\r\n{\r\n    // Courtesy of https://social.msdn.microsoft.com/Forums/vstudio/en-US/b39b5d98-d039-4e83-8c65-ca434786d6af/mouse-wheel-input-binding?forum=wpf\r\n    public class MouseWheelGesture : MouseGesture\r\n    {\r\n        public WheelDirection Direction { get; set; }\r\n\r\n        public static MouseWheelGesture Up\r\n        {\r\n            get\r\n            {\r\n                return new MouseWheelGesture { Direction = WheelDirection.Up };\r\n            }\r\n        }\r\n\r\n        public static MouseWheelGesture Down\r\n        {\r\n            get\r\n            {\r\n                return new MouseWheelGesture { Direction = WheelDirection.Down };\r\n            }\r\n        }\r\n\r\n        public static MouseWheelGesture CtrlUp\r\n        {\r\n            get\r\n            {\r\n                return new MouseWheelGesture(ModifierKeys.Control) { Direction = WheelDirection.Up };\r\n            }\r\n        }\r\n\r\n        public static MouseWheelGesture CtrlDown\r\n        {\r\n            get\r\n            {\r\n                return new MouseWheelGesture(ModifierKeys.Control) { Direction = WheelDirection.Down };\r\n            }\r\n        }\r\n\r\n\r\n        public MouseWheelGesture() : base(MouseAction.WheelClick)\r\n        {\r\n        }\r\n\r\n        public MouseWheelGesture(ModifierKeys modifiers) : base(MouseAction.WheelClick, modifiers)\r\n        {\r\n        }\r\n\r\n        public override bool Matches(object targetElement, InputEventArgs inputEventArgs)\r\n        {\r\n            if (!base.Matches(targetElement, inputEventArgs))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!(inputEventArgs is MouseWheelEventArgs))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            var args = (MouseWheelEventArgs)inputEventArgs;\r\n            switch (Direction)\r\n            {\r\n                case WheelDirection.None:\r\n                    return args.Delta == 0;\r\n                case WheelDirection.Up:\r\n                    return args.Delta > 0;\r\n                case WheelDirection.Down:\r\n                    return args.Delta < 0;\r\n                default:\r\n                    return false;\r\n            }\r\n        }        \r\n\r\n        public enum WheelDirection\r\n        {\r\n            None,\r\n            Up,\r\n            Down,\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ItemSelector.cs",
    "content": "﻿using Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public static class ItemSelector\r\n    {\r\n        public static bool SelectSingle<TItem>(string header, string message, List<SelectableNamedObject<TItem>> items, out TItem selected)\r\n        {\r\n            var result = new SingleItemSelectionViewModel<TItem>(\r\n                new SingleItemSelectionWindowFactory(),\r\n                header,\r\n                message).\r\n                SelectItem(items, out TItem selectedItem);\r\n            selected = selectedItem;\r\n            return result;\r\n        }\r\n\r\n        public static bool SelectMultiple<TItem>(string header, string message, List<SelectableNamedObject<TItem>> items, out List<TItem> selected)\r\n        {\r\n            var result = new MultiItemSelectionViewModel<TItem>(\r\n                new MultiItemSelectionWindowFactory(),\r\n                header,\r\n                message).\r\n                SelectItem(items, out List<TItem> selectedItems);\r\n            selected = selectedItems;\r\n            return result;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Localization/LocSource.xaml",
    "content": "﻿\r\n    <ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">English</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite language</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Exit</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filter Active</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filter Disabled</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Additional filters</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filters</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Invalid Data</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Save Changes?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Homepage at www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Source Code at GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Create diag. package</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Send diag. information</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">About Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Made by Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Assign Category</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Set Categories</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Add Category</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Checked - Assign category\r\nUnchecked - Remove category\r\nIndeterminate - No changes (when editing multiple games)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">No Category</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">No Platform</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Whoops! Something went wrong…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">An unrecoverable error has occurred.\r\n\r\nIf you would like to help us fix this issue, please briefly describe the actions taken before the crash, and then send diagnostic information. If you are online, the package will be uploaded to the Playnite server for analysis.\r\n\r\nAlternatively, you can click on the 'Report Crash' button to create a new GitHub issue and report the crash manually.\r\n\r\nThank you for your help.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Extension \"{0}\" caused an unrecoverable error.\r\n\r\nWe recommend saving the log file and reporting the issue to extension's developer. If the issue keeps reoccurring, disable the extension.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Extension \"{0}\" caused an unrecoverable error.\r\n\r\nWe recommend reporting the issue to extension's developer. If the issue keeps reoccurring, disable the extension.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Unknown extension or a theme caused an unrecoverable error.\r\n\r\nWe recommend disabling 3rd party add-ons, isolating the problematic one and reporting the issue to add-on's developer.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Unrecoverable error occurred.\r\n\r\nIf you want to help us fix this issue, please send diagnostic information. Thank you.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Disable extension</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Save log file</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Send diag. info</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Report Crash</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Restart Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Restart in Safe Mode</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Disabling all 3rd party extensions and using default theme.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Exit Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Actions taken before the crash (in English):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Library Manager</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Remove Game(s)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Cannot remove - Game or installer is running. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Cannot uninstall - Game is running.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Are you sure you want to remove {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Are you sure you want to remove {0} games?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Are you sure you want to remove {0}?\r\n\r\nSelecting \"add to exclusion list\" option will prevent game from being imported again next time library is updated.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Are you sure you want to remove {0} games?\r\n\r\nSelecting \"add to exclusion list\" option will prevent games from being imported again next time library is updated.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Are you sure you want to remove {0} entries that are currently not in use?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">No unused fields found.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Yes (add to exclusion list)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">There are unsaved changes in this section</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Updating game library format…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Database update failed.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Cannot update game library. {0} MBs of free space is required.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">GameError</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Cannot start game. '{0}' was not found in database.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Cannot start game: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Cannot start action: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Cannot open game location: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Could not detect game install size: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Install size scan error</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">There were {0} errors during install size scan</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Failed to create shortcut: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Failed to open manual: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Cannot install game: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Cannot un-install game: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">No valid game startup actions found. When using emulator actions, make sure platform definitions match between the game and emulator configuration.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Installation implementation is not available.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">The library plugin responsible for this game is disabled or not installed.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Official metadata download is not available.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">No game is selected.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Game's script execution failed.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Application script execution failed.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Global script execution failed.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Emulator script execution failed.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Play script action execution failed.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 or newer is not installed.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Couldn't determine how to start the game.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Enabled</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Disabled</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Remove</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Remove unused</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Rename</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Copy</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Add</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Default Icon</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Default Cover Image</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Default Background Image</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Finish</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Next</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Back</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">DONE</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">BACK</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">CLEAR</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Clear</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Dismiss</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Dismiss All</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Import</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Name</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Author</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Module</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Series</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Version</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Last Played</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Most Played</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Play Count</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Install Size</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Folder</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notes</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Added</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Date Added</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Modified</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Date Modified</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Website</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Path</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Save</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Close</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Cancel</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Confirm</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Reset</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Yes</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">No</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Welcome</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Local User</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">General</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Media</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Installation</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Actions</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Downloading…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Downloading media…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Loading…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Type</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profile</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profiles</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Remove</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Download</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Search</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Resolution:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Any</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Zoom</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">List View</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Covers</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Grid View</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Details View</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Custom</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Special thanks</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">License</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Contributors</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Exiting Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Today</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Yesterday</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Monday</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Tuesday</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Wednesday</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Thursday</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Friday</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Saturday</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Sunday</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Past Week</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Past Month</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Past Year</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">More than a year ago</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 to 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB to 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB to 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB to 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB to 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB to 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB to 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB or more</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Import completed successfully.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">All Games</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Game Id</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Database Id</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Presets</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Column</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Columns</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Row</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Rows</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Couldn't get icon from Play action. There's no action of File type present.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Only download missing metadata</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Enabling this option will skip downloading metadata for data fields that already contain information.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Games selection</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Please select which games should to be updated with new metadata:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">All games from database</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">All currently filtered games</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Selected games only</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">No metadata fields selected</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">No metadata fields are selected for download. Please select at least one, and enable at least one metadata provider for it.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Official Store</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Please select which fields should be automatically populated by Playnite and which sources should be used to obtain the data from.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Please consider clicking on the logo above and contribute updates to igdb.com database in order to improve data Playnite uses.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Downloading metadata…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importing installed games…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importing {0} games…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importing emulated games from {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Downloading library updates…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Scanning size of games in library…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Scanning size of imported games…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Library update finished</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Releasing resources…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Configuration</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Settings…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platforms and Emulators</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Configure Emulators…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Library Manager…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Tools</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Download Metadata…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Software Tools…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Configure Integrations…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Open 3rd Party Client</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">3rd Party Clients</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Update Game Library</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Cancel Library Update</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Update Emulated Folders</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Add Game</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manually…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Scan Automatically…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emulated Game…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store application…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">About Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Send Feedback</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Switch to Fullscreen Mode</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Help</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Support on Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Support on Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">User manual</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK Documentation</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Restart System</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Turn Off System</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Suspend System</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernate System</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Lock System</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Log Out User</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Pick a Random Game</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Game fields to be displayed on details panel:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Item spacing</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Draw grid item background</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Grid item border width</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Missing game icon source</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Missing game cover source</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Missing game background source</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Vertical spacing to game details</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Grid view details position</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Details view game list position</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Draw separator between panels</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Game cover image height</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Game list icon height</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Application font</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Monospaced font</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Filter panel position</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Explorer panel position</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Cover art rendering</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Target aspect ratio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Following options also affect tile rendering in Fullscreen mode!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Stretch mode</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD Box</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Square</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam Banner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam vertical cover</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Requires restart to apply</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Settings</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">General</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Top panel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Appearance</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Game Details</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Advanced</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Input</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Performance</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Updating</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Search</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Backup</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Backup Library Data</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Restore Data Backup</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Import changes in library automatically</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Invalid database file location, proper file path must be set.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Account name cannot be empty.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Download metadata after importing games</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Launch Playnite minimized</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Launch Playnite when you start your computer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Start closed to tray</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Failed to register Playnite to launch when computer starts.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Launch in Fullscreen Mode</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asynchronous image loading</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Can improve scrolling smoothness of game lists in exchange for slower image load times.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Show game name if cover art is missing</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Show game names on Grid view</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Darken not installed games</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Show game icons on Details view list</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Show item count on group descriptions</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Show only assigned fields on filter and explorer panels</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Disable hardware acceleration</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Use when experiencing stuttering or similar UI issues</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Show hidden games in quick launch lists</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Affects Jump List and tray menu lists.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Number of quick launch items</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Use game background image as window background</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Blur background</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">High Quality</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Darken background</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Show on Grid view</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Theme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Theme Profile</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Fullscreen Theme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Fullscreen Theme Profile</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Database Location</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Login status:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite Settings</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Clear web cache</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">May solve issues encountered while linking accounts.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Show system tray icon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimize Playnite to system tray</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimize Playnite to system tray when the application window is closed</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">When game starts:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">After game closes:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Format time played to indicate the number of days played</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Dates formats:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">This will log you out of all linked services. Application restart is required, do you want to proceed?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Clear Cache?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Playnite restart is required to apply new theme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Get more themes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Create new theme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Get more extensions</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Create new extension</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Help us translate Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite needs to be restarted in order to apply new settings. Restart now?\r\n\r\nRestarting will cancel any active tasks (downloads) currently in progress.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Restart Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite cannot move your library files automatically. You must manually move/copy the files before changing the location. If there is no library in the target location, a new one will be created.\r\n\r\nThe new database location will not be used until Playnite is restarted. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Play time will not be recorded if \"Close\" action is set.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Number of rows</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Number of columns</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Number of detail view rows</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Show Background Image on Main Screen</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Doesn't apply retrospectively to existing games without re-downloading metadata.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Import playtime of games in library:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Configures when should Playnite import the playtime reported by library plugins for games in the Playnite database. Support by the library plugins in charge of handling the game(s) is needed to be able to use this feature.\r\n\r\nAlways: Imports playtime for new imported and existing games in Playnite database.\r\nOnly for newly imported games: Imports playtime only for new imported games.\r\nNever: Never imports playtime under any circumstance.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Always</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Only for newly imported games</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Never</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Enable controller support in Desktop Mode</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Guide button opens Fullscreen mode</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Automatic Metadata download settings for newly imported games.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Target display</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Always use primary display</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Show Game Titles</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Show Battery Status</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Show Battery Percentage</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Show Clock</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Hide Mouse Cursor</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Installed Only in Quick Filters</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Button Prompts</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Horizontal Scrolling</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Select one of the subsections</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">No settings available</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Failed to load settings</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">These scripts are executed for every game in the library. Individual scripts can be assigned to each game separately while editing game details.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animate background image transitions</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Font sizes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Auto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Aliased</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Grayscale</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Display</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Text formatting mode</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Text rendering mode</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Text rendering and formatting methods are currently not used for game descriptions.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Preload background images</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">If enabled, Playnite will download background artwork while downloading metadata, using more disk space and making artwork available when offline.\r\n\r\nIf disabled, background artwork is downloaded only when first needed, using less space, but may result in a delay before artwork is displayed and some images might not be available when offline.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Automatically close third party client after game exits</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Client shutdown delay (in seconds)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Don't close after game sessions shorter than (in seconds)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Automatically close following clients:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Auto Close Clients</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Import Exclusion List</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Display warning when assigning too large game media</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Folder open command</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Preferred age rating organization</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Update install size of games on library update</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Scans and updates the install size of games if it is detected that their files have been modified since the last scan</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">None</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Fill</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Uniform</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Uniform to fill</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Left</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Right</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Top</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Bottom</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Import Error</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Authentification required</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Authentification failed</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Alternative web view rendering mode</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Use when experiencing issues with web views, for example integration authentication dialogs.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Partial loading of large game descriptions</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Large descriptions can cause noticeable lag when selecting games.\r\n\r\nWhen enabled, only part of description text will be initially loaded with an option to load the rest on demand.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Metadata Import</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Download Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Set selected configuration to be used for any future metadata downloads.\r\nCan also be changed in application settings.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Emulation Import Wizard</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">This wizard will guide you through the process of downloading and importing console emulators and importing emulated games.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Keep in mind that you can always add additional emulators and/or games later via main menu (under \"Library\" menu for Emulator settings and \"Add Games\" menu for emulated games).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Below is a list of emulators that Playnite can recognize and configure automatically. You can download emulator installers from their websites. Once you have the emulators installed (manually), you can import them on emulator configuration dialog.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">You can import any emulators that are installed on your PC by clicking the 'Autodetect From Folder…' button. Playnite will search the selected folder for any known emulators and provide the option to import them. You can use this button multiple times to import emulators from different folders. Emulators will be added to the bottom of the current list.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">You can import games by clicking the 'Scan Folder Using Emulator' button. Selecting the appropriate emulator will tell Playnite which file types should be scanned and imported. You can use this button multiple times to import games from different folders. Games will be added to the bottom of the current list.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">There are no emulators selected for import. You won't be able to automatically import any emulated games without configuring emulators first. Are you sure you want to continue and exit import process?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">There are no emulators configured in Playnite. You cannot import games without first configuring the emulator and selecting the appropriate file types. Do you want to add some emulators now?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Scan folder using Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Select files</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Autodetect From Folder…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Configure Emulators…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Scanning…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Scanning {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">First Time Configuration</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">This process will guide you through an automatic import and configuration of external game libraries. Playnite can automatically import games from multiple game services, such as Steam or GOG.\r\n\r\nKeep in mind that you can also manually add any custom or emulated game for any platform later from main menu.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Library Integration</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Following is the list of some curated library integrations Playnite supports. Please select ones you want to install.\r\n\r\nMore integrations can be installed later from \"Add-ons\" menu.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Configuration Finished</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">The initial setup has been completed. Remember that you can change all settings later as well as add additional integrations from main menu.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Failed to download one or more extensions.\r\n\r\nYou can try to re-download integrations from add-ons menu after first run wizard finishes.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Downloading {0} integration…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Downloading list of recommended integrations…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Failed to download list of recommended integrations. You can try and re-download integrations later via the Addons menu.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Configure Platforms and Emulators</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Configure Emulators</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platforms</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulators</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Add Platform</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Select Icon</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Select Cover</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Select Image</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Select Item</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Select Background</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Select File</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Select URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Add Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Supported Platform(s)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Do you want to save platform changes?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Do you want to save emulator changes?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Executable</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Arguments</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Working Directory</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Supported File Types</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Import Emulators…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Download Emulators…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Load arguments preset from known emulator profile</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Are you sure you want to remove {0} emulator?\r\nIt's currently being used by {1} game(s).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Are you sure you want to remove {0} platform?\r\nIt's currently being used by {1} game(s) and {2} emulator(s).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Settings help</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sort By</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Sort Direction</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Group By</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Ascending</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Descending</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Don't group</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Group by Library</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Group by Category</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Group by Platform</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">View Type</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">View</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Explorer Panel</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Filter Panel</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Icon</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Library Icon</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Cover Image</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Background Image</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Sorting Name</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Library</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manual</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Name</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Install Drive</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Account Name</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Category</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Genre</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Release Date</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Release Year</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Developer</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Tag</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Publisher</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Installation Status</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Match all filters</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">If enabled, only games that use all the items in all the filters will be included in the view.\r\nIf disabled, games that use any item in any filter will be included in the view.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Installed</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Installed</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Not installed</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Hidden</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favorite</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Enable HDR Support</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">If enabled, HDR will be enabled on the primary display before starting the game.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Note that HDR is not supported on your primary display.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Last Played</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Category</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Description</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Installation Folder</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Cover Image</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Image, ROM or ISO Path</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Genre</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Genres</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Company</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Companies</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Developer</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Developers</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Publisher</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Publishers</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Category</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Categories</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Tag</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Tags</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Feature</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Features</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Age Rating</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Age Ratings</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Region</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regions</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Source</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Sources</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Recent Activity</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Database Error</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Failed to open library database.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Database is not opened.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Cannot access library database. File \"{0}\" is being used by another process or it's in inaccessible location.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Failed to create diagnostics package.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Failed to automatically upload diagnostics package.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Diagnostics information was sent successfully.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">The diagnostics package has been created and submitted successfully.\r\nPlease attach the following ID to your issue report:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Failed to import games from {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Failed to import emulated games from {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Cannot search for games by selected emulator profile. Profile doesn't contain any file extensions or platforms.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite failed to start. Please close all other instances and try again.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Failed to apply theme \"{0}\", color profile \"{1}\"\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Cannot open link, URL is not in valid format.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Failed to start the application.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Failed to initialize web view component. Playnite cannot continue with startup process.\r\n\r\nMore information at https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Cannot import emulators due to missing or corrupted definition file.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Failed to execute menu action.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Edit Game Details</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Image URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Add Link</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Add ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Save Changes</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Apply field changes to game(s) being edited.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Add Action</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Remove</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Remove Play Action</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Add Games</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Scan Folder…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Detect Installed</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Browse…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Open Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Profile Settings</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Game name cannot be empty.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Game action tracking directory cannot be empty.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Game name cannot be empty before searching metadata.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Invalid game data</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Enter valid web URL starting with http:// or https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Select URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Failed to download metadata: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Download Error</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Clear Filters</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Private Account</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Public Account</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API Key</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Startup Error</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Theme Error</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Clear All</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Installing</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Uninstalling</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Launching</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Running</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Invalid URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Do nothing</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimize</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Restore window</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Restore window only when launched from UI</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Close</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Change</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Advanced</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Never</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Completion Status</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Completion Statuses</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">User Score</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Critic Score</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Community Score</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Game scripts</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Application scripts</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Plugins</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Metadata Sources</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Extensions</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Extension ID</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Reload Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Interactive SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">All scripts reloaded successfully.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">No games found for specified search/filter criteria</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">No items found</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Switch to Desktop Mode</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Exit Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Libraries</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Update All</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Created By:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Version:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Updated:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Module:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Library</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistics</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">All</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">None</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Notifications</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Width</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Height</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Size</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Small</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Large</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Larger</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Largest</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Default</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Select</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Select All</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Deselect All</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">First</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Random</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">User select</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Load more</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Transparent</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Collapse</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Expand</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Collapse All</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Expand All</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Other</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Themes</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Emulator Arguments</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Built-in Arguments</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Custom Arguments</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Additional Emulator Arguments</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Override Emulator Arguments</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Play action</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Select metadata to import</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Select Games to Import</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Metadata search</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Update Available</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Changes since last update</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Download and Install Update</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Check for Updates</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Update Error</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Failed to check for new version.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">No new version found, you are up to date.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Failed to download and install update.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Some background task is currently in progress. Do you want to cancel it and proceed with the update?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Some background task is currently in progress. Do you want to cancel it and exit Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Some background task is currently in progress. Switching modes will cancel the task, do you want to switch anyways?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">An update for Playnite is available</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Reload theme list</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Apply selected theme</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Watch file changes</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Automatically apply theme when the source file changes</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Script runtime</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Execute before starting a game</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Execute after exiting a game</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Execute after a game is started</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Execute on application start</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Execute on application shutdown</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Game starting script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Game started script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Game stopped script</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Execute global script</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtered</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Current</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">New</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Test script</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Show only selected items.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Save as default</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Add to Favorites</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Remove from Favorites</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Hide this game</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Remove from Hidden</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Enable HDR Support</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Disable HDR Support</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Edit…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Calculate install size</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Calculate install size (All games)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Calculate install size (Only missing data)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Install size</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Set Category…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Set Completion Status</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Remove</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Play</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Install</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Game Options</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Details</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Uninstall</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Open Installation Location</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Create Desktop Shortcut</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Open Manual</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">More</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Managed by the library plugin</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">The game starting process will be managed by the library plugin responsible for this game.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">No relevant information about the '{0}' game has been found on the specified page.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Tip: You can use more advanced metadata download process while editing single game via \"Edit\" menu option.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Not available when some action is in progress.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Description text is HTML syntax sensitive</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Game time is recorded in seconds.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Install size is indicated in bytes.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Release date must be set in 'year-month-day' format. Month and Day values can be omitted.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Values from 0 to 100 or empty for no score.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Playnite's development is supported by these patrons and Ko-fi members:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Code, localization and other contributors in no particular order:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Cancel game monitoring?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Installation monitoring is currently running. Do you want to cancel the process and return the game to the previous state?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Game execution monitoring is currently running. Do you want to cancel the process and return the game to the previous state?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Time Played</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Last Played</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}d {1}h {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minutes</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} seconds</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Not Played</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Opening Desktop mode…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Opening Fullscreen mode…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Loading game library…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Calculating install size…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Calculating install size of {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Failed to install script file.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Script installed successfully.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Install Script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Script error</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Failed to execute extension function.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Open metadata folder</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Calculate</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Automatically calculates the install size using the ROMs if the game has any or the installation directory if it has been set</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} client is not installed.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} client will now open. Please sign in and then close this message.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Waiting for user to sign in, please close this when you're done…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Game's installation folder not found.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Invalid game action configuration.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Troubleshooting account sync issues</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Troubleshooting issues</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Rename item</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Add new item</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Enter name</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Enter new name</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Less than an hour</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 to 10 hours</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 to 100 hours</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 to 500 hours</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 to 1000 hours</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">Over 1000 hours</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite must be restarted to complete the installation. Do you want to restart now?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Extension is not packaged properly.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Theme is not packaged properly.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Extension \"{0}\" failed to load properly.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Can't load \"{0}\" extension, current Playnite version is not supported.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Theme \"{0}\" failed to load properly.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Can't load \"{0}\" theme, current Playnite version is not supported.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Extension failed to load properly.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Theme failed to load properly.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Theme/Extension is using unsupported API version.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Installation was successful.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Install add-on?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Generic</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Failed to install \"{0}\" add-on.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Failed to install extension.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Do you want to install a new extension?\r\n\r\n{0}\r\nBy {1}\r\nVersion {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Do you want to update \"{0}\" extension?\r\n\r\nCurrent version: {1}\r\nNew version: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Failed to install theme.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Do you want to install a new theme?\r\n\r\n{0}\r\nBy {1}\r\nVersion {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Do you want to update \"{0}\" theme?\r\n\r\nCurrent version: {1}\r\nNew version: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">You are about to leave Playnite and navigate to the following web page using your default web browser. Do you want to continue?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">The selected image(s) might be too large for optimal performance. Using very large images can result in worse UI responsiveness and increased memory usage. \r\n\r\nMaximum recommended resolutions:\r\nIcons: {0} mega pixels\r\nCovers: {1} mega pixels\r\nBackgrounds: {2} mega pixels</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Performance Warning</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Don't Show Again</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">File with extension {0} is not compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Incompatible file extension</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Selected image file might be too large for optimal performance.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Are you sure you want to uninstall selected theme? Uninstallation will be queued to next application start.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Built-in themes can't be uninstalled.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">This theme doesn't support this version of Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Are you sure you want to uninstall selected extension? Uninstallation will be queued to next application start.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Built-in extensions can't be uninstalled.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">This extension doesn't support this version of Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Installation folder</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Data folder</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Generating diagnostics package…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Uploading diagnostics package…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Import file…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">What is this?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Are you sure you want to do this?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Total play time</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Average play time</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Top play time</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Total install size</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Overview</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Sidebar</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Show on Sidebar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Reset settings</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">All application settings will be reset to default values, excluding:\r\n- Database location\r\n- Import exclusion list\r\n- Extension settings, including library integrations\r\n    \r\nApplication restart is requred to finish the process. Do you want to reset settings?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">For developers</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">External extensions</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Enter full folder path.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Achievements</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">News</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Store Page</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">The initial setup is not complete. Playnite will now restart to Desktop Mode to finish the procedure.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Recently Played</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favorites</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Most Played</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">All</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">There are filters applied.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">There are additional filters applied.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Showing search results for:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">An item with the same name already exists.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Limit selection to current filter</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Pick another</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Add-ons…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Installed</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Extensions settings</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Browse</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Updates</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Updates ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Management of installed extensions and themes, including their settings, has been moved to a new \"Add-ons\" menu.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">All currently installed library integration extensions can be configured here.\r\n\r\nIf you want to install or uninstall additional integrations, use \"Add-ons\" option from main menu.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Themes Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Themes Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Searching…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Add-on is not compatible with this version of Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Failed to download add-on installation package.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Failed to download add-on installation manifest.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Application restart is required to apply pending changes.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">This add-on is scheduled for installation.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Install</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Re-install</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Uninstall</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Already installed</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">No new add-on updates found.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Update add-ons</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Changelog is not available</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Scheduled for installation</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Download failed</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">License rejected</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Downloading {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Looking for add-on updates…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Looking for program updates…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">One or more add-on updates are available.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Select items to update</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Extension development instance</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} license agreement</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Accept</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Decline</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Include library integration play actions</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Select action</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Tracking Mode</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Tracking Path</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Initial tracking delay</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Tracking frequency</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Link</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">File</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Script</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Default</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Process</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Folder</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Original process</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Process name</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Log trace messages</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Following changes overwrite data for all currently selected games!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">None</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Uniform</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Items only</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Start and end only</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Scrolling sensitivity</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Smooth scrolling</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Animation speed</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Remove item?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Are you sure you want to remove this item?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Show buttons on top panel:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">General view settings</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Grouping settings</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Sorting settings</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Filter presets</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Plugin items position</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Section separator width</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Move main menu button to the sidebar</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Explorer panel</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Random game picker</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Views random game selector</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Select random game from the view</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Save grouping and sorting settings</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Show as quick filter in Fullscreen mode</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">In past 7 days</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">In past 31 days</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">In past 365 days</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">More than 365 days ago</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Configure</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Save preset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Minimize after starting game</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Minimize Playnite after a game is started.\r\n\r\nDisabling this can lead to issues with games not getting input focus on startup!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Font Size</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Font Size Small</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">Enable game controller API support</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Game controller support</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">If disabled, Playnite won't accept any game controller inputs.\r\n        \r\nDisable if you use tools that translates game controller inputs to mouse/keyboards inputs and you are getting double inputs in Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Show items on main menu:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Inverted X/A main view button binding</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Swaps button bindings for starting a game and showing game details page on main view.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Swap confirmation/cancelation button binding</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Inverts A/B button bindings for confirmation and cancellation.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Primary controller only</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Only accept inputs from primary controller when enabled.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Guide button focuses Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Interface volume</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Background volume</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Mute when in background</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Failed to initialize audio interface.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Output API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API used for audio output. Change if you are experiencing issues with sound.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">General</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Visuals</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Audio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Input</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} is starting…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} is running…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Caps</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Space</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Image rendering scaler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternative</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Balanced</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Quality</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Quality:\r\nBest image quality, slow, high memory usage.\r\n    \r\nBalanced:\r\nGood quality, fast, low memory usage.\r\n    \r\nAlternative:\r\nBetter quality, medium speed, low memory usage.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Select file…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Select folder…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Startup script</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Please note that both extensions and themes can greatly affect Playnite's performance, stability and security.\r\n    \r\nIf you start experiencing some issues after installing a theme or an extension, try disabling/uninstalling them first to see if they are root of the issue.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Choose on startup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Choose on startup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Built-in profiles</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Built-in profile</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Custom profiles</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Custom profile</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Handled by a built-in script</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Emulator specification</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Platform specification</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Region specification</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Execute before starting emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Execute after emulator is started</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Execute after exiting emulator</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Emulator executable not found.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Emulator specification not found.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Emulator startup script not found.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Split as separate games</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Merge into one game</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Set platform</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Set region</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Scan folder</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Scan configurations</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Exclude patterns from checksum scan</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Files matching specified pattern(s) won't be scanned for checksum and will be matched by file name. See emulator help page for more information.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Scan with emulator</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Name has to be set when saving new configuration.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Emulator or emulator profile is not set.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Directory to scan is not specified or it doesn't exist.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Scan configuration is not set properly.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Include in bulk scan auto-scan</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Failed to scan folder for emulators.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Failed to scan folder(s) for emulated games.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Hide imported</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Profiles to import:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Auto-scan configurations</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Save as auto-scan configuration</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Saves configuration for later use during library update. Saved configurations can be managed via \"Configure Emulators\" menu.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Import using relative paths</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">If possible import game files using paths relative to Playnite's installation folder or emulator's installation folder.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Scan subfolders</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Scan inside archives</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Merge related files</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Merge related game files, like individual game discs, under one game entry.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Add scanner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Add saved scanner</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Start scan</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Add scan configuration(s) with emulators to scan specific folders. Make sure that emulators are properly configured prior to importing games (via Library -> Configure Emulators menu).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Default status assigned to newly added games</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Status assigned to games played for the first time</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Failed to initialize PowerShell script runtime. If you are Windows 7 user, try (re)installing PowerShell 5.1 to fix the issue.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Filter preset with specified name already exists. Update preset with new settings?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Automatically fill missing sorting names for batch-added or edited games</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">When you edit a game, add games via a library update, an emulator folder scan, or a normal folder scan, automatically fill the \"Sorting Name\" field with a better sortable representation of the game's name. For example \"The Witcher 3\" will get a Sorting Name of \"Witcher 03\". This will never set a sorting name that doesn't differ from the game name, and it will only automatically update sorting names that are empty.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">These words will be removed from the start of the automatically filled Sorting Name value:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Use this for ignoring words at the start of a string for sorting purposes. The default is \"The\", \"An\", and \"A\".</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Fill Sorting Name for games without one</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Sorting</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Filling Sorting Name values…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Nahimic service has been detected to be running on your system. This service is known to cause rendering issues to Playnite (and other apps).\r\n\r\nIf you encounter any graphics corruption or other rendering issues in Playnite, we recommend disabling or completely uninstalling Nahimic service.\r\n\r\nMore information at https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite is running with elevated privileges (as an administrator). This is not recommended since it gives elevated privileges to all installed extensions and all games/apps started from Playnite!\r\n\r\nMore information at https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Show warning if Playnite is running with elevated privileges</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Get the real size on drive when calculating the size of games</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">If enabled, scans will be slower and will get the real size that files use in the drive.\r\nIf disabled, scans will be faster and will use the size of the files themselves.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Following add-on(s) have been reported as potentially problematic, either due to high stability/performance impact or security issues. We strongly recommend that you uninstall them:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Exclude online files from scan</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Files stored on cloud storage won't be scanned and imported if not available locally.\r\nSupported only for: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Scan but using simplified method without file content</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Files will be imported but using less accurate method that doesn't require file content to be downloaded and present locally.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Apply to all</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Override installation state</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">When set, Playnite will ignore installation state (including installation directory) set by the integration plugin that imports this game.\r\n        \r\nThis option may not fully work with plugins that use specific game import method unless they also take this override option into account.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Only manually</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Once a day</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Once a week</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">On every startup</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Check for program updates</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Check for add-on updates</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Update libraries</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Scan emulation folders</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Include hidden games</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Edit fields</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Select / Deselect all</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Open</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Activate</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Assign</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Start typing to search for games… [F1] for help</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Starting with # brings up a list of available commands.\r\nStarting with / brings up a list of available search providers/plugins.\r\nTyping search keyword and ending with SPACE switches immediately to that search.\r\n\r\nTAB: switch action\r\nENTER: activate selected action\r\nSHIFT-ENTER: open item menu</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Include uninstalled games</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Include hidden games</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Uninstalled games included</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Uninstalled games excluded</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Hidden games included</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Hidden games excluded</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Play or Install</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Go to details</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Game menu</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Edit game</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Open search</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Search box</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Search button</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Primary game action</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Secondary game action</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F opens global search instead of focusing search box</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Save game filter settings between search sessions</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Search providers</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Default keyword</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Custom keyword</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">System wide shortcut</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite search</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Extension Settings</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Exclusions</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Excluded files relative to scan folder</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Excluded folders relative to scan folder</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Add file to exclusion list</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Add folder to exclusion list</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Exclusions can be only added to saved scanner configurations.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Exclusions have been added to \"{0}\" scanner.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Override platform</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">When set, scanner will assign this platform to all games, overwriting any automatically detected platforms.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Include commands in default search</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">When disabled, commands won't be included in default search until # prefix is used.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Use fuzzy matching in name filter</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\"  xml:space=\"preserve\">When enabled, name filter will match game names the same way as global search.\r\nStrict matching can be enforced on an individual case by prefixing filter with ! character.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Fields to be displayed for game results:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Hidden Status</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Data backup was cancelled.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Data backup failed.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Data backup error</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Data backup in progress…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Restoring data from backup…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Failed to restore data from backup.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Settings</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Game library</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Game library media</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Installed extensions</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Extensions data</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Installed themes</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Select data to be restored from specified backup file.\r\n    \r\nPlaynite will automatically restart to start backup restore process.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Select items to be included with data backup. Application settings and game library data are included by default.\r\n    \r\nPlaynite will automatically restart to start backup process.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Automatic data backup</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Auto backup frequency</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Backup folder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Rotating backups</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Include additional data:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Backup folder needs to be set if auto backup is enabled.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Show notifications for patch releases only</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">When enabled, only updates available for currently installed major release will result in update notification.\r\nNew major releases will not result in update notification.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Use relative dates for the past week</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Use relative dates in \"Today\", \"Yesterday\" etc. format if the date is less than a week old.\r\n    \r\nThe specified date format will be used for all other dates.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Web image search</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Icon image search string</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Cover image search string</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Background image search string</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Getting add-on information…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">No metadata source is available</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Play action settings</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Use scanner settings</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Select profile on startup</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Select emulator on startup</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automatic</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Always on</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Always off</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Accessibility (screen reader) support</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Application menu</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Game menu</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Program folder</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">User data directory</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Library file corruption has been detected, Playnite will now shutdown.\r\n    \r\nOpen new issue on Playnite's GitHub page with a request to fix corruption in your files.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Do you want to save changes you made?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Portable installation</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">No controllers detected</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/LocalizationKeys.cs",
    "content": "///\r\n/// DO NOT MODIFY! Automatically generated via buildLocConstants.ps1 script.\r\n/// \r\nnamespace Playnite\r\n{\r\n    public static class LOC\r\n    {\r\n        /// <summary>\r\n        /// English\r\n        /// </summary>\r\n        public const string LanguageName = \"LanguageName\";\r\n        /// <summary>\r\n        /// Playnite language\r\n        /// </summary>\r\n        public const string LanguageSettingsLabel = \"LOCLanguageSettingsLabel\";\r\n        /// <summary>\r\n        /// Exit\r\n        /// </summary>\r\n        public const string ExitAppLabel = \"LOCExitAppLabel\";\r\n        /// <summary>\r\n        /// Filter Active\r\n        /// </summary>\r\n        public const string FilterActiveLabel = \"LOCFilterActiveLabel\";\r\n        /// <summary>\r\n        /// Filter Disabled\r\n        /// </summary>\r\n        public const string FilterInactiveLabel = \"LOCFilterInactiveLabel\";\r\n        /// <summary>\r\n        /// Additional filters\r\n        /// </summary>\r\n        public const string AditionalFilters = \"LOCAditionalFilters\";\r\n        /// <summary>\r\n        /// Filters\r\n        /// </summary>\r\n        public const string Filters = \"LOCFilters\";\r\n        /// <summary>\r\n        /// Filter\r\n        /// </summary>\r\n        public const string Filter = \"LOCFilter\";\r\n        /// <summary>\r\n        /// Invalid Data\r\n        /// </summary>\r\n        public const string InvalidDataTitle = \"LOCInvalidDataTitle\";\r\n        /// <summary>\r\n        /// Save Changes?\r\n        /// </summary>\r\n        public const string SaveChangesAskTitle = \"LOCSaveChangesAskTitle\";\r\n        /// <summary>\r\n        /// Homepage at www.playnite.link\r\n        /// </summary>\r\n        public const string AboutHomePageLink = \"LOCAboutHomePageLink\";\r\n        /// <summary>\r\n        /// Source Code at GitHub\r\n        /// </summary>\r\n        public const string AboutSourceLink = \"LOCAboutSourceLink\";\r\n        /// <summary>\r\n        /// Create diag. package\r\n        /// </summary>\r\n        public const string AboutCreateDiagButton = \"LOCAboutCreateDiagButton\";\r\n        /// <summary>\r\n        /// Send diag. information\r\n        /// </summary>\r\n        public const string AboutSendDiagButton = \"LOCAboutSendDiagButton\";\r\n        /// <summary>\r\n        /// About Playnite\r\n        /// </summary>\r\n        public const string AboutWindowTitle = \"LOCAboutWindowTitle\";\r\n        /// <summary>\r\n        /// Made by Josef Němec\r\n        /// </summary>\r\n        public const string AboutAuthor = \"LOCAboutAuthor\";\r\n        /// <summary>\r\n        /// Assign Category\r\n        /// </summary>\r\n        public const string CategoryWindowTitle = \"LOCCategoryWindowTitle\";\r\n        /// <summary>\r\n        /// Set Categories\r\n        /// </summary>\r\n        public const string CategorySetButton = \"LOCCategorySetButton\";\r\n        /// <summary>\r\n        /// Add Category\r\n        /// </summary>\r\n        public const string CategoryAddCatButton = \"LOCCategoryAddCatButton\";\r\n        /// <summary>\r\n        /// Checked - Assign category\r\n        /// </summary>\r\n        public const string CategoryTooltip = \"LOCCategoryTooltip\";\r\n        /// <summary>\r\n        /// No Category\r\n        /// </summary>\r\n        public const string NoCategory = \"LOCNoCategory\";\r\n        /// <summary>\r\n        /// No Platform\r\n        /// </summary>\r\n        public const string NoPlatform = \"LOCNoPlatform\";\r\n        /// <summary>\r\n        /// Whoops! Something went wrong…\r\n        /// </summary>\r\n        public const string CrashWindowTitle = \"LOCCrashWindowTitle\";\r\n        /// <summary>\r\n        /// An unrecoverable error has occurred.\r\n        /// </summary>\r\n        public const string CrashDescription = \"LOCCrashDescription\";\r\n        /// <summary>\r\n        /// Extension \"{0}\" caused an unrecoverable error.\r\n        /// </summary>\r\n        public const string ExtCrashDescription = \"LOCExtCrashDescription\";\r\n        /// <summary>\r\n        /// Extension \"{0}\" caused an unrecoverable error.\r\n        /// </summary>\r\n        public const string ExtCrashDescriptionFS = \"LOCExtCrashDescriptionFS\";\r\n        /// <summary>\r\n        /// Unknown extension or a theme caused an unrecoverable error.\r\n        /// </summary>\r\n        public const string ExtCrashDescriptionUknown = \"LOCExtCrashDescriptionUknown\";\r\n        /// <summary>\r\n        /// Unrecoverable error occurred.\r\n        /// </summary>\r\n        public const string CrashDescriptionFullscreen = \"LOCCrashDescriptionFullscreen\";\r\n        /// <summary>\r\n        /// Disable extension\r\n        /// </summary>\r\n        public const string CrashDisableExtension = \"LOCCrashDisableExtension\";\r\n        /// <summary>\r\n        /// Save log file\r\n        /// </summary>\r\n        public const string CrashSaveLog = \"LOCCrashSaveLog\";\r\n        /// <summary>\r\n        /// Send diag. info\r\n        /// </summary>\r\n        public const string CrashSendDiag = \"LOCCrashSendDiag\";\r\n        /// <summary>\r\n        /// Report Crash\r\n        /// </summary>\r\n        public const string CrashReportIssue = \"LOCCrashReportIssue\";\r\n        /// <summary>\r\n        /// Restart Playnite\r\n        /// </summary>\r\n        public const string CrashRestartPlaynite = \"LOCCrashRestartPlaynite\";\r\n        /// <summary>\r\n        /// Restart in Safe Mode\r\n        /// </summary>\r\n        public const string CrashRestartSafe = \"LOCCrashRestartSafe\";\r\n        /// <summary>\r\n        /// Disabling all 3rd party extensions and using default theme.\r\n        /// </summary>\r\n        public const string CrashRestartSafeTooltip = \"LOCCrashRestartSafeTooltip\";\r\n        /// <summary>\r\n        /// Exit Playnite\r\n        /// </summary>\r\n        public const string CrashClosePlaynite = \"LOCCrashClosePlaynite\";\r\n        /// <summary>\r\n        /// Actions taken before the crash (in English):\r\n        /// </summary>\r\n        public const string CrashUserActionsDescription = \"LOCCrashUserActionsDescription\";\r\n        /// <summary>\r\n        /// Library Manager\r\n        /// </summary>\r\n        public const string LibraryManager = \"LOCLibraryManager\";\r\n        /// <summary>\r\n        /// Remove Game(s)?\r\n        /// </summary>\r\n        public const string GameRemoveAskTitle = \"LOCGameRemoveAskTitle\";\r\n        /// <summary>\r\n        /// Cannot remove - Game or installer is running. \r\n        /// </summary>\r\n        public const string GameRemoveRunningError = \"LOCGameRemoveRunningError\";\r\n        /// <summary>\r\n        /// Cannot uninstall - Game is running.\r\n        /// </summary>\r\n        public const string GameUninstallRunningError = \"LOCGameUninstallRunningError\";\r\n        /// <summary>\r\n        /// Are you sure you want to remove {0}?\r\n        /// </summary>\r\n        public const string GameRemoveAskMessage = \"LOCGameRemoveAskMessage\";\r\n        /// <summary>\r\n        /// Are you sure you want to remove {0} games?\r\n        /// </summary>\r\n        public const string GamesRemoveAskMessage = \"LOCGamesRemoveAskMessage\";\r\n        /// <summary>\r\n        /// Are you sure you want to remove {0}?\r\n        /// </summary>\r\n        public const string GameRemoveAskMessageIgnoreOption = \"LOCGameRemoveAskMessageIgnoreOption\";\r\n        /// <summary>\r\n        /// Are you sure you want to remove {0} games?\r\n        /// </summary>\r\n        public const string GamesRemoveAskMessageIgnoreOption = \"LOCGamesRemoveAskMessageIgnoreOption\";\r\n        /// <summary>\r\n        /// Are you sure you want to remove {0} entries that are currently not in use?\r\n        /// </summary>\r\n        public const string RemoveUnusedFieldsAskMessage = \"LOCRemoveUnusedFieldsAskMessage\";\r\n        /// <summary>\r\n        /// No unused fields found.\r\n        /// </summary>\r\n        public const string RemoveUnusedFieldsNoUnusedMessage = \"LOCRemoveUnusedFieldsNoUnusedMessage\";\r\n        /// <summary>\r\n        /// Yes (add to exclusion list)\r\n        /// </summary>\r\n        public const string RemoveAskAddToExlusionListYesResponse = \"LOCRemoveAskAddToExlusionListYesResponse\";\r\n        /// <summary>\r\n        /// There are unsaved changes in this section\r\n        /// </summary>\r\n        public const string GameEditChangeNotif = \"LOCGameEditChangeNotif\";\r\n        /// <summary>\r\n        /// Updating game library format…\r\n        /// </summary>\r\n        public const string DBUpgradeProgress = \"LOCDBUpgradeProgress\";\r\n        /// <summary>\r\n        /// Database update failed.\r\n        /// </summary>\r\n        public const string DBUpgradeFail = \"LOCDBUpgradeFail\";\r\n        /// <summary>\r\n        /// Cannot update game library. {0} MBs of free space is required.\r\n        /// </summary>\r\n        public const string DBUpgradeEmptySpaceFail = \"LOCDBUpgradeEmptySpaceFail\";\r\n        /// <summary>\r\n        /// GameError\r\n        /// </summary>\r\n        public const string GameError = \"LOCGameError\";\r\n        /// <summary>\r\n        /// Cannot start game. '{0}' was not found in database.\r\n        /// </summary>\r\n        public const string GameStartErrorNoGame = \"LOCGameStartErrorNoGame\";\r\n        /// <summary>\r\n        /// Cannot start game: {0}\r\n        /// </summary>\r\n        public const string GameStartError = \"LOCGameStartError\";\r\n        /// <summary>\r\n        /// Cannot start action: {0}\r\n        /// </summary>\r\n        public const string GameStartActionError = \"LOCGameStartActionError\";\r\n        /// <summary>\r\n        /// Cannot open game location: {0}\r\n        /// </summary>\r\n        public const string GameOpenLocationError = \"LOCGameOpenLocationError\";\r\n        /// <summary>\r\n        /// Could not detect game install size: {0}\r\n        /// </summary>\r\n        public const string CalculateGameSizeError = \"LOCCalculateGameSizeError\";\r\n        /// <summary>\r\n        /// Install size scan error\r\n        /// </summary>\r\n        public const string CalculateGameSizeErrorCaption = \"LOCCalculateGameSizeErrorCaption\";\r\n        /// <summary>\r\n        /// There were {0} errors during install size scan\r\n        /// </summary>\r\n        public const string CalculateGamesSizeErrorMessage = \"LOCCalculateGamesSizeErrorMessage\";\r\n        /// <summary>\r\n        /// Failed to create shortcut: {0}\r\n        /// </summary>\r\n        public const string GameShortcutError = \"LOCGameShortcutError\";\r\n        /// <summary>\r\n        /// Failed to open manual: {0}\r\n        /// </summary>\r\n        public const string ManualOpenError = \"LOCManualOpenError\";\r\n        /// <summary>\r\n        /// Cannot install game: {0}\r\n        /// </summary>\r\n        public const string GameInstallError = \"LOCGameInstallError\";\r\n        /// <summary>\r\n        /// Cannot un-install game: {0}\r\n        /// </summary>\r\n        public const string GameUninstallError = \"LOCGameUninstallError\";\r\n        /// <summary>\r\n        /// No valid game startup actions found. When using emulator actions, make sure platform definitions match between the game and emulator configuration.\r\n        /// </summary>\r\n        public const string ErrorNoPlayAction = \"LOCErrorNoPlayAction\";\r\n        /// <summary>\r\n        /// Installation implementation is not available.\r\n        /// </summary>\r\n        public const string ErrorNoInstallAction = \"LOCErrorNoInstallAction\";\r\n        /// <summary>\r\n        /// The library plugin responsible for this game is disabled or not installed.\r\n        /// </summary>\r\n        public const string ErrorLibraryPluginNotFound = \"LOCErrorLibraryPluginNotFound\";\r\n        /// <summary>\r\n        /// Official metadata download is not available.\r\n        /// </summary>\r\n        public const string ErrorNoMetadataDownloader = \"LOCErrorNoMetadataDownloader\";\r\n        /// <summary>\r\n        /// No game is selected.\r\n        /// </summary>\r\n        public const string ErrorNoGameSelected = \"LOCErrorNoGameSelected\";\r\n        /// <summary>\r\n        /// Game's script execution failed.\r\n        /// </summary>\r\n        public const string ErrorGameScriptAction = \"LOCErrorGameScriptAction\";\r\n        /// <summary>\r\n        /// Application script execution failed.\r\n        /// </summary>\r\n        public const string ErrorApplicationScript = \"LOCErrorApplicationScript\";\r\n        /// <summary>\r\n        /// Global script execution failed.\r\n        /// </summary>\r\n        public const string ErrorGlobalScriptAction = \"LOCErrorGlobalScriptAction\";\r\n        /// <summary>\r\n        /// Emulator script execution failed.\r\n        /// </summary>\r\n        public const string ErrorEmulatorScriptAction = \"LOCErrorEmulatorScriptAction\";\r\n        /// <summary>\r\n        /// Play script action execution failed.\r\n        /// </summary>\r\n        public const string ErrorPlayScriptAction = \"LOCErrorPlayScriptAction\";\r\n        /// <summary>\r\n        /// PowerShell 3.0 or newer is not installed.\r\n        /// </summary>\r\n        public const string ErrorPowerShellNotInstalled = \"LOCErrorPowerShellNotInstalled\";\r\n        /// <summary>\r\n        /// Couldn't determine how to start the game.\r\n        /// </summary>\r\n        public const string ErrorStartupNoController = \"LOCErrorStartupNoController\";\r\n        /// <summary>\r\n        /// Enabled\r\n        /// </summary>\r\n        public const string EnabledTitle = \"LOCEnabledTitle\";\r\n        /// <summary>\r\n        /// Disabled\r\n        /// </summary>\r\n        public const string DisabledTitle = \"LOCDisabledTitle\";\r\n        /// <summary>\r\n        /// Remove\r\n        /// </summary>\r\n        public const string RemoveTitle = \"LOCRemoveTitle\";\r\n        /// <summary>\r\n        /// Remove unused\r\n        /// </summary>\r\n        public const string RemoveUnusedTitle = \"LOCRemoveUnusedTitle\";\r\n        /// <summary>\r\n        /// Rename\r\n        /// </summary>\r\n        public const string RenameTitle = \"LOCRenameTitle\";\r\n        /// <summary>\r\n        /// Copy\r\n        /// </summary>\r\n        public const string CopyTitle = \"LOCCopyTitle\";\r\n        /// <summary>\r\n        /// Add\r\n        /// </summary>\r\n        public const string AddTitle = \"LOCAddTitle\";\r\n        /// <summary>\r\n        /// Default Icon\r\n        /// </summary>\r\n        public const string DefaultIconTitle = \"LOCDefaultIconTitle\";\r\n        /// <summary>\r\n        /// Default Cover Image\r\n        /// </summary>\r\n        public const string DefaultCoverTitle = \"LOCDefaultCoverTitle\";\r\n        /// <summary>\r\n        /// Default Background Image\r\n        /// </summary>\r\n        public const string DefaultBackgroundTitle = \"LOCDefaultBackgroundTitle\";\r\n        /// <summary>\r\n        /// Finish\r\n        /// </summary>\r\n        public const string FinishLabel = \"LOCFinishLabel\";\r\n        /// <summary>\r\n        /// Next\r\n        /// </summary>\r\n        public const string NextLabel = \"LOCNextLabel\";\r\n        /// <summary>\r\n        /// Back\r\n        /// </summary>\r\n        public const string BackLabel = \"LOCBackLabel\";\r\n        /// <summary>\r\n        /// DONE\r\n        /// </summary>\r\n        public const string DoneCapLabel = \"LOCDoneCapLabel\";\r\n        /// <summary>\r\n        /// BACK\r\n        /// </summary>\r\n        public const string BackCapLabel = \"LOCBackCapLabel\";\r\n        /// <summary>\r\n        /// CLEAR\r\n        /// </summary>\r\n        public const string ClearCapLabel = \"LOCClearCapLabel\";\r\n        /// <summary>\r\n        /// Clear\r\n        /// </summary>\r\n        public const string ClearLabel = \"LOCClearLabel\";\r\n        /// <summary>\r\n        /// Dismiss\r\n        /// </summary>\r\n        public const string Dismiss = \"LOCDismiss\";\r\n        /// <summary>\r\n        /// Dismiss All\r\n        /// </summary>\r\n        public const string DismissAll = \"LOCDismissAll\";\r\n        /// <summary>\r\n        /// Import\r\n        /// </summary>\r\n        public const string ImportLabel = \"LOCImportLabel\";\r\n        /// <summary>\r\n        /// Name\r\n        /// </summary>\r\n        public const string NameLabel = \"LOCNameLabel\";\r\n        /// <summary>\r\n        /// Author\r\n        /// </summary>\r\n        public const string AuthorLabel = \"LOCAuthorLabel\";\r\n        /// <summary>\r\n        /// Module\r\n        /// </summary>\r\n        public const string ModuleLabel = \"LOCModuleLabel\";\r\n        /// <summary>\r\n        /// Series\r\n        /// </summary>\r\n        public const string SeriesLabel = \"LOCSeriesLabel\";\r\n        /// <summary>\r\n        /// Version\r\n        /// </summary>\r\n        public const string VersionLabel = \"LOCVersionLabel\";\r\n        /// <summary>\r\n        /// Last Played\r\n        /// </summary>\r\n        public const string LastPlayedLabel = \"LOCLastPlayedLabel\";\r\n        /// <summary>\r\n        /// Most Played\r\n        /// </summary>\r\n        public const string MostPlayedLabel = \"LOCMostPlayedLabel\";\r\n        /// <summary>\r\n        /// Play Count\r\n        /// </summary>\r\n        public const string PlayCountLabel = \"LOCPlayCountLabel\";\r\n        /// <summary>\r\n        /// Install Size\r\n        /// </summary>\r\n        public const string InstallSizeLabel = \"LOCInstallSizeLabel\";\r\n        /// <summary>\r\n        /// Folder\r\n        /// </summary>\r\n        public const string FolderLabel = \"LOCFolderLabel\";\r\n        /// <summary>\r\n        /// Notes\r\n        /// </summary>\r\n        public const string NotesLabel = \"LOCNotesLabel\";\r\n        /// <summary>\r\n        /// Added\r\n        /// </summary>\r\n        public const string AddedLabel = \"LOCAddedLabel\";\r\n        /// <summary>\r\n        /// Date Added\r\n        /// </summary>\r\n        public const string DateAddedLabel = \"LOCDateAddedLabel\";\r\n        /// <summary>\r\n        /// Modified\r\n        /// </summary>\r\n        public const string ModifiedLabel = \"LOCModifiedLabel\";\r\n        /// <summary>\r\n        /// Date Modified\r\n        /// </summary>\r\n        public const string DateModifiedLabel = \"LOCDateModifiedLabel\";\r\n        /// <summary>\r\n        /// Website\r\n        /// </summary>\r\n        public const string WebsiteLabel = \"LOCWebsiteLabel\";\r\n        /// <summary>\r\n        /// Path\r\n        /// </summary>\r\n        public const string PathLabel = \"LOCPathLabel\";\r\n        /// <summary>\r\n        /// OK\r\n        /// </summary>\r\n        public const string OKLabel = \"LOCOKLabel\";\r\n        /// <summary>\r\n        /// Save\r\n        /// </summary>\r\n        public const string SaveLabel = \"LOCSaveLabel\";\r\n        /// <summary>\r\n        /// Close\r\n        /// </summary>\r\n        public const string CloseLabel = \"LOCCloseLabel\";\r\n        /// <summary>\r\n        /// Cancel\r\n        /// </summary>\r\n        public const string CancelLabel = \"LOCCancelLabel\";\r\n        /// <summary>\r\n        /// Confirm\r\n        /// </summary>\r\n        public const string ConfirmLabel = \"LOCConfirmLabel\";\r\n        /// <summary>\r\n        /// Reset\r\n        /// </summary>\r\n        public const string ResetLabel = \"LOCResetLabel\";\r\n        /// <summary>\r\n        /// Yes\r\n        /// </summary>\r\n        public const string YesLabel = \"LOCYesLabel\";\r\n        /// <summary>\r\n        /// No\r\n        /// </summary>\r\n        public const string NoLabel = \"LOCNoLabel\";\r\n        /// <summary>\r\n        /// Welcome\r\n        /// </summary>\r\n        public const string WelcomeLabel = \"LOCWelcomeLabel\";\r\n        /// <summary>\r\n        /// Local User\r\n        /// </summary>\r\n        public const string LocalUserLabel = \"LOCLocalUserLabel\";\r\n        /// <summary>\r\n        /// General\r\n        /// </summary>\r\n        public const string GeneralLabel = \"LOCGeneralLabel\";\r\n        /// <summary>\r\n        /// Media\r\n        /// </summary>\r\n        public const string MediaLabel = \"LOCMediaLabel\";\r\n        /// <summary>\r\n        /// Links\r\n        /// </summary>\r\n        public const string LinksLabel = \"LOCLinksLabel\";\r\n        /// <summary>\r\n        /// Installation\r\n        /// </summary>\r\n        public const string InstallationLabel = \"LOCInstallationLabel\";\r\n        /// <summary>\r\n        /// Actions\r\n        /// </summary>\r\n        public const string ActionsLabel = \"LOCActionsLabel\";\r\n        /// <summary>\r\n        /// Downloading…\r\n        /// </summary>\r\n        public const string DownloadingLabel = \"LOCDownloadingLabel\";\r\n        /// <summary>\r\n        /// Downloading media…\r\n        /// </summary>\r\n        public const string DownloadingMediaLabel = \"LOCDownloadingMediaLabel\";\r\n        /// <summary>\r\n        /// Loading…\r\n        /// </summary>\r\n        public const string LoadingLabel = \"LOCLoadingLabel\";\r\n        /// <summary>\r\n        /// Type\r\n        /// </summary>\r\n        public const string TypeLabel = \"LOCTypeLabel\";\r\n        /// <summary>\r\n        /// Profile\r\n        /// </summary>\r\n        public const string ProfileLabel = \"LOCProfileLabel\";\r\n        /// <summary>\r\n        /// Profiles\r\n        /// </summary>\r\n        public const string ProfilesLabel = \"LOCProfilesLabel\";\r\n        /// <summary>\r\n        /// Remove\r\n        /// </summary>\r\n        public const string RemoveLabel = \"LOCRemoveLabel\";\r\n        /// <summary>\r\n        /// Download\r\n        /// </summary>\r\n        public const string DownloadLabel = \"LOCDownloadLabel\";\r\n        /// <summary>\r\n        /// Search\r\n        /// </summary>\r\n        public const string SearchLabel = \"LOCSearchLabel\";\r\n        /// <summary>\r\n        /// Resolution:\r\n        /// </summary>\r\n        public const string SearchResolutionLabel = \"LOCSearchResolutionLabel\";\r\n        /// <summary>\r\n        /// Any\r\n        /// </summary>\r\n        public const string SearchResolutionAnyLabel = \"LOCSearchResolutionAnyLabel\";\r\n        /// <summary>\r\n        /// Zoom\r\n        /// </summary>\r\n        public const string ZoomLabel = \"LOCZoomLabel\";\r\n        /// <summary>\r\n        /// List View\r\n        /// </summary>\r\n        public const string ListViewLabel = \"LOCListViewLabel\";\r\n        /// <summary>\r\n        /// Covers\r\n        /// </summary>\r\n        public const string CoversLabel = \"LOCCoversLabel\";\r\n        /// <summary>\r\n        /// Grid View\r\n        /// </summary>\r\n        public const string GridViewLabel = \"LOCGridViewLabel\";\r\n        /// <summary>\r\n        /// Details View\r\n        /// </summary>\r\n        public const string DetailsViewLabel = \"LOCDetailsViewLabel\";\r\n        /// <summary>\r\n        /// Custom\r\n        /// </summary>\r\n        public const string CustomLabel = \"LOCCustomLabel\";\r\n        /// <summary>\r\n        /// URL\r\n        /// </summary>\r\n        public const string URLLabel = \"LOCURLLabel\";\r\n        /// <summary>\r\n        /// Special thanks\r\n        /// </summary>\r\n        public const string SpecialThanks = \"LOCSpecialThanks\";\r\n        /// <summary>\r\n        /// License\r\n        /// </summary>\r\n        public const string LicenseLabel = \"LOCLicenseLabel\";\r\n        /// <summary>\r\n        /// Contributors\r\n        /// </summary>\r\n        public const string ContributorsLabel = \"LOCContributorsLabel\";\r\n        /// <summary>\r\n        /// Exiting Playnite…\r\n        /// </summary>\r\n        public const string ClosingPlaynite = \"LOCClosingPlaynite\";\r\n        /// <summary>\r\n        /// Today\r\n        /// </summary>\r\n        public const string Today = \"LOCToday\";\r\n        /// <summary>\r\n        /// Yesterday\r\n        /// </summary>\r\n        public const string Yesterday = \"LOCYesterday\";\r\n        /// <summary>\r\n        /// Monday\r\n        /// </summary>\r\n        public const string Monday = \"LOCMonday\";\r\n        /// <summary>\r\n        /// Tuesday\r\n        /// </summary>\r\n        public const string Tuesday = \"LOCTuesday\";\r\n        /// <summary>\r\n        /// Wednesday\r\n        /// </summary>\r\n        public const string Wednesday = \"LOCWednesday\";\r\n        /// <summary>\r\n        /// Thursday\r\n        /// </summary>\r\n        public const string Thursday = \"LOCThursday\";\r\n        /// <summary>\r\n        /// Friday\r\n        /// </summary>\r\n        public const string Friday = \"LOCFriday\";\r\n        /// <summary>\r\n        /// Saturday\r\n        /// </summary>\r\n        public const string Saturday = \"LOCSaturday\";\r\n        /// <summary>\r\n        /// Sunday\r\n        /// </summary>\r\n        public const string Sunday = \"LOCSunday\";\r\n        /// <summary>\r\n        /// Past Week\r\n        /// </summary>\r\n        public const string PastWeek = \"LOCPastWeek\";\r\n        /// <summary>\r\n        /// Past Month\r\n        /// </summary>\r\n        public const string PastMonth = \"LOCPastMonth\";\r\n        /// <summary>\r\n        /// Past Year\r\n        /// </summary>\r\n        public const string PastYear = \"LOCPastYear\";\r\n        /// <summary>\r\n        /// More than a year ago\r\n        /// </summary>\r\n        public const string MoreThenYear = \"LOCMoreThenYear\";\r\n        /// <summary>\r\n        /// 0 to 100MB\r\n        /// </summary>\r\n        public const string SizeZeroTo100Mb = \"LOCSizeZeroTo100Mb\";\r\n        /// <summary>\r\n        /// 100MB to 1GB\r\n        /// </summary>\r\n        public const string Size100MbTo1Gb = \"LOCSize100MbTo1Gb\";\r\n        /// <summary>\r\n        /// 1GB to 5GB\r\n        /// </summary>\r\n        public const string Size1GbTo5Gb = \"LOCSize1GbTo5Gb\";\r\n        /// <summary>\r\n        /// 5GB to 10GB\r\n        /// </summary>\r\n        public const string Size5GbTo10Gb = \"LOCSize5GbTo10Gb\";\r\n        /// <summary>\r\n        /// 10GB to 20GB\r\n        /// </summary>\r\n        public const string Size10GbTo20Gb = \"LOCSize10GbTo20Gb\";\r\n        /// <summary>\r\n        /// 20GB to 40GB\r\n        /// </summary>\r\n        public const string Size20GbTo40Gb = \"LOCSize20GbTo40Gb\";\r\n        /// <summary>\r\n        /// 40GB to 100GB\r\n        /// </summary>\r\n        public const string Size40GbTo100Gb = \"LOCSize40GbTo100Gb\";\r\n        /// <summary>\r\n        /// 100GB or more\r\n        /// </summary>\r\n        public const string SizeMoreThan100Gb = \"LOCSizeMoreThan100Gb\";\r\n        /// <summary>\r\n        /// Import completed successfully.\r\n        /// </summary>\r\n        public const string ImportCompleted = \"LOCImportCompleted\";\r\n        /// <summary>\r\n        /// All Games\r\n        /// </summary>\r\n        public const string AllGames = \"LOCAllGames\";\r\n        /// <summary>\r\n        /// Game Id\r\n        /// </summary>\r\n        public const string GameId = \"LOCGameId\";\r\n        /// <summary>\r\n        /// Database Id\r\n        /// </summary>\r\n        public const string DatabaseId = \"LOCDatabaseId\";\r\n        /// <summary>\r\n        /// Presets\r\n        /// </summary>\r\n        public const string Presets = \"LOCPresets\";\r\n        /// <summary>\r\n        /// Column\r\n        /// </summary>\r\n        public const string Column = \"LOCColumn\";\r\n        /// <summary>\r\n        /// Columns\r\n        /// </summary>\r\n        public const string Columns = \"LOCColumns\";\r\n        /// <summary>\r\n        /// Row\r\n        /// </summary>\r\n        public const string Row = \"LOCRow\";\r\n        /// <summary>\r\n        /// Rows\r\n        /// </summary>\r\n        public const string Rows = \"LOCRows\";\r\n        /// <summary>\r\n        /// Couldn't get icon from Play action. There's no action of File type present.\r\n        /// </summary>\r\n        public const string ExecIconMissingPlayAction = \"LOCExecIconMissingPlayAction\";\r\n        /// <summary>\r\n        /// Only download missing metadata\r\n        /// </summary>\r\n        public const string MetaSkipNonEmpty = \"LOCMetaSkipNonEmpty\";\r\n        /// <summary>\r\n        /// Enabling this option will skip downloading metadata for data fields that already contain information.\r\n        /// </summary>\r\n        public const string MetaSkipNonEmptyTooltip = \"LOCMetaSkipNonEmptyTooltip\";\r\n        /// <summary>\r\n        /// Games selection\r\n        /// </summary>\r\n        public const string MetaGamesSourceIntro = \"LOCMetaGamesSourceIntro\";\r\n        /// <summary>\r\n        /// Please select which games should to be updated with new metadata:\r\n        /// </summary>\r\n        public const string MetaGamesSourceDescription = \"LOCMetaGamesSourceDescription\";\r\n        /// <summary>\r\n        /// All games from database\r\n        /// </summary>\r\n        public const string MetaGameSourceAll = \"LOCMetaGameSourceAll\";\r\n        /// <summary>\r\n        /// All currently filtered games\r\n        /// </summary>\r\n        public const string MetaGameSourceFiltered = \"LOCMetaGameSourceFiltered\";\r\n        /// <summary>\r\n        /// Selected games only\r\n        /// </summary>\r\n        public const string MetaGameSourceSelected = \"LOCMetaGameSourceSelected\";\r\n        /// <summary>\r\n        /// No metadata fields selected\r\n        /// </summary>\r\n        public const string MetaNoFieldsSelectedErrorCaption = \"LOCMetaNoFieldsSelectedErrorCaption\";\r\n        /// <summary>\r\n        /// No metadata fields are selected for download. Please select at least one, and enable at least one metadata provider for it.\r\n        /// </summary>\r\n        public const string MetaNoFieldsSelectedErrorMessage = \"LOCMetaNoFieldsSelectedErrorMessage\";\r\n        /// <summary>\r\n        /// Official Store\r\n        /// </summary>\r\n        public const string MetaSourceStore = \"LOCMetaSourceStore\";\r\n        /// <summary>\r\n        /// IGDB\r\n        /// </summary>\r\n        public const string MetaSourceIGDB = \"LOCMetaSourceIGDB\";\r\n        /// <summary>\r\n        /// Please select which fields should be automatically populated by Playnite and which sources should be used to obtain the data from.\r\n        /// </summary>\r\n        public const string MetaDescriptionFields = \"LOCMetaDescriptionFields\";\r\n        /// <summary>\r\n        /// Please consider clicking on the logo above and contribute updates to igdb.com database in order to improve data Playnite uses.\r\n        /// </summary>\r\n        public const string MetaIgdbContribNotif = \"LOCMetaIgdbContribNotif\";\r\n        /// <summary>\r\n        /// Downloading metadata…\r\n        /// </summary>\r\n        public const string ProgressMetadata = \"LOCProgressMetadata\";\r\n        /// <summary>\r\n        /// Importing installed games…\r\n        /// </summary>\r\n        public const string ProgressInstalledGames = \"LOCProgressInstalledGames\";\r\n        /// <summary>\r\n        /// Importing {0} games…\r\n        /// </summary>\r\n        public const string ProgressImportinGames = \"LOCProgressImportinGames\";\r\n        /// <summary>\r\n        /// Importing emulated games from {0}…\r\n        /// </summary>\r\n        public const string ProgressImportinEmulatedGames = \"LOCProgressImportinEmulatedGames\";\r\n        /// <summary>\r\n        /// Downloading library updates…\r\n        /// </summary>\r\n        public const string ProgressLibraryGames = \"LOCProgressLibraryGames\";\r\n        /// <summary>\r\n        /// Scanning size of games in library…\r\n        /// </summary>\r\n        public const string ProgressScanningGamesInstallSize = \"LOCProgressScanningGamesInstallSize\";\r\n        /// <summary>\r\n        /// Scanning size of imported games…\r\n        /// </summary>\r\n        public const string ProgressScanningImportedGamesInstallSize = \"LOCProgressScanningImportedGamesInstallSize\";\r\n        /// <summary>\r\n        /// Library update finished\r\n        /// </summary>\r\n        public const string ProgressLibImportFinish = \"LOCProgressLibImportFinish\";\r\n        /// <summary>\r\n        /// Releasing resources…\r\n        /// </summary>\r\n        public const string ProgressReleasingResources = \"LOCProgressReleasingResources\";\r\n        /// <summary>\r\n        /// Configuration\r\n        /// </summary>\r\n        public const string MenuConfigurationTitle = \"LOCMenuConfigurationTitle\";\r\n        /// <summary>\r\n        /// Settings…\r\n        /// </summary>\r\n        public const string MenuPlayniteSettingsTitle = \"LOCMenuPlayniteSettingsTitle\";\r\n        /// <summary>\r\n        /// Platforms and Emulators\r\n        /// </summary>\r\n        public const string MenuPlatformEmulatorSettingsTitle = \"LOCMenuPlatformEmulatorSettingsTitle\";\r\n        /// <summary>\r\n        /// Configure Emulators…\r\n        /// </summary>\r\n        public const string MenuConfigureEmulatorsMenuTitle = \"LOCMenuConfigureEmulatorsMenuTitle\";\r\n        /// <summary>\r\n        /// Library Manager…\r\n        /// </summary>\r\n        public const string MenuLibraryManagerTitle = \"LOCMenuLibraryManagerTitle\";\r\n        /// <summary>\r\n        /// Tools\r\n        /// </summary>\r\n        public const string MenuTools = \"LOCMenuTools\";\r\n        /// <summary>\r\n        /// Download Metadata…\r\n        /// </summary>\r\n        public const string MenuDownloadMetadata = \"LOCMenuDownloadMetadata\";\r\n        /// <summary>\r\n        /// Software Tools…\r\n        /// </summary>\r\n        public const string MenuSoftwareTools = \"LOCMenuSoftwareTools\";\r\n        /// <summary>\r\n        /// Configure Integrations…\r\n        /// </summary>\r\n        public const string MenuConfigureIntegrations = \"LOCMenuConfigureIntegrations\";\r\n        /// <summary>\r\n        /// Open 3rd Party Client\r\n        /// </summary>\r\n        public const string MenuOpenClient = \"LOCMenuOpenClient\";\r\n        /// <summary>\r\n        /// 3rd Party Clients\r\n        /// </summary>\r\n        public const string MenuClients = \"LOCMenuClients\";\r\n        /// <summary>\r\n        /// Update Game Library\r\n        /// </summary>\r\n        public const string MenuReloadLibrary = \"LOCMenuReloadLibrary\";\r\n        /// <summary>\r\n        /// Cancel Library Update\r\n        /// </summary>\r\n        public const string MenuCancelLibraryUpdate = \"LOCMenuCancelLibraryUpdate\";\r\n        /// <summary>\r\n        /// Update Emulated Folders\r\n        /// </summary>\r\n        public const string MenuUpdateEmulatedDirs = \"LOCMenuUpdateEmulatedDirs\";\r\n        /// <summary>\r\n        /// Add Game\r\n        /// </summary>\r\n        public const string MenuAddGame = \"LOCMenuAddGame\";\r\n        /// <summary>\r\n        /// Manually…\r\n        /// </summary>\r\n        public const string MenuAddGameManual = \"LOCMenuAddGameManual\";\r\n        /// <summary>\r\n        /// Scan Automatically…\r\n        /// </summary>\r\n        public const string MenuAddGameInstalled = \"LOCMenuAddGameInstalled\";\r\n        /// <summary>\r\n        /// Emulated Game…\r\n        /// </summary>\r\n        public const string MenuAddGameEmulated = \"LOCMenuAddGameEmulated\";\r\n        /// <summary>\r\n        /// Microsoft Store application…\r\n        /// </summary>\r\n        public const string MenuAddWindowsStore = \"LOCMenuAddWindowsStore\";\r\n        /// <summary>\r\n        /// About Playnite\r\n        /// </summary>\r\n        public const string MenuAbout = \"LOCMenuAbout\";\r\n        /// <summary>\r\n        /// Send Feedback\r\n        /// </summary>\r\n        public const string MenuIssues = \"LOCMenuIssues\";\r\n        /// <summary>\r\n        /// Switch to Fullscreen Mode\r\n        /// </summary>\r\n        public const string MenuOpenFullscreen = \"LOCMenuOpenFullscreen\";\r\n        /// <summary>\r\n        /// Links\r\n        /// </summary>\r\n        public const string MenuLinksTitle = \"LOCMenuLinksTitle\";\r\n        /// <summary>\r\n        /// Help\r\n        /// </summary>\r\n        public const string MenuHelpTitle = \"LOCMenuHelpTitle\";\r\n        /// <summary>\r\n        /// Support on Patreon\r\n        /// </summary>\r\n        public const string MenuPatreonSupport = \"LOCMenuPatreonSupport\";\r\n        /// <summary>\r\n        /// Support on Ko-fi\r\n        /// </summary>\r\n        public const string MenuKofiSupport = \"LOCMenuKofiSupport\";\r\n        /// <summary>\r\n        /// User manual\r\n        /// </summary>\r\n        public const string UserManual = \"LOCUserManual\";\r\n        /// <summary>\r\n        /// SDK Documentation\r\n        /// </summary>\r\n        public const string SDKDocumentation = \"LOCSDKDocumentation\";\r\n        /// <summary>\r\n        /// Restart System\r\n        /// </summary>\r\n        public const string MenuRestartSystem = \"LOCMenuRestartSystem\";\r\n        /// <summary>\r\n        /// Turn Off System\r\n        /// </summary>\r\n        public const string MenuShutdownSystem = \"LOCMenuShutdownSystem\";\r\n        /// <summary>\r\n        /// Suspend System\r\n        /// </summary>\r\n        public const string MenuSuspendSystem = \"LOCMenuSuspendSystem\";\r\n        /// <summary>\r\n        /// Hibernate System\r\n        /// </summary>\r\n        public const string MenuHibernateSystem = \"LOCMenuHibernateSystem\";\r\n        /// <summary>\r\n        /// Lock System\r\n        /// </summary>\r\n        public const string MenuLockSystem = \"LOCMenuLockSystem\";\r\n        /// <summary>\r\n        /// Log Out User\r\n        /// </summary>\r\n        public const string MenuLogoutUser = \"LOCMenuLogoutUser\";\r\n        /// <summary>\r\n        /// Pick a Random Game\r\n        /// </summary>\r\n        public const string MenuSelectRandomGame = \"LOCMenuSelectRandomGame\";\r\n        /// <summary>\r\n        /// Game fields to be displayed on details panel:\r\n        /// </summary>\r\n        public const string SettingsDetailsPanelItems = \"LOCSettingsDetailsPanelItems\";\r\n        /// <summary>\r\n        /// Item spacing\r\n        /// </summary>\r\n        public const string SettingsGridItemSpacing = \"LOCSettingsGridItemSpacing\";\r\n        /// <summary>\r\n        /// Draw grid item background\r\n        /// </summary>\r\n        public const string SettingsGridItemDrawBackground = \"LOCSettingsGridItemDrawBackground\";\r\n        /// <summary>\r\n        /// Grid item border width\r\n        /// </summary>\r\n        public const string SettingsGridItemCoverMargin = \"LOCSettingsGridItemCoverMargin\";\r\n        /// <summary>\r\n        /// Missing game icon source\r\n        /// </summary>\r\n        public const string SettingsDefaulIconSource = \"LOCSettingsDefaulIconSource\";\r\n        /// <summary>\r\n        /// Missing game cover source\r\n        /// </summary>\r\n        public const string SettingsDefaulCoverSource = \"LOCSettingsDefaulCoverSource\";\r\n        /// <summary>\r\n        /// Missing game background source\r\n        /// </summary>\r\n        public const string SettingsDefaulBackgroundSource = \"LOCSettingsDefaulBackgroundSource\";\r\n        /// <summary>\r\n        /// Vertical spacing to game details\r\n        /// </summary>\r\n        public const string SettingsIndentGameDetails = \"LOCSettingsIndentGameDetails\";\r\n        /// <summary>\r\n        /// Grid view details position\r\n        /// </summary>\r\n        public const string SettingsGridViewDetailsPosition = \"LOCSettingsGridViewDetailsPosition\";\r\n        /// <summary>\r\n        /// Details view game list position\r\n        /// </summary>\r\n        public const string SettingsDetailsGameListPosition = \"LOCSettingsDetailsGameListPosition\";\r\n        /// <summary>\r\n        /// Draw separator between panels\r\n        /// </summary>\r\n        public const string SettingsDrawPanelSeparators = \"LOCSettingsDrawPanelSeparators\";\r\n        /// <summary>\r\n        /// Game cover image height\r\n        /// </summary>\r\n        public const string SettingsGameDetailsCoverHeight = \"LOCSettingsGameDetailsCoverHeight\";\r\n        /// <summary>\r\n        /// Game list icon height\r\n        /// </summary>\r\n        public const string SettingsGameDetailsListIconSize = \"LOCSettingsGameDetailsListIconSize\";\r\n        /// <summary>\r\n        /// Application font\r\n        /// </summary>\r\n        public const string SettingsInterfaceFont = \"LOCSettingsInterfaceFont\";\r\n        /// <summary>\r\n        /// Monospaced font\r\n        /// </summary>\r\n        public const string SettingsInterfaceMonoFont = \"LOCSettingsInterfaceMonoFont\";\r\n        /// <summary>\r\n        /// Filter panel position\r\n        /// </summary>\r\n        public const string SettingsFilterPanelPosition = \"LOCSettingsFilterPanelPosition\";\r\n        /// <summary>\r\n        /// Explorer panel position\r\n        /// </summary>\r\n        public const string SettingsExplorerPanelPosition = \"LOCSettingsExplorerPanelPosition\";\r\n        /// <summary>\r\n        /// Cover art rendering\r\n        /// </summary>\r\n        public const string SettingsCoverArtRenderingLabel = \"LOCSettingsCoverArtRenderingLabel\";\r\n        /// <summary>\r\n        /// Target aspect ratio\r\n        /// </summary>\r\n        public const string SettingsTargetAspectRatioLabel = \"LOCSettingsTargetAspectRatioLabel\";\r\n        /// <summary>\r\n        /// Following options also affect tile rendering in Fullscreen mode!\r\n        /// </summary>\r\n        public const string SettingsGridTileLayoutFSNote = \"LOCSettingsGridTileLayoutFSNote\";\r\n        /// <summary>\r\n        /// Stretch mode\r\n        /// </summary>\r\n        public const string SettingsStrechModeLabel = \"LOCSettingsStrechModeLabel\";\r\n        /// <summary>\r\n        /// DVD Box\r\n        /// </summary>\r\n        public const string SettingsCovertAspectDVD = \"LOCSettingsCovertAspectDVD\";\r\n        /// <summary>\r\n        /// Epic Games Store\r\n        /// </summary>\r\n        public const string SettingsCovertAspectEpicGamesStore = \"LOCSettingsCovertAspectEpicGamesStore\";\r\n        /// <summary>\r\n        /// GOG Galaxy 2.0\r\n        /// </summary>\r\n        public const string SettingsCovertAspectGogGalaxy2 = \"LOCSettingsCovertAspectGogGalaxy2\";\r\n        /// <summary>\r\n        /// IGDB\r\n        /// </summary>\r\n        public const string SettingsCovertAspectIgdb = \"LOCSettingsCovertAspectIgdb\";\r\n        /// <summary>\r\n        /// Square\r\n        /// </summary>\r\n        public const string SettingsCovertAspectSquare = \"LOCSettingsCovertAspectSquare\";\r\n        /// <summary>\r\n        /// Steam Banner\r\n        /// </summary>\r\n        public const string SettingsCovertAspectSteam = \"LOCSettingsCovertAspectSteam\";\r\n        /// <summary>\r\n        /// Steam vertical cover\r\n        /// </summary>\r\n        public const string SettingsCovertAspectSteamVertical = \"LOCSettingsCovertAspectSteamVertical\";\r\n        /// <summary>\r\n        /// Twitch\r\n        /// </summary>\r\n        public const string SettingsCovertAspectTwitch = \"LOCSettingsCovertAspectTwitch\";\r\n        /// <summary>\r\n        /// * Requires restart to apply\r\n        /// </summary>\r\n        public const string SettingsRestartNotification = \"LOCSettingsRestartNotification\";\r\n        /// <summary>\r\n        /// Settings\r\n        /// </summary>\r\n        public const string SettingsLabel = \"LOCSettingsLabel\";\r\n        /// <summary>\r\n        /// General\r\n        /// </summary>\r\n        public const string SettingsGeneralLabel = \"LOCSettingsGeneralLabel\";\r\n        /// <summary>\r\n        /// Top panel\r\n        /// </summary>\r\n        public const string SettingsTopPanelLabel = \"LOCSettingsTopPanelLabel\";\r\n        /// <summary>\r\n        /// Appearance\r\n        /// </summary>\r\n        public const string SettingsAppearanceLabel = \"LOCSettingsAppearanceLabel\";\r\n        /// <summary>\r\n        /// Game Details\r\n        /// </summary>\r\n        public const string SettingsGameDetailsLabel = \"LOCSettingsGameDetailsLabel\";\r\n        /// <summary>\r\n        /// Layout\r\n        /// </summary>\r\n        public const string SettingsLayoutLabel = \"LOCSettingsLayoutLabel\";\r\n        /// <summary>\r\n        /// Advanced\r\n        /// </summary>\r\n        public const string SettingsAdvancedLabel = \"LOCSettingsAdvancedLabel\";\r\n        /// <summary>\r\n        /// Fullscreen\r\n        /// </summary>\r\n        public const string SettingsFullscreenLabel = \"LOCSettingsFullscreenLabel\";\r\n        /// <summary>\r\n        /// Input\r\n        /// </summary>\r\n        public const string SettingsInputLabel = \"LOCSettingsInputLabel\";\r\n        /// <summary>\r\n        /// Performance\r\n        /// </summary>\r\n        public const string SettingsPerformanceLabel = \"LOCSettingsPerformanceLabel\";\r\n        /// <summary>\r\n        /// Metadata\r\n        /// </summary>\r\n        public const string SettingsMetadataLabel = \"LOCSettingsMetadataLabel\";\r\n        /// <summary>\r\n        /// Updating\r\n        /// </summary>\r\n        public const string SettingsUpdating = \"LOCSettingsUpdating\";\r\n        /// <summary>\r\n        /// Search\r\n        /// </summary>\r\n        public const string SettingsSearch = \"LOCSettingsSearch\";\r\n        /// <summary>\r\n        /// Backup\r\n        /// </summary>\r\n        public const string SettingsBackup = \"LOCSettingsBackup\";\r\n        /// <summary>\r\n        /// Backup Library Data\r\n        /// </summary>\r\n        public const string MenuBackupData = \"LOCMenuBackupData\";\r\n        /// <summary>\r\n        /// Restore Data Backup\r\n        /// </summary>\r\n        public const string MenuRestoreBackup = \"LOCMenuRestoreBackup\";\r\n        /// <summary>\r\n        /// Import changes in library automatically\r\n        /// </summary>\r\n        public const string SettingsImportLabel = \"LOCSettingsImportLabel\";\r\n        /// <summary>\r\n        /// Invalid database file location, proper file path must be set.\r\n        /// </summary>\r\n        public const string SettingsInvalidDBLocation = \"LOCSettingsInvalidDBLocation\";\r\n        /// <summary>\r\n        /// Account name cannot be empty.\r\n        /// </summary>\r\n        public const string SettingsInvalidAccountName = \"LOCSettingsInvalidAccountName\";\r\n        /// <summary>\r\n        /// Download metadata after importing games\r\n        /// </summary>\r\n        public const string SettingsDownloadMetadataOnImport = \"LOCSettingsDownloadMetadataOnImport\";\r\n        /// <summary>\r\n        /// Launch Playnite minimized\r\n        /// </summary>\r\n        public const string SettingsStartMinimized = \"LOCSettingsStartMinimized\";\r\n        /// <summary>\r\n        /// Launch Playnite when you start your computer\r\n        /// </summary>\r\n        public const string SettingsStartOnBoot = \"LOCSettingsStartOnBoot\";\r\n        /// <summary>\r\n        /// Start closed to tray\r\n        /// </summary>\r\n        public const string SettingsStartOnBootClosedToTray = \"LOCSettingsStartOnBootClosedToTray\";\r\n        /// <summary>\r\n        /// Failed to register Playnite to launch when computer starts.\r\n        /// </summary>\r\n        public const string SettingsStartOnBootRegistrationError = \"LOCSettingsStartOnBootRegistrationError\";\r\n        /// <summary>\r\n        /// Launch in Fullscreen Mode\r\n        /// </summary>\r\n        public const string SettingsStartInFullscreen = \"LOCSettingsStartInFullscreen\";\r\n        /// <summary>\r\n        /// Asynchronous image loading\r\n        /// </summary>\r\n        public const string SettingsAsyncImageLoading = \"LOCSettingsAsyncImageLoading\";\r\n        /// <summary>\r\n        /// Can improve scrolling smoothness of game lists in exchange for slower image load times.\r\n        /// </summary>\r\n        public const string SettingsAsyncImageLoadingTooltip = \"LOCSettingsAsyncImageLoadingTooltip\";\r\n        /// <summary>\r\n        /// Show game name if cover art is missing\r\n        /// </summary>\r\n        public const string SettingsShowNameEmptyCover = \"LOCSettingsShowNameEmptyCover\";\r\n        /// <summary>\r\n        /// Show game names on Grid view\r\n        /// </summary>\r\n        public const string SettingsShowNamesUnderCover = \"LOCSettingsShowNamesUnderCover\";\r\n        /// <summary>\r\n        /// Darken not installed games\r\n        /// </summary>\r\n        public const string SettingsDarkenUninstalledGridCovers = \"LOCSettingsDarkenUninstalledGridCovers\";\r\n        /// <summary>\r\n        /// Show game icons on Details view list\r\n        /// </summary>\r\n        public const string SettingsShowIconList = \"LOCSettingsShowIconList\";\r\n        /// <summary>\r\n        /// Show item count on group descriptions\r\n        /// </summary>\r\n        public const string SettingsShowGroupCount = \"LOCSettingsShowGroupCount\";\r\n        /// <summary>\r\n        /// Show only assigned fields on filter and explorer panels\r\n        /// </summary>\r\n        public const string SettingsUsedFieldsOnlyOnFilterLists = \"LOCSettingsUsedFieldsOnlyOnFilterLists\";\r\n        /// <summary>\r\n        /// Disable hardware acceleration\r\n        /// </summary>\r\n        public const string SettingsDisableAcceleration = \"LOCSettingsDisableAcceleration\";\r\n        /// <summary>\r\n        /// Use when experiencing stuttering or similar UI issues\r\n        /// </summary>\r\n        public const string SettingsDisableAccelerationTooltip = \"LOCSettingsDisableAccelerationTooltip\";\r\n        /// <summary>\r\n        /// Show hidden games in quick launch lists\r\n        /// </summary>\r\n        public const string SettingsHiddenInQuickLaunch = \"LOCSettingsHiddenInQuickLaunch\";\r\n        /// <summary>\r\n        /// Affects Jump List and tray menu lists.\r\n        /// </summary>\r\n        public const string SettingsHiddenInQuickLaunchTooltip = \"LOCSettingsHiddenInQuickLaunchTooltip\";\r\n        /// <summary>\r\n        /// Number of quick launch items\r\n        /// </summary>\r\n        public const string SettingsQuicLaunchItems = \"LOCSettingsQuicLaunchItems\";\r\n        /// <summary>\r\n        /// Use game background image as window background\r\n        /// </summary>\r\n        public const string SettingsShowBackgroundWindowImage = \"LOCSettingsShowBackgroundWindowImage\";\r\n        /// <summary>\r\n        /// Blur background\r\n        /// </summary>\r\n        public const string SettingsBlurWindowBackgrounImage = \"LOCSettingsBlurWindowBackgrounImage\";\r\n        /// <summary>\r\n        /// High Quality\r\n        /// </summary>\r\n        public const string SettingsBlurHighQuality = \"LOCSettingsBlurHighQuality\";\r\n        /// <summary>\r\n        /// Darken background\r\n        /// </summary>\r\n        public const string SettingsDarkenWindowBackghrounImage = \"LOCSettingsDarkenWindowBackghrounImage\";\r\n        /// <summary>\r\n        /// Show on Grid view\r\n        /// </summary>\r\n        public const string SettingsShowBackImageOnGridView = \"LOCSettingsShowBackImageOnGridView\";\r\n        /// <summary>\r\n        /// Theme\r\n        /// </summary>\r\n        public const string SettingsSkin = \"LOCSettingsSkin\";\r\n        /// <summary>\r\n        /// Theme Profile\r\n        /// </summary>\r\n        public const string SettingsSkinColor = \"LOCSettingsSkinColor\";\r\n        /// <summary>\r\n        /// Fullscreen Theme\r\n        /// </summary>\r\n        public const string SettingsSkinFullscreen = \"LOCSettingsSkinFullscreen\";\r\n        /// <summary>\r\n        /// Fullscreen Theme Profile\r\n        /// </summary>\r\n        public const string SettingsSkinColorFullscreen = \"LOCSettingsSkinColorFullscreen\";\r\n        /// <summary>\r\n        /// Database Location\r\n        /// </summary>\r\n        public const string SettingsDBLocation = \"LOCSettingsDBLocation\";\r\n        /// <summary>\r\n        /// Login status:\r\n        /// </summary>\r\n        public const string SettingsLoginStatus = \"LOCSettingsLoginStatus\";\r\n        /// <summary>\r\n        /// Playnite Settings\r\n        /// </summary>\r\n        public const string SettingsWindowTitle = \"LOCSettingsWindowTitle\";\r\n        /// <summary>\r\n        /// Clear web cache\r\n        /// </summary>\r\n        public const string SettingsClearWebCache = \"LOCSettingsClearWebCache\";\r\n        /// <summary>\r\n        /// May solve issues encountered while linking accounts.\r\n        /// </summary>\r\n        public const string SettingsClearWebCacheTooltip = \"LOCSettingsClearWebCacheTooltip\";\r\n        /// <summary>\r\n        /// Show system tray icon\r\n        /// </summary>\r\n        public const string SettingsShowTray = \"LOCSettingsShowTray\";\r\n        /// <summary>\r\n        /// Minimize Playnite to system tray\r\n        /// </summary>\r\n        public const string SettingsMinimizeToTray = \"LOCSettingsMinimizeToTray\";\r\n        /// <summary>\r\n        /// Minimize Playnite to system tray when the application window is closed\r\n        /// </summary>\r\n        public const string SettingsCloseToTray = \"LOCSettingsCloseToTray\";\r\n        /// <summary>\r\n        /// When game starts:\r\n        /// </summary>\r\n        public const string SettingsAfterGameStart = \"LOCSettingsAfterGameStart\";\r\n        /// <summary>\r\n        /// After game closes:\r\n        /// </summary>\r\n        public const string SettingsAfterGameClose = \"LOCSettingsAfterGameClose\";\r\n        /// <summary>\r\n        /// Format time played to indicate the number of days played\r\n        /// </summary>\r\n        public const string SettingsPlaytimeUseDaysFormatLabel = \"LOCSettingsPlaytimeUseDaysFormatLabel\";\r\n        /// <summary>\r\n        /// Dates formats:\r\n        /// </summary>\r\n        public const string SettingsDatesFormatsLabel = \"LOCSettingsDatesFormatsLabel\";\r\n        /// <summary>\r\n        /// This will log you out of all linked services. Application restart is required, do you want to proceed?\r\n        /// </summary>\r\n        public const string SettingsClearCacheWarn = \"LOCSettingsClearCacheWarn\";\r\n        /// <summary>\r\n        /// Clear Cache?\r\n        /// </summary>\r\n        public const string SettingsClearCacheTitle = \"LOCSettingsClearCacheTitle\";\r\n        /// <summary>\r\n        /// Playnite restart is required to apply new theme\r\n        /// </summary>\r\n        public const string SettingsSkinChangeRestart = \"LOCSettingsSkinChangeRestart\";\r\n        /// <summary>\r\n        /// Get more themes\r\n        /// </summary>\r\n        public const string SettingsGetThemes = \"LOCSettingsGetThemes\";\r\n        /// <summary>\r\n        /// Create new theme\r\n        /// </summary>\r\n        public const string SettingsCreateThemes = \"LOCSettingsCreateThemes\";\r\n        /// <summary>\r\n        /// Get more extensions\r\n        /// </summary>\r\n        public const string SettingsGetExtensions = \"LOCSettingsGetExtensions\";\r\n        /// <summary>\r\n        /// Create new extension\r\n        /// </summary>\r\n        public const string SettingsCreateExtensions = \"LOCSettingsCreateExtensions\";\r\n        /// <summary>\r\n        /// Help us translate Playnite\r\n        /// </summary>\r\n        public const string SettingsCreateLocalization = \"LOCSettingsCreateLocalization\";\r\n        /// <summary>\r\n        /// Playnite needs to be restarted in order to apply new settings. Restart now?\r\n        /// </summary>\r\n        public const string SettingsRestartAskMessage = \"LOCSettingsRestartAskMessage\";\r\n        /// <summary>\r\n        /// Restart Playnite?\r\n        /// </summary>\r\n        public const string SettingsRestartTitle = \"LOCSettingsRestartTitle\";\r\n        /// <summary>\r\n        /// Playnite cannot move your library files automatically. You must manually move/copy the files before changing the location. If there is no library in the target location, a new one will be created.\r\n        /// </summary>\r\n        public const string SettingsDBPathNotification = \"LOCSettingsDBPathNotification\";\r\n        /// <summary>\r\n        /// Play time will not be recorded if \"Close\" action is set.\r\n        /// </summary>\r\n        public const string SettingsClosePlaytimeNotif = \"LOCSettingsClosePlaytimeNotif\";\r\n        /// <summary>\r\n        /// Number of rows\r\n        /// </summary>\r\n        public const string SettingsFullscreenRows = \"LOCSettingsFullscreenRows\";\r\n        /// <summary>\r\n        /// Number of columns\r\n        /// </summary>\r\n        public const string SettingsFullscreenColumns = \"LOCSettingsFullscreenColumns\";\r\n        /// <summary>\r\n        /// Number of detail view rows\r\n        /// </summary>\r\n        public const string SettingsFullscreenRowDetails = \"LOCSettingsFullscreenRowDetails\";\r\n        /// <summary>\r\n        /// Show Background Image on Main Screen\r\n        /// </summary>\r\n        public const string SettingsFullscreenBackgroundOnMainScreen = \"LOCSettingsFullscreenBackgroundOnMainScreen\";\r\n        /// <summary>\r\n        /// Doesn't apply retrospectively to existing games without re-downloading metadata.\r\n        /// </summary>\r\n        public const string BackgroundImageScreenOptionTooltip = \"LOCBackgroundImageScreenOptionTooltip\";\r\n        /// <summary>\r\n        /// Import playtime of games in library:\r\n        /// </summary>\r\n        public const string SettingsPlaytimeImportMode = \"LOCSettingsPlaytimeImportMode\";\r\n        /// <summary>\r\n        /// Configures when should Playnite import the playtime reported by library plugins for games in the Playnite database. Support by the library plugins in charge of handling the game(s) is needed to be able to use this feature.\r\n        /// </summary>\r\n        public const string SettingsPlaytimeImportModeTooltip = \"LOCSettingsPlaytimeImportModeTooltip\";\r\n        /// <summary>\r\n        /// Always\r\n        /// </summary>\r\n        public const string SettingsPlaytimeImportModeAlways = \"LOCSettingsPlaytimeImportModeAlways\";\r\n        /// <summary>\r\n        /// Only for newly imported games\r\n        /// </summary>\r\n        public const string SettingsPlaytimeImportModeNewImportsOnly = \"LOCSettingsPlaytimeImportModeNewImportsOnly\";\r\n        /// <summary>\r\n        /// Never\r\n        /// </summary>\r\n        public const string SettingsPlaytimeImportModeNever = \"LOCSettingsPlaytimeImportModeNever\";\r\n        /// <summary>\r\n        /// Enable controller support in Desktop Mode\r\n        /// </summary>\r\n        public const string SettingsXInputInDesktopMode = \"LOCSettingsXInputInDesktopMode\";\r\n        /// <summary>\r\n        /// Guide button opens Fullscreen mode\r\n        /// </summary>\r\n        public const string SettingsXInputGuideOpensFullscreen = \"LOCSettingsXInputGuideOpensFullscreen\";\r\n        /// <summary>\r\n        /// Automatic Metadata download settings for newly imported games.\r\n        /// </summary>\r\n        public const string SettingsDefaultMetadataDescription = \"LOCSettingsDefaultMetadataDescription\";\r\n        /// <summary>\r\n        /// Target display\r\n        /// </summary>\r\n        public const string SettingsTargetDisplay = \"LOCSettingsTargetDisplay\";\r\n        /// <summary>\r\n        /// Always use primary display\r\n        /// </summary>\r\n        public const string SettingsAlwaysUsePrimaryDisplay = \"LOCSettingsAlwaysUsePrimaryDisplay\";\r\n        /// <summary>\r\n        /// Show Game Titles\r\n        /// </summary>\r\n        public const string SettingsFullscreenShowGameTitles = \"LOCSettingsFullscreenShowGameTitles\";\r\n        /// <summary>\r\n        /// Show Battery Status\r\n        /// </summary>\r\n        public const string SettingsShowBatteryStatus = \"LOCSettingsShowBatteryStatus\";\r\n        /// <summary>\r\n        /// Show Battery Percentage\r\n        /// </summary>\r\n        public const string SettingsShowBatteryPercentage = \"LOCSettingsShowBatteryPercentage\";\r\n        /// <summary>\r\n        /// Show Clock\r\n        /// </summary>\r\n        public const string SettingsShowClock = \"LOCSettingsShowClock\";\r\n        /// <summary>\r\n        /// Hide Mouse Cursor\r\n        /// </summary>\r\n        public const string SettingsHideMouseCursor = \"LOCSettingsHideMouseCursor\";\r\n        /// <summary>\r\n        /// Installed Only in Quick Filters\r\n        /// </summary>\r\n        public const string SettingsFullscreenQuickFilterInstalled = \"LOCSettingsFullscreenQuickFilterInstalled\";\r\n        /// <summary>\r\n        /// Button Prompts\r\n        /// </summary>\r\n        public const string SettingsFullscreenButtonPrompts = \"LOCSettingsFullscreenButtonPrompts\";\r\n        /// <summary>\r\n        /// Layout\r\n        /// </summary>\r\n        public const string SettingsFullscreenLayout = \"LOCSettingsFullscreenLayout\";\r\n        /// <summary>\r\n        /// Horizontal Scrolling\r\n        /// </summary>\r\n        public const string SettingsFullscreenHorizontalScrolling = \"LOCSettingsFullscreenHorizontalScrolling\";\r\n        /// <summary>\r\n        /// Select one of the subsections\r\n        /// </summary>\r\n        public const string SettingsSelectChildSection = \"LOCSettingsSelectChildSection\";\r\n        /// <summary>\r\n        /// No settings available\r\n        /// </summary>\r\n        public const string SettingsNoSettingsAvailable = \"LOCSettingsNoSettingsAvailable\";\r\n        /// <summary>\r\n        /// Failed to load settings\r\n        /// </summary>\r\n        public const string SettingsErrorLoadingSettings = \"LOCSettingsErrorLoadingSettings\";\r\n        /// <summary>\r\n        /// These scripts are executed for every game in the library. Individual scripts can be assigned to each game separately while editing game details.\r\n        /// </summary>\r\n        public const string SettingsScriptingNotice = \"LOCSettingsScriptingNotice\";\r\n        /// <summary>\r\n        /// Animate background image transitions\r\n        /// </summary>\r\n        public const string SettingsBackgroundImageAnimation = \"LOCSettingsBackgroundImageAnimation\";\r\n        /// <summary>\r\n        /// Font sizes\r\n        /// </summary>\r\n        public const string SettingsFontSizes = \"LOCSettingsFontSizes\";\r\n        /// <summary>\r\n        /// Auto\r\n        /// </summary>\r\n        public const string SettingsTextRenderingModeOptionAuto = \"LOCSettingsTextRenderingModeOptionAuto\";\r\n        /// <summary>\r\n        /// Aliased\r\n        /// </summary>\r\n        public const string SettingsTextRenderingModeOptionAliased = \"LOCSettingsTextRenderingModeOptionAliased\";\r\n        /// <summary>\r\n        /// Grayscale\r\n        /// </summary>\r\n        public const string SettingsTextRenderingModeOptionGrayscale = \"LOCSettingsTextRenderingModeOptionGrayscale\";\r\n        /// <summary>\r\n        /// ClearType\r\n        /// </summary>\r\n        public const string SettingsTextRenderingModeOptionClearType = \"LOCSettingsTextRenderingModeOptionClearType\";\r\n        /// <summary>\r\n        /// Ideal\r\n        /// </summary>\r\n        public const string SettingsTextFormattingModeOptionIdeal = \"LOCSettingsTextFormattingModeOptionIdeal\";\r\n        /// <summary>\r\n        /// Display\r\n        /// </summary>\r\n        public const string SettingsTextFormattingModeOptionDisplay = \"LOCSettingsTextFormattingModeOptionDisplay\";\r\n        /// <summary>\r\n        /// Text formatting mode\r\n        /// </summary>\r\n        public const string SettingsTextFormattingMode = \"LOCSettingsTextFormattingMode\";\r\n        /// <summary>\r\n        /// Text rendering mode\r\n        /// </summary>\r\n        public const string SettingsTextRenderingMode = \"LOCSettingsTextRenderingMode\";\r\n        /// <summary>\r\n        /// Text rendering and formatting methods are currently not used for game descriptions.\r\n        /// </summary>\r\n        public const string SettingsTextRenderingNotice = \"LOCSettingsTextRenderingNotice\";\r\n        /// <summary>\r\n        /// Preload background images\r\n        /// </summary>\r\n        public const string SettingsImmediateBackgroundDownload = \"LOCSettingsImmediateBackgroundDownload\";\r\n        /// <summary>\r\n        /// If enabled, Playnite will download background artwork while downloading metadata, using more disk space and making artwork available when offline.\r\n        /// </summary>\r\n        public const string SettingsImmediateBackgroundDownloadTooltip = \"LOCSettingsImmediateBackgroundDownloadTooltip\";\r\n        /// <summary>\r\n        /// Automatically close third party client after game exits\r\n        /// </summary>\r\n        public const string SettingsAutoCloseLauncherOption = \"LOCSettingsAutoCloseLauncherOption\";\r\n        /// <summary>\r\n        /// Client shutdown delay (in seconds)\r\n        /// </summary>\r\n        public const string SettingsAutoCloseGracePeriod = \"LOCSettingsAutoCloseGracePeriod\";\r\n        /// <summary>\r\n        /// Don't close after game sessions shorter than (in seconds)\r\n        /// </summary>\r\n        public const string SettingsAutoCloseMinimalSessionTime = \"LOCSettingsAutoCloseMinimalSessionTime\";\r\n        /// <summary>\r\n        /// Automatically close following clients:\r\n        /// </summary>\r\n        public const string SettingsAutoCloseSpecificClients = \"LOCSettingsAutoCloseSpecificClients\";\r\n        /// <summary>\r\n        /// Auto Close Clients\r\n        /// </summary>\r\n        public const string SettingsAutoCloseSection = \"LOCSettingsAutoCloseSection\";\r\n        /// <summary>\r\n        /// Import Exclusion List\r\n        /// </summary>\r\n        public const string SettingsImportExclusionList = \"LOCSettingsImportExclusionList\";\r\n        /// <summary>\r\n        /// Display warning when assigning too large game media\r\n        /// </summary>\r\n        public const string SettingsShowMediaSizeWarning = \"LOCSettingsShowMediaSizeWarning\";\r\n        /// <summary>\r\n        /// Folder open command\r\n        /// </summary>\r\n        public const string OpenDirectoryCommand = \"LOCOpenDirectoryCommand\";\r\n        /// <summary>\r\n        /// Preferred age rating organization\r\n        /// </summary>\r\n        public const string SettingsPreferredAgeRatingOrg = \"LOCSettingsPreferredAgeRatingOrg\";\r\n        /// <summary>\r\n        /// Update install size of games on library update\r\n        /// </summary>\r\n        public const string SettingsScanLibInstallSizeOnLibUpdate = \"LOCSettingsScanLibInstallSizeOnLibUpdate\";\r\n        /// <summary>\r\n        /// Scans and updates the install size of games if it is detected that their files have been modified since the last scan\r\n        /// </summary>\r\n        public const string SettingsScanLibInstallSizeOnLibUpdateTooltip = \"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\";\r\n        /// <summary>\r\n        /// None\r\n        /// </summary>\r\n        public const string StrechNone = \"LOCStrechNone\";\r\n        /// <summary>\r\n        /// Fill\r\n        /// </summary>\r\n        public const string StrechFill = \"LOCStrechFill\";\r\n        /// <summary>\r\n        /// Uniform\r\n        /// </summary>\r\n        public const string StrechUniform = \"LOCStrechUniform\";\r\n        /// <summary>\r\n        /// Uniform to fill\r\n        /// </summary>\r\n        public const string StrechUniformToFill = \"LOCStrechUniformToFill\";\r\n        /// <summary>\r\n        /// Left\r\n        /// </summary>\r\n        public const string DockLeft = \"LOCDockLeft\";\r\n        /// <summary>\r\n        /// Right\r\n        /// </summary>\r\n        public const string DockRight = \"LOCDockRight\";\r\n        /// <summary>\r\n        /// Top\r\n        /// </summary>\r\n        public const string DockTop = \"LOCDockTop\";\r\n        /// <summary>\r\n        /// Bottom\r\n        /// </summary>\r\n        public const string DockBottom = \"LOCDockBottom\";\r\n        /// <summary>\r\n        /// Import Error\r\n        /// </summary>\r\n        public const string ImportError = \"LOCImportError\";\r\n        /// <summary>\r\n        /// Authentification required\r\n        /// </summary>\r\n        public const string LoginRequired = \"LOCLoginRequired\";\r\n        /// <summary>\r\n        /// Authentification failed\r\n        /// </summary>\r\n        public const string LoginFailed = \"LOCLoginFailed\";\r\n        /// <summary>\r\n        /// Alternative web view rendering mode\r\n        /// </summary>\r\n        public const string SettingsAltWebViewRendering = \"LOCSettingsAltWebViewRendering\";\r\n        /// <summary>\r\n        /// Use when experiencing issues with web views, for example integration authentication dialogs.\r\n        /// </summary>\r\n        public const string SettingsAltWebViewRenderingTooltip = \"LOCSettingsAltWebViewRenderingTooltip\";\r\n        /// <summary>\r\n        /// Partial loading of large game descriptions\r\n        /// </summary>\r\n        public const string SettingsPartialDescriptionLoading = \"LOCSettingsPartialDescriptionLoading\";\r\n        /// <summary>\r\n        /// Large descriptions can cause noticeable lag when selecting games.\r\n        /// </summary>\r\n        public const string SettingsPartialDescriptionLoadingTooltip = \"LOCSettingsPartialDescriptionLoadingTooltip\";\r\n        /// <summary>\r\n        /// Metadata Import\r\n        /// </summary>\r\n        public const string MetaImportWindowTitle = \"LOCMetaImportWindowTitle\";\r\n        /// <summary>\r\n        /// Download Metadata\r\n        /// </summary>\r\n        public const string DownloadMetaButton = \"LOCDownloadMetaButton\";\r\n        /// <summary>\r\n        /// Set selected configuration to be used for any future metadata downloads.\r\n        /// </summary>\r\n        public const string SaveDefaultTooltip = \"LOCSaveDefaultTooltip\";\r\n        /// <summary>\r\n        /// Emulation Import Wizard\r\n        /// </summary>\r\n        public const string EmuWizardWindowTitle = \"LOCEmuWizardWindowTitle\";\r\n        /// <summary>\r\n        /// This wizard will guide you through the process of downloading and importing console emulators and importing emulated games.\r\n        /// </summary>\r\n        public const string EmuWizardIntro = \"LOCEmuWizardIntro\";\r\n        /// <summary>\r\n        /// Keep in mind that you can always add additional emulators and/or games later via main menu (under \"Library\" menu for Emulator settings and \"Add Games\" menu for emulated games).\r\n        /// </summary>\r\n        public const string EmuWizardNotice = \"LOCEmuWizardNotice\";\r\n        /// <summary>\r\n        /// Below is a list of emulators that Playnite can recognize and configure automatically. You can download emulator installers from their websites. Once you have the emulators installed (manually), you can import them on emulator configuration dialog.\r\n        /// </summary>\r\n        public const string EmuDownloadDescription = \"LOCEmuDownloadDescription\";\r\n        /// <summary>\r\n        /// You can import any emulators that are installed on your PC by clicking the 'Autodetect From Folder…' button. Playnite will search the selected folder for any known emulators and provide the option to import them. You can use this button multiple times to import emulators from different folders. Emulators will be added to the bottom of the current list.\r\n        /// </summary>\r\n        public const string EmuWizardEmuImportIntro = \"LOCEmuWizardEmuImportIntro\";\r\n        /// <summary>\r\n        /// You can import games by clicking the 'Scan Folder Using Emulator' button. Selecting the appropriate emulator will tell Playnite which file types should be scanned and imported. You can use this button multiple times to import games from different folders. Games will be added to the bottom of the current list.\r\n        /// </summary>\r\n        public const string EmuWizardGameImportIntro = \"LOCEmuWizardGameImportIntro\";\r\n        /// <summary>\r\n        /// There are no emulators selected for import. You won't be able to automatically import any emulated games without configuring emulators first. Are you sure you want to continue and exit import process?\r\n        /// </summary>\r\n        public const string EmuWizardNoEmulatorWarning = \"LOCEmuWizardNoEmulatorWarning\";\r\n        /// <summary>\r\n        /// There are no emulators configured in Playnite. You cannot import games without first configuring the emulator and selecting the appropriate file types. Do you want to add some emulators now?\r\n        /// </summary>\r\n        public const string EmuWizardNoEmulatorForGamesWarning = \"LOCEmuWizardNoEmulatorForGamesWarning\";\r\n        /// <summary>\r\n        /// Scan folder using Emulator\r\n        /// </summary>\r\n        public const string EmuWizardButtonScanGames = \"LOCEmuWizardButtonScanGames\";\r\n        /// <summary>\r\n        /// Select files\r\n        /// </summary>\r\n        public const string EmuWizardButtonSelectFiles = \"LOCEmuWizardButtonSelectFiles\";\r\n        /// <summary>\r\n        /// Autodetect From Folder…\r\n        /// </summary>\r\n        public const string EmuWizardButtonScanEmulator = \"LOCEmuWizardButtonScanEmulator\";\r\n        /// <summary>\r\n        /// Configure Emulators…\r\n        /// </summary>\r\n        public const string EmuWizardButtonConfigureEmulator = \"LOCEmuWizardButtonConfigureEmulator\";\r\n        /// <summary>\r\n        /// Scanning…\r\n        /// </summary>\r\n        public const string EmuWizardScanning = \"LOCEmuWizardScanning\";\r\n        /// <summary>\r\n        /// Scanning {0}…\r\n        /// </summary>\r\n        public const string EmuWizardScanningSpecific = \"LOCEmuWizardScanningSpecific\";\r\n        /// <summary>\r\n        /// First Time Configuration\r\n        /// </summary>\r\n        public const string FirstWindowTitle = \"LOCFirstWindowTitle\";\r\n        /// <summary>\r\n        /// This process will guide you through an automatic import and configuration of external game libraries. Playnite can automatically import games from multiple game services, such as Steam or GOG.\r\n        /// </summary>\r\n        public const string FirstIntro = \"LOCFirstIntro\";\r\n        /// <summary>\r\n        /// Library Integration\r\n        /// </summary>\r\n        public const string FirstExternalTitle = \"LOCFirstExternalTitle\";\r\n        /// <summary>\r\n        /// Following is the list of some curated library integrations Playnite supports. Please select ones you want to install.\r\n        /// </summary>\r\n        public const string FirstImportIntroduction = \"LOCFirstImportIntroduction\";\r\n        /// <summary>\r\n        /// Configuration Finished\r\n        /// </summary>\r\n        public const string FirstConfigFinishedTitle = \"LOCFirstConfigFinishedTitle\";\r\n        /// <summary>\r\n        /// The initial setup has been completed. Remember that you can change all settings later as well as add additional integrations from main menu.\r\n        /// </summary>\r\n        public const string FirstConfigFinishedText = \"LOCFirstConfigFinishedText\";\r\n        /// <summary>\r\n        /// Failed to download one or more extensions.\r\n        /// </summary>\r\n        public const string FirstPluginDownloadError = \"LOCFirstPluginDownloadError\";\r\n        /// <summary>\r\n        /// Downloading {0} integration…\r\n        /// </summary>\r\n        public const string FirstDownloadingAddon = \"LOCFirstDownloadingAddon\";\r\n        /// <summary>\r\n        /// Downloading list of recommended integrations…\r\n        /// </summary>\r\n        public const string DefaultAddonListDownload = \"LOCDefaultAddonListDownload\";\r\n        /// <summary>\r\n        /// Failed to download list of recommended integrations. You can try and re-download integrations later via the Addons menu.\r\n        /// </summary>\r\n        public const string DefaultAddonListDownloadError = \"LOCDefaultAddonListDownloadError\";\r\n        /// <summary>\r\n        /// Configure Platforms and Emulators\r\n        /// </summary>\r\n        public const string PlatformsWindowTitle = \"LOCPlatformsWindowTitle\";\r\n        /// <summary>\r\n        /// Configure Emulators\r\n        /// </summary>\r\n        public const string EmulatorsWindowTitle = \"LOCEmulatorsWindowTitle\";\r\n        /// <summary>\r\n        /// Platforms\r\n        /// </summary>\r\n        public const string PlatformsTitle = \"LOCPlatformsTitle\";\r\n        /// <summary>\r\n        /// Platform\r\n        /// </summary>\r\n        public const string PlatformTitle = \"LOCPlatformTitle\";\r\n        /// <summary>\r\n        /// Emulators\r\n        /// </summary>\r\n        public const string EmulatorsTitle = \"LOCEmulatorsTitle\";\r\n        /// <summary>\r\n        /// Emulator\r\n        /// </summary>\r\n        public const string EmulatorTitle = \"LOCEmulatorTitle\";\r\n        /// <summary>\r\n        /// Add Platform\r\n        /// </summary>\r\n        public const string AddPlatformTitle = \"LOCAddPlatformTitle\";\r\n        /// <summary>\r\n        /// Select Icon\r\n        /// </summary>\r\n        public const string SelectIconTitle = \"LOCSelectIconTitle\";\r\n        /// <summary>\r\n        /// Select Cover\r\n        /// </summary>\r\n        public const string SelectCoverTitle = \"LOCSelectCoverTitle\";\r\n        /// <summary>\r\n        /// Select Image\r\n        /// </summary>\r\n        public const string SelectImageTitle = \"LOCSelectImageTitle\";\r\n        /// <summary>\r\n        /// Select Item\r\n        /// </summary>\r\n        public const string SelectItemTitle = \"LOCSelectItemTitle\";\r\n        /// <summary>\r\n        /// Select Background\r\n        /// </summary>\r\n        public const string SelectBackgroundTitle = \"LOCSelectBackgroundTitle\";\r\n        /// <summary>\r\n        /// Select File\r\n        /// </summary>\r\n        public const string SelectFileTitle = \"LOCSelectFileTitle\";\r\n        /// <summary>\r\n        /// Select URL\r\n        /// </summary>\r\n        public const string SelectUrlTitle = \"LOCSelectUrlTitle\";\r\n        /// <summary>\r\n        /// Add Emulator\r\n        /// </summary>\r\n        public const string AddEmulatorTitle = \"LOCAddEmulatorTitle\";\r\n        /// <summary>\r\n        /// Supported Platform(s)\r\n        /// </summary>\r\n        public const string SupportedPlatformsTitle = \"LOCSupportedPlatformsTitle\";\r\n        /// <summary>\r\n        /// Do you want to save platform changes?\r\n        /// </summary>\r\n        public const string ConfirmUnsavedPlatformsTitle = \"LOCConfirmUnsavedPlatformsTitle\";\r\n        /// <summary>\r\n        /// Do you want to save emulator changes?\r\n        /// </summary>\r\n        public const string ConfirmUnsavedEmulatorsTitle = \"LOCConfirmUnsavedEmulatorsTitle\";\r\n        /// <summary>\r\n        /// Executable\r\n        /// </summary>\r\n        public const string ExecutableTitle = \"LOCExecutableTitle\";\r\n        /// <summary>\r\n        /// Arguments\r\n        /// </summary>\r\n        public const string ArgumentsTitle = \"LOCArgumentsTitle\";\r\n        /// <summary>\r\n        /// Working Directory\r\n        /// </summary>\r\n        public const string WorkingDirTitle = \"LOCWorkingDirTitle\";\r\n        /// <summary>\r\n        /// Supported File Types\r\n        /// </summary>\r\n        public const string SupportedFilesTitle = \"LOCSupportedFilesTitle\";\r\n        /// <summary>\r\n        /// Import Emulators…\r\n        /// </summary>\r\n        public const string ImportEmulatorsButton = \"LOCImportEmulatorsButton\";\r\n        /// <summary>\r\n        /// Download Emulators…\r\n        /// </summary>\r\n        public const string DownloadEmulatorsButton = \"LOCDownloadEmulatorsButton\";\r\n        /// <summary>\r\n        /// Load arguments preset from known emulator profile\r\n        /// </summary>\r\n        public const string EmuLoadArgsPresetTooltip = \"LOCEmuLoadArgsPresetTooltip\";\r\n        /// <summary>\r\n        /// Are you sure you want to remove {0} emulator?\r\n        /// </summary>\r\n        public const string EmuRemovalConfirmation = \"LOCEmuRemovalConfirmation\";\r\n        /// <summary>\r\n        /// Are you sure you want to remove {0} platform?\r\n        /// </summary>\r\n        public const string PlatformRemovalConfirmation = \"LOCPlatformRemovalConfirmation\";\r\n        /// <summary>\r\n        /// Settings help\r\n        /// </summary>\r\n        public const string EmulatorSettingsHelp = \"LOCEmulatorSettingsHelp\";\r\n        /// <summary>\r\n        /// Sort By\r\n        /// </summary>\r\n        public const string MenuSortByTitle = \"LOCMenuSortByTitle\";\r\n        /// <summary>\r\n        /// Sort Direction\r\n        /// </summary>\r\n        public const string MenuSortByDirection = \"LOCMenuSortByDirection\";\r\n        /// <summary>\r\n        /// Group By\r\n        /// </summary>\r\n        public const string MenuGroupByTitle = \"LOCMenuGroupByTitle\";\r\n        /// <summary>\r\n        /// Ascending\r\n        /// </summary>\r\n        public const string MenuSortAscending = \"LOCMenuSortAscending\";\r\n        /// <summary>\r\n        /// Descending\r\n        /// </summary>\r\n        public const string MenuSortDescending = \"LOCMenuSortDescending\";\r\n        /// <summary>\r\n        /// Don't group\r\n        /// </summary>\r\n        public const string MenuGroupDont = \"LOCMenuGroupDont\";\r\n        /// <summary>\r\n        /// Group by Library\r\n        /// </summary>\r\n        public const string MenuGroupProvider = \"LOCMenuGroupProvider\";\r\n        /// <summary>\r\n        /// Group by Category\r\n        /// </summary>\r\n        public const string MenuGroupCategory = \"LOCMenuGroupCategory\";\r\n        /// <summary>\r\n        /// Group by Platform\r\n        /// </summary>\r\n        public const string MenuGroupPlatform = \"LOCMenuGroupPlatform\";\r\n        /// <summary>\r\n        /// View Type\r\n        /// </summary>\r\n        public const string ViewType = \"LOCViewType\";\r\n        /// <summary>\r\n        /// View\r\n        /// </summary>\r\n        public const string MenuView = \"LOCMenuView\";\r\n        /// <summary>\r\n        /// Explorer Panel\r\n        /// </summary>\r\n        public const string MenuViewExplorerPanel = \"LOCMenuViewExplorerPanel\";\r\n        /// <summary>\r\n        /// Filter Panel\r\n        /// </summary>\r\n        public const string MenuViewFilterPanel = \"LOCMenuViewFilterPanel\";\r\n        /// <summary>\r\n        /// Icon\r\n        /// </summary>\r\n        public const string GameIconTitle = \"LOCGameIconTitle\";\r\n        /// <summary>\r\n        /// Library Icon\r\n        /// </summary>\r\n        public const string LibraryIconTitle = \"LOCLibraryIconTitle\";\r\n        /// <summary>\r\n        /// Cover Image\r\n        /// </summary>\r\n        public const string GameCoverImageTitle = \"LOCGameCoverImageTitle\";\r\n        /// <summary>\r\n        /// Background Image\r\n        /// </summary>\r\n        public const string GameBackgroundTitle = \"LOCGameBackgroundTitle\";\r\n        /// <summary>\r\n        /// Sorting Name\r\n        /// </summary>\r\n        public const string GameSortingNameTitle = \"LOCGameSortingNameTitle\";\r\n        /// <summary>\r\n        /// Library\r\n        /// </summary>\r\n        public const string GameProviderTitle = \"LOCGameProviderTitle\";\r\n        /// <summary>\r\n        /// Manual\r\n        /// </summary>\r\n        public const string GameManualTitle = \"LOCGameManualTitle\";\r\n        /// <summary>\r\n        /// Name\r\n        /// </summary>\r\n        public const string GameNameTitle = \"LOCGameNameTitle\";\r\n        /// <summary>\r\n        /// Install Drive\r\n        /// </summary>\r\n        public const string InstallDriveTitle = \"LOCInstallDriveTitle\";\r\n        /// <summary>\r\n        /// Account Name\r\n        /// </summary>\r\n        public const string GameAccountNameTitle = \"LOCGameAccountNameTitle\";\r\n        /// <summary>\r\n        /// Platform\r\n        /// </summary>\r\n        public const string GamePlatformTitle = \"LOCGamePlatformTitle\";\r\n        /// <summary>\r\n        /// Category\r\n        /// </summary>\r\n        public const string GameCategoriesTitle = \"LOCGameCategoriesTitle\";\r\n        /// <summary>\r\n        /// Genre\r\n        /// </summary>\r\n        public const string GameGenresTitle = \"LOCGameGenresTitle\";\r\n        /// <summary>\r\n        /// Release Date\r\n        /// </summary>\r\n        public const string GameReleaseDateTitle = \"LOCGameReleaseDateTitle\";\r\n        /// <summary>\r\n        /// Release Year\r\n        /// </summary>\r\n        public const string GameReleaseYearTitle = \"LOCGameReleaseYearTitle\";\r\n        /// <summary>\r\n        /// Developer\r\n        /// </summary>\r\n        public const string GameDevelopersTitle = \"LOCGameDevelopersTitle\";\r\n        /// <summary>\r\n        /// Tag\r\n        /// </summary>\r\n        public const string GameTagsTitle = \"LOCGameTagsTitle\";\r\n        /// <summary>\r\n        /// Publisher\r\n        /// </summary>\r\n        public const string GamePublishersTitle = \"LOCGamePublishersTitle\";\r\n        /// <summary>\r\n        /// Installation Status\r\n        /// </summary>\r\n        public const string GameInstallationStatus = \"LOCGameInstallationStatus\";\r\n        /// <summary>\r\n        /// Match all filters\r\n        /// </summary>\r\n        public const string UseFilterStyleAndTitle = \"LOCUseFilterStyleAndTitle\";\r\n        /// <summary>\r\n        /// If enabled, only games that use all the items in all the filters will be included in the view.\r\n        /// </summary>\r\n        public const string UseFilterStyleAndTooltip = \"LOCUseFilterStyleAndTooltip\";\r\n        /// <summary>\r\n        /// Installed\r\n        /// </summary>\r\n        public const string GameIsInstalledTitle = \"LOCGameIsInstalledTitle\";\r\n        /// <summary>\r\n        /// Installed\r\n        /// </summary>\r\n        public const string GameIsGameInstalledTitle = \"LOCGameIsGameInstalledTitle\";\r\n        /// <summary>\r\n        /// Not installed\r\n        /// </summary>\r\n        public const string GameIsUnInstalledTitle = \"LOCGameIsUnInstalledTitle\";\r\n        /// <summary>\r\n        /// Hidden\r\n        /// </summary>\r\n        public const string GameHiddenTitle = \"LOCGameHiddenTitle\";\r\n        /// <summary>\r\n        /// Favorite\r\n        /// </summary>\r\n        public const string GameFavoriteTitle = \"LOCGameFavoriteTitle\";\r\n        /// <summary>\r\n        /// Enable HDR Support\r\n        /// </summary>\r\n        public const string GameHdrTitle = \"LOCGameHdrTitle\";\r\n        /// <summary>\r\n        /// If enabled, HDR will be enabled on the primary display before starting the game.\r\n        /// </summary>\r\n        public const string GameHdrTooltip = \"LOCGameHdrTooltip\";\r\n        /// <summary>\r\n        /// Note that HDR is not supported on your primary display.\r\n        /// </summary>\r\n        public const string GameHdrNotSupportedTooltip = \"LOCGameHdrNotSupportedTooltip\";\r\n        /// <summary>\r\n        /// Last Played\r\n        /// </summary>\r\n        public const string GameLastActivityTitle = \"LOCGameLastActivityTitle\";\r\n        /// <summary>\r\n        /// Category\r\n        /// </summary>\r\n        public const string GameCategoryTitle = \"LOCGameCategoryTitle\";\r\n        /// <summary>\r\n        /// Description\r\n        /// </summary>\r\n        public const string GameDescriptionTitle = \"LOCGameDescriptionTitle\";\r\n        /// <summary>\r\n        /// Installation Folder\r\n        /// </summary>\r\n        public const string GameInstallDirTitle = \"LOCGameInstallDirTitle\";\r\n        /// <summary>\r\n        /// Cover Image\r\n        /// </summary>\r\n        public const string GameCoverTitle = \"LOCGameCoverTitle\";\r\n        /// <summary>\r\n        /// Links\r\n        /// </summary>\r\n        public const string GameLinksTitle = \"LOCGameLinksTitle\";\r\n        /// <summary>\r\n        /// Image, ROM or ISO Path\r\n        /// </summary>\r\n        public const string GameROMTitle = \"LOCGameROMTitle\";\r\n        /// <summary>\r\n        /// Genre\r\n        /// </summary>\r\n        public const string GenreLabel = \"LOCGenreLabel\";\r\n        /// <summary>\r\n        /// Genres\r\n        /// </summary>\r\n        public const string GenresLabel = \"LOCGenresLabel\";\r\n        /// <summary>\r\n        /// Company\r\n        /// </summary>\r\n        public const string CompanyLabel = \"LOCCompanyLabel\";\r\n        /// <summary>\r\n        /// Companies\r\n        /// </summary>\r\n        public const string CompaniesLabel = \"LOCCompaniesLabel\";\r\n        /// <summary>\r\n        /// Developer\r\n        /// </summary>\r\n        public const string DeveloperLabel = \"LOCDeveloperLabel\";\r\n        /// <summary>\r\n        /// Developers\r\n        /// </summary>\r\n        public const string DevelopersLabel = \"LOCDevelopersLabel\";\r\n        /// <summary>\r\n        /// Publisher\r\n        /// </summary>\r\n        public const string PublisherLabel = \"LOCPublisherLabel\";\r\n        /// <summary>\r\n        /// Publishers\r\n        /// </summary>\r\n        public const string PublishersLabel = \"LOCPublishersLabel\";\r\n        /// <summary>\r\n        /// Category\r\n        /// </summary>\r\n        public const string CategoryLabel = \"LOCCategoryLabel\";\r\n        /// <summary>\r\n        /// Categories\r\n        /// </summary>\r\n        public const string CategoriesLabel = \"LOCCategoriesLabel\";\r\n        /// <summary>\r\n        /// Tag\r\n        /// </summary>\r\n        public const string TagLabel = \"LOCTagLabel\";\r\n        /// <summary>\r\n        /// Tags\r\n        /// </summary>\r\n        public const string TagsLabel = \"LOCTagsLabel\";\r\n        /// <summary>\r\n        /// Feature\r\n        /// </summary>\r\n        public const string FeatureLabel = \"LOCFeatureLabel\";\r\n        /// <summary>\r\n        /// Features\r\n        /// </summary>\r\n        public const string FeaturesLabel = \"LOCFeaturesLabel\";\r\n        /// <summary>\r\n        /// Age Rating\r\n        /// </summary>\r\n        public const string AgeRatingLabel = \"LOCAgeRatingLabel\";\r\n        /// <summary>\r\n        /// Age Ratings\r\n        /// </summary>\r\n        public const string AgeRatingsLabel = \"LOCAgeRatingsLabel\";\r\n        /// <summary>\r\n        /// Region\r\n        /// </summary>\r\n        public const string RegionLabel = \"LOCRegionLabel\";\r\n        /// <summary>\r\n        /// Regions\r\n        /// </summary>\r\n        public const string RegionsLabel = \"LOCRegionsLabel\";\r\n        /// <summary>\r\n        /// Source\r\n        /// </summary>\r\n        public const string SourceLabel = \"LOCSourceLabel\";\r\n        /// <summary>\r\n        /// Sources\r\n        /// </summary>\r\n        public const string SourcesLabel = \"LOCSourcesLabel\";\r\n        /// <summary>\r\n        /// Recent Activity\r\n        /// </summary>\r\n        public const string RecentActivityLabel = \"LOCRecentActivityLabel\";\r\n        /// <summary>\r\n        /// Database Error\r\n        /// </summary>\r\n        public const string DatabaseErroTitle = \"LOCDatabaseErroTitle\";\r\n        /// <summary>\r\n        /// Failed to open library database.\r\n        /// </summary>\r\n        public const string DatabaseOpenError = \"LOCDatabaseOpenError\";\r\n        /// <summary>\r\n        /// Database is not opened.\r\n        /// </summary>\r\n        public const string DatabaseNotOpenedError = \"LOCDatabaseNotOpenedError\";\r\n        /// <summary>\r\n        /// Cannot access library database. File \"{0}\" is being used by another process or it's in inaccessible location.\r\n        /// </summary>\r\n        public const string DatabaseOpenAccessError = \"LOCDatabaseOpenAccessError\";\r\n        /// <summary>\r\n        /// Failed to create diagnostics package.\r\n        /// </summary>\r\n        public const string DiagPackageCreationError = \"LOCDiagPackageCreationError\";\r\n        /// <summary>\r\n        /// Failed to automatically upload diagnostics package.\r\n        /// </summary>\r\n        public const string DiagPackageUploadError = \"LOCDiagPackageUploadError\";\r\n        /// <summary>\r\n        /// Diagnostics information was sent successfully.\r\n        /// </summary>\r\n        public const string DiagPackageSentSuccess = \"LOCDiagPackageSentSuccess\";\r\n        /// <summary>\r\n        /// The diagnostics package has been created and submitted successfully.\r\n        /// </summary>\r\n        public const string DiagPackageCreationSuccess = \"LOCDiagPackageCreationSuccess\";\r\n        /// <summary>\r\n        /// Failed to import games from {0}.\r\n        /// </summary>\r\n        public const string LibraryImportError = \"LOCLibraryImportError\";\r\n        /// <summary>\r\n        /// Failed to import emulated games from {0}.\r\n        /// </summary>\r\n        public const string LibraryImportEmulatedError = \"LOCLibraryImportEmulatedError\";\r\n        /// <summary>\r\n        /// Cannot search for games by selected emulator profile. Profile doesn't contain any file extensions or platforms.\r\n        /// </summary>\r\n        public const string ScanEmulatorGamesEmptyProfileError = \"LOCScanEmulatorGamesEmptyProfileError\";\r\n        /// <summary>\r\n        /// Playnite failed to start. Please close all other instances and try again.\r\n        /// </summary>\r\n        public const string StartGenericError = \"LOCStartGenericError\";\r\n        /// <summary>\r\n        /// Failed to apply theme \"{0}\", color profile \"{1}\"\r\n        /// </summary>\r\n        public const string SkinApplyError = \"LOCSkinApplyError\";\r\n        /// <summary>\r\n        /// Cannot open link, URL is not in valid format.\r\n        /// </summary>\r\n        public const string URLFormatError = \"LOCURLFormatError\";\r\n        /// <summary>\r\n        /// Failed to start the application.\r\n        /// </summary>\r\n        public const string AppStartupError = \"LOCAppStartupError\";\r\n        /// <summary>\r\n        /// Failed to initialize web view component. Playnite cannot continue with startup process.\r\n        /// </summary>\r\n        public const string CefSharpInitError = \"LOCCefSharpInitError\";\r\n        /// <summary>\r\n        /// Cannot import emulators due to missing or corrupted definition file.\r\n        /// </summary>\r\n        public const string EmulatorImportNoDefinitionsError = \"LOCEmulatorImportNoDefinitionsError\";\r\n        /// <summary>\r\n        /// Failed to execute menu action.\r\n        /// </summary>\r\n        public const string MenuActionExecError = \"LOCMenuActionExecError\";\r\n        /// <summary>\r\n        /// Edit Game Details\r\n        /// </summary>\r\n        public const string GameEditWindowTitle = \"LOCGameEditWindowTitle\";\r\n        /// <summary>\r\n        /// Image URL\r\n        /// </summary>\r\n        public const string ImageURL = \"LOCImageURL\";\r\n        /// <summary>\r\n        /// Add Link\r\n        /// </summary>\r\n        public const string AddLinkButton = \"LOCAddLinkButton\";\r\n        /// <summary>\r\n        /// Add ROM\r\n        /// </summary>\r\n        public const string AddRom = \"LOCAddRom\";\r\n        /// <summary>\r\n        /// Save Changes\r\n        /// </summary>\r\n        public const string SaveChanges = \"LOCSaveChanges\";\r\n        /// <summary>\r\n        /// Apply field changes to game(s) being edited.\r\n        /// </summary>\r\n        public const string GameEditChangeSaveTooltip = \"LOCGameEditChangeSaveTooltip\";\r\n        /// <summary>\r\n        /// Add Action\r\n        /// </summary>\r\n        public const string AddAction = \"LOCAddAction\";\r\n        /// <summary>\r\n        /// Remove\r\n        /// </summary>\r\n        public const string DeleteAction = \"LOCDeleteAction\";\r\n        /// <summary>\r\n        /// Remove Play Action\r\n        /// </summary>\r\n        public const string RemovePlayAction = \"LOCRemovePlayAction\";\r\n        /// <summary>\r\n        /// Add Games\r\n        /// </summary>\r\n        public const string AddGames = \"LOCAddGames\";\r\n        /// <summary>\r\n        /// Scan Folder…\r\n        /// </summary>\r\n        public const string ScanFolder = \"LOCScanFolder\";\r\n        /// <summary>\r\n        /// Detect Installed\r\n        /// </summary>\r\n        public const string DetectInstalled = \"LOCDetectInstalled\";\r\n        /// <summary>\r\n        /// Browse…\r\n        /// </summary>\r\n        public const string Browse = \"LOCBrowse\";\r\n        /// <summary>\r\n        /// Open Playnite\r\n        /// </summary>\r\n        public const string OpenPlaynite = \"LOCOpenPlaynite\";\r\n        /// <summary>\r\n        /// Profile Settings\r\n        /// </summary>\r\n        public const string ProfileSettings = \"LOCProfileSettings\";\r\n        /// <summary>\r\n        /// Game name cannot be empty.\r\n        /// </summary>\r\n        public const string EmptyGameNameError = \"LOCEmptyGameNameError\";\r\n        /// <summary>\r\n        /// Game action tracking directory cannot be empty.\r\n        /// </summary>\r\n        public const string EmptyTrackingFolderError = \"LOCEmptyTrackingFolderError\";\r\n        /// <summary>\r\n        /// Game name cannot be empty before searching metadata.\r\n        /// </summary>\r\n        public const string EmptyGameNameMetaSearchError = \"LOCEmptyGameNameMetaSearchError\";\r\n        /// <summary>\r\n        /// Invalid game data\r\n        /// </summary>\r\n        public const string InvalidGameData = \"LOCInvalidGameData\";\r\n        /// <summary>\r\n        /// Enter valid web URL starting with http:// or https://\r\n        /// </summary>\r\n        public const string URLInputInfo = \"LOCURLInputInfo\";\r\n        /// <summary>\r\n        /// Select URL\r\n        /// </summary>\r\n        public const string URLInputInfoTitile = \"LOCURLInputInfoTitile\";\r\n        /// <summary>\r\n        /// Failed to download metadata: {0}\r\n        /// </summary>\r\n        public const string MetadataDownloadError = \"LOCMetadataDownloadError\";\r\n        /// <summary>\r\n        /// Download Error\r\n        /// </summary>\r\n        public const string DownloadError = \"LOCDownloadError\";\r\n        /// <summary>\r\n        /// Clear Filters\r\n        /// </summary>\r\n        public const string ClearFilters = \"LOCClearFilters\";\r\n        /// <summary>\r\n        /// Private Account\r\n        /// </summary>\r\n        public const string PrivateAccount = \"LOCPrivateAccount\";\r\n        /// <summary>\r\n        /// Public Account\r\n        /// </summary>\r\n        public const string PublicAccount = \"LOCPublicAccount\";\r\n        /// <summary>\r\n        /// API Key\r\n        /// </summary>\r\n        public const string APIKey = \"LOCAPIKey\";\r\n        /// <summary>\r\n        /// Startup Error\r\n        /// </summary>\r\n        public const string StartupError = \"LOCStartupError\";\r\n        /// <summary>\r\n        /// Theme Error\r\n        /// </summary>\r\n        public const string SkinError = \"LOCSkinError\";\r\n        /// <summary>\r\n        /// Clear All\r\n        /// </summary>\r\n        public const string ClearAll = \"LOCClearAll\";\r\n        /// <summary>\r\n        /// Installing\r\n        /// </summary>\r\n        public const string SetupRunning = \"LOCSetupRunning\";\r\n        /// <summary>\r\n        /// Uninstalling\r\n        /// </summary>\r\n        public const string Uninstalling = \"LOCUninstalling\";\r\n        /// <summary>\r\n        /// Launching\r\n        /// </summary>\r\n        public const string GameLaunching = \"LOCGameLaunching\";\r\n        /// <summary>\r\n        /// Running\r\n        /// </summary>\r\n        public const string GameRunning = \"LOCGameRunning\";\r\n        /// <summary>\r\n        /// Invalid URL\r\n        /// </summary>\r\n        public const string InvalidURL = \"LOCInvalidURL\";\r\n        /// <summary>\r\n        /// Do nothing\r\n        /// </summary>\r\n        public const string DoNothing = \"LOCDoNothing\";\r\n        /// <summary>\r\n        /// Minimize\r\n        /// </summary>\r\n        public const string Minimize = \"LOCMinimize\";\r\n        /// <summary>\r\n        /// Restore window\r\n        /// </summary>\r\n        public const string RestoreWindow = \"LOCRestoreWindow\";\r\n        /// <summary>\r\n        /// Restore window only when launched from UI\r\n        /// </summary>\r\n        public const string RestoreWindowOnlyFromUI = \"LOCRestoreWindowOnlyFromUI\";\r\n        /// <summary>\r\n        /// Close\r\n        /// </summary>\r\n        public const string Close = \"LOCClose\";\r\n        /// <summary>\r\n        /// Change\r\n        /// </summary>\r\n        public const string Change = \"LOCChange\";\r\n        /// <summary>\r\n        /// Advanced\r\n        /// </summary>\r\n        public const string Advanced = \"LOCAdvanced\";\r\n        /// <summary>\r\n        /// Never\r\n        /// </summary>\r\n        public const string Never = \"LOCNever\";\r\n        /// <summary>\r\n        /// Completion Status\r\n        /// </summary>\r\n        public const string CompletionStatus = \"LOCCompletionStatus\";\r\n        /// <summary>\r\n        /// Completion Statuses\r\n        /// </summary>\r\n        public const string CompletionStatuses = \"LOCCompletionStatuses\";\r\n        /// <summary>\r\n        /// User Score\r\n        /// </summary>\r\n        public const string UserScore = \"LOCUserScore\";\r\n        /// <summary>\r\n        /// Critic Score\r\n        /// </summary>\r\n        public const string CriticScore = \"LOCCriticScore\";\r\n        /// <summary>\r\n        /// Community Score\r\n        /// </summary>\r\n        public const string CommunityScore = \"LOCCommunityScore\";\r\n        /// <summary>\r\n        /// Game scripts\r\n        /// </summary>\r\n        public const string GameScripts = \"LOCGameScripts\";\r\n        /// <summary>\r\n        /// Application scripts\r\n        /// </summary>\r\n        public const string ApplicationScripts = \"LOCApplicationScripts\";\r\n        /// <summary>\r\n        /// Scripts\r\n        /// </summary>\r\n        public const string Scripts = \"LOCScripts\";\r\n        /// <summary>\r\n        /// Plugins\r\n        /// </summary>\r\n        public const string Plugins = \"LOCPlugins\";\r\n        /// <summary>\r\n        /// Metadata Sources\r\n        /// </summary>\r\n        public const string MetadataProviders = \"LOCMetadataProviders\";\r\n        /// <summary>\r\n        /// Extensions\r\n        /// </summary>\r\n        public const string Extensions = \"LOCExtensions\";\r\n        /// <summary>\r\n        /// Extension ID\r\n        /// </summary>\r\n        public const string ExtensionID = \"LOCExtensionID\";\r\n        /// <summary>\r\n        /// Reload Scripts\r\n        /// </summary>\r\n        public const string ReloadScripts = \"LOCReloadScripts\";\r\n        /// <summary>\r\n        /// Interactive SDK PowerShell\r\n        /// </summary>\r\n        public const string StartInteractivePowerShell = \"LOCStartInteractivePowerShell\";\r\n        /// <summary>\r\n        /// All scripts reloaded successfully.\r\n        /// </summary>\r\n        public const string ReloadScriptsSuccess = \"LOCReloadScriptsSuccess\";\r\n        /// <summary>\r\n        /// No games found for specified search/filter criteria\r\n        /// </summary>\r\n        public const string NoGamesFound = \"LOCNoGamesFound\";\r\n        /// <summary>\r\n        /// No items found\r\n        /// </summary>\r\n        public const string NoItemsFound = \"LOCNoItemsFound\";\r\n        /// <summary>\r\n        /// Switch to Desktop Mode\r\n        /// </summary>\r\n        public const string BackToDesktopMode = \"LOCBackToDesktopMode\";\r\n        /// <summary>\r\n        /// Exit Playnite\r\n        /// </summary>\r\n        public const string ExitPlaynite = \"LOCExitPlaynite\";\r\n        /// <summary>\r\n        /// Libraries\r\n        /// </summary>\r\n        public const string Libraries = \"LOCLibraries\";\r\n        /// <summary>\r\n        /// Update All\r\n        /// </summary>\r\n        public const string UpdateAll = \"LOCUpdateAll\";\r\n        /// <summary>\r\n        /// Created By:\r\n        /// </summary>\r\n        public const string ExtensionCreatedBy = \"LOCExtensionCreatedBy\";\r\n        /// <summary>\r\n        /// Version:\r\n        /// </summary>\r\n        public const string ExtensionVersion = \"LOCExtensionVersion\";\r\n        /// <summary>\r\n        /// Updated:\r\n        /// </summary>\r\n        public const string ExtensionUpdated = \"LOCExtensionUpdated\";\r\n        /// <summary>\r\n        /// Module:\r\n        /// </summary>\r\n        public const string ExtensionModule = \"LOCExtensionModule\";\r\n        /// <summary>\r\n        /// Library\r\n        /// </summary>\r\n        public const string Library = \"LOCLibrary\";\r\n        /// <summary>\r\n        /// Statistics\r\n        /// </summary>\r\n        public const string Statistics = \"LOCStatistics\";\r\n        /// <summary>\r\n        /// All\r\n        /// </summary>\r\n        public const string All = \"LOCAll\";\r\n        /// <summary>\r\n        /// None\r\n        /// </summary>\r\n        public const string None = \"LOCNone\";\r\n        /// <summary>\r\n        /// Notifications\r\n        /// </summary>\r\n        public const string Notifications = \"LOCNotifications\";\r\n        /// <summary>\r\n        /// Width\r\n        /// </summary>\r\n        public const string Width = \"LOCWidth\";\r\n        /// <summary>\r\n        /// Height\r\n        /// </summary>\r\n        public const string Height = \"LOCHeight\";\r\n        /// <summary>\r\n        /// Size\r\n        /// </summary>\r\n        public const string Size = \"LOCSize\";\r\n        /// <summary>\r\n        /// Small\r\n        /// </summary>\r\n        public const string FontSmall = \"LOCFontSmall\";\r\n        /// <summary>\r\n        /// Normal\r\n        /// </summary>\r\n        public const string FontNormal = \"LOCFontNormal\";\r\n        /// <summary>\r\n        /// Large\r\n        /// </summary>\r\n        public const string FontLarge = \"LOCFontLarge\";\r\n        /// <summary>\r\n        /// Larger\r\n        /// </summary>\r\n        public const string FontLarger = \"LOCFontLarger\";\r\n        /// <summary>\r\n        /// Largest\r\n        /// </summary>\r\n        public const string FontLargest = \"LOCFontLargest\";\r\n        /// <summary>\r\n        /// Default\r\n        /// </summary>\r\n        public const string Default = \"LOCDefault\";\r\n        /// <summary>\r\n        /// Select\r\n        /// </summary>\r\n        public const string Select = \"LOCSelect\";\r\n        /// <summary>\r\n        /// Select All\r\n        /// </summary>\r\n        public const string SelectAll = \"LOCSelectAll\";\r\n        /// <summary>\r\n        /// Deselect All\r\n        /// </summary>\r\n        public const string DeselectAll = \"LOCDeselectAll\";\r\n        /// <summary>\r\n        /// First\r\n        /// </summary>\r\n        public const string First = \"LOCFirst\";\r\n        /// <summary>\r\n        /// Random\r\n        /// </summary>\r\n        public const string Random = \"LOCRandom\";\r\n        /// <summary>\r\n        /// User select\r\n        /// </summary>\r\n        public const string UserSelect = \"LOCUserSelect\";\r\n        /// <summary>\r\n        /// Load more\r\n        /// </summary>\r\n        public const string LoadMore = \"LOCLoadMore\";\r\n        /// <summary>\r\n        /// Transparent\r\n        /// </summary>\r\n        public const string Transparent = \"LOCTransparent\";\r\n        /// <summary>\r\n        /// Collapse\r\n        /// </summary>\r\n        public const string Collapse = \"LOCCollapse\";\r\n        /// <summary>\r\n        /// Expand\r\n        /// </summary>\r\n        public const string Expand = \"LOCExpand\";\r\n        /// <summary>\r\n        /// Collapse All\r\n        /// </summary>\r\n        public const string CollapseAll = \"LOCCollapseAll\";\r\n        /// <summary>\r\n        /// Expand All\r\n        /// </summary>\r\n        public const string ExpandAll = \"LOCExpandAll\";\r\n        /// <summary>\r\n        /// Other\r\n        /// </summary>\r\n        public const string Other = \"LOCOther\";\r\n        /// <summary>\r\n        /// Themes\r\n        /// </summary>\r\n        public const string Themes = \"LOCThemes\";\r\n        /// <summary>\r\n        /// Emulator Arguments\r\n        /// </summary>\r\n        public const string EmulatorArguments = \"LOCEmulatorArguments\";\r\n        /// <summary>\r\n        /// Built-in Arguments\r\n        /// </summary>\r\n        public const string BuiltinArguments = \"LOCBuiltinArguments\";\r\n        /// <summary>\r\n        /// Custom Arguments\r\n        /// </summary>\r\n        public const string CustomArguments = \"LOCCustomArguments\";\r\n        /// <summary>\r\n        /// Additional Emulator Arguments\r\n        /// </summary>\r\n        public const string AdditionalEmulatorArguments = \"LOCAdditionalEmulatorArguments\";\r\n        /// <summary>\r\n        /// Override Emulator Arguments\r\n        /// </summary>\r\n        public const string OverrideEmulatorArguments = \"LOCOverrideEmulatorArguments\";\r\n        /// <summary>\r\n        /// Play action\r\n        /// </summary>\r\n        public const string IsPlayAction = \"LOCIsPlayAction\";\r\n        /// <summary>\r\n        /// Select metadata to import\r\n        /// </summary>\r\n        public const string MedataDiffWindowTitle = \"LOCMedataDiffWindowTitle\";\r\n        /// <summary>\r\n        /// Select Games to Import\r\n        /// </summary>\r\n        public const string GameImportWindowTitle = \"LOCGameImportWindowTitle\";\r\n        /// <summary>\r\n        /// Metadata search\r\n        /// </summary>\r\n        public const string MetaLookupWindowTitle = \"LOCMetaLookupWindowTitle\";\r\n        /// <summary>\r\n        /// Update Available\r\n        /// </summary>\r\n        public const string UpdaterWindowTitle = \"LOCUpdaterWindowTitle\";\r\n        /// <summary>\r\n        /// Changes since last update\r\n        /// </summary>\r\n        public const string UpdaterChangesInfo = \"LOCUpdaterChangesInfo\";\r\n        /// <summary>\r\n        /// Download and Install Update\r\n        /// </summary>\r\n        public const string UpdaterInstallUpdate = \"LOCUpdaterInstallUpdate\";\r\n        /// <summary>\r\n        /// Check for Updates\r\n        /// </summary>\r\n        public const string CheckForUpdates = \"LOCCheckForUpdates\";\r\n        /// <summary>\r\n        /// Update Error\r\n        /// </summary>\r\n        public const string UpdateError = \"LOCUpdateError\";\r\n        /// <summary>\r\n        /// Failed to check for new version.\r\n        /// </summary>\r\n        public const string UpdateCheckFailMessage = \"LOCUpdateCheckFailMessage\";\r\n        /// <summary>\r\n        /// No new version found, you are up to date.\r\n        /// </summary>\r\n        public const string UpdateNoNewUpdateMessage = \"LOCUpdateNoNewUpdateMessage\";\r\n        /// <summary>\r\n        /// Failed to download and install update.\r\n        /// </summary>\r\n        public const string GeneralUpdateFailMessage = \"LOCGeneralUpdateFailMessage\";\r\n        /// <summary>\r\n        /// Some background task is currently in progress. Do you want to cancel it and proceed with the update?\r\n        /// </summary>\r\n        public const string UpdateProgressCancelAsk = \"LOCUpdateProgressCancelAsk\";\r\n        /// <summary>\r\n        /// Some background task is currently in progress. Do you want to cancel it and exit Playnite?\r\n        /// </summary>\r\n        public const string BackgroundProgressCancelAskExit = \"LOCBackgroundProgressCancelAskExit\";\r\n        /// <summary>\r\n        /// Some background task is currently in progress. Switching modes will cancel the task, do you want to switch anyways?\r\n        /// </summary>\r\n        public const string BackgroundProgressCancelAskSwitchMode = \"LOCBackgroundProgressCancelAskSwitchMode\";\r\n        /// <summary>\r\n        /// An update for Playnite is available\r\n        /// </summary>\r\n        public const string UpdateIsAvailableNotificationBody = \"LOCUpdateIsAvailableNotificationBody\";\r\n        /// <summary>\r\n        /// Reload theme list\r\n        /// </summary>\r\n        public const string ThemeTestReloadList = \"LOCThemeTestReloadList\";\r\n        /// <summary>\r\n        /// Apply selected theme\r\n        /// </summary>\r\n        public const string ThemeTestApplySkin = \"LOCThemeTestApplySkin\";\r\n        /// <summary>\r\n        /// Watch file changes\r\n        /// </summary>\r\n        public const string ThemeTestWatchChanges = \"LOCThemeTestWatchChanges\";\r\n        /// <summary>\r\n        /// Automatically apply theme when the source file changes\r\n        /// </summary>\r\n        public const string ThemeTestWatchChangesTooltip = \"LOCThemeTestWatchChangesTooltip\";\r\n        /// <summary>\r\n        /// Script runtime\r\n        /// </summary>\r\n        public const string ScriptRuntime = \"LOCScriptRuntime\";\r\n        /// <summary>\r\n        /// Execute before starting a game\r\n        /// </summary>\r\n        public const string PreScriptDescription = \"LOCPreScriptDescription\";\r\n        /// <summary>\r\n        /// Execute after exiting a game\r\n        /// </summary>\r\n        public const string PostScriptDescription = \"LOCPostScriptDescription\";\r\n        /// <summary>\r\n        /// Execute after a game is started\r\n        /// </summary>\r\n        public const string GameStartedScriptDescription = \"LOCGameStartedScriptDescription\";\r\n        /// <summary>\r\n        /// Execute on application start\r\n        /// </summary>\r\n        public const string AppScriptStartupDescription = \"LOCAppScriptStartupDescription\";\r\n        /// <summary>\r\n        /// Execute on application shutdown\r\n        /// </summary>\r\n        public const string AppScriptShutdownDescription = \"LOCAppScriptShutdownDescription\";\r\n        /// <summary>\r\n        /// Game starting script\r\n        /// </summary>\r\n        public const string ScriptTypeStarting = \"LOCScriptTypeStarting\";\r\n        /// <summary>\r\n        /// Game started script\r\n        /// </summary>\r\n        public const string ScriptTypeStarted = \"LOCScriptTypeStarted\";\r\n        /// <summary>\r\n        /// Game stopped script\r\n        /// </summary>\r\n        public const string ScriptTypeExit = \"LOCScriptTypeExit\";\r\n        /// <summary>\r\n        /// Execute global script\r\n        /// </summary>\r\n        public const string ExecuteGlobalScript = \"LOCExecuteGlobalScript\";\r\n        /// <summary>\r\n        /// Global\r\n        /// </summary>\r\n        public const string StatsGlobal = \"LOCStatsGlobal\";\r\n        /// <summary>\r\n        /// Filtered\r\n        /// </summary>\r\n        public const string StatsFiltered = \"LOCStatsFiltered\";\r\n        /// <summary>\r\n        /// Current\r\n        /// </summary>\r\n        public const string MetadataDiffCurrent = \"LOCMetadataDiffCurrent\";\r\n        /// <summary>\r\n        /// New\r\n        /// </summary>\r\n        public const string MetadataDiffNew = \"LOCMetadataDiffNew\";\r\n        /// <summary>\r\n        /// Test script\r\n        /// </summary>\r\n        public const string TestScript = \"LOCTestScript\";\r\n        /// <summary>\r\n        /// Show only selected items.\r\n        /// </summary>\r\n        public const string OnlyItemsSelectedTooltip = \"LOCOnlyItemsSelectedTooltip\";\r\n        /// <summary>\r\n        /// Save as default\r\n        /// </summary>\r\n        public const string SaveAsDefault = \"LOCSaveAsDefault\";\r\n        /// <summary>\r\n        /// Add to Favorites\r\n        /// </summary>\r\n        public const string FavoriteGame = \"LOCFavoriteGame\";\r\n        /// <summary>\r\n        /// Remove from Favorites\r\n        /// </summary>\r\n        public const string RemoveFavoriteGame = \"LOCRemoveFavoriteGame\";\r\n        /// <summary>\r\n        /// Hide this game\r\n        /// </summary>\r\n        public const string HideGame = \"LOCHideGame\";\r\n        /// <summary>\r\n        /// Remove from Hidden\r\n        /// </summary>\r\n        public const string UnHideGame = \"LOCUnHideGame\";\r\n        /// <summary>\r\n        /// Enable HDR Support\r\n        /// </summary>\r\n        public const string EnableHdr = \"LOCEnableHdr\";\r\n        /// <summary>\r\n        /// Disable HDR Support\r\n        /// </summary>\r\n        public const string DisableHdr = \"LOCDisableHdr\";\r\n        /// <summary>\r\n        /// Edit…\r\n        /// </summary>\r\n        public const string EditGame = \"LOCEditGame\";\r\n        /// <summary>\r\n        /// Calculate install size\r\n        /// </summary>\r\n        public const string CalculateInstallSize = \"LOCCalculateInstallSize\";\r\n        /// <summary>\r\n        /// Calculate install size (All games)\r\n        /// </summary>\r\n        public const string CalculateGamesAllInstallSize = \"LOCCalculateGamesAllInstallSize\";\r\n        /// <summary>\r\n        /// Calculate install size (Only missing data)\r\n        /// </summary>\r\n        public const string CalculateGamesMissingInstallSize = \"LOCCalculateGamesMissingInstallSize\";\r\n        /// <summary>\r\n        /// Install size\r\n        /// </summary>\r\n        public const string InstallSizeMenuLabel = \"LOCInstallSizeMenuLabel\";\r\n        /// <summary>\r\n        /// Set Category…\r\n        /// </summary>\r\n        public const string SetGameCategory = \"LOCSetGameCategory\";\r\n        /// <summary>\r\n        /// Set Completion Status\r\n        /// </summary>\r\n        public const string SetCompletionStatus = \"LOCSetCompletionStatus\";\r\n        /// <summary>\r\n        /// Remove\r\n        /// </summary>\r\n        public const string RemoveGame = \"LOCRemoveGame\";\r\n        /// <summary>\r\n        /// Play\r\n        /// </summary>\r\n        public const string PlayGame = \"LOCPlayGame\";\r\n        /// <summary>\r\n        /// Install\r\n        /// </summary>\r\n        public const string InstallGame = \"LOCInstallGame\";\r\n        /// <summary>\r\n        /// Game Options\r\n        /// </summary>\r\n        public const string GameOptions = \"LOCGameOptions\";\r\n        /// <summary>\r\n        /// Details\r\n        /// </summary>\r\n        public const string GameDetails = \"LOCGameDetails\";\r\n        /// <summary>\r\n        /// Uninstall\r\n        /// </summary>\r\n        public const string UninstallGame = \"LOCUninstallGame\";\r\n        /// <summary>\r\n        /// Open Installation Location\r\n        /// </summary>\r\n        public const string OpenGameLocation = \"LOCOpenGameLocation\";\r\n        /// <summary>\r\n        /// Create Desktop Shortcut\r\n        /// </summary>\r\n        public const string CreateDesktopShortcut = \"LOCCreateDesktopShortcut\";\r\n        /// <summary>\r\n        /// Open Manual\r\n        /// </summary>\r\n        public const string OpenGameManual = \"LOCOpenGameManual\";\r\n        /// <summary>\r\n        /// More\r\n        /// </summary>\r\n        public const string MoreAction = \"LOCMoreAction\";\r\n        /// <summary>\r\n        /// Managed by the library plugin\r\n        /// </summary>\r\n        public const string PlayActionUsePlugin = \"LOCPlayActionUsePlugin\";\r\n        /// <summary>\r\n        /// The game starting process will be managed by the library plugin responsible for this game.\r\n        /// </summary>\r\n        public const string PlayActionUsePluginTooltip = \"LOCPlayActionUsePluginTooltip\";\r\n        /// <summary>\r\n        /// No relevant information about the '{0}' game has been found on the specified page.\r\n        /// </summary>\r\n        public const string MetadownloadNoResultsMessage = \"LOCMetadownloadNoResultsMessage\";\r\n        /// <summary>\r\n        /// Tip: You can use more advanced metadata download process while editing single game via \"Edit\" menu option.\r\n        /// </summary>\r\n        public const string MetadownloadSingleGameTip = \"LOCMetadownloadSingleGameTip\";\r\n        /// <summary>\r\n        /// Not available when some action is in progress.\r\n        /// </summary>\r\n        public const string ProgreessAvailabilityMessage = \"LOCProgreessAvailabilityMessage\";\r\n        /// <summary>\r\n        /// Description text is HTML syntax sensitive\r\n        /// </summary>\r\n        public const string DescriptionHTMLSupportTooltip = \"LOCDescriptionHTMLSupportTooltip\";\r\n        /// <summary>\r\n        /// Game time is recorded in seconds.\r\n        /// </summary>\r\n        public const string DescriptionPlaytimeSeconds = \"LOCDescriptionPlaytimeSeconds\";\r\n        /// <summary>\r\n        /// Install size is indicated in bytes.\r\n        /// </summary>\r\n        public const string DescriptionSizeBytes = \"LOCDescriptionSizeBytes\";\r\n        /// <summary>\r\n        /// Release date must be set in 'year-month-day' format. Month and Day values can be omitted.\r\n        /// </summary>\r\n        public const string ReleaseDateTooltip = \"LOCReleaseDateTooltip\";\r\n        /// <summary>\r\n        /// Values from 0 to 100 or empty for no score.\r\n        /// </summary>\r\n        public const string DescriptionScoreValues = \"LOCDescriptionScoreValues\";\r\n        /// <summary>\r\n        /// Playnite's development is supported by these patrons and Ko-fi members:\r\n        /// </summary>\r\n        public const string PatreonDevelopMessage = \"LOCPatreonDevelopMessage\";\r\n        /// <summary>\r\n        /// Code, localization and other contributors in no particular order:\r\n        /// </summary>\r\n        public const string AboutContributorsMessage = \"LOCAboutContributorsMessage\";\r\n        /// <summary>\r\n        /// Cancel game monitoring?\r\n        /// </summary>\r\n        public const string CancelMonitoringAskTitle = \"LOCCancelMonitoringAskTitle\";\r\n        /// <summary>\r\n        /// Installation monitoring is currently running. Do you want to cancel the process and return the game to the previous state?\r\n        /// </summary>\r\n        public const string CancelMonitoringSetupAsk = \"LOCCancelMonitoringSetupAsk\";\r\n        /// <summary>\r\n        /// Game execution monitoring is currently running. Do you want to cancel the process and return the game to the previous state?\r\n        /// </summary>\r\n        public const string CancelMonitoringExecutionAsk = \"LOCCancelMonitoringExecutionAsk\";\r\n        /// <summary>\r\n        /// Time Played\r\n        /// </summary>\r\n        public const string TimePlayed = \"LOCTimePlayed\";\r\n        /// <summary>\r\n        /// Last Played\r\n        /// </summary>\r\n        public const string LastPlayed = \"LOCLastPlayed\";\r\n        /// <summary>\r\n        /// {0}d {1}h {2}m\r\n        /// </summary>\r\n        public const string PlayedDays = \"LOCPlayedDays\";\r\n        /// <summary>\r\n        /// {0}h {1}m\r\n        /// </summary>\r\n        public const string PlayedHours = \"LOCPlayedHours\";\r\n        /// <summary>\r\n        /// {0} minutes\r\n        /// </summary>\r\n        public const string PlayedMinutes = \"LOCPlayedMinutes\";\r\n        /// <summary>\r\n        /// {0} seconds\r\n        /// </summary>\r\n        public const string PlayedSeconds = \"LOCPlayedSeconds\";\r\n        /// <summary>\r\n        /// Not Played\r\n        /// </summary>\r\n        public const string PlayedNone = \"LOCPlayedNone\";\r\n        /// <summary>\r\n        /// Opening Desktop mode…\r\n        /// </summary>\r\n        public const string OpeningDesktopModeMessage = \"LOCOpeningDesktopModeMessage\";\r\n        /// <summary>\r\n        /// Opening Fullscreen mode…\r\n        /// </summary>\r\n        public const string OpeningFullscreenModeMessage = \"LOCOpeningFullscreenModeMessage\";\r\n        /// <summary>\r\n        /// Loading game library…\r\n        /// </summary>\r\n        public const string OpeningDatabase = \"LOCOpeningDatabase\";\r\n        /// <summary>\r\n        /// Calculating install size…\r\n        /// </summary>\r\n        public const string CalculatingInstallSizeMessage = \"LOCCalculatingInstallSizeMessage\";\r\n        /// <summary>\r\n        /// Calculating install size of {0}…\r\n        /// </summary>\r\n        public const string CalculatingInstallSizeOfGameMessage = \"LOCCalculatingInstallSizeOfGameMessage\";\r\n        /// <summary>\r\n        /// Failed to install script file.\r\n        /// </summary>\r\n        public const string ScriptInstallFail = \"LOCScriptInstallFail\";\r\n        /// <summary>\r\n        /// Script installed successfully.\r\n        /// </summary>\r\n        public const string ScriptInstallSuccess = \"LOCScriptInstallSuccess\";\r\n        /// <summary>\r\n        /// Install Script\r\n        /// </summary>\r\n        public const string InstallScript = \"LOCInstallScript\";\r\n        /// <summary>\r\n        /// Script error\r\n        /// </summary>\r\n        public const string ScriptError = \"LOCScriptError\";\r\n        /// <summary>\r\n        /// Failed to execute extension function.\r\n        /// </summary>\r\n        public const string ScriptExecutionError = \"LOCScriptExecutionError\";\r\n        /// <summary>\r\n        /// Open metadata folder\r\n        /// </summary>\r\n        public const string OpenMetadataFolder = \"LOCOpenMetadataFolder\";\r\n        /// <summary>\r\n        /// Calculate\r\n        /// </summary>\r\n        public const string InstallSizeCalculate = \"LOCInstallSizeCalculate\";\r\n        /// <summary>\r\n        /// Automatically calculates the install size using the ROMs if the game has any or the installation directory if it has been set\r\n        /// </summary>\r\n        public const string InstallSizeCalculateEditButtonTooltip = \"LOCInstallSizeCalculateEditButtonTooltip\";\r\n        /// <summary>\r\n        /// {0} client is not installed.\r\n        /// </summary>\r\n        public const string ClientNotInstalledError = \"LOCClientNotInstalledError\";\r\n        /// <summary>\r\n        /// {0} client will now open. Please sign in and then close this message.\r\n        /// </summary>\r\n        public const string SignInExternalNotif = \"LOCSignInExternalNotif\";\r\n        /// <summary>\r\n        /// Waiting for user to sign in, please close this when you're done…\r\n        /// </summary>\r\n        public const string SignInExternalWaitMessage = \"LOCSignInExternalWaitMessage\";\r\n        /// <summary>\r\n        /// Game's installation folder not found.\r\n        /// </summary>\r\n        public const string InstallDirNotFoundError = \"LOCInstallDirNotFoundError\";\r\n        /// <summary>\r\n        /// Invalid game action configuration.\r\n        /// </summary>\r\n        public const string InvalidGameActionSettings = \"LOCInvalidGameActionSettings\";\r\n        /// <summary>\r\n        /// Troubleshooting account sync issues\r\n        /// </summary>\r\n        public const string TroubleShootingAccountLink = \"LOCTroubleShootingAccountLink\";\r\n        /// <summary>\r\n        /// Troubleshooting issues\r\n        /// </summary>\r\n        public const string TroubleShootingIssues = \"LOCTroubleShootingIssues\";\r\n        /// <summary>\r\n        /// Rename item\r\n        /// </summary>\r\n        public const string RenameItem = \"LOCRenameItem\";\r\n        /// <summary>\r\n        /// Add new item\r\n        /// </summary>\r\n        public const string AddNewItem = \"LOCAddNewItem\";\r\n        /// <summary>\r\n        /// Enter name\r\n        /// </summary>\r\n        public const string EnterName = \"LOCEnterName\";\r\n        /// <summary>\r\n        /// Enter new name\r\n        /// </summary>\r\n        public const string EnterNewName = \"LOCEnterNewName\";\r\n        /// <summary>\r\n        /// Less than an hour\r\n        /// </summary>\r\n        public const string PLaytimeLessThenAnHour = \"LOCPLaytimeLessThenAnHour\";\r\n        /// <summary>\r\n        /// 1 to 10 hours\r\n        /// </summary>\r\n        public const string PLaytime1to10 = \"LOCPLaytime1to10\";\r\n        /// <summary>\r\n        /// 10 to 100 hours\r\n        /// </summary>\r\n        public const string PLaytime10to100 = \"LOCPLaytime10to100\";\r\n        /// <summary>\r\n        /// 100 to 500 hours\r\n        /// </summary>\r\n        public const string PLaytime100to500 = \"LOCPLaytime100to500\";\r\n        /// <summary>\r\n        /// 500 to 1000 hours\r\n        /// </summary>\r\n        public const string PLaytime500to1000 = \"LOCPLaytime500to1000\";\r\n        /// <summary>\r\n        /// Over 1000 hours\r\n        /// </summary>\r\n        public const string PLaytime1000plus = \"LOCPLaytime1000plus\";\r\n        /// <summary>\r\n        /// Playnite must be restarted to complete the installation. Do you want to restart now?\r\n        /// </summary>\r\n        public const string ExtInstallationRestartNotif = \"LOCExtInstallationRestartNotif\";\r\n        /// <summary>\r\n        /// Extension is not packaged properly.\r\n        /// </summary>\r\n        public const string GeneralExtensionPackageError = \"LOCGeneralExtensionPackageError\";\r\n        /// <summary>\r\n        /// Theme is not packaged properly.\r\n        /// </summary>\r\n        public const string GeneralThemePackageError = \"LOCGeneralThemePackageError\";\r\n        /// <summary>\r\n        /// Extension \"{0}\" failed to load properly.\r\n        /// </summary>\r\n        public const string SpecificExtensionLoadError = \"LOCSpecificExtensionLoadError\";\r\n        /// <summary>\r\n        /// Can't load \"{0}\" extension, current Playnite version is not supported.\r\n        /// </summary>\r\n        public const string SpecificExtensionLoadSDKError = \"LOCSpecificExtensionLoadSDKError\";\r\n        /// <summary>\r\n        /// Theme \"{0}\" failed to load properly.\r\n        /// </summary>\r\n        public const string SpecificThemeLoadError = \"LOCSpecificThemeLoadError\";\r\n        /// <summary>\r\n        /// Can't load \"{0}\" theme, current Playnite version is not supported.\r\n        /// </summary>\r\n        public const string SpecificThemeLoadSDKError = \"LOCSpecificThemeLoadSDKError\";\r\n        /// <summary>\r\n        /// Extension failed to load properly.\r\n        /// </summary>\r\n        public const string GeneralExtensionLoadError = \"LOCGeneralExtensionLoadError\";\r\n        /// <summary>\r\n        /// Theme failed to load properly.\r\n        /// </summary>\r\n        public const string GeneralThemeLoadError = \"LOCGeneralThemeLoadError\";\r\n        /// <summary>\r\n        /// Theme/Extension is using unsupported API version.\r\n        /// </summary>\r\n        public const string GeneralExtensionInstallApiVersionFails = \"LOCGeneralExtensionInstallApiVersionFails\";\r\n        /// <summary>\r\n        /// Installation was successful.\r\n        /// </summary>\r\n        public const string GeneralExtensionInstallSuccess = \"LOCGeneralExtensionInstallSuccess\";\r\n        /// <summary>\r\n        /// Install add-on?\r\n        /// </summary>\r\n        public const string GeneralExtensionInstallTitle = \"LOCGeneralExtensionInstallTitle\";\r\n        /// <summary>\r\n        /// Generic\r\n        /// </summary>\r\n        public const string ExtensionGeneric = \"LOCExtensionGeneric\";\r\n        /// <summary>\r\n        /// Failed to install \"{0}\" add-on.\r\n        /// </summary>\r\n        public const string AddonInstallFaild = \"LOCAddonInstallFaild\";\r\n        /// <summary>\r\n        /// Failed to install extension.\r\n        /// </summary>\r\n        public const string ExtensionInstallFail = \"LOCExtensionInstallFail\";\r\n        /// <summary>\r\n        /// Do you want to install a new extension?\r\n        /// </summary>\r\n        public const string ExtensionInstallPrompt = \"LOCExtensionInstallPrompt\";\r\n        /// <summary>\r\n        /// Do you want to update \"{0}\" extension?\r\n        /// </summary>\r\n        public const string ExtensionUpdatePrompt = \"LOCExtensionUpdatePrompt\";\r\n        /// <summary>\r\n        /// Failed to install theme.\r\n        /// </summary>\r\n        public const string ThemeInstallFail = \"LOCThemeInstallFail\";\r\n        /// <summary>\r\n        /// Do you want to install a new theme?\r\n        /// </summary>\r\n        public const string ThemeInstallPrompt = \"LOCThemeInstallPrompt\";\r\n        /// <summary>\r\n        /// Do you want to update \"{0}\" theme?\r\n        /// </summary>\r\n        public const string ThemeUpdatePrompt = \"LOCThemeUpdatePrompt\";\r\n        /// <summary>\r\n        /// You are about to leave Playnite and navigate to the following web page using your default web browser. Do you want to continue?\r\n        /// </summary>\r\n        public const string UrlNavigationMessage = \"LOCUrlNavigationMessage\";\r\n        /// <summary>\r\n        /// The selected image(s) might be too large for optimal performance. Using very large images can result in worse UI responsiveness and increased memory usage. \r\n        /// </summary>\r\n        public const string GameImageSizeWarning = \"LOCGameImageSizeWarning\";\r\n        /// <summary>\r\n        /// Performance Warning\r\n        /// </summary>\r\n        public const string PerformanceWarningTitle = \"LOCPerformanceWarningTitle\";\r\n        /// <summary>\r\n        /// Don't Show Again\r\n        /// </summary>\r\n        public const string DontShowAgainTitle = \"LOCDontShowAgainTitle\";\r\n        /// <summary>\r\n        /// File with extension {0} is not compatible.\r\n        /// </summary>\r\n        public const string IncompatibleDragAndDropExtensionError = \"LOCIncompatibleDragAndDropExtensionError\";\r\n        /// <summary>\r\n        /// Incompatible file extension\r\n        /// </summary>\r\n        public const string IncompatibleDragAndDropExtensionErrorTitle = \"LOCIncompatibleDragAndDropExtensionErrorTitle\";\r\n        /// <summary>\r\n        /// Selected image file might be too large for optimal performance.\r\n        /// </summary>\r\n        public const string LargeMediaWarningTooltip = \"LOCLargeMediaWarningTooltip\";\r\n        /// <summary>\r\n        /// Are you sure you want to uninstall selected theme? Uninstallation will be queued to next application start.\r\n        /// </summary>\r\n        public const string ThemeUninstallQuestion = \"LOCThemeUninstallQuestion\";\r\n        /// <summary>\r\n        /// Built-in themes can't be uninstalled.\r\n        /// </summary>\r\n        public const string ThemeBuiltInUninstallHint = \"LOCThemeBuiltInUninstallHint\";\r\n        /// <summary>\r\n        /// This theme doesn't support this version of Playnite.\r\n        /// </summary>\r\n        public const string ThemeUnsupported = \"LOCThemeUnsupported\";\r\n        /// <summary>\r\n        /// Are you sure you want to uninstall selected extension? Uninstallation will be queued to next application start.\r\n        /// </summary>\r\n        public const string ExtensionUninstallQuestion = \"LOCExtensionUninstallQuestion\";\r\n        /// <summary>\r\n        /// Built-in extensions can't be uninstalled.\r\n        /// </summary>\r\n        public const string ExtensionBuiltInUninstallHint = \"LOCExtensionBuiltInUninstallHint\";\r\n        /// <summary>\r\n        /// This extension doesn't support this version of Playnite.\r\n        /// </summary>\r\n        public const string ExtensionUnsupported = \"LOCExtensionUnsupported\";\r\n        /// <summary>\r\n        /// Installation folder\r\n        /// </summary>\r\n        public const string ExtensionInstallDir = \"LOCExtensionInstallDir\";\r\n        /// <summary>\r\n        /// Data folder\r\n        /// </summary>\r\n        public const string ExtensionDataDir = \"LOCExtensionDataDir\";\r\n        /// <summary>\r\n        /// Generating diagnostics package…\r\n        /// </summary>\r\n        public const string DiagGenerating = \"LOCDiagGenerating\";\r\n        /// <summary>\r\n        /// Uploading diagnostics package…\r\n        /// </summary>\r\n        public const string DiagUploading = \"LOCDiagUploading\";\r\n        /// <summary>\r\n        /// Import file…\r\n        /// </summary>\r\n        public const string AddFromExe = \"LOCAddFromExe\";\r\n        /// <summary>\r\n        /// What is this?\r\n        /// </summary>\r\n        public const string WhatIsThis = \"LOCWhatIsThis\";\r\n        /// <summary>\r\n        /// Are you sure you want to do this?\r\n        /// </summary>\r\n        public const string ConfirumationAskGeneric = \"LOCConfirumationAskGeneric\";\r\n        /// <summary>\r\n        /// Total play time\r\n        /// </summary>\r\n        public const string StatsTotalPlayTime = \"LOCStatsTotalPlayTime\";\r\n        /// <summary>\r\n        /// Average play time\r\n        /// </summary>\r\n        public const string StatsAvaragePlayTime = \"LOCStatsAvaragePlayTime\";\r\n        /// <summary>\r\n        /// Top play time\r\n        /// </summary>\r\n        public const string StatsTopPlayTime = \"LOCStatsTopPlayTime\";\r\n        /// <summary>\r\n        /// Total install size\r\n        /// </summary>\r\n        public const string StatsTotalInstallSize = \"LOCStatsTotalInstallSize\";\r\n        /// <summary>\r\n        /// Overview\r\n        /// </summary>\r\n        public const string OverviewLabel = \"LOCOverviewLabel\";\r\n        /// <summary>\r\n        /// Sidebar\r\n        /// </summary>\r\n        public const string Sidebar = \"LOCSidebar\";\r\n        /// <summary>\r\n        /// Show on Sidebar\r\n        /// </summary>\r\n        public const string ToolsShowOnSidebar = \"LOCToolsShowOnSidebar\";\r\n        /// <summary>\r\n        /// Reset settings\r\n        /// </summary>\r\n        public const string SettingsReset = \"LOCSettingsReset\";\r\n        /// <summary>\r\n        /// All application settings will be reset to default values, excluding:\r\n        /// </summary>\r\n        public const string SettingsDefaultResetDesc = \"LOCSettingsDefaultResetDesc\";\r\n        /// <summary>\r\n        /// For developers\r\n        /// </summary>\r\n        public const string SettingsForDevelopers = \"LOCSettingsForDevelopers\";\r\n        /// <summary>\r\n        /// External extensions\r\n        /// </summary>\r\n        public const string SettingsExternalExtensions = \"LOCSettingsExternalExtensions\";\r\n        /// <summary>\r\n        /// Enter full folder path.\r\n        /// </summary>\r\n        public const string SettingsNewExternalExtensionBox = \"LOCSettingsNewExternalExtensionBox\";\r\n        /// <summary>\r\n        /// Achievements\r\n        /// </summary>\r\n        public const string CommonLinksAchievements = \"LOCCommonLinksAchievements\";\r\n        /// <summary>\r\n        /// Forum\r\n        /// </summary>\r\n        public const string CommonLinksForum = \"LOCCommonLinksForum\";\r\n        /// <summary>\r\n        /// News\r\n        /// </summary>\r\n        public const string CommonLinksNews = \"LOCCommonLinksNews\";\r\n        /// <summary>\r\n        /// Store Page\r\n        /// </summary>\r\n        public const string CommonLinksStorePage = \"LOCCommonLinksStorePage\";\r\n        /// <summary>\r\n        /// The initial setup is not complete. Playnite will now restart to Desktop Mode to finish the procedure.\r\n        /// </summary>\r\n        public const string FullscreenFirstTimeError = \"LOCFullscreenFirstTimeError\";\r\n        /// <summary>\r\n        /// Recently Played\r\n        /// </summary>\r\n        public const string QuickFilterRecentlyPlayed = \"LOCQuickFilterRecentlyPlayed\";\r\n        /// <summary>\r\n        /// Favorites\r\n        /// </summary>\r\n        public const string QuickFilterFavorites = \"LOCQuickFilterFavorites\";\r\n        /// <summary>\r\n        /// Most Played\r\n        /// </summary>\r\n        public const string QuickFilterMostPlayed = \"LOCQuickFilterMostPlayed\";\r\n        /// <summary>\r\n        /// All\r\n        /// </summary>\r\n        public const string QuickFilterAllGames = \"LOCQuickFilterAllGames\";\r\n        /// <summary>\r\n        /// There are filters applied.\r\n        /// </summary>\r\n        public const string GameListFiltered = \"LOCGameListFiltered\";\r\n        /// <summary>\r\n        /// There are additional filters applied.\r\n        /// </summary>\r\n        public const string GameListExtraFiltered = \"LOCGameListExtraFiltered\";\r\n        /// <summary>\r\n        /// Showing search results for:\r\n        /// </summary>\r\n        public const string GameListSearchResults = \"LOCGameListSearchResults\";\r\n        /// <summary>\r\n        /// An item with the same name already exists.\r\n        /// </summary>\r\n        public const string ItemAlreadyExists = \"LOCItemAlreadyExists\";\r\n        /// <summary>\r\n        /// Limit selection to current filter\r\n        /// </summary>\r\n        public const string RandomGameLimistToFilter = \"LOCRandomGameLimistToFilter\";\r\n        /// <summary>\r\n        /// Pick another\r\n        /// </summary>\r\n        public const string RandomGamePickAnother = \"LOCRandomGamePickAnother\";\r\n        /// <summary>\r\n        /// Add-ons…\r\n        /// </summary>\r\n        public const string MenuAddons = \"LOCMenuAddons\";\r\n        /// <summary>\r\n        /// Installed\r\n        /// </summary>\r\n        public const string ExtensionsInstalled = \"LOCExtensionsInstalled\";\r\n        /// <summary>\r\n        /// Extensions settings\r\n        /// </summary>\r\n        public const string ExtensionsSettings = \"LOCExtensionsSettings\";\r\n        /// <summary>\r\n        /// Browse\r\n        /// </summary>\r\n        public const string ExtensionsBrowse = \"LOCExtensionsBrowse\";\r\n        /// <summary>\r\n        /// Updates\r\n        /// </summary>\r\n        public const string ExtensionsUpdates = \"LOCExtensionsUpdates\";\r\n        /// <summary>\r\n        /// Updates ({0})\r\n        /// </summary>\r\n        public const string ExtensionsUpdatesCount = \"LOCExtensionsUpdatesCount\";\r\n        /// <summary>\r\n        /// Management of installed extensions and themes, including their settings, has been moved to a new \"Add-ons\" menu.\r\n        /// </summary>\r\n        public const string AddonsConfigMoveInfo = \"LOCAddonsConfigMoveInfo\";\r\n        /// <summary>\r\n        /// All currently installed library integration extensions can be configured here.\r\n        /// </summary>\r\n        public const string LibrariesConfigWindowDescription = \"LOCLibrariesConfigWindowDescription\";\r\n        /// <summary>\r\n        /// Themes Desktop\r\n        /// </summary>\r\n        public const string AddonsThemesDesktop = \"LOCAddonsThemesDesktop\";\r\n        /// <summary>\r\n        /// Themes Fullscreen\r\n        /// </summary>\r\n        public const string AddonsThemesFullscren = \"LOCAddonsThemesFullscren\";\r\n        /// <summary>\r\n        /// Searching…\r\n        /// </summary>\r\n        public const string AddonsSearching = \"LOCAddonsSearching\";\r\n        /// <summary>\r\n        /// Add-on is not compatible with this version of Playnite.\r\n        /// </summary>\r\n        public const string AddonErrorNotCompatible = \"LOCAddonErrorNotCompatible\";\r\n        /// <summary>\r\n        /// Failed to download add-on installation package.\r\n        /// </summary>\r\n        public const string AddonErrorDownloadFailed = \"LOCAddonErrorDownloadFailed\";\r\n        /// <summary>\r\n        /// Failed to download add-on installation manifest.\r\n        /// </summary>\r\n        public const string AddonErrorManifestDownloadError = \"LOCAddonErrorManifestDownloadError\";\r\n        /// <summary>\r\n        /// Application restart is required to apply pending changes.\r\n        /// </summary>\r\n        public const string AddonChangesRestart = \"LOCAddonChangesRestart\";\r\n        /// <summary>\r\n        /// This add-on is scheduled for installation.\r\n        /// </summary>\r\n        public const string AddonQueuedForInstall = \"LOCAddonQueuedForInstall\";\r\n        /// <summary>\r\n        /// Install\r\n        /// </summary>\r\n        public const string AddonInstall = \"LOCAddonInstall\";\r\n        /// <summary>\r\n        /// Re-install\r\n        /// </summary>\r\n        public const string AddonReinstall = \"LOCAddonReinstall\";\r\n        /// <summary>\r\n        /// Uninstall\r\n        /// </summary>\r\n        public const string AddonUninstall = \"LOCAddonUninstall\";\r\n        /// <summary>\r\n        /// Already installed\r\n        /// </summary>\r\n        public const string AddonAlreadyInstalled = \"LOCAddonAlreadyInstalled\";\r\n        /// <summary>\r\n        /// No new add-on updates found.\r\n        /// </summary>\r\n        public const string AddonNoAddonsAvailable = \"LOCAddonNoAddonsAvailable\";\r\n        /// <summary>\r\n        /// Update add-ons\r\n        /// </summary>\r\n        public const string AddonUpdateAddons = \"LOCAddonUpdateAddons\";\r\n        /// <summary>\r\n        /// Changelog is not available\r\n        /// </summary>\r\n        public const string AddonChangelogNotAvailavble = \"LOCAddonChangelogNotAvailavble\";\r\n        /// <summary>\r\n        /// Scheduled for installation\r\n        /// </summary>\r\n        public const string AddonUpdateStatusDownloaded = \"LOCAddonUpdateStatusDownloaded\";\r\n        /// <summary>\r\n        /// Download failed\r\n        /// </summary>\r\n        public const string AddonUpdateStatusFailed = \"LOCAddonUpdateStatusFailed\";\r\n        /// <summary>\r\n        /// License rejected\r\n        /// </summary>\r\n        public const string AddonUpdateStatusLicenseRejected = \"LOCAddonUpdateStatusLicenseRejected\";\r\n        /// <summary>\r\n        /// Downloading {0}…\r\n        /// </summary>\r\n        public const string AddonDownloadingAddon = \"LOCAddonDownloadingAddon\";\r\n        /// <summary>\r\n        /// Looking for add-on updates…\r\n        /// </summary>\r\n        public const string AddonLookingForUpdates = \"LOCAddonLookingForUpdates\";\r\n        /// <summary>\r\n        /// Looking for program updates…\r\n        /// </summary>\r\n        public const string AppLookingForUpdates = \"LOCAppLookingForUpdates\";\r\n        /// <summary>\r\n        /// One or more add-on updates are available.\r\n        /// </summary>\r\n        public const string AddonUpdatesAvailable = \"LOCAddonUpdatesAvailable\";\r\n        /// <summary>\r\n        /// Select items to update\r\n        /// </summary>\r\n        public const string AddonSelectToUpdate = \"LOCAddonSelectToUpdate\";\r\n        /// <summary>\r\n        /// Extension development instance\r\n        /// </summary>\r\n        public const string AddonDevReferenceLoaded = \"LOCAddonDevReferenceLoaded\";\r\n        /// <summary>\r\n        /// {0} license agreement\r\n        /// </summary>\r\n        public const string AddonLicenseWindowTitle = \"LOCAddonLicenseWindowTitle\";\r\n        /// <summary>\r\n        /// Accept\r\n        /// </summary>\r\n        public const string LicenseAccept = \"LOCLicenseAccept\";\r\n        /// <summary>\r\n        /// Decline\r\n        /// </summary>\r\n        public const string LicenseDecline = \"LOCLicenseDecline\";\r\n        /// <summary>\r\n        /// Include library integration play actions\r\n        /// </summary>\r\n        public const string IncludePluginGameActions = \"LOCIncludePluginGameActions\";\r\n        /// <summary>\r\n        /// Select action\r\n        /// </summary>\r\n        public const string SelectActionTitle = \"LOCSelectActionTitle\";\r\n        /// <summary>\r\n        /// Tracking Mode\r\n        /// </summary>\r\n        public const string ActionTrackingMode = \"LOCActionTrackingMode\";\r\n        /// <summary>\r\n        /// Tracking Path\r\n        /// </summary>\r\n        public const string ActionTrackingPath = \"LOCActionTrackingPath\";\r\n        /// <summary>\r\n        /// Initial tracking delay\r\n        /// </summary>\r\n        public const string ActionTrackingTrackingDelay = \"LOCActionTrackingTrackingDelay\";\r\n        /// <summary>\r\n        /// Tracking frequency\r\n        /// </summary>\r\n        public const string ActionTrackingFrequency = \"LOCActionTrackingFrequency\";\r\n        /// <summary>\r\n        /// Link\r\n        /// </summary>\r\n        public const string GameActionTypeLink = \"LOCGameActionTypeLink\";\r\n        /// <summary>\r\n        /// File\r\n        /// </summary>\r\n        public const string GameActionTypeFile = \"LOCGameActionTypeFile\";\r\n        /// <summary>\r\n        /// Emulator\r\n        /// </summary>\r\n        public const string GameActionTypeEmulator = \"LOCGameActionTypeEmulator\";\r\n        /// <summary>\r\n        /// Script\r\n        /// </summary>\r\n        public const string GameActionTypeScript = \"LOCGameActionTypeScript\";\r\n        /// <summary>\r\n        /// Default\r\n        /// </summary>\r\n        public const string ActionTrackingModeDefault = \"LOCActionTrackingModeDefault\";\r\n        /// <summary>\r\n        /// Process\r\n        /// </summary>\r\n        public const string ActionTrackingModeProcess = \"LOCActionTrackingModeProcess\";\r\n        /// <summary>\r\n        /// Folder\r\n        /// </summary>\r\n        public const string ActionTrackingModeDirectory = \"LOCActionTrackingModeDirectory\";\r\n        /// <summary>\r\n        /// Original process\r\n        /// </summary>\r\n        public const string ActionTrackingOriginalProcess = \"LOCActionTrackingOriginalProcess\";\r\n        /// <summary>\r\n        /// Process name\r\n        /// </summary>\r\n        public const string ActionTrackingProcessName = \"LOCActionTrackingProcessName\";\r\n        /// <summary>\r\n        /// Log trace messages\r\n        /// </summary>\r\n        public const string DevelTraceLogEnable = \"LOCDevelTraceLogEnable\";\r\n        /// <summary>\r\n        /// Following changes overwrite data for all currently selected games!\r\n        /// </summary>\r\n        public const string MultiEditOverwriteWarning = \"LOCMultiEditOverwriteWarning\";\r\n        /// <summary>\r\n        /// None\r\n        /// </summary>\r\n        public const string GridViewSpacingModeNone = \"LOCGridViewSpacingModeNone\";\r\n        /// <summary>\r\n        /// Uniform\r\n        /// </summary>\r\n        public const string GridViewSpacingModeUniform = \"LOCGridViewSpacingModeUniform\";\r\n        /// <summary>\r\n        /// Items only\r\n        /// </summary>\r\n        public const string GridViewSpacingModeBetweenItemsOnly = \"LOCGridViewSpacingModeBetweenItemsOnly\";\r\n        /// <summary>\r\n        /// Start and end only\r\n        /// </summary>\r\n        public const string GridViewSpacingModeStartAndEndOnly = \"LOCGridViewSpacingModeStartAndEndOnly\";\r\n        /// <summary>\r\n        /// Scrolling sensitivity\r\n        /// </summary>\r\n        public const string ScrollingSensitivity = \"LOCScrollingSensitivity\";\r\n        /// <summary>\r\n        /// Smooth scrolling\r\n        /// </summary>\r\n        public const string SmoothScrolling = \"LOCSmoothScrolling\";\r\n        /// <summary>\r\n        /// Animation speed\r\n        /// </summary>\r\n        public const string SmoothScrollingSpeed = \"LOCSmoothScrollingSpeed\";\r\n        /// <summary>\r\n        /// Remove item?\r\n        /// </summary>\r\n        public const string AskRemoveItemTitle = \"LOCAskRemoveItemTitle\";\r\n        /// <summary>\r\n        /// Are you sure you want to remove this item?\r\n        /// </summary>\r\n        public const string AskRemoveItemMessage = \"LOCAskRemoveItemMessage\";\r\n        /// <summary>\r\n        /// Show buttons on top panel:\r\n        /// </summary>\r\n        public const string SettingsTopPanelItems = \"LOCSettingsTopPanelItems\";\r\n        /// <summary>\r\n        /// General view settings\r\n        /// </summary>\r\n        public const string SettingsTopPanelGeneralViewItem = \"LOCSettingsTopPanelGeneralViewItem\";\r\n        /// <summary>\r\n        /// Grouping settings\r\n        /// </summary>\r\n        public const string SettingsTopPanelGroupingItem = \"LOCSettingsTopPanelGroupingItem\";\r\n        /// <summary>\r\n        /// Sorting settings\r\n        /// </summary>\r\n        public const string SettingsTopPanelSortingItem = \"LOCSettingsTopPanelSortingItem\";\r\n        /// <summary>\r\n        /// Filter presets\r\n        /// </summary>\r\n        public const string SettingsTopPanelFilterPresetsItem = \"LOCSettingsTopPanelFilterPresetsItem\";\r\n        /// <summary>\r\n        /// Plugin items position\r\n        /// </summary>\r\n        public const string TopPanelPluginPanelPosition = \"LOCTopPanelPluginPanelPosition\";\r\n        /// <summary>\r\n        /// Section separator width\r\n        /// </summary>\r\n        public const string TopPanelSeparatorWidth = \"LOCTopPanelSeparatorWidth\";\r\n        /// <summary>\r\n        /// Move main menu button to the sidebar\r\n        /// </summary>\r\n        public const string TopPanelMainButtonMove = \"LOCTopPanelMainButtonMove\";\r\n        /// <summary>\r\n        /// Explorer panel\r\n        /// </summary>\r\n        public const string TopPanelExplorerSwitch = \"LOCTopPanelExplorerSwitch\";\r\n        /// <summary>\r\n        /// Random game picker\r\n        /// </summary>\r\n        public const string TopPanelSelectRandomGameButton = \"LOCTopPanelSelectRandomGameButton\";\r\n        /// <summary>\r\n        /// Views random game selector\r\n        /// </summary>\r\n        public const string TopPanelViewSelectRandomGameButton = \"LOCTopPanelViewSelectRandomGameButton\";\r\n        /// <summary>\r\n        /// Select random game from the view\r\n        /// </summary>\r\n        public const string TopPanelViewSelectRandomGameButtonTooltip = \"LOCTopPanelViewSelectRandomGameButtonTooltip\";\r\n        /// <summary>\r\n        /// Save grouping and sorting settings\r\n        /// </summary>\r\n        public const string FilterPresetSaveViewOptions = \"LOCFilterPresetSaveViewOptions\";\r\n        /// <summary>\r\n        /// Show as quick filter in Fullscreen mode\r\n        /// </summary>\r\n        public const string FilterPresetShowOnFSTopPanel = \"LOCFilterPresetShowOnFSTopPanel\";\r\n        /// <summary>\r\n        /// In past 7 days\r\n        /// </summary>\r\n        public const string InPast7Days = \"LOCInPast7Days\";\r\n        /// <summary>\r\n        /// In past 31 days\r\n        /// </summary>\r\n        public const string InPast31Days = \"LOCInPast31Days\";\r\n        /// <summary>\r\n        /// In past 365 days\r\n        /// </summary>\r\n        public const string InPast365Days = \"LOCInPast365Days\";\r\n        /// <summary>\r\n        /// More than 365 days ago\r\n        /// </summary>\r\n        public const string MoreThan365DaysAgo = \"LOCMoreThan365DaysAgo\";\r\n        /// <summary>\r\n        /// Configure\r\n        /// </summary>\r\n        public const string Configure = \"LOCConfigure\";\r\n        /// <summary>\r\n        /// Save preset\r\n        /// </summary>\r\n        public const string FilterPresetSave = \"LOCFilterPresetSave\";\r\n        /// <summary>\r\n        /// Minimize after starting game\r\n        /// </summary>\r\n        public const string SettingsMinimizeAfterStartingGame = \"LOCSettingsMinimizeAfterStartingGame\";\r\n        /// <summary>\r\n        /// Minimize Playnite after a game is started.\r\n        /// </summary>\r\n        public const string SettingsMinimizeAfterStartingGameDescription = \"LOCSettingsMinimizeAfterStartingGameDescription\";\r\n        /// <summary>\r\n        /// Font Size\r\n        /// </summary>\r\n        public const string SettingsFontSize = \"LOCSettingsFontSize\";\r\n        /// <summary>\r\n        /// Font Size Small\r\n        /// </summary>\r\n        public const string SettingsFontSizeSmall = \"LOCSettingsFontSizeSmall\";\r\n        /// <summary>\r\n        /// Enable game controller API support\r\n        /// </summary>\r\n        public const string SettingsControllerApi = \"LOCSettingsControllerApi\";\r\n        /// <summary>\r\n        /// Game controller support\r\n        /// </summary>\r\n        public const string SettingsXInputProcessing = \"LOCSettingsXInputProcessing\";\r\n        /// <summary>\r\n        /// If disabled, Playnite won't accept any game controller inputs.\r\n        /// </summary>\r\n        public const string SettingsXInputProcessingDescription = \"LOCSettingsXInputProcessingDescription\";\r\n        /// <summary>\r\n        /// Show items on main menu:\r\n        /// </summary>\r\n        public const string SettingsShowItemsMainMenuHeader = \"LOCSettingsShowItemsMainMenuHeader\";\r\n        /// <summary>\r\n        /// Inverted X/A main view button binding\r\n        /// </summary>\r\n        public const string SettingsSwapMainViewXAButtons = \"LOCSettingsSwapMainViewXAButtons\";\r\n        /// <summary>\r\n        /// Swaps button bindings for starting a game and showing game details page on main view.\r\n        /// </summary>\r\n        public const string SettingsSwapMainViewXAButtonsDescriptions = \"LOCSettingsSwapMainViewXAButtonsDescriptions\";\r\n        /// <summary>\r\n        /// Swap confirmation/cancelation button binding\r\n        /// </summary>\r\n        public const string SettingsSwapConfirmCancelButtons = \"LOCSettingsSwapConfirmCancelButtons\";\r\n        /// <summary>\r\n        /// Inverts A/B button bindings for confirmation and cancellation.\r\n        /// </summary>\r\n        public const string SettingsSwapConfirmCancelButtonsDescriptions = \"LOCSettingsSwapConfirmCancelButtonsDescriptions\";\r\n        /// <summary>\r\n        /// Primary controller only\r\n        /// </summary>\r\n        public const string SettingsPrimaryControllerOnly = \"LOCSettingsPrimaryControllerOnly\";\r\n        /// <summary>\r\n        /// Only accept inputs from primary controller when enabled.\r\n        /// </summary>\r\n        public const string SettingsPrimaryControllerOnlyDescription = \"LOCSettingsPrimaryControllerOnlyDescription\";\r\n        /// <summary>\r\n        /// Guide button focuses Playnite\r\n        /// </summary>\r\n        public const string SettingsRefocusOnGuidButton = \"LOCSettingsRefocusOnGuidButton\";\r\n        /// <summary>\r\n        /// Interface volume\r\n        /// </summary>\r\n        public const string SettingsInterfaceVolume = \"LOCSettingsInterfaceVolume\";\r\n        /// <summary>\r\n        /// Background volume\r\n        /// </summary>\r\n        public const string SettingsMusiVolume = \"LOCSettingsMusiVolume\";\r\n        /// <summary>\r\n        /// Mute when in background\r\n        /// </summary>\r\n        public const string SettingsMuteBackground = \"LOCSettingsMuteBackground\";\r\n        /// <summary>\r\n        /// Failed to initialize audio interface.\r\n        /// </summary>\r\n        public const string ErrorAudioInterfaceInit = \"LOCErrorAudioInterfaceInit\";\r\n        /// <summary>\r\n        /// Output API\r\n        /// </summary>\r\n        public const string SettingsAudioOutputApi = \"LOCSettingsAudioOutputApi\";\r\n        /// <summary>\r\n        /// API used for audio output. Change if you are experiencing issues with sound.\r\n        /// </summary>\r\n        public const string SettingsAudioOutputApiDescription = \"LOCSettingsAudioOutputApiDescription\";\r\n        /// <summary>\r\n        /// General\r\n        /// </summary>\r\n        public const string SettingsFSSectionGeneral = \"LOCSettingsFSSectionGeneral\";\r\n        /// <summary>\r\n        /// Visuals\r\n        /// </summary>\r\n        public const string SettingsFSSectionVisuals = \"LOCSettingsFSSectionVisuals\";\r\n        /// <summary>\r\n        /// Audio\r\n        /// </summary>\r\n        public const string SettingsFSSectionAudio = \"LOCSettingsFSSectionAudio\";\r\n        /// <summary>\r\n        /// Layout\r\n        /// </summary>\r\n        public const string SettingsFSSectionLayout = \"LOCSettingsFSSectionLayout\";\r\n        /// <summary>\r\n        /// Menus\r\n        /// </summary>\r\n        public const string SettingsFSSectionMenus = \"LOCSettingsFSSectionMenus\";\r\n        /// <summary>\r\n        /// Input\r\n        /// </summary>\r\n        public const string SettingsFSSection = \"LOCSettingsFSSection\";\r\n        /// <summary>\r\n        /// {0} is starting…\r\n        /// </summary>\r\n        public const string GameIsStarting = \"LOCGameIsStarting\";\r\n        /// <summary>\r\n        /// {0} is running…\r\n        /// </summary>\r\n        public const string GameIsRunning = \"LOCGameIsRunning\";\r\n        /// <summary>\r\n        /// Caps\r\n        /// </summary>\r\n        public const string TextInputCapitalize = \"LOCTextInputCapitalize\";\r\n        /// <summary>\r\n        /// Space\r\n        /// </summary>\r\n        public const string TextInputSpace = \"LOCTextInputSpace\";\r\n        /// <summary>\r\n        /// Image rendering scaler\r\n        /// </summary>\r\n        public const string SettingsImageScalerMode = \"LOCSettingsImageScalerMode\";\r\n        /// <summary>\r\n        /// Alternative\r\n        /// </summary>\r\n        public const string SettingsImageScalingAlternative = \"LOCSettingsImageScalingAlternative\";\r\n        /// <summary>\r\n        /// Balanced\r\n        /// </summary>\r\n        public const string SettingsImageScalingBalanced = \"LOCSettingsImageScalingBalanced\";\r\n        /// <summary>\r\n        /// Quality\r\n        /// </summary>\r\n        public const string SettingsImageScalingQuality = \"LOCSettingsImageScalingQuality\";\r\n        /// <summary>\r\n        /// Quality:\r\n        /// </summary>\r\n        public const string SettingsImageScalerModeTooltip = \"LOCSettingsImageScalerModeTooltip\";\r\n        /// <summary>\r\n        /// Select file…\r\n        /// </summary>\r\n        public const string SelectFileTooltip = \"LOCSelectFileTooltip\";\r\n        /// <summary>\r\n        /// Select folder…\r\n        /// </summary>\r\n        public const string SelectDirectoryTooltip = \"LOCSelectDirectoryTooltip\";\r\n        /// <summary>\r\n        /// Startup script\r\n        /// </summary>\r\n        public const string StartupScript = \"LOCStartupScript\";\r\n        /// <summary>\r\n        /// Please note that both extensions and themes can greatly affect Playnite's performance, stability and security.\r\n        /// </summary>\r\n        public const string AddonPerfNotice = \"LOCAddonPerfNotice\";\r\n        /// <summary>\r\n        /// Choose on startup\r\n        /// </summary>\r\n        public const string GameActionSelectOnStart = \"LOCGameActionSelectOnStart\";\r\n        /// <summary>\r\n        /// Choose on startup\r\n        /// </summary>\r\n        public const string EmulatorSelectOnStart = \"LOCEmulatorSelectOnStart\";\r\n        /// <summary>\r\n        /// Built-in profiles\r\n        /// </summary>\r\n        public const string EmulatorBuiltInProfiles = \"LOCEmulatorBuiltInProfiles\";\r\n        /// <summary>\r\n        /// Built-in profile\r\n        /// </summary>\r\n        public const string EmulatorBuiltInProfile = \"LOCEmulatorBuiltInProfile\";\r\n        /// <summary>\r\n        /// Custom profiles\r\n        /// </summary>\r\n        public const string EmulatorCustomProfiles = \"LOCEmulatorCustomProfiles\";\r\n        /// <summary>\r\n        /// Custom profile\r\n        /// </summary>\r\n        public const string EmulatorCustomProfile = \"LOCEmulatorCustomProfile\";\r\n        /// <summary>\r\n        /// Handled by a built-in script\r\n        /// </summary>\r\n        public const string EmulatorFunctionHandledByScript = \"LOCEmulatorFunctionHandledByScript\";\r\n        /// <summary>\r\n        /// Emulator specification\r\n        /// </summary>\r\n        public const string EmulatorSpec = \"LOCEmulatorSpec\";\r\n        /// <summary>\r\n        /// Platform specification\r\n        /// </summary>\r\n        public const string PlatformSpec = \"LOCPlatformSpec\";\r\n        /// <summary>\r\n        /// Region specification\r\n        /// </summary>\r\n        public const string RegionSpec = \"LOCRegionSpec\";\r\n        /// <summary>\r\n        /// Execute before starting emulator\r\n        /// </summary>\r\n        public const string EmulatorPreScriptDescription = \"LOCEmulatorPreScriptDescription\";\r\n        /// <summary>\r\n        /// Execute after emulator is started\r\n        /// </summary>\r\n        public const string EmulatorPostScriptDescription = \"LOCEmulatorPostScriptDescription\";\r\n        /// <summary>\r\n        /// Execute after exiting emulator\r\n        /// </summary>\r\n        public const string EmulatorStartedScriptDescription = \"LOCEmulatorStartedScriptDescription\";\r\n        /// <summary>\r\n        /// Emulator executable not found.\r\n        /// </summary>\r\n        public const string ErrorEmulatorExecutableNotFound = \"LOCErrorEmulatorExecutableNotFound\";\r\n        /// <summary>\r\n        /// Emulator specification not found.\r\n        /// </summary>\r\n        public const string ErrorEmulatorSpecificationNotFound = \"LOCErrorEmulatorSpecificationNotFound\";\r\n        /// <summary>\r\n        /// Emulator startup script not found.\r\n        /// </summary>\r\n        public const string ErrorEmulatorStartupScriptNotFound = \"LOCErrorEmulatorStartupScriptNotFound\";\r\n        /// <summary>\r\n        /// Split as separate games\r\n        /// </summary>\r\n        public const string SplitEmuImportSplitGames = \"LOCSplitEmuImportSplitGames\";\r\n        /// <summary>\r\n        /// Merge into one game\r\n        /// </summary>\r\n        public const string SplitEmuImportMergeGames = \"LOCSplitEmuImportMergeGames\";\r\n        /// <summary>\r\n        /// Set platform\r\n        /// </summary>\r\n        public const string EmuImportAssignPlatform = \"LOCEmuImportAssignPlatform\";\r\n        /// <summary>\r\n        /// Set region\r\n        /// </summary>\r\n        public const string EmuImportAssignRegion = \"LOCEmuImportAssignRegion\";\r\n        /// <summary>\r\n        /// Scan folder\r\n        /// </summary>\r\n        public const string EmuScanDirectory = \"LOCEmuScanDirectory\";\r\n        /// <summary>\r\n        /// Scan configurations\r\n        /// </summary>\r\n        public const string EmuScanConfigurations = \"LOCEmuScanConfigurations\";\r\n        /// <summary>\r\n        /// Exclude patterns from checksum scan\r\n        /// </summary>\r\n        public const string EmuCrcExcludeFileTypes = \"LOCEmuCrcExcludeFileTypes\";\r\n        /// <summary>\r\n        /// Files matching specified pattern(s) won't be scanned for checksum and will be matched by file name. See emulator help page for more information.\r\n        /// </summary>\r\n        public const string EmuCrcExcludeFileTypesTooltip = \"LOCEmuCrcExcludeFileTypesTooltip\";\r\n        /// <summary>\r\n        /// Scan with emulator\r\n        /// </summary>\r\n        public const string EmuScanEmulator = \"LOCEmuScanEmulator\";\r\n        /// <summary>\r\n        /// Name has to be set when saving new configuration.\r\n        /// </summary>\r\n        public const string ScanConfigNameError = \"LOCScanConfigNameError\";\r\n        /// <summary>\r\n        /// Emulator or emulator profile is not set.\r\n        /// </summary>\r\n        public const string ScanConfigNoEmulatorError = \"LOCScanConfigNoEmulatorError\";\r\n        /// <summary>\r\n        /// Directory to scan is not specified or it doesn't exist.\r\n        /// </summary>\r\n        public const string ScanConfigDirectoryError = \"LOCScanConfigDirectoryError\";\r\n        /// <summary>\r\n        /// Scan configuration is not set properly.\r\n        /// </summary>\r\n        public const string ScanConfigError = \"LOCScanConfigError\";\r\n        /// <summary>\r\n        /// Include in bulk scan auto-scan\r\n        /// </summary>\r\n        public const string EmuScanIncludeGlobalUpdate = \"LOCEmuScanIncludeGlobalUpdate\";\r\n        /// <summary>\r\n        /// Failed to scan folder for emulators.\r\n        /// </summary>\r\n        public const string EmulatorScanFailed = \"LOCEmulatorScanFailed\";\r\n        /// <summary>\r\n        /// Failed to scan folder(s) for emulated games.\r\n        /// </summary>\r\n        public const string EmulatedGameScanFailed = \"LOCEmulatedGameScanFailed\";\r\n        /// <summary>\r\n        /// Hide imported\r\n        /// </summary>\r\n        public const string EmuScanHideImported = \"LOCEmuScanHideImported\";\r\n        /// <summary>\r\n        /// Profiles to import:\r\n        /// </summary>\r\n        public const string EmuImportProfilesToImportHeader = \"LOCEmuImportProfilesToImportHeader\";\r\n        /// <summary>\r\n        /// Auto-scan configurations\r\n        /// </summary>\r\n        public const string EmuAutoScanConfigurations = \"LOCEmuAutoScanConfigurations\";\r\n        /// <summary>\r\n        /// Save as auto-scan configuration\r\n        /// </summary>\r\n        public const string EmuSaveScanConfig = \"LOCEmuSaveScanConfig\";\r\n        /// <summary>\r\n        /// Saves configuration for later use during library update. Saved configurations can be managed via \"Configure Emulators\" menu.\r\n        /// </summary>\r\n        public const string EmuSaveScanConfigTooltip = \"LOCEmuSaveScanConfigTooltip\";\r\n        /// <summary>\r\n        /// Import using relative paths\r\n        /// </summary>\r\n        public const string EmuImportWithRelativePaths = \"LOCEmuImportWithRelativePaths\";\r\n        /// <summary>\r\n        /// If possible import game files using paths relative to Playnite's installation folder or emulator's installation folder.\r\n        /// </summary>\r\n        public const string EmuImportWithRelativePathsTooltip = \"LOCEmuImportWithRelativePathsTooltip\";\r\n        /// <summary>\r\n        /// Scan subfolders\r\n        /// </summary>\r\n        public const string EmuImportScanSubfolders = \"LOCEmuImportScanSubfolders\";\r\n        /// <summary>\r\n        /// Scan inside archives\r\n        /// </summary>\r\n        public const string EmuImportScanInsideArchives = \"LOCEmuImportScanInsideArchives\";\r\n        /// <summary>\r\n        /// Merge related files\r\n        /// </summary>\r\n        public const string EmuMergeRelatedFiles = \"LOCEmuMergeRelatedFiles\";\r\n        /// <summary>\r\n        /// Merge related game files, like individual game discs, under one game entry.\r\n        /// </summary>\r\n        public const string EmuMergeRelatedFilesTooltip = \"LOCEmuMergeRelatedFilesTooltip\";\r\n        /// <summary>\r\n        /// Add scanner\r\n        /// </summary>\r\n        public const string EmuAddScanner = \"LOCEmuAddScanner\";\r\n        /// <summary>\r\n        /// Add saved scanner\r\n        /// </summary>\r\n        public const string EmuAddSavedScanner = \"LOCEmuAddSavedScanner\";\r\n        /// <summary>\r\n        /// Start scan\r\n        /// </summary>\r\n        public const string StartScan = \"LOCStartScan\";\r\n        /// <summary>\r\n        /// Add scan configuration(s) with emulators to scan specific folders. Make sure that emulators are properly configured prior to importing games (via Library -&gt; Configure Emulators menu).\r\n        /// </summary>\r\n        public const string EmuImportDirectoryConfigDesc = \"LOCEmuImportDirectoryConfigDesc\";\r\n        /// <summary>\r\n        /// Default status assigned to newly added games\r\n        /// </summary>\r\n        public const string CompletionStatusDefaultStatusDesc = \"LOCCompletionStatusDefaultStatusDesc\";\r\n        /// <summary>\r\n        /// Status assigned to games played for the first time\r\n        /// </summary>\r\n        public const string CompletionStatusPlayedStatusDesc = \"LOCCompletionStatusPlayedStatusDesc\";\r\n        /// <summary>\r\n        /// Failed to initialize PowerShell script runtime. If you are Windows 7 user, try (re)installing PowerShell 5.1 to fix the issue.\r\n        /// </summary>\r\n        public const string PowerShellCreationError = \"LOCPowerShellCreationError\";\r\n        /// <summary>\r\n        /// Filter preset with specified name already exists. Update preset with new settings?\r\n        /// </summary>\r\n        public const string FilterPresetNameConflict = \"LOCFilterPresetNameConflict\";\r\n        /// <summary>\r\n        /// Automatically fill missing sorting names for batch-added or edited games\r\n        /// </summary>\r\n        public const string SortingNameAutofill = \"LOCSortingNameAutofill\";\r\n        /// <summary>\r\n        /// When you edit a game, add games via a library update, an emulator folder scan, or a normal folder scan, automatically fill the \"Sorting Name\" field with a better sortable representation of the game's name. For example \"The Witcher 3\" will get a Sorting Name of \"Witcher 03\". This will never set a sorting name that doesn't differ from the game name, and it will only automatically update sorting names that are empty.\r\n        /// </summary>\r\n        public const string SortingNameAutofillTooltip = \"LOCSortingNameAutofillTooltip\";\r\n        /// <summary>\r\n        /// These words will be removed from the start of the automatically filled Sorting Name value:\r\n        /// </summary>\r\n        public const string SortingNameRemovedArticles = \"LOCSortingNameRemovedArticles\";\r\n        /// <summary>\r\n        /// Use this for ignoring words at the start of a string for sorting purposes. The default is \"The\", \"An\", and \"A\".\r\n        /// </summary>\r\n        public const string SortingNameRemovedArticlesTooltip = \"LOCSortingNameRemovedArticlesTooltip\";\r\n        /// <summary>\r\n        /// Fill Sorting Name for games without one\r\n        /// </summary>\r\n        public const string SortingNameAutofillButton = \"LOCSortingNameAutofillButton\";\r\n        /// <summary>\r\n        /// Sorting\r\n        /// </summary>\r\n        public const string SettingsSortingLabel = \"LOCSettingsSortingLabel\";\r\n        /// <summary>\r\n        /// Filling Sorting Name values…\r\n        /// </summary>\r\n        public const string SortingNameAutofillProgress = \"LOCSortingNameAutofillProgress\";\r\n        /// <summary>\r\n        /// Nahimic service has been detected to be running on your system. This service is known to cause rendering issues to Playnite (and other apps).\r\n        /// </summary>\r\n        public const string NahimicServiceWarning = \"LOCNahimicServiceWarning\";\r\n        /// <summary>\r\n        /// Playnite is running with elevated privileges (as an administrator). This is not recommended since it gives elevated privileges to all installed extensions and all games/apps started from Playnite!\r\n        /// </summary>\r\n        public const string ElevatedProcessWarning = \"LOCElevatedProcessWarning\";\r\n        /// <summary>\r\n        /// Show warning if Playnite is running with elevated privileges\r\n        /// </summary>\r\n        public const string ElevatedProcessWarningShowOption = \"LOCElevatedProcessWarningShowOption\";\r\n        /// <summary>\r\n        /// Get the real size on drive when calculating the size of games\r\n        /// </summary>\r\n        public const string InstallSizeScanUseSizeOnDiskOption = \"LOCInstallSizeScanUseSizeOnDiskOption\";\r\n        /// <summary>\r\n        /// If enabled, scans will be slower and will get the real size that files use in the drive.\r\n        /// </summary>\r\n        public const string InstallSizeScanUseSizeOnDiskOptionTooltip = \"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\";\r\n        /// <summary>\r\n        /// Following add-on(s) have been reported as potentially problematic, either due to high stability/performance impact or security issues. We strongly recommend that you uninstall them:\r\n        /// </summary>\r\n        public const string WarningBlacklistedExtensions = \"LOCWarningBlacklistedExtensions\";\r\n        /// <summary>\r\n        /// Exclude online files from scan\r\n        /// </summary>\r\n        public const string EmuExcludeOnlineFiles = \"LOCEmuExcludeOnlineFiles\";\r\n        /// <summary>\r\n        /// Files stored on cloud storage won't be scanned and imported if not available locally.\r\n        /// </summary>\r\n        public const string EmuExcludeOnlineFilesTooltip = \"LOCEmuExcludeOnlineFilesTooltip\";\r\n        /// <summary>\r\n        /// Scan but using simplified method without file content\r\n        /// </summary>\r\n        public const string EmuUseSimplifiedOnlineFileScan = \"LOCEmuUseSimplifiedOnlineFileScan\";\r\n        /// <summary>\r\n        /// Files will be imported but using less accurate method that doesn't require file content to be downloaded and present locally.\r\n        /// </summary>\r\n        public const string EmuUseSimplifiedOnlineFileScanTooltip = \"LOCEmuUseSimplifiedOnlineFileScanTooltip\";\r\n        /// <summary>\r\n        /// Apply to all\r\n        /// </summary>\r\n        public const string MetadatSetAllFieldsToValue = \"LOCMetadatSetAllFieldsToValue\";\r\n        /// <summary>\r\n        /// Override installation state\r\n        /// </summary>\r\n        public const string OverrideInstallState = \"LOCOverrideInstallState\";\r\n        /// <summary>\r\n        /// When set, Playnite will ignore installation state (including installation directory) set by the integration plugin that imports this game.\r\n        /// </summary>\r\n        public const string OverrideInstallStateTooltip = \"LOCOverrideInstallStateTooltip\";\r\n        /// <summary>\r\n        /// Only manually\r\n        /// </summary>\r\n        public const string OptionOnlyManually = \"LOCOptionOnlyManually\";\r\n        /// <summary>\r\n        /// Once a day\r\n        /// </summary>\r\n        public const string OptionOnceADay = \"LOCOptionOnceADay\";\r\n        /// <summary>\r\n        /// Once a week\r\n        /// </summary>\r\n        public const string OptionOnceAWeek = \"LOCOptionOnceAWeek\";\r\n        /// <summary>\r\n        /// On every startup\r\n        /// </summary>\r\n        public const string OptionOnEveryStartup = \"LOCOptionOnEveryStartup\";\r\n        /// <summary>\r\n        /// Check for program updates\r\n        /// </summary>\r\n        public const string CheckProgramUpdates = \"LOCCheckProgramUpdates\";\r\n        /// <summary>\r\n        /// Check for add-on updates\r\n        /// </summary>\r\n        public const string CheckAddonUpdates = \"LOCCheckAddonUpdates\";\r\n        /// <summary>\r\n        /// Update libraries\r\n        /// </summary>\r\n        public const string CheckLibraryUpdates = \"LOCCheckLibraryUpdates\";\r\n        /// <summary>\r\n        /// Scan emulation folders\r\n        /// </summary>\r\n        public const string CheckEmulatedLibraryUpdates = \"LOCCheckEmulatedLibraryUpdates\";\r\n        /// <summary>\r\n        /// Include hidden games\r\n        /// </summary>\r\n        public const string StatsIncludeHidden = \"LOCStatsIncludeHidden\";\r\n        /// <summary>\r\n        /// Edit fields\r\n        /// </summary>\r\n        public const string MenuSetFields = \"LOCMenuSetFields\";\r\n        /// <summary>\r\n        /// Select / Deselect all\r\n        /// </summary>\r\n        public const string ItemSelectionSelectDeselectAll = \"LOCItemSelectionSelectDeselectAll\";\r\n        /// <summary>\r\n        /// Open\r\n        /// </summary>\r\n        public const string Open = \"LOCOpen\";\r\n        /// <summary>\r\n        /// Activate\r\n        /// </summary>\r\n        public const string Activate = \"LOCActivate\";\r\n        /// <summary>\r\n        /// Assign\r\n        /// </summary>\r\n        public const string Assign = \"LOCAssign\";\r\n        /// <summary>\r\n        /// Start typing to search for games… [F1] for help\r\n        /// </summary>\r\n        public const string DefaultSearchDescription = \"LOCDefaultSearchDescription\";\r\n        /// <summary>\r\n        /// Starting with # brings up a list of available commands.\r\n        /// </summary>\r\n        public const string DefaultSearchHint = \"LOCDefaultSearchHint\";\r\n        /// <summary>\r\n        /// Include uninstalled games\r\n        /// </summary>\r\n        public const string SearchFilterUninstalled = \"LOCSearchFilterUninstalled\";\r\n        /// <summary>\r\n        /// Include hidden games\r\n        /// </summary>\r\n        public const string SearchFilterHidden = \"LOCSearchFilterHidden\";\r\n        /// <summary>\r\n        /// Uninstalled games included\r\n        /// </summary>\r\n        public const string SearchFilterUninstalledIncluded = \"LOCSearchFilterUninstalledIncluded\";\r\n        /// <summary>\r\n        /// Uninstalled games excluded\r\n        /// </summary>\r\n        public const string SearchFilterUninstalledExcluded = \"LOCSearchFilterUninstalledExcluded\";\r\n        /// <summary>\r\n        /// Hidden games included\r\n        /// </summary>\r\n        public const string SearchFilterHiddenIncluded = \"LOCSearchFilterHiddenIncluded\";\r\n        /// <summary>\r\n        /// Hidden games excluded\r\n        /// </summary>\r\n        public const string SearchFilterHiddenalledExcluded = \"LOCSearchFilterHiddenalledExcluded\";\r\n        /// <summary>\r\n        /// Play or Install\r\n        /// </summary>\r\n        public const string GameSearchItemActionPlay = \"LOCGameSearchItemActionPlay\";\r\n        /// <summary>\r\n        /// Go to details\r\n        /// </summary>\r\n        public const string GameSearchItemActionSwitchTo = \"LOCGameSearchItemActionSwitchTo\";\r\n        /// <summary>\r\n        /// Game menu\r\n        /// </summary>\r\n        public const string GameSearchItemActionOpenMenu = \"LOCGameSearchItemActionOpenMenu\";\r\n        /// <summary>\r\n        /// Edit game\r\n        /// </summary>\r\n        public const string GameSearchItemActionEdit = \"LOCGameSearchItemActionEdit\";\r\n        /// <summary>\r\n        /// Open search\r\n        /// </summary>\r\n        public const string OpenSearch = \"LOCOpenSearch\";\r\n        /// <summary>\r\n        /// Search box\r\n        /// </summary>\r\n        public const string TopPanelSearchBox = \"LOCTopPanelSearchBox\";\r\n        /// <summary>\r\n        /// Search button\r\n        /// </summary>\r\n        public const string TopPanelSearchButton = \"LOCTopPanelSearchButton\";\r\n        /// <summary>\r\n        /// Primary game action\r\n        /// </summary>\r\n        public const string SearchSettingsPrimaryAction = \"LOCSearchSettingsPrimaryAction\";\r\n        /// <summary>\r\n        /// Secondary game action\r\n        /// </summary>\r\n        public const string SearchSettingsSecondaryAction = \"LOCSearchSettingsSecondaryAction\";\r\n        /// <summary>\r\n        /// CTRL-F opens global search instead of focusing search box\r\n        /// </summary>\r\n        public const string SearchSettingsKeyboardOpenSearch = \"LOCSearchSettingsKeyboardOpenSearch\";\r\n        /// <summary>\r\n        /// Save game filter settings between search sessions\r\n        /// </summary>\r\n        public const string SearchSettingsSaveFilter = \"LOCSearchSettingsSaveFilter\";\r\n        /// <summary>\r\n        /// Search providers\r\n        /// </summary>\r\n        public const string SearchSettingsSearchProviders = \"LOCSearchSettingsSearchProviders\";\r\n        /// <summary>\r\n        /// Default keyword\r\n        /// </summary>\r\n        public const string SearchSettingsDefaultKeyword = \"LOCSearchSettingsDefaultKeyword\";\r\n        /// <summary>\r\n        /// Custom keyword\r\n        /// </summary>\r\n        public const string SearchSettingsCustomKeyword = \"LOCSearchSettingsCustomKeyword\";\r\n        /// <summary>\r\n        /// System wide shortcut\r\n        /// </summary>\r\n        public const string SearchSettingsSystemWideShortcut = \"LOCSearchSettingsSystemWideShortcut\";\r\n        /// <summary>\r\n        /// Playnite search\r\n        /// </summary>\r\n        public const string SearchTitle = \"LOCSearchTitle\";\r\n        /// <summary>\r\n        /// Extension Settings\r\n        /// </summary>\r\n        public const string ExtensionSettingsMenu = \"LOCExtensionSettingsMenu\";\r\n        /// <summary>\r\n        /// Exclusions\r\n        /// </summary>\r\n        public const string Exclusions = \"LOCExclusions\";\r\n        /// <summary>\r\n        /// Excluded files relative to scan folder\r\n        /// </summary>\r\n        public const string EmuScannerExcludedFiles = \"LOCEmuScannerExcludedFiles\";\r\n        /// <summary>\r\n        /// Excluded folders relative to scan folder\r\n        /// </summary>\r\n        public const string EmuScannerExcludedFolders = \"LOCEmuScannerExcludedFolders\";\r\n        /// <summary>\r\n        /// Add file to exclusion list\r\n        /// </summary>\r\n        public const string EmuImportAddROMExclusionList = \"LOCEmuImportAddROMExclusionList\";\r\n        /// <summary>\r\n        /// Add folder to exclusion list\r\n        /// </summary>\r\n        public const string EmuImportAddFolderExclusionList = \"LOCEmuImportAddFolderExclusionList\";\r\n        /// <summary>\r\n        /// Exclusions can be only added to saved scanner configurations.\r\n        /// </summary>\r\n        public const string EmuExclusionNoConfigError = \"LOCEmuExclusionNoConfigError\";\r\n        /// <summary>\r\n        /// Exclusions have been added to \"{0}\" scanner.\r\n        /// </summary>\r\n        public const string EmuExclusionAddedMessage = \"LOCEmuExclusionAddedMessage\";\r\n        /// <summary>\r\n        /// Override platform\r\n        /// </summary>\r\n        public const string EmuOverridePlatform = \"LOCEmuOverridePlatform\";\r\n        /// <summary>\r\n        /// When set, scanner will assign this platform to all games, overwriting any automatically detected platforms.\r\n        /// </summary>\r\n        public const string EmuOverridePlatformTooltip = \"LOCEmuOverridePlatformTooltip\";\r\n        /// <summary>\r\n        /// Include commands in default search\r\n        /// </summary>\r\n        public const string SearchIncludeCommandsInDefault = \"LOCSearchIncludeCommandsInDefault\";\r\n        /// <summary>\r\n        /// When disabled, commands won't be included in default search until # prefix is used.\r\n        /// </summary>\r\n        public const string SearchIncludeCommandsInDefaultTooltip = \"LOCSearchIncludeCommandsInDefaultTooltip\";\r\n        /// <summary>\r\n        /// Use fuzzy matching in name filter\r\n        /// </summary>\r\n        public const string NameFilterUseFuzzyMatching = \"NameFilterUseFuzzyMatching\";\r\n        /// <summary>\r\n        /// When enabled, name filter will match game names the same way as global search.\r\n        /// </summary>\r\n        public const string NameFilterUseFuzzyMatchingTooltip = \"NameFilterUseFuzzyMatchingTooltip\";\r\n        /// <summary>\r\n        /// Fields to be displayed for game results:\r\n        /// </summary>\r\n        public const string SearchViewGameFieldOptions = \"LOCSearchViewGameFieldOptions\";\r\n        /// <summary>\r\n        /// Hidden Status\r\n        /// </summary>\r\n        public const string HiddenStatus = \"LOCHiddenStatus\";\r\n        /// <summary>\r\n        /// Data backup was cancelled.\r\n        /// </summary>\r\n        public const string BackupCancelled = \"LOCBackupCancelled\";\r\n        /// <summary>\r\n        /// Data backup failed.\r\n        /// </summary>\r\n        public const string BackupFailed = \"LOCBackupFailed\";\r\n        /// <summary>\r\n        /// Data backup error\r\n        /// </summary>\r\n        public const string BackupErrorTitle = \"LOCBackupErrorTitle\";\r\n        /// <summary>\r\n        /// Data backup in progress…\r\n        /// </summary>\r\n        public const string BackupProgress = \"LOCBackupProgress\";\r\n        /// <summary>\r\n        /// Restoring data from backup…\r\n        /// </summary>\r\n        public const string BackupRestoreProgress = \"LOCBackupRestoreProgress\";\r\n        /// <summary>\r\n        /// Failed to restore data from backup.\r\n        /// </summary>\r\n        public const string BackupRestoreFailed = \"LOCBackupRestoreFailed\";\r\n        /// <summary>\r\n        /// Settings\r\n        /// </summary>\r\n        public const string BackupOptionSettings = \"LOCBackupOptionSettings\";\r\n        /// <summary>\r\n        /// Game library\r\n        /// </summary>\r\n        public const string BackupOptionLibrary = \"LOCBackupOptionLibrary\";\r\n        /// <summary>\r\n        /// Game library media\r\n        /// </summary>\r\n        public const string BackupOptionGameMedia = \"LOCBackupOptionGameMedia\";\r\n        /// <summary>\r\n        /// Installed extensions\r\n        /// </summary>\r\n        public const string BackupOptionExtensions = \"LOCBackupOptionExtensions\";\r\n        /// <summary>\r\n        /// Extensions data\r\n        /// </summary>\r\n        public const string BackupOptionExtensionsData = \"LOCBackupOptionExtensionsData\";\r\n        /// <summary>\r\n        /// Installed themes\r\n        /// </summary>\r\n        public const string BackupOptionThemes = \"LOCBackupOptionThemes\";\r\n        /// <summary>\r\n        /// Select data to be restored from specified backup file.\r\n        /// </summary>\r\n        public const string BackupRestoreMessage = \"LOCBackupRestoreMessage\";\r\n        /// <summary>\r\n        /// Select items to be included with data backup. Application settings and game library data are included by default.\r\n        /// </summary>\r\n        public const string BackupDataBackupMessage = \"LOCBackupDataBackupMessage\";\r\n        /// <summary>\r\n        /// Automatic data backup\r\n        /// </summary>\r\n        public const string SettingsEnableAutomaticBackup = \"LOCSettingsEnableAutomaticBackup\";\r\n        /// <summary>\r\n        /// Auto backup frequency\r\n        /// </summary>\r\n        public const string SettingsAutoBackupFrequency = \"LOCSettingsAutoBackupFrequency\";\r\n        /// <summary>\r\n        /// Backup folder\r\n        /// </summary>\r\n        public const string SettingsBackupFolder = \"LOCSettingsBackupFolder\";\r\n        /// <summary>\r\n        /// Rotating backups\r\n        /// </summary>\r\n        public const string SettingsRotatingBackups = \"LOCSettingsRotatingBackups\";\r\n        /// <summary>\r\n        /// Include additional data:\r\n        /// </summary>\r\n        public const string SettingsAutoBackupIncludeItems = \"LOCSettingsAutoBackupIncludeItems\";\r\n        /// <summary>\r\n        /// Backup folder needs to be set if auto backup is enabled.\r\n        /// </summary>\r\n        public const string SettingsNoBackupDirSpecifiedError = \"LOCSettingsNoBackupDirSpecifiedError\";\r\n        /// <summary>\r\n        /// Show notifications for patch releases only\r\n        /// </summary>\r\n        public const string UpdateNotifyOnlyPatches = \"LOCUpdateNotifyOnlyPatches\";\r\n        /// <summary>\r\n        /// When enabled, only updates available for currently installed major release will result in update notification.\r\n        /// </summary>\r\n        public const string UpdateNotifyOnlyPatchesToolip = \"LOCUpdateNotifyOnlyPatchesToolip\";\r\n        /// <summary>\r\n        /// Use relative dates for the past week\r\n        /// </summary>\r\n        public const string SettingsPastWeekRelativeFormat = \"LOCSettingsPastWeekRelativeFormat\";\r\n        /// <summary>\r\n        /// Use relative dates in \"Today\", \"Yesterday\" etc. format if the date is less than a week old.\r\n        /// </summary>\r\n        public const string SettingsPastWeekRelativeFormatTooltip = \"LOCSettingsPastWeekRelativeFormatTooltip\";\r\n        /// <summary>\r\n        /// Web image search\r\n        /// </summary>\r\n        public const string SettingsWebImageSearch = \"LOCSettingsWebImageSearch\";\r\n        /// <summary>\r\n        /// Icon image search string\r\n        /// </summary>\r\n        public const string SettingsWebImageSearchIconTerm = \"LOCSettingsWebImageSearchIconTerm\";\r\n        /// <summary>\r\n        /// Cover image search string\r\n        /// </summary>\r\n        public const string SettingsWebImageSearchCoverTerm = \"LOCSettingsWebImageSearchCoverTerm\";\r\n        /// <summary>\r\n        /// Background image search string\r\n        /// </summary>\r\n        public const string SettingsWebImageSearchBackground = \"LOCSettingsWebImageSearchBackground\";\r\n        /// <summary>\r\n        /// Getting add-on information…\r\n        /// </summary>\r\n        public const string GettingsAddonInformation = \"LOCGettingsAddonInformation\";\r\n        /// <summary>\r\n        /// No metadata source is available\r\n        /// </summary>\r\n        public const string NoMetadataSource = \"LOCNoMetadataSource\";\r\n        /// <summary>\r\n        /// Play action settings\r\n        /// </summary>\r\n        public const string ScannerConfigPlayActionSettings = \"LOCScannerConfigPlayActionSettings\";\r\n        /// <summary>\r\n        /// Use scanner settings\r\n        /// </summary>\r\n        public const string ScannerConfigPlayActionSettingsScanner = \"LOCScannerConfigPlayActionSettingsScanner\";\r\n        /// <summary>\r\n        /// Select profile on startup\r\n        /// </summary>\r\n        public const string ScannerConfigPlayActionSettingsSelectProfile = \"LOCScannerConfigPlayActionSettingsSelectProfile\";\r\n        /// <summary>\r\n        /// Select emulator on startup\r\n        /// </summary>\r\n        public const string ScannerConfigPlayActionSettingsSelectEmulator = \"LOCScannerConfigPlayActionSettingsSelectEmulator\";\r\n        /// <summary>\r\n        /// Automatic\r\n        /// </summary>\r\n        public const string Automatic = \"LOCAutomatic\";\r\n        /// <summary>\r\n        /// Always on\r\n        /// </summary>\r\n        public const string AlwaysOn = \"LOCAlwaysOn\";\r\n        /// <summary>\r\n        /// Always off\r\n        /// </summary>\r\n        public const string AlwaysOff = \"LOCAlwaysOff\";\r\n        /// <summary>\r\n        /// Accessibility (screen reader) support\r\n        /// </summary>\r\n        public const string SettingsAccessibilityInterface = \"LOCSettingsAccessibilityInterface\";\r\n        /// <summary>\r\n        /// Application menu\r\n        /// </summary>\r\n        public const string ApplicationMenu = \"LOCApplicationMenu\";\r\n        /// <summary>\r\n        /// Game menu\r\n        /// </summary>\r\n        public const string GameMenu = \"LOCGameMenu\";\r\n        /// <summary>\r\n        /// Program folder\r\n        /// </summary>\r\n        public const string ProgramFolder = \"LOCProgramFolder\";\r\n        /// <summary>\r\n        /// User data directory\r\n        /// </summary>\r\n        public const string UserDataFolder = \"LOCUserDataFolder\";\r\n        /// <summary>\r\n        /// Library file corruption has been detected, Playnite will now shutdown.\r\n        /// </summary>\r\n        public const string DBCorruptionCrashMessage = \"LOCDBCorruptionCrashMessage\";\r\n        /// <summary>\r\n        /// Do you want to save changes you made?\r\n        /// </summary>\r\n        public const string UnsavedChangesAskMessage = \"LOCUnsavedChangesAskMessage\";\r\n        /// <summary>\r\n        /// Portable installation\r\n        /// </summary>\r\n        public const string PortableInstallation = \"LOCPortableInstallation\";\r\n        /// <summary>\r\n        /// No controllers detected\r\n        /// </summary>\r\n        public const string NoControllersDetected = \"LOCNoControllersDetected\";\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Localization/af_ZA.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Engels</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite taal</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Gaan Uit</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filter Aktief</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filter onaktief</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Additionele filters</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filters</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Ongeldige Data</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Stoor Veranderinge?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Tuisblad by www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Bronkode by GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Maak diag. pakket</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Stuur diag. inligting</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Oor Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Gemaak deur Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Ken Kategorie Toe</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Stel Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Voeg Kategorie By</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Gemerk - Ken kategorie toe\r\nOngemerk - Verwyder kategorie\r\nOnbepaald - Geen veranderinge (wanneer vele speletjies gewysig word)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Geen Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Geen Platform</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Oeps! Iets het verkeerd gegaan</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">'n Onherwinbare fout het voorgekom.\r\n\r\nAs jy ons wil help om hierdie kwessie op te los, beskryf asseblief die aksies wat geneem was voor die crash, en stuur dan diagnostiese inligting. As jy aanlyn is sal die pakket na die Playnite bediener opgelaai word vir ontleding.\r\n\r\nAlternatiewelik, kan jy op die 'Meld crash aan' knoppie klik om 'n nuwe GitHub kwessie te maak en die crash per hand aan te meld.\r\n\r\nDankie vir jou hulp.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Meld Crash Aan</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Begin Playnite Oor</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Begin oor in Veilige Modus</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Verlaat Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Biblioteekbestuurder</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Verwyder Speletjie(s)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\"></sys:String>\r\n    <sys:String x:Key=\"LOCSteamFriendsTooltip\">Steam Vriende</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\"></sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\"></sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Verwyder</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Verwyder ongebruikte</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatronsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCToday\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\"></sys:String>\r\n    <sys:String x:Key=\"LOCMonday\"></sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCThursday\"></sys:String>\r\n    <sys:String x:Key=\"LOCFriday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSunday\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\"></sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameId\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\"></sys:String>\r\n    <sys:String x:Key=\"LOCPresets\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumn\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCRow\"></sys:String>\r\n    <sys:String x:Key=\"LOCRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\"></sys:String>\r\n    <!--Progess string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\"></sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\"></sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdateLibStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdateEmulatedLibStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForceDownloadPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForceDownloadPlayniteTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCViewType\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\"></sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\"></sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCXInputInitErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseExeIcon\"></sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\"></sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\"></sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCChange\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCNever\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\"></sys:String>\r\n    <sys:String x:Key=\"LOCAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\"></sys:String>\r\n    <sys:String x:Key=\"LOCWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirst\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandom\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\"></sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpand\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOther\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\"></sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\"></sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\"></sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\"></sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewScrollAmountModifier\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/ar_SA.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">العربية</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">لغة Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">خروج</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">التصفية نشطة</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">التصفية معطلة</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">تصفيات اضافية</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">تصفيات</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">تصفية</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">بيانات غير صحيحة</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">حفظ التغييرات؟</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">الصفحة الرسمية على www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">الكود المصدر على Github</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">انشاء حزمة diag.</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">إرسال معلومات التشخيص</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">حول Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">صنع بواسطة Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">تحديد فئة</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">تعيين الفئات</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">إضافة فئة</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">محدد - تحديد الفئة\r\nغير محدد - إزالة فئة\r\nغير معروف - لا تغيرات (عند تحرير ألعاب متعددة)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">بلا فئة</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">بلا منصة</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">عفواً! حصل خطأ ما.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">حدث خطأ غير قابل للاسترداد.\r\n\r\nإذا كنت تودّ مساعدتنا في حل هذه المشكلة، فالمرجو وصف الإجراءات التي تم اتخاذها قبل العطل الذي حصل ثم بعد ذلك قم بإنشاء حزمة تشخيص. إذا كنت متصلا بالأنترنت فسيتم رفع الحزمة على سيرفر Playnite ليتم تحليلها.\r\n\r\nبدلًا من ذلك، يمكنك استخدام زر خيار &quot;تبليغ الخلل&quot; لإنشاء خطأ جديد على GitHub والإبلاغ عن الأعطال يدويًا.\r\n\r\nشكرا لك على مساعدتك.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">تسبب الملحق &quot;{0}&quot; في حدوث خطأ لا يمكن إصلاحه.\r\nنوصي بحفظ ملف السجل والإبلاغ عن المشكلة لمطوّر الامتداد أو الملحق. إذا أستمرت المشكلة فقم بتعطيله.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">تسبب الملحق &quot;{0}&quot; في حدوث خطأ لا يمكن إصلاحه.\r\nنوصي بالإبلاغ عن المشكلة لمطوّر الامتداد أو الملحق ، إذا أستمرت المشكلة مرة أخرى فقم بتعطيله</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">إضافة غير معروفة أو سمة جمالية &quot;ثيم&quot; قد تسببت بعطل لا يمكن اصلاحه.\r\nننصحك بإقاف إضافات الطرف الثالث, وعزل الاضافات التي قد تسبب مشاكل, وإبلاغ مطور الإضافة بالمشكلة.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">حدث خطأ غير قابل للاسترداد.\r\n\r\nإذا أردت مساعدتنا في حل هذه المشكلة، فرجاءً قم بإرسال معلومات التّشخيص. شكرا لك.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">تعطيل التمديد\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">حفظ ملف السجل</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">إرسال معلومات</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">تبليغ الانهيار</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">إعادة تشغيل Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">اعادة التشغيل بالطور الامن</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">تعطيل كافة ملحقات الطرف الثالث واستخدام المظهر الافتراضي.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">إغلاق Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">الإجراءات التي تم اتخاذها قبل العطل (الوصف يجب أن يكون بالانجليزية):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">مدير المكتبة</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">إزالة اللعبة/الألعاب؟</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">اللعبة قيد التشغيل - لا يمكنك الإزالة\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">لا يمكنك  إزالة تثبيت اللعبة وهي قيد التشغيل.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">هل أنت متأكد من أنك تريد إزالة &quot;{0}&quot; ؟</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">هل أنت متأكد من إزالة {0} الألعاب؟\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">هل أنت متأكد من أنك تريد إزالة &quot;{0}&quot; ؟\r\n\r\nسيؤدي تحديد خيار &quot;إضافة إلى قائمة الاستبعاد&quot; إلى منع استيراد الألعاب مرة أخرى في المرة التالية التي يتم فيها تحديث المكتبة.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">هل أنت متأكد من إزالة {0} الألعاب؟\r\n\r\nسيؤدي تحديد خيار &quot;إضافة إلى قائمة الاستبعاد&quot; إلى منع استيراد الألعاب مرة أخرى في المرة التالية التي يتم فيها تحديث المكتبة.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">هل أنت متأكد أنك تريد حذف {0} إدخالًا والتي ليست قيد الاستخدام حاليًا؟</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">لم يتم العثور على أماكن غير مستخدمة.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">نعم (إضافة إلى قائمة الاستبعاد)\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">هناك تغييرات غير محفوظة في هذا القسم\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">جاري تحديث تنسيق مكتبة الألعاب…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">فشل تحديث قاعدة البيانات.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">تعذّر تحديث مكنبة الألعاب. مطلوب {0} ميغابايت من مساحة التخزين.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">خطأ في اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">تعذّر بدأ اللعبة. لم يتم العثور على {0} في قاعدة البيانات.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">تعذّر بدأ اللعبة:{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">تعذّر بدأ الإجراء:{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">تعذّر فقح موقع اللعبة:{0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">تعذر الكشف عن حجم تثبيت اللعبة: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">خطأ في فحص حجم التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">حدث {0} خطأ في أثناء فحص حجم التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">فشل إنشاء إختصار:{0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">فشل فتح الدليل: {0}\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">تعذّر تثبيت اللعبة:{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">تعذّر إلغاء تثبيت اللعبة:{0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">لم يتم العثور على إجراءات بدء تشغيل اللعبة صالحة. عند استخدام إجراءات المحاكاة، تأكد من تطابق تعريفات المنصة بين تكوين اللعبة والمحاكي.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">المنفذ للتثبيت غير متوفر.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">البرنامج المساعد للمكتبة المسؤول عن هذه اللعبة معطل أو غير مثبت.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">تحميل بيانات التعريف الرسمية غير متاح.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">لم يتم تحديد أي لعبة.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">فشل تنفيذ إجراء السكريبت للعبة.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">فشل تنفيذ البرنامج النصي للتطبيق.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">فشل تنفيذ إجراء السكريبت العام.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">فشل تنفيذ إجراء نص المحاكي.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">فشل تنفيذ إجراء نص اللعب.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">لم يتم تثبيت PowerShell 3.0 أو الإصدار الأحدث منه.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">لم نستطع في كيفية تشغيل اللعبة.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">مفعل</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">معطل</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">حذف</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">إزالة الغير مستخدمة</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">إعادة تسمية</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">نسخ</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">إضافة</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">الأيقونة الافتراضية</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">صورة الغلاف الافتراضية</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">الخلفية الإفتراضية</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">انهاء</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">التالي</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">السابق</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">تم</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">السابق</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">محو</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">محو</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">استبعاد</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">استبعاد الكل</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">استيراد</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">الاسم</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">المؤلف</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">الوحدة</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">السلسلة</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">النسخة</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">اخر تشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">الأكثر لعبًا</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">مرات اللعب</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">حجم التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">مجلد</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">الملاحظات</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">أضيف</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">تاريخ الإضافة</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">تم تعديله</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">تاريخ التعديل</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">الموقع الالكتروني</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">السار</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">موافق</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">حفظ</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">إغلاق</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">إلغاء</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">تأكيد</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">إعادة ضبط</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">نعم</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">لا</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">أهلا وسهلا بكم</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">مستخدم محلي</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">عام</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">وسائط الإعلام</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">روابط</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">الاجراءت</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">جاري التحميل…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">جارٍ تنزيل الوسائط ...\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">جاري التحميل…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">نوع</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">الملف الشخصي</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">ملفات التعريف</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">حذف</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">تنزيل</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">بحث</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">دقة الوضوح</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">اي واحدة</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">تكبير</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">العرض كقائمة</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">أغلفة</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">العرض كشبكة</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">عرض التفاصيل</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">مخصص</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">الرابط</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">شكر خاص</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">الترخيص</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">المساهمون</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">جاري الخروج من Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">اليوم</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">أمس</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">الإثنين</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">الثلاثاء</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">الأربعاء</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">الخميس</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">الجمعة</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">السبت</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">الأحد</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">الأسبوع الماضي</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">الشهر الماضي</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">السنة الماضية</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">منذ أكثر من سنة</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 إلى 100 ميغابايت</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB إلى 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB إلى 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB إلى 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB إلى 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB إلى 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB إلى 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB أو أكثر</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">تم الاستيراد بنجاح.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">جميع الألعاب</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">معرف اللعبة (ID)</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">معرف قاعدة البيانات (ID)</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">الإعدادات المسبقة</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">عمود</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">أعمدة</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">صف</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">صفوف</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">لم نستطع الحصول على ملف مشغل اللعبة. لا يوجد اي ملف مشغل للعبة في الوقت الراهن.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">تحميل بيانات التعريف المفقودة فقط</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">تمكين هذا الخيار سيؤدي إلى تخطي تحميل بيانات التعريف لبيانات الخانات التي تحتوي مسبقًا على معلومات.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">اختيار الألعاب</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">الرجاء تحديد الألعاب التي يجب تحديثها باستخدام البيانات التعريفية الجديدة:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">كل الألعاب الموجودة في قاعدة البيانات</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">كل الالعاب المصفية حاليا</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">الالعاب المحددة فقط</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">لا توجد حقول لبيانات التعريف محددة</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">لم يتم تحديد حقول بيانات التعريف للتحميل. الرجاء تحديد واحد على الأقل، وتمكين موفر بيانات التعريف واحد على الأقل.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">المتجر الرسمي</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">المرجو تحديد الأماكن التي يجب ملؤها تلقائيًا بواسطة Playnite والمصادر التي يجب استخدامها للحصول على البيانات منها.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">الرجاء التفكير في النقر على الشعار أعلاه والمساهمة في تحديثات قاعدة بيانات igdb.com من أجل تحسبن البيانات التي بستخدمها Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">تنزيل بيانات التعريف…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">جاري استيراد الألعاب المثبتة…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">جاري استيراد {0} لعبة…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">إستيراد ألعاب المحاكيات من {0}</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">جاري تحميل تحديثات المكتبة…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">يتم فحص حجم الألعاب في المكتبة…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">جارٍ فحص حجم الألعاب المستوردة ...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">تم الانتهاء من تحديث المكتبة</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">جاري تحرير الموارد…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">الإعدادات</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">إعدادات…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">منصات و محاكيات</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">إعداد المحاكيات…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">مدير المكتبات…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">أدوات</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">تنزيل بيانات التعريف…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">أدوات البرمجيات…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">تهيئة التكامل…\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">فتح عميل الطرف الثالث</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">عملاء الطرف الثالث</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">تحديث مكتبة الألعاب</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">الغاء تحديث مكتبة الالعاب</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">تحديث ملفات مخصصة</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">إضافة لعبة</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">يدوي…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">الفحص تلقائيًا…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">لعبة محاكاة…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">تطبيق متجر Microsoft…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">حول Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">إرسال ملاحظات</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">التبديل إلى وضع ملء الشاشة</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">روابط</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">مساعدة</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">الدعم في Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">لدعم على Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">دليل المستخدم</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">مستندات SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">إعادة تشغيل النظام</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">إيقاف تشغيل النظام</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">تعليق النظام</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">نظام السُبات</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">قفل النظام</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">تسجيل الخروج</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">اختر لعبة عشوائية</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">مكان اللعبة لعرضها على لوحة التفاصيل:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">تباعد العناصر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">رسم خلفية العنصر الشبكي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">عرض حدود العرض الشبكي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">مصدر رمز اللعبة المفقود</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">مصدر غلاف اللعبة المفقود</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">مصدر خلفية اللعبة المفقود</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">التباعد العمودي لتفاصيل الألعاب</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">موضع تفاصيل العرض الشبكي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">موضع عرض تفاصيل قائمة الألعاب</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">رسم فاصل بين اللوحات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">ارتفاع صورة غلاف اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">ارتفاع رمز قائمة الألعاب</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">خط التطبيق</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">خط رمزي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">موضع لوحة الفلتر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">موضع لوحة الاستطلاع</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">استحضار صورة الغلاف</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">نسبة العرض إلى الارتفاع المستهدفة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">تؤثر الخيارات التالية أيضًا على عرض التجانب في وضع ملء الشاشة!\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">وضع التمدد</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD Box</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">متجر ألعاب Epic</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">مربع</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">شعار Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">الغلاف العمودي لمكتبة Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">التويتش</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* يتطلب إعادة التشغيل من أجل التطبيق</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">إعدادات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">عامة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">اللوحة العلوية</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">المظهر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">تفاصيل اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">الواجهة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">متقدم</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">شاشة كاملة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">الإدخال</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">الأداء</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">بيانات التعريف</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">جاري التحديث...</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">بحث</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">نسخ احتياطي</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">نسخ احتياطي لبيانات المكتبة</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">استعادة النسخة الاحتياطية</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">استيراد التغييرات في المكتبة تلقائيًا</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">موقع ملف قاعدة البيانات غير صحيح، يجب تعيين مسار الملف الصحيح.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">لا يمكن أن يكون اسم الحساب فارغًا.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">تنزيل بيانات التعريف بعد استيراد الألعاب</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">تشغيل Playnite مصغر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">قم بتشغيل Playnite عند بدء تشغيل جهاز الكمبيوتر الخاص بك\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">البدأ مغلقًا في خانة الإشعارات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">فشل تسجيل Playnite لبدء تشغيله عند بدء تشغيل الحاسوب.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">التشغيل في وضع ملء الشاشة\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">تحميل صورة غير متزامنة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">يعمل على تحسين سلاسة التمرير في لقوائم الألعاب مقابل أوقات تحميل صور أبطئ.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">إظهار اسم اللعبة إذا كانت صورة الغلاف مفقودة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">إظهار أسماء الألعاب في العرض الشبكي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">تعتيم الألعاب الغير المثبتة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">إظهار أيقونات الألعاب في قائمة عرض التفاصيل</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">إظهار عدد العناصر في وصف المجموعة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">إظهار الحقول المخصصة فقط في لوحات التصفية والمستكشف\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">تعطيل تسريع الأجهزة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\"> استخدمه عند مواجهة تشنج أو مشاكل في واجهة المستخدم المشابهة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">إظهار الألعاب المخفية في قوائم التشغيل السريع\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">يؤثر على قوائم قائمة الانتقال السريع وقوائم الأدراج.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">عدد عناصر التشغيل السريع\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">استخدم صورة خلفية اللعبة كخلفية للويندوز</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">خلفية ضبابية</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">جودة عالية</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">تعتيم الخلفية</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">الإظهار في العرض الشبكي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">السِمة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">سِمة الملف الشخصي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">سِمة ملء الشاشة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">سِمة الملف الشخصي ملء الشاشة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">موقع قاعدة البيانات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">حالة تسجيل الدخول:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">اعدادات Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">مسح ذاكرة التخزين الموقت على الويب</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">قد يقوم بحل المشاكل التي تمت مواجهتها أثناء ربط الحسابات.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">اظهار أيقونه النظام</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">التصغير إلى جانب شريط المهام</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">تصغير Playnite عند إغلاق نافذة التطبيق\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">عند تشغيل اللعبة:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">عند إغلاق اللعبة:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">قم بتنسيق الوقت الملعوب ليُظهر عدد الأيام الملعوبة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">صيغة التاريخ:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">سيؤذي هذا إلى تسجيل خروجك من جميع الخدمات المرتبطة. يتطلب إعادة تشغيل التطبيق، هل تود المتابعة؟</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">مسح ذاكرة التخزين المؤقت؟</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">مطلوب إعادة تشغيل Playnite لتطبيق السِمة الجديدة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">المزيد من المظاهر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">إنشاء مظهر جديد</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">المزيد من الإضافات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">انشىء إضافة جديدة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">ساعدنا في ترجمة Playnite\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">يحتاج Playnite إلى إعادة التشغيل من أجل تطبيق الإعدادات الجديدة. اعد البدء الان؟\r\n\r\nستؤدي إعادة التشغيل إلى إلغاء أي مهام نشطة (تنزيلات) قيد التقدم حاليًا</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">إعادة تشغيل Playnite؟</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">لا يمكن لـ Playnite نقل ملفات مكتبتك تلقائيًا. يجب عليك نقل / نسخ الملفات يدويًا قبل تغيير الموقع. إذا لم تكن هناك مكتبة في الموقع المستهدف ، فسيتم إنشاء مكتبة جديدة.\r\n\r\nلن يتم استخدام موقع قاعدة البيانات الجديد حتى يتم إعادة تشغيل Playnite. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">لن يتم تسجيل وقت اللعبة إذا تم تعيين إجراء &quot;الإغلاق&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">عدد الصفوف</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">عدد الأعمدة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">عدد صفوف عرض التفاصيل</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">عرض صورة الخلفية في الشاشة الرئيسية</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">لا يتم تطبيقه بأثر رجعي على الألعاب الحالية دون إعادة تحميل بيانات التعريف.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">استيراد وقت لعب الألعاب في المكتبة:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">يحدد متى يجب على Playnite استيراد وقت التشغيل الذي أبلغتْ عنه إضافات المكتبة للألعاب في قاعدة بيانات Playnite. يحتاج الدعم من المكتبة الإضافية المسؤولة عن التعامل مع اللعبة (اللعب) إلى أن تكون قادرة على استخدام هذه الميزة.\r\n\r\nدائما: يستورد وقت التشغيل لألعاب جديدة مستوردة وموجودة في قاعدة بيانات Playnite.\r\nفقط للألعاب المستوردة حديثاً: استيراد وقت اللعب فقط للألعاب المستوردة الجديدة.\r\nلا: لا تستورد أبدا وقت اللعب تحت أي ظرف من الظروف.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">دائماً</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">فقط للألعاب المستوردة حديثا</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">ابداً</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">تمكين دعم وحدة التحكم في وضع سطح المكتب\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">يفتح زر الدليل وضع ملء الشاشة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">إعدادات تنزيل بيانات التعريف التلقائية للألعاب التي تم استيرادها حديثًا.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">عرض الهدف</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">استخدم الشاشة الاساسية دائماً</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">إظهار عناوين الألعاب</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">اظهار حالة البطارية</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">إظهار النسبة المئوية للبطارية</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">إظهار الساعة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">إخفاء مؤشر الفأرة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">مثبتة فقط في الفلاتر السريعة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">زر الدفع</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">الواجهة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">التمرير الأفقي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">حدد أحد الأقسام الفرعية</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">لا توجد إعدادات متاحة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">فشل تحميل الإعدادات\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">يتم تنفيذ هذه السكريبتات لكل لعبة في المكتبة، يمكن تعيين السكريبتات الفردية لكل لعبة على حدة  أثناء تعديل تفاصيل اللعبة.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">تنقل صورة الخلفية بشكل متحرك</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">حجم الخط</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">تلقائي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">ذو ظلال</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">رمادي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">نوع واضح</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">مثالي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">العرض</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">وصع تنسيق النص</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">وضع عرض النص</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">لا يتم استخدام أساليب عرض النص وتنسيقه حاليًا لوصف اللعبة.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">تحميل سابق لصور الخلفية\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">إذا تم تفعيله، سيقوم Playnite بتحميل خلفية العمل الفني أثناء تحميل بيانات التعريف، وهذا باستحدام مساحة أكبر من القرص وإتاحة العمل الفني عندما تكون غير متصل بالأنترنيت.\r\n\r\nفي حالة عدم التفعيل، لا يتم تحميل خلفية العمل الفني إلا عند الحاجة لتحميله، وباستخدام مساحة أقل، لكن قد يؤذي إلى تأخيرٍ قبل عرض العمل الفني وبعض الصور قد لا تكون متاحة عندما تكون غير متصل بالأنترنيت.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">غلق عميل الطرف الثالث تلقائيًا بعد الخروج من اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">تأخير إيقاف تشغيل العميل (بالثواني)\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">لا تغلق بعد جلسات اللعب التي تكون أقصر من (بالثواني)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">إغلاق العملاء التاليين تلقائيًا:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">غلق العملاء تلقائيًا</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">استيراد قائمة استبعاد\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">عرض تحذير عند تعيين وسائط ألعاب كبيرة جدًا</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">أمر فتح الدليل\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">التصنيف العمري</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">تحديث حجم الألعاب على تحديث المكتبة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">القيام بمسح وتحديث حجم الألعاب المثبتة إذا تم الاكتشاف أن ملفاتهم قد تم تعديلها منذ آخر فحص</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">لا شيء</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">ملء</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">متحد</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">متحد لملء</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">اليسار</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">اليمين</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">الأعلى</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">الأسفل</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">خطأ في الاستيراد</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">يتطلب المصادقة</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">فشلت المصادقة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">وضع عرض الويب البديل</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">تستخدم عند مواجة مشاكل مع عرض الويب,على سبيل المثال المصادقة على دمج الحوارات.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">تحميل جزئي لوصف الألعاب الكبيرة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">الوصف الكبير يمكن أن يسبب تباطؤا ملحوظا عند اختيار الألعاب.\r\n\r\nعند التمكين، سيتم تحميل جزء فقط من نص الوصف في البداية مع خيار تحميل الباقي عند الطلب.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">استيراد بيانات التعريف</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">تحميل بيانات التعريف</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">تعيين التكوين المحدد لاستخدامه في أي تحميلات للبيانات التعريف في المستقبل.\r\nيمكن كذلك تغييره في إعدادات التطبيق.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">استيراد محاكاة المعالج</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">هذا المعالج سيرشدك خلال عملية تنزيل واستيراد الألعاب التي تمت محاكتها</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">ضع في عين الاعنبار أنه يمكنك دائمًا إضافة محاكيات/ أو ألعاب إضافية لاحقًا عبر القائمة الرئيسية (ضمن قائمة &quot;المكتبة&quot; لإعدادات المحاكي وقائمة &quot;إضافة الألعاب&quot; لألعاب المحاكاة).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">يوجد أدناه قائمة بالمحاكيات التي يمكن لـ Playnite التعرف عليها وتكوينها تلقائيًا. يمكنك تنزيل أدوات التثبيت من مواقع الويب الخاصة بهم. بمجرد تثبيت المحاكيات ، انتقل إلى الشاشة التالية لاستيرادها إلى Playnite.يمكنك أيضًا تكوين واستيراد أي محاكي مخصص من قائمة التكوين لاحقًا.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">يمكنك استيراد أي برامج محاكاة مثبتة على جهاز الكمبيوتر الخاص بك بالنقر فوق الزر &quot;الكشف التلقائي من المجلد ...&quot;. سيبحث Playnite في المجلد المحدد عن أي محاكيات معروفة ويوفر خيار استيرادها. يمكنك استخدام هذا الزر عدة مرات لاستيراد برامج محاكاة من مجلدات مختلفة. ستتم إضافة المحاكيات إلى أسفل القائمة الحالية.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">يمكنك استيراد الألعاب بالنقر فوق الزر &quot;مسح المجلد باستخدام المحاكي&quot;. سيؤدي تحديد المحاكي المناسب إلى إخبار Playnite بأنواع الملفات التي يجب مسحها ضوئيًا واستيرادها. يمكنك استخدام هذا الزر عدة مرات لاستيراد الألعاب من مجلدات مختلفة. ستتم إضافة الألعاب إلى أسفل القائمة الحالية.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">لم يتم تحديد محاكيات للاستيراد. لن تتمكن من استيراد أي ألعاب تمت محاكاتها تلقائيًا دون تكوين المحاكيات أولًا. هل انت متأكد أنك تريد المتابعة والخروج من عملية الاستيراد؟</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">لا توجد محاكيات تم تكوينها في Playnite. لا يمكنك استيراد الألعاب دون تكوين المحاكي أولاً وتحديد أنواع الملفات المناسبة. هل تريد إضافة بعض المحاكيات الآن؟</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">فحص المجلد باستخدام المحاكي</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">حدد ملفات</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">الكشف تلقائيًا من المجلد…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">تهيئة المحاكيات…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">جاري الفحص…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">يتم المسح {0}</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">تهيئة لأول مرة</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">هذا المعالج سوف يرشدك خلال عملية الاستيراد التلقائي والتكوين لمكتبات الألعاب الخارجية. يمكن لـ Playnite استيراد الألعاب تلقائيًا من خدمات ألعاب متعددة، مثل Steam أو GOG، كما يمكنك أيضًا تحديث مكتبتك عن طريق تحديثها تلقائيًا عند بدء تشغيل التطبيق.\r\n\r\nضع في اعتبارك أنه يمكنك إضافة أي لعبة مخصصة لأي نظام أساسي يدويًا لاحقًا من خلال النقر على زر &quot;Playnite&quot; في القائمة الرئيسية.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">دمج المكتبة</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">استيراد الألعاب تلقائيًا من الخدمات المدرجة أدناه. سيتم تحديث أي تغييرات لاحقة في اللعبة (حالة التثبيت) تلقائيًا عند بدء تشغيل Playnite أو عند تشغيلها يدويًا. ستؤثر الإعدادات المحددة على عمليات الاستيراد الأولية وكل عمليات الاستيراد اللاحقة.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">انتهى التكوين</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">تم الانتهاء من الإعداد الأولي. نذكر أنه يمكنك تغيير جميع الإعدادات لاحقًا في قائمة &quot;الإعدادات&quot;.\r\n\r\nيمكنك كذلك إضافة أي لعبة أخرى لاحقًا بالنقر فوق قائمة شعار Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">فشل عملية تحميل واحدة أو أكثر من الإضافات.\r\nيمكنك إعادة تحميل الإضافات من قائمة الإضافات بعد عملية التثبيت لأول مرة.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">تحميل {0} دمج</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">جارٍ تنزيل قائمة عمليات الدمج الموصى بها ...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">فشل تنزيل قائمة عمليات الدمج الموصى بها. يمكنك محاولة إعادة تنزيل عمليات الدمج لاحقًا عبر قائمة الإضافات.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">تهيئة المنصات والمحاكيات</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">تهيئة المحاكيات</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">المنصات</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">المنصة</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">المحاكيات</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">المحاكي</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">اضافة منصة</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">اختيار أيقونة</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">حدد الغلاف</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">حدد الصورة</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">حدد العنصر</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">حدد الخلفية</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">إختيار ملفّ</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">حدد رابط URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">اضافة محاكي</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">المنصة(ات) المدعومة</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">هل تريد حفظ تغييرات المنصة؟</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">هل تريد حفظ تغييرات المحاكي؟</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">قابل للتنفيذ</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">الوسائط</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">دليل العمل</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">أنواع الملفات المدعومة</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">استيراد المحاكيات…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">تحميل المحاكيات…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">تحميل وسائط مسبقة الإعداد من ملف تعريف المحاكي المعروف</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">هل أنت متأكد أنك تود حذف {0} محاكي؟\r\nحاليًا يتم استخدامه بواسطة {1} لعبة.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">هل أنت متأكد أنك تود حذف {0} منصة؟\r\nحاليًا يتم استخدامها من طرف {1} لعبة و {2} محاكيًا.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">مساعدة في الإعدادات</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">رتب حسب</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">اتجاه الترتيب</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">تجميع حسب</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">تصاعدى</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">تنازلي</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">لا تجميع</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">التجميع حسب المكتبة</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">التجميع حسب الفئة</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">التجميع حسب المنصة</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">إظهار النوع</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">العرض</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">لوحة الاستطلاع</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">لوحة التصفية</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">أيقونة</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">أيقونة المكتبة</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">صورة الغلاف</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">صورة الخلفية</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">ترتيب حسب اسم</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">مكتبة</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">يدوي</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">الاسم</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">تثبيت محرك الأقراص</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">إسم الحساب</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">المنصة</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">الفئة</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">النوع</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">تاريخ النشر</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">سنة النشر</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">المبرمج</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">وسم</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">الناشر</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">حالة التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">مطابقة كافة عوامل التصفية</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">اذا تم تفعيله, فقط الألعاب التي تستخدم كل العناصر في كل التصفيات سوف تكون في العرض.\r\nاذا تم إيقافه, الألعاب التي تستخدم أي عنصر من أي تصفية سوف تكون في العرض.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">مثبت</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">مثبت</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">غير مثبت</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">مخفي</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">المفضلة</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">تمكين دعم HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">إذا تم تفعيله، سيتم تمكين HDR على شاشتك الرئيسية قبل بدء اللعبة.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">HDR غير مدعومة على شاشتك الرئيسية.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">اخر تشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">الفئة</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">الوصف</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">دليل التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">صورة الغلاف</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">الروابط</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">مسار صورة، ROM أو ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">النوع</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">الأنواع</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">الشركة</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">الشركات</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">المبرمج</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">المطورون</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">الناشر</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">الناشرون</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">الفئة</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">الفئات</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">وسم</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">وسوم</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">خاصية</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">خصائص</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">التقييم العمري</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">التقييم العمري</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">المنطقة</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">المناطق</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">مصدر</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">المصادر</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">آخر نشاط</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">خطأ في قاعدة البيانات</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">فشل في فتح قاعدة بيانات المكتبة.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">لم يتم فتح قاعدة البيانات.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">تعذر الوصول إلى قاعدة بيانات المكتبة. &quot;{0}&quot; ملف يتم استخدامه من طرف عملية اخرى أو أنه في موقع لا يمكن الوصول إليه.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">فشل في إنشاء حزمة التشخيص.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">فشل في رفع حزمة التشخيص تلقائيًا.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">تم إرسال معلومات التشخيص بنجاح.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">تم إنشاء حزمة التشخيص وإرسالها بنجاح.\r\nالرجاء إرفاق المعرف التالي بتقرير المشكلة الخاص بك:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">فشل استيراد الألعاب من {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">فشلت عملية الإستيراد ألعاب المحاكيات {0}</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">تعذر البحث عن الألعاب من خلال ملف تعريف المحاكي. الملف الشخصي لا يحتوي على أي ملحقات أو منصات.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">فشل بدء Playnite. الرجاء إغلاق جميع الحالات الأخرى وحاول مرة أخرى.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">فشلٌ في تطبيق السِمة &quot;{0}&quot;، ملف تعريف الألوان &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">لا يمكن فتح الرابط، عنوان URL غير متناسق بشكل صحيح.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">فشل بدء التطبيق.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">فشل في تهيئة عنصر عرض الويب. Playnite لا يمكنه الاستمرار في عملية بدء التشغيل.\r\n\r\nمزيد من المعلومات على https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">لا يمكن استيراد برامج محاكاة بسبب ملف تعريف مفقود أو تالف.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">فشل تنفيذ إجراء القائمة.\r\n</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">تعديل تفاصيل اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">عنوان URL الصورة</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">إضافة رابط</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">إضافة روم </sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">حفظ التغييرات</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">تطبيق التغيرات على اللعبة/الألعاب قيد التحرير</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">إضافة إجراء</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">حذف إجراء</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">إزالة إجراء التشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">إضافة ألعاب</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">فحص المجلد…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">تم تثبيت الكشف</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">تصفح…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">فتح Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">إعدادات الملف الشخصي</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">اسم اللعبة لا يمكن أن يكون فارغاً.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">لا يمكن أن يكون مسار تتبع أحداث اللعبة فارغاً</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">اسم اللعبة لا يمكن ان يكون فارغاً قبل البحث عن بيانات التعريف.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">بيانات اللعبة غير صالحة</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">أدخل رابط URL صالح يبدأ بhttp:// أو https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">حدد رابط URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">فشل تحميل بيانات التعريف:{0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">خطأ في التحميل</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">تفريغ الفلاتر</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">حساب خاص</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">حساب عام</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">مفتاح API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">خطا في بدء التشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">خطا في المظهر</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">مسح الكل</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">جاري التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">جاري إلغاء التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">جاري التشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">قيد التشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">عنوان URL غير صالح</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">‮لا تفعل شيئا</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">تصغير</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">إعادة الواجهة</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">استعادة النافذة فقط عند تشغيلها من واجهة المستخدم</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">إغلاق</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">تغيير</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">متقدم</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">ابداً</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">حالة الاكمال</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">حالة الإكتمال</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">نقاط المستخدم</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">نقاط النقد</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">نقاط المجتمع</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">البرامج النصية للعبة</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">البرامج النصية للتطبيقات</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">السكريبتات</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">الإضافات</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">مصادر بيانات التعريف</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">الإضافات</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">معرف ID\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">إعادة تحميل السكريبتات</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">التفاعلي SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">تم إعادة تحميل جميع السكريبتات بنجاح.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">لم يتم العثور على ألعاب تتناسب مع معايير البحث/معايير الفلتر</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">لم يتم العثور على العناصر\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">التبديل إلى وضع سطح المكتب</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">إغلاق Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">المكتبات</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">تحديث الكل</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">أنشئ من طرف:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">النسخة:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">التحديثات:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">الوحدة:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">مكتبة</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">الإحصائيات</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">الكل</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">لا شيء</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">التنبيهات</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">العرض</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">الطول</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">الحجم</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">صغير</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">عادي</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">كبير</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">أكبر</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">الأكبر</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">افتراضي</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">تحديد</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">تحديد الكل</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">إلغاء تحديد الكل</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">الأول</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">عشوائي</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">تحديد المستخدم</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">تحميل المزيد</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">شفاف</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">تصغير</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">توسيع</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">تصغير الكل</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">توسيع الكل </sys:String>\r\n    <sys:String x:Key=\"LOCOther\">آخر</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">ثيمات</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">وسائط المحاكي</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">القوانين المدمجة</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">قوانين مخصصة</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">وسائط إضاقية للمحاكي</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">تجاوز وسائط المحاكي</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">إجراء التشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">تحديد بيانات التعريف للاستيراد\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">حدد الألعاب التي تود استيرادها</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">البحث عن بيانات التعريف</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">التحديث متوفر</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">التغييرات منذ التحديث الأخير</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">تحميل و تثبيت التحديثات</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">تحقق من التحديثات</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">خطأ فى التحديث</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">فشل التحقق من الإصدار الجديد.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">لم يتم العثور على إصدار جديد، التطبيق محدّث مسبقًا.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">فشل تحميل التحديث وتثبيته.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">بعض مهام الخلفية قيد التقدم حاليًا. هل تريد إلغاءه ومتابعة التحديث؟</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">بعض مهام الخلفية قيد التقدم حاليًا. هل تريد إلغاءه والخروج من Playnite؟</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">بعض مهام الخلفية قيد التقدم حاليًا. سيؤدي تبديل الأوضاع إلى إلغاء المهمة، هل تريد التبديل على أي حال؟</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">يتوفر تحديث لـ Playnite\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">إعادة تحميل قائمة المظاهر</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">تطبيق المظاهر المحددة</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">شاهد تغييرات الملف</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">تطبيق السمة تلقائيُا عندما يتغير مصدر الملف</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">وقت تشغيل السكريبت</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">تنفيذ برنامج نصي قبل بدء اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">تنفيذ برنامج نصي بعد انهاء اللعبة اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">تنفيذ برنامج نصي بعد بدء تشغيل اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">التنفيذ عند تشغيل التطبيق</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">تنفيذ عند إيقاف تشغيل التطبيق</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">سكريبت بعد بدء اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">سكريبت بدء اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">سكريبت توقف اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">تنفيذ برنامج نصي عام\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">عالمي</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">تصفية</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">الحالية</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">جديد</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">اختبار البرنامج النصي</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">إظهار العناصر المحددة فقط.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">حفظ كإعداد افتراضي</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">إضافة إلي المفضلة</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">إزالة من المفضلة</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">اخفي هذه اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">إزالة من المخفي</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">تمكين دعم HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">تعطيل دعم HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">تعديل…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">حساب حجم التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">حساب حجم التثبيت (جميع الألعاب)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">حساب حجم التثبيت (البيانات المفقودة فقط)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">حجم التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">تعيين الفئة…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">تعيين حالة الإكمال</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">حذف</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">تشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">تثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">إعدادات اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">التفاصيل</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">إلغاء التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">فتح موقع التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">إنشاء اختصار على سطح المكتب</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">فتح الدليل</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">المزيد</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">تتم إدارتها من قبل البرنامج المساعد للمكتبة\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">إدارة عملية بدء اللعبة ستتم من خلال المكون الإضافي للمكتبة المسؤول عن هذه اللعبة.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">لم يتم العثور على معلومات ذات صلة حول اللعبة &quot;{0}&quot; في الصفحة المحددة.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">تلميح: يمكنك استخدام عملية تحميل بيانات التعريف أكثر تقدمًا أثناء تعديل لعبة واحدة عبر خيار القائمة &quot;تعديل&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">غير متاح عندما تكون بعض الإجراءات قيد التنفيذ.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">نص الوصف حساس لبناء HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">يتم تسجيل وقت اللعبة بالثواني.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">حجم التثبيت مشار إليه بوحدة البايت.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">يجب تحديد تاريخ الإصدار بتنسيق &quot;يوم-شهر-عام&quot;. يمكن حذف قيم الشهر واليوم.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">القيم من 0 إلى 100 أو الفارغة بدون درجة.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">الداعمون لمطوري Playnite عبر Patrons و Ko-fi:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">البرمجة، الترجمة والمساهمين الآخرين بدون ترتيب معين:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">إلغاء اللعبة في الشاشة الستهدفة؟</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">مراقبة التثبيت قيد التشغيل حاليًا. هل تريد إلغاء العملية وإعادة اللعبة إلى حالتها السابقة؟\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">مراقبة التثبيت قيد التشغيل حاليًا. هل تريد إلغاء العملية وإعادة اللعبة إلى حالتها السابقة؟\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">وقت اللعب</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">اخر تشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}ي {1}س {2}د</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0} ساعات {1} دقائق</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} دقائق</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} ثواني</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">لم تلعب بعد</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">جاري فتح وضع سطح المكتب…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">فتح في وضع ملء الشاشة…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">جاري تحميل مكتبة الألعاب…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">حساب حجم التثبيت…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">حساب حجم التثبيت لـ {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">فشل تثبيت ملف السكريبت.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">تم تثبيت السكريبت بنجاح.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">تثبيت السكريبت</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">خطأ في السكريبت</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">فشل في تنقيذ وظيفة الملحق.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">فتح مجلد بيانات التعريف</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">احسب</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">حساب حجم التثبيت تلقائياً باستخدام ROMs إذا كانت اللعبة تحتوي عليه أو وجهه تثبيت تم تعيينها</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} عميل غير مثبت.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} عميل سيتفح الآن.المرجو تسجيل الخروج ثم إغلاق هذه الرسالة.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">في انتظار تسجيل دخول المستخدم، الرجاء إغلاق هذا عند الانتهاء…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">لم يتم العثور على دليل تثبيت اللعبة.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">تكوين إجراء اللعبة غير صالح.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">استكشاف مشاكل مزامنة الحساب وإصلاحها</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">استكشاف الأخطاء وإصلاحها</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">إعادة تسمية العنصر</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">إضافة عنصر جديد</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">أدخل الاسم</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">أدخل اسمًا جديدًا</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">أقل من ساعة</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">من ساعة إلى 10 ساعات</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">من 10 ساعات إلى 100 ساعة</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">من 100 ساعة إلى 500 ساعة</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">من 500 ساعة إلى 1000 ساعة</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">اكثر من 1000</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">يجب إعادة تشغيل Playnite لإكمال التثبيت. هل تريد إعادة التشغيل الآن؟\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">لم يتم حزم الامتداد/ الملحق بشكل صحيح.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">لم يتم حزم الامتداد/ الملحق بشكل صحيح.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">فشل تحميل الإضافة &quot;{0}&quot; بشكل صحيح\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">لا يمكن تحميل إضافة &quot;{0}&quot; ، إصدار Playnite الحالي غير مدعوم.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">فشل تحميل المظهر &quot;{0}&quot; بشكل صحيح.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">لا يمكن تحميل مظهر &quot;{0}&quot;، إصدار Playnite الحالي غير مدعوم.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">فشل تحميل الملحق بشكل صحيح.\r\n</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">فشل تحميل المظهر</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">تستخدم السِمة/الملحق إصدار API غير مدعوم.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">تم التثبيت بنجاح.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">تثبيت ملحق؟</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">عام</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">فشل في تثبيت &quot;{0}&quot; إضافة.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">فشل تثبيت الملحق.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">هل تريد تثبيت ملحق جديد؟\r\n{0} \r\nبواسطة{1}\r\nالإصدار{2}\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">هل تريد تحديث الملحق/الامتداد &quot;{0}&quot;؟\r\nالنسخة الحالية: {1}\r\nنسخة الجديدة: {2}\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">فشل تثبيت السمة.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">هل تريد تثبيت مظهر جديد؟\r\n{0}\r\nبواسطة {1}\r\nالاصدار {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">هل تريد تحديث المظهر &quot;{0}&quot;؟\r\n\r\nالإصدار الحالي: {1}\r\nنسخة جديدة: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">أنت على وشك مغادرة Playnite والانتقال إلى صفحة الويب التالية باستخدام متصفح الويب الافتراضي الخاص بك. هل تريد الاستمرار؟\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">قد تكون الصورة (الصور) المحددة كبيرة جدًا للحصول على الأداء الأمثل. يمكن أن يؤدي استخدام الصور الكبيرة جدًا إلى استجابة أسوأ لواجهة المستخدم وزيادة استخدام الذاكرة.\r\n\r\nالدقة القصوى الموصى بها:\r\nالرموز: {0} ميغا بكسل\r\nالأغلفة: {1} ميغا بكسل\r\nالخلفيات: {2} ميغا بكسل</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">تحذير بخصوص الأداء</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">لا تُظهر مجدّدًا</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">الملف بالملحق {0} غير متوافق.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">امتداد الملف غير متوافق</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">ملف الصورة المحدد قد يكون كبيرًا جدًا للحصول على الأداء الأمثل.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">هل أنت متأكد أنك تريد إلغاء تثبيت المظهر المحدد؟ سيتم وضع إلغاء التثبيت في قائمة الانتظار لبدء التطبيق التالي.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">لا يمكن إلغاء تثبيت السمات المضمنة.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">المظهر لا يدعم هذا الإصدار من Playnite.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">هل أنت متأكد من أنك تريد إلغاء تثبيت الملحق المحدد؟ سيتم وضع إلغاء التثبيت في قائمة الانتظار لبدء التطبيق التالي.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">لا يمكن إلغاء تثبيت الملحقات المضمنة.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">لا يدعم هذا الامتداد هذا الإصدار من Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">دليل التثبيت\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">دليل البيانات</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">جارٍ إنشاء حزمة التشخيص…\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">يتم الآن تحميل حزمة التشخيص…\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">استيراد ملف…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">ما هذا؟</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">هل أنت متأكد من فعل هذا؟</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">مجموع وقت اللعب</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">متوسط ​​وقت اللعب\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">أفضل وقت للعب\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">إجمالي حجم التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">نظرة عامّة</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">الشريط الجانبي</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">عرض على الشريط الجانبي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">إعادة ضبط الإعدادات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">ستتم إعادة تعيين جميع إعدادات التطبيق إلى القيم الافتراضية، باستثناء:\r\n- موقع قاعدة البيانات\r\n- قائمة استثناءات الاستيراد\r\n- إعدادات الإضافات، بما في ذلك تكامل المكتبة\r\n    \r\nإعادة تشغيل التطبيق مطلوب لإنهاء العملية. هل تريد إعادة ضبط الإعدادات؟</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">للمبرمجين</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">إضافات الخارجية</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">إدخال مسار المجلد الكامل.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">الإنجازات</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">المنتدى</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">الأخبار</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">صفحة المتجر</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">لم يكتمل الإعداد الأولي. سيتم الآن إعادة تشغيل Playnite إلى وضع سطح المكتب لإنهاء الإجراء.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">لعب مؤخرا</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">المفضلة</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">الأكثر تشغيلاً</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">الكل</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">الفلاتر المطبقة.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">هناك عوامل تصفية إضافية مطبقة.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">نتائج البحث عن:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">عنصر بالاسم ذاته موجود بالفعل.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">تقييد التحديد للفلتر الحالي</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">اختر واحدًا آخر</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">الإضافات...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">مثبت</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">إعدادات الإضافات</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">تصفح</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">تحديثات</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">التحديثات ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">تم نقل إدارة الإضافات والسمات المثبتة، بما في ذلك إعداداتها، إلى قائمة &quot;الإضافات&quot; الجديدة.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">يمكن هنا تكوين جميع إضافات تكامل المكتبة المثبتة حاليًا.\r\n\r\nإذا كنت تريد تثبيت عمليات تكامل إضافية أو إلغاء تثبيتها ، فاستخدم خيار &quot;الإضافات&quot; من القائمة الرئيسية.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">ثيمات لوضع Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">ثيمات لوضع Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">جار البحث…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">الإضافة غير متوافقة مع هذا الإصدار من Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">فشل تنزيل حزمة تثبيت الإضافة.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">فشل تنزيل بيان تثبيت الإضافة.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">يتطلب التطبيق إعادة التشغيل لتطبيق التغييرات المعلقة.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">تمت جدولة هذه الإضافة للتثبيت.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">تثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">إزالة الإضافة</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">مثبتة</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">لا توجد تحديثات جديدة</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">تحديث الإضافة</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">سجل التغيير غير متوفر</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">مجدول للتثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">فشل التحميل</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">رخصة مرفوضة</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">جارٍ التنزيل {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">جارٍ البحث عن تحديثات...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">يتوفر تحديث أو أكثر للإضافات.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">حدد الإضافات لتحديثها</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">جزء التطوير للإضافة</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">اتفاقية ترخيص {0}</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">موافقة</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">رفض</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">تضمين إجراءات بدء اللعبة للمنصات</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">اختر الإجراء</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">طريقة التتبع</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">مسار التتبع</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">تأخير التتبع الأولي</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">التتبع بانتظام</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">رابط</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">ملف</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">محاكي</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">سكريبت</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">افتراضي</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">الاجراء</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">مجلد</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">العملية الأصلية</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">رسائل سجل التتبع</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">التغييرات التالية ستستبدل بيانات جميع الألعاب المختارة حاليًا!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">بدون</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">رسمي</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">العناصر فقط</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">في البداية والنهاية فقط</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">حساسية التمرير</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">تمرير سلس</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">سرعة الحركة</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">إزالة العنصر؟</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">هل أنت متأكد من أنك تريد إزالة هذا العنصر؟</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">إظهار الأزرار في اللوحة العلوية:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">إعدادات العرض العامة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">إعدادات التجميع</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">إعدادات الترتيب</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">تصفية الإعدادات المسبقة</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">موضع أزرار الإضافات</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">عرض فاصل القسم</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">نقل زر القائمة الرئيسية إلى اللوحة الجانبية</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">لوحة الاستطلاع</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">اختيار لعبة عشوائية</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">مشاهدة لعبة مختارة عشوائياً</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">حدد لعبة عشوائية من العرض</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">حفظ إعدادات التجميع والفرز</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">إظهار كمرشح سريع في وضع Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\"> في ال 7 أيام الأخيرة</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">في آخر 31 يومًا</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">في آخر 365 يومًا</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">منذ أكثر من 365 يومًا</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">تهيئة</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">حفظ الإعداد</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">تصغير بعد بدء اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">تصغير Playnite بعد بدء اللعبة.\r\n\r\nيمكن أن يؤدي تعطيل هذا إلى حدوث مشكلات في الألعاب لا تركز على الإدخال عند بدء التشغيل!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">حجم الخط</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">حجم الخط الصغير</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">دعم وحدة التحكم باللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">إذا تم تعطيله، فلن يقبل Playnite أي مدخلات لواجهة XInput.\r\n        \r\nعطله إذا كنت تستخدم الأدوات التي تترجم مدخلات XInput إلى مدخلات الماوس/لوحات المفاتيح وتحصل على إدخالات مزدوجة في Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">إظهار العناصر في القائمة الرئيسية:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">مقلوب X / A زر العرض الرئيسي ملزم</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">تبديل روابط الأزرار لبدء اللعبة وإظهار صفحة تفاصيل اللعبة في العرض الرئيسي.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">ربط زر تبديل تأكيد/إلغاء</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">يعكس ارتباطات زر A/B للتأكيد والإلغاء.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">وحدة التحكم الرئيسية فقط</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">قبول المدخلات من وحدة التحكم الرئيسية فقط عند التمكين.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">زر الدليل يركز على Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">مستوى صوت الواجهة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">مستوى صوت الخلفية</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">كتم الصوت عندما يكون playnite في الخلفية</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">فشل تهيئة واجهة الصوت.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API الخارج</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API المستخدمة لإخراج الصوت. قم بتغييره إذا كنت تواجه مشكلات في الصوت.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">عام</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">مرئيات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">الصوت</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">الواجهة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">القوائم</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">الإدخال</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} جارٍ البدء…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} قيد التشغيل…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">حرف كبير</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">مسافة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">مستوى &quot;render&quot; الصورة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">بديل</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">متوازنة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">الجودة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">جودة:\r\nأفضل جودة صورة مع استخدام أبطأ و عالي للذاكرة.\r\n    \r\nمتوازن:\r\nنوعية جيدة وسريعة مع استخدام ذاكرة منخفض.\r\n    \r\nبديل:\r\nجودة أفضل وسرعة متوسطة مع استخدام ذاكرة منخفض.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">تحديد الملف...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">تحديد المجلد</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">البرنامج النصي لبدء التشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">يرجى ملاحظة أن كلاً من الإضافات والسمات يمكن أن تؤثر بشكل كبير على أداء Playnite، واستقراره وأمانه.\r\n    \r\nإذا بدأت في مواجهة بعض المشكلات بعد تثبيت سمة أو إضافة، فحاول تعطيلها/إلغاء تثبيتها أولاً لمعرفة ما إذا كانت أصل المشكلة.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">اختر عند بدء التشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">اختر عند بدء التشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">التشكيلات الجانبية المدمجة</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">التشكيل الجانبي المدمج</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">التشكيلات المخصصة</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">إعداد مخصص</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">تم التعامل معها بواسطة برنامج نصي مدمج</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">مواصفات المحاكي</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">مواصفات المنصة</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">مواصفات المنطقة</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">تنفيذ برنامج نصي قبل بدء المحاكي</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">للتنفيذ بعد بدء تشغيل المحاكي</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">للتنفيذ بعد الخروج من المحاكي</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">برنامج المحاكي غير موجود.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">مواصفات المحاكي غير موجودة.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">البرنامج النصي لبدء المحاكي غير موجود.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">تقسيمها إلى ألعاب منفصلة</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">دمج في لعبة واحدة</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">ضبط المنصة</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">تعيين المنطقة</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">فحص المجلد</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">إعدادات المسح</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">استبعاد الأنماط من فحص المجموع الاختباري</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">لن يتم فحص الملفات التي تطابق النمط (الأنماط) المحدد بحثًا عن المجموع الاختباري وستتم مطابقتها باسم الملف. انظر صفحة تعليمات المحاكي لمزيد من المعلومات.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">مسح باستخدام المحاكي</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">يجب تعيين الاسم عند حفظ تكوين الجديد.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"> لم يتم تعيين المحاكي أو ملف تعريفه.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">لم يتم تحديد المجلد المطلوب مسحه أو أنه غير موجود.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">لم يتم ضبط إعداد المسح بشكل صحيح.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">تضمين بالمسح التلقائي للمسح الشامل</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">فشل فحص المجلد بحثًا عن برامج محاكاة.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">فشل فحص المجلد (المجلدات) بحثًا عن ألعاب تمت محاكاتها.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">إخفاء المستوردة</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">الملفات الشخصية المراد استيرادها:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">إعدادات المسح التلقائي</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">حفظ كإعداد المسح التلقائي</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">يحفظ الإعدادات لاستخدامها لاحقًا أثناء تحديث المكتبة. يمكن إدارة الإعدادات المحفوظة عبر قائمة &quot;إعداد المحاكيات&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">استيراد باستخدام المسارات النسبية</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">إذا كان ممكنا استيراد ملفات اللعبة باستخدام المسارات ذات الصلة بمجلد تثبيت Playnite أو مجلد تثبيت المحاكي.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">فحص المجلدات الفرعية</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">فحص داخل الأرشيف</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">دمج الملفات ذات الصلة</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">دمج ملفات اللعبة ذات الصلة، مثل أقراص اللعبة الفردية، تحت لعبة واحدة.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">إضافة ماسح</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">إضافة ماسح موجود</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">بدء الماسح</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">أضف إعدادات المسح باستخدام المحاكيات لفحص مجلدات معينة. تأكد من تكوين المحاكيات بشكل صحيح قبل استيراد الألعاب (عبر المكتبة -&gt; قائمة إعدادات المحاكيات).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">الحالة الافتراضية المعينة للألعاب المضافة حديثًا</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">الحالة المخصصة للألعاب التي تم لعبها لأول مرة</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">فشل تهيئة وقت تشغيل البرنامج النصي PowerShell. إذا كنت من مستخدمي Windows 7 ، فحاول (إعادة) تثبيت PowerShell 5.1 لإصلاح المشكلة.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">الإعداد المسبق للمرشح بالاسم المحدد موجود بالفعل. هل تريد تحديث الإعداد المسبق بالإعدادات الجديدة؟</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">سيتم إزالة هذه الكلمات من بداية ملء قيمة اسم الفرز تلقائياً:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">استخدم هذا لتجاهل الكلمات في بداية سلسلة لأغراض الفرز. الافتراضي هو &quot;The&quot; و &quot;An&quot; و &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">املأ اسم فرز الألعاب بدون اسم فرز</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">الفرز</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">ملء قيم اسم الفرز…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">تم اكتشاف خدمة Nahimic للعمل على نظامك. من المعروف أن هذه الخدمة تسبب مشكلات في العرض على Playnite (والتطبيقات الأخرى).\r\n\r\nإذا واجهت أي تلف في الرسومات أو مشكلات أخرى في العرض في Playnite ، فإننا نوصي بتعطيل خدمة Nahimic أو إلغاء تثبيتها تمامًا.\r\n\r\nمزيد من المعلومات على https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">يتم تشغيل Playnite بامتيازات عالية (كمسؤول). لا يوصى بهذا لأنه يمنح امتيازات عالية لجميع الإضافات المثبتة وجميع الألعاب / التطبيقات التي بدأت من Playnite!\r\n\r\nمزيد من المعلومات على https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">إظهار تحذير إذا كان Playnite يعمل بامتيازات مرتفعة</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">احصل على الحجم الحقيقي على القرص عند حساب حجم الألعاب</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">في حالة التمكين، ستكون عمليات المسح أبطأ وستحصل على الحجم الحقيقي الذي تستخدمه الملفات في محرك الأقراص.\r\nفي حالة التعطيل، ستكون عمليات المسح أسرع وسوف تستخدم حجم الملفات نفسها.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">تم الإبلاغ عن الإضافات التالية باعتبارها إشكالية محتملة، إما بسبب تأثير الاستقرار/الأداء العالي أو مشكلات الأمان. نوصي بشدة بإلغاء تثبيتها:\r\n        \r\n{0}\r\n  </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">استبعاد الملفات عبر الإنترنت من الفحص</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">لن يتم فحص الملفات المخزنة على التخزين السحابي واستيرادها إذا لم تكن متوفرة محليًا.\r\nمدعوم فقط لـ: Google Drive و DropBox و OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">مسح ولكن باستخدام طريقة مبسطة بدون محتوى الملف</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">سيتم استيراد الملفات ولكن باستخدام طريقة أقل دقة لا تتطلب تنزيل محتوى الملف وتقديمه محليًا.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">تطبيق على الكل</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">تجاوز حالة التثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">عند الضبط، سيقوم Playnite بتجاهل حالة التثبيت (بما في ذلك دليل التثبيت) المحددة بواسطة البرنامج المساعد للتكامل الذي يستورد هذه اللعبة.\r\n        \r\nقد لا يعمل هذا الخيار بشكل كامل مع الإضافات التي تستخدم طريقة استيراد لعبة محددة إلا إذا أخذوا أيضًا خيار التجاوز هذا في الاعتبار.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">يدوياً فقط</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">مرة في اليوم</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">مرة في الأسبوع</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">عند كل بدء تشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">تحقق من تحديثات البرنامج</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">تحقق من تحديثات الإضافات</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">تحديث المكتبات</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">مسح مجلدات المحاكاة</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">تضمين الألعاب المخفية</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">تعديل الحقول</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">حدد / إلغاء تحديد الكل</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">فتح</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">تفعيل</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">تعيين</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">ابدأ الكتابة للبحث عن الألعاب… [F1] للحصول على المساعدة</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">البدء ب# يجلب قائمة من الأوامر المتاحة.\r\nالبدء ب/ جلب قائمة مزودي البحث المتاحين/الإضافات.\r\nكتابة الكلمة المفتاحية للبحث وتنتهي بمفاتيح SPACE على الفور إلى ذلك البحث.\r\n\r\nTAB: تبديل الإجراء\r\nENTER: تنشيط الإجراء المحدد\r\nSHIFT-ENTER: فتح قائمة العناصر</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">تضمين ألعاب الغير مثبتة</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">تضمين الألعاب المخفية</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">الالعاب الغير مثبتة متضمنة</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">الألعاب غير المثبتة مستبعدة</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">الالعاب المخفية متضمنة</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">الألعاب المخفية مستبعدة</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">تشغيل أو تثبيت</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">انتقل إلى التفاصيل</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">قائمة اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">تعديل اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">فتح البحث</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">صندوق البحث</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">زر البحث</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">إجراء اللعبة الأساسي</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">إجراء اللعبة الثانوي</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F يفتح البحث العالمي بدلا من التركيز على مربع البحث</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">حفظ إعدادات فلتر اللعبة بين جلسات البحث</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">موفري البحث</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">الكلمات الأساسية الافتراضية</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">كلمة مفتاحية مخصصة</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">اختصار واسع النطاق للنظام</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">بحث Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">إعدادات الملحقات</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">الاستبعادات</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">الملفات المستبعدة ذات الصلة بمجلد الفحص</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">المجلدات المستبعدة المتعلقة بمجلد الفحص</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">إضافة الملف إلى قائمة الاستبعاد</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">إضافة المجلد إلى قائمة الاستبعاد</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">الاستبعادات يمكن إضافتها فقط إلى إعدادات الماسح الضوئي المحفوظة.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">تم إضافة الاستثناءات إلى &quot;{0}&quot; ماسح ضوئي.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">تجاوز المنصة</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">عند تعيين الماسح الضوئي سيقوم بتعيين هذه المنصة لجميع الألعاب، و الكتابة فوق أي منصات مكتشفة تلقائيا.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">تضمين الأوامر في البحث الافتراضي</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">عند التعطيل، لن يتم تضمين الأوامر في البحث الافتراضي حتى يتم استخدام البادئة # .</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">استخدم المطابقة الضبابية في فلتر الاسم</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">عند التمكين، ستُطابق عملية تصفية الأسماء أسماء الألعاب بنفس طريقة البحث العام. يمكن فرض تطابق دقيق في حالات فردية عن طريق إضافة علامة التعجب ! قبل عملية التصفية.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">الحقول التي سيتم عرضها لنتائج اللعبة:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">الحالة المخفية</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">تم إلغاء النسخ الاحتياطي للبيانات.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">فشل النسخ الاحتياطي للبيانات.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">خطأ في النسخ الاحتياطي للبيانات</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">جارٍ النسخ الاحتياطي للبيانات…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">جاري استعادة البيانات من النسخ الاحتياطي…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">فشل في استعادة البيانات من النسخة الاحتياطية.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">الإعدادات</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">مكتبة الالعاب</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">وسائط مكتبة الالعاب</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">الملحقات المثبتة</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">بيانات الملحقات</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">الثيمات المثبتة</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">حدد البيانات المراد استعادتها من ملف النسخ الاحتياطي المحدد.\r\n    \r\nسيتم إعادة التشغيل تلقائيًا لبدء عملية استعادة النسخ الاحتياطي.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">حدد العناصر التي سيتم إدراجها مع النسخ الاحتياطي للبيانات. يتم تضمين إعدادات التطبيق وبيانات مكتبة اللعبة بشكل افتراضي.\r\n    \r\nسيقوم Playnite بإعادة التشغيل تلقائياً لبدء عملية النسخ الاحتياطي.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">النسخ الاحتياطي التلقائي للبيانات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">تردد النسخ الاحتياطي التلقائي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">مجلد النسخ الاحتياطي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">النسخ الاحتياطية المتكررة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">إدراج بيانات إضافية:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">يجب تعيين مجلد النسخ الاحتياطي إذا تم تمكين النسخ الاحتياطي التلقائي.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">إظهار الإشعارات لإصدارات التصحيح فقط</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">عند التمكين، فقط التحديثات المتاحة للإصدارات الرئيسية المثبتة حاليا ستؤدي إلى تحديث الإشعار.\r\nلن تسفر الإصدارات الرئيسية الجديدة عن تحديث الإشعار.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">استخدام التواريخ النسبية للأسبوع الماضي</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">استخدام التواريخ النسبية في تنسيق &quot;اليوم&quot;، &quot;الأمس&quot;، إلخ. إذا كان التاريخ أقل من أسبوع.\r\n    \r\nسيتم استخدام تنسيق التاريخ المحدد لجميع التواريخ الأخرى.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">البحث عن صورة ويب</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">سلسلة البحث عن الأيقونة</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">سلسلة البحث عن صورة الغلاف</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">سلسلة البحث عن صورة الخلفية</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">الحصول على معلومات الإضافة…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">لا يوجد مصدر لبيانات التعريف</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">إعدادات سلوك التشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">إعدادات إستخدام الماسح</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">تحديد ملف شخصي عند بدء التشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">تحديد محاكي عند بدء التشغيل</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">تلقائي</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">مفعل دائماً</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">معطل دائماً</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">إمكانية الوصول (قارئ الشاشة) الدعم</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">قائمة التطبيق</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">قائمة اللعبة</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">مجلد البرنامج</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">مجلد بيانات المستخدم</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">تم اكتشاف تلف في ملفات المكتبة، سيتم إيقاف تشغيل Playnite الآن.\r\n    \r\nافتح مشكلة جديدة على صفحة GitHub الخاصة بـ Playniite مع طلب لإصلاح التلف في ملفاتك.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">هل تريد حفظ التغييرات التي أجريتها؟</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">التثبيت المحمول</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">لم يتم العثور على أي وحدة تحكم</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/bg_BG.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Български</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Език на Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Изход</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Филтърът е активен</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Филтърът е деактивиран</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Допълнителни филтри</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Филтри</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Филтър</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Невалидни данни</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Да се запазят ли промените?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Начална страница на www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Изходен код в GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Създаване на диаг. пакет</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Изпращане на диаг. информация</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Относно Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Създадено от Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Присвояване на категория</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Задаване на категории</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Добавяне на категория</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Отметнато - Присвояване на категория\r\nБез отметка - Премахване на категорията\r\nНеопределено - Без промени (при редактиране на няколко игри)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Няма категория</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Няма платформа</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ами сега! Нещо се обърка...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Възникна непоправима грешка.\r\n\r\nАко искате да ни помогнете да коригираме този проблем, моля, опишете накратко действията, предприети преди срива, и след това изпратете диагностична информация. Ако сте онлайн, пакетът ще бъде качен на сървъра на Playnite за анализ.\r\n\r\nКато алтернатива можете да щракнете върху бутона „Докладване за срив“, за да създадете нов проблем с GitHub и да докладвате ръчно за срива.\r\n\r\nБлагодаря ви за помощта.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Разширение &quot;{0}&quot; предизвика непоправима грешка.\r\n\r\nПрепоръчваме да запазите регистрационния файл и да докладвате за проблема на разработчика на разширението. Ако проблемът продължава да се появява, деактивирайте разширението.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Разширение &quot;{0}&quot; предизвика непоправима грешка.\r\n\r\nПрепоръчваме да докладвате за проблема на разработчика на разширението. Ако проблемът продължава да се появява, деактивирайте разширението.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Неизвестно разширение или тема причиниха непоправима грешка.\r\n\r\nПрепоръчваме да деактивирате добавките на трети страни, да изолирате проблемната и да докладвате за проблема на разработчика на добавката.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Възникна непоправима грешка.\r\n\r\nАко искате да ни помогнете да разрешим този проблем, моля, изпратете диагностична информация. Благодаря ви.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Деактивиране на разширението</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Запазване на регистрационния файл</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Изпращане на диаг. информация</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Докладване за срив</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Рестартирайте Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Рестартиране в безопасен режим</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Деактивиране на всички разширения на трети страни и използване на тема по подразбиране.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Излезте от Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Действия, предприети преди срива (на английски):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Мениджър на библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Да се премахне ли игра(и)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Не може да се премахне - Играта или инсталаторът работят. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Не може да се деинсталира - играта работи.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Наистина ли искате да премахнете {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Сигурни ли сте, че искате да премахнете {0} игри?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Сигурни ли сте, че искате да премахнете {0}?\r\n\r\nИзбирането на опцията &quot;добавяне към списък с изключения&quot; ще попречи на игрите да бъдат импортирани отново следващия път, когато библиотеката се актуализира.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Сигурни ли сте, че искате да премахнете {0} игри?\r\n\r\nИзбирането на &quot;добавяне към списък с изключения&quot; опция ще попречи на игрите да бъдат импортирани отново следващия път, когато библиотеката се актуализира.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Сигурни ли сте, че искате да премахнете {0} записа, които в момента не се използват?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Няма намерени неизползвани полета.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Да (добавяне към списъка с изключения)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">В този раздел има незапазени промени</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Актуализиране на формата на библиотеката с игри...</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Неуспешна актуализация на базата данни.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Не може да се актуализира библиотеката с игри. Изискват се {0} MB свободно пространство.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">GameError</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Не може да стартира играта. „{0}“ не беше намерено в базата данни.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Не може да стартира играта: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Не може да започне действие: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Не може да се отвори местоположението на играта: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Не може да се открие размерът на инсталираната игра: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Грешка при сканиране на размера на инсталацията</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Имаше {0} грешки по време на сканирането на инсталационния размер</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Неуспешно създаване на пряк път: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Неуспешно отваряне на ръководството: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Не може да се инсталира играта: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Не може да се деинсталира играта: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Няма намерени валидни действия при стартиране на играта. Когато използвате действия на емулатора, уверете се, че дефинициите на платформата съвпадат между играта и конфигурацията на емулатора.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Внедряването на инсталацията не е налично.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Приставката за библиотека, отговорна за тази игра, е деактивирана или не е инсталирана.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Официалното изтегляне на метаданни не е налично.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Не е избрана игра.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Неуспешно изпълнение на скрипта на играта.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Неуспешно изпълнение на скрипт на приложение.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Неуспешно изпълнение на глобален скрипт.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Неуспешно изпълнение на скрипта на емулатора.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Неуспешно изпълнение на действие на скрипт за възпроизвеждане.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 или по-нова не е инсталирана.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Не можах да определя как да стартирам играта.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Активирано</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Изключено</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Премахване</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Премахване на неизползваните</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Преименуване</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Копиране</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Добавяне</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Икона по подразбиране</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Изображение на корицата по подразбиране</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Фоново изображение по подразбиране</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Край</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Напред</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Назад</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">ГОТОВО</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">НАЗАД</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">ИЗЧИСТИ</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Изчисти</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Отхвърли</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Отхвърли всички</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Импортирай</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Име</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Автор</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Модул</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Поредица</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Версия</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Последно пускане</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Най-играни</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Брой пускания</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Размер на инсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Папка</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Бележки</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Добавено</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Дата на добавяне</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Модифицирано</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Дата на промяна</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Уебсайт</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Път</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Запази</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Затвори</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Отказ</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Потвърди</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Занули</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Да</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Не</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Добре дошли</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Локален потребител</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Общи</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Медия</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Връзки</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Инсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Действия</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Изтегля се...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Изтегляне на мултимедия...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Зарежда се...</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Тип</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Профил</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Профили</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Премахване</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Изтегляне</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Търсене</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Резолюция:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Всички</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Мащабиране</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Списъчен изглед</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Обложки</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Мрежов изглед</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Изглед с подробности</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Персонализиран</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Специални благодарности</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Лиценз</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Сътрудници</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Излизане от Playnite...</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Днес</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Вчера</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Понеделник</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">вторник</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">сряда</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Четвъртък</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Петък</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Събота</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Неделя</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Миналата седмица</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Миналия месец</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Миналата година</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Преди повече от година</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 до 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB до 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB до 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB до 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB до 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB до 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB до 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB или повече</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Импортирането завърши успешно.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Всички игри</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Идентификационен номер на играта</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Идентификационен номер на база данни</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Предварителни настройки</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Колона</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Колони</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Ред</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Редове</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Не може да се получи икона от действието Play. Няма действие от тип файл.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Изтегляне само на липсващи метаданни</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Активирането на тази опция ще пропусне изтеглянето на метаданни за полетата с данни, които вече съдържат информация.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Избор на игри</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Моля, изберете кои игри да се актуализират с нови метаданни:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Всички игри от базата данни</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Всички филтрирани в момента игри</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Само избрани игри</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Няма избрани полета за метаданни</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Не са избрани полета за метаданни за изтегляне. Моля, изберете поне едно и активирайте поне един доставчик на метаданни за него.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Официален магазин</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Моля, изберете кои полета да се попълват автоматично от Playnite и кои източници да се използват за получаване на данните.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Моля, помислете дали да не щракнете върху логото по-горе и да допринесете за актуализации в базата данни на igdb.com, за да подобрите данните, които Playnite използва.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Изтегляне на метаданни...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Импортиране на инсталирани игри...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Импортиране на {0} игри…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Импортиране на емулирани игри от {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Изтегляне на актуализации на библиотеката...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Сканиране на размера на игрите в библиотеката...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Размер на сканиране на импортирани игри...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Актуализацията на библиотеката завърши</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Освобождаване на ресурси...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Конфигурация</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Настройки…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Платформи и емулатори</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Конфигуриране на емулатори…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Мениджър на библиотека…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Инструменти</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Изтегляне на метаданни…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Софтуерни инструменти…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Конфигуриране на интеграции…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Отваряне на клиент на трета страна</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Клиенти на трети страни</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Актуализиране на библиотеката с игри</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Отмяна на актуализацията на библиотеката</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Актуализиране на емулирани папки</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Добавяне на игра</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Ръчно…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Сканирай автоматично...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Емулирана игра…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Приложение на Microsoft Store…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Относно Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Изпращане на обратна връзка</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Превключване към режим на цял екран</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Връзки</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Помощ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Поддръжка на Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Подкрепи в Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Ръководство за потребителя</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Документация за SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Рестартирайте системата</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Изключване на системата</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Суспендиране на системата</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Система за хибернация</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Заключи Система</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Отпиши Потребител</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Избор на произволна игра</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Полета за игра, които да се показват в панела с подробности:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Разстояние между елементи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Изчертаване на фон на елемент от мрежата</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Ширина на рамката на елемент от мрежата</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Липсващ източник на икона на игра</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Липсващ източник на обложката на играта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Липсващ фонов източник на играта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Вертикално разстояние до подробностите за играта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Позиция на детайлите на мрежовия изглед</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Подробности за позицията на списъка с игри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Изчертаване на разделител между панелите</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Височина на изображението на корицата на играта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Височина на иконата на списъка с игри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Шрифт на приложението</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Моноразмерен шрифт</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Позиция на филтърния панел</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Позиция на панела на Explorer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Изобразяване на обложката</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Целево съотношение на страните</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Следните опции също засягат изобразяването на плочки в режим на цял екран!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Режим на разтягане</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD кутия</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Квадрат</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam банер</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Вертикален капак на Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Изисква рестартиране за прилагане</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Настройки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Общи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Горен панел</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Външен вид</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Подробности за играта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Оформление</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Разширени</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Цял екран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Вход</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Ефективност</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Метаданни</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Актуализиране</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Търсене</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Архивиране</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Архивиране на данни от библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Възстановяване на резервно копие на данни</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Автоматично импортиране на промените в библиотеката</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Невалидно местоположение на файла на базата данни, трябва да се зададе правилен път към файла.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Името на акаунта не може да бъде празно.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Изтегляне на метаданни след импортиране на игри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Стартиране на минимизиран Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Стартирайте Playnite, когато стартирате компютъра си</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Старт затворено в трея</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Неуспешно регистриране на Playnite за стартиране при стартиране на компютъра.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Стартиране в режим на цял екран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Асинхронно зареждане на изображение</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Може да подобри гладкостта на превъртането на списъците с игри в замяна на по-бавно време за зареждане на изображението.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Показване на името на играта, ако липсва обложка</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Показване на имената на игрите в мрежов изглед</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Затъмняване на неинсталирани игри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Показване на иконите на играта в списъка за изглед с подробности</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Показване на броя на елементите в описанията на групи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Показване само на присвоените полета в панелите за филтриране и изследване</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Деактивиране на хардуерното ускорение</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Използвайте, когато изпитвате заекване или подобни проблеми с потребителския интерфейс</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Показване на скрити игри в списъците за бързо стартиране</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Засяга списъка за прескачане и списъците с менюта в областта.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Брой елементи за бързо стартиране</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Използване на фоново изображение на играта като фон на прозорец</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Замъгляване на фон</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Високо качество</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Затъмняване на фона</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Показване в мрежов изглед</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Профил на тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Тема на цял екран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Профил на темата на цял екран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Местоположение на базата данни</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Състояние на влизане:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Настройки на Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Изчистване на уеб кеша</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Може да разреши проблеми, възникнали при свързването на акаунти.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Показване на иконата в системната област</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Минимизиране на Playnite в системната област</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Минимизиране на Playnite в системната област, когато прозорецът на приложението е затворен</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Когато играта започне:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">След затваряне на играта:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Форматирайте изиграното време, за да индикирате броя изиграни дни</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Формати на датите:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Това ще ви излезе от всички свързани услуги. Изисква се рестартиране на приложението, искате ли да продължите?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Изчистване на кеша?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Изисква се рестартиране на Playnite за прилагане на нова тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Вземете още теми</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Създаване на нова тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Вземете още разширения</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Създаване на ново разширение</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Помогнете ни да преведем Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite трябва да се рестартира, за да се приложат нови настройки. Рестартирай сега?\r\n\r\nРестартирането ще отмени всички активни задачи (изтегляния), които се извършват в момента.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Рестартиране на Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite не може да премества файловете на вашата библиотека автоматично. Трябва ръчно да преместите/копирате файловете, преди да промените местоположението. Ако няма библиотека в целевото местоположение, ще бъде създадена нова.\r\n\r\nНовото местоположение на базата данни няма да се използва, докато Playnite не бъде рестартиран. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Времето за игра няма да бъде записано, ако &quot;Затвори&quot; действието е зададено.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Брой редове</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Брой колони</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Брой редове за подробен изглед</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Показване на фоново изображение на главния екран</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Не се прилага ретроспективно за съществуващи игри без повторно изтегляне на метаданни.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Импортиране на време за игра на игри в библиотеката:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Конфигурира кога Playnite трябва да импортира времето за игра, отчетено от плъгините на библиотеката за игри в базата данни на Playnite. Необходима е поддръжка от плъгините на библиотеката, отговарящи за обработката на играта(ите), за да можете да използвате тази функция.\r\n\r\nВинаги: Импортира време за игра за нови импортирани и съществуващи игри в базата данни на Playnite.\r\nСамо за нововнесени игри: Импортира време за игра само за нови импортирани игри.\r\nНикога: Никога не импортира време за игра при никакви обстоятелства.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Винаги</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Само за новоимпортирани игри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Никога</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Активиране на поддръжката на контролера в настолен режим</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Бутонът за ръководство отваря режим на цял екран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Настройки за автоматично изтегляне на метаданни за новоимпортирани игри.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Целеви дисплей</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Винаги използвайте основния дисплей</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Показване на заглавия на игри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Показване на състоянието на батерията</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Показване на процента на батерията</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Показване на часовника</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Скриване на курсора на мишката</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Инсталира се само в бързи филтри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Подканващи бутони</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Оформление</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Хоризонтално превъртане</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Изберете един от подсекциите</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Няма налични настройки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Неуспешно зареждане на настройките</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Тези скриптове се изпълняват за всяка игра в библиотеката. Индивидуални скриптове могат да бъдат присвоени на всяка игра поотделно, докато редактирате подробностите за играта.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Анимиране на преходи на фоново изображение</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Размери на шрифта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Автоматично</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Псевдоним</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Сива скала</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Идеално</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Дисплей</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Режим на форматиране на текст</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Режим на изобразяване на текст</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Методите за изобразяване и форматиране на текст в момента не се използват за описания на игри.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Предварително зареждане на фонови изображения</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Ако е активирано, Playnite ще изтегля фонови произведения на изкуството, докато изтегля метаданни, като използва повече дисково пространство и прави произведения на изкуството достъпни, когато сте офлайн.\r\n\r\nАко е деактивирано, фоновата илюстрация се изтегля само когато е необходима за първи път, използвайки по-малко място, но може да доведе до забавяне, преди да се покаже илюстрацията и някои изображения може да не са налични, когато сте офлайн.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Автоматично затваряне на клиент на трета страна след излизане от играта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Забавяне при изключване на клиента (в секунди)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Не затваряйте след игрови сесии, по-кратки от (в секунди)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Автоматично затваряне на следните клиенти:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Автоматично затваряне на клиенти</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Списък с изключения за импортиране</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Показване на предупреждение при присвояване на твърде голяма медия за игра</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Команда за отваряне на папка</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Предпочитана организация за оценка на възраст</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Актуализиране на инсталационния размер на игри при актуализация на библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Сканира и актуализира инсталационния размер на игрите, ако се установи, че техните файлове са били променени след последното сканиране</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Няма</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Попълване</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Униформа</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Униформа за запълване</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Наляво</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Надясно</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Нагоре</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Отдолу</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Грешка при импортиране</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Изисква се удостоверяване</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Неуспешно удостоверяване</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Алтернативен режим на изобразяване на уеб изглед</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Използвайте, когато имате проблеми с уеб изгледи, например диалогови прозорци за удостоверяване на интеграция.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Частично зареждане на големи описания на игри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Големите описания могат да причинят забележимо забавяне при избора на игри.\r\n\r\nКогато е активирано, само част от текста на описанието ще бъде първоначално зареден с опция за зареждане на останалата част при поискване.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Импортиране на метаданни</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Изтегляне на метаданни</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Задайте избраната конфигурация, която да се използва за бъдещи изтегляния на метаданни.\r\nМоже също да се промени в настройките на приложението.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Съветник за импортиране на емулация</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Този съветник ще ви преведе през процеса на изтегляне и импортиране на конзолни емулатори и импортиране на емулирани игри.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Имайте предвид, че винаги можете да добавите допълнителни емулатори и/или игри по-късно чрез главното меню (под менюто &quot;Библиотека&quot; за настройки на емулатора и менюто &quot;Добавяне на игри&quot; за емулирани игри ).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">По-долу е даден списък с емулатори, които Playnite може да разпознае и конфигурира автоматично. Можете да изтеглите инсталационни програми за емулатор от техните уебсайтове. След като инсталирате емулаторите (ръчно), можете да ги импортирате в диалоговия прозорец за конфигуриране на емулатора.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Можете да импортирате всички емулатори, които са инсталирани на вашия компютър, като щракнете върху бутона „Автоматично откриване от папка…“. Playnite ще търси в избраната папка всички известни емулатори и ще предостави опцията за импортирането им. Можете да използвате този бутон няколко пъти, за да импортирате емулатори от различни папки. Емулаторите ще бъдат добавени в края на текущия списък.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Можете да импортирате игри, като щракнете върху бутона „Сканиране на папка чрез емулатор“. Избирането на подходящия емулатор ще каже на Playnite кои типове файлове трябва да бъдат сканирани и импортирани. Можете да използвате този бутон няколко пъти, за да импортирате игри от различни папки. Игрите ще бъдат добавени в края на текущия списък.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Няма избрани емулатори за импортиране. Няма да можете автоматично да импортирате никакви емулирани игри, без първо да конфигурирате емулатори. Сигурни ли сте, че искате да продължите и да излезете от процеса на импортиране?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">В Playnite няма конфигурирани емулатори. Не можете да импортирате игри, без първо да конфигурирате емулатора и да изберете подходящите типове файлове. Искате ли да добавите някои емулатори сега?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Сканиране на папка чрез емулатор</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Избор на файлове</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Автоматично откриване от папка…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Конфигуриране на емулатори…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Сканиране...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Сканиране {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Конфигурация за първи път</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Този процес ще ви преведе през автоматично импортиране и конфигуриране на външни библиотеки с игри. Playnite може автоматично да импортира игри от множество услуги за игри, като Steam или GOG.\r\n\r\nИмайте предвид, че можете също ръчно да добавите персонализирана или емулирана игра за всяка платформа по-късно от главното меню.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Интегриране на библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Следва списъкът с някои подбрани библиотечни интеграции, поддържани от Playnite. Моля, изберете тези, които искате да инсталирате.\r\n\r\nПовече интеграции могат да бъдат инсталирани по-късно от &quot;Добавки&quot; меню.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Конфигурацията завършена</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Първоначалната настройка е завършена. Не забравяйте, че можете да промените всички настройки по-късно, както и да добавите допълнителни интеграции от главното меню.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Неуспешно изтегляне на едно или повече разширения.\r\n\r\nМожете да опитате да изтеглите повторно интеграции от менюто с добавки, след като съветникът за първо стартиране завърши.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Изтегля се интеграция на {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Изтегля се списък с препоръчани интеграции...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Неуспешно изтегляне на списък с препоръчани интеграции. Можете да опитате и да изтеглите повторно интеграции по-късно чрез менюто Addons.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Конфигуриране на платформи и емулатори</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Конфигуриране на емулатори</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Платформи</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Платформа</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Емулатори</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Емулатор</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Добавяне на платформа</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Избор на икона</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Изберете корица</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Избор на изображение</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Избор на елемент</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Избор на фон</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Изберете файл</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Изберете URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Добавяне на емулатор</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Поддържана платформа(и)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Искате ли да запазите промените в платформата?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Искате ли да запазите промените в емулатора?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Изпълним</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Аргументи</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Работна директория</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Поддържани файлови типове</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Импортиране на емулатори...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Изтегляне на емулатори...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Зареждане на предварително зададени аргументи от известен профил на емулатор</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Сигурни ли сте, че искате да премахнете емулатора на {0}?\r\nВ момента се използва от {1} игра(и).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Сигурни ли сте, че искате да премахнете платформата {0}?\r\nВ момента се използва от {1} игра(и) и {2} емулатор(а).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Помощ за настройки</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Сортиране по</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Посока на сортиране</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Групиране по</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Възходящо</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Низходящо</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Не групирай</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Групиране по библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Групиране по категория</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Групиране по платформа</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Тип изглед</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Изглед</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Панел за преглед</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Панел за филтри</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Икона</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Икона на библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Изображение на корицата</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Фоново изображение</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Име за сортиране</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Ръководство</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Име</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Инсталиране на устройство</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Име на акаунт</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Платформа</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Категория</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Жанр</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Дата на издаване</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Година на издаване</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Разработчик</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Етикет</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Издател</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Състояние на инсталацията</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Съвпада с всички филтри</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Ако е разрешено, само игри, които използват всички елементи във всички филтри, ще бъдат включени в изгледа.\r\nАко е деактивирано, игрите, които използват който и да е елемент във всеки филтър, ще бъдат включени в изгледа.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Инсталирани</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Инсталирани</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Не инсталирани</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Скрити</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Любими</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Активиране на HDR поддръжка</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Ако е активиран, HDR ще бъде активиран на основния дисплей преди стартиране на играта.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Имайте предвид, че HDR не се поддържа на вашия основен дисплей.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Последно играно</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Категория</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Описание</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Инсталационна папка</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Изображение на корицата</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Връзки</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Изображение, ROM или ISO път</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Жанр</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Жанрове</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Фирма</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Компании</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Разработчик</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Разработчици</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Издател</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Издатели</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Категория</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Категории</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Етикет</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Етикети</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Функция</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Функции</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Възрастова оценка</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Възрастови оценки</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Регион</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Региони</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Източник</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Източници</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Последна активност</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Грешка в базата данни</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Неуспешно отваряне на библиотечна база данни.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Базата данни не е отворена.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Не може да се осъществи достъп до базата данни на библиотеката. Файл &quot;{0}&quot; се използва от друг процес или е на недостъпно място.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Неуспешно създаване на диагностичен пакет.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Неуспешно автоматично качване на диагностичен пакет.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Диагностичната информация беше изпратена успешно.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Диагностичният пакет е създаден и изпратен успешно.\r\nМоля, прикачете следния идентификатор към вашия доклад за проблем:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Неуспешно импортиране на игри от {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Неуспешно импортиране на емулирани игри от {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Не може да търси игри по избран профил на емулатор. Профилът не съдържа файлови разширения или платформи.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite не успя да стартира. Моля, затворете всички други копия и опитайте отново.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Неуспешно прилагане на тема &quot;{0}&quot;, цветен профил &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Не може да се отвори връзка, URL адресът не е във валиден формат.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Неуспешно стартиране на приложението.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Неуспешно инициализиране на компонента за уеб изглед. Playnite не може да продължи с процеса на стартиране.\r\n\r\nПовече информация на https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Не могат да се импортират емулатори поради липсващ или повреден дефиниционен файл.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Неуспешно изпълнение на действие от менюто.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Редактиране на подробностите за играта</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL адрес на изображение</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Добавяне на връзка</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Добавяне на ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Запазване на промените</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Прилагане на промени в полето към игра(и), които се редактират.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Добавяне на действие</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Премахване</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Премахване на действие за възпроизвеждане</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Добавяне на игри</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Сканиране на папка…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Откриване на инсталирани</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Преглед...</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Отворете Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Настройки на профила</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Името на играта не може да бъде празно.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Директорията за проследяване на действие на играта не може да бъде празна.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Името на играта не може да бъде празно преди търсене в метаданни.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Невалидни данни за играта</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Въведете валиден уеб URL, започващ с http:// или https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Изберете URL адрес</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Неуспешно изтегляне на метаданни: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Грешка при изтегляне</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Изчистване на филтрите</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Личен акаунт</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Публичен акаунт</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API ключ</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Грешка при стартиране</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Грешка в темата</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Изчистване на всички</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Инсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Деинсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Стартиране</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Изпълнява се</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Невалиден URL адрес</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Не правете нищо</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Минимизиране</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Прозорец за възстановяване</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Възстанови прозореца само когато стартира през потребителския интерфейс</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Затваряне</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Промяна</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Разширени</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Никога</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Статус на завършване</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Състояния на завършване</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Потребителски резултат</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Резултат от критик</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Резултат от общността</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Скриптове за игри</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Скриптове за приложения</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Скриптове</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Добавки</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Източници на метаданни</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Разширения</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID на разширение</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Презареждане на скриптове</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Интерактивен SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Всички скриптове са презаредени успешно.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Няма намерени игри за определени критерии за търсене/филтриране</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Няма намерени елементи</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Превключване към режим на работен плот</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Излезте от Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Библиотеки</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Актуализиране на всички</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Създаден от:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Версия:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Актуализирано:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Модул:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Статистика</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Всички</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Няма</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Известия</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Ширина</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Височина</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Размер</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Малък</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Нормално</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Голям</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">По-голям</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Най-голям</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">По подразбиране</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Избор</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Избиране на всички</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Премахване на избора от всички</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Първо</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Произволно</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Избор на потребител</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Зареди още</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Прозрачен</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Свиване</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Разгъване</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Свиване на всички</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Разгъване на всички</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Други</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Теми</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Аргументи на емулатора</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Вградени аргументи</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Персонализирани аргументи</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Допълнителни аргументи на емулатора</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Замяна на аргументите на емулатора</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Действие за възпроизвеждане</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Изберете метаданни за импортиране</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Изберете игри за импортиране</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Търсене на метаданни</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Налична актуализация</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Промени от последната актуализация</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Изтеглете и инсталирайте актуализация</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Проверка за актуализации</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Грешка при актуализиране</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Неуспешна проверка за нова версия.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Няма намерена нова версия, вие сте актуална.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Неуспешно изтегляне и инсталиране на актуализация.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">В момента се изпълнява някаква фонова задача. Искате ли да го отмените и да продължите с актуализацията?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">В момента се изпълнява някаква фонова задача. Искате ли да го отмените и да излезете от Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">В момента се изпълнява някаква фонова задача. Превключването на режимите ще анулира задачата. Искате ли все пак да превключите?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Налична е актуализация за Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Презареди списъка с теми</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Прилагане на избраната тема</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Гледайте промените във файла</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Автоматично прилагане на тема, когато изходният файл се промени</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Среда за изпълнение на скрипт</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Изпълняване преди стартиране на игра</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Изпълняване след излизане от игра</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Изпълняване след стартиране на игра</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Изпълняване при стартиране на приложението</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Изпълняване при изключване на приложението</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Скрипт за стартиране на играта</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Скрипт за стартиране на играта</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Скрипт за спряна игра</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Изпълняване на глобален скрипт</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Глобален</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Филтрирано</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Текущ</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Ново</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Тестов скрипт</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Показване само на избрани елементи.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Запазване по подразбиране</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Добавяне към любими</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Премахване от любими</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Скриване на тази игра</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Премахване от скрити</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Активиране на HDR поддръжка</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Деактивиране на HDR поддръжка</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Редактиране...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Изчисляване на инсталационния размер</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Изчисляване на инсталационния размер (Всички игри)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Изчисляване на инсталационния размер (само липсващи данни)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Размер за инсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Задаване на категория...</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Задаване на състояние на завършване</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Премахване</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Играйте</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Инсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Опции на играта</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Подробности</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Деинсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Отваряне на мястото за инсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Създаване на пряк път на работния плот</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Отворете ръководството</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Още</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Управлява се от приставката за библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Процесът на стартиране на играта ще се управлява от плъгина на библиотеката, отговорен за тази игра.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">На посочената страница не е намерена подходяща информация за играта „{0}“.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Съвет: Можете да използвате по-разширен процес на изтегляне на метаданни, докато редактирате една игра чрез &quot;Редактиране&quot; опция от менюто.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Не е налично, когато се извършва някакво действие.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Текстът на описанието е чувствителен към HTML синтаксиса</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Времето на играта се записва в секунди.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Размерът на инсталиране е посочен в байтове.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Дата на издаване трябва да бъде зададена във формат „година-месец-ден“. Стойностите за месец и ден могат да бъдат пропуснати.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Стойности от 0 до 100 или празни за липса на резултат.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Разработката на Playnite се поддържа от следните потребители на Patreon и Ko-fi:\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Код, локализация и други сътрудници без определен ред:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Анулиране на наблюдението на играта?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Наблюдението на инсталацията се изпълнява в момента. Искате ли да отмените процеса и да върнете играта в предишното състояние?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">В момента се изпълнява мониторинг на изпълнението на играта. Искате ли да отмените процеса и да върнете играта в предишното състояние?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Изиграно време</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Последно пускане</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}д {1}ч {2}мин</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0} ч {1} м</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} минути</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} секунди</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Не е играно</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Отваряне на режим на работен плот...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Отваряне на режим на цял екран...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Зарежда се библиотека с игри...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Изчисляване на инсталационния размер...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Изчисляване на инсталационния размер на {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Неуспешно инсталиране на файл със скрипт.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Скриптът е инсталиран успешно.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Скрипт за инсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Грешка в скрипта</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Неуспешно изпълнение на функцията за разширение.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Отворете папката с метаданни</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Изчисляване</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Автоматично изчислява инсталационния размер с помощта на ROM, ако играта има такива, или инсталационната директория, ако е зададена</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} клиент не е инсталиран.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} клиент сега ще се отвори. Моля, влезте и затворете това съобщение.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Изчакване потребителят да влезе, моля затворете това, когато сте готови...</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Инсталационната папка на играта не е намерена.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Невалидна конфигурация на действие в играта.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Отстраняване на проблеми със синхронизирането на акаунт</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Отстраняване на проблеми</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Преименуване на елемент</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Добавяне на нов елемент</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Въведете име</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Въведете ново име</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">По-малко от час</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 до 10 часа</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 до 100 часа</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 до 500 часа</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 до 1000 часа</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">Над 1000 часа</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite трябва да се рестартира, за да завърши инсталацията. Искате ли да рестартирате сега?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Разширението не е пакетирано правилно.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Темата не е пакетирана правилно.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Разширение &quot;{0}&quot; не успя да се зареди правилно.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Не може да се зареди &quot;{0}&quot; разширение, текущата версия на Playnite не се поддържа.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Тема &quot;{0}&quot; не успя да се зареди правилно.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Не може да се зареди &quot;{0}&quot; тема, текущата версия на Playnite не се поддържа.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Разширението не успя да се зареди правилно.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Темата не успя да се зареди правилно.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Темата/разширението използва неподдържана версия на API.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Инсталацията беше успешна.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Инсталиране на добавка?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Общи</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Неуспешно инсталиране на &quot;{0}&quot; добавка.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Неуспешно инсталиране на разширение.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Искате ли да инсталирате ново разширение?\r\n\r\n{0}\r\nот {1}\r\nВерсия {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Искате ли да актуализирате &quot;{0}&quot; разширение?\r\n\r\nТекуща версия: {1}\r\nНова версия: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Неуспешно инсталиране на тема.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Искате ли да инсталирате нова тема?\r\n\r\n{0}\r\nот {1}\r\nВерсия {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Искате ли да актуализирате &quot;{0}&quot; тема?\r\n\r\nТекуща версия: {1}\r\nНова версия: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Вие сте на път да напуснете Playnite и да навигирате до следната уеб страница, като използвате вашия уеб браузър по подразбиране. Искаш ли да продължиш?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Избраното изображение(а) може да е твърде голямо за оптимална производителност. Използването на много големи изображения може да доведе до по-лоша реакция на потребителския интерфейс и увеличено използване на паметта.\r\n\r\nМаксимални препоръчителни разделителни способности:\r\nИкони: {0} мегапиксела\r\nКорици: {1} мегапиксела\r\nФон: {2} мегапиксела</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Предупреждение за производителност</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Не показвай отново</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Файлът с разширение {0} не е съвместим.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Несъвместимо файлово разширение</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Избраният файл с изображение може да е твърде голям за оптимална производителност.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Сигурни ли сте, че искате да деинсталирате избраната тема? Деинсталирането ще бъде на опашка до следващото стартиране на приложението.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Вградените теми не могат да бъдат деинсталирани.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Тази тема не поддържа тази версия на Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Сигурни ли сте, че искате да деинсталирате избраното разширение? Деинсталирането ще бъде на опашка до следващото стартиране на приложението.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Вградените разширения не могат да бъдат деинсталирани.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Това разширение не поддържа тази версия на Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Инсталационна папка</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Папка с данни</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Генериране на диагностичен пакет…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Качване на диагностичен пакет...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Импортиране на файл...</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Какво е това?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Сигурни ли сте, че искате да направите това?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Общо време за игра</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Средно време за игра</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Най-добро време за игра</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Общ размер на инсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Общ преглед</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Странична лента</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Покажи в страничната лента</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Нулиране на настройките</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Всички настройки на приложението ще бъдат нулирани до стойностите по подразбиране, с изключение на:\r\n- Местоположение на базата данни\r\n- Импортиране на списък с изключения\r\n- Настройки на разширението, включително интеграции на библиотека\r\n    \r\nЗа завършване на процеса е необходимо рестартиране на приложението. Искате ли да нулирате настройките?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">За разработчици</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Външни разширения</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Въведете пълния път на папката.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Постижения</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Форум</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Новини</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Страница на магазин</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Първоначалната настройка не е завършена. Playnite сега ще се рестартира в режим на работен плот, за да завърши процедурата.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Наскоро играни</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Любими</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Най-играни</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Всички</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Има приложени филтри.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Има приложени допълнителни филтри.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Показване на резултати от търсене за:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Елемент със същото име вече съществува.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Ограничаване на избора до текущия филтър</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Изберете друг</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Добавки…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Инсталиран</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Настройки на разширенията</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Преглед</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Актуализации</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Актуализации ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Управлението на инсталираните разширения и теми, включително техните настройки, е преместено в нов &quot;Добавки&quot; меню.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Всички текущо инсталирани разширения за интегриране на библиотека могат да бъдат конфигурирани тук.\r\n\r\nАко искате да инсталирате или деинсталирате допълнителни интеграции, използвайте &quot;Добавки&quot; опция от главното меню.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Работен плот с теми</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Теми на цял екран</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Търсене...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Добавката не е съвместима с тази версия на Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Неуспешно изтегляне на инсталационния пакет на добавката.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Неуспешно изтегляне на манифеста за инсталиране на добавка.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Необходимо е рестартиране на приложението, за да се приложат чакащи промени.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Тази добавка е планирана за инсталиране.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Инсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Деинсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Вече инсталиран</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Няма намерени нови актуализации на добавки.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Актуализиране на добавки</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Регистърът на промените не е наличен</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Планирано за инсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Неуспешно изтегляне</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Лицензът е отхвърлен</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Изтегляне на {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Търсят се актуализации на добавки...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Търсене за актуализации на програмата…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Налични са една или повече актуализации на добавките.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Изберете елементи за актуализиране</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Екземпляр за разработка на разширение</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} лицензионно споразумение</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Приемам</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Отказ</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Включване на действия за игра на интегриране на библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Избор на действие</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Режим на проследяване</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Път за проследяване</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Първоначално забавяне на проследяването</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Честота на проследяване</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Връзка</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Файл</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Емулатор</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Скрипт</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">По подразбиране</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Процес</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Папка</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Оригинален процес</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Име на процеса</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Регистриране на съобщения за проследяване</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Следващите промени презаписват данните за всички текущо избрани игри!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Няма</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Униформа</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Само елементи</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Само начало и край</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Чувствителност при превъртане</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Гладко превъртане</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Скорост на анимацията</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Премахване на елемент?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Сигурни ли сте, че искате да премахнете този елемент?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Показване на бутони в горния панел:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Общи настройки на изгледа</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Настройки за групиране</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Настройки за сортиране</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Предварително зададени филтри</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Позиция на елементите на приставката</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Ширина на разделителя на секции</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Преместване на бутона на главното меню в страничната лента</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Панел за преглед</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Произволен избор на игра</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Преглежда селектора за произволни игри</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Изберете произволна игра от изгледа</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Запазване на настройките за групиране и сортиране</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Показване като бърз филтър в режим на цял екран</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">През последните 7 дни</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">През последните 31 дни</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">През последните 365 дни</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Преди повече от 365 дни</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Конфигуриране</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Запазване на предварителна настройка</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Минимизиране след стартиране на играта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Минимизиране на Playnite след стартиране на игра.\r\n\r\nДеактивирането на това може да доведе до проблеми с игрите, които не получават фокус върху входа при стартиране!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Размер на шрифта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Малък размер на шрифта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Поддръжка на игрови контролери</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Ако е деактивирано, Playnite няма да приеме входове на XInput интерфейс.\r\n\r\nДеактивирайте, ако използвате инструменти, които преобразуват XInput входове във входове от мишка/клавиатура и получавате двойни входове в Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Показване на елементи в главното меню:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Свързване на обърнат X/A бутон за основен изглед</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Разменя връзките на бутоните за стартиране на игра и показване на страница с подробности за играта в основния изглед.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Размяна на обвързване на бутона за потвърждение/отмяна</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Инвертира A/B обвързвания на бутони за потвърждение и анулиране.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Само основен контролер</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Приема входове само от основния контролер, когато е активиран.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Бутонът за ръководство фокусира Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Сила на звука на интерфейса</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Сила на фона</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Заглушаване във фонов режим</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Неуспешно инициализиране на аудио интерфейс.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API за изход</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API, използван за аудио изход. Променете, ако имате проблеми със звука.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Общи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Визуални елементи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Аудио</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Оформление</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Менюта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Вход</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} стартира...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} работи...</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Главни букви</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Интервал</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Програма за мащабиране на рендиране на изображение</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Алтернатива</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Балансиран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Качество</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Качество:\r\nНай-добро качество на изображението, бавно, високо използване на паметта.\r\n    \r\nБалансиран:\r\nДобро качество, бързо, малко използване на паметта.\r\n    \r\nалтернатива:\r\nПо-добро качество, средна скорост, малко използване на паметта.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Изберете файл...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Изберете папка...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Стартов скрипт</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Моля, имайте предвид, че както разширенията, така и темите могат значително да повлияят на производителността, стабилността и сигурността на Playnite.\r\n    \r\nАко започнете да изпитвате проблеми след инсталиране на тема или разширение, опитайте първо да ги деактивирате/деинсталирате, за да видите дали те са в основата на проблема.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Избор при стартиране</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Избиране при стартиране</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Вградени профили</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Вграден профил</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Персонализирани профили</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Персонализиран профил</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Обработва се от вграден скрипт</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Спецификация на емулатора</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Спецификация на платформата</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Спецификация на региона</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Изпълняване преди стартиране на емулатора</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Изпълняване след стартиране на емулатора</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Изпълняване след излизане от емулатора</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Изпълнимият файл на емулатора не е намерен.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Спецификацията на емулатора не е намерена.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Скриптът за стартиране на емулатора не е намерен.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Разделяне като отделни игри</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Сливане в една игра</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Задаване на платформа</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Задаване на регион</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Сканиране на папка</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Конфигурации на сканиране</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Изключване на модели от сканиране на контролна сума</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Файловете, съответстващи на определен шаблон(и), няма да бъдат сканирани за контролна сума и ще бъдат съпоставени по име на файл. Вижте помощната страница на емулатора за повече информация.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Сканиране с емулатор</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Името трябва да бъде зададено при запазване на нова конфигурация.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Емулатор или профил на емулатор не е зададен.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Директорията за сканиране не е посочена или не съществува.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Конфигурацията на сканиране не е зададена правилно.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Включване в автоматичното сканиране при групово сканиране</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Неуспешно сканиране на папката за емулатори.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Неуспешно сканиране на папка(и) за емулирани игри.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Скриване на импортираните</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Профили за импортиране:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Конфигурации за автоматично сканиране</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Запазване като конфигурация за автоматично сканиране</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Запазва конфигурацията за по-късна употреба по време на актуализацията на библиотеката. Запазените конфигурации могат да се управляват чрез &quot;Конфигуриране на емулатори&quot; меню.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Импортиране чрез относителни пътища</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Ако е възможно, импортирайте файлове с игри, като използвате пътища, свързани с инсталационната папка на Playnite или инсталационната папка на емулатора.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Сканиране на подпапки</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Сканиране на вътрешните архиви</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Обединяване на свързани файлове</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Обединете свързани файлове с игри, като отделни дискове с игри, в един запис за игра.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Добавяне на скенер</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Добавяне на запазен скенер</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Стартиране на сканирането</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Добавете конфигурация(и) за сканиране с емулатори за сканиране на определени папки. Уверете се, че емулаторите са правилно конфигурирани, преди да импортирате игри (чрез менюто Библиотека -&gt; Конфигуриране на емулатори).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Статус по подразбиране, присвоен на новодобавени игри</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Статус, присвоен на игри, играни за първи път</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Неуспешно инициализиране на времето за изпълнение на скрипт PowerShell. Ако сте потребител на Windows 7, опитайте (пре)инсталирайте PowerShell 5.1, за да коригирате проблема.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Вече съществува предварително зададен филтър с посочено име. Актуализиране на предварителна настройка с нови настройки?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Тези думи ще бъдат премахнати от началото на автоматично попълнената стойност за име за сортиране:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Използвайте това за игнориране на думи в началото на низ с цел сортиране. По подразбиране е &quot;The&quot;, &quot;An&quot; и &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Попълване на име за сортиране за игри без такова</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Сортиране</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Попълване на стойности на имената за сортиране…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Установено е, че услугата Nahimic работи на вашата система. Известно е, че тази услуга причинява проблеми с изобразяването на Playnite (и други приложения).\r\n\r\nАко срещнете повреда на графиката или други проблеми с изобразяването в Playnite, препоръчваме да деактивирате или напълно да деинсталирате услугата Nahimic.\r\n\r\nПовече информация на https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite работи с повишени привилегии (като администратор). Това не се препоръчва, тъй като дава повишени привилегии на всички инсталирани разширения и всички игри/приложения, стартирани от Playnite!\r\n\r\nПовече информация на https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Показва предупреждение, ако Playnite работи с повишени привилегии</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Получете реалния размер на устройството, когато изчислявате размера на игрите</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Ако е активирано, сканирането ще бъде по-бавно и ще получи реалния размер, който файловете използват в устройството.\r\nАко е деактивирано, сканирането ще бъде по-бързо и ще използва размера на самите файлове.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Следните добавки са докладвани като потенциално проблемни или поради силно въздействие върху стабилността/производителността, или поради проблеми със сигурността. Силно препоръчваме да ги деинсталирате:\r\n   \t \r\n{0}\r\n\t</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Изключване на онлайн файлове от сканиране</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Файловете, съхранявани в облачно хранилище, няма да бъдат сканирани и импортирани, ако не са налични локално.\r\nПоддържа се само за: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Сканиране, но с помощта на опростен метод без файлово съдържание</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Файловете ще бъдат импортирани, но с помощта на по-малко точен метод, който не изисква съдържанието на файла да бъде изтеглено и представено локално.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Прилагане към всички</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Замяна на състоянието на инсталиране</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Когато е зададено, Playnite ще игнорира състоянието на инсталация (включително инсталационна директория), зададено от плъгина за интегриране, който импортира тази игра.\r\n   \t \r\nТази опция може да не работи напълно с плъгини, които използват конкретен метод за импортиране на игри, освен ако не вземат предвид и тази опция за отмяна.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Само ръчно</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Веднъж на ден</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Веднъж седмично</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">При всяко стартиране</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Проверете за актуализации на програмата</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Проверка за актуализации на добавки</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Актуализиране на библиотеки</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Сканиране на папки за емулация</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Включване на скрити игри</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Редактиране на полета</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Избиране/Премахване на всички</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Отвори</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Активиране</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Присвояване</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Започнете да пишете, за да търсите игри… [F1] за помощ</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Започването с # показва списък с налични команди.\r\nЗапочвайки с /, извежда списък с налични доставчици/плъгини за търсене.\r\nВъвеждането на ключова дума за търсене и завършването с ИНТЕРВАЛ незабавно превключва към това търсене.\r\n\r\nTAB: действие за превключване\r\nENTER: активиране на избраното действие\r\nSHIFT-ENTER: отваряне на менюто с елементи</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Включване на деинсталирани игри</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Включване на скрити игри</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Включени са деинсталирани игри</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Деинсталираните игри са изключени</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Включени скрити игри</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Скритите игри са изключени</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Играйте или инсталирайте</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Отидете на подробности</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Меню на играта</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Редактиране на играта</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Отворете търсене</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Поле за търсене</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Бутон за търсене</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Основно действие в играта</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Вторично действие в играта</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F отваря глобално търсене, вместо да фокусира полето за търсене</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Запазване на настройките на филтъра на играта между сесиите за търсене</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Доставчици на търсене</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Ключова дума по подразбиране</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Персонализирана ключова дума</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Пряк път за цялата система</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Търсене в Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Настройки на разширението</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Изключения</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Изключени файлове спрямо папката за сканиране</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Изключени папки спрямо папката за сканиране</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Добавяне на файл към списъка с изключения</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Добавяне на папка към списъка с изключения</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Изключения могат да се добавят само към запазени конфигурации на скенера.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Изключенията са добавени към &quot;{0}&quot; скенер.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Замяна на платформа</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Когато е зададено, скенерът ще присвои тази платформа на всички игри, като презапише всички автоматично открити платформи.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Включване на команди в търсенето по подразбиране</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Когато е деактивирано, командите няма да бъдат включени в търсенето по подразбиране, докато не се използва # префикс.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Използвайте размито съвпадение във филтъра за имена</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Когато е активиран, филтърът за имена ще съпоставя имената на игрите по същия начин като глобалното търсене.\r\nСтрогото съвпадение може да бъде наложено за отделен случай чрез префикс филтър със ! символ.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Полета за показване на резултатите от играта:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Скрито състояние</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Архивирането на данни бе отменено.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Неуспешно архивиране на данни.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Грешка при архивиране на данни</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Извършва се архивиране на данни...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Възстановяване на данни от резервно копие...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Неуспешно възстановяване на данни от резервно копие.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Настройки</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Библиотека с игри</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Носител на библиотека с игри</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Инсталирани разширения</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Данни за разширенията</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Инсталирани теми</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Изберете данни, които да бъдат възстановени от посочения архивен файл.\r\n    \r\nPlaynite автоматично ще се рестартира, за да започне процес на възстановяване на резервно копие.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Изберете елементи, които да бъдат включени в архивирането на данни. Настройките на приложението и данните от библиотеката с игри са включени по подразбиране.\r\n    \r\nPlaynite автоматично ще се рестартира, за да стартира процеса на архивиране.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Автоматично архивиране на данни</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Честота на автоматично архивиране</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Архивна папка</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Ротиращи архиви</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Включете допълнителни данни:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Папката за архивиране трябва да бъде зададена, ако е активирано автоматично архивиране.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Показване на известия само за издания на корекции</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Когато е активирано, само наличните актуализации за текущо инсталираната основна версия ще доведат до известие за актуализация.\r\nНовите основни версии няма да доведат до известие за актуализация.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Използване на относителни дати за последната седмица</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Използване на относителни дати в &quot;Днес&quot;, &quot;Вчера&quot; и т.н. формат, ако датата е на по-малко от седмица.\r\n    \r\nПосоченият формат на датата ще се използва за всички останали дати.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Търсене на изображения в мрежата</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Низ за търсене на изображение на икона</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Низ за търсене на изображение на корицата</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Низ за търсене на фоново изображение</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Получаване на информация за добавката...</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Няма наличен източник на метаданни</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Настройки за действие за възпроизвеждане</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Използване на настройките на скенера</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Избор на профил при стартиране</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Избор на емулатор при стартиране</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Автоматично</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Винаги включен</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Винаги изключено</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Поддръжка за достъпност (екранен четец)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Меню на приложението</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Меню на играта</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Програмна папка</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Директория с потребителски данни</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Открито е повреда на файла на библиотеката, Playnite ще се изключи.\r\n    \r\nОтворете нов проблем в GitHub страницата на Playnite с искане за коригиране на повреда във вашите файлове.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Искате ли да запазите направените промени?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Портативна инсталация</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Няма открити контролери</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/ca_ES.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Català</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Idioma de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Sortir</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtre actiu</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtre desactivat</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Filtres addicionals</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtres</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtre</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Dades no vàlides</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Vols desar els canvis?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Pàgina web a www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Codi font a GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Crear paquet de diagnosi</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Enviar informació del sistema</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Quant a Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Creat per Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Assignar categoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Establir categories</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Afegir categoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Seleccionat - Assignar categoria\r\nNo seleccionat - Eliminar categoria\r\nIndeterminat - Sense canvis (en editar diversos jocs)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Sense categoria</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Sense plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Vaja! Alguna cosa ha anat malament…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">S'ha produït un error irrecuperable.\r\n\r\nSi ens vols ajudar a solucionar el problema, descriu breument les accions preses abans del problema i envia la informació de diagnosi. Si estàs connectat a Internet, el paquet es penjarà al servidor de Playnite per a analitzar-se.\r\n\r\nTambé pots clicar al botó 'Informar d'una fallada' per crear una nova incidència al Github i informar manualment del problema.\r\n\r\nGràcies per la teva ajuda.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">L'extensió &quot;{0}&quot; ha provocat un error irrecuperable.\r\n\r\nEs recomana desar el fitxer de registre i informar del problema al desenvolupador de l'extensió. Si el problema es repeteix, desactiva l'extensió.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">L'extensió &quot;{0}&quot; ha provocat un error irrecuperable.\r\n\r\nEs recomana informar del problema al desenvolupador de l'extensió. Si el problema es repeteix, desactiva l'extensió.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Una extensió desconeguda o un tema ha provocat un error irrecuperable.\r\n\r\nRecomanem desactivar els complements de tercers, aïllar el problema i informar el problema al desenvolupador del complement.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">S'ha produït un error irrecuperable.\r\n\r\nSi vols ajudar-nos a arreglar aquest problema, envia'ns la informació de diagnosi. Gràcies.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Desactivar extensió</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Desar fitxer de registre</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Envia informació de diagnosi</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Informar d'una fallada</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Reiniciar Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Reiniciar en mode segur</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Desactivant totes les extensions de tercers i utilitzant el tema predeterminat.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Sortir de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Accions preses abans de la fallada (en anglès):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Organitzador de la biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Eliminar joc(s)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">No es pot eliminar: el joc o l'instal·lador s'està executant. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">No es pot desinstal·lar: el joc s'està executant.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Segur que vols eliminar {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Segur que vols eliminar {0} jocs?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Segur que vols eliminar {0}?\r\n\r\nSi selecciones l'opció &quot;Afegir a la llista d'exclusions&quot;, s'evitarà que el joc es torni a importar la pròxima vegada que s'actualitzi la biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Segur que vols eliminar {0} jocs?\r\n\r\nSi selecciones l'opció &quot;Afegir a la llista d'exclusions&quot;, s'evitarà que el joc es torni a importar la pròxima vegada que s'actualitzi la biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Segur que vols eliminar {0} entrades que no s'estan utilitzant actualment?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">No s'han trobat camps sense utilitzar</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Sí (afegir a la llista d'exclusions)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Hi ha canvis sense desar en aquesta secció</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Actualitzant format de la biblioteca de jocs…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Ha fallat l’actualització de la base de dades.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">No es pot actualitzar la biblioteca de jocs. Es requereixen {0} MB d’espai lliure.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Error del joc</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">No es pot iniciar el joc. '{0}' no s’ha trobat a la base de dades.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">No es pot iniciar el joc: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">No es pot iniciar l’acció: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">No es pot obrir la ubicació del joc: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">No s'ha pogut detectar la mida de la instal·lació del joc: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Error en escanejar la mida de la instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Hi ha hagut {0} errors en escanejar la mida de la instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">No s’ha pogut crear la drecera: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">No s'ha pogut obrir el manual: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">No es pot instal·lar el joc: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">No es pot desinstal·lar el joc: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">No s'han trobat accions d'inici de joc vàlides. Quan utilitzis accions d'emulador, assegura't que les definicions de la plataforma coincideixin entre el joc i la configuració de l'emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">La implementació de la instal·lació no està disponible.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">El connector de la biblioteca responsable d'aquest joc està desactivat o no està instal·lat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">La baixada de metadades oficials no està disponible.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">No hi ha cap joc seleccionat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Ha fallat l'execució de l'acció de l'script de joc</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Ha fallat l'execució de l'acció de l'script de l'aplicació.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Ha fallat l'execució de l'acció de l'script global</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Ha fallat l'execució de l'acció de l'script de l'emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Ha fallat l'execució de l'acció de l'script de joc.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 o una versió més recent no està instal·lat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">No s'ha pogut determinar com obrir el joc.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Activat</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Desactivat</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Eliminar</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Eliminar els no utilitzats</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Canviar el nom</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Copiar</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Afegir</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Icona per defecte</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Imatge de caràtula per defecte</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Imatge de fons per defecte</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Finalitzar</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Següent</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Enrere</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">FET</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">ENRERE</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">NETEJAR</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Netejar</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Descartar</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Descartar tot</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importar</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nom</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Mòdul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Sèrie</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versió</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Darrera partida</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Joc més utilitzat</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Nombre de partides</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Mida de la instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Carpeta</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notes</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Afegit el</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Data d'addició</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Modificat el</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Data de modificació</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Pàgina web</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Ruta</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">D'acord</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Desar</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Tancar</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Cancel·lar</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Confirmar</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Reinciar</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Sí</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">No</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Benvingut</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Usuari local</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">General</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Multimèdia</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Enllaços</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Accions</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Descarregant…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Descarregant multimèdia...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Carregant...</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Tipus</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Perfil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Perfils</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Eliminar</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Descarregar</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Cercar</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Resolució:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Qualsevol</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Zoom</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Vista de llista</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Caràtules</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Vista de quadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Vista de detalls</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Personalitzat</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Agraïments especials </sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Llicència</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Col·laboradors</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Sortint de Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Avui</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Ahir</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Dilluns</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Dimarts</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Dimecres</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Dijous</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Divendres</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Dissabte</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Diumenge</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">La setmana passada</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">El mes passat</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">L'any passat</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Fa més d'un any</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 a 100 MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100 MB a 1 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1 GB a 5 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5 GB a 10 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10 GB a 20 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20 GB a 40 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40 GB a 100 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100 GB o més</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">La importació s'ha completat correctament.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Tots els jocs</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Id del joc</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Id de la base de dades</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Ajustaments per defecte</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Columna</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Columnes</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Filera</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Files</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">No s'ha pogut obtenir la icona de l'acció Jugar. No hi ha cap acció de tipus fitxer present.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Només descarregar metadades que faltin</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Activar aquesta opció farà que s'ometi la descàrrega de metadades pels camps que ja contenen informació.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Selecció de jocs</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Selecciona els jocs que s’hagin d'actualitzar amb les noves metadades:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Tots els jocs de la base de dades</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Tots els jocs filtrats actualment</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Només els jocs seleccionats</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">No s'ha seleccionat cap camp de metadades</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">No s'ha seleccionat cap camp de metadades per descarregar. Si us plau, com a mínim, selecciona un camp i un proveïdor de metadades que li correspongui.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Botiga oficial</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Selecciona quins camps ha d'emplenar automàticament Playnite i quines fonts s’utilitzaran per obtenir les dades.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Pots fer clic al logo de dalt i contribuir a la base de dades d'igdb.com per a millorar les dades que utilitza Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Descarregant metadades…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Important jocs instal·lats…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Important jocs de {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Important jocs emulats de {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Descarregant actualitzacions de la biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Escanejant la mida dels jocs de la biblioteca...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Escanejant mida dels jocs importats...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">L’actualització de la biblioteca ha finalitzat</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Alliberant recursos…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Configuració</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Configuració…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Plataformes i emuladors</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Configurar emuladors…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Organitzador de la biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Eines</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Descarregar metadades…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Eines de programari…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Configurar integracions…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Obrir client de tercers</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Clients de tercers</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Actualitzar biblioteca de jocs</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Cancel·lar actualització de la biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Actualitzar carpetes emulades</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Afegir joc</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manualment…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Escanejar automàticament…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Joc emulat…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Aplicació del Microsoft Store…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Quant a Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Enviar comentaris</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Canviar al mode de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Enllaços</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Ajuda</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Donar suport al Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Suport a Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Manual d'usuari</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Documentació del SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Reiniciar el sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Tancar el sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Suspendre el sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernar el sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Bloquejar sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Tancar sessió de l'usuari</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Escollir un joc a l'atzar</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Camps del joc que es mostraran al panell de detalls:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Espai entre elements</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Mostrar imatge de fons dels elements de la quadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Amplada de la vora dels elements de la quadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Font de la icona faltant del joc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Font de la caràtula faltant del joc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Font de la imatge de fons faltant del joc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Espai vertical dels detalls del joc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Posició de detalls en la vista de quadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Posició de la llista de jocs en la vista detallada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Posar un separador entre panells</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Alçada d'imatge de caràtula de joc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Alçada d'icona de la llista de jocs</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Font de l'aplicació</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Font monoespaiada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Posició del panell de filtres</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Posició del panell d'exploració</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Renderització de la caràtula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Relació d'aspecte desitjada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Les següents opcions també afecten la renderització dels mosaics en mode de pantalla completa.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Mode d'estirament</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Caixa de DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Quadrat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Bàner de Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Caràtula vertical de Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Cal reiniciar per aplicar els canvis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Configuració</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">General</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Panell superior</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Aparença</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Detalls del joc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Disposició</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Avançat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Entrada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Rendiment</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadades</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Actualització</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Cerca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Còpia de seguretat</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Fer una còpia de seguretat de la biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Restaurar còpia de seguretat de les dades</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importar els canvis a la biblioteca automàticament</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">La ubicació del fitxer de base de dades no és vàlida; cal definir la ruta del fitxer adequada.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">El nom del compte no pot estar buit.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Descarregar metadades després d'importar jocs</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Iniciar Playnite minimitzat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Iniciar Playnite quan s'engegui l'ordinador</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Iniciar tancat a la safata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">No s’ha pogut registrar Playnite per iniciar-se quan s'obri l’ordinador.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Iniciar en mode de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Càrrega d’imatges asíncrona</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Millora la suavitat de desplaçament de les llistes de jocs a canvi de temps de càrrega d'imatges més lents.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Mostrar el nom del joc si no hi ha imatge de caràtula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Mostrar noms dels jocs en la vista de quadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Enfosquir els jocs no instal·lats</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Mostrar les icones dels jocs en la vista de detalls</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Mostrar el recompte d’elements a les descripcions de grups</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Mostrar només els camps assignats als panells de filtre i exploració</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Desactivar l'acceleració de hardware</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Fes-ho servir quan tinguis problemes de rendiment o similars a la IU</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Mostrar els jocs ocults a les llistes d'inici ràpid</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Afecta el Jump List i les llistes del menú de safata.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Nombre d'elements a la llista d'inici ràpid</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Utilitzar la imatge de fons del joc com a fons per la finestra</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Desenfocar el fons</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Alta qualitat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Enfosquir el fons</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Mostrar en vista de quadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Perfil del tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Tema de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Perfil del tema de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Localització de la base de dades</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Estat d'inici de sessió:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Configuració de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Esborrar la memòria cau web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Pot resoldre els problemes que es trobin mentre s'enllacen els comptes.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Mostrar icona a la safata del sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimitzar Playnite a la safata del sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimitzar Playnite a la safata del sistema quan la finestra de l’aplicació estigui tancada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Quan el joc s'iniciï:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Quan el joc es tanqui:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Format de temps reproduït per indicar el nombre de dies jugats</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Formats de dates:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Això et tancarà la sessió a tots els serveis enllaçats. Cal reiniciar l’aplicació, vols continuar?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Esborrar memòria cau?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Es requereix reiniciar Playnite per a aplicar el tema nou</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Obtenir més temes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Crear nou tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Obtenir més extensions</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Crear nova extensió</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Ajuda'ns a traduir Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Cal reiniciar Playnite per poder aplicar la nova configuració. Reiniciar ara?\r\n\r\nSi es reinicia, es cancel·laran les tasques actives (baixades) en curs.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Reiniciar Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite no pot moure els fitxers de la biblioteca automàticament. Has de moure/copiar manualment els fitxers abans de canviar la ubicació. Si no hi ha cap biblioteca a la ubicació de destinació, se'n crearà una de nova.\r\n\r\nLa nova ubicació de la base de dades no s'utilitzarà fins que es reiniciï Playnite. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">El temps de joc no quedarà registrat si es defineix l'acció &quot;Tancar&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Nombre de files</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Nombre de columnes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Nombre de files de vista de detalls</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Mostrar imatge de fons a la pantalla principal</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">No s'aplica retrospectivament als jocs existents sense tornar a descarregar les metadades.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importar temps de joc dels jocs de la biblioteca:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Configura quan ha d'importar Playnite el temps de joc indicat pels plugins de la biblioteca per a jocs a la base de dades de Playnite. Es necessita el suport dels connectors de la biblioteca encarregats de gestionar els jocs per poder utilitzar aquesta funció.\r\n\r\nSempre: Importa el temps de joc per a nous jocs importats i existents a la base de dades de Playnite.\r\nNomés pels jocs recentment importats: Importa temps de joc només per als nous jocs importats.\r\nMai: Mai no importa temps de joc sota cap circumstància.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Sempre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Només pels jocs recentment importats</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Mai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Activar la compatibilitat amb el comandament en mode d'escriptori</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">El botó Guia obre el mode de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Configuració de descàrrega automàtica de metadades per a jocs recentment importats.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Pantalla objectiu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Utilitzar sempre la pantalla principal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Mostrar títols dels jocs</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Mostrar estat de la bateria</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Mostrar percentatge de la bateria</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Mostrar rellotge</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Amagar el cursor del ratolí</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Només instal·lats a filtres ràpids</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Estil dels botons</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Disposició</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Desplaçament horitzontal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Selecciona una de les subseccions</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">No hi ha una configuració disponible</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">No s'ha pogut carregar la configuració</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Aquests scripts són executats per cada joc de la biblioteca. Es poden assignar scripts individuals per cada joc per separat mentre s'editen els detalls del joc.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animar transicions de les imatges de fons</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Mides de les fonts</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automàtic</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Aliàsing</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Escala de grisos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Pantalla</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Mode de format de text</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Mode de renderització de text\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Actualment no s’utilitzen mètodes de renderització i format de text per a la descripció de jocs.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Precarregar les imatges de fons</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Si s'activa, Playnite descarregarà imatges d'art de fons mentre descarrega metadades, utilitzant més espai de disc i fent l'art disponible quan s'estigui fora de línia.\r\n\r\nSi es desactiva, les imatges d'art de fons seran descarregades només quan es necessitin per primera vegada, utilitzant menys espai, però pot causar un retard abans que l'art sigui presentat i algunes imatges poden no estar disponibles quan s'estigui fora de línia. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Tancar automàticament el client de tercers després de sortir del joc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Retard d'apagada del client (en segons)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">No tancar després de les sessions de joc de menys de (en segons)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Tancar automàticament els següents clients:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Tancar clients automàticament</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importar llista d'exclusions</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Mostrar avís quan s'assigni multimèdia del joc molt gran</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Ordre d’obertura de directori</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Organització de classificació per edat preferida</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Actualitzar la mida de la instal·lació de jocs en actualitzar la biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Escaneja i actualitza la mida de la instal·lació de jocs si es detecta que s'han modificat els seus fitxers des de l'últim escaneig</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Cap</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Omplir</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Emplenar uniformement</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Esquerra</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Dreta</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Dalt</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Baix</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Error d'importació</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Es requereix autenticació</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">L'autenticació ha fallat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Mode de renderització de vista web alternatiu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Utilitza'l quan tinguis problemes amb les vistes web, per exemple, els diàlegs d'autenticació d'integració.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Càrrega parcial de descripcions llargues de jocs</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Les descripcions llargues poden causar un lag notable en seleccionar jocs.\r\n\r\nSi s'activa, només es carregarà inicialment una part del text de la descripció amb una opció de carregar la resta sota demanda.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Importació de metadades</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Descarregar metadades</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Estableix la configuració seleccionada perquè s'utilitzi a totes les descàrregues futures de metadades.\r\nTambé es pot canviar a les opcions de l'aplicació.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Assistent d'importació d'emulació</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Aquest assistent et guiarà durant el procés de descàrrega i importació d’emuladors de consola i d’importació de jocs emulats.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Recorda que sempre pots afegir emuladors i/o jocs addicionals a través del menú principal (al menú &quot;Biblioteca&quot; per a la configuració de l’emulador i al menú &quot;Afegir jocs&quot; per als jocs emulats).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">A continuació es mostra una llista d'emuladors que Playnite pot reconèixer i configurar automàticament. Pots descarregar instal·ladors d'emuladors des dels seus llocs web. Un cop tinguis els emuladors instal·lats (manualment), pots importar-los al diàleg de configuració de l'emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Pots importar qualsevol emulador instal·lat al teu PC fent clic a &quot;Auto-detectar des de carpeta…&quot;. Playnite cercarà a la carpeta seleccionada qualsevol emulador conegut i permetrà importar-los. Pots importar des de diverses carpetes repetint l'acció, els emuladors seran afegits al final de la llista actual.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Pots importar jocs prement el botó &quot;Escanejar carpeta mitjançant l’emulador&quot;. La selecció de l’emulador apropiat indicarà a Playnite quins tipus de fitxers haurien de ser escanejats i importats. Pots importar des de múltiples carpetes utilitzant aquest botó diverses vegades, els jocs s'afegiran a la part inferior de la llista actual.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">No hi ha cap emulador seleccionat per importar. No podràs importar automàticament cap joc emulat sense configurar primer els emuladors. Segur que vols continuar i sortir del procés d'importació?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">No hi ha cap emulador configurat a Playnite. No pots importar jocs sense configurar primer l’emulador i seleccionar els tipus de fitxer adequats. Vols afegir alguns emuladors ara?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Escanejar carpeta mitjançant l’emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Seleccionar fitxers</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Detectar automàticament des de carpeta…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Configurar emuladors…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Escanejant…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Escanejant {0}...</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Primera configuració</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Aquest assistent et guiarà a través del procés d’importació automàtica i la configuració de biblioteques de jocs externes. Playnite pot importar automàticament jocs des de diversos serveis com ara Steam o GOG.\r\n        \r\nTingues en compte que sempre pots afegir qualsevol joc personalitzat o emulat per a qualsevol plataforma manualment des del menú principal.  \r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integració de biblioteques</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">A continuació es presenta una llista d'algunes integracions de biblioteques que són compatibles amb Playnite. Si us plau, selecciona les que vulguis instal·lar.\r\n\r\nPots instal·lar més integracions posteriorment des del menú &quot;Complements&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Configuració finalitzada</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">La configuració inicial ha estat completada. Recorda que pots canviar tots els paràmetres posteriorment, així com afegir integracions addicionals des del menú principal.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">No s'han pogut baixar una o més extensions.\r\n\r\nPots provar de tornar a descarregar les integracions des del menú de complements un cop finalitzi l'assistent de la primera execució.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Descarregant integració de {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Descarregant llista d'integracions recomanades...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">No s'ha pogut descarregar la llista d'integracions recomanades. Pots intentar tornar a descarregar les integracions més tard mitjançant el menú de complements.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Configurar plataformes i emuladors</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Configurar emuladors</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Plataformes</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emuladors</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Afegir plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Seleccionar icona</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Seleccionar caràtula</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Seleccionar imatge</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Seleccionar element</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Seleccionar fons</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Seleccionar fitxer</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Seleccionar URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Afegir emulador</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Plataformes compatibles</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Vols desar els canvis de la plataforma?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Vols desar els canvis de l’emulador?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Executable</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Paràmetres</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Directori de treball</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Tipus de fitxers admesos</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importar emuladors…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Descarregar emuladors…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Carregar arguments predefinits del perfil conegut de l’emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Segur que vols eliminar l'emulador {0}?\r\nActualment, està sent utilitzat per {1} joc(s).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Segur que vols eliminar la plataforma {0}?\r\nActualment, està sent utilitzat per {1} joc(s) i {2} emulador(s).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Ajuda de configuració</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Ordenar per</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Direcció de l'ordenació</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Agrupar per</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Ascendent</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Descendent</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">No agrupar</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Agrupar per biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Agrupar per categoria</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Agrupar per plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Tipus de vista</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Visualització</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Panell d'exploració</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Panell de filtres</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Icona</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Icona de biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Imatge de caràtula</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Imatge de fons</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Nom d'ordenació</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manual</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nom</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Unitat d'instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Nom del compte</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Gènere</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Data de llançament</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Any de llançament</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Desenvolupador</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Etiqueta</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Editor</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Estat de la instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Coincidir amb tots els filtres</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Si està activat, només s'inclouran a la vista els jocs que utilitzen tots els elements de tots els filtres.\r\nSi està desactivat, els jocs que utilitzen qualsevol element en qualsevol filtre s'inclouran a la vista.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Instal·lat</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Instal·lat</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">No instal·lat</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Ocult</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Preferit</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Activar compatibilitat amb HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Si es selecciona, el HDR s'activarà a la pantalla principal abans d'iniciar el joc.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Tingues en compte que el HDR no és compatible amb la teva pantalla principal.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Última partida</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Descripció</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Carpeta d'instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Imatge de caràtula</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Enllaços</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Ruta d'Imatge, ROM o ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Gènere</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Gèneres</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Companyia</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Companyies</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Desenvolupador</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Desenvolupadors</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Editor</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Editors</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Categories</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Etiqueta</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Etiquetes</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Característica</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Característiques</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Classificació per edat</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Classificacions per edat</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Regió</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regions</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Font</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Fonts</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Activitat recent</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Error de la base de dades</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">No s’ha pogut obrir la base de dades de la biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">La base de dades no està oberta.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">No es pot accedir a la base de dades de biblioteca. El fitxer &quot;{0}&quot; està sent utilitzat per un altre procés o es troba en una ubicació inaccessible.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">No s’ha pogut crear el paquet de diagnosi.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">No s’ha pogut carregar automàticament el paquet de diagnosi.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">La informació de diagnosi s'ha enviat correctament.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">El paquet de diagnosi s’ha creat i carregat correctament.\r\nSi us plau, adjunta el següent ID al teu informe d'error:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">No s’han pogut importar els jocs de {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">No s’han pogut importar jocs emulats de {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">No es poden cercar jocs pel perfil d’emulador seleccionat. El perfil no conté extensions de fitxers ni plataformes.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite no s'ha pogut iniciar. Tanca totes les instàncies del programa en execució i torna-ho a provar.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">No s’ha pogut aplicar el tema &quot;{0}&quot;, perfil de color &quot;{1}&quot;\r\n        \r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">No es pot obrir l’enllaç, l’URL no té un format vàlid.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">No s’ha pogut iniciar l’aplicació.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">No s'ha pogut iniciar el component de vista web. Playnite no pot continuar amb el procés d'arrancada.\r\n\r\nMés informació a https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">No es poden importar emuladors perquè falta un fitxer de definició o està corromput.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">No s’ha pogut executar l'acció del menú.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Editar els detalls del joc</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL d'imatge</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Afegir enllaç</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Afegir ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Desar canvis</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Aplicar els canvis de camp als jocs que s'estan editant.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Afegir acció</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Eliminar</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Eliminar acció de Jugar</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Afegir jocs</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Escanejar carpeta…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Detectar instal·lats</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Navegar…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Obrir Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Opcions del perfil</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">El nom del joc no pot estar buit.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">El directori de seguiment d'accions del joc no pot estar buit.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">El nom del joc no pot estar buit abans de cercar metadades.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Dades de joc no vàlides</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Introdueix un URL web vàlid que comenci per http:// o https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Seleccionar URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">No s'ha pogut descarregar les metadades: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Error de descàrrega</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Esborrar els filtres</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Compte privat</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Compte públic</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">Clau API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Error d’inici</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Error del tema</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Esborrar tot</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Instal·lant</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Desinstal·lant</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Iniciant</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">En funcionament</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">URL no vàlid</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">No fer res</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimitzar</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Restaurar la finestra</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Restaurar finestra només quan s'iniciï des de la IU</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Tancar</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Canviar</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Avançat</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Mai</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Estat de finalització</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Estats de finalització</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Puntuació dels usuaris</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Puntuació de la crítica</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Puntuació de la comunitat</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Scripts del joc</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Scripts de l'aplicació</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Plugins</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Fonts de metadades</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Extensions</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID de l'extensió</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Recarregar scripts</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">PowerShell SDK interactiu</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Tots els scripts s'han carregat correctament.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">No s'han trobat jocs per la cerca o filtre especificat</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">No s'ha trobat cap element</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Canviar al mode d'escriptori</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Sortir de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Biblioteques</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Actualitzar-ho tot</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Creat per:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versió:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Actualitzat:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Mòdul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Estadístiques</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Tots</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Cap</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Notificacions</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Amplada</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Alçada</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Mida</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Petita</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Gran</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Més gran</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">La més gran</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Per defecte</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Seleccionar</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Seleccionar-ho tot</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Desseleccionar-ho tot</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Primer</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Aleatori</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">A selecció de l'usuari</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Carregar-ne més</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Transparent</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Contraure</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Desplegar</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Contraure tot</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Desplegar-ho tot</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Altres</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Temes</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Paràmetres de l'emulador</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Paràmetres incorporats</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Paràmetres personalitzats</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Paràmetres addicionals de l'emulador</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Substituir els paràmetres de l'emulador</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Acció de Jugar</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Seleccionar les metadades per importar</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Seleccionar jocs per importar</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Cerca de metadades</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Actualització disponible</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Canvis des de l'última actualització</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Descarregar i instal·lar l'actualització</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Buscar actualitzacions</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Error d’actualització</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">No s'ha pogut comprovar si hi ha una versió nova.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">No s’ha trobat cap versió nova, estàs al dia.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">No s'ha pogut descarregar i instal·lar l'actualització.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Hi ha alguna tasca en curs en segon pla. Vols cancel·lar-la i continuar amb l'actualització?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Hi ha alguna tasca en curs en segon pla. Vols cancel·lar-la i sortir de Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Hi ha alguna tasca en curs en segon pla. Si es canvia de mode, la tasca es cancel·larà. Vols canviar de totes maneres?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Hi ha disponible una actualització per Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Tornar a carregar la llista de temes</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Aplicar el tema seleccionat</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Veure els canvis dels fitxers</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Aplicar automàticament el tema quan canviï el fitxer font</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Temps d'execució del script</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"> Executar abans d'iniciar un joc</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Executar després de sortir d'un joc</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Executar després que s'hagi iniciat un joc</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Executar en iniciar aplicació</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Executar en tancar aplicació</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Script d'inici del joc</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Script de joc iniciat</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Script de joc aturat</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Executar script global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrat</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Actual</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Nou</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Provar script</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Mostrar només els elements seleccionats.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Desar com a predeterminat</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Afegir a Preferits</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Eliminar de Preferits</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Ocultar aquest joc</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Treure d'Ocults</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Activar compatibilitat amb HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Desactivar compatibilitat amb HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Editar…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Calcular mida de la instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Calcular mida de la instal·lació (tots els jocs)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Calcular mida de la instal·lació (només les dades que faltin)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Mida de la instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Establir categoria…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Establir estat de finalització</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Eliminar</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Jugar</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Instal·lar</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Opcions del joc</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Detalls</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Desinstal·lar</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Obrir l'ubicació de l'instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Crear accés directe a l'escriptori</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Obrir el manual</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Més</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Gestionat pel plugin de biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">El procés d'inici del joc serà gestionat pel plugin de la biblioteca responsable d'aquest joc.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">No s'ha trobat cap informació important sobre el joc '{0}' en la pàgina especificada.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Consell: pots utilitzar el procés de descàrrega de metadades més avançat mentre edites un joc a través de l'opció &quot;Editar&quot; del menú.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">No està disponible quan hi ha alguna acció en curs.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">El text de descripció és sensible a la sintaxi HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">El temps de joc s'enregistra en segons.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">La mida de la instal·lació s'indica en bytes.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">La data de llançament s'ha d'establir en format &quot;any-mes-dia&quot;. Els valors del mes i el dia es poden ometre.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Valors de 0 a 100 (o deixa-ho buit per no indicar una puntuació).</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">El desenvolupament de Playnite compta amb el suport d'aquests mecenes i membres de Ko-fi:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Codi, localització i altres col·laboradors sense cap ordre particular:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Cancel·lar la monitorització del joc?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Actualment, s’està executant la supervisió de la instal·lació. Vols cancel·lar el procés i tornar el joc a l'estat anterior?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Actualment, s’està executant la supervisió de l’execució del joc. Vols cancel·lar el procés i tornar el joc a l'estat anterior?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Temps jugat</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Última partida</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}d {1}h {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minuts</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} segons</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">No jugat</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Obrint mode d'escriptori…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Obrint mode de pantalla completa…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Carregant la biblioteca de jocs…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Calculant la mida de la instal·lació...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Calculant la mida de la instal·lació de {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">No s’ha pogut instal·lar el fitxer d'script.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Script instal·lat correctament.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Instal·lar script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Error d'script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">No s’ha pogut executar la funció d’extensió.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Obrir carpeta de metadades</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Calcular</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Calcula automàticament la mida de la instal·lació mitjançant les ROMs si el joc en té alguna o s'ha establit el directori d'instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">El client de {0} no està instal·lat.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Ara s'obrirà el client de {0}. Inicia sessió i tanca aquest missatge.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Esperant que l'usuari iniciï la sessió. Si us plau, tanca aquest missatge quan ho hagis fet…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">No s'ha trobat la carpeta d’instal·lació del joc.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Configuració d’acció de joc no vàlida.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Resolució de problemes de sincronització del compte</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Resolució de problemes</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Renomenar element</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Afegir nou element</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Introdueix el nom</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Introdueix el nou nom</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Menys d'una hora</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 a 10 hores</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 a 100 hores</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 a 500 hores</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 a 1000 hores</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">Més de 1000 hores</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">S'ha de reiniciar Playnite per a completar la instal·lació. Vols reiniciar-lo ara?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">L'extensió no està empaquetada correctament.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">El tema no està empaquetat correctament.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">No s'ha pogut carregar correctament l'extensió &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">No es pot carregar l'extensió &quot;{0}&quot;, la versió actual de Playnite no és compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">No s'ha pogut carregar correctament el tema &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">No es pot carregar el tema &quot;{0}&quot;, la versió actual de Playnite no és compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">No s'ha pogut carregar correctament l'extensió.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">No s'ha pogut carregar correctament el tema.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Aquest tema o extensió utilitza una versió de l'API que no és compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">La instal·lació s'ha realitzat correctament.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Instal·lar complement?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">General</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">No s'ha pogut instal·lar el complement &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">No s'ha pogut instal·lar l'extensió.\r\n        \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Vols instal·lar una nova extensió?\r\n\r\n{0}\r\nPer {1}\r\nVersió {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Vols actualitzar l'extensió &quot;{0}&quot;?\r\n\r\nVersió actual: {1}\r\nNova versió: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">No ha pogut instal·lar el tema.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Vols instal·lar un tema nou?\r\n\r\n{0}\r\nPer {1}\r\nVersió {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Vols actualitzar el tema &quot;{0}&quot;?\r\n\r\nVersió actual: {1}\r\nNova versió: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Estàs a punt de sortir de Playnite i dirigir-te a la pàgina web següent utilitzant el teu navegador per defecte. Vols continuar?\r\n    \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Les imatges seleccionades poden ser molt grans per un rendiment òptim. Utilitzar imatges molt grans pot causar una pitjor resposta de l'aplicació i un increment de l'ús de la memòria. \r\n\r\nMàxima resolució recomanada:\r\nIcones: {0} megapíxels\r\nCaràtules: {1} megapíxels\r\nImatges de fons: {2} megapíxels</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Avís de rendiment</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">No mostrar de nou</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">El fitxer amb extensió {0} no és compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Extensió de fitxer no compatible</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">El fitxer d'imatge seleccionat pot ser massa gran pel rendiment òptim.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Segur que vols desinstal·lar el tema seleccionat? La desinstal·lació es produirà la pròxima vegada que el programa s'executi.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Els temes preinstal·lats no es poden desinstal·lar.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Aquest tema no és compatible amb aquesta versió de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Segur que vols desinstal·lar l'extensió seleccionada? La desinstal·lació es produirà la pròxima vegada que el programa s'executi.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Les extensions preinstal·lades no es poden desinstal·lar.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Aquesta extensió no és compatible amb aquesta versió de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Carpeta d'instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Carpeta de dades</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Generant paquet de diagnosi…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Pujant paquet de diagnosi…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Importar fitxer…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Què és això?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Segur que ho vols fer?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Temps total de joc</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Temps mitjà de joc</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Temps màxim de joc</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Mida total de la instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Resum</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Mostrar a la barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Restablir configuració</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Tota la configuració de l'aplicació es restablirà als seus valor per defecte, excepte:\r\n- La localització de la base de dades\r\n- La llista d'exclusió d'importació\r\n- La configuració d'extensions, incloses les integracions de biblioteques.\r\n    \r\nÉs necessari reiniciar l'aplicació per finalitzar el procés. Vols restablir la configuració?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Per a desenvolupadors</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Extensions externes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Introdueix la ruta completa de la carpeta.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Assoliments</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Fòrum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Noticies</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Pàgina de la botiga</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">La configuració inicial no s'ha completat. Playnite es reiniciarà en mode d'escriptori per a finalitzar el procés.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Jugat recentment</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Preferits</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">El més jugat</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Tots</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">S'han aplicat filtres.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">S'han aplicat filtres addicionals.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Mostrant resultats de la cerca per:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Ja existeix un element amb el mateix nom.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Limitar selecció al filtre actual</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Seleccionar un altre</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Complements…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Instal·lat</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Configuració d'extensions</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Exploració</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Actualitzacions</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Actualitzacions ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">La gestió d'extensions i temes instal·lats, incloent-hi la seva configuració, s'ha traslladat a un nou menú anomenat &quot;Complements&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Totes les extensions d'integració de biblioteques actualment instal·lades es poden configurar aquí.\r\n\r\nSi vols instal·lar o desinstal·lar integracions addicionals, pots utilitzar l'opció &quot;Complements&quot; del menú principal.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Temes (escriptori)</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Temes (pantalla completa)</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Cercant…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">El complement no és compatible amb aquesta versió de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">No s'ha pogut descarregar el paquet d'instal·lació del complement.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">No s'ha pogut descarregar el manifest d'instal·lació del complement.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">És necessari reiniciar l'aplicació per poder aplicar els canvis pendents.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Aquest complement té programada la seva instal·lació.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Instal·lar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Desinstal·lar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Ja instal·lat</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">No s'han trobat noves actualitzacions de complements.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Actualitzar complements</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">El registre de canvis no està disponible</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Té programada la seva instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">La descàrrega ha fallat</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">S'ha rebutjat la llicència</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Descarregant {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Cercant actualitzacions de complements...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Hi ha disponibles una o més actualitzacions de complements.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Selecciona els elements que vols actualitzar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Instància de desenvolupament d'extensió</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">Acord de llicència de {0}</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Acceptar</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Rebutjar</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Incloure accions de Jugar de la integració de la biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Selecciona una acció</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Mode de seguiment</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Ruta de seguiment</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Retard de seguiment inicial</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Freqüència de seguiment</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Enllaç</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Fitxer</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Script</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Per defecte</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Procés</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Carpeta</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Procés original</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Registrar missatges de seguiment</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Els següents canvis sobreescriuen les dades per tots els jocs actualment seleccionats!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Cap</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Només elements.</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Només inici i final</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Sensibilitat de desplaçament</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Desplaçament suau</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Velocitat d'animació</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Eliminar element?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Segur que vols eliminar aquest element?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Mostrar botons al panell superior:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Configuració de visualització general</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Configuració d'agrupament</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Configuració d'ordenació</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Predefinits de filtratge</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Posició dels elements de plugin</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Amplada del separador de secció</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Moure el botó del menú principal a la barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Panell d'exploració</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Selector de joc aleatori</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Selector de joc aleatori de vistes</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Seleccionar joc aleatori de la vista</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Desar la configuració d'agrupament i d'ordenació</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Mostrar com a filtre ràpid en el mode de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">En els darrers 7 dies</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">En els darrers 31 dies</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">En els darrers 365 dies</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Fa més de 365 dies</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Configurar</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Desar predefinit</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Minimitzar després d'iniciar el joc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Minimitzar Playnite després que s'iniciï un joc.\r\n\r\nDesactivar això pot portar problemes amb jocs que no rebin informació d'entrada a l'inici!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Mida de la font</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Mida de la font petita</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Compatibilitat amb comandament de jocs</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Si es desactiva, Playnite no acceptarà cap entrada de comandament de joc.\r\n\r\nDesactiva-ho si utilitzes eines que tradueixen les entrades de comandament de joc a les entrades ratolí/teclat i reps entrades dobles a Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Mostrar elements al menú principal:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Assignació dels botons X/A invertida a la vista principal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Intercanvia els botons per iniciar un joc i mostrar la pàgina de detalls del joc a la vista principal.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Intercanviar l'assignació de botons de confirmació/cancel·lació</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Inverteix l'assignació dels botons A/B per la confirmació i la cancel·lació.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Només el comandament primari</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Només acceptar entrades del comandament primari quan aquesta opció està activada.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">El botó Guia porta Playnite a primer pla</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Volum de la interfície</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Volum en segon pla</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Silenciar quan s'estigui en segon pla</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">No s'ha pogut iniciar la interfície d'àudio.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API de sortida</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API utilitzada per a la sortida d'àudio. Modifica-ho si tens problemes amb el so.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">General</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Visuals</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Àudio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Disposició</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menús</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Entrada</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} s'està iniciant...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} s'està executant…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Majúscules</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Espai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Escalador de renderització d'imatge</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternatiu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Equilibrat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Qualitat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Qualitat:\r\nLa millor qualitat d'imatge, lent, alt consum de memòria.\r\n    \r\nEquilibrat:\r\nBona qualitat, ràpid, baix consum de memòria.\r\n    \r\nAlternatiu:\r\nMillor qualitat, velocitat mitjana, baix consum de memòria.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Seleccionar fitxer...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Seleccionar carpeta...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Script d'inici</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Tingues en compte que tant les extensions com els temes poden afectar en gran manera el rendiment, l'estabilitat i la seguretat de Playnite.\r\n    \r\nSi comences a experimentar alguns problemes després d'instal·lar un tema o una extensió, prova primer de desactivar-los/desinstal·lar-los per veure si són l'arrel del problema.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Seleccionar a l'iniciar</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Seleccionar a l'iniciar</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Perfils integrats</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Perfil integrat</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Perfils personalitzats</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Perfil personalitzat</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Gestionat per un script incorporat</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Especificació d'emulador</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Especificació de plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Especificació de regió</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Executar abans d'iniciar l'emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Executar després que s'hagi iniciat l'emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Executar després de sortir de l'emulador</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">No s'ha trobat l'executable de l'emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">No s'ha trobat l'especificació de l'emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">No s'ha trobat l'script d'inici de l'emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Dividir com a jocs separats</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Fusionar en un joc</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Definir plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Definir regió</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Escanejar carpeta</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Escanejar configuracions</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Excloure patrons de l'escaneig de suma de verificació</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Els fitxers que coincideixin amb els patrons especificats no s'escanejaran per a la suma de verificació i es relacionaran amb el nom del fitxer. Visita la pàgina d'ajuda de l'emulador per a més informació.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Escanejar amb emulador</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">El nom s'ha de definir en desar la nova configuració.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">L'emulador o el perfil d'emulador no està definit.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">El directori a escanejar no està especificat o no existeix.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Els paràmetres d'escaneig no estan configurats correctament.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Incloure l'escaneig automàtic en l'escaneig massiu</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">No s'ha pogut escanejar la carpeta per cercar emuladors.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">No s'han pogut escanejar les carpetes per a cercar a jocs emulats.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Ocultar importats</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Perfils per importar:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Configuracions d'escaneig automàtic</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Desar com a configuració d'escaneig automàtic</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Desa la configuració per a la seva utilització posterior durant l'actualització de la biblioteca. Les configuracions desades es poden gestionar mitjançant el menú &quot;Configurar emuladors&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Importar mitjançant rutes relatives</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Si és possible, importar fitxers del joc mitjançant rutes relatives a la carpeta d'instal·lació de Playnite o la carpeta d'instal·lació de l'emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Escanejar subcarpetes</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Escanejar dins dels arxius</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Fusionar fitxers relacionats</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Fusionar fitxers del joc relacionats, com per exemple discs del joc individuals, sota una sola entrada del joc.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Afegir escàner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Afegir escàner desat</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Iniciar escaneig</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Afegir les configuracions d'escaneig amb emuladors per escanejar carpetes específiques. Assegura't que els emuladors estiguin configurats correctament abans d'importar jocs (mitjançant el menú Biblioteca -&gt; Configurar emuladors).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Estat per defecte assignat a jocs afegits recentment</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Estat assignat a jocs jugats per primer cop</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">No s'ha pogut iniciar el temps d'execució del script de PowerShell. Si ets usuari de Windows 7, prova de (re)instal·lar PowerShell 5.1 per resoldre el problema.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">El predefinit de filtratge amb el nom especificat ja existeix. Vols actualitzar el predefinit amb la nova configuració?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Aquestes paraules s'eliminaran del principi del valor de nom d'ordenació omplert automàticament:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Utilitza això per ignorar paraules al principi d'una cadena per propòsits d'ordenació. El valor per defecte és &quot;The&quot;, &quot;An&quot; i &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Omplir el nom d'ordenació de jocs sense un</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Ordenació</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Omplint valors de nom d'ordenació...</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">S'ha detectat que el servei Nahimic s'està executant al teu sistema. Se sap que aquest servei causa problemes de renderització a Playnite (i altres aplicacions).\r\n\r\nSi trobes alguna corrupció de gràfics o altres problemes de renderització a Playnite, es recomana desactivar o desinstal·lar completament el servei Nahimic.\r\n\r\nMés informació a https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite s'està executant amb privilegis elevats (com a administrador). Això no es recomana, ja que dóna privilegis elevats a totes les extensions instal·lades i a tots els jocs/aplicacions iniciats des de Playnite!\r\n\r\nMés informació a https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Mostrar avís si Playnite està funcionant amb privilegis elevats</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Obtenir la mida real en el disc dur quan es calculi la mida dels jocs</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Si s'activa, els escaneigs seran més lents i obtindran la mida real que els fitxers ocupen en la unitat.\r\nSi es desactiva, els escaneigs seran més ràpids i utilitzaran la mida dels mateixos fitxers.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">S'ha informat que els complements següents són potencialment problemàtics, ja sigui a causa de l'alt impacte en l'estabilitat/rendiment o per problemes de seguretat. Et recomanem que els desinstal·lis:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Excloure fitxers en línia de l'escaneig</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Els fitxers emmagatzemats al núvol no s'escanejaran i importaran si no estan disponibles de manera local.\r\nNomés és compatible amb Google Drive, DropBox i OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Escanejar, però utilitzant el mètode simplificat sense el contingut del fitxer</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">S'importaran els fitxers, però utilitzant un mètode menys precís que no requereix que el contingut dels fitxers es descarregui i estigui present de manera local.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Aplicar-ho a tots</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Ignorar l'estat de la instal·lació</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Si es defineix, Playnite ignorarà l'estat de la instal·lació (incloent-hi el directori d'instal·lació) establert pel plugin d'integració que importa aquest joc.\r\n        \r\nAquesta opció podria no funcionar completament amb plugins que utilitzen un mètode específic d'importació de jocs, a menys que també tinguin en compte aquesta opció d'ignorar.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Només manualment</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Un cop al dia</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Un cop per setmana</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">A cada inici</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Cercar actualitzacions del programa</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Cercar actualitzacions de complements</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Actualitzar biblioteques</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Escanejar carpetes d'emulació</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Incloure jocs ocults</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Editar els camps</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Seleccionar/Desseleccionar-ho tot</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Obrir</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Activar</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Asignar</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Comença a teclejar per a cercar jocs... [F1] per ajuda</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Començar amb # mostra una llista de les ordres disponibles.\r\nComençar amb / mostra una llista dels proveïdors/plugins de cerca disponibles.\r\nComençar teclejant la paraula a cercar i acabant amb ESPAI canvia immediatament a aquella cerca.\r\n\r\nTABULADOR: Canviar acció\r\nENTER: Activar l'acció seleccionada\r\nMAJÚSCULES-ENTER: Obrir menú d'elements</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Incloure jocs desinstal·lats</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Incloure jocs ocults</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Jocs desinstal·lats inclosos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Jocs desinstal·lats exclosos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Jocs ocults inclosos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Jocs ocults exclosos</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Jugar o instal·lar</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Anar als detalls</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Menú del joc</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Editar joc</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Obrir cerca</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Quadre de cerca</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Botó de cerca</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Acció principal del joc</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Acció secundària del joc</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F obre la cerca global en lloc d'activar el quadre de cerca</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Desar configuració de filtratge de jocs entre sessions de cerca</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Proveïdors de cerca</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Paraula clau per defecte</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Paraula clau personalitzada</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Drecera global del sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Cerca de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Configuració de l'extensió</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Exclusions</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Fitxers exclosos relatius a la carpeta d'escaneig</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Carpetes excloses relatives a la carpeta d'escaneig</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Afegir fitxer a la llista d'exclusions</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Afegir carpeta a la llista d'exclusions</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Les exclusions només es poden afegir a configuracions desades de l'escàner.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">S'han afegit exclusions a l'escàner &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Substituir plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Si es defineix, l'escàner assignarà aquesta plataforma a tots els jocs, sobreescrivint qualsevol altra plataforma que es detecti automàticament.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Incloure ordres a la cerca per defecte</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Si es desactiva, les ordres no s'inclouran en la casella de cerca fins que s'utilitzi el prefix #.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Utilitzar una coincidència aproximada en el filtre de noms</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Si s'activa, el filtre de noms coincidirà amb els noms dels jocs de la mateixa manera que la cerca global.\r\nEs pot aplicar una coincidència estricta en un cas individual afegint el prefix &quot;!&quot; al filtre.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Camps que es mostraran per als resultats de jocs:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Estat ocult</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">S'ha cancel·lat la còpia de seguretat de les dades.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Ha fallat la còpia de seguretat de les dades.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Error de còpia de seguretat de dades</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Còpia de seguretat de les dades en progrés...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">S'estan restaurant les dades a partir de la còpia de seguretat...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">No s'han pogut restaurar les dades a partir de la còpia de seguretat.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Configuració</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Biblioteca de jocs</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Multimèdia de la biblioteca de jocs</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Extensions instal·lades</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Dades d'extensions</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Temes instal·lats</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Selecciona les dades a restaurar des del fitxer de còpia de seguretat especificat.\r\n    \r\nPlaynite es reiniciarà automàticament per iniciar el procés de restauració de la còpia de seguretat.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Selecciona els elements per incloure a la còpia de seguretat de les dades. La configuració de l'aplicació i les dades de la biblioteca de jocs s'inclouen per defecte.\r\n    \r\nPlaynite es reiniciarà automàticament per iniciar el procés de còpia de seguretat.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Còpia de seguretat de dades automàtica</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Freqüència de la còpia de seguretat automàtica</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Carpeta de còpies de seguretat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Rotació de còpies de seguretat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Incloure dades addicionals:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">És necessari definir la carpeta de còpia de seguretat si està activada la còpia de seguretat automàtica.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Mostra notificacions només per a llançaments de petites actualitzacions</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Si s'activa, només les actualitzacions disponibles per a la versió principal instal·lada actualment mostraran una notificació d'actualització.\r\nLes noves versions principals no mostraran una notificació d'actualització.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Utilitzar dates relatives per la setmana passada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Utilitzar dates relatives en format &quot;Avui&quot;, &quot;Ahir&quot;, etc. si la data és inferior a una setmana.\r\n    \r\nEl format de data especificat s'utilitzarà per a les altres dates.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Cerca d'imatges web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Cadena de cerca de la imatge d'icona</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Cadena de cerca de la imatge de caràtula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Cadena de cerca de la imatge de fons</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Obtenint informació del complement...</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">No hi ha una font de metadades disponible</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Configuració de l'acció de Jugar</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Utilitzar configuració de l'escàner</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Seleccionar perfil en iniciar</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Seleccionar emulador en iniciar</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automàtic</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Sempre activat</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Sempre desactivat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Compatibilitat d'accessibilitat (lector de pantalla)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Menú d'aplicació</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Menú del joc</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Carpeta del programa</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Directori de dades de l'usuari</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">S'ha detectat un fitxer de la biblioteca danyat. Playnite ara es tancarà.\r\n    \r\nObre una nova incidència a la pàgina de GitHub de Playnite amb una sol·licitud per corregir els teus fitxers danyats.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Vols desar els canvis que has fet?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Instal·lació portàtil</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">No s'han detectat comandaments</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/cs_CZ.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Čeština</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Jazyk Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Ukončit</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtr Aktivován</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtr Deaktivován</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Dodatečné filtry</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtry</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtr</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Neplatná Data</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Uložit změny?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Domovská stránka na www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Zdrojový kód na GitHubu</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Vytvořit diag. balíček</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Odeslat diagnostické informace</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">O Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Vytvořil Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Přidělit Kategorii</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Nastavit Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Přidat Kategorii</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Zaškrtnuto - Přiřadit kategorii\r\nNezaškrtnuto - Odstranit kategorii\r\nNeurčen - Žádné změny (při úpravách více her)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Bez Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Bez Platformy</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Jejda! Něco se pokazilo...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Nastala závažná chyba.\r\n        \r\nPokud nám chcete pomoci chybu opravit, prosím krátce popište Váš postup před tím, než program spadl, a poté odešlete diagnostické informace. Pokud jste připojeni k internetu, tento balíček bude nahrán na server Playnite k analýze.\r\n\r\nAlternativně můžete použít tlačítko 'Nahlásit pád' pro vytvoření hlášení na GitHubu a nahlásit chybu manuálně.\r\n\r\nDěkujeme za pomoc.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Rozšíření &quot;{0}&quot; způsobilo závažnou chybu.\r\n\r\nDoporučujeme uložit diagnostické soubory a nahlášení problému jejímu vývojáři. Pokud tento problém přetrvává, rozšíření zakažte.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Rozšíření &quot;{0}&quot; způsobilo závažnou chybu.\r\n\r\nDoporučujeme nahlásit problém jejímu vývojáři. Pokud tento problém přetrvává, rozšíření zakažte.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Neznámé rozšíření nebo motiv způsobily neopravitelnou chybu.\r\n\r\nDoporučujeme zakázat všechna rozšíření třetích stran, izolovat problematické rozšíření a nahlásit problém jeho vývojáři.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Nastala závažná chyba.\r\n        \r\nPokud nám chcete pomoci tento problém opravit, odešlete prosím diagnostické informace. Děkujeme.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Zakázat rozšíření</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Uložit log soubory</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Odeslat diag. info</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Nahlásit Pád</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Restartovat Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Restartovat v Bezpečném Režimu</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Zakazuji všechna rozšíření třetích stran a používám výchozí motiv.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Opustit Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Akce provedené před pádem programu (v angličtině):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Správce Knihovny</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Odstranit Hru(y)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Nelze odstranit - Hra nebo instalátor běží. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Nelze odinstalovat - Hra je spuštěná.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Opravdu chcete odstranit {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Opravdu chcete odstranit {0} her?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Opravdu chcete odstranit {0}?\r\n\r\nZvolení &quot;přidat do seznamu výjimek&quot; bude hru ignorovat při budoucích aktualizací knihovny.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Opravdu chcete tuto odstranit {0} her?\r\n\r\nZvolením možnosti &quot;přidat do seznamu výjimek&quot; hry vyjmete z příštích aktualizací knihovny.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Jste si jisti, že chcete odstranit {0} záznamů, které nejsou současně používané?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Žádná nepoužitá pole nebyla nalezena.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Ano (přidat do seznamu výjimek)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">V této sekci jsou neuložené změny</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Aktualizace formátu herní knihovny…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Aktualizace databáze selhala.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Nelze aktualizovat knihovnu her. Je třeba {0} MB volného prostoru.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Chyba hry</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Nelze spustit hru. '{0}' se nenachází v databázi.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Nelze spustit hru: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Nelze spustit akci: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Nelze otevřít umístění hry: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Nelze zjistit velikost instalace hry: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Chyba při skenování velikosti instalace</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Při prohledávání velikosti instalace došlo k {0} chybám</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Nepodařilo se vytvořit zástupce: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Selhalo otevření Příručky: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Nelze nainstalovat hru: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Nelze odinstalovat hru: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Nebyly nalezeny žádné spouštěcí akce hry. Používáte-li emulátorové akce, ujistěte se, že definice platformy jsou stejné v konfiguraci hry i emulátoru.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Instalační funkce není dostupná.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Plugin knihovny, která je zodpovědná za tuto hru, není nainstalován či povolen.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Stažení oficiálních metadat není k dispozici.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Není vybrána žádná hra.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Spuštění skriptu hry selhalo.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Spuštění skriptu aplikace selhalo.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Spuštění globálního skriptu selhalo.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Spuštění emulačního skriptu selhalo.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Spuštění skriptu akce Hrát selhalo.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 nebo novější není nainstalován.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Nepodařilo se určit postup kterým hru spustit.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Povoleno</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Zakázáno</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Odstranit</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Odstranit nepoužité</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Přejmenovat</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopírovat</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Přidat</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Výchozí Ikona</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Výchozí Obrázek Obalu</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Výchozí Obrázek na Pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Dokončit</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Další</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Zpět</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">HOTOVO</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">ZPĚT</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">VYČISTIT</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Vyčistit</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Zrušit</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Zrušit vše</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importovat</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Jméno</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Série</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Verze</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Naposledy Hráno</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Nejvíce Hráno</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Počet Zahrání</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Velikost instalace</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Složka</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Poznámky</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Přidáno</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Datum Přidání</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Změněno</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Datum Změny</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Webová stránka</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Cesta</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Uložit</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Zavřít</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Zrušit</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Potvrdit</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Obnovit</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Ano</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Ne</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Vítejte</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Místní Uživatel</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Obecné</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Média</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Odkazy</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Instalace</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Akce</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Stahování…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Stahování médií...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Načítání…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Typ</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profily</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Odstranit</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Stáhnout</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Hledat</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Rozlišení:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Všechny</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Přiblížení</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Zobrazení Seznamu</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Obaly</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Zobrazení Mřížky</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Zobrazení Podrobností</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Vlastní</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Zvláštní poděkování</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licence</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Přispěvatelé</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Zavírání Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Dnes</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Včera</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Pondělí</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Úterý</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Středa</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Čtvrtek</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Pátek</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Sobota</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Neděle</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Minulý Týden</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Minulý Měsíc</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Za poslední Rok</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Před více než rokem</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 až 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB až 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB až 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB až 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB až 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB až 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB až 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB nebo více</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Import úspěšně dokončen.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Všechny Hry</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ID Hry</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">ID Databáze</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Předvolby</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Sloupec</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Sloupce</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Řádek</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Řádky</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Nelze získat ikonu z akce Hrát. Není nastavena žádná akce typu &quot;Soubor&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Stáhnout pouze chybějící metadata</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Povolení této možnosti způsobí, že se přeskočí stahování metadat pro datová pole, která už informace obsahují.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Výběr her</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Prosím vyberte, které hry by měly být aktualizovány o nová metadata:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Všechny hry v databázi</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Všechny aktuálně filtrované hry</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Jen vybrané hry</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Nejsou vybrána žádná pole metadat</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Nejsou vybrána žádná pole metadat ke stažení. Vyberte prosím alespoň jedno a povolte pro ně alespoň jednoho poskytovatele metadat.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Oficiální Obchod</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Prosím vyberte, která pole by měl Playnite automaticky doplnit a které zdroje by měly být použity k získání těchto údajů.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Prosím zvažte přispění aktualizacemi do databáze igdb.com (kliknutím na logo výše), čímž zlepšíte data, která Playnite používá.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Stahují se metadata…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importují se instalované hry…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importují se hry z platformy {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importují se emulované hry z {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Stahují se aktualizace knihoven…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Vypočítaní velikosti her v knihovně…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Vypočítaní velikosti importovaných her…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Aktualizace knihovny dokončena</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Uvolňují se zdroje…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Konfigurace</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Nastavení…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platformy a Emulátory</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Nastavit Emulátory…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Správce Knihovny…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Nástroje</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Stáhnout Metadata…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Softwarové Nástroje...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Nastavit Integraci...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Otevřít Klienta Třetí Strany</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Klienty Třetích Stran</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Aktualizovat Herní Knihovnu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Zrušit Aktualizaci Knihovny</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Aktualizovat Emulované Adresáře</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Přidat Hru</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Ručně…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Automaticky Skenovat…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emulovaná Hra…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store aplikace…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">O Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Odeslat Zpětnou Vazbu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Přepnout do Celé Obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Odkazy</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Nápověda</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Podpořit na Patreonu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Podpořit na Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Uživatelská příručka</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Dokumentace SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Restartovat Systém</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Vypnout Systém</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Uspat Systém</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernovat Systém</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Uzamknout Systém</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Odhlásit Uživatele</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Vybrat Náhodnou Hru</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Pole k zobrazení na panelu detailů:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Mezery mezi položkami</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Vykreslovat pozadí položek v mřížce</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Šířka ohraničení položky v mřížce</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Pro chybějící zdroj ikony hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Pro chybějící zdroj obálky hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Pro chybějící zdroj pozadí hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Vertikální odsazení podrobností o hře</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Pozice detailů v zobrazení mřížky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Pozice seznamu her v zobrazení detailů</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Vykreslovat oddělovač mezi panely</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Výška obrázku obálky hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Výška ikony v seznamu her</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Písmo aplikace</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Neproporcionální písmo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Pozice panelu s filtry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Pozice panelu průzkumníka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Vykreslování obrázků obálek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Cílový poměr stran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Následující možnosti také ovlivňují vykreslování dlaždic v režimu Celé Obrazovky!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Způsob roztáhnutí</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD Box</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Čtverec</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam Banner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Vertikální Steam obal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Toto nastavení se projeví až po restartu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Nastavení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Obecné</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Horní panel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Vzhled</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Detaily hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Rozložení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Pokročilé</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Celá Obrazovka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Vstup</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Výkon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Aktualizování</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Hledat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Zálohovat</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Zálohovat data knihovny</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Obnovit zálohu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importovat změny v knihovně automaticky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Chybné umístění souboru databáze, nastavte správné umístění.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Název účtu nemůže být prázdný.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Stáhnout metadata po importu her</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Spustit Playnite minimalizovaný</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Spustit Playnite při přihlášení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Spustit zavřeno do lišty</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Nepodařilo se zaregistrovat Playnite pro start při spuštění počítače.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Spouštět v režimu Celé Obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asynchronní načítání obrázků</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Může zlepšit plynulost skrolování v seznamech her, ale obrázky se načítají pomaleji.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Zobrazit jméno hry, pokud chybí obrázek obálky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Zobrazit jména her v zobrazení mřížky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Ztmavit nenainstalované hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Zobrazit ikony her v režimu zobrazení podrobností</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Zobrazit počty položek v popiscích skupin</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Ukazovat pouze přiřazená pole ve filtrovacím a průzkumném panelu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Zakázat hardwarovou akceleraci</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Použijte pokud se setkáváte se sekáním či podobnými problémy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Ukazovat skryté hry v seznamech rychlého spuštění</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Ovlivní systémovou lištu a tlačítko aplikace v hlavním panelu.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Počet položek v rychlém spuštění</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Použít obrázek pozadí hry jako pozadí celého okna</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Rozostřit pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Vysoká Kvalita</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Ztmavit pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Zobrazit v Zobrazení mřížky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Motiv Vzhledu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Profil Motivu Vzhledu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Motiv režimu Celé Obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Profil Motivu režimu Celé Obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Umístění Databáze</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Stav přihlášení:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Natavení Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Vymazat webovou mezipaměť</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Může vyřešit problémy při propojování účtů.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Zobrazit ikonu v systémové liště</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimalizovat Playnite do systémové lišty</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimalizovat Playnite do systémové lišty když je okno aplikace uzavřeno</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Při spuštění hry:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Po ukončení hry:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Zobrazit odehraný čas jako počet dnů</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Formát datumu:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Tato akce Vás odhlásí ze všech propojených služeb. Je vyžadován restart aplikace. Chcete pokračovat?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Vyčistit Mezipaměť?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Pro změnu vzhledu je třeba restartovat Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Získat více motivů</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Vytvořit nový motiv</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Získat více rozšíření</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Vytvořit nové rozšíření</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Pomozte nám přeložit Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite musí být restartován pro aplikování nových nastavení. Restartovat nyní?\r\n\r\nRestartování zruší všechny aktivní úlohy (stahování), které právě běží.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Restartovat Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite nemůže přesouvat soubory knihovny automaticky. Musíte je přesunout (či zkopírovat) sami, než umístění knihovny změníte. Pokud v cílovém umístění není žádná knihovna, bude tam vytvořena nová.\r\n\r\nNové umístění databáze nebude použito do restartu aplikace. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Čas hraní nebude zaznamenáván pokud je nastavena akce &quot;Zavření&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Počet řádků</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Počet sloupců</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Počet řádků v zobrazení detailů</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Zobrazit Obrázek Pozadí na Hlavní Obrazovce</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Neaplikuje se zpětně na hry co už existují - pro ty je třeba znovu stáhnout metadata.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importovat dobu hraní her v knihovně:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Konfiguruje kdy Playnite importuje dobu hraní pomocí pluginů pro hry v databázi Playnite. Pro použití této funkce je třeba podporovat pluginy, které mají na starosti manipulaci se hrou.\r\n\r\nVždy: Importuje čas pro nově importované i existující hry v databázi Playnite.\r\nPouze pro nově importované: Importuje čas pouze pro nově importované hry.\r\nNikdy: Za žádných okolností neimportovat čas hraní.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Vždy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Pouze pro nově importované</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Nikdy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Povolit podporu ovladače v režimu Plochy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Tlačítko Guide otevírá režim Celé obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Automatické stažení metadat pro nově importované hry.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Cílový displej</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Vždy používat primární displej</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Zobrazit Názvy Her</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Zobrazit Stav Baterie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Zobrazit Stav Baterie v Procentech</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Zobrazit Hodiny</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Skrýt Kurzor Myši</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Pouze nainstalované hry v Rychlých Filtrech</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Popisky Tlačítek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Rozložení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Horizontální Skrolování</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Vyberte jednu z podkategorií</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Nejsou dostupná žádná nastavení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Nepodařilo se načíst nastavení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Tyto skripty jsou spuštěny pro každou hru v knihovně. Jednotlivé skripty můžou být přiřazeny ke každé hře zvlášť, v úpravách detailů hry.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animovat přechody mezi obrázky na pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Velikosti písma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automaticky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Vyhlazené</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Černobíle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideální</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Obrazovka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Režim formátování textu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Režim vykreslování textu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Nastavení vykreslování a formátování textu v současnosti neovlivní text popisků her.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Přednačítat obrázky na pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Pokud je zapnuto, Playnite stáhne obrázky na pozadí při stahování metadat. Bude použito více místa na disku a obrázky budou dostupné offline.\r\n        \r\nPokud není povoleno, obrázky na pozadí jsou staženy jen když jsou potřeba. Je použito méně místa na disku, ale před zobrazením obrázku na pozadí může dojít k prodlevě a některé obrázky nemusejí být dostupné offline.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Automaticky zavřít klienta třetí strany po ukončení hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Zpozdění vypnutí klienta (v sekundách)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Nezavírat klienta pokud je herní doba kratší než (v sekundách)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Automaticky zavřít tyto klienty:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Automatické Ukončení Klientů</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Seznam Výjimek z Importu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Zobrazit varování při přidávání extrémně velkých herních medií</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Příkaz pro otevření adresáře</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Preferovaná organizace věkového omezení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Aktualizovat velikost nainstalovaných her při aktualizaci knihovny</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Vypočítá a aktualizuje velikost nainstalovaných her, pokud je detekováno, že jejich soubory byly změněny od posledního skenování</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Žádný</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Vyplnit</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Jednotně</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Jednotně vyplnit</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Vlevo</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Vpravo</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Nahoře</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Dole</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Chyba importu</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Vyžaduje se přihlášení</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Přihlášení se nepodařilo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Alternativní vykreslování webového obsahu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Použijte pokud se setkáváte s problémy s webovým obsahem, například přihlašovací okna pro integrace.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Částečné načítání velkých popisů hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Velké popisy hry můžou způsobit znatelné zpoždění při výběru hry.\r\n\r\nPokud je povoleno, bude zpočátku načtena pouze část textu popisu s možností načíst zbytek na vyžádání.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Import Metadat</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Stáhnout Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Použít vybraná nastavení při příštím stahování metadat\r\nLze také změnit v nastavení aplikace.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Průvodce Importem Emulátoru</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Tento průvodce Vás provede procesem stahovaní a importovaní konzolových emulátorů, a importováním emulovaných her.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Mějte na paměti, že později můžete vždy přidat další emulátory a/nebo hry prostřednictvím hlavního menu (v menu &quot;Nástroje&quot; pro nastavení emulátorů, a &quot;Přidat hry&quot; pro emulované hry).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Níže je seznam emulátorů, které Playnite dokáže rozpoznat a automaticky nastavit. Instalační programy emulátorů můžete stáhnout z jejich stránek. Až budete mít emulátory manuálně nainstalované, můžete je importovat v dialogu nastavení emulátorů.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Můžete importovat jakékoli emulátory které jsou nainstalované na Vašem počítači kliknutím na tlačítko 'Autodetekce Ze Složky...'. Playnite prohledá zvolenou složku a vyhledá jakékoli známé emulátory a poskytne možnost je importovat. Toto tlačítko může použít několikrát pro importování emulátorů z různých složek. Emulátory budou přidány do dolní části aktuálního seznamu.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Hry můžete importovat pomocí stisknutí tlačítka 'Skenovat složku pomocí Emulátoru'. Vybráním odpovídajícího emulátoru uvědomí Playnite o tom, které typy souborů by měly být skenovány a importovány. Toto tlačítko může použít několikrát pro import her z různých složek. Hry budou přidány do dolní části aktuálního seznamu.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Nejsou zvoleny žádné emulátory pro import. Bez nastavení emulátorů nelze automaticky importovat emulované hry. Jste si jisti, že chcete pokračovat a ukončit proces importu?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">V Playnite nejsou nastaveny žádné emulátory. Nemůžete importovat hry, dokud nejprve nenastavíte emulátor a nevybere příslušné typy souborů. Chcete nyní přidat emulátory?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Skenovat složku pomocí Emulátoru</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Vybrat soubory</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Autodetekce Ze Složky...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Nastavit Emulátory…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Skenování…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Skenuji {0}...</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Úvodní Nastavení</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Tento průvodce Vás provede automatickým importem a procesem nastavení externích herních knihoven. Playnite může automaticky importovat hry z více herních služeb, jako je Steam nebo GOG.\r\n\r\nMějte na paměti, že můžete později manuálně přidat jakoukoli vlastní hru pro jakoukoli platformu kliknutím na tlačítko 'Playnite' v hlavním menu.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integrace Knihovny</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Níže je seznam některých vybraných integrací knihoven které Playnite podporuje. Prosím vyberte ty které chcete nainstalovat.\r\n\r\nVíce integrací můžete nainstalovat později z nabídky &quot;Rozšíření&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Konfigurace Dokončena</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Počáteční nastavení bylo dokončeno. Pamatujte, že všechna nastavení a dodatečné integrace můžete vždy upravit z hlavní nabídky.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Nepodařilo se stáhnout jedno či více rozšíření.\r\n\r\nMůžete se pokusit znovu stáhnout integrace z nabídky rozšíření až skončí nastavení při prvním spuštění.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Stahuji integraci {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Stahování seznamu doporučených integrací…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Nepodařilo se stáhnout seznam doporučených integrací. Můžete zkusit stáhnout integrace znovu pomocí menu doplňků.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Nastavit Platformy a Emulátory</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Nastavit Emulátory</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platformy</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulátory</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulátor</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Přidat Platformu</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Vybrat Ikonu</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Vybrat Obálku</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Vybrat Obrázek</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Vybrat Položku</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Vybrat Pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Vybrat Soubor</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Vybrat adresu URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Přidat Emulátor</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Podporovaná Platforma(y)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Chcete uložit změny v platformách?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Chcete uložit změny v emulátorech?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Spustitelný soubor</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumenty</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Pracovní Adresář</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Podporované Formáty Souborů</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importovat Emulátory…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Stáhnout Emulátory…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Načíst předvolby argumentů ze známých profilů emulátorů</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Opravdu chcete odstranit emulátor {0}?        \r\nSoučasně ho využívá {1} her.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Opravdu chcete odstranit platformu {0}?        \r\nSoučasně ji využívá {1} her a {2} emulátorů.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Nápověda k nastavení</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Seřadit Podle</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Směr řazení</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Seskupit Podle</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Vzestupně</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Sestupně</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Neseskupovat</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Seskupit podle Knihovny</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Seskupit podle Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Seskupit podle Platformy</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Typ Zobrazení</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Zobrazení</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Panel Průzkumníka</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Panel Filtrů</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ikona</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Ikona knihovny</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Obrázek na Obalu</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Obrázek na Pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Jméno, dle kterého řadit</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Knihovna</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Příručka</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Jméno</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Disk instalace</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Název Účtu</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platforma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Žánr</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Datum Vydání</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Rok Vydání</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Vývojář</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Štítek</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Vydavatel</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Stav Instalace</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Shrnout všechny filtry</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Je-li zapnuto, v pohledu budou zahrnuty jen ty položky, které splňují všechny zadané filtry.\r\nJe-li vypnuto, budou zobrazeny položky, které splňují alespoň jeden filtr.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Instalováno</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Instalováno</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Nenainstalováno</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Skrytý</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Oblíbený</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Zapnout podporu HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Je-li povoleno, bude HDR povoleno na primárním displeji před spuštěním hry.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Upozorňujeme, že HDR není podporováno na vašem primárním displeji.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Naposledy Hráno</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Popis</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Instalační Adresář</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Obrázek na Obalu</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Odkazy</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Cesta k Obrazu, ROM nebo ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Žánr</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Žánry</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Společnost</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Společnosti</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Vývojář</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Vývojáři</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Vydavatel</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Vydavatelé</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Štítek</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Štítky</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Vlastnost</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Vlastnosti</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Věkové Omezení</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Věková Omezení</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Region</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regiony</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Zdroj</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Zdroje</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Nedávná aktivita</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Chyba databáze</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Nepodařilo se otevřít databázi knihovny.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Databáze není otevřena.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Nelze přistoupit k databázi knihovny. Soubor &quot;{0}&quot; je používán jiným procesem, nebo je v nedostupném umístění.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Nepodařilo se vytvořit diagnostický balíček.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Nepodařilo se automaticky nahrát diagnostický balíček.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Diagnostické informace byly úspěšně odeslány.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Diagnostický balíček byl vytvořen a úspěšně odeslán.\r\nK hlášení problému, prosím, připojte následující ID:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Nepodařilo se importovat hry z {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Nepodařilo se importovat emulované hry z {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Nelze vyhledat hry podle vybraného profilu emulátoru, protože neobsahuje žádné přípony souborů nebo platformy.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite se nepodařilo spustit. Prosím zavřete všechny ostatní instance Playnite a zkuste to znovu.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Nelze aplikovat motiv &quot;{0}&quot; s barevným profilem &quot;{1}&quot;\r\n        \r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Nelze otevřít adresu, URL není platného formátu.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Nepodařilo se spustit aplikaci.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Chyba při spuštění komponentu web vize. Playnite nemůže pokračovat ve spouštění.\r\n\r\nPro více informací navštivte: https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Nelze importovat emulátory z důvodu chybějícího nebo poškozeného definičního souboru.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Nepodařilo se spustit menu akci.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Upravit Detaily Hry</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL obrázku</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Přidat Odkaz</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Přidat ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Uložit Změny</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Aplikovat změny polí pro hru (hry) které jsou upravovány.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Přidat Akci</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Odstranit Akci</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Odstranit Akci Hrát</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Přidat Hry</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Skenovat Adresář…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Detekovat Nainstalované</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Procházet…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Otevřít Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Natavení Profilu</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Jméno hry nemůže být prázdné.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Složka sledování pro akci hry nemůže být prázdná.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Před vyhledáním metadat je třeba doplnit název hry.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Neplatné údaje u hry</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Vložte platný formát adresy URL začínající http:// nebo https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Vybrat adresu URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Selhalo stahování metadat: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Chyba při Stahování</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Zrušit Filtry</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Soukromý účet</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Veřejný Účet</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API Klíč</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Chyba při Spouštění</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Chyba Motivu Vzhledu</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Vymazat Vše</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Probíhá instalace</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Probíhá odinstalace</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Spouštění</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Spuštěno</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Neplatná URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Nedělat nic</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimalizovat</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Obnovit okno</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Obnovit okno pouze při spuštění z uživatelského rozhraní</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Zavřít</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Změnit</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Pokročilé</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Nikdy</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Stav Dokončení</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Stavy dokončení</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Hodnocení Uživatelů</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Hodnocení Recenzentů</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Hodnocení Komunity</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Skripty hry</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Skripty aplikací</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Skripty</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Pluginy</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Zdroje Metadat</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Rozšíření</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID Rozšíření </sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Znovu načíst Skripty</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Interaktivní PowerShell SDK</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Všechny skripty se úspěšně znovu načetly.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">V rámci zadaných kritérií nebyla nalezena žádná odpovídající hra</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Žádné položky nenalezeny</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Přepnout do režimu Plochy</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Opustit Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Knihovny</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Aktualizovat Vše</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Vytvořil:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Verze:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Aktualizováno:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Knihovna</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistiky</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Vše</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Nic</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Oznámení</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Šířka</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Výška</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Velikost</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Malý</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normální</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Velký</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Větší</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Největší</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Výchozí</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Vybrat</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Vybrat Vše</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Zrušit výběr všech</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">První</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Náhodně</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Zadat uživatelem</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Načíst více</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Průhledné</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Sbalit</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Rozbalit</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Sbalit Vše</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Rozbalit Vše</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Ostatní</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Motivy</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Argumenty Emulátoru</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Vestavěné Argumenty</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Vlastní Argumenty</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Dodatečné Argumenty Emulátoru</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Nahradit Argumenty pro Emulátor</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Akce Hrát</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Vyberte metadata k importovaní</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Vyberte Hry pro Import</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Hledání metadat</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Dostupná Aktualizace</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Změny od poslední aktualizace</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Stáhnout a Nainstalovat Aktualizaci</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Zkontrolovat Aktualizace</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Chyba Aktualizace</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Nepodařilo se zkontrolovat aktualizace.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Nebyla nalezena novější verze, vaše verze je aktuální.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Nepodařilo se stáhnout a nainstalovat aktualizaci.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Nějaká úloha na pozadí stále běží. Chcete ji zrušit a pokračovat s aktualizací?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Nějaká úloha na pozadí stále běží. Chcete jí zrušit a ukončit Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Nějaká úloha na pozadí stále běží. Změnou režimu bude zrušena, chcete i přesto změnit režim?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Aktualizace pro Playnite je dostupná</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Obnovit seznam motivů vzhledu</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Použít vybraný motiv vzhledu</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Sledovat změny souboru</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Automaticky aplikovat motiv vzhledu, když se zdrojový soubor změní</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Běhové prostředí skriptů</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Provést před spuštěním hry</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Provést po ukončení hry</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Provést po spuštění hry</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Spustit při startu aplikace</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Spustit při zastavení aplikace</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Hra spouští skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Hra spustila skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Hra zastavila skript</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Spustit globální skript</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Globální</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrované</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Současné</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Nové</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Testovat skript</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Zobrazit pouze zvolené předměty.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Uložit jako výchozí</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Přidat do Oblíbených</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Odstranit z Oblíbených</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Skrýt tuto hru</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Odstranit ze Skrytých</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Zapnout podporu HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Vypnout podporu HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Upravit…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Vypočítat velikost instalace</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Vypočítat velikost instalace (všechny hry)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Vypočítat velikost instalace (pouze chybějící data)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Velikost instalace</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Nastavit Kategorii…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Nastavit Stav Dokončení</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Odstranit</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Hrát</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Instalovat</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Možnosti Hry</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Podrobnosti</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Odinstalovat</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Otevřít Umístění Instalace</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Vytvořit Zástupce na Ploše</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Otevřít Příručku</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Více</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Spravováno pomocí pluginu knihovny</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Proces spuštení hry bude ovládán knihovnou pluginu odpovědným za tuto hru.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Žádné informace o hře '{0}' nebyly na zadané stránce nalezeny.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Tip: Můžete použít pokročilejší stažení metadat, pokud hru upravujete pomocí položky &quot;Upravit&quot; v menu.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Není dostupné když probíhají jiné akce.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">V popisku lze uplatnit značky HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Herní čas je počítán v sekundách.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Velikost instalace je uvedena v bajtech.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Datum vydání musí být ve formátu 'rok-měsíc-den'. Hodnoty pro měsíc a den můžou být vynechány.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Hodnoty od 0 do 100, případně prázdné pokud skóre není.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Vývoj Playnite podporují tito patroni a členové Ko-fi:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Kód, lokalizace a další přispěvatelé, nijak neseřazeno:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Zrušit monitorování hry?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Monitorování instalace právě běží. Chtete tento proces zrušit a vrátit hru do předchozího stavu?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Monitorovaní spouštění hry právě beží. Chtete tento proces zrušit a vrátit hru do předchozího stavu?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Odehraný Čas</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Naposledy Hráno</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}d {1}h {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minut</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} sekund</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Zatím Nehrané</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Otevírání režimu Plochy…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Otevírání režimu Celé Obrazovky…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Načítání herní knihovny…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Vypočítání velikosti instalace…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Vypočítání velikosti instalace {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Instalace souboru skriptu se nepodařila.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Skript byl úspěšně nainstalován.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Nainstalovat Skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Chyba Skriptu</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Nepodařilo se spustit funkci rozšíření.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Otevřít složku metadat</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Vypočítat</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Automaticky vypočítává velikost instalace podle přiřazených ROMů, pokud hra nějaké má, nebo podle instalačního adresáře</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">Klient {0} není nainstalován.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Klient {0} bude nyní otevřen, prosím přihlaste se a poté tuto zprávu zavřete.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Čekám na přihlášení uživatele, zavřete prosím toto okno, až budete hotovi...</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Instalační adresář hry nebyl nalezen.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Neplatné nastavení akce hry.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Řešení problémů se synchronizací účtu</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Řešení potíží</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Přejmenovat položku</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Přidat novou položku</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Zadejte název</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Zadejte nový název</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Méně než hodina</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 až 10 hodin</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 až 100 hodin</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 až 500 hodin</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 až 1000 hodin</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite musí být restartován pro dokončení instalace. Chcete nyní restartovat?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Rozšíření není správně zabaleno.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Motiv není správně zabalen.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Rozšíření &quot;{0}&quot; se nepodařilo správně načíst.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Nelze načíst rozšíření &quot;{0}&quot;, současná verze Playnite není podporována.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Motiv &quot;{0}&quot; se nepodařilo správně načíst.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Nelze načíst motiv &quot;{0}&quot;, současná verze Playnite není podporována.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Rozšíření se nepodařilo správně načíst.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Motiv se nepodařil správně načíst.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Motiv Vzhledu/Rozšíření používá nepodporovanou verzi API.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Instalace byla úspěšná.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Nainstalovat rozšíření?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Obecné</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Selhala instalace rozšíření &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Nepodařilo se nainstalovat rozšíření.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Chcete nainstalovat nové rozšíření?\r\n\r\n{0}\r\nOd {1}\r\nVerze {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Chcete aktualizovat rozšíření &quot;{0}&quot;?\r\n\r\nSoučasná verze: {1}\r\nNová verze: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Nepodařilo se nainstalovat motiv.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Chcete nainstalovat nový motiv?\r\n\r\n{0}\r\nOd {1}\r\nVerze {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Chcete aktualizovat motiv &quot;{0}&quot;?\r\n\r\nSoučasná verze: {1}\r\nNová verze: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Chystáte se opustit Playnite a otevřít následující webovou stránku pomocí výchozího webového prohlížeče. Chcete pokračovat?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Zvolený obrázek (obrázky) můžou být pro optimální výkon příliš velké. Používaní velkých obrázků muže mýt za následek horší odezvu uživatelského rozhraní a zvýšení využití paměti. \r\n\r\nMaximální doporučovaná rozlišení:\r\nIkony: {0} mega pixelů\r\nObaly: {1} mega pixelů\r\nObrázky na pozadí: {2} mega pixelů</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Varování o Výkonu</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Příště Nezobrazovat</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Soubor s koncovkou {0} není podporovaný.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Nepodporovaná koncovka souboru</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Zvolený obrázek je nejspíš příliš velký pro dosažení optimálního výkonu.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Opravdu chcete odinstalovat vybraný motiv? Odinstalace bude zařazena do fronty pro další spuštění aplikace.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Vestavěné motivy nelze odinstalovat.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Tento motiv není podporován touto verzí Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Opravdu chcete odinstalovat vybrané rozšíření? Odinstalace bude zařazena do fronty pro další spuštění aplikace.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Vestavěná rozšíření nelze odinstalovat.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Toto rozšíření není podporováno touto verzí Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Instalační adresář</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Datový adresář</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Generování diagnostického balíku...</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Nahrávaní diagnostického balíku...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Importovat soubory...</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Co je tohle?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Opravdu toto chcete udělat?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Celkový čas hraní</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Průměrný herní čas</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Nejdelší herní čas</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Celková velikost instalace</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Přehled</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Postranní panel</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Zobrazit na postranním panelu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Resetovat nastavení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Všechna nastavení aplikace budou resetována do výchozích hodnot, kromě:\r\n- Umístění databáze\r\n- Seznamu výjimek z importu\r\n- Nastavení rozšíření, včetně integrací knihoven\r\n    \r\nPro dokončení procesu bude vyžadován restart. Chcete nastavení resetovat?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Pro vývojáře</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Externí rozšíření</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Zadejte úplnou cestu k složce.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Úspěchy</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Fórum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Novinky</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Stránka v obchodě</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Počáteční nastavení nebylo dokončeno. Playnite se nyní restartuje do Režimu Plochy, aby proces dokončil.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Nedávno Hrané</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Oblíbené</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Nejvíce Hrané</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Vše</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Jsou použity filtry.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Jsou použity dodatečné filtry.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Výsledky hledání pro:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Položka s tímto jménem již existuje.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Limitovat výběr na aktuální filtr</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Vybrat další</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Rozšíření...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Instalováno</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Nastavení rozšíření</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Procházet</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Aktualizace</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Aktualizace ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Správa instalovaných rozšíření a motivů, včetně jejich nastavení, byla přesunuta do nové nabídky &quot;Rozšíření&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Všechna instalovaná rozšíření pro integraci knihoven můžou být nastavena zde.\r\n\r\nPokud chcete instalovat nebo odinstalovat dodatečně integrace, použijte možnost &quot;Rozšíření&quot; z hlavní nabídky.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Motivy režimu plochy</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Motivy Režimu Celé Obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Hledání...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Rozšíření není kompatibilní s touto verzí Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Nepodařilo se stáhnout instalační balík rozšíření.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Nepodařilo se stáhnout instalační manifest rozšíření.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Je vyžadován restart aplikace pro použití čekajících změn.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Toto rozšíření je plánováno k instalaci.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Instalovat</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Přeinstalovat</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Odinstalovat</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Již nainstalováno</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Nenalezeny žádné nové aktualizace rozšíření.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Aktualizovat rozšíření</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Seznam změn není k dispozici</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Naplánováno k instalaci</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Stažení selhalo</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Licence zamítnuta</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Stahování {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Vyhledávají se aktualizace rozšíření…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Vyhledávají se aktualizace programu…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Jsou dostupné aktualizace pro některá rozšíření.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Vyberte položky k aktualizaci</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Instance pro vývoj rozšíření</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">Souhlas s licencí {0}</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Přijmout</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Zamítnout</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Zahrnout akce Hrát z integrace knihovny</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Zvolte akci</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Režim sledování</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Cesta ke sledování</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Počáteční zpoždění sledování</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Frekvence sledování</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Odkaz</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Soubor</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulátor</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Skript</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Výchozí</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Proces</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Adresář</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Původní proces</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Název procesu</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Ukládat logy o sledování</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Následující změny přepisují data pro všechny aktuálně vybrané hry!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Žádné</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Jednotné</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Pouze položky</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Pouze začátek a konec</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Citlivost skrolování</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Jemné skrolování</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Rychlost animace</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Odstranit položku?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Určitě chcete odstranit tuto položku?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Zobrazit tlačítka na horním panelu:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Obecná nastavení pohledu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Nastavení seskupování</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Nastavení řazení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Předvolby filtrů</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Pozice položek pluginů</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Šířka oddělovače sekcí</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Přesunout tlačítko hlavního menu do postranního panelu</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Panel průzkumníka</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Vybírač náhodných her</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Náhodný výběr hry z rozhraní</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Vyberte náhodnou hru z pohledu</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Uložit nastavení seskupování a řazení</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Zobrazit jako rychlý filtr v režimu Celé Obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Za posledních 7 dní</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Za posledních 31 dní</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Za posledních 365 dní</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Před více jak 365 lety</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Konfigurovat</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Uložit předvolbu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Minimalizovat po spuštění hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Minimalizovat Playnite po spuštění hry.\r\n\r\nVypnutí této možnosti může vést k problémům se vstupem po spuštění hry!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Velikost písma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Malá velikost písma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">Povolit podporu API pro herního ovladače </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Podpora pro herní ovladače</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Je-li zakázáno, Playnite nebude přijímat žádné vstupy herních ovladačů.\r\n        \r\nZakažte, pokud používáte ovladače které překládají vstupy herního ovladače na vstupy myši/klávesnice a získáváte duplikované vstupy v Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Zobrazit položky na hlavní nabídce:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Prohodit využití tlačítek X/A na hlavní stránce</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Prohodí využití tlačítek pro spuštění hry a zobrazení informací o hře na hlavní stránce.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Prohodit místa potvrzení a zrušení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Prohodit A a B pro potvrzení a zrušení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Pouze hlavní ovladač</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Přijmout pouze vstupy z hlavního ovladače.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Guide tlačítko přepne na Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Hlasitost rozhraní</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Hlasitost na pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Umlčet v pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Nepodařilo se inicializovat audio rozhraní.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Výstupní API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API používané pro audio výstup. Změňte pokud se setkáváte s problémy se zvukem.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Obecné</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Vzhled</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Audio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Rozložení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Nabídky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Vstup</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} se spouští...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} běží...</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Velk.pís.</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Mezerník</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Škálovač vykreslování obrázků</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternativní</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Vyvážený</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Kvalita</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Kvalita:\r\nNejlepší kvalita obrazu, pomalé, vysoké využití paměti.\r\n    \r\nVyvážený:\r\nDobrá kvalita, rychlé, nízké využití paměti.\r\n\r\nAlternativní:\r\nLepší kvalita, pomalejší, nízké využití paměti.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Vybrat soubor...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Vybrat adresář...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Skript při spuštění</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Mějte na paměti, že rozšíření a motivy můžou vysoce ovlivnit výkon, stabilitu a bezpečnost Playnite.\r\n    \r\nPokud se setkáte s potížemi po instalaci motivu nebo rozšíření, zkuste je nejdříve vypnout/odinstalovat pro zjištění, jsou-li zdrojem problému.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Zvolit při spuštění</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Zvolit při spuštění</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Vestavěné profily</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Vestavěný profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Vlastní profily</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Vlastní profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Spravováno vestavěným skriptem</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Specifikace emulátoru</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Specifikace platformy</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Specifikace regionu</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Provést před spuštěním emulátoru</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Provést po spuštění emulátoru</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Provést po ukončení emulátoru</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Spustitelný soubor emulátoru nenalezen.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Specifikace emulátoru nenalezena.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Skript při spuštění emulátoru nenalezen.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Oddělit jako odlišné hry</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Sloučit do jedné hry</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Nastavit platformu</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Nastavit region</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Skenovat adresář</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Nastavení skenování</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Vyloučit vzorce ze skenu kontrolního součtu</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Soubory shodující se s zadanými vrozci nebudou skenovány pro kontrolní součet a budou vyhodnoceny podle názvu souboru. Přečtěte si stránku pro pomoc s emulátory pro více informací.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Skenovat s emulátorem</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Při ukládání nové konfigurace musí být zadáno jméno.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Emulátor nebo profil emulátoru není nastaven.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Adresář ke skenování není zadán nebo neexistuje.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Nastavení skenování není správně nastaveno.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Zahrnout v souhrnném auto-skenu</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Nepodařilo se skenovat složku pro emulátory.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Nepodařilo se skenovat složku(ky) pro emulované hry.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Skrýt importované</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Profily k importování:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Nastavení automatických skenování</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Uložit jako nastavení auto-skenování</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Uloží nastavení pro pozdější použití při aktualizaci knihovny. Uložená nastavení mohou být spravována v nabídce &quot;Nastavit emulátory&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Importovat pomocí relativních cest</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Pokud možno, importujte herní soubory pomocí cest relativních k instalační složce Playnite nebo instalační složce emulátoru.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Skenovat podsložky</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Skenovat uvnitř archivů</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Sloučit související soubory</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Sloučit související herní soubory, jako například jednotlivé disky, pod jednu hru.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Přidat skener</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Přidat uložený skener</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Spustit sken</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Přidejte emulátorové konfigurace pro skenování specifických adresářů. Ujistěte se, že jsou emulátory před importováním her správně nastavené (přes nabídku Knihovna -&gt; Nastavit emulátory)</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Výchozí stav nastavený nové přidaným hrám</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Stav nastavený poprvé hraným hrám</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Nepodařilo se inicializovat PowerShell script runtime. Pokud jste uživatel Windows 7, zkuste (pře)instalovat PowerShell 5.1 pro vyřešní problému.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Předvolba filtrů se zadaným jménem již existuje. Aktualizovat předvolbu s novými nastaveními?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Automaticky vyplnit název pro řazení hry</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">Když upravíte hru, přidáte hry prostřednictvím aktualizace knihovny, skenováním emulátorů nebo normálním skenování složek, tato volba automaticky vyplní pole &quot;Jméno, dle kterého řadit&quot;. Například, &quot;The Witcher 3&quot; získá jméno pro řazení &quot;Witcher 03&quot;. Tato volba nikdy nenastaví název, který je identicky jako jméno hry a automaticky aktualizuje jméno pro řazení pouze pokud je pole prázdné.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Tato slova budou odstraněna ze začátku hodnoty pro jméno řazení:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Použijte pro ignorování slov na začátku řetězce pro účely řazení. Výchozí hodnoty jsou &quot;The&quot;, &quot;An&quot; a &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Vyplňte řadící název u her které žádný nemají</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Řazení</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Vyplňování jmen pro řazení…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Zjistili jsme, že na Vašem počítači běží služba Nahimic. Tato služba prokazatelně způsobuje vykreslovací problémy nejen aplikaci Playnite.\r\n\r\nPokud se v Playnite setkáte s grafickými potížemi, doporučujeme zakázání či úplné odinstalování služby Nahimic.\r\n\r\nVíce informací na https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite běží s povýšenými oprávněními (jako administrátor). Toto není doporučeno, protože tato oprávnění poskytuje také všem instalovaným rozšířením a hrám/aplikacím spuštěným z Playnite!\r\n\r\nVíce informací na https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Zobrazit varování pokud Playnite běží s povýšenými oprávněními</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Vypočítat skutečnou velikost na disku při výpočtu velikosti her</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Pokud je povoleno, skenování bude pomalejší a bude reprezentovat skutečnou velikost fyzicky obsazenou na disku.\r\nJe-li vypnuto, skenování bude rychlejší a bude používat velikost samotných souborů.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Následující rozšíření byla nahlášena jako potenciálně problematická, buď kvůli vysokému dopadu na stabilitu/výkon nebo bezpečnostním potížím. Důrazně doporučujeme, abyste je odinstalovali:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Nezahrnovat ve skenu online soubory</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Soubory uložené v cloud úložišti nebudou skenovány a importovány, nejsou-li dostupné lokálně.\r\nPodporováno pouze pro: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Skenovat s použitím zjednodušené metody bez obsahu souborů</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Soubory budou importovány, ale s použitím méně přesné metody, která nevyžaduje stažení obsahu souboru.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Použít pro všechny</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Přepsat stav instalace</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Pokud je nastaveno, Playnite ignoruje stav instalace (včetně instalačního adresáře) nastavený integračním doplňkem, který naimportoval tuto hru.\r\n        \r\nTato volba nemusí plně fungovat s doplňky, které používají alternanitvní metodu pro import her, pokud také nezohlední toto manuální nastavení stavu instalace.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Pouze ručně</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Jednou denně</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Jednou týdně</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Při každém startu</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Zkontrolovat aktualizace programu</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Zkontrolovat aktualizace doplňků</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Aktualizovat knihovny</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Skenovat emulované adresáře</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Zahrnout skryté hry</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Upravit pole</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Vybrat / zrušit výběr všech</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Otevřít</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Aktivovat</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Přiřadit</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Začněte psát pro hledání her… [F1] pro nápovědu</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"># na začátku zobrazí seznam dostupných příkazů.\r\n/ na začátku zobrazí sezam dostupných poskytovatelů/doplňků vyhledávání.\r\nNapsáním klíčového slova pro vyhledávání a ukončení mezerníkem okamžitě přepne na poskytovatele vyhledávání.\r\n\r\nTAB: přepnout akci\r\nENTER: aktivovat vybranou akci\r\nSHIFT-ENTER: otevřít menu položky</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Zahrnout odinstalované hry</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Zahrnout skryté hry</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Odinstalované hry zahrnuty</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Odinstalované hry vyloučeny</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Skryté hry zahrnuty</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Skryté hry vyloučeny</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Hrát nebo nainstalovat</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Přejít na podrobnosti...</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Menu hry</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Upravit hru</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Otevírání vyhledávání</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Vyhledávací pole</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Tlačítko vyhledávání</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Primární akce hry</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Sekundární akce hry</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F otevře globální vyhledávání místo aktivace vyhledávacího pole</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Uložit nastavení filtru pro vyhledání her mezi vyhledávacími relacemi</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Poskytovatelé vyhledávání</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Výchozí klíčové slovo</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Vlastní klíčové slovo</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Systémová klávesová zkratka</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite vyhledávání</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Nastavení rozšíření</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Výjimky</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Vyloučené soubory relativně ke skenovanému adresáři</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Vyloučené adresáře relativně ke skenovanému adresáři</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Přidat soubor do seznamu vyloučení</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Přidat adresář do seznamu vyloučení</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Vyloučení lze přidat pouze do uložených skenovacích konfigurací.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Vyloučení byla přidána do skeneru &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Přepsat platformu</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Skener přiřadí tuto platformu všem hrám nehledě na automaticky detekovanou platformu.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Zahrnout příkazy ve výchozím hledání</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Pokud je zakázáno, příkazy nebudou zahrnuty ve výchozím vyhledávání dokud nebude použit # prefix.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Použít přibližné hledání ve filtru jména</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Pokud je povoleno, filtr jmen bude vyhledávat jména her stejně jako globální vyhledávání.\r\nPřísné hledání může být vynuceno v jednotlivých filtrech prefixem !.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Zobrazit pole hry ve výsledcích hledání:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Skrytý stav</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Zálohování dat bylo zrušeno.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Zálohování dat selhalo.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Chyba při zálohování dat</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Probíhá zálohování dat…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Probíhá obnovení dat ze zálohy…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Nepodařilo se obnovit data ze zálohy.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Nastavení</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Herní knihovna</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Média knihovny her</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Nainstalovaná rozšíření</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Data nainstalovaných rozšíření</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Nainstalovaná témata</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Vyberte data, která mají být obnovena ze zadaného záložního souboru.\r\n    \r\nPlaynite se automaticky restartuje a zahájí proces obnovy.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Vyberte položky, které mají být zahrnuty do zálohy dat. Nastavení aplikace a herní knihovna je zahrnuta automaticky.\r\n    \r\nPlaynite se automaticky restartuje pro spuštění procesu zálohování.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Automatické zálohování dat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Frekvence automatického zálohování</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Adresář pro zálohu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Rotující zálohy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Zahrnout další data:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Adresář zálohy musí být nastaven pokud je zapnuto automatické zálohování.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Zobrazit oznámení pouze pro aktualizace zahrnující opravy</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Pokud je zapnuto, pouze aktualizace zahrnující opravy pro aktuálně nainstalovanou verzi budou zobrazí oznámení.\r\nVydání nové významné verze oznámení o aktualizaci nezobrazí.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Použít relativní zobrazení u dat za poslední týden</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Použít relativní zobrazení ve formátu &quot;Dnes&quot;, &quot;Včera&quot; atd., pokud je datum nižší než týden.\r\n    \r\nZadaný formát data bude použit pro všechny ostatní data.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Hledání obrázků na webu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Řetězec pro hledání ikon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Řetězec pro hledání obalu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Řetězec pro hledání pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Získávání informací o doplňku…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Není k dispozici žádný zdroj metadat</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Nastavení akce Hrát</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Použít nastavení skeneru</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Vybrat profil při spuštění</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Vybrat emulátor při spuštění</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automaticky</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Vždy zapnuto</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Vždy vypnuto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Podpora přístupnosti (čtečka obrazovky)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Menu aplikace</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Menu hry</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Adresář aplikace</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Adresář uživatelských dat</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Bylo zjištěno poškození souboru knihovny, Playnite se nyní vypne.\r\n    \r\nReportujte problém na Playnite stránce GitHubu s požadavkem na opravu souborů.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Chcete uložit provedené změny?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Přenosná instalace</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Nebyly nalezeny žádné ovladače</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/cy_GB.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\"></sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\"></sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\"></sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCToday\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\"></sys:String>\r\n    <sys:String x:Key=\"LOCMonday\"></sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCThursday\"></sys:String>\r\n    <sys:String x:Key=\"LOCFriday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSunday\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\"></sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameId\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\"></sys:String>\r\n    <sys:String x:Key=\"LOCPresets\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumn\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCRow\"></sys:String>\r\n    <sys:String x:Key=\"LOCRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\"></sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\"></sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\"></sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\"></sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCViewType\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\"></sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\"></sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\"></sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\"></sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\"></sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCChange\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCNever\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\"></sys:String>\r\n    <sys:String x:Key=\"LOCAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\"></sys:String>\r\n    <sys:String x:Key=\"LOCWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirst\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandom\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\"></sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpand\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOther\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\"></sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\"></sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\"></sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\"></sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\"></sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpen\"></sys:String>\r\n    <sys:String x:Key=\"LOCActivate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAssign\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/da_DK.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Engelsk</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite sprog</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Afslut</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filter aktivt</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filter inaktivt</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Yderligere filtrer</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtre</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Ugyldig data</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Gem ændringer?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Hjemmeside på www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Se kildekoden på GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Opret diag. pakke</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Send diagnose-information</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Om Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Lavet af Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Tildel kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Sæt kategorier</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Tilføj kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Afkrydset - Sæt kategori\r\nUden afkrydsning - Fjern kategori\r\nUbestemt - Ingen ændring (flere spil under redigering)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Ingen kategori</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Ingen platform</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Hovsa! Noget gik galt.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">En uoprettelig fejl er opstået.\r\n\r\nHvis du vil hjælpe os med at ordne problemet, så beskriv venligst de handlinger du udførte før nedbruddet og send så så diagnostisk information. Hvis du er online, vil data blive uploadet til Playnite serveren til analyse. \r\n\r\nAlternativt, kan du klikke på 'Rapportér nedbrud' knappe for at oprette et nyt GitHub issue og rapportere nedbruddet manuelt. \r\n\r\nTak for din hjælp.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Udvidelse &quot;{0}&quot; har forårsaget en uoprettelig fejl. \r\n\r\nVi anbefaler at du gemmer log filen og rapporterer problemet til udvidelsens udvikler. Hvis problemet fortsætter med at opstå, deaktiver da udvidelsen.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Udvidelse &quot;{0}&quot; har forårsaget en uoprettelig fejl. \r\n\r\nVi anbefaler at du rapporterer problemet til udvidelsens udvikler. Hvis problemet fortsætter med at opstå, deaktiver da udvidelsen.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Ukendt udvidelse eller tema forårsagede en uoprettelig fejl.\r\n\r\nVi anbefaler at deaktiverer tredjeparts tilføjelser, isolere den problematiske og rapporterer denne til dens udvikler.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Uoprettelig fejl opstod.\r\n\r\nHvis du vil hjælpe os med at rette problemet, så send os diagnostisk information. Tak.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Deaktiver udvidelse</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Gem log fil</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Send diagnostisk info</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Anmeld crash</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Genstart Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Genstart i sikker tilstand</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Deaktiverer alle 3'de-parts udvidelser og anvender standard tema.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Luk Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Handlinger udført før nedbruddet (på Engelsk):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Administrer bibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Fjern spil?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Kan ikke fjerne - Spil eller installation kører.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Kan ikke afinstallere - Spillet kører.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Er du sikker på at du vil fjerne {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Er du sikker på at du vil fjerne {0} spil?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Er du sikker på, at du vil fjerne {0}?\r\n\r\nValg af &quot;Tilføj til udelukkelsesliste&quot; vil forhindre spillet i at blive importeret igen, næste gang biblioteket opdateres.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Er du sikker på, at du vil fjerne {0} spil?\r\n\r\nVed at vælge &quot;Tilføj til udelukkelsesliste&quot; vil spillet ikke blive importeret igen, næste gang biblioteket opdateres.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Er du sikker på, at du vil fjerne {0} enheder, der i øjeblikket ikke er i brug?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Ingen ubrugte felter fundet.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Ja (Tilføj til undtagelsesliste)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Der er ændringer i denne sektion, som ikke er gemt.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Opdaterer spilbibliotekets format…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Database-opdatering fejlede.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Spilbiblioteket kunne ikke opdateret. Der kræves {0} MBs fri plads, for at kunne gennemføre dette.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">GameError</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Kan ikke starte spillet. '{0}' blev ikke fundet i databasen.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Kan ikke starte spillet: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Kan ikke gennemføre handling: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Kan ikke åbne spil-placering: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Kunne ikke finde størrelsen på installeret spil: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Installationstørrelses scanningsfejl</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Der opstod {0} fejl under scanningen af installationsstørrelsen</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Fejl ved oprettelse af genvej: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Kunne ikke åbne manual: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Kan ikke installere spil: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Kan ikke afinstallere spil: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Ingen gyldige handlinger til spilopstart fundet. Ved brug af emulator-handlinger skal du sørge for, at platform-definitionerne stemmer overens mellem spillets og emulatorens konfiguration.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Installationsimplementering er ikke tilgængelig.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Det biblioteksplugin, der er ansvarligt for spillet, er deaktiveret eller ikke installeret.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Officiel metadata-download er ikke tilgængeligt.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Intet spil valgt.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Spillets scriptudførelse mislykkedes.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Applikationens scriptudførelse mislykkedes.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Udførelse af globalt script mislykkedes.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Emulatorens scriptudførelse mislykkedes.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Afspil scripthandling mislykkedes.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 eller nyere er ikke installeret.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Lykkedes ikke at afgøre, hvordan spillet skulle startes.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Aktivér</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Deaktiveret</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Fjern</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Fjern ubrugte</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Omdøb</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopier</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Tilføj</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Standardikon</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Standard coverbillede</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Standard Baggrundsbillede</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Færdig</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Næste</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Tilbage</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">FÆRDIG</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">TILBAGE</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">RYD</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Ryd</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Luk</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Luk alle</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importer</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Navn</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Forfatter</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Serie</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Version</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Sidst spillet</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Mest spillede</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Antal afspilninger</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Installationsstørrelse</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Folder</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Noter</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Tilføjet</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Tilføjelsesdato</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Ændret</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Ændringsdato</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Hjemmeside</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Sti</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Gem</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Luk</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Annullér</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Bekræft</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Nulstil</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Ja</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Nej</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Velkommen</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Lokal Bruger</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Generelt</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Medier</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Installation</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Handlinger</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Downloader…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Downloader medier...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Indlæser…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Type</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profiler</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Fjern</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Download</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Søg</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Opløsning:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Alle</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Zoom</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Vis som liste</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Forsidebillede</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Gittervisning</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Detaljeret Oversigt</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Brugerdefineret</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL-adresse</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Særlig tak til</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licens</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Bidragsydere</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Afslutter Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">I dag</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">I går</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Mandag</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Tirsdag</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Onsdag</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Torsdag</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Fredag</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Lørdag</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Søndag</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Sidste uge</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Sidste måned</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Sidste år</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">For mere end et år siden</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 til 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB til 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB til 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5 GB til 10 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB til 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB til 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB til 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB eller mere</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Import lykkedes.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Alle spil</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Spil ID</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Database-ID</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Forudindstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Kolonne</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Kolonner</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Række</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Rækker</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Kunne ikke hente ikon fra Play handling. Der er ingen handling af File type til stede.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Download kun manglende metadata</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Aktivering af denne indstilling vil springe over downloading af metadata for datafelter, der allerede indeholder information.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Spiludvalg</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Vælg venligst hvilke spil der skal opdateres med ny metadata:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Alle spil i databasen</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Alle filtrerede spil</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Kun valgte spil</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Officiel Butik</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Vælg hvilke felter der automatisk skal udfyldes af Playnite og hvilke kilder der skal bruges til at hente data fra.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Overvej venligst at klikke på logoet ovenfor og bidrage med opdateringer til igdb.com database for at forbedre data Playnite anvendelser.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Henter metadata...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importerer installerede spil…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importerer {0} spil…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importerer emulerede spil fra {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Downloader biblioteksopdateringer…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Scanner størrelsen af spil i biblioteket…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Scanner størrelse af importerede spil…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Biblioteksopdatering færdig</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Frigiver ressourcer…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Konfiguration</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Indstillinger…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platforme og emulatorer</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Konfigurer emulatorer…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Bibliotekshåndtering…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Værktøjer</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Download Metadata…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Software Værktøjer…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Konfigurer Integrationer…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Åbn 3. Parts Klient</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Tredjepartsklienter</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Opdater Spilbiblioteket</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Afbryd Biblioteksopdatering</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Opdater Emulerede Mapper</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">TIlføj spil</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manuelt…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Scan Automatisk…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emuleret Spil…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store Applikation...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Om Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Indsend feedback</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Skift til Fuldskærmstilstand</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Hjælp</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Støt Playnite på Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Support på Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Brugervejledning</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK dokumentation</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Genstart System</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Sluk Systemet</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Suspendér Systemet</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Dvaletilstand</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Lås Systemet</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Vælg et Tilfældigt Spil</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Element afstand</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Tegn gitterelementets baggrund</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Bredde af gitterelementets ramme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Manglende spil-ikonkilde</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Manglende spil-ikonkilde</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Manglende spilbaggrundskilde</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Lodret afstand til spildetaljer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Placering af detaljer i Gittervisning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Detaljer vis spillisteposition</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Skrifttype til programmet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Placering af filterpanel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Placering af explorerpanel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Rendering af omslagskunst</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD Boks</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Firkantet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam Banner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam vertikal cover</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Kræver genstart for at anvende</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Indstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Generelt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Øverste panel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Udseende</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Spildetaljer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Avanceret</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Fuld skærm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Input</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Ydeevne</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Opdaterer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Søg</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Sikkerhedskopi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Sikkerhedskopiér Biblioteksdata</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Gendan Datasikkerhedskopi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importér automatisk ændringer i biblioteket</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Ugyldig placering af databasefil, korrekt filsti skal angives.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Navnefeltet må ikke være tomt.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Download metadata efter import af spil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Start Playnite minimeret</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Start Playnite når du starter din computer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Start lukket i bakken</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Kunne ikke registrere Playnite til at starte, når computeren starter.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Start i fuldskærmstilstand</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asynkron billedindlæsning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Vis spilnavne i Gittervisning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Slør baggrund</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Vis i Gittervisning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Temaprofil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Fuldskærmsvisning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Databaseplacering</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Login-status:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite indstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Ryd Cache</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Formatér tid spillet for at angive antallet af spillede dage</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Ryd cache?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Playnite genstart påkræves for at anvende nyt tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Find flere temaer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Opret et nyt tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Hjælp os med at oversætte Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Genstart Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Guide-knappen åbner fuldskærmstilstand</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Vis batteristatus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Vis batteri-procent</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Vis ur</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Ingen</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Udfyld</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Uniform</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Venstre</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Højre</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Top</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Bund</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Importeringsfejl</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Godkendelse krævet</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Godkendelse mislykkedes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Delvis indlæsning af store spilbeskrivelser</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Store beskrivelser kan forårsage mærkbar forsinkelse, når du vælger spil.\r\n\r\nNår aktiveret, vil kun en del af beskrivelse tekst i første omgang blive indlæst med en mulighed for at indlæse resten på efterspørgslen.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Download metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Scan mappe ved hjælp af Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Vælg filer</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Scanner...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Første gangs opsætning</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platforme</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulatorer</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Vælg ikon</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Vælg Omslag</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Vælg fil</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Vælg URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Tilføj emulator</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Eksekverings-fil</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumenter</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Arbejdsmappe</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Understøttede filtyper</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sorter efter</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Gruppér efter</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Stigende</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Faldende</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Gruppere efter kategori</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Gruppere efter platform</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Vis type</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Vis</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\"></sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ikon</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Coverbillede</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Baggrundsbillede</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Bibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Navn</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Kontonavn</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Genre</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Udgivelsesdato</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Udgivelsesår</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Udvikler</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Tag</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Udgiver</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Installeret</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Installeret</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Skjult</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favorit</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Aktiver HDR-understøttelse</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Hvis aktiveret, vil HDR blive aktiveret på den primære skærm, før spillet startes.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Bemærk, at HDR ikke er understøttet på din primære skærm.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Sidst spillet</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Beskrivelse</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Coverbillede</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Genre</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Firma</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Udvikler</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Udgiver</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Tag</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Tags</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Aldersklassificering</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Region</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Kilde</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\"></sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Indtast en gyldig URL som starter med http:// eller https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Vælg URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Ryd filtre</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API Nøgle</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Temafejl</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Ryd alle</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Installerer</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Afinstallerer</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Starter</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Kører</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Ugyldig URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Gør ingenting</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimer</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\"></sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Luk</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Skift</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Avanceret</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Aldrig</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Brugerscore</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Plugins</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Udvidelser</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Genindlæs scripts</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Luk Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Biblioteker</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Opdatér alle</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Oprettet af:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Version:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Bibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\"></sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Alle</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Ingen</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Notifikationer</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Bredde</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Højde</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Størelse</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Lille</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Stor</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Større</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Størst</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Standard</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirst\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandom\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\"></sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpand\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOther\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Opdateringsfejl</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\"></sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\"></sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Aktiver HDR-understøttelse</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Deaktivér HDR-understøttelse</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Sæt kategori…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Fjern</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Spil</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Installér</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Spil indstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Detaljer</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Afinstaller</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Åben installationsplacering</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Opret skrivebordsgenvej</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Mere</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\"></sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Tid spillet</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Sidst spillet</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}d {1}t {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}t {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minutter</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} sekunder</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Omdøb genstand</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Indtast navn</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Indtast nyt navn</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 til 10 timer</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 til 100 timer</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 til 500 timer</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 til 1000 timer</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1.000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Installation fuldført.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Installér udvidelse?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\"></sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Samlet installationsstørrelse</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\"></sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Senest spillet</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favoritter</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Mest spillede</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Alle</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Søgeresultater for:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">En genstand med samme navn findes allerede.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Sporingssti</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Ingen</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Ensartet</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Kun elementer</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Kun start og slut</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Brugerdefineret profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Sammenflet relaterede filer</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Flet relaterede spilfiler, såsom individuelle spildiske, under et spil indlæg.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpen\"></sys:String>\r\n    <sys:String x:Key=\"LOCActivate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAssign\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Brug fuzzy matching i navnefilter</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Når aktiveret, vil navnefilter matche spilnavne på samme måde som global søgning.\r\nStreng matchning kan håndhæves på en individuel sag ved at præfikse filter med ! tegn.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Programmappe</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Bruger datamappe</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Biblioteksfil korruption er blevet opdaget, Playnite vil nu lukke.\r\n    \r\nÅbn et nyt problem på Playnites GitHub-side med en anmodning om at fikse korruptionen i dine filer.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/de_DE.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Deutsch</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite-Sprache</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Beenden</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filter aktiv</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filter deaktiviert</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Weitere Filter</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Ungültige Daten</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Änderungen speichern?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Homepage: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Quellcode auf GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Diagnosedaten erzeugen</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Diagnosedaten senden</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Über Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">von Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Kategorie zuweisen</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Kategorien festlegen</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Kategorie hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Aktiviert - Kategorie zuweisen\r\nDeaktiviert - Kategorie entfernen\r\nUnentschieden - Keine Änderungen (beim Bearbeiten mehrerer Spiele)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Keine Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Keine Plattform</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Hoppla! Etwas ist schief gelaufen …</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Ein nicht behebbarer Fehler ist aufgetreten.\r\n\r\nFalls du uns bei diesem Problem helfen möchtest, beschreibe bitte kurz die vor dem Absturz unternommenen Aktionen und sende dann die Diagnosedaten. Falls du online bist, werden diese zur Analyse auf den Playnite-Server hochgeladen.\r\n\r\nErsatzweise kannst du auf die Schaltfläche »Absturz melden« klicken, um einen neuen Fehlerbericht auf GitHub zu erstellen und den Absturz manuell zu melden.\r\n\r\nVielen Dank für deine Hilfe.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Erweiterung »{0}« hat einen nicht behebbaren Fehler verursacht.\r\n\r\nWir empfehlen, die Diagnosedatei zu speichern und das Problem dem Entwickler der Erweiterung zu melden. Falls das Problem wiederholt auftritt, deaktiviere die Erweiterung.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Erweiterung »{0}« hat einen nicht behebbaren Fehler verursacht.\r\n\r\nWir empfehlen, das Problem dem Entwickler der Erweiterung zu melden. Falls das Problem wiederholt auftritt, deaktiviere die Erweiterung.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Unbekannte Erweiterung oder Design verursachte einen nicht behebbaren Fehler.\r\n\r\nWir empfehlen alle Drittanbieter-Add-ons zu deaktivieren, um das problematische zu isolieren und das Problem dem Entwickler des Add-ons mitzuteilen.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Ein nicht behebbarer Fehler ist aufgetreten.\r\n\r\nFalls du uns bei diesem Problem helfen möchtest, sende bitte Diagnoseinformationen. Vielen Dank.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Erweiterung deaktivieren</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Protokolldatei speichern</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Diagnoseinformationen senden</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Absturz melden</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Playnite neu starten</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Im Sicheren Modus neu starten</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Alle Drittanbieter-Erweiterungen werden deaktiviert und das Standarddesign verwendet.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Playnite beenden</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Unternommene Aktionen vor dem Absturz (in Englisch):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Bibliotheksverwaltung</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Spiel(e) entfernen?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Entfernen nicht möglich - Spiel oder Installationsprogramm werden derzeit ausgeführt.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Deinstallieren nicht möglich - Spiel läuft gerade.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Möchtest du {0} wirklich entfernen?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Möchtest du {0} Spiele wirklich entfernen?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Möchtest du {0} wirklich entfernen?\r\n\r\nDie Auswahl der Option »Zur Ausschlussliste hinzufügen« wird bei zukünftigen Bibliotheksaktualisierungen das erneute Importieren des Spiels verhindern.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Möchtest du {0} Spiele wirklich entfernen?\r\n\r\nDie Auswahl der Option »Zur Ausschlussliste hinzufügen« wird bei zukünftigen Bibliotheksaktualisierungen das erneute Importieren der Spiele verhindern.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Möchtest du wirklich {0} derzeit nicht verwendete Einträge entfernen?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Keine unbenutzen Felder gefunden.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Ja (zur Ausschlussliste hinzufügen)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Es existieren ungespeicherte Änderungen in diesem Abschnitt</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Spielebibliotheksformat wird aktualisiert …</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Datenbank konnte nicht aktualisiert werden.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Spielebibliothek kann nicht aktualisiert werden. Es werden {0} MB freier Speicherplatz benötigt.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Spielfehler</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Spiel kann nicht gestartet werden: »{0}« wurde in der Datenbank nicht gefunden.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Spiel kann nicht gestartet werden: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Aktion kann nicht gestartet werden: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Installationspfad kann nicht geöffnet werden: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Installationsgröße konnte nicht ermitteln werden: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Fehler bei Ermittlung der Installationsgröße</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Beim Ermitteln der Installationsgröße sind {0} Fehler aufgetreten</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Verknüpfung konnte nicht erstellt werden: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Handbuch konnte nicht geöffnet werden: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Spiel kann nicht installiert werden: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Spiel kann nicht deinstalliert werden: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Keine gültigen Start-Aktionen gefunden. Achte bei Emulator-Aktionen darauf, dass die Plattformdefinitionen von Spiel- und Emulatorkonfiguration übereinstimmen.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Installations-Implementierung nicht verfügbar.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Das Bibliotheks-Plugin für dieses Spiel ist deaktiviert oder nicht installiert.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Offizielle Metadaten sind nicht zum Herunterladen verfügbar.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Kein Spiel ausgewählt.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Skriptaktion des Spiels konnte nicht ausgeführt werden.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Anwendungsskript konnte nicht ausgeführt werden.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Globale Skriptaktion konnte nicht ausgeführt werden.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Emulator-Skript konnte nicht ausgeführt werden.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">»Spielen«-Skriptaktion konnte nicht ausgeführt werden.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 oder neuer ist nicht installiert.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Es konnte nicht herausgefunden werden, wie das Spiel gestartet wird.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Aktiviert</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Deaktiviert</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Entfernen</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Nicht Verwendete entfernen</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Umbenennen</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopieren</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Standard Icon</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Standard-Coverbild</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Standard-Hintergrundbild</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Abschließen</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Weiter</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Zurück</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">FERTIG</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">ZURÜCK</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">LEEREN</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Zurücksetzen</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Verwerfen</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Alle verwerfen</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importieren</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Name</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Serie</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Version</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Zuletzt gespielt</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Meistgespielt</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Spielhäufigkeit</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Installationsgröße</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Ordner</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Anmerkungen</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Hinzugefügt</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Hinzufügedatum</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Geändert</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Änderungsdatum</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Website</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Pfad</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Speichern</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Schließen</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Abbrechen</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Bestätigen</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Zurücksetzen</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Ja</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Nein</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Willkommen</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Lokaler Nutzer</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Allgemein</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Medieninhalte</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Installation</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Aktionen</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Wird heruntergeladen …</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Medieninhalte werden heruntergeladen …</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Wird geladen …</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Typ</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profile</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Entfernen</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Herunterladen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Suchen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Auflösung:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Beliebig</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Vergrößerung</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Listenansicht</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Cover</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Rasteransicht</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Detailansicht</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Benutzerdefiniert</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Besonderer Dank</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Lizenz</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Mitwirkende</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Playnite wird beendet …</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Heute</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Gestern</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Montag</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Dienstag</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Mittwoch</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Donnerstag</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Freitag</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Samstag</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Sonntag</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Letzte Woche</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Letzter Monat</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Letztes Jahr</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Vor mehr als einem Jahr</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 bis 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">200MB bis 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB bis 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB bis 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB bis 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB bis 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB bis 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB oder mehr</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Import erfolgreich abgeschlossen.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Alle Spiele</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Spiel-ID</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Datenbank-ID</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Voreinstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Spalte</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Spalten</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Zeile</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Zeilen</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Es konnte kein Icon aus der Spiel Aktion abgerufen werden. Es ist keine Aktion des »Datei« Typs vorhanden.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Nur fehlende Metadaten herunterladen</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Bei aktivierter Option werden für Datenfelder, die bereits Informationen enthalten, keine Metadaten heruntergeladen.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Spieleauswahl</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Bitte wähle aus, für welche Spiele die Metadaten aktualisiert werden sollen:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Alle Spiele der Datenbank</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Alle derzeit den Filter passierende Spiele</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Nur die ausgewählten Spiele</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Keine Metadatenfelder ausgewählt</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Es sind keine Metadatenfelder zum Download ausgewählt. Bitte wähle mindestens eines aus und aktiviere dafür mindestens einen Metadatenanbieter.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Offizieller Shop</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Bitte wähle die von Playnite automatisch auszufüllenden Felder und die hierfür zu verwendenden Quellen aus.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Zur Verbesserung der von Playnite verwendeten Daten kannst du auf das oben dargestellte Logo klicken und Aktualisierungen zur igdb.com-Datenbank beitragen.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Metadaten werden heruntergeladen …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Installierte Spiele werden importiert …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Spiele von {0} werden importiert …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Emulierte Spiele werden von {0} importiert …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Bibliotheksaktualisierungen werden heruntergeladen …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Größe der Bibliotheksspiele wird ermittelt …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Größe der importierten Spiele wird ermittelt …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Bibliotheksaktualisierung abgeschlossen</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Ressourcen werden freigegeben …</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Konfiguration</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Einstellungen …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Plattformen &amp; Emulatoren</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Emulatoren konfigurieren …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Bibliotheksverwaltung …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Werkzeuge</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Metadaten herunterladen …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Software-Werkzeuge …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Integrationen konfigurieren …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Drittanbieter-Client öffnen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Drittanbieter-Clients</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Spielebibliothek aktualisieren</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Bibliotheksaktualisierung abbrechen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Emulierte Ordner aktualisieren</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Spiel hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manuell …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Automatisch durchsuchen …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emuliertes Spiel …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft-Store-Anwendung …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Über Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Feedback senden</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Zu Vollbildmodus wechseln</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Hilfe</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Auf Patreon unterstützen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Unterstützung auf Ko-Fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Benutzerhandbuch</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK-Dokumentation</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">System neu starten</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">System herunterfahren</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">System-Stand-by</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">System-Ruhezustand</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">System sperren</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Benutzer abmelden</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Zufälliges Spiel auswählen</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">In der Detailleiste anzuzeigende Datenfelder:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Elementabstände</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Hintergrund für Rasterelemente zeichnen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Elementrandbreite in Rasteransicht</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Quelle für fehlende Spiel Icon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Quelle für fehlende Spielecover</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Quelle für fehlende Spielhintergründe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Vertikaler Abstand zu Spieldetails</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Detailleistenposition in Rasteransicht</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Spielelistenposition in Detailansicht</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Trennlinien zwischen Leisten zeichnen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Höhe der Spieletitelbilder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Höhe des Spiellisten Icons</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Anwendungsschriftart</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Nichtproportionale Schriftart</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Position der Filterleiste</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Position der Explorerleiste</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Coverdarstellung</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Seitenverhältnis für Ausgabe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Die folgenden Optionen beeinflussen auch das Rendering der Kacheln im Vollbildmodus!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Gestreckt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD-Box</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Shop</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Quadratisch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam-Banner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam-Vertikalcover</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Zum Anwenden Neustart erforderlich</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Einstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Allgemein</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Obere Leiste</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Erscheinungsbild</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Spieldetails</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Erweitert</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Vollbild</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Eingabe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Leistung</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadaten</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Aktualisierung</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Suche</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Sicherung</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Bibliotheksdaten sichern</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Datensicherung wiederherstellen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Bibliotheksänderungen automatisch importieren</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Ungültiger Pfad zur Datenbank.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Name des Nutzerkontos darf nicht leer sein.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Metadaten nach Spieleimport herunterladen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Playnite minimiert starten</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Playnite beim Start des Computers starten</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Minimiert in Infobereich starten</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Autostart für Playnite konnte nicht registriert werden.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Im Vollbildmodus starten</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asynchrones Laden von Bildern</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Ermöglicht weicheres Scrolling der Spielelisten zum Preis längerer Bildladezeiten.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Spielename anzeigen, falls Titelbild fehlt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Name des Spiels unterhalb Cover anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Nicht installierte Spiele abdunkeln</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Spiel Icons in Detailansichtsliste anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Spieleanzahl in Gruppenbeschreibung anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">In Filter- und Explorerleisten nur zugewiesene Felder anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Hardwarebeschleunigung deaktivieren</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Verwende diese Option bei Ruckeln oder ähnlichen Problemen der Benutzeroberfläche</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Versteckte Spiele in Schnellstartlisten anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Beeinflusst Sprung- und Infobereichslisten.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Anzahl der Schnellstart-Elemente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Hintergrundbild des Spiels als Fensterhintergrund verwenden</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Hintergrund weichzeichnen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Hohe Qualität</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Hintergrund abdunkeln</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">In Rasteransicht anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Design</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Designprofil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Design für Vollbildmodus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Designprofil für Vollbildmodus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Speicherort der Datenbank</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Anmeldestatus:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite-Einstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Webcache leeren</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Löst eventuell Probleme beim Verknüpfen von Nutzerkonten.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Taskleistenicon anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Playnite in Infobereich minimieren</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Playnite in den Infobereich minimieren, wenn das Anwendungsfenster geschlossen ist</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Beim Spielstart:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Nach Spielende:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">»Zeit gespielt« formatieren, um die Anzahl der gespielten Tage anzugeben</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Datumsformate:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Du wirst von allen verbundenen Diensten abgemeldet und ein Neustart wird erforderlich. Möchtest du fortfahren?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Cache leeren?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Anwenden eines neuen Designs erfordert einen Neustart von Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Weitere Designs beziehen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Neues Design erstellen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Weitere Erweiterungen beziehen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Neue Erweiterung erstellen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Hilf uns, Playnite zu übersetzen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite muss für das Anwenden der geänderten Einstellungen neu gestartet werden. Jetzt neu starten?\r\n\r\nEin Neustart wird alle derzeit aktiven Aufgaben (Downloads) abbrechen.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Playnite neu starten?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite kann deine Bibliotheksdateien nicht automatisch verschieben. Daher musst du vor dem Wechsel des Speicherorts die Dateien manuell verschieben bzw. kopieren. Falls am Zielort keine Bibliothek vorhanden ist, wird eine neue erstellt.\r\n\r\nDer neue Speicherort der Datenbank wird erst nach einem Neustart von Playnite verwendet.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Spielzeit wird nicht erfasst, falls »Schließen«-Aktion festgelegt wurde.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Zeilenanzahl</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Spaltenanzahl</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Zeilenanzahl in Detailansicht</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Hintergrundbild in Hauptbildschirm anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Hat ohne erneutes Herunterladen der Metadaten keinen Einfluss auf bereits in der Bibliothek befindliche Spiele.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Spielzeit von Spielen der Bibliothek importieren:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Konfiguriert, wann Playnite die von Bibliotheks-Plugins gemeldeten Spielzeiten für Spiele der Playnite-Datenbank importieren soll. Hierfür müssen die entsprechenden Plugins dieses Feature unterstützen.\r\n\r\nImmer: Importiert die Spielzeit für neu importierte und vorhandene Spiele der Playnite-Datenbank.\r\nNur für neu importierte Spiele: Importiert die Spielzeit nur für neu importierte Spiele.\r\nNiemals: Importiert die Spielzeit unter keinen Umständen.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Immer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Nur für neu importierte Spiele</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Niemals</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Controllerunterstützung im Desktopmodus aktivieren</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Guide-Taste öffnet Vollbildmodus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Einstellungen für das automatische Herunterladen von Metadaten bei neu importierten Spielen.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Zielbildschirm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Immer primären Bildschirm verwenden</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Spieletitel anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Akkustatus anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Akkuladung in Prozent anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Uhr anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Mauszeiger ausblenden</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Nur Installierte in Schnellfilter</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Beschriftung der Controllertasten</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Horizontales Scrollen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Wähle einen der Unterabschnitte aus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Keine Einstellungen verfügbar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Einstellungen konnten nicht geladen werden</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Diese Skripte werden für jedes Spiel der Bibliothek ausgeführt. Individuelle Skripte können für jedes Spiel beim Bearbeiten der Spieldetails separat zugewiesen werden.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Wechsel von Hintergrundbildern animieren</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Schriftgrößen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automatisch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Aliased</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Graustufen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Optimal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Bildschirm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Modus für Textformatierung</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Modus für Textrendering</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Methoden für Textrendering und -formatierung werden derzeit nicht für Spielbeschreibungen verwendet.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Hintergrundbilder im Voraus laden</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Falls aktiviert, wird Playnite Hintergrundbilder gleichzeitig mit den Metadaten herunterladen. Dies verbraucht mehr Speicherplatz auf der Festplatte, macht die Bilder jedoch auch offline verfügbar.\r\n\r\nFalls deaktiviert, werden Hintergrundbilder erst dann heruntergeladen, wenn sie zum ersten Mal benötigt werden. Dies verbraucht weniger Speicherplatz auf der Festplatte, führt jedoch möglicherweise zu einer Verzögerung vor dem Anzeigen der Bilder und einige Bilder sind offline eventuell nicht verfügbar.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Drittanbieter-Client nach dem Beenden des Spiels automatisch schließen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Zeitverzögerung für das Herunterfahren des Clients (in Sekunden)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Nicht schließen bei Spielsitzungen kürzer als (in Sekunden)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Folgende Clients automatisch schließen:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Clients autom. schließen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Import-Ausschlussliste</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Warnung anzeigen, wenn zu große Medieninhalte zugewiesen werden</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Befehl zum Öffnen von Ordnern</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Bevorzugte Organisation für Alterseinstufung</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Installationsgröße beim Bibliotheksupdate aktualisieren</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Ermittelt und aktualisiert die Installationsgröße, falls Dateiänderungen seit dem letzten Scan erkannt wurden</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Keine</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Ausfüllen</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Einheitlich</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Ausfüllen &amp; Seitenverhältnis beibehalten</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Rechts</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Oben</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Unten</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Fehler beim Import</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Authentifizierung erforderlich</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Authentifizierung fehlgeschlagen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Alternativer Modus für WebView-Rendering</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Bei Problemen mit WebViews verwenden, zum Beispiel bei Dialogen der Integrations-Authentifizierung.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Partielles Laden umfangreicher Spielbeschreibungen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Große Beschreibungen können zu spürbaren Verzögerungen beim Auswählen von Spielen führen.\r\n\r\nFalls aktiviert, wird zunächst nur ein Teil des Beschreibungstextes mit der Option geladen, den Rest bei Bedarf zu laden.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Metadatenimport</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Metadaten herunterladen</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Gewählte Konfiguration für alle zukünftigen Metadatendownloads festlegen.\r\nKann auch in den Anwendungseinstellungen geändert werden.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Assistent für Emulationsimport</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Dieser Assistent hilft dir beim Herunterladen und Importieren von Konsolenemulatoren und beim Importieren emulierter Spiele.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Beachte, dass du später jederzeit weitere Emulatoren und/oder Spiele hinzufügen kannst (für Emulatoreinstellungen im Menü »Bibliothek« und für emulierte Spiele im Menü »Spiele hinzufügen«).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Die folgende Liste enthält Emulatoren, die Playnite automatisch erkennen und konfigurieren kann. Du kannst die Installationsdateien der Emulatoren von der jeweiligen Website herunterladen. Sobald du die Emulatoren manuell installiert hast, kannst du sie im Konfigurationsdialog für Emulatoren importieren.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Du kannst jeden auf deinem PC installierten Emulator importieren, indem du auf die Schaltfläche »Ordner autom. durchsuchen …« klickst. Playnite wird den ausgewählten Ordner nach allen bekannten Emulatoren durchsuchen und diese optional importieren. Du kannst diese Schaltfläche mehrfach verwenden, um Emulatoren aus verschiedenen Ordnern zu importieren. Die Emulatoren werden am Ende der aktuellen Liste hinzugefügt.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Du kannst Spiele importieren, indem du auf die Schaltfläche »Ordner via Emulator durchsuchen« klickst. Die Auswahl des passenden Emulators ermöglicht Playnite, die entsprechenden Dateitypen zu suchen und zu importieren. Du kannst diese Schaltfläche mehrfach verwenden, um Spiele aus verschiedenen Ordnern zu importieren. Die Spiele werden am Ende der aktuellen Liste hinzugefügt.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Du hast keinen Emulator ausgewählt, weshalb Playnite nicht in der Lage sein wird Spiele automatisch zu importieren. Bist du sicher, dass du den Import abbrechen möchtest?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Derzeit sind in Playnite keine Emulatoren konfiguriert. Du kannst keine Spiele importieren, ohne zuvor den Emulator zu konfigurieren und die passenden Dateitypen auszuwählen. Möchtest du jetzt einige Emulatoren hinzufügen?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Ordner via Emulator durchsuchen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Dateien auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Ordner autom. durchsuchen …</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Emulatoren konfigurieren …</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Suchvorgang …</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">{0} wird durchsucht …</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Einrichtungsassistent</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Dieser Assistent hilft dir beim automatischen Importieren von Spielen und der Konfiguration externer Spielebibliotheken. Playnite kann Spiele von mehreren Spieleplattformen wie Steam oder GOG automatisch importieren und zudem deine Bibliothek durch automatisches Aktualisieren während des Programmstarts aktuell halten.\r\n        \r\nNatürlich kannst du auch später Spiele sämtlicher Plattformen manuell hinzufügen, indem du im Hauptmenü auf die Schaltfläche »Playnite« klickst.\r\n.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Bibliotheksintegration</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Spiele automatisch von den unten aufgeführten Diensten importieren. Spätere Spieländerungen (Installationsstatus) werden beim Starten von Playnite automatisch oder aber manuell ausgelöst aktualisiert. Die ausgewählten Einstellungen beeinflussen die ursprünglichen und alle nachfolgenden Importe.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Konfiguration abgeschlossen</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Die Ersteinrichtung wurde abgeschlossen. Du kannst jedoch alle Einstellungen auch später im Menü »Einstellungen« ändern.\r\n\r\nWeiterhin kannst du jederzeit weitere Spiele inzufügen, indem du auf das Playnite-Logo klickst.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Mindestens eine Erweiterung konnte nicht heruntergeladen werden.\r\n\r\nDu kannst versuchen, diese erneut aus dem Add-on-Menü herunterzuladen, nachdem der Assistent für die erste Ausführung abgeschlossen ist.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">{0}-Integration wird heruntergeladen …</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Liste der empfohlenen Integrationen wird heruntergeladen …</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Liste der empfohlenen Integrationen konnte nicht heruntergeladen werden. Du kannst die Integrationen später über das Addon-Menü erneut herunterladen.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Plattformen &amp; Emulatoren konfigurieren</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Emulatoren konfigurieren</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Plattformen</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Plattform</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulatoren</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Plattform hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Icon auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Cover auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Bild auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Element auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Hintergrund auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Datei auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">URL auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Emulator hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Unterstützte Plattformen</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Möchtest du die Plattformänderungen speichern?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Möchtest du die Emulatoränderungen speichern?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Ausführbare Datei</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumente</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Arbeitsverzeichnis</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Unterstützte Dateitypen</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Emulatoren importieren …</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Emulatoren herunterladen …</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Argumentevoreinstellung aus bekanntem Emulatorprofil laden</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Möchtest du den Emulator »{0}« wirklich entfernen?\r\nEr wird derzeit von {1} Spiel(en) verwendet.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Möchtest du die Plattform »{0}« wirklich entfernen?\r\nSie wird derzeit von {1} Spiel(en) und {2} Emulator(en) verwendet.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Hilfe zu Einstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sortieren nach</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Sortierrichtung</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Gruppieren nach</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Aufsteigend</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Absteigend</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Nicht gruppieren</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Nach Bibliiothek gruppieren</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Nach Kategorie gruppieren</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Nach Plattform gruppieren</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Ansichtstyp</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Anzeige</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Explorerleiste</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Filterleiste</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Icon</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Bibliotheken Icon</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Coverbild</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Hintergrundbild</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Sortiername</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Bibliothek</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Handbuch</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Name</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Installationslaufwerk</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Kontoname</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Plattform</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Genre</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Erscheinungsdatum</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Erscheinungsjahr</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Entwickler</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Schlagwort</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Publisher</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Installationsstatus</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Entspricht allen Filtern</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Falls aktiviert, werden nur Spiele angezeigt, die zu alle Einträge in allen Filtern passen.\r\nFalls deaktiviert, werden alle Spiele angezeigt, die zu einem beliebigen Eintrag eines beliebigen Filters passen.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Installiert</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Installiert</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Nicht installiert</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Versteckt</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favorit</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">HDR-Unterstützung aktivieren</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Falls aktiviert, wird HDR vor Starten des Spiels auf dem Hauptbildschirm aktiviert.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Beachte, dass HDR auf deinem Hauptbildschirm nicht unterstützt wird.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Zuletzt gespielt</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Beschreibung</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Installationsverzeichnis</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Coverbild</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Image-, ROM- oder ISO-Pfad</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Genre</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Genres</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Unternehmen</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Unternehmen</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Entwickler</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Entwickler</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Publisher</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Publisher</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategorie</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategorien</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Schlagwort</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Schlagwörter</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Feature</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Features</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Alterseinstufung</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Alterseinstufungen</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Region</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regionen</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Quelle</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Quellen</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Letzte Aktivität</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Datenbankfehler</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Datenbank konnte nicht geöffnet werden.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Datenbank ist nicht geöffnet.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Kein Zugriff auf Bibliotheksdatenbank: Datei »{0}« wird von einem anderen Prozess verwendet oder befindet sich an einem unerreichbaren Speicherort.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Diagnosedaten konnten nicht erzeugt werden.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Diagnosedaten konnten nicht automatisch hochgeladen werden.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Diagnosedaten wurden erfolgreich versendet.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Die Diagnosedaten wurden erfolgreich erzeugt und übermittelt.\r\nBitte ergänze deinen Problembericht um folgende Kennung:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Spiele von {0} konnten nicht importiert werden.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Emulierte Spiele konnten von {0} nicht importiert werden.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Mit dem ausgewählten Emulatorprofil kann nicht nach Spielen gesucht werden, da es keine Dateinamenerweiterungen oder Plattformen enthält.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite konnte nicht gestartet werden. Bitte beende alle anderen Instanzen von Playnite und versuche es erneut.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Design »{0}« mit Farbprofil »{1}« konnte nicht angewendet werden\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Link kann nicht geöffnet werden, da die URL ein ungültiges Format besitzt.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Anwendung konnte nicht gestartet werden.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Fehler beim Initialisieren der WebView-Komponente. Playnite kann den Startvorgang nicht fortsetzen.\r\n\r\nMehr Informationen unter https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Emulatoren können nicht importiert werden aufgrund fehlender oder beschädigter Definitionsdatei.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Menüaktion konnte nicht ausgeführt werden.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Spieldetails bearbeiten</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Bild-URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Link hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">ROM hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Änderungen speichern</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Feldänderungen auf bearbeitete(s) Spiel(e) anwenden.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Aktion hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Aktion entfernen</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">»Spielen«-Aktion entfernen</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Spiele hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Ordner durchsuchen …</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Installierte ermitteln</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Durchsuchen …</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Playnite öffnen</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Profileinstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Spielname darf nicht leer sein.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Tracking-Verzeichnis für Spielaktion darf nicht leer sein.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Spielname darf vor der Metadatensuche nicht leer sein.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Ungültige Spieledaten</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Bitte gib eine gültige, mit »http://« oder »https://« beginnende URL ein</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">URL auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Metadaten konnten nicht heruntergeladen werden: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Fehler beim Herunterladen</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Filter zurücksetzen</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Privates Konto</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Öffentliches Konto</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API-Schlüssel</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Fehler beim Starten</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Fehler beim Anwenden des Designs</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Alle zurücksetzen</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Wird installiert</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Wird deinstalliert</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Wird gestartet</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Wird ausgeführt</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Ungültige URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Nichts tun</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimieren</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Fenster wiederherstellen</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Fenster nur wiederherstellen, falls von Benutzeroberfläche gestartet</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Schließen</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Ändern</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Erweitert</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Nie</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Spielfortschritt</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Spielfortschritte</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Nutzerwertung</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Expertenwertung</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Communitywertung</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Spielskripte</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Anwendungsskripte</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Skripte</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Plugins</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Metadatenquellen</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Erweiterungen</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Erweiterungs-ID</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Skripte neu laden</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Interaktives PowerShell-SDK</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Alle Skripte erfolgreich neu geladen.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Für die angegebenen Such-/Filterkriterien wurden keine Spiele gefunden</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Keine Inhalte gefunden</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Zu Desktopmodus wechseln</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Playnite beenden</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Bibliotheken</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Alle aktualisieren</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Erstellt von:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Version:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Aktualisiert:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Bibliothek</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistik</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Alle</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Keine</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Benachrichtigungen</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Breite</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Höhe</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Größe</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Klein</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Groß</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Größer</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Sehr groß</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Standard</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Alle auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Alles abwählen</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Erstes</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Zufällig</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Nutzerauswahl</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Mehr laden</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Transparent</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Einklappen</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Ausklappen</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Alle einklappen</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Alle ausklappen</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Andere</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Designs</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Emulator-Argumente</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Eingebaute Argumente</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Benutzerdefinierte Argumente</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Weitere Emulator-Argumente</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Emulator-Argumente aufheben</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">»Spielen«-Aktion</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Zu importierende Metadaten auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Zu importierende Spiele auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Metadatensuche</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Aktualisierung verfügbar</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Änderungen seit der letzten Aktualisierung</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Aktualisierung herunterladen und installieren</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Nach Aktualisierungen suchen</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Fehler beim Aktualisieren</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Fehler bei der Suche nach Aktualisierungen.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Keine neue Version gefunden. Playnite ist aktuell.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Aktualisierung konnte nicht heruntergeladen und installiert werden.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Ein Hintergrundprozess wird gerade ausgeführt. Möchtest du ihn abbrechen und mit der Aktualisierung fortfahren?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Ein Hintergrundprozess wird gerade ausgeführt. Möchtest du ihn abbrechen und Playnite beenden?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Ein Hintergrundprozess wird gerade ausgeführt. Wenn du den Modus wechselst, wird der Prozess abgebrochen. Möchtest du trotzdem wechseln?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Für Playnite ist eine Aktualisierung verfügbar</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Designliste erneut laden</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Ausgewähltes Design anwenden</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Dateiänderungen überwachen</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Design bei Änderung der Quelldatei automatisch anwenden</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Skriptlaufzeit</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Vor Spielstart auszuführendes Skript</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Nach Spielende auszuführendes Skript</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Nach Spielstart auszuführendes Skript</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Bei Anwendungsstart ausführen</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Bei Anwendungsbeendigung ausführen</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Spiel startet Skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Spiel startete Skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Spiel beendete Skript</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Globales Skript ausführen</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Gefiltert</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Aktuell</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Neu</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Skript testen</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Nur ausgewählte Elemente anzeigen.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Als Standard speichern</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Zu Favoriten hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Aus Favoriten entfernen</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Dieses Spiel verstecken</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Nicht mehr verstecken</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">HDR-Unterstützung aktivieren</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">HDR-Unterstützung deaktivieren</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Bearbeiten …</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Installationsgröße berechnen</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Installationsgröße berechnen (alle Spiele)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Installationsgröße berechnen (nur fehlenden Daten)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Installationsgröße</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Kategorie zuweisen …</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Spielfortschritt festlegen</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Entfernen</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Spielen</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Installieren</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Spieloptionen</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Details</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Deinstallieren</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Installationsort öffnen</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Desktopverknüpfung erstellen</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Handbuch öffnen</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Mehr</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Von Bibliotheks-Plugin verwaltet</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Der Spielstart wird vom für dieses Spiel verantwortlichen Bibliotheks-Plugin gesteuert.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Auf der angegebenen Seite wurde zum Spiel »{0}« keine relevanten Informationen gefunden.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Tipp: Du kannst einen erweiterten Dialog zum Herunterladen von Metadaten verwenden, indem du den Menüpunkt »Bearbeiten« eines einzelnen Spiels anwählst.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Nicht verfügbar, solange eine andere Aktion ausgeführt wird.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Beschreibungstext muss HTML-Syntax verwenden</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Spielzeit wird in Sekunden gemessen.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Installationsgröße wird in Bytes angegeben</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Das Erscheinungsdatum muss im Format »Jahr-Monat-Tag« festgelegt werden. Die Werte für Monat und Tag können ausgelassen werden.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Werte von 0 bis 100 oder leer für keine Bewertung.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Playnite's Entwicklung wird von diesen Schirmherren und Ko-Fi-Mitgliedern unterstützt:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Mitwirkende bei Code, Lokalisierung etc:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Spielüberwachung beenden?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Die Installationsüberwachung wird derzeit ausgeführt. Möchtest du den Vorgang abbrechen und den vorherigen Zustand des Spiels wiederherstellen?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Die Ausführungsüberwachung für das Spiel wird derzeit ausgeführt. Möchtest du den Vorgang abbrechen und den vorherigen Zustand des Spiels wiederherstellen?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Zeit gespielt</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Zuletzt gespielt</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}d {1}h {2}min</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}min</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} Minuten</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} Sekunden</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Nicht gespielt</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Desktopmodus wird geöffnet …</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Vollbildmodus wird geöffnet …</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Spielebibliothek wird geladen …</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Installationsgröße wird berechnet …</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Installationsgröße von {0} wird berechnet …</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Skriptdatei konnte nicht installiert werden.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Skript wurde erfolgreich installiert.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Skript installieren</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Skriptfehler</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Erweiterungsfunktion konnte nicht ausgeführt werden.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Metadatenverzeichnis öffnen</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Berechnen</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Errechnet automatisch die Installationsgröße über die Roms, wenn das Spiel welche hat, oder über das Installationsverzeichnis, wenn es gesetzt wurde</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0}-Client ist nicht installiert.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Der {0}-Client wird nun gestartet. Bitte melde dich an und schließe danach diese Nachricht.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Es wird auf die Nutzeranmeldung gewartet. Bitte schließen, sobald du damit fertig bist …</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Installationsverzeichnis des Spiels nicht gefunden.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Ungültige Aktionskonfiguration für dieses Spiel.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Problembehebung bei der Kontosynchronisation</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Problembehebung</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Eintrag umbenennen</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Neuen Eintrag hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Name eingeben</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Neuen Namen eingeben</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Weniger als eine Stunde</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 bis 10 Stunden</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 bis 100 Stunden</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 bis 500 Stunden</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 bis 1.000 Stunden</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">Mehr als 1.000 Stunden</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite muss zum Abschließen der Installation neu gestartet werden. Möchtest du jetzt neu starten?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Erweiterung ist nicht ordnungsgemäß verpackt.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Design ist nicht ordnungsgemäß verpackt.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Erweiterung »{0}« konnte nicht ordnungsgemäß geladen werden.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Die Erweiterung »{0}« kann nicht geladen werden, da sie die derzeitige Playnite-Version nicht unterstützt.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Design »{0}« konnte nicht ordnungsgemäß geladen werden.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Das Design »{0}« kann nicht geladen werden, da es die derzeitige Playnite-Version nicht unterstützt.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Erweiterung konnte nicht ordnungsgemäß geladen werden.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Design konnte nicht ordnungsgemäß geladen werden.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Design/Erweiterung verwendet eine nicht unterstützte API-Version.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Installation war erfolgreich.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Add-on installieren?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Allgemein</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Das Add-on »{0}« konnte nicht aktualisiert werden.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Erweiterung konnte nicht installiert werden.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Möchtest du eine neue Erweiterung installieren?\r\n\r\n{0}\r\nVon {1}\r\nVersion {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Möchtest du die Erweiterung »{0}« aktualisieren?\r\n\r\nInstallierte Version: {1}\r\nNeue Version: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Design konnte nicht installiert werden.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Möchtest du ein neues Design installieren?\r\n\r\n{0}\r\nVon {1}\r\nVersion {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Möchtest du das Design »{0}« aktualisieren?\r\n\r\nInstallierte Version: {1}\r\nNeue Version: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Du bist im Begriff, Playnite zu verlassen und mit deinem Standard-Webbrowser die folgende Webseite zu öffnen. Möchtest du fortfahren?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Die ausgewählten Bilder sind möglicherweise zu groß für optimale Leistung. Das Verwenden sehr großer Bilder führt unter Umständen zu einer schlechteren Reaktionsfähigkeit der Benutzeroberfläche und erhöhtem Speicherbedarf.\r\n\r\nEmpfohlene Maximalauflösungen:\r\nIcon: {0} Megapixel\r\nCover: {1} Megapixel\r\nHintergründe: {2} Megapixel</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Leistungswarnung</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Nicht erneut zeigen</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Datei mit Erweiterung {0} ist nicht kompatibel.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Inkompatible Dateierweiterung</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Die ausgewählte Bilddatei ist für optimale Leistung möglicherweise zu groß.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Möchtest du das ausgewählte Design wirklich deinstallieren? Die Deinstallation wird beim nächsten Start von Playnite ausgeführt.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Integrierte Designs können nicht deinstalliert werden.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Dieses Design wird von dieser Playnite-Version nicht unterstützt.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Möchtest du die ausgewählte Erweiterung wirklich deinstallieren? Die Deinstallation wird beim nächsten Start von Playnite ausgeführt.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Integrierte Erweiterungen können nicht deinstalliert werden.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Diese Erweiterung wird von dieser Playnite-Version nicht unterstützt.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Installationsverzeichnis</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Datenverzeichnis</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Diagnosedaten werden erzeugt …</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Diagnosedaten werden hochgeladen …</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Datei importieren …</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Was ist das?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Bist du sicher, dass du das tun möchtest?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Gesamtspielzeit</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Durchschnittl. Spielzeit</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Höchstspielzeit</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Gesamtinstallationsgröße</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Übersicht</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Seitenleiste</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">In Seitenleiste anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Einstellungen zurücksetzen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Alle Anwendungseinstellungen werden auf ihren Standardwert zurückgesetzt, ausgenommen:\r\n- Datenbankverzeichnis\r\n- Import-Ausschlussliste\r\n- Erweiterungseinstellungen, einschließlich Bibliotheksintegrationen\r\n    \r\nZum Abschließen ist ein Neustart erforderlich. Möchtest du die Einstellungen zurücksetzen?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Für Entwickler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Externe Erweiterungen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Gib den vollständigen Ordnerpfad ein.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Errungenschaften</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Neuigkeiten</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Shopseite</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Die Ersteinrichtung ist nicht abgeschlossen. Playnite wird nun im Desktopmodus neu starten, um die Einrichtung abzuschließen.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Kürzlich gespielt</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favoriten</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Meistgespielt</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Alle</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Es sind Filter aktiv.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Es sind weitere Filter aktiv.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Suchergebnisse für:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Ein Element mit demselben Namen existiert bereits.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Auswahl auf aktuellen Filter begrenzen</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Anderes auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Add-ons …</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Installiert</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Erweiterungseinstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Durchsuchen </sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Aktualisierungen</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Aktualisierungen ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Die Verwaltung installierter Erweiterungen und Designs wurden einschließlich ihrer Einstellungen in das neue Menü »Add-ons« verschoben.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Alle aktuell installierten Erweiterungen für die Bibliotheksintegration können hier konfiguriert werden.\r\n\r\nFalls du weitere Integrationen installieren oder deinstallieren möchtest, verwende im Hauptmenü die Option »Add-ons«.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Desktop-Designs</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Vollbild-Designs</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Wird durchsucht …</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Das Add-on ist mit dieser Version von Playnite nicht kompatibel.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Das Installationspaket des Add-ons konnte nicht heruntergeladen werden.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Das Installationsmanifest des Add-ons konnte nicht heruntergeladen werden.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Ein Neustart ist erforderlich, um ausstehende Änderungen anzuwenden.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Dieses Add-on ist für die Installation vorgemerkt.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Installieren</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Wiederinstallieren</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Deinstallieren</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Bereits installiert</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Keine neuen Aktualisierungen für Add-ons gefunden.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Add-ons aktualisieren</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Änderungsprotokoll ist nicht verfügbar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Für Installation vorgemerkt</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Herunterladen gescheitert</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Lizenz abgelehnt</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">{0} wird heruntergeladen …</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Aktualisierungen für Add-ons werden gesucht …</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Suche nach Programmaktualisierungen...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Für mindestens ein Add-on ist eine Aktualisierung verfügbar.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Wähle die zu aktualisierenden Elemente aus</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Instanz für Erweiterungsentwicklung</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} Lizenzvereinbarung</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Zustimmen</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Ablehnen</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">»Spielen«-Aktionen der Bibliotheksintegration miteinbeziehen</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Aktion auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Trackingmodus</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Tracking-Pfad</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Anfängliche Tracking-Verzögerung</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Tracking-Frequenz</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Link</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Datei</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Skript</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Standard</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Prozess</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Ordner</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Originalprozess</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Prozessname</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Protokollmeldungen aufzeichnen</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Folgende Änderungen überschreiben Daten aller aktuell ausgewählten Spiele!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Keiner</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Einheitlich</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Nur Elemente</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Nur Anfang und Ende</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Scroll-Empfindlichkeit</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Sanftes Scrollen</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Animationsgeschwindigkeit</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Element entfernen?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Möchtest du dieses Element wirklich entfernen?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Schaltflächen in oberer Leiste anzeigen:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Allgemeine Ansichtseinstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Gruppierungseinstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Sortierungseinstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Filtervoreinstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Position von Plugin-Elementen</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Breite der Abschnittstrenner</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Hauptmenü-Schaltfläche in Seitenleiste verschieben</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Explorerleiste</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Zufällige Spieleauswahl</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Zufällige Spielauswahl</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Zufälliges Spiel aus der aktuellen Ansicht auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Gruppierungs- und Sortiereinstellungen speichern</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Als Schnellfilter im Vollbildmodus anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Letzte 7 Tage</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Letzte 31 Tage</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Letzte 365 Tage</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Vor mehr als 365 Tagen</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Konfigurieren</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Voreinstellung speichern</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Nach Starten des Spiels minimieren</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Playnite nach dem Starten des Spiels minimieren.\r\n\r\nDas Deaktivieren dieser Option kann zu Problemen mit Spielen führen, die beim Start keinen Eingabefokus erhalten!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Schriftgröße</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Schriftgröße klein</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">Unterstützung für Spielcontroller-API aktivieren</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Unterstützung für Spielcontroller</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Falls deaktiviert, wird Playnite keinerlei Eingaben von Spielcontrollern akzeptieren.\r\n        \r\nDeaktivieren, falls du Tools verwendest, die Eingaben von Spielcontrollern in Maus-/Tastatureingaben übersetzen und du die Eingaben in Playnite doppelt erhälst.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Elemente im Hauptmenü anzeigen:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Invertierte Schaltflächenbindung der X/A-Hauptansicht</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Vertauscht Schaltflächenbindungen zum Starten eines Spiels und zum Anzeigen der Spieledetailsseite in der Hauptansicht.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Bindung der Bestätigungs-/Abbruchtaste tauschen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Invertiert die A/B-Tastenbindungen für Bestätigung und Abbruch.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Nur Primärcontroller</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Falls aktiviert, werden nur Eingaben des Primärcontrollers akzeptiert.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Guide-Taste fokussiert Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Lautstärke Oberfläche</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Lautstärke Hintergrund</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Im Hintergrund stummschalten</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Audio-Schnittstelle konnte nicht initialisiert werden.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Ausgabe-API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">Für die Audioausgabe verwendete API. Ändern bei Problemen mit der Tonausgabe.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Allgemein</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Anzeige</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Audio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menüs</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Eingabe</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} startet …</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} läuft …</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Umsch</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Leertaste</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Bild-Render-Scaler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternativ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Ausgewogen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Qualität</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Qualität:\r\nBeste Bildqualität, langsam, hoher Speicherverbrauch.\r\n    \r\nAusgewogen:\r\nGute Bildqualität, schnell, geringer Speicherverbrauch.\r\n    \r\nAlternativ:\r\nBessere Bildqualität, mittlere Geschwindigkeit, geringer Speicherverbrauch.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Datei auswählen …</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Ordner auswählen …</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Skript zum Starten</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Bitte beachte, dass sowohl Erweiterungen als auch Designs die Leistung, Stabilität und Sicherheit von Playnite stark beeinflussen können.\r\n\r\nFalls nach dem Installieren von Designs oder Erweiterungen Probleme auftreten, versuche zuerst, diese zu deaktivieren/deinstallieren, um zu überprüfen, ob sie die Ursache des Problems sind.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Bei Start auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Bei Start auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Integrierte Profile</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Integriertes Profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Personalisierte Profile</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Personalisiertes Profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Verwaltet von einem integrierten Skript</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Spezifikation Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Spezifikation Plattform</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Spezifikation Region</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Vor Start des Emulators ausführen</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Nach Start des Emulators ausführen</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Nach Verlassen des Emulators ausführen</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Ausführebare Programmdatei des Emulators nicht gefunden.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Spezifikation des Emulators nicht gefunden.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Skript zum Starten des Emulators nicht gefunden.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Als separate Spiele aufteilen</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Zu einem Spiel zusammenfassen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Plattform festlegen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Region festlegen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Ordner durchsuchen </sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Scan-Konfigurationen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Ausschlussmuster für Prüfsummen-Scan</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Mit angebenen Muster(n) übereinstimmende Dateien werden nicht für die Prüfsumme durchsucht und werden über den Dateinamen zugeordnet. Siehe Emulator-Hilfeseite für weitere Informationen.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Mit Emulator durchsuchen</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Der Name muss festgelegt sein, um eine neue Konfiguration zu speichern.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Emulator oder Emulatorprofil ist nicht festgelegt.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Zu durchsuchendes Verzeichnis ist nicht angegeben oder existiert nicht.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Scan-Konfiguration ist nicht richtig festgelegt.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">In automatischen Massenscan miteinbeziehen</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Ordner konnte nicht nach Emulatoren durchsucht werden.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Ordner konnte(n) nicht nach emulierten Spielen durchsucht werden.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Importierte ausblenden</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Zu importierende Profile:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Konfigurationen für Auto-Scan</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Als Konfiguration für Auto-Scan speichern</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Speichert die Konfiguration während einer Bibliotheksaktualisierung für eine spätere Verwendung. Gespeicherte Konfigurationen können über »Emulatoren konfigurieren« verwaltet werden.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Mit relativen Pfaden importieren</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Falls möglich, beim Importieren von Spieledateien Pfade relativ zum Installationsordner von Playnite oder des Emulators verwenden.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Unterordner durchsuchen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Archive durchsuchen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Zusammengehörige Dateien zusammenführen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Zusammengehörige Spieldateien, wie einzelne Spieldiscs, unter einem Spieleintrag zusammenfassen.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Scanner hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Gespeicherten Scanner hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Suche starten</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Füge Scan-Konfigurationen mit Emulatoren hinzu, um bestimmte Ordner zu durchsuchen. Achte vor Importieren der Spiele darauf, dass die Emulatoren korrekt konfiguriert wurden (über Bibliothek → Emulatoren konfigurieren).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Neu hinzugefügten Spielen zugeordneter Standardstatus</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Erstmalig gespielten Spielen zugeordneter Status</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Initialisierung der PowerShell-Skript-Laufzeitumgebung ist fehlgeschlagen. Falls du Windows 7 nutzt, versuche PowerShell 5.1 (erneut) zu installieren, um das Problem zu beheben.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Filtervoreinstellung mit angegebenem Namen existiert bereits. Voreinstellung mit neuen Einstellungen aktualisieren?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Fülle automatisch fehlende Sortiernamen für Massen-hinzugefügte oder bearbeitete Spiele</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">Wenn du ein Spiel bearbeitest, füge Spiele über ein Bibliotheksupdate, einen Emulator Ordner oder einen normalen Ordner-Scan hinzu füllen Sie automatisch das Feld &quot;Sortiername&quot; mit einer besser sortierbaren Darstellung des Spielnamens aus. Zum Beispiel &quot;The Witcher 3&quot; bekommt einen Sortiernamen von &quot;Witcher 03&quot;. Dies wird niemals einen Sortiernamen angeben, der sich nicht vom Spielnamen unterscheidet, und es wird nur automatisch die Sortierung leerer Namen aktualisieren.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Diese Wörter werden vom Anfang des automatisch ausgefüllten Sortiernamens entfernt:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Verwende diese Option, um für Sortierzwecke Wörter am Anfang einer Zeichenkette zu ignorieren. Standard ist »The«, »An« und »A«.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Sortiernamen ausfüllen für Spiele ohne Sortiernamen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Sortierung</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Sortiernamen werden mit Werten gefüllt …</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Auf deinem System wurde der Nahimic-Dienst erkannt. Dieser Dienst ist dafür bekannt, Rendering-Probleme in Playnite (und anderen Anwendungen) zu verursachen.        \r\n\r\nFalls du in Playnite Grafikfehler oder andere Darstellungsprobleme feststellst, empfehlen wir, den Nahimic-Dienst zu deaktivieren oder vollständig zu deinstallieren.\r\n\r\nMehr Informationen unter https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite wird mit erhöhten Berechtigungen ausgeführt (als Administrator). Dies wird nicht empfohlen, da dann auch alle installierten Erweiterungen und über Playnite gestarteten Spiele/Anwendungen mit erhöhten Berechtigungen ausgeführt werden.\r\n\r\nMehr Informationen unter https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Warnung anzeigen, falls Playnite mit erhöhten Berechtigungen ausgeführt wird</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Beim Berechnen der Installationsgröße die tatsächliche Größe auf dem Laufwerk ermitteln</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Wenn aktiviert, werden die Scans langsamer und die tatsächliche Größe ermittelt, die die Dateien auf dem Laufwerk einnehmen.\r\nWenn deaktiviert, werden die Scans schneller und die Größe der Dateien selbst wird verwendet.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Folgende Add-on(s) wurden als potentiell problematisch gemeldet, entweder wegen starker Beeinträchtigung der Stabilität/Leistung oder wegen Sicherheitsbedenken. Wir empfehlen nachdrücklich diese zu deinstallieren:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Online-Dateien von Scan ausschließen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Dateien aus Cloud-Speichern werden nicht durchsucht und importiert, sofern sie nicht lokal verfügbar sind.\r\nNur Unterstützung für: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Mit vereinfachter Methode ohne Dateiinhalt durchsuchen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Dateien werden importiert, aber mit einer ungenaueren Methode, die nicht voraussetzt, dass der Dateiinhalt heruntergeladen wird und lokal verfügbar ist.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Auf alle anwenden</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Installationsstatus übergehen</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Falls aktiviert, ignoriert Playnite den Installationszustand (einschließlich des Installationsverzeichnisses), der von dem Integrations-Plugin festgelegt wurde, das dieses Spiel importiert.\r\n        \r\nDiese Option funktioniert möglicherweise nicht vollständig mit Plugins, die eine bestimmte Methode zum Importieren von Spielen verwenden, es sei denn, diese berücksichtigen auch diese Option.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Nur manuell</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Täglich</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Wöchentlich</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Bei jedem Start</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Nach Programmaktualisierungen suchen</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Nach Add-on-Aktualisierungen suchen</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Bibliotheken aktualisieren</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Emulationsordner durchsuchen</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Versteckte Spiele einbeziehen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Felder bearbeiten</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Alle aus-/abwählen</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Öffnen</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Aktivieren</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Zuweisen</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Tippen, um nach Spielen zu suchen … [F1] für Hilfe</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Die Eingabe von »#« als erstes Zeichen zeigt eine Liste der verfügbaren Befehle an.\r\nDie Eingabe von »/« als erstes Zeichen zeigt eine Liste der verfügbaren Suchanbieter/Plugins an.\r\nDie Eingabe des Such-Schlüsselworts gefolgt von einem Leerzeichen wechselt sofort zu dieser Suche.\r\n\r\nTAB: Aktion wechseln\r\nEINGABETASTE: Ausgewählte Aktion aktivieren\r\nUMSCHALT-EINGABETASTE: Elementmenü öffnen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Nicht installierte Spiele einbeziehen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Versteckte Spiele einbeziehen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Nicht installierte Spiele eingeschlossen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Nicht installierte Spiele ausgeschlossen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Versteckte Spiele eingeschlossen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Versteckte Spiele ausgeschlossen</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Spielen oder installieren</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Details aufrufen</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Spielmenü</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Spiel bearbeiten</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Suche öffnen</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Suchfeld</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Such-Schaltfläche</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Primäre Spielaktion</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Sekundäre Spielaktion</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">STRG-F öffnet die globale Suche, anstatt auf das Suchfeld zu fokussieren</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Spielefiltereinstellungen zwischen Suchläufen speichern</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Suchanbieter</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Standard-Schlüsselwort</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Personalisiertes Schlüsselwort</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Systemweiter Tastaturkurzbefehl</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite-Suche</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Erweiterungseinstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Ausschlüsse</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Ausgeschlossene Dateien relativ zum Scan-Ordner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Ausgeschlossene Ordner relativ zum Scan-Ordner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Datei zur Ausschlussliste hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Ordner zur Ausschlussliste hinzufügen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Ausschlüsse können lediglich zu gespeicherten Scannerkonfigurationen hinzugefügt werden.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Ausschlüsse wurden zum »{0}«-Scanner hinzugefügt.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Plattform übergehen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Falls aktiviert, wird der Scanner diese Plattform allen Spielen zuweisen und jegliche automatisch erkannten Plattformen übergehen.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Befehle in Standardsuche einbeziehen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Falls deaktiviert, werden Befehle nicht in der Standardsuche berücksichtigt, es sei denn, es wird das Zeichen »#« vorangestellt.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Unscharfe Suche im Namensfilter verwenden</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Falls aktiviert, wird der Namensfilter auf dieselbe Weise mit Spielenamen abgeglichen, wie in der globalen Suche.\r\nStrenge Übereinstimmung kann im Einzelfall erzwungen werden, indem dem Filter das Zeichen »!« vorangestellt wird.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Für Spieleergebnisse anzuzeigende Felder:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Versteckter Status</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Datensicherung wurde abgebrochen.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Datensicherung gescheitert.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Datensicherungsfehler</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Datensicherung in Arbeit …</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Daten werden aus Sicherung wiederhergestellt …</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Daten konnten aus Sicherung nicht wiederhergestellt werden.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Einstellungen</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Spielebibliothek</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Medien aus Spielebibliothek</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Installierte Erweiterungen</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Erweiterungsdaten</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Installierte Designs</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Wählen Sie die Daten aus, die aus der angegebenen Sicherungsdatei wiederhergestellt werden sollen.\r\n    \r\nPlaynite wird automatisch neu starten, um die Sicherungswiederherstellung zu starten.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Elemente zur Datensicherung auswählen. Anwendungseinstellungen und Spielbibliotheksdaten sind standardmäßig enthalten.\r\n    \r\nPlaynite wird automatisch neu gestartet, um die Sicherung zu starten.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Automatische Datensicherung</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Häufigkeit der automatischen Datensicherung</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Sicherungsordner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Rotierende Sicherungen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Zusätzliche Daten einbeziehen:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Bei aktivierter automatischer Datensicherung muss ein Sicherungsordner festgelegt sein.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Nur Benachrichtigungen für Patch-Änderungen anzeigen</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Wenn aktiviert, werden nur Aktualisierungen für derzeit installierte Hauptversionen zu einer Updatebenachrichtigung führen.\r\nNeue Hauptversionen werden nicht zu einer Updatebenachrichtigung führen.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Relative Datumsangabe für die letzte Woche verwenden</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Relative Datumsangabe (&quot;Heute&quot;, &quot;Gestern&quot;, etc.) für Daten werden, die nicht mehr als eine Woche zurückliegen.\r\n    \r\nDas angegebene Datumsformat wird für alle anderen Daten verwendet.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Web-Bildsuche</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Suchbegriff für Icon Bilder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Suchzeichenfolge für Coverbilder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Suchzeichenfolge für Hintergrundbilder</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Informationen zu Add-ons werden abgerufen …</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Keine Metadatenquelle verfügbar</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Einstellungen für »Spielen«-Aktion</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Scannereinstellungen verwenden</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Profil beim Start auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Emulator beim Start auswählen</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automatisch</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Immer an</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Immer aus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Unterstützung für Barrierefreiheit (Bildschirmleser)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Anwendungsmenü</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Spielmenü</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Programmordner</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Benutzerdatenverzeichnis</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Die Bibliotheksdatei wurde beschädigt, Playnite wird nun heruntergefahren.\r\n    \r\nMelde das Problem auf der GitHub-Seite von Playnite mit einer Anfrage, die Beschädigung deiner Dateien zu beheben.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Möchtest du die vorgenommenen Änderungen speichern?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Portable Installation</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Keine Controller erkannt</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/el_GR.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Greek</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Γλώσσα</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Έξοδος</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Φίλτρο Ενεργό</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Φίλτρο Απενεργοποιημένο</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Επιπρόσθετα φίλτρα</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Φίλτρα</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Φιλτράρισμα</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Μη Έγκυρα Δεδομένα</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Αποθήκευση Αλλαγών?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Ιστοσελίδα www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Πηγαίος Κώδικας στο GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Δημιουργία diag. πακέτου</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Αποστολή διαγνωστικών δεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Σχετικά με το Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Φτιάχτηκε από τον Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Αντιστοίχιση κατηγορίας</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Ορισμός Κατηγοριών</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Προσθήκη Κατηγορίας</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Επιλεγμένο - Αντιστοίχιση κατηγορίας\r\nΜη επιλεγμένο - Κατάργηση κατηγορίας\r\nΑπροσδιόριστο - Καμία αλλαγή (σε επεξεργασία πολλών παιχνιδιών)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Χωρίς Κατηγορία</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Χωρίς Πλατφόρμα</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ουπς! Κάτι πήγε στραβά...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Προέκυψε μη ανακτήσιμο σφάλμα.\r\n\r\nΑν επιθυμείς, μπορείς να μας βοηθήσεις να διορθώσουμε αυτό το πρόβλημα, παρακαλούμε περιέγραψε συνοπτικά τις ενέργειες σου πριν το σφάλμα, και μετά στείλε διαγνοστικές πληροφορίες.\r\nΑν είσαι συνδεδεμένος, το πακέτο θα ανεβεί στον διακοσμιτή του Playnite για ανάλυση.\r\n\r\nΕναλλακτικά, μπορείς να πατήσεις στο 'Αναφορά Σφάλματος' για την δημιουργία ενός GitHub issue και να αναφέρεις το σφάλμα χειροκίνητα.\r\n\r\nΕυχαριστούμε για την βοήθεια.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Η επέκταση &quot;{0}&quot; προκάλεσε ένα μη ανακτήσιμο σφάλμα.\r\n\r\nΣυνιστούμε να αποθηκεύσετε το αρχείο καταγραφής και να αναφέρετε το ζήτημα στον προγραμματιστή της επέκτασης. Εάν το ζήτημα συνεχίσει να εμφανίζεται, απενεργοποιήστε την επέκταση.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Η επέκταση &quot;{0}&quot; προκάλεσε ένα μη ανακτήσιμο σφάλμα.\r\n\r\nΣυνιστούμε να αναφέρετε το ζήτημα στον προγραμματιστή της επέκτασης. Εάν το ζήτημα συνεχίσει να εμφανίζεται, απενεργοποιήστε την επέκταση.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Μια άγνωστη επέκταση ή ένα θέμα προκάλεσε ένα μη ανακτήσιμο σφάλμα.\r\n\r\nΣυνιστούμε να απενεργοποιήσετε τα πρόσθετα τρίτων, να απομονώσετε το προβληματικό πρόσθετο  και να αναφέρετε το θέμα στον προγραμματιστή του.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Παρουσιάστηκε μη ανακτήσιμο σφάλμα.\r\n\r\nΑν θέλετε να μας βοηθήσετε να διορθώσουμε αυτό το πρόβλημα, παρακαλούμε να στείλετε διαγνωστικές πληροφορίες. Σας ευχαριστούμε.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Απενεργοποίηση επεκτάσεων</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Αποθήκευση αρχείου καταγραφής</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Αποστολή διαγράμματος πληροφοριών</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Αναφορά Σφάλματος</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Επανεκκίνηση Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Επανεκκίνηση σε ασφαλή λειτουργία</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Απενεργοποίηση όλων των επεκτάσεων τρίτων και χρήση προεπιλεγμένου θέματος.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Έξοδος απ'το Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Ενέργειες που πάρθηκαν πριν το σφάλμα (στα Αγγλικά)</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Διαχείριση Συλλογής</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Κατάργηση Παιχνιδιών?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Δεν είναι δυνατή η αφαίρεση - Το παιχνίδι ή το πρόγραμμα εγκατάστασης εκτελείται.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Δεν είναι δυνατή η απεγκατάσταση - Το παιχνίδι εκτελείται.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το {0};</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Είστε βέβαιοι ότι θέλετε να καταργήσετε {0} παιχνίδια;</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Είστε βέβαιοι ότι θέλετε να αφαιρέσετε {0}?\r\n\r\nΕπιλέγοντας τη ρύθμιση &quot;προσθήκη στη λίστα αποκλεισμών&quot; αποτρέπετε το παιχνίδι από το να προστεθεί ξανά την επόμενη φορά που η βιβλιοθήκη θα ενημερωθεί.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Είστε βέβαιοι ότι θέλετε να αφαιρέσετε {0} παιχνίδια;\r\n\r\nΕπιλέγοντας τη ρύθμιση &quot;προσθήκη στη λίστα αποκλεισμών&quot; αποτρέπετε το παιχνίδι από το να προστεθεί ξανά την επόμενη φορά που η βιβλιοθήκη θα ενημερωθεί.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Είστε βέβαιοι ότι θέλετε να αφαιρέσετε {0} προσθήκες που δεν χρησιμοποιούνται αυτή την στιγμή;</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Δεν βρέθηκαν αχρησιμοποίητα πεδία.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Ναι (προσθήκη στη λίστα εξαιρέσεων)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Υπάρχουν αλλαγές σε αυτή την ενότητα που δεν έχουν αποθηκευτεί</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Η βιβλιοθήκη παιχνιδιών ενημερώνεται…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Η ενημέρωση της βάσης δεδομένων απέτυχε.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Η συλλογή παιχνιδιών δεν μπορεί να ενημερωθεί. Χρειάζονται {0} MB ελεύθερου χώρου.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Σφάλμα παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Δεν είναι δυνατή η έναρξη παιχνιδιού. '{0}' δεν βρέθηκε στη βάση δεδομένων.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Δεν είναι δυνατή η έναρξη του παιχνιδιού: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Δεν είναι δυνατή η έναρξη της εντολής: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Δεν είναι δυνατό να ανοίξει η θέση του παιχνιδιού: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Αδυναμία εντοπισμού μεγέθους εγκατάστασης παιχνιδιού: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Σφάλμα σάρωσης μεγέθους εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Υπήρξαν {0} σφάλματα κατά τη σάρωση μεγέθους εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Δεν ήταν δυνατή η δημιουργία συντόμευσης: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Απέτυχε το άνοιγμα του εγχειριδίου: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Δεν είναι δυνατή η εγκατάσταση του παιχνιδιού: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Δεν είναι δυνατή η απεγκατάσταση του παιχνιδιού: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Εντοπίστηκαν εσφαλμένες ρυθμίσεις εκκίνησης παιχνιδιού. Όταν χρησιμοποιείτε ενέργειες εξομοιωτή, βεβαιωθείτε ότι οι ορισμοί της πλατφόρμας ταιριάζουν με εκείνες των ρυθμίσεων του παιχνιδιού και του εξομοιωτή.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Η υλοποίηση της εγκατάστασης δεν μπορεί να πραγματοποιηθεί.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Το πρόσθετο βιβλιοθήκης που αφορά αυτό το παιχνίδι δεν έχει εγκατασταθεί ή είναι απενεργοποιημένο.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Η λήψη των επίσημων μεταδεδομένων δεν είναι διαθέσιμη.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Δεν έχει επιλεχθεί παιχνίδι.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Η εκτέλεση σεναρίου του παιχνιδιού απέτυχε.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Η εκτέλεση σεναρίου της εφαρμογής απέτυχε.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Η καθολική εκτέλεση σεναρίου απέτυχε.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Η εκτέλεση σεναρίου του εξομοιωτή απέτυχε.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Η εκτέλεση σεναρίου παιξίματος απέτυχε.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">Το PowerShell 3.0 ή νεότερη έκδοση δεν είναι εγκατεστημένη.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Ο τρόπος εκκίνησης παιχνιδιού δεν μπορεί να καθοριστεί.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Ενεργοποιημένο</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Απενεργοποιημένο</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Αφαίρεση</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Αφαίρεση αχρησιμοποίητων</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Μετονομασία</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Αντιγραφή</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Προσθήκη</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Προεπιλεγμένο εικονίδιο</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Προκαθορισμένη Εικόνα Εξώφυλλου</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Προεπιλεγμένη Εικόνα Παρασκηνίου</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Τερματισμός</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Επόμενο</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Πίσω</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">ΟΛΟΚΛΗΡΩΣΗ</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">ΠΙΣΩ</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">ΚΑΘΑΡΙΣΜΟΣ</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Εκκαθάριση</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Απόρριψη</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Απόρριψη Όλων</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Εισαγωγή</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Όνομα</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Δημιουργός</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Πρόσθετο</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Σειρά</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Έκδοση</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Τελευταία Συνεδρία</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Παίχτηκαν Περισσότερο</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Μετρητής Παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Μέγεθος Εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Φάκελος</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Σημειώσεις</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Προστέθηκε</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Ημερομηνία Προσθήκης</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Τροποποιήθηκε</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Ημερομηνία Τροποποίησης</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Ιστότοπος</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Διαδρομή αρχείου</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">ΟΚ</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Αποθήκευση</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Κλείσιμο</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Ακύρωση</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Επιβεβαίωση</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Επαναφορά</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Ναι</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Όχι</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Καλώς Ήρθατε</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Τοπικός Χρήστης</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Γενικά</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Πολυμέσα</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Σύνδεσμοι</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Εγκατάσταση</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Ενέργειες</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Γίνεται λήψη...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Γίνεται λήψη πολυμέσων...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Φόρτωση…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Τύπος</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Προφίλ</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Προφίλ</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Αφαίρεση</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Λήψη</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Αναζήτηση</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Ανάλυση:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Όλες</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Μεγέθυνση</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Προβολή Λίστας</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Εξώφυλλα</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Προβολή Πλακιδίων</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Λεπτομερής Προβολή</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Προσαρμοσμένο</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Ιδιαίτερες ευχαριστίες</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Άδεια</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Συνεισφέροντες</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Γίνεται έξοδος από το Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Σήμερα</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Χθες</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Δευτέρα</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Τρίτη</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Τετάρτη</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Πέμπτη</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Παρασκευή</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Σάββατο</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Κυριακή</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Προηγούμενη Eβδομάδα</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Προηγούμενος Mήνας</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Το Προηγούμενο Έτος</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Περισσότερο από ένα χρόνο πριν</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 έως 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB έως 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB έως 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB έως 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB έως 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB έως 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB έως 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB ή περισσότερα</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Η εισαγωγή ολοκληρώθηκε με επιτυχία.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Όλα τα παιχνίδια</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ID Παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">ID Βάσης Δεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Προεπιλογές</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Στήλη</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Στήλες</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Σειρά</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Σειρές</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Αδυναμία λήψης εικονιδίου της Ενέργειας Αναπαραγωγής. Δεν υπάρχει καμία ενέργεια στον τύπο &quot;αρχείο&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Λήψη μόνο των μεταδεδομένων που λείπουν</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Η ενεργοποίηση αυτής της επιλογής θα παρακάμψει τη λήψη μεταδεδομένων στα πεδία δεδομένων όπου υπάρχουν ήδη πληροφορίες.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Επιλογή παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Επιλέξτε ποια παιχνίδια θα ενημερωθούν με νέα μεταδεδομένα:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Όλα τα παιχνίδια της βάσης δεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Όλα τα παιχνίδια σε φίλτρο αυτή τη στιγμή.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Μόνο τα επιλεγμένα παιχνίδια</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Δεν έχουν επιλεχθεί πεδία μεταδεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Δεν έχουν επιλεχθεί πεδία μεταδεδομένων για κατέβασμα. Παρακαλώ επιλέξτε τουλάχιστον ένα πεδίο και ενεργοποιήστε έστω έναν πάροχο μεταδεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Επίσημο Κατάστημα</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Επιλέξτε ποια πεδία πρέπει να συμπληρωθούν αυτόματα από το Playnite και ποιες πηγές θα πρέπει να χρησιμοποιηθούν για την απόκτηση των δεδομένων.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Κάντε κλικ στο παραπάνω λογότυπο για να συνεισφέρετε στην ενημέρωση της βάσης δεδομένων του igdb.com και τη βελτίωση των πληροφοριών των χρηστών του Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Λήψη metadata...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Γίνεται εισαγωγή εγκατεστημένων παιχνιδιών....</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Εισαγωγή {0} παιχνιδιών…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Εισαγωγή παιχνιδιών εξομοιωτή από {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Γίνεται λήψη ενημερώσεων βιβλιοθήκης...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Γίνεται σάρωση του μεγέθους των παιχνιδιών στη βιβλιοθήκη...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Γίνεται σάρωση του μεγέθους εισαγόμενων παιχνιδιών…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Η ενημέρωση της βιβλιοθήκης ολοκληρώθηκε</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Απελευθέρωση πόρων...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Διαμόρφωση</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Ρυθμίσεις...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Πλατφόρμες και εξομοιωτές</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Επεξεργασία Εξομοιωτών…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Διαχειριστής Βιβλιοθήκης…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Εργαλεία</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Λήψη Μεταδεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Εργαλεία λογισμικού…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Επεξεργασία Ενσωματώσεων...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Άνοιγμα 3rd Party Client</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Προγράμματα τρίτων</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Ενημέρωση Βιβλιοθήκης Παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Ακύρωση Ενημέρωσης Βιβλιοθήκης</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Ενημέρωση Φακέλων Εξομοιωτή</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Προσθήκη Παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Χειροκίνητα...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Αυτόματη Σάρωση...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Παιχνίδι Εξομοίωσης...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Εφαρμογή Microsoft Store...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Σχετικά με το Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Αποστολή Σχολίων</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Μεταφορά σε Λειτουργία Πλήρους Οθόνης</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Σύνδεσμοι</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Βοήθεια</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Υποστήριξη στο Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Υποστήριξη στο Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Εγχειρίδιο χρήστη</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Οδηγίες SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Επανεκκίνηση του Συστήματος</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Απενεργοποίηση Συστήματος</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Αναστολή Λειτουργίας</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Αδρανοποίηση</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Κλείδωμα Συστήματος</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Αποσύνδεση Χρήστη</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Επιλογή Τυχαίου Παιχνιδιού</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Πεδία παιχνιδιού που θα εμφανίζονται στον πίνακα λεπτομερειών:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Διάστιχο αντικειμένων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Σχεδίαση παρασκηνίου των στοιχείων πλακιδίων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Πλάτος ορίου περιγράμματος πλακιδίων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Το εικονίδιο παιχνιδιού δεν έχει πηγή</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Το εξώφυλλο παιχνιδιού δεν έχει πηγή</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Το φόντο παιχνιδιού δεν έχει πηγή</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Κάθετη απόσταση των λεπτομερειών παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Θέση λεπτομερειών Προβολής πλακιδίων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Θέση λίστας παιχνιδιών στην Προβολή παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Εμφάνιση διαχωριστικού μεταξύ των πινάκων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Μέγεθος εξωφύλλου παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Μέγεθος εικονιδίου της Λίστας παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Γραμματοσειρά εφαρμογής</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Μονοδιαστηματική γραμματοσειρά</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Θέση Πίνακα Φίλτρων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Θέση Πίνακα Εξερεύνησης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Αποτύπωση εικαστικού εξώφυλλων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Αναλογία διαστάσεων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Οι παρακάτω επιλογές επηρεάζουν την αποτύπωση των πλακιδίων και στη λειτουργία πλήρους οθόνης!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Μορφή γεμίσματος</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Κουτί από DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Τετράγωνο</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Κάδρο Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Εξώφυλλο Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Απαιτείται επανεκκίνηση για επιβεβαίωση</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Ρυθμίσεις</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Γενικά</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Άνω Εργαλειοθήκη</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Εμφάνιση</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Λεπτομέρειες Παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Διάταξη</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Για Προχωρημένους</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Πλήρης Οθόνη</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Εισαγωγή</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Απόδοση</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Μεταδεδομένα</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Ενημέρωση...</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Αναζήτηση</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Αντίγραφο Ασφαλείας</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Αντίγραφο Ασφαλείας Δεδομένων Βιβλιοθήκης</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Επαναφορά Δεδομένων Αντιγράφων Ασφαλείας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Αυτόματη εισαγωγή στη βιβλιοθήκη</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Μη έγκυρη θέση αρχείου βάσης δεδομένων, πρέπει να οριστεί κατάλληλη διαδρομή αρχείου.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Το όνομα λογαριασμού δεν μπορεί να είναι κενό.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Λήψη μεταδεδομένων μετά την εισαγωγή παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Εκκίνηση του Playnite σε ελαχιστοποίηση</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Εκκίνηση του Playnite κατά την εκκίνηση του υπολογιστή σας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Εκκίνηση ως κλειστό στη γραμμή ειδοποιήσεων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Η εντολή έναρξης του Playnite κατά την εκκίνηση του υπολογιστή δεν καταχωρήθηκε.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Εκκίνηση σε Λειτουργία Πλήρους Οθόνης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Ασύγχρονη φόρτωση εικόνων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Βελτιώνει την ομαλότητα κύλισης στις λίστες παιχνιδιών μειώνοντας ωστόσο τους χρόνους φόρτωσης των εικόνων.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Εμφάνιση του ονόματος παιχνιδιού όταν λείπει το εξώφυλλο</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Εμφάνιση ονομάτων παιχνιδιών στην Προβολή πλακιδίων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Σκίαση των μη εγκατεστημένων παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Εμφάνιση εικονιδίων παιχνιδιού στην προβολή λίστας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Εμφάνιση του αριθμού αντικειμένων στις περιγραφές της ομάδας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Εμφάνιση μόνο των καθορισμένων πεδίων στα φίλτρα και στον πίνακα εξερεύνησης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Απενεργοποίηση της επιτάχυνσης υλικού</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Χρησιμοποιήστε όταν αντιμετωπίζετε προβλήματα τραυλισμού της οθόνης ή παρόμοια προβλήματα του UI</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Εμφάνιση των κρυφών παιχνιδιών στις λίστες γρήγορης εκκίνησης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Επηρεάζει τη Λίστα Πρόσφατων και τη λίστα της γραμμής ειδοποιήσεων.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Αριθμός των αντικειμένων γρήγορης εκκίνησης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Χρήση της εικόνας παρασκηνίου ως εικόνα παραθύρου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Θόλωμα παρασκηνίου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Υψηλή Ποιότητα</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Σκοτεινή εικόνα παρασκηνίου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Εμφάνιση στην Προβολή Πλακιδίων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Θέμα</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Προφίλ Θέματος</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Θέμα Πλήρους Οθόνης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Προφίλ θέματος πλήρους οθόνης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Τοποθεσία βάσης δεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Κατάσταση σύνδεσης:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Ρυθμίσεις Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Καθαρισμός web cache</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Μπορεί να επιλύσει προβλήματα που συναντώνται όταν συνδέονται λογαριασμοί.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Εμφάνιση του εικονιδίου της γραμμής ειδοποιήσεων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Ελαχιστοποίηση Playnite στη γραμμή ειδοποιήσεων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Ελαχιστοποίηση Playnite στη γραμμή ειδοποιήσεων όταν το παράθυρο της εφαρμογής είναι κλειστό</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Κατά την έναρξη του παιχνιδιού:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Μετά το κλείσιμο του παιχνιδιού:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Διαμόρφωση Χρόνου Παιξίματος ώστε να εμφανίζει τις μέρες παιξίματος</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Μορφή ημερομηνίας:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Αυτό θα σας αποσυνδέσει από όλες τις συνδεδεμένες υπηρεσίες. Απαιτείται επανεκκίνηση της εφαρμογής, θέλετε να προχωρήσετε?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Καθαρισμός Cache?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Απαιτείται επανεκκίνηση του Playnite για την εφαρμογή νέου θέματος</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Λήψη περισσότερων θεμάτων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Δημιουργία νέου θέματος</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Λήψη περισσότερων επεκτάσεων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Δημιουργία νέας επέκτασης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Βοηθήστε μας να μεταφράσουμε το Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Απαιτείται επανεκκίνηση του Playnite για να ισχύσουν οι αλλαγές. Επανεκκίνηση τώρα;\r\n\r\nΗ επανεκκίνηση θα ακυρώσει κάθε ενεργή εργασία (λήψεις) που βρίσκεται σε εξέλιξη.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Επανεκκίνηση Playnite;</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Το Playnite δεν μπορεί να μετακινήσει αυτόματα τα αρχεία βιβλιοθήκης. Πρέπει να μετακινήσετε/αντιγράψετε χειροκίνητα τα αρχεία πριν αλλάξετε τη τοποθεσία. Αν δεν υπάρχει βιβλιοθήκη στην τοποθεσία προορισμού, θα δημιουργηθεί μια νέα.\r\n\r\nΗ νέα θέση της βάσης δεδομένων δεν θα χρησιμοποιηθεί μέχρι να γίνει επανεκκίνηση του Playnite </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Ο χρόνος παιχνιδιού δε θα καταγράφεται εάν έχει οριστεί η εντολή &quot;Κλείσιμο&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Αριθμός σειρών</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Αριθμός στηλών</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Αριθμός γραμμών λεπτομερής προβολής</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Εμφάνιση εικόνας παρασκηνίου στην Κύρια Οθόνη</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Δεν ισχύει αναδρομικά στα υπάρχοντα παιχνίδια χωρίς την εκ νέου λήψη των μεταδεδομένων.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Εισαγωγή χρόνου παιχνιδιού στη βιβλιοθήκη:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Ρυθμίζει την συχνότητα με την οποία το Playnite μπορεί να εισάγει τον χρόνο παιχνιδιού που αναφέρεται στα πρόσθετα βιβλιοθήκης, από την βάση δεδομένων του Playnite. Η υποστήριξη από τα πρόσθετα βιβλιοθήκης, που είναι υπεύθυνα για τον χειρισμό των παιχνιδιών, είναι αναγκαία για την χρήση αυτού του χαρακτηριστικού.\r\n\r\nΠάντα: Εισάγει τον χρόνο παιχνιδιού τόσο για τα νέα, όσο και για τα ήδη υπάρχοντα παιχνιδια στην βάση δεδομένων του Playnite. \r\nΜόνο για τα νεοεισαχθέντα παιχνίδια: Εισάγει τον χρόνο παιχνιδιού μόνο για τις νέες εισαγωγές παιχνιδιών.\r\nΠοτέ: Δεν εισάγεται κανένας χρόνος παιχνιδιού.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Πάντα</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Μόνο για τα νεοεισαχθέντα παιχνίδια</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Ποτέ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Ενεργοποίηση υποστήριξης χειριστηρίου στη Λειτουργία Επιφάνειας Εργασίας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Το Κουμπί Οδηγού ανοίγει τη Λειτουργία Πλήρους Οθόνης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Ρυθμίσεις αυτόματης λήψης μεταδεδομένων για νεοεισαχθέντα παιχνίδια.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Στοχευμένη Προβολή</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Χρήση πάντοτε της κύριας οθόνης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Εμφάνιση Πλακιδίων Παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Εμφάνιση Κατάστασης Μπαταρίας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Εμφάνιση Ποσοστού Μπαταρίας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Εμφάνιση Ρολογιού</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Απόκρυψη του δείκτη ποντικιού</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Εμφάνιση των εγκατεστημένων μόνο με τα Γρήγορα Φίλτρα</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Κουμπί Υπενθυμίσεων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Διάταξη</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Οριζόντια Ολίσθηση</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Επιλέξτε μία από τις υποενότητες</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Δεν υπάρχουν διαθέσιμες ρυθμίσεις</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Η φόρτωση των ρυθμίσεων απέτυχε</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Τα σενάρια αυτά εκτελούνται για κάθε παιχνίδι στη βιβλιοθήκη. Τα μεμονωμένα σενάρια μπορούν να αντιστοιχιστούν σε κάθε παιχνίδι ξεχωριστά κατά την επεξεργασία των λεπτομερειών του παιχνιδιού.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Δημιουργία έμψυχων μεταβάσεων εικόνων παρασκηνίου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Μεγέθη γραμματοσειρών</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Αυτόματα</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Με αλλοίωση</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Κλίμακα του γκρι</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">Καθαρού Τύπου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ιδανικό</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Προβολή</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Λειτουργία μορφοποίησης κειμένου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Λειτουργία απόδοσης κειμένου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Η απόδοση κειμένου και οι μέθοδοι διαμόρφωσης δε χρησιμοποιούνται αυτή τη στιγμή για τις περιγραφές παιχνιδιών.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Πρόωρη φόρτωση των εικόνων παρασκηνίου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Αν ενεργοποιηθεί, το Playnite θα κατεβάσει το εξώφυλλο παρασκηνίου κατά τη λήψη μεταδεδομένων, χρησιμοποιώντας περισσότερο χώρο στο δίσκο και καθιστώντας διαθέσιμο το εξώφυλλο όταν είναι εκτός σύνδεσης.\r\n\r\nΕάν απενεργοποιηθεί, το εξώφυλλο στο παρασκήνιο λαμβάνεται μόνο όταν απαιτείται, χρησιμοποιώντας λιγότερο χώρο, αλλά μπορεί να οδηγήσει σε καθυστέρηση πριν εμφανιστεί το εξώφυλλο και κάποιες εικόνες ενδέχεται να μην είναι διαθέσιμες όταν είναι εκτός σύνδεσης.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Αυτόματο κλείσιμο του προγράμματος τρίτων μετά το κλείσιμο του παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Καθυστέρηση τερματισμού του προγράμματος (σε δευτερόλεπτα)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Να μην κλείνει μετά από συνεδρίες παιχνιδιού μικρότερες από (σε δευτερόλεπτα)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Αυτόματο κλείσιμο των παρακάτω προγραμμάτων:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Αυτόματο Κλείσιμο Προγραμμάτων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Λίστα Εξαιρούμενων Εισαγωγών</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Εμφάνιση προειδοποίησης κατά την ανάθεση πολύ μεγάλων πολυμέσων του παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Άνοιγμα εντολής φακέλου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Προτιμώμενος οργανισμός αξιολόγησης ηλικίας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Ενημέρωση μεγέθους εγκατάστασης παιχνιδιών κατά την ενημέρωση βιβλιοθήκης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Σαρώνει και ενημερώνει το μέγεθος εγκατάστασης των παιχνιδιών, εφόσον εντοπιστεί ότι τα αρχεία τους έχουν τροποποιηθεί από την τελευταία σάρωση</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Κανένα</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Γέμισμα</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Ενσωμάτωση</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Ομοιόμορφο για γέμισμα</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Αριστερά</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Δεξιά</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Κορυφή</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Κάτω</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Σφάλμα Εισαγωγής</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Απαιτείται πιστοποίηση</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Η ταυτοποίηση απέτυχε</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Εναλλακτική λειτουργία προβολής ιστού</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Χρησιμοποιήστε όταν αντιμετωπίζετε προβλήματα με τις προβολές ιστού, για παράδειγμα στους διαλόγους ταυτοποίησης ενσωμάτωσης.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Μερική φόρτωση των μεγάλων περιγραφών των παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Οι μεγάλες περιγραφές παιχνιδιών μπορούν να προκαλέσουν αξιοσημείωτες καθυστερήσεις όταν επιλέγετε παιχνίδια.\r\n\r\nΌταν είναι ενεργοποιημένες, μόνο ένα μέρος των περιγραφών θα φορτώσει άμεσα και το υπόλοιπο κατ' απαίτηση του χρήστη.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Εισαγωγή Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Λήψη Μεταδεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Ορισμός επιλεγμένων παραμέτρων που θα χρησιμοποιηθούν για οποιεσδήποτε μελλοντικές λήψεις μεταδεδομένων.\r\nΜπορεί επίσης να αλλάξει στις ρυθμίσεις της εφαρμογής.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Οδηγός Εισαγωγής Εξομοιωτών</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Αυτός ο οδηγός θα σας καθοδηγήσει στη διαδικασία λήψης και εισαγωγής εξομοιωτών και εισαγωγής παιχνιδιών για εξομοιωτές.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Λάβετε υπόψη ότι μπορείτε πάντα να προσθέσετε επιπλέον εξομοιωτές ή/και παιχνίδια αργότερα μέσω του κύριου μενού (στο μενού &quot;Βιβλιοθήκη&quot; για τις ρυθμίσεις εξομοιωτή και το μενού &quot;Προσθήκη Παιχνιδιών&quot; για εξομοιωμένα παιχνίδια).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Παρακάτω είναι μια λίστα με εξομοιωτές που το Playnite μπορεί να αναγνωρίσει και να ρυθμίσει αυτόματα. Μπορείτε να κατεβάσετε εξομοιωτές εγκατάστασης από τις ιστοσελίδες τους. Μόλις εγκαταστήσετε τους εξομοιωτές (χειροκίνητα), μπορείτε να τους εισαγάγετε στο διάλογο ρυθμίσεων εξομοιωτή.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Μπορείτε να εισαγάγετε όλους τους εξομοιωτές που είναι εγκατεστημένοι στον υπολογιστή σας, κάνοντας κλικ στο κουμπί 'Αυτόματη ανίχνευση από φάκελο…'. Το Playnite θα αναζητήσει τον επιλεγμένο φάκελο για όλους τους γνωστούς εξομοιωτές και θα παρέχει την επιλογή για την εισαγωγή τους. Μπορείτε να χρησιμοποιήσετε αυτό το κουμπί πολλές φορές για την εισαγωγή εξομοιωτών από διαφορετικούς φακέλους. Οι εξομοιωτές θα προστεθούν στο κάτω μέρος της τρέχουσας λίστας.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Μπορείτε να εισάγετε παιχνίδια κάνοντας κλικ στο κουμπί 'Σάρωση Φακέλου Χρησιμοποιώντας Εξομοιωτή'. Επιλέγοντας τον κατάλληλο εξομοιωτή θα πει στο Playnite ποιοι τύποι αρχείων θα πρέπει να σαρωθούν και να εισαχθούν. Μπορείτε να χρησιμοποιήσετε αυτό το κουμπί πολλές φορές για να εισαγάγετε παιχνίδια από διαφορετικούς φακέλους. Τα παιχνίδια θα προστεθούν στο κάτω μέρος της τρέχουσας λίστας.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Δεν υπάρχουν επιλεγμένοι εξομοιωτές για εισαγωγή. Δεν θα μπορείτε να εισάγετε αυτόματα οποιαδήποτε παιχνίδια χωρίς να ρυθμίσετε πρώτα τους εξομοιωτές. Είστε σίγουροι ότι θέλετε να συνεχίσετε και να τελειώσει η διαδικασία εισαγωγής;</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Δεν υπάρχουν εξομοιωτές ρυθμισμένοι στο Playnite. Δεν μπορείτε να εισάγετε παιχνίδια χωρίς πρώτα να ρυθμίσετε τον εξομοιωτή και επιλέγοντας τους κατάλληλους τύπους αρχείων. Θέλετε να προσθέσετε μερικούς εξομοιωτές τώρα;</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Σάρωση φακέλου χρησιμοποιώντας τον εξομοιωτή</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Επιλέξτε αρχεία</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Αυτόματη ανίχνευση από φάκελο...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Επεξεργασία Εξομοιωτών…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Σάρωση…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Σάρωση {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Ρυθμίσεις Πρώτης Εκκίνησης</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Αυτή η διαδικασία θα σας καθοδηγήσει στην αυτόματη εισαγωγή και διαμόρφωση εξωτερικών βιβλιοθηκών παιχνιδιών. Το Playnite μπορεί να εισάγει αυτόματα παιχνίδια από πολλαπλές υπηρεσίες παιχνιδιών, όπως το Steam ή το GOG.\r\n\r\nΛάβετε υπόψη ότι μπορείτε επίσης να προσθέσετε χειροκίνητα οποιοδήποτε προσαρμοσμένο ή εξομοιωμένο παιχνίδι για οποιαδήποτε πλατφόρμα αργότερα από το κύριο μενού.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Ενσωμάτωση Βιβλιοθήκης</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Ακολουθεί η λίστα με μερικές επιμελημένες ενσωματώσεις βιβλιοθηκών που υποστηρίζει το Playnite . Παρακαλώ επιλέξτε αυτά που θέλετε να εγκαταστήσετε.\r\n\r\nΠερισσότερες ενσωματώσεις μπορούν να εγκατασταθούν αργότερα από το μενού &quot;Πρόσθετα&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Η διαμόρφωση ολοκληρώθηκε</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Η αρχική ρύθμιση έχει ολοκληρωθεί. Μπορείτε να αλλάξετε όλες τις ρυθμίσεις αργότερα, καθώς και να προσθέσετε πρόσθετες ενσωματώσεις από το κύριο μενού.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Αποτυχία λήψης μιας ή περισσότερων επεκτάσεων.\r\n\r\nΜπορείτε να προσπαθήσετε να κατεβάσετε ξανά τις ενσωματώσεις από το μενού πρόσθετων μετά την ολοκλήρωση του Οδηγού για πρώτη φορά.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Λήψη ενσωμάτωσης {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Λήψη λίστας προτεινόμενων ενσωματώσεων…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Αποτυχία λήψης της λίστας προτεινόμενων ενσωματώσεων. Μπορείτε να δοκιμάσετε και να ξανακατεβάσετε τις ενσωματώσεις αργότερα από το μενού &quot;Πρόσθετα&quot;.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Ρυθμίστε πλατφόρμες και εξομοιωτές</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Επεξεργασία Εξομοιωτών</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Πλατφόρμες</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Πλατφόρμα</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Εξομοιωτές</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Εξομοιωτής</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Προσθήκη πλατφόρμας</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Επιλογή εικονιδίου</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Επιλογή εξώφυλλου</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Επιλογή εικόνας</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Επιλογή Στοιχείου</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Επιλογή φόντου</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Επιλογή αρχείου</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Επιλογή URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Προσθήκη εξομοιωτή</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Υποστηριζόμενες πλατφόρμες</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Θέλετε να αποθηκεύσετε τις αλλαγές της πλατφόρμας;</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Θέλετε να αποθηκεύσετε τις αλλαγές εξομοιωτών;</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Εκτελέσιμο</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Παράμετροι</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Κατάλογος Εργασίας</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Υποστηριζόμενοι Τύποι Αρχείων</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Εισαγωγή Εξομοιωτών</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Λήψη Εξομοιωτών</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Φόρτωση προεπιλογής παραμέτρων από το γνωστό προφίλ εξομοιωτή</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Είστε βέβαιοι ότι θέλετε να καταργήσετε τον εξομοιωτή {0}; \r\nΑυτή τη στιγμή χρησιμοποιείται από {1} παιχνίδι(α).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Είστε βέβαιοι ότι θέλετε να καταργήσετε την πλατφόρμα {0};\r\nΑυτή τη στιγμή χρησιμοποιείται από {1} παιχνίδι(α) και {2} εξομοιωτή(ες).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Βοήθεια για τις ρυθμίσεις</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Ταξινόμηση κατά</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Κατεύθυνση Ταξινόμησης</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Ομαδοποίηση κατά</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Αύξουσα</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Φθίνουσα</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Μην ομαδοποιείς</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Ομαδοποίηση ανά Συλλογή</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Ομαδοποίηση ανά Κατηγορία</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Ομαδοποίηση ανά Πλατφόρμα</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Τύπος προβολής</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Προβολή</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Πίνακας Εξερεύνησης</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Πίνακας Φίλτρων</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Εικονίδιο</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Εικονίδιο Βιβλιοθήκης</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Εικόνα Εξώφυλλου</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Εικόνα Φόντου</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Ταξινόμηση ονόματος</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Βιβλιοθήκη</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Εγχειρίδιο</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Ονομα</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Δίσκος Εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Όνομα Λογαριασμού</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Πλατφόρμα</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Κατηγορία(ες)</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Είδος</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Ημερομηνία Έκδοσης</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Έτος Κυκλοφορίας</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Δημιουργός</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Ετικέτα</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Εκδότης</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Κατάσταση Εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Ταίριασμα όλων των φίλτρων</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Αν ενεργοποιηθεί, μόνο τα παιχνίδια που χρησιμοποιούν όλα τα αντικείμενα σε όλα τα φίλτρα θα συμπεριληφθούν στην προβολή. Εάν απενεργοποιηθεί, παιχνίδια που χρησιμοποιούν οποιοδήποτε στοιχείο σε οποιοδήποτε φίλτρο θα περιλαμβάνονται στην προβολή.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Εγκατεστημένα</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Εγκατεστημένο</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Μη εγκατεστημένο</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Κρυφά</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Αγαπημένα</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Ενεργοποίηση Υποστήριξης HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Εάν είναι ενεργοποιημένο, το HDR θα ενεργοποιείται στην κύρια οθόνη πριν την εκκίνηση του παιχνιδιού.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Σημείωση. Το HDR δεν υποστηρίζεται από την κύρια οθόνη σας.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Παίχτηκαν τελευταία</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Κατηγορία</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Περιγραφή</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Κατάλογος εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Εικόνα εξωφύλλου</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Σύνδεσμοι</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Διαδρομή Image/ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Είδος</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Είδη παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Εταιρεία</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Εταιρείες</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Κατασκευαστής</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Δημιουργοί</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Εκδότης</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Εκδότες</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Κατηγορία</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Κατηγορίες</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Ετικέτα</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Ετικέτες</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Λειτουργία</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Λειτουργίες</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Αξιολόγηση ηλικίας</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Ηλικιακή ταξινόμηση</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Περιοχή</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Περιοχές</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Πηγή</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Πηγές</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Πρόσφατη δραστηριότητα</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Σφάλμα βάσης δεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Αποτυχία ανοίγματος βάσης δεδομένων βιβλιοθήκης.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Η βάση δεδομένων δεν έχει ανοίξει.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Δεν είναι δυνατή η πρόσβαση στη βάση δεδομένων της βιβλιοθήκης. File &quot;{0}&quot; is being used by another process or it's in inaccessible location.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Αποτυχία δημιουργίας πακέτου διαγνωστικών.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Αποτυχία αυτόματης μεταφόρτωσης του πακέτου διάγνωσης.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Οι πληροφορίες διαγνωστικών στάλθηκαν επιτυχώς.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Το πακέτο διαγνωστικών έχει δημιουργηθεί και υποβληθεί με επιτυχία.\r\nΕπισυνάψτε το ακόλουθο αναγνωριστικό στην αναφορά προβλήματός σας:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Αποτυχία εισαγωγής παιχνιδιών από {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Αποτυχία εισαγωγής εξομοιωμένων παιχνιδιών από {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Δεν είναι δυνατή η αναζήτηση παιχνιδιών στο επιλεγμένο προφίλ εξομοιωτή. Το προφίλ δεν περιέχει επεκτάσεις αρχείων ή πλατφόρμες.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Το Playnite απέτυχε να ξεκινήσει. Κλείστε όλες τις τρέχουσες διεργασίες και δοκιμάστε ξανά.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Αποτυχία εφαρμογής του θέματος &quot;{0}&quot;, προφίλ χρωμάτων &quot;{1}&quot;\r\n        \r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Δεν είναι δυνατή η σύνδεση, η διεύθυνση URL δεν είναι σε έγκυρη μορφή.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Το άνοιγμα της εφαρμογής απέτυχε</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Αποτυχία αρχικοποίησης εφαρμογής προβολής ιστοσελίδας. Το Playnite δεν μπορεί να συνεχίσει με τη διαδικασία εκκίνησης.\r\n\r\nΠερισσότερες πληροφορίες στο https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Δεν είναι δυνατή η εισαγωγή εξομοιωτών λόγω του αρχείου ορισμού που λείπει ή είναι κατεστραμμένο.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Αποτυχία εκτέλεσης ενέργειας μενού.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Επεξεργασία λεπτομερειών παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL εικόνας</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Προσθήκη συνδέσμου</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Προσθήκη ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Αποθήκευση Αλλαγών</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Εφαρμογή αλλαγών στο πεδίο που επεξεργάζονται στο παιχνίδι(ους).</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Προσθέστε ενέργεια</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Διαγραφή ενέργειας</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Κατάργηση ενέργειας αναπαραγωγής</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Προσθήκη παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Σάρωση Φακέλου...</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Ανίχνευση Εγκατεστημένων</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Περιήγηση...</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Άνοιγμα Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Ρυθμίσεις προφίλ</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Το όνομα παιχνιδιού δεν μπορεί να είναι άδειο.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Ο κατάλογος παρακολούθησης ενεργειών παιχνιδιού δεν μπορεί να είναι κενός.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Το όνομα παιχνιδιού δεν μπορεί να είναι κενό πριν από την αναζήτηση metadata.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Μη έγκυρα δεδομένα παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Εισάγετε έγκυρο URL Web ξεκινώντας με http:// ή ◆ ://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Επιλέξτε URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Αποτυχία λήψης metadata: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Σφάλμα λήψης</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Καθαρισμός φίλτρων</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Ιδιωτικός λογαριασμός</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Δημόσιος Λογαριασμός</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">κλειδί API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Σφάλμα εκκίνησης</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">σφάλμα θέματος</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">καθαρισμός όλων</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Εγκατάσταση</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Απεγκατάσταση</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Εκκίνηση</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Τρέξιμο</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Μη έγκυρο URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">καμία ενέργεια</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">ελαχιστοποίηση</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Επαναφορά</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Επαναφορά μόνο όταν εκκινηθεί από το UI</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">κλείσιμο</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">αλλαγή</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Προχωρημένα</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Ποτέ</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Κατάσταση ολοκλήρωσης</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Καταστάσεις Ολοκλήρωσης</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Βαθμολογία Χρηστών</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Βαθμολογία Κριτικών</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Βαθμολογία κοινότητας</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Σενάρια παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Σενάρια εφαρμογής</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Σενάρια</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Πρόσθετα</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Πηγές Μεταδεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Επεκτάσεις</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Αναγνωριστικά επέκτασης</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Επαναφόρτωση Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Διαδραστικό SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Όλα τα scripts επαναφορτώθηκαν επιτυχημένα.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Δεν βρέθηκαν παιχνίδια για συγκεκριμένα κριτήρια αναζήτησης/φίλτρου</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Δεν βρέθηκαν στοιχεία</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Εναλλαγή σε λειτουργία επιφάνειας εργασίας</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Εξοδος Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Βιβλιοθήκες</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Ενημέρωση Όλων</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Δημιουργήθηκε από</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Έκδοση:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Ενημερώθηκε:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Πρόσθετα (Modules)</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Συλλογή</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Στατιστικά</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Όλα</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Κανένα</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Ειδοποιήσεις</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Πλάτος</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Ύψος</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Μέγεθος</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Μικρή</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Κανονική</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Μεγάλη</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Μεγαλύτερη</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Πολύ μεγάλη</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Προεπιλογή</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Επιλογή</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Επιλογή όλων</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Αποεπιλογή όλων</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Πρώτο</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Τυχαίο</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Επιλογή χρήστη</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Φόρτωση περισσοτέρων</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Διαφάνεια</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Σύμπτυξη</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Ανάπτυξη</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Σύμπτυξη Όλων</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Ανάπτυξη Όλων</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Άλλο</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Θέματα</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Παράμετροι Εξομοιωτή</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Ενσωματωμένες Παράμετροι</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Προσαρμοσμένες Παράμετροι</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Πρόσθετες Παράμετροι Εξομοιωτή</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Αντικατάσταση Παραμέτρων Εξομοιωτή</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Ενέργεια Παιξίματος</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Επιλογή μεταδεδομένων για εισαγωγή</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Επιλέξτε Παιχνίδια για εισαγωγή</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">αναζήτηση metadata</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Διαθέσιμη Ενημέρωση</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Αλλαγές από την τελευταία ενημέρωση</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Λήψη και Εγκατάσταση Ενημέρωσης</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Έλεγχος για Ενημερώσεις</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Σφάλμα Ενημέρωσης</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Απέτυχε ο έλεγχος για νέα έκδοση.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Δεν βρέθηκε νέα έκδοση, είστε ενημερωμένοι.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Αποτυχία λήψης και εγκατάστασης της ενημέρωσης.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Κάποια εργασία στο παρασκήνιο είναι σε εξέλιξη. Θέλετε να την ακυρώσετε και να προχωρήσετε με την ενημέρωση;</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Κάποια εργασία στο παρασκήνιο είναι σε εξέλιξη. Θέλετε να την ακυρώσετε και να βγείτε από το Playnite;</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Κάποια εργασία στο παρασκήνιο είναι σε εξέλιξη. Η εναλλαγή λειτουργιών θα ακυρώσει την εργασία, θέλετε να αλλάξετε οπωσδήποτε;</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Μία ενημέρωση για το Playnite είναι διαθέσιμη</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Ανανέωση της λίστας θεμάτων</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Εφαρμογή επιλεγμένου θέματος</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Παρακολούθηση αλλαγών αρχείων</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Αυτόματη εφαρμογή του θέματος όταν αλλάζει το αρχείο προέλευσης</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Εκτέλεση σεναρίου</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Εκτέλεση πριν την έναρξη του παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Εκτέλεση μετά την έξοδο από ένα παιχνίδι</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Εκτέλεση μετά την εκκίνηση του παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Εκτέλεση κατά την εκκίνηση της εφαρμογής</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Εκτέλεση κατά τον τερματισμό της εφαρμογής</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Σενάριο έναρξης παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Σενάριο τρέχοντος παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Σενάριο διακοπής παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Εκτέλεση καθολικού σεναρίου</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Καθολικά</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Φιλτραρισμένα</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Τρέχοντα</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Νέα</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Δοκιμαστικό σενάριο</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Εμφάνιση μόνο επιλεγμένων αντικειμένων.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Αποθήκευση ως προεπιλογή</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Προσθήκη στα αγαπημένα</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Αφαίρεση από τα αγαπημένα</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Απόκρυψη αυτού του παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Κατάργηση από τα Κρυμμένα</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Ενεργοποίηση Υποστήριξης HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Απενεργοποίηση Υποστήριξης HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Επεξεργασία…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Υπολογισμός μεγέθους εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Υπολογίστε το μέγεθος εγκατάστασης (όλα τα παιχνίδια)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Υπολογισμός μεγέθους εγκατάστασης (Μόνο ελλειπή δεδομένα)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Μέγεθος Εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Ορισμός Κατηγοριών</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Ορισμός Κατάστασης Ολοκλήρωσης</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Αφαίρεση΄</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Παίξε</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Εγκατάσταση</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Επιλογές Παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Λεπτομέρειες</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Απεγκατάσταση</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Ανοίξτε την τοποθεσία εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Δημιουργία συντόμευσης στην επιφάνεια εργασίας</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Άνοιγμα Εγχειριδίου</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Περισσότερα</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Διαχείριση από το πρόσθετο βιβλιοθήκης</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Η διαδικασία έναρξης του παιχνιδιού θα γίνει από το πρόσθετο βιβλιοθήκης που είναι υπεύθυνο για αυτό το παιχνίδι.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Δεν βρέθηκαν σχετικές πληροφορίες σχετικά με το παιχνίδι '{0}' στη συγκεκριμένη σελίδα.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Συμβουλή: Μπορείτε να χρησιμοποιήσετε πιο προηγμένη διαδικασία λήψης μεταδεδομένων κατά την επεξεργασία ενός παιχνιδιού μέσω της επιλογής μενού &quot;Επεξεργασία&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Δεν είναι διαθέσιμο όταν κάποια ενέργεια είναι σε εξέλιξη.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Το κείμενο περιγραφής είναι ευαίσθητο στη σύνταξη HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Ο χρόνος παιχνιδιού καταγράφεται σε δευτερόλεπτα.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Το μέγεθος εγκατάστασης υποδεικνύεται σε bytes.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Η ημερομηνία κυκλοφορίας πρέπει να οριστεί σε μορφή 'χρόνος-μήνας-ημέρα'. Οι τιμές μήνα και ημέρας μπορούν να παραλειφθούν.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Τιμές από 0 έως 100 ή κενές για καμία βαθμολογία.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Η ανάπτυξη του Playnite υποστηρίζεται από αυτούς τους patrons και τα μέλη του Ko-fi:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Κώδικας, εντοπιότητα και άλλοι συνεισφέροντες χωρίς συγκεκριμένη σειρά:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Ακύρωση παρακολούθησης παιχνιδιών?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Η παρακολούθηση της εγκατάστασης εκτελείται αυτή τη στιγμή. Θέλετε να ακυρώσετε τη διαδικασία και να επιστρέψετε το παιχνίδι στην προηγούμενη κατάσταση;</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Η παρακολούθηση της εγκατάστασης εκτελείται αυτή τη στιγμή. Θέλετε να ακυρώσετε τη διαδικασία και να επιστρέψετε το παιχνίδι στην προηγούμενη κατάσταση;</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Χρόνος παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Τελευταίο παιχνίδι</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}η {1}ω {2}μ</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}ω {1}λ</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} λεπτά</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} δευτερόλεπτα</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Δεν παίχτηκε</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Άνοιγμα λειτουργίας επιφάνειας εργασίας…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Άνοιγμα λειτουργίας πλήρους οθόνης…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Φόρτωση βιβλιοθήκης παιχνιδιών…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Υπολογισμός μεγέθους εγκατάστασης…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Γίνεται υπολογισμός μεγέθους εγκατάστασης του {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Απέτυχε η εγκατάσταση script.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Script εγκαταστάθηκε με επιτυχίαinstalled successfully.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Εγκατάσταση Script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Σφάλμα σεναρίου</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Αποτυχία εκτέλεσης λειτουργίας επεκτάσεων.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Άνοιγμα φακέλου μεταδεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Υπολογισμός</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Υπολογίζει αυτόματα το μέγεθος εγκατάστασης χρησιμοποιώντας τις ROM (εάν το παιχνίδι έχει κάποιο) ή τον κατάλογο εγκατάστασης (εάν έχει οριστεί)</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">Ο πελάτης {0} δεν είναι εγκατεστημένος.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Ο πελάτης {0} πρόκειται να ανοίξει. Παρακαλώ συνδεθείτε και μετά κλείστε αυτό το μήνυμα.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Αναμονή για σύνδεση του χρήστη. Παρακαλώ κλείστε το παράθυρο μόλις τελειώσει η διαδικασία...</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Ο φάκελος εγκατάστασης του παιχνιδιού δεν βρέθηκε.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Μη έγκυρη διαμόρφωση ενέργειας παιχνιδιού.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Αντιμετώπιση προβλημάτων συγχρονισμού λογαριασμού</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Αντιμετώπιση προβλημάτων</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Μετονομασία στοιχείου</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Προσθήκη νέου στοιχείου</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Εισάγετε όνομα</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Εισάγετε νέο όνομα</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Λιγότερο από μια ώρα</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 έως 10 ώρες</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 έως 100 ώρες</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 έως 500 ώρες</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 έως 1000 ώρες</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Πρέπει να γίνει επανεκκίνηση του Playnite για να ολοκληρωθεί η εγκατάσταση. Θέλετε να κάνετε επανεκκίνηση τώρα;</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Η επέκταση δεν τακτοποιήθηκε σωστά.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Το θέμα δεν τακτοποιήθηκε σωστά.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Η επέκταση &quot;{0}&quot; απέτυχε να φορτώσει σωστά.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Η επέκταση «{0}» δεν μπορεί να φορτώσει, η τρέχουσα έκδοση Playnite δεν υποστηρίζεται.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Το θέμα &quot;{0}&quot; απέτυχε να φορτώσει σωστά.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Το θέμα «{0}» δεν μπορεί να φορτώσει, η τρέχουσα έκδοση Playnite δεν υποστηρίζεται.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Η επέκταση απέτυχε να φορτώσει σωστά.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Το θέμα απέτυχε να φορτώσει σωστά.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Το θέμα/επέκταση χρησιμοποιεί μη υποστηριζόμενη έκδοση API.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Η Εγκατάσταση ήταν επιτυχής.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Εγκατάσταση επέκτασης;</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Γενικά</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Αποτυχία εγκατάστασης πρόσθετου &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Αποτυχία εγκατάστασης επέκτασης.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Θέλετε να εγκαταστήσετε μια νέα επέκταση;\r\n\r\n{0}\r\nΑπό {1}\r\nΈκδοση {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Θέλετε να ενημερώσετε την επέκταση &quot;{0}&quot;;\r\n\r\nΤρέχουσα έκδοση: {1}\r\nΝέα έκδοση: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Αποτυχία εγκατάστασης θέματος.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Θέλετε να εγκαταστήσετε ένα νέο θέμα;\r\n\r\n{0}\r\nΑπό {1}\r\nΈκδοση {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Θέλετε να ενημερώσετε το θέμα &quot;{0}&quot;;\r\n\r\nΤρέχουσα έκδοση: {1}\r\nΝέα έκδοση: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Πρόκειται να εξέλθετε από το Playnite και να μεταβείτε στην ακόλουθη ιστοσελίδα χρησιμοποιώντας το προεπιλεγμένο πρόγραμμα περιήγησης. Θέλετε να συνεχίσετε;\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Η επιλεγμένη εικόνα(ες) μπορεί να είναι πολύ μεγάλη για βέλτιστη απόδοση. Χρησιμοποιώντας πολύ μεγάλες εικόνες μπορεί να οδηγήσει σε χειρότερη απόκριση UI και αυξημένη χρήση μνήμης. \r\n\r\nΜέγιστες συνιστώμενες αναλύσεις:\r\nΕικονίδια: {0} μέγιστα εικονοστοιχεία\r\nΕξώφυλλο: {1} μέγιστα εικονοστοιχεία\r\nΦόντα: {2} μέγα εικονοστοιχεία</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Προειδοποίηση Απόδοσης</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Να μην εμφανιστεί ξανά</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Το αρχείο με επέκταση {0} δεν είναι συμβατό.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Μη συμβατή επέκταση αρχείου</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Το επιλεγμένο αρχείο εικόνας μπορεί να είναι πολύ μεγάλο για βέλτιστη απόδοση.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Είστε σίγουροι ότι θέλετε να απεγκαταστήσετε το επιλεγμένο θέμα; Η απεγκατάσταση θα δρομολογηθεί στην επόμενη εκκίνηση της εφαρμογής.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Τα ενσωματωμένα θέματα δεν μπορούν να απεγκατασταθούν.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Αυτό το θέμα δεν υποστηρίζει αυτήν την έκδοση του Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Είστε σίγουροι ότι θέλετε να απεγκαταστήσετε το επιλεγμένο θέμα; Η απεγκατάσταση θα δρομολογηθεί στην επόμενη εκκίνηση της εφαρμογής.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Οι ενσωματωμένες επεκτάσεις δεν μπορούν να απεγκατασταθούν.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Αυτή η επέκταση δεν υποστηρίζει αυτήν την έκδοση του Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Φάκελος εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Φάκελος δεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Δημιουργία πακέτου διαγνωστικών…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Μεταφόρτωση πακέτου διαγνωστικών…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Εισαγωγή αρχείου…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Τί είναι αυτό;</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Είστε σίγουροι ότι θέλετε να το κάνετε αυτό;</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Συνολικός χρόνος παιξίματος</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Μέσος χρόνος παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Κορυφαίος χρόνος παιξίματος</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Συνολικό μέγεθος εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Επισκόπηση</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Πλευρική μπάρα</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Προβολή στην πλευρική μπάρα</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Επαναφορά ρυθμίσεων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Θα γίνει επαναφορά όλων των ρυθμίσεων εφαρμογής στις προεπιλεγμένες τιμές, εξαιρουμένων:\r\n- Τοποθεσία βάσης δεδομένων\r\n- Εισαγωγή λίστας αποκλεισμών\r\n- Ρυθμίσεις επέκτασης, συμπεριλαμβανομένης της ενσωμάτωσης βιβλιοθήκης\r\n    \r\nΗ επανεκκίνηση της εφαρμογής απαιτείται για να ολοκληρωθεί η διαδικασία. Θέλετε να επαναφέρετε τις ρυθμίσεις?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Για προγραμματιστές</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Εξωτερικές επεκτάσεις</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Εισαγωγή πλήρους διαδρομής φακέλου.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Επιτεύγματα</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Φόρουμ</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Νέα</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Σελίδα Καταστήματος</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Η αρχική εγκατάσταση δεν ολοκληρώθηκε. Το Playnite θα επανεκκινήσει τώρα σε Λειτουργία Επιφάνειας Εργασίας για να ολοκληρώσετε τη διαδικασία.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Παίχτηκαν Πρόσφατα</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Αγαπημένα</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Παίχτηκαν Περισσότερο</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Όλα</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Υπάρχουν φίλτρα που εφαρμόζονται.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Έχουν εφαρμοστεί επιπλέον φίλτρα.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Αποτελέσματα αναζήτησης για:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Υπάρχει ήδη ένα στοιχείο με το ίδιο όνομα.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Περιορισμός επιλογής στο τρέχων φίλτρο</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Επιλογή άλλου</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Πρόσθετα …</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Εγκατεστημένα</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Ρυθμίσεις επεκτάσεων</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Περιήγηση</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Ενημερώσεις</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Ενημερώσεις ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Η διαχείριση των εγκατεστημένων επεκτάσεων και θεμάτων, συμπεριλαμβανομένων των ρυθμίσεών τους, έχει μεταφερθεί στο νέο μενού &quot;Πρόσθετα&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Όλες οι εγκατεστημένες επεκτάσεις ενσωμάτωσης βιβλιοθήκης μπορούν να ρυθμιστούν εδώ.\r\n\r\nΑν θέλετε να εγκαταστήσετε ή να απεγκαταστήσετε πρόσθετες ενσωματώσεις, χρησιμοποιήστε την επιλογή &quot;Πρόσθετα&quot; από το κύριο μενού.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Θέματα Επιφάνειας Εργασίας</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Θέματα Πλήρους Οθόνης</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Πραγματοποιείται Αναζήτηση…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Το πρόσθετο δεν είναι συμβατό με αυτήν την έκδοση του Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Αποτυχία λήψης του πακέτου εγκατάστασης πρόσθετου.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Αποτυχία λήψης δήλωσης εγκατάστασης πρόσθετου.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Απαιτείται επανεκκίνηση της εφαρμογής για την εφαρμογή εκκρεμών αλλαγών.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Αυτό το πρόσθετο έχει προγραμματιστεί για εγκατάσταση.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Εγκατάσταση</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Απεγκατάσταση</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Ήδη εγκατεστημένο</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Δε βρέθηκαν νέες ενημερώσεις πρόσθετου.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Ενημέρωση πρόσθετων</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Το αρχείο αλλαγών δεν είναι διαθέσιμο</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Προγραμματισμένο για εγκατάσταση</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Η λήψη απέτυχε</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Η άδεια απορρίφθηκε</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Λήψη {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Γίνεται έλεγχος για ενημερώσεις πρόσθετων …</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Μία ή περισσότερες ενημερώσεις προσθέτων είναι διαθέσιμες</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Επιλέξτε στοιχεία για ενημέρωση</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Παράδειγμα ανάπτυξης επεκτάσεων</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} Άδεια χρήσης</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Αποδοχή</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Άρνηση</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Συμπερίληψη ενεργειών ενσωμάτωσης βιβλιοθήκης</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Επιλέξτε ενέργεια</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Λειτουργία Παρακολούθησης</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Διαδρομή Παρακολούθησης</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Καθυστέρηση αρχικής παρακολούθησης</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Συχνότητα παρακολούθησης</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Σύνδεσμος</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Αρχείο</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Εξομοιωτής</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Σενάριο</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Προεπιλογή</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Διεργασία</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Φάκελος</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Αρχική διεργασία</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Καταγραφή ίχνους μηνυμάτων </sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Οι ακόλουθες αλλαγές αντικαθιστούν δεδομένα για όλα τα τρέχοντα επιλεγμένα παιχνίδια!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Κανένα</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Ενσωμάτωση</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Μόνο αντικείμενα</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Μόνο αρχή και τέλος</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Ευαισθησία κύλισης</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Ομαλότητα κύλισης</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Ταχύτητα κίνησης</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Αφαίρεση στοιχείου;</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Είστε βέβαιοι ότι θέλετε να αφαιρέσετε αυτό το στοιχείο;</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Εμφάνιση κουμπιών στον επάνω πίνακα:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Γενικές ρυθμίσεις προβολής</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Ρυθμίσεις ομαδοποίησης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Ρυθμίσεις ταξινόμησης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Προεπιλογές φίλτρων</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Θέση στοιχείων πρόσθετων</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Πλάτος διαχωριστικού τμήματος</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Μετακίνηση του κύριου κουμπιού μενού στην πλαϊνή μπάρα</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Πίνακας Εξερεύνησης</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Τυχαία επιλογή παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Προβολές τυχαίου επιλογέα παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Επιλογή τυχαίου παιχνιδιού από την προβολή</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Αποθήκευση ρυθμίσεων ομαδοποίησης και ταξινόμησης</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Εμφάνιση ως γρήγορο φίλτρο στη Λειτουργία Πλήρους Οθόνης</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Τις τελευταίες 7 ημέρες</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Τις τελευταίες 31 ημέρες</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Τις τελευταίες 365 ημέρες</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Περισσότερες από 365 ημέρες πριν</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Διαμόρφωση</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Αποθήκευση προεπιλογής</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Ελαχιστοποίηση μετά την έναρξη παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Ελαχιστοποίηση Playnite μετά την εκκίνηση ενός παιχνιδιού.\r\n\r\nΗ απενεργοποίηση αυτού μπορεί να οδηγήσει σε προβλήματα σε παιχνίδια που δεν περιλαμβάνουν εστίαση εισόδου κατά την εκκίνηση!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Μέγεθος Γραμματοσειράς</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Μέγεθος Γραμματοσειράς Μικρό</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Υποστήριξη χειριστηρίου παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Αν απενεργοποιηθεί, το Playnite δεν θα δέχεται καμία είσοδο χειριστηρίου παιχνιδιού.\r\n        \r\nΑπενεργοποιήστε το αν χρησιμοποιείτε εργαλεία που μεταφράζουν εισόδους χειριστηρίου παιχνιδιών στις εισόδους ποντικιού/πληκτρολογίου και λαμβάνετε διπλές εισόδους στο Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Εμφάνιση στοιχείων στο κύριο μενού:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Εναλλαγή κουμπιών κεντρικής προβολής X/A</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Εναλλάσσει την διαμόρφωση κουμπιών για την εκκίνηση παιχνιδιού και την εμφάνιση των λεπτομερειών παιχνιδιού στην κεντρική προβολή.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Αλλαγή κουμπιού επιβεβαίωσης/ακύρωσης</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Εναλλάσσει τα κουμπιά A/B για την επιβεβαίωση και ακύρωση.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Κύριο χειριστήριο μόνο</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Αποδοχή εισόδων από τον πρωτεύον χειριστήριο μόνο όταν είναι ενεργοποιημένο.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Το κουμπί οδηγού να ανοίγει το Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Ένταση ήχου διεπαφής</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Ένταση ήχου φόντου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Σίγαση όταν βρίσκεστε στο παρασκήνιο</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Αποτυχία πραγματοποίησης της διεπαφής ήχου.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API εξόδου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">Το API που χρησιμοποιείται για την έξοδο ήχου. Αλλάξτε αν αντιμετωπίζετε προβλήματα με τον ήχο.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Γενικά</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Εμφάνιση</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Ήχος</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Διάταξη</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Εισαγωγή</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} αρχίζει…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} εκτελείται…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Κεφαλαία</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Space bar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Μεγεθυντής απόδοση εικόνας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Εναλλακτικό</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Ισορροπημένο</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Ποιοτικό</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Ποιοτικό:\r\nΚαλύτερη ποιότητα εικόνας, αργή, υψηλή χρήση μνήμης.\r\n    \r\nΙσορροπημένο:\r\nΚαλή ποιότητα, γρήγορη, χαμηλή χρήση μνήμης.\r\n    \r\nΕναλλακτικό:\r\nΚαλύτερη ποιότητα, μέτρια ταχύτητα, χαμηλή χρήση μνήμης.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Επιλογή αρχείου</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Επιλογή φακέλου</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Σενάριο εκκίνησης</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Σημειώστε ότι τόσο οι επεκτάσεις όσο και τα θέματα μπορούν να επηρεάσουν σημαντικά την απόδοση, τη σταθερότητα και την ασφάλεια του Playnite.\r\n    \r\nΕάν αρχίσετε να αντιμετωπίζετε προβλήματα μετά την εγκατάσταση ενός θέματος ή μιας επέκτασης, δοκιμάστε να το απενεργοποιήσετε/απεγκαταστήσετε πρώτα για να δείτε αν είναι η ρίζα του προβλήματος.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Επιλέξτε κατά την εκκίνηση</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Επιλέξτε κατά την εκκίνηση</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Ενσωματωμένα προφίλ</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Ενσωματωμένο προφίλ</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Προσαρμοσμένα προφίλ</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Προσαρμοσμένο προφίλ</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Χειρίζεται από ένα ενσωματωμένο σενάριο</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Προδιαγραφή εξομοιωτή</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Προδιαγραφή πλατφόρμας</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Προδιαγραφές περιοχής</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Εκτέλεση πριν την έναρξη εξομοιωτή</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Εκτέλεση μετά την εκκίνηση του εξομοιωτή</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Εκτέλεση μετά την έξοδο εξομοιωτή</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Το εκτελέσιμο εξομοιωτή δεν βρέθηκε.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Δεν βρέθηκαν προδιαγραφές εξομοιωτή.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Το σενάριο εκκίνησης εξομοιωτή δεν βρέθηκε.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Διαχωρισμός ως ξεχωριστά παιχνίδια</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Συγχώνευση σε ένα παιχνίδι</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Ορισμός πλατφόρμας</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Ορισμός περιοχής</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Σάρωση φακέλου</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Σάρωση παραμέτρων</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Εξαίρεση προτύπων από αθροιστική σάρωση</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Τα αρχεία που ταιριάζουν με το συγκεκριμένο μοτίβο(α) δε θα σαρωθούν για αθροιστικό έλεγχο και θα ταιριάξουν με το όνομα αρχείου. Δείτε τη σελίδα βοήθειας του εξομοιωτή για περισσότερες πληροφορίες.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Σάρωση με εξομοιωτή</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Το όνομα πρέπει να οριστεί κατά την αποθήκευση νέων ρυθμίσεων.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Δεν έχει οριστεί εξομοιωτής ή προφίλ εξομοιωτή.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Ο κατάλογος σάρωσης δεν έχει καθοριστεί ή δεν υπάρχει.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Η ρύθμιση παραμέτρων σάρωσης δεν έχει οριστεί σωστά.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Συμπερίληψη στη μαζική σάρωση αυτόματης σάρωσης</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Αποτυχία σάρωσης φακέλου για τους εξομοιωτές.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Αποτυχία σάρωσης φακέλου(ων) για προσομοιωμένα παιχνίδια.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Απόκρυψη εισαγόμενων</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Προφίλ για εισαγωγή:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Ρυθμίσεις αυτόματης σάρωσης</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Αποθήκευση ρυθμίσεων αυτόματης σάρωσης</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Αποθηκεύει τις ρυθμίσεις για μεταγενέστερη χρήση κατά την ενημέρωση της βιβλιοθήκης. Οι αποθηκευμένες ρυθμίσεις μπορούν να τροποποιηθούν μέσω του μενού &quot;Ρύθμιση εξομοιωτών&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Εισαγωγή με χρήση σχετικών διαδρομών</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Η εισαγωγή, όσο είναι δυνατόν, αρχείων παιχνιδιών χρησιμοποιώντας διαδρομές σε σχέση με το φάκελο εγκατάστασης του Playnite ή το φάκελο εγκατάστασης του εξομοιωτή.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Σάρωση υποφακέλων</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Σάρωση μέσα σε αρχειοθήκες</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Συγχώνευση σχετικών αρχείων</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Συγχώνευση αρχείων του παιχνιδιού, όπως μεμονωμένοι δίσκοι παιχνιδιού, κάτω από μία καταχώρηση παιχνιδιού.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Προσθήκη σαρωτή</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Προσθήκη αποθηκευμένου σαρωτή</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Έναρξη σάρωσης</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Προσθήκη διαμόρφωσης σάρωσης με εξομοιωτές για σάρωση συγκεκριμένων φακέλων. Βεβαιωθείτε ότι οι εξομοιωτές έχουν ρυθμιστεί σωστά πριν από την εισαγωγή παιχνιδιών (μέσω του μενού Βιβλιοθήκη -&gt; Ρύθμιση εξομοιωτών).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Η προεπιλεγμένη κατάσταση έχει ανατεθεί σε νέα παιχνίδια που προστέθηκαν</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">H κατάσταση που έχει ανατεθεί σε παιχνίδια που παίζονται για πρώτη φορά</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Αποτυχία πραγματοποίησης του σεναρίου εκτέλεσης PowerShell. Αν είστε χρήστης των Windows 7, δοκιμάστε (επαν)εγκατάσταση του PowerShell 5.1 για να διορθώσετε το πρόβλημα.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Προεπιλεγμένο φίλτρο με καθορισμένο το όνομα υπάρχει ήδη. Ενημέρωση της προεπιλογής με τις νέες ρυθμίσεις;</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Αυτές οι λέξεις θα αφαιρεθούν εξ αρχής από την αυτόματη τιμή  του Ονόματος Ταξινόμησης:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Χρησιμοποιήστε αυτό για να αγνοήσετε λέξεις στην αρχή μιας συμβολοσειράς για λόγους ταξινόμησης. Η προεπιλογή είναι &quot;Η&quot;, &quot;Ένα&quot; και &quot;Α&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Συμπληρώστε το όνομα ταξινόμησης σε παιχνίδια που δεν έχουν</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Ταξινόμηση</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Πλήρωση τιμών ονόματος ταξινόμησης…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Η υπηρεσία Nahimic έχει εντοπιστεί ότι εκτελείται στο σύστημά σας. Αυτή η υπηρεσία είναι γνωστό ότι προκαλεί προβλήματα απόδοσης στο Playnite (και σε άλλες εφαρμογές).\r\n\r\nΕάν αντιμετωπίσετε οποιαδήποτε φθορά γραφικών ή άλλα ζητήματα απόδοσης στο Playnite, σας συνιστούμε να απενεργοποιήσετε ή να απεγκαταστήσετε εντελώς την υπηρεσία Nahimic.\r\n\r\nΠερισσότερες πληροφορίες στο https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Το Playnite εκτελείται με αυξημένα δικαιώματα (ως διαχειριστής). Αυτό δεν συνιστάται, δεδομένου ότι παρέχει αυξημένα δικαιώματα σε όλες τις εγκατεστημένες επεκτάσεις και όλα τα παιχνίδια/εφαρμογές που ξεκίνησαν από το Playnite!\r\n\r\nΠερισσότερες πληροφορίες στο https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Εμφάνιση προειδοποίησης αν το Playnite εκτελείται με αυξημένα δικαιώματα</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Εμφάνιση του πραγματικού μεγέθους στη μονάδα δίσκου κατά τον υπολογισμό του μεγέθους των παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Αν ενεργοποιηθεί, οι σαρώσεις θα είναι πιο αργές και θα λαμβάνουν το πραγματικό μέγεθος που χρησιμοποιούν τα αρχεία στο δίσκο.\r\nΑν απενεργοποιηθεί, οι σαρώσεις θα είναι ταχύτερες και θα χρησιμοποιούν το μέγεθος των ίδιων των αρχείων.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Τα ακόλουθα πρόσθετα έχουν αναφερθεί ως δυνητικά προβληματικά, είτε λόγω υψηλού αντίκτυπου στην σταθερότητα/απόδοση είτε λόγω ζητημάτων ασφάλειας. Συνιστούμε ανεπιφύλακτα την απεγκατάσταση τους:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Εξαίρεση online αρχείων από την σάρωση</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Τα αρχεία που αποθηκεύονται στο cloud storage δεν θα σαρωθούν και εισαχθούν αν δεν είναι διαθέσιμα τοπικά. Υποστηρίζονται μόνο για: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Σάρωση αλλά με απλοποιημένη μέθοδο χωρίς τα περιεχόμενα του αρχείου</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Τα αρχεία θα εισαχθούν αλλά χρησιμοποιώντας λιγότερο ακριβή μέθοδο που δεν απαιτεί τη λήψη του περιεχομένου του αρχείου και την εμφάνισή του τοπικά.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Εφαρμογή σε όλα</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Παράκαμψη κατάστασης εγκατάστασης</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Όταν οριστεί, το Playnite θα αγνοήσει την κατάσταση εγκατάστασης (συμπεριλαμβανομένου του καταλόγου εγκατάστασης) που έχει οριστεί από το πρόσθετο ενσωμάτωσης που εισάγει αυτό το παιχνίδι.\r\n        \r\nΑυτή η επιλογή μπορεί να μην λειτουργεί πλήρως με πρόσθετα που χρησιμοποιούν συγκεκριμένη μέθοδο εισαγωγής παιχνιδιού, εκτός αν λάβουν υπόψη αυτή την επιλογή.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Χειροκίνητα μόνο</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Μία φορά την ημέρα</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Μία φορά την εβδομάδα</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Σε κάθε εκκίνηση</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Έλεγχος για ενημερώσεις προγράμματος</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Έλεγχος για ενημερώσεις πρόσθετων</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Ενημέρωση βιβλιοθηκών</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Σάρωση φακέλων εξομοίωσης</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Συμπερίληψη κρυφών παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Επεξεργασία πεδίων</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Επιλογή / Αποεπιλογή όλων</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Άνοιγμα</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Ενεργοποίηση</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Ανάθεση</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Πληκτρολογείστε για αναζήτηση παιχνιδιών … Για βοήθεια πατήστε [F1]</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Ξεκινώντας με # εμφανίζεται μια λίστα με τις διαθέσιμες εντολές.\r\nΞεκινώντας με / εμφανίζει μια λίστα διαθέσιμων παρόχων αναζήτησης/προσθηκών.\r\nΠληκτρολογώντας μία λέξη-κλειδί στην αναζήτηση και τελειώνοντας με SPACE μεταβαίνει αμέσως σε αυτήν την αναζήτηση.\r\n\r\nTAB: εναλλαγή ενέργειας\r\nENTER: ενεργοποίηση επιλεγμένης ενέργειας\r\nSHIFT-ENTER: άνοιγμα μενού στοιχείων</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Συμπερίληψη μη εγκατεστημένων παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Συμπερίληψη κρυφών παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Περιλαμβάνονται μη εγκατεστημένα παιχνίδια</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Περιλαμβάνονται μη εγκατεστημένα παιχνίδια</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Περιλαμβάνονται κρυφά παιχνίδια</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Εξαιρούνται τα κρυφά παιχνίδια</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Αναπαραγωγή ή εγκατάσταση</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Μεταβείτε στις λεπτομέρειες</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Μενού παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Επεξεργασία Παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Άνοιγμα αναζήτησης</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Πλαίσιο αναζήτησης</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Πλήκτρο αναζήτησης</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Κύρια ενέργεια παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Δευτερεύουσα ενέργεια παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">Το CTRL-F ανοίγει την παγκόσμια αναζήτηση αντί για την εστιασμένη αναζήτηση</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Αποθήκευση ρυθμίσεων φίλτρου παιχνιδιού μεταξύ των συνεδριών αναζήτησης</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Πάροχος αναζήτησης</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Προεπιλεγμένες Λέξεις-κλειδιά </sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Προσαρμοσμένη λέξη-κλειδί</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Μεγάλη συντόμευση συστήματος</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Αναζήτηση Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Ρυθμίσεις επεκτάσεων</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Εξαιρέσεις</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Εξαιρούμενοι φάκελοι σχετικοί με τους φακέλους σάρωσης</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Εξαιρούμενοι φάκελοι σχετικοί με τους φακέλους σάρωσης</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Προσθήκη αρχείου στη λίστα εξαιρέσεων</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Προσθήκη φακέλου στη λίστα εξαιρέσεων</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Οι εξαιρέσεις μπορούν να προστεθούν μόνο στις αποθηκευμένες ρυθμίσεις σαρωτών.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Οι εξαιρέσεις έχουν προστεθεί στον σαρωτή &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Παράκαμψη πλατφόρμας</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Όταν οριστεί, ο σαρωτής θα καταχωρήσει αυτή την πλατφόρμα σε όλα τα παιχνίδια, αντικαθιστώντας τυχόν αυτόματα εντοπισμένες πλατφόρμες.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Συμπερίληψη εντολών στην προεπιλεγμένη αναζήτηση</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Όταν απενεργοποιηθεί, οι εντολές δεν θα περιλαμβάνονται στην προεπιλεγμένη αναζήτηση μέχρι να χρησιμοποιηθεί το πρόθεμα #.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Χρήση ασαφούς ταιριάσματος στο φίλτρο ονόματος</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Όταν είναι ενεργοποιημένο, το όνομα φίλτρου θα ταιριάζει με τα ονόματα παιχνιδιών με τον ίδιο τρόπο όπως και η γενική αναζήτηση. Η αυστηρή αντιστοίχιση μπορεί να επιβληθεί σε μια μεμονωμένη περίπτωση με πρόθεμα φίλτρου τον χαρακτήρα &quot;!&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Πεδία προς εμφάνιση για τα αποτελέσματα του παιχνιδιού:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Κρυφή Κατάσταση</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Το αντίγραφο ασφαλείας των δεδομένων ακυρώθηκε.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Αποτυχία αντιγράφου ασφαλείας δεδομένων.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Σφάλμα αντιγράφου ασφαλείας δεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">H αντιγραφή ασφαλείας δεδομένων πραγματοποιείται …</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Επαναφορά δεδομένων από αντίγραφο ασφαλείας…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Αποτυχία επαναφοράς δεδομένων από αντίγραφο ασφαλείας.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Ρυθμίσεις</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Βιβλιοθήκη παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Πολυμέσα βιβλιοθήκης παιχνιδιών</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Εγκατεστημένες επεκτάσεις</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Δεδομένα επεκτάσεων</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Εγκατεστημένα θέματα</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Επιλέξτε τα δεδομένα που θα αποκατασταθούν από το καθορισμένο αρχείο αντιγράφου ασφαλείας.\r\n    \r\nΤο Playnite θα επανεκκινήσει αυτόματα για να ξεκινήσει η διαδικασία επαναφοράς αντιγράφων ασφαλείας.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Επιλέξτε τα στοιχεία που θα συμπεριληφθούν σε αντίγραφα ασφαλείας δεδομένων. Οι ρυθμίσεις εφαρμογών και τα δεδομένα της βιβλιοθήκης παιχνιδιών περιλαμβάνονται από προεπιλογή.\r\n    \r\nΤο Playnite θα επανεκκινήσει αυτόματα για να ξεκινήσει η διαδικασία δημιουργίας αντιγράφων ασφαλείας.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Αυτόματα αντίγραφα ασφαλείας δεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Συχνότητα αυτόματων αντιγράφων ασφαλείας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Φάκελος αντιγράφων ασφαλείας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Εναλλασσόμενα αντίγραφα ασφαλείας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Συμπερίληψη πρόσθετων δεδομένων:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Ο φάκελος αντιγράφων ασφαλείας πρέπει να οριστεί αν είναι ενεργοποιημένο το αυτόματο αντίγραφο ασφαλείας.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Εμφάνιση ειδοποιήσεων μόνο για διορθωτικές ενημερώσεις</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Όταν ενεργοποιηθεί, μόνο οι διαθέσιμες ενημερώσεις για την τρέχουσα εγκατεστημένη κύρια έκδοση θα έχουν ως αποτέλεσμα την ειδοποίηση ενημέρωσης.\r\nΟι νέες σημαντικές εκδόσεις δεν θα οδηγήσουν στην ειδοποίηση ενημέρωσης.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Χρήση σχετικών ημερομηνιών για την προηγούμενη εβδομάδα</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Χρησιμοποιήστε σχετικές ημερομηνίες σε μορφή &quot;Σήμερα&quot;, &quot;Χθες&quot; κλπ αν η ημερομηνία είναι μικρότερη από μια εβδομάδα.\r\n    \r\nΗ καθορισμένη μορφή ημερομηνίας θα χρησιμοποιηθεί για όλες τις άλλες ημερομηνίες.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Αναζήτηση εικόνας Web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Στοιχείο αναζήτησης εικονιδίου</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Στοιχείο αναζήτησης εξώφυλλου εικόνας</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Συμβολοσειρά αναζήτησης εικόνας φόντου</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Λήψη πληροφοριών πρόσθετου…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Δεν υπάρχει διαθέσιμη πηγή μεταδεδομένων</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Ρυθμίσεις ενέργειας αναπαραγωγής</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Ρυθμίσεις σαρωτή</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Επιλογή προφίλ κατά την εκκίνηση</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Επιλέξτε εξομοιωτή κατά την εκκίνηση</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Αυτόματο</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Πάντα ενεργό</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Πάντα απενεργοποιημένο</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Υποστήριξη προσβασιμότητας (οθόνη αναγνώστη)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Μενού εφαρμογής</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Μενού παιχνιδιού</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Φάκελος προγράμματος</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Κατάλογος δεδομένων χρήστη</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Έχουν εντοπιστεί κατεστραμμένα αρχεία βιβλιοθήκης, το Playnite θα τερματιστεί.\r\n    \r\nΑνοίξτε νέο ζήτημα στη σελίδα GitHub του Playnite με αίτημα να διορθωθεί το πρόβλημα στα αρχεία σας.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Θέλετε να αποθηκεύσετε τις αλλαγές που κάνατε?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Φορητή εγκατάσταση</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Δεν εντοπίστηκαν χειριστήρια</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/en_US.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">English</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Made by Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\"></sys:String>\r\n    <sys:String x:Key=\"LOCSteamFriendsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\"></sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\"></sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Finish</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Author</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatronsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCToday\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\"></sys:String>\r\n    <sys:String x:Key=\"LOCMonday\"></sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCThursday\"></sys:String>\r\n    <sys:String x:Key=\"LOCFriday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSunday\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\"></sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameId\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\"></sys:String>\r\n    <sys:String x:Key=\"LOCPresets\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumn\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCRow\"></sys:String>\r\n    <sys:String x:Key=\"LOCRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\"></sys:String>\r\n    <!--Progess string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\"></sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\"></sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsProvidersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdateLibStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdateEmulatedLibStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Use when experiencing stuttering or similar UI issues</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableDpiAwareness\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForceDownloadPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForceDownloadPlayniteTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCViewType\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\"></sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\"></sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCXInputInitErrorMessage\">Failed to initialize XInput interface.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseExeIcon\"></sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCOtherActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Installing</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Running</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\"></sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\"></sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCChange\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCNever\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Plugins</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\"></sys:String>\r\n    <sys:String x:Key=\"LOCAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\"></sys:String>\r\n    <sys:String x:Key=\"LOCWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirst\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandom\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\"></sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpand\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOther\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Update Available</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Download and Install Update</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Script runtime</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\"></sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Remove from Favorites</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Cancel game monitoring?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Time Played</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Less than an hour</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 to 10 hours</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 to 100 hours</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 to 500 hours</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 to 1000 hours</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\"></sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\"></sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Recently Played</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewScrollAmountModifier\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/eo_UY.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Esperanto</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Eliri</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtriloj</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtrilo</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Pri Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Farita de Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Raporti kraŝon</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Forigu ludo(j)n?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\"></sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\"></sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Ebligita</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Forigu</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopii</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Aldonu</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Finas</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nomo</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Aŭtoro</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modulo</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Serioj</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Serĉi</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCToday\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\"></sys:String>\r\n    <sys:String x:Key=\"LOCMonday\"></sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCThursday\"></sys:String>\r\n    <sys:String x:Key=\"LOCFriday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSunday\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\"></sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameId\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\"></sys:String>\r\n    <sys:String x:Key=\"LOCPresets\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumn\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCRow\"></sys:String>\r\n    <sys:String x:Key=\"LOCRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\"></sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\"></sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\"></sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\"></sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCViewType\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\"></sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\"></sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\"></sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\"></sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\"></sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCChange\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCNever\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\"></sys:String>\r\n    <sys:String x:Key=\"LOCAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\"></sys:String>\r\n    <sys:String x:Key=\"LOCWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirst\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandom\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\"></sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpand\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOther\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\"></sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\"></sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\"></sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\"></sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\"></sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpen\"></sys:String>\r\n    <sys:String x:Key=\"LOCActivate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAssign\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/es_ES.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Español</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Idioma de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Salir</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtro activo</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtro deshabilitado</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Filtros adicionales</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtros</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtro</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Datos inválidos</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">¿Guardar cambios?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Página web en www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Código fuente en GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Crear paquete diag.</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Enviar información diagnóstica</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Acerca de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Creado por Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Asignar categoría</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Establecer categorías</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Añadir categoría</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Seleccionado - Asignar categoría\r\nNo seleccionado - Eliminar categoría\r\nIndeterminado - Sin cambios (al editar múltiples juegos)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Sin categoría</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Sin plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">¡Ups! Algo salió mal…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Se ha producido un error irrecuperable.\r\n\r\nSi quieres ayudarnos a solucionar este problema, por favor, describe brevemente las acciones realizadas antes del fallo y envía la información de diagnóstico. Si estás conectado a Internet, el paquete se subirá al servidor de Playnite para su análisis.\r\n\r\nTambién puedes hacer clic en el botón &quot;Informar de un fallo&quot; para crear una nueva incidencia en GitHub e informar del fallo manualmente.\r\n\r\nGracias por tu ayuda.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">La extensión &quot;{0}&quot; provocó un error irrecuperable.\r\n\r\nRecomendamos guardar el archivo de registro e informar del problema al desarrollador de la extensión. Si el problema se repite, desactiva la extensión.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">La extensión &quot;{0}&quot; provocó un error irrecuperable.\r\n\r\nRecomendamos informar del problema al desarrollador de la extensión. Si el problema se repite, desactiva la extensión.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Extensión desconocida o un tema causó un error irrecuperable.\r\n\r\nRecomendamos deshabilitar los complementos de terceros, aislando el problemático y reportando el problema al desarrollador del complemento.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Ha ocurrido un error irrecuperable.\r\n\r\nSi quieres ayudarnos a solucionar este problema, por favor, envía la información de diagnóstico. Gracias.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Desactivar extensión</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Guardar archivo de registro</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Enviar información de diagnóstico</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Informar de un error</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Reiniciar Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Reiniciar en modo seguro</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Desactivando todas las extensiones de terceros y utilizando el tema por defecto.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Salir de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Acciones realizadas antes del fallo (en inglés):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Administrador de biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">¿Eliminar juego(s)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">No se puede eliminar: el juego o el instalador se están ejecutando.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">No se puede desinstalar: el juego se está ejecutando.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">¿Estas seguro que quieres eliminar {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">¿Estás seguro de que quieres eliminar {0} juegos?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">¿Está seguro de que quieres eliminar {0}?\r\n\r\nSeleccionar la opción &quot;añadir a la lista de exclusión&quot; evitará que los juegos se vuelvan a importar la próxima vez que se actualice la biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">¿Está seguro de que desea eliminar {0} juegos?\r\n\r\nSeleccionar la opción &quot;añadir a la lista de exclusión&quot; evitará que los juegos se vuelvan a importar la próxima vez que se actualice la biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">¿Estás seguro de que quieres eliminar {0} entradas que actualmente no están en uso?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">No se han encontrado campos sin utilizar.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Sí (añadir a la lista de exclusión)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Hay cambios sin guardar en esta sección.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Actualizando el formato de la biblioteca de juegos…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Error al actualizar la base de datos.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">No se puede actualizar la biblioteca. Se necesitan {0} MBs de espacio libre en el disco.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Error del Juego</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">No se puede iniciar el juego. '{0}' no se ha encontrado en la base de datos.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">No se puede iniciar el juego: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">No se puede iniciar la acción: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">No se puede abrir la ubicación del juego: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">No se pudo detectar el tamaño de la instalación del juego: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Error al escanear el tamaño de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Hubo {0} errores durante el escaneo del tamaño de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Error al crear acceso directo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Error al abrir el manual: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">No se puede instalar el juego: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">No se puede desinstalar el juego: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">No se encontraron acciones de inicio de juego válidas. Al usar acciones de emulador, asegúrate de que las definiciones de la plataforma coincidan entre el juego y la configuración del emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">La implementación de la instalación no está disponible.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">El complemento de biblioteca responsable de este juego está desactivado o no está instalado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">La descarga de metadatos oficiales no está disponible.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">No hay ningún juego seleccionado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">La ejecución de la acción del script del juego ha fallado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Falló la ejecución del script de aplicación.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">La ejecución de la acción global del script ha fallado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Falló la ejecución del script del emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">La ejecución del script de jugar falló.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 o posterior no está instalado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">No se pudo determinar cómo comenzar el juego.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Activado</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Deshabilitado</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Eliminar</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Eliminar los no usados</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Renombrar</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Copiar</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Añadir</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Icono predeterminado</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Carátula por defecto</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Imagen de fondo por defecto</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Finalizar</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Siguiente</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Volver</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">LISTO</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">VOLVER</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">VACIAR</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Vaciar</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Descartar</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Descartar todo</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importar</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nombre</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Módulo</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Serie</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versión</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Ultima partida</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Más jugado</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Veces jugado</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Tamaño de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Carpeta</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notas</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Añadido</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Se añadió el día</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Modificado</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Fecha de modificación</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Página web</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Ruta</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Guardar</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Cerrar</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Cancelar</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Confirmar</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Restablecer</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Sí</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">No</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Bienvenido</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Usuario local</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">General</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Multimedia</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Enlaces</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Instalación</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Acciones</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Descargando…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Descargando multimedia…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Cargando…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Tipo</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Perfil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Perfiles</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Eliminar</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Descargar</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Buscar</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Resolución:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Cualquiera</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Zoom</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Vista de lista</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Carátulas</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Vista de cuadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Vista detallada</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Personalizado</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Agradecimientos especiales</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licencia</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Colaboradores</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Saliendo de Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Hoy</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Ayer</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Lunes</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Martes</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Miércoles</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Jueves</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Viernes</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Sábado</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Domingo</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">La semana pasada</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">El mes pasado</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">El año pasado</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Hace más de un año</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 a 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB a 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB a 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB a 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB a 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB a 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB a 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100 GB o más</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Importación completada correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Todos los juegos</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Id del juego</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Id de la base de datos</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Ajustes por defecto</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Columna</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Columnas</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Fila</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Filas</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">No se pudo obtener el icono de la acción de juego. No hay acción de tipo archivo presente.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Descargar solo metadatos faltantes</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Activar esta opción saltará las descargas de metadatos de campos que ya contengan información.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Selección de juegos</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Selecciona qué juegos deben actualizarse con nuevos metadatos:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Todos los juegos de la base de datos</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Todos los juegos filtrados actualmente</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Solo los juegos seleccionados</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">No hay campos de metadatos seleccionados</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">No se han seleccionado campos de metadatos para la descarga. Por favor, selecciona al menos uno, y habilita al menos un proveedor de metadatos para este.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Tienda oficial</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Selecciona qué campos debe rellenar automáticamente Playnite y qué fuentes utilizar para obtener los datos.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Considera la posibilidad de hacer clic en el logo de arriba y contribuir con actualizaciones a la base de datos de igdb.com para mejorar los datos que utiliza Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Descargando metadatos…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importando juegos instalados…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importando juegos de {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importando juegos emulados de {0} ...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Descargando actualizaciones de la biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Escaneando el tamaño de los juegos en la librería…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Escaneando el tamaño de los juegos importados…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Actualización de biblioteca finalizada</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Liberando recursos…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Configuración</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Configuración…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Plataformas y Emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Configurar Emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Administrador de la biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Herramientas</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Descargar Metadatos…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Herramientas de software…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Configurar integraciones…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Abrir Cliente de Tercero</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Clientes de terceros</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Actualizar la Biblioteca de Juegos</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Cancelar la actualización de la biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Actualizar carpetas emuladas</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Agregar Juego</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manualmente…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Escanear Automáticamente…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Juego Emulado…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Aplicación de la Microsoft Store</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Acerca de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Enviar retroalimentación</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Cambiar al modo de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Enlaces</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Ayuda</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Apoyar en Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Apoyar en Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Manual de usuario</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Documentación de SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Reiniciar el sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Apagar el sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Suspender el sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernar el sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Bloquear sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Cerrar sesión de usuario</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Elegir un juego aleatorio</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Campos del juego que se mostrarán en el panel de detalles:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Espacio entre elementos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Mostrar imagen de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Ancho del borde del elemento de cuadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Falta una fuente para el icono del juego</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Falta una fuente para la carátula del juego</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Falta una fuente para la imagen de fondo del juego</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Espacio vertical de los detalles del juego</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Posición de los detalles de la vista de cuadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Posición de la lista de juegos en vista de detalles</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Dibujar separador entre paneles</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Alto de imagen de la carátula del juego</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Altura del icono de la lista de juegos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Fuente de la aplicación</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Fuente monoespaciada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Posición del panel de filtros</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Posición del panel de exploración</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Renderizado de la carátula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Relación de aspecto objetivo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Las siguientes opciones también afectan el renderizado de mosaicos en el modo de pantalla completa.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Modo de estiramiento</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Caja de DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Cuadrado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Banner de Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Carátula vertical de Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Requiere reiniciar para aplicar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Configuración</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">General</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Panel superior</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Apariencia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Detalles del juego</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Disposición</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Avanzado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Pantalla Completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Entrada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Rendimiento</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadatos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Actualizando</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Buscar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Copia de seguridad</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Copiar datos de la biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Restaurar copia de seguridad</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importar cambios en la biblioteca automáticamente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Ubicación del archivo de base de datos no es válida, se debe establecer una ruta de archivo adecuada.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">El nombre de la cuenta no puede estar vacía.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Descargar metadatos después de importar los juegos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Iniciar Playnite minimizado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Iniciar Playnite al arrancar el ordenador</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Iniciar cerrado en la bandeja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">No se ha podido registrar Playnite para que se inicie al arrancar el ordenador.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Iniciar en modo de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Carga de imágenes asíncrona</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Mejora la suavidad del desplazamiento de las listas de juegos a cambio de que los tiempos de carga de las imágenes sean más lentos.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Mostrar nombre del juego si no hay imagen de carátula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Mostrar nombres de juegos en la vista de cuadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Oscurecer juegos no instalados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Mostrar iconos de juegos en la vista de detalles</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Mostrar número de elementos en las descripciones de los grupos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Mostrar solo los campos asignados en los paneles de filtro y explorador</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Desactivar aceleración por hardware</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Usar si la interfaz da tirones o problemas similares</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Mostrar juegos ocultos en listas de inicio rápido</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Afecta a los menús del sistema y al área de notificación.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Número de elementos de lanzamiento rápido</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Usar la imagen de fondo del juego como fondo de la ventana</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Desenfocar el fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Alta calidad</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Oscurecer el fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Mostrar en la vista de cuadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Perfil del tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Tema de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Perfil del tema de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Ubicación de la base de datos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Estado de inicio de sesión:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Configuración de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Borrar caché web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Puede resolver problemas encontrados al vincular cuentas.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Mostrar icono en la bandeja del sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimizar Playnite a la bandeja del sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimizar Playnite a la bandeja al cerrar la ventana de la aplicación</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Al iniciar un juego:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Después de cerrar el juego:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Formatear tiempo de juego para indicar el número de días jugados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Formatos de fechas:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Esto lo desconectará de todos los servicios vinculados. Se requiere reiniciar la aplicación, ¿Quieres proceder?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">¿Limpiar cache?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Se requiere reiniciar Playnite cuando se cambia el tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Obtener más temas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Crear un tema nuevo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Obtener más extensiones</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Crear nueva extensión</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Ayúdanos a traducir Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite debe reiniciarse para aplicar las nuevas configuraciones. ¿Reiniciar ahora?\r\n\r\nReiniciar cancelara las tareas activas (descargas) en curso.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">¿Reiniciar Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite no puede mover los archivos de su biblioteca automáticamente. Debe mover/copiar manualmente los archivos antes de cambiar la ubicación. Si no hay una biblioteca en la ubicación de destino, se creará una nueva.\r\n\r\nLa nueva ubicación de la base de datos no se utilizará hasta que se reinicie Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">El tiempo de juego no se registrará si se establece la acción &quot;Cerrar&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Número de filas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Número de columnas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Número de filas en la Vista de Detalles</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Mostrar imagen de fondo en la pantalla principal</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">No se aplica a juegos existentes sin volver a descargar los metadatos.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importar tiempo de juego de juegos en la biblioteca:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Configura cuándo debe importar Playnite el tiempo de juego reportado por los plugins de la biblioteca para juegos en la base de datos de Playnite. Para poder utilizar esta característica es necesario el soporte de los plugins de la biblioteca a cargo de manejar los juegos.\r\n\r\nSiempre: Importa el tiempo de juego para nuevos juegos importados y existentes en la base de datos de Playnite.\r\nSólo para los juegos recién importados: Importa tiempo de juego sólo para los nuevos juegos importados.\r\nNunca: Nunca importa tiempo de juego bajo ninguna circunstancia.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Siempre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Sólo para los juegos recién importados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Nunca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Habilitar soporte para control en modo escritorio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Botón guía abre el modo pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Configuración de descarga automática de metadatos para juegos recién importados.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Pantalla objetivo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Siempre usar la pantalla primaria</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Mostrar títulos de juegos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Mostrar estado de la batería</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Mostrar porcentaje de la batería</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Mostrar reloj</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Ocultar el cursor del ratón</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Solo instalados en los filtros rápidos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Indicaciones de botón</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Disposición</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Desplazamiento horizontal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Selecciona una de las subsecciones</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">No hay ajustes disponibles</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">No se pudo cargar la configuración</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Estos scripts son ejecutados para todos los juegos en la libreria. Scripts individuales pueden ser asignados a cada juego por separado mientras editas los detalles del juego.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animar transiciones de imágenes de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Tamaño de letra</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Auto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Aliased</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Escala de grises</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Pantalla</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Modo de formato de texto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Modo de renderizado de texto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Los métodos de renderizado y formato de texto no se utilizan actualmente para las descripciones de juegos.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Precargar imágenes de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Si está habilitado, Playnite descargará ilustraciones de fondo mientras descarga metadatos, usando más espacio en disco y haciendo que las ilustraciones estén disponibles sin conexión.\r\n\r\nSi está deshabilitado, la ilustración de fondo se descarga solo cuando se necesita por primera vez, usando menos espacio, pero puede provocar un retraso antes de que se muestre la ilustración y algunas imágenes pueden no estar disponibles sin conexión.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Cerrar automáticamente el cliente de terceros después de salir del juego</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Retraso de cierre del cliente (en segundos)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">No cerrar después de sesiones de juego más cortas que (en segundos)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Cerrar automáticamente los siguientes clientes:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Cerrar automáticamente clientes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importar lista de exclusión</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Mostrar aviso cuando se asignen medios del juego muy grandes</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Comando de apertura de directorio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Organización de clasificación por edad preferida</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Actualizar el tamaño de instalación de juegos al actualizar la biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Escanea y actualiza el tamaño de instalación de los juegos si se detecta que sus archivos han sido modificados desde el último escaneo</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Ninguno</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Rellenar</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Uniforme para rellenar</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Izquierda</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Derecha</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Arriba</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Abajo</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Error de Importación</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Autenticación requerida</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Autenticación fallida</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Modo de redenderizado de vista web alternativo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Use cuando se te tengan problemas con vistas web, por ejemplo, en diálogos de autenticación de integraciones.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Carga parcial de grandes descripciones de juegos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Las descripciones grandes pueden causar retrasos notables al seleccionar juegos.\r\n\r\nCuando está habilitado, sólo una parte del texto de descripción se cargará inicialmente con una opción para cargar el resto bajo demanda.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Importación de Metadatos</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Descargar Metadatos</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Usar configuración seleccionada para cualquier descarga de metadatos futura.\r\nTambién puede cambiarse en las opciones de aplicación.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Asistente de Importación de Emulación</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Este asistente te ayudará a descargar e importar emuladores de consolas, así como a importar juegos emulados.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Ten en cuenta que siempre puede agregar emuladores y/o juegos adicionales más tarde a través del menú principal (en el menú &quot;Biblioteca&quot; para la configuración del emulador y el menú &quot;Agregar juegos&quot; para juegos emulados).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">A continuación se muestra una lista de emuladores que Playnite puede reconocer y configurar automáticamente. Puede descargar los instaladores de los emuladores de sus sitios web. Una vez que hayas instalado los emuladores (manualmente), puedes importarlos en el cuadro de diálogo de configuración del emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Puedes importar cualquier emulador que esté instalado en tu PC haciendo clic en el botón 'Autodetectar desde carpeta...'. Playnite buscará en la carpeta seleccionada cualquier emulador conocido y ofrecerá la opción de importarlo. Puedes utilizar este botón varias veces para importar emuladores de diferentes carpetas. Los emuladores se añadirán al final de la lista actual.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Puedes importar juegos haciendo clic en el botón &quot;Escanear carpeta usando el emulador&quot;. Al seleccionar el emulador adecuado, Playnite sabrá qué tipos de archivos se deben escanear e importar. Puedes utilizar este botón varias veces para importar juegos de diferentes carpetas. Los juegos se añadirán al final de la lista actual.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">No hay emuladores seleccionados para la importación. No podrá importar automáticamente ningún juego emulado sin configurar primero los emuladores. ¿Seguro que quieres continuar y salir del proceso de importación?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">No hay emuladores configurados en Playnite. No puede importar juegos sin antes configurar el emulador y seleccionar los tipos de archivo apropiados. ¿Quieres agregar algunos emuladores ahora?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Escanear carpeta usando emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Seleccionar archivos</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Detectar automáticamente desde carpeta…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Configurar Emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Escaneando…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Escaneando {0} ...</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Primera configuración</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Este asistente te ayudará a importar y configurar automáticamente las bibliotecas externas de juegos. Playnite puede importar automáticamente juegos de múltiples servicios, como Steam o GOG, y también mantener tu biblioteca al día actualizándola automáticamente cuando se inicie la aplicación.\r\n\r\nTen en cuenta que puedes añadir manualmente cualquier juego de forma personalizada para cualquier plataforma más adelante, haciendo clic en el botón 'Playnite' del menú principal.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integración de bibliotecas</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">A continuación se presentan la lista de algunas integraciones curadas de bibliotecas que Playnite soporta. Por favor, seleccione las que desea instalar.\r\n\r\nSe pueden instalar más integraciones más adelante desde el menú &quot;Complementos&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Configuración Finalizada</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">La configuración inicial se ha completado. Recuerda que puedes cambiar todos los ajustes más tarde en el menú &quot;Configuración&quot;.\r\n\r\nTambién puedes añadir cualquier otro juego más adelante haciendo clic en el menú del logotipo de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Error al descargar una o más extensiones.\r\n\r\nPuedes intentar volver a descargar las integraciones desde el menú de complementos después de finalizar el asistente de primera ejecución.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Descargando integración de {0} ...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Descargando lista de integraciones recomendadas…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">No se ha podido descargar la lista de integraciones recomendadas. Puedes intentar volver a descargar las integraciones más tarde a través del menú de complementos.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Configurar Plataformas y Emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Configurar Emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Plataformas</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Añadir Platforma</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Seleccionar Icono</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Seleccionar carátula</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Seleccionar imagen</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Seleccionar elemento</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Seleccionar imagen de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Seleccionar Archivo</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Seleccionar URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Añadir Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Platforma(s) Soportadas</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">¿Desea guardar los cambios de plataforma?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">¿Desea guardar los cambios de emulador?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Ejecutable</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumentos</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Directorio de Trabajo</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Tipos de Archivos Soportados</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importar Emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Descargar Emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Cargar argumentos preestablecidos del perfil conocido del emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">¿Estás segura de que quieres eliminar el emulador {0}?\r\nActualmente está siendo utilizado por {1} juego(s).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">¿Estás segura de que quieres eliminar la plataforma {0}?\r\nActualmente está siendo utilizado por {1} juego(s) y {2} emulador(es).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Ayuda de Configuración</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Ordenar por</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Dirección de Ordenamiento</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Agrupar por</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Ascendente</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Descendente</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">No agrupar</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Agrupar por biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Agrupar por Categoría</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Agrupar por Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Tipo de vista</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Vista</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Panel de exploración</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Panel de filtros</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Icono</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Icono de biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Carátula</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Imágen de Fondo</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Orden de nombre</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manual</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nombre</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Unidad de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Nombre de la cuenta</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Categoría</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Género</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Fecha de Lanzamiento</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Año de lanzamiento</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Desarrollador</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Etiqueta</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Editor</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Estado de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Coincidir con todos los filtros</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Si está habilitado, solo los juegos que usan todos los elementos en todos los filtros se incluirán en la vista.\r\nSi está deshabilitado, los juegos que usan cualquier elemento en cualquier filtro se incluirán en la vista.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">No instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Oculto</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favorito</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Habilitar soporte HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Si está activado, el HDR se habilitará en la pantalla principal antes de comenzar el juego.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Tenga en cuenta que el HDR no está soportado en su pantalla principal.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Jugado por última vez</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Categoría</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Descripción</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Directorio de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Carátula</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Enlaces</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Ruta de Imágen, ROM o ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Género</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Géneros</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Empresa</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Compañias</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Desarrollador</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Desarrolladores</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Editor</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Editores</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Categoría</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Categorías</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Etiqueta</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Etiquetas</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Característica</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Características</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Clasificación por edad</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Clasificación por edad</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Región</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regiones</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Fuente</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Fuentes</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Actividad Reciente</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Error de la Base de Datos.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Error al Abrir la Base de Datos.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">La Base de Datos no está abierta.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">No se puede acceder a la Base de Datos. El archivo &quot;{0}&quot; está siendo usado por otro proceso o se encuentra en una locación inaccesible.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Error al crear el paquete de diagnósticos.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Error al enviar automáticamente el paquete de diagnósticos.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">La información de diagnóstico se ha enviado correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">El paquete de diagnóstico se ha creado y enviado correctamente.\r\nAdjunte el siguiente ID a su informe de problemas:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Error al importar los juegos de {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Error al importar juegos emulados de {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">No se pueden buscar juegos con el perfil del emulador seleccionado. El perfil no contiene extensiones de archivos o plataformas.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite no pudo iniciarse. Cierre todas las demás instancias y vuelva a intentarlo.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Error al aplicar el tema &quot;{0}&quot;, perfil de color &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">No se puede abrir el enlace, la URL no está en formato válido.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">No se pudo iniciar la aplicación.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Error al inicializar el componente de vista web. Playnite no puede continuar con el proceso de inicio.\r\n\r\nMás información en https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">No se pueden importar emuladores porque falta o está dañado un archivo de definición.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">No se pudo ejecutar la acción del menú.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Editar Detalles del Juego</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL de la imagen</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Agregar Enlace</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Agregar rom</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Guardar Cambios</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Aplicar cambios de campo a los juegos que se están editando.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Agregar Acción</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Borrar Acción</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Eliminar acción de Jugar</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Agregar Juegos</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Escanear Carpeta…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Detectar Instalados</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Navegar…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Abrir Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Ajustes de Perfil</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">El nombre del juego no puede estar vacío.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">El directorio de seguimiento de acción de juego no puede estar vacío.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">El nombre del juego no puede estar vacío antes de buscar metadatos.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Datos de juego inválidos</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Ingrese una URL web válida comenzando por http:// o https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Seleccionar URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Error al descargar los metadatos: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Error de Descarga</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Borrar filtros</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Cuenta Privada</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Cuenta Pública</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">Clave de API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Error de Inicio</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Error del Tema</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Borrar Todo</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Instalando</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Desinstalando</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Iniciando</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Ejecutando</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">URL inválida</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">No hacer nada</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimizar</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Restaurar ventana</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Restaurar sólo cuando se inicia desde la interfaz</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Cerrar</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Cambiar</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Avanzado</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Nunca</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Estado de finalización</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Estados de finalización</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Puntuación del usuario</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Valoración de la crítica</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Valoración de la comunidad</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Scripts del juego</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Scripts de aplicación</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Complementos</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Fuentes de metadatos</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Extensiones</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID de extensión</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Recargar Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">PowerShell SDK Interactivo</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Todos los scripts fueron recargados correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">No se encontraron juegos para los criterios de búsqueda/filtro especificados</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">No se encontraron elementos</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Cambiar al modo de escritorio</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Salir de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Bibliotecas</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Actualizar todo</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Creado por:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versión:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Actualizado:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Módulo:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Estadísticas</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Todos</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Ninguno</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Notificaciones</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Ancho</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Alto</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Tamaño</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Pequeña</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Grande</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Más grande</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">La más grande</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Predeterminado</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Seleccionar</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Seleccionar todos</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Deseleccionar todo</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Primero</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Aleatorio</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Selección de usuario</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Cargar más</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Transparente</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Contraer</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Expandir</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Contraer todas</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Expandir todas</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Otro</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Temas</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Argumentos del Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Argumentos incorporados</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Argumentos personalizados</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Argumentos del Emulador Adicionales</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Reemplazar argumentos del emulador</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Acción de Jugar</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Seleccionar metadatos para importar</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Seleccione Juegos para Importar</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Búsqueda de metadatos</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Actualización Disponible</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Cambios desde la última actualización</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Instalar Actualización</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Comprobar actualizaciones</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Error al actualizar</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Error al comprobar actualizaciones.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">No hay nuevas versiones disponibles.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Error al descargar e instalar la actualización.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Una tarea en segundo plano está actualmente en curso. ¿Quieres cancelarla y continuar con la actualización?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Una tarea en segundo plano está actualmente en curso. ¿Quieres cancelarla y salir de Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Una tarea en segundo plano está actualmente en curso. Cambiar modos cancelara la tarea, ¿Quieres cambiar de todos modos?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Hay una actualización para Playnite disponible</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Volver a cargar la lista de temas</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Aplicar tema seleccionado</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Ver cambios de archivos</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Aplicar el tema automáticamente cuando el archivo de fuente cambie</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Entorno de ejecución de script</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Script para ejecutar antes de comenzar un juego</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Script para ejecutar después de salir de un juego</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Script para ejecutar después de que se inicia un juego</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Ejecutar al iniciar la aplicación</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Ejecutar al cerrar la aplicación</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Script de juego iniciando</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Script de juego iniciado</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Script de juego detenido</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Ejecutar script global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrada</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Actual</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Nuevo</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Probar script</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Mostrar sólo los elementos seleccionados</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Guardar como predeterminado</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Agregar a Favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Eliminar de Favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Ocultar este juego</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Eliminar de Oculto</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Habilitar soporte HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Desactivar soporte HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Editar…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Calcular tamaño de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Calcular tamaño de instalación (Todos los juegos)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Calcular tamaño de instalación (Sólo con datos faltantes)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Tamaño de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Establecer categoría…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Establecer estado de finalización</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Eliminar</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Iniciar</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Instalar</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Opciones de Juego</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Detalles</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Desinstalar</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Abrir la ubicación del juego</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Crear acceso directo en el escritorio</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Abrir manual</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Más</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Administrado por el complemento de la biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">El proceso de inicio del juego será administrado por el complemento de la biblioteca responsable de este juego.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">No se ha encontrado información relevante sobre el juego '{0}' en la página especificada.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Sugerencia: puede usar un proceso de descarga de metadatos más avanzado mientras edita un solo juego a través de la opción de menú &quot;Editar&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">No disponible cuando alguna acción está en proceso.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">El texto de descripción es sensible a la sintaxis HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">El tiempo de juego se registra en segundos.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">El tamaño de instalación está indicado en bytes.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">La fecha de lanzamiento debe establecerse en el formato 'año-mes-día'. Los valores del mes y el día se pueden omitir.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Valores entre 0 y 100 o dejar vacío para no puntuar.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">El desarrollo de Playnite está apoyado por estos patrocinadores y miembros de Ko-fi:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Código, traductores y otros contribuyentes en ningún orden en particular:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">¿Cancelar monitoreo de juegos?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">El monitoreo de la instalación se está ejecutando actualmente. ¿Quieres cancelar el proceso y devolver el juego al estado anterior?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">El monitoreo de la ejecución del juego se está ejecutando actualmente. ¿Quieres cancelar el proceso y devolver el juego al estado anterior?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Tiempo Jugado</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Jugado por última vez</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}d {1}h {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0} h {1} min</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minutos</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} segundos</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Nunca</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Abriendo Modo de Escritorio…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Abriendo Modo de Pantalla Completa…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Cargando biblioteca de juegos…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Calculando tamaño de instalación…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Calculando tamaño de instalación de {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Error al instalar el archivo script.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Script instalado correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Instalar Script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Error en el Script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Error al ejecutar función de la extensión.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Abrir carpeta de metadatos</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Calcular</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Calcula automáticamente el tamaño de instalación usando Roms si el juego tiene alguno o el directorio de instalación si se ha establecido</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">El cliente {0} no está instalado.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">El cliente {0} se abrirá. Por favor, inicia sesión y cierra este mensaje.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Esperando a que el usuario inicie sesión, por favor cierre esto cuando haya terminado…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Directorio de instalación del juego no encontrado.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Configuración de acción de juego inválida.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Resolución de problemas de sincronización de cuentas</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Resolución de problemas</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Renombrar elemento</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Añadir nuevo elemento</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Introduce nombre</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Introduce nuevo nombre</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Menos de una hora</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">De 1 a 10 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">De 10 a 100 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">De 100 a 500 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">De 500 a 1000 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite debe reiniciarse para completar la instalación. ¿Quieres reiniciar ahora?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">La extensión no está empaquetada correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">El tema no está empaquetado correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">La extensión &quot;{0}&quot; no se pudo cargar correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">No se puede cargar la extensión &quot;{0}&quot;, la versión actual de Playnite no es compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">El tema &quot;{0}&quot; no se pudo cargar correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">No se puede cargar el tema &quot;{0}&quot;, la versión actual de Playnite no es compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">La extensión no se cargó correctamente.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">El tema no se cargó correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Tema/Extensión está usando una versión de API no soportada.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">La instalación fue exitosa.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">¿Instalar complemento?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Genérica</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Error al instalar el complemento &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">No se pudo instalar la extensión.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">¿Quieres instalar una nueva extensión?\r\n\r\n{0}\r\nPor {1}\r\nVersión {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">¿Quieres actualizar la extensión &quot;{0}&quot;?\r\n\r\nVersión actual: {1}\r\nNueva versión: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">No se pudo instalar el tema.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">¿Quieres instalar un tema nuevo?\r\n\r\n{0}\r\nPor {1}\r\nVersión {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">¿Quieres actualizar el tema &quot;{0}&quot;?\r\n\r\nVersión actual: {1}\r\nNueva versión: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Está a punto de salir de Playnite y navegar a la siguiente página web utilizando su navegador web predeterminado. ¿Quieres continuar?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Las imágenes seleccionadas pueden ser demasiado grandes para un rendimiento óptimo. El uso de imágenes muy grandes puede provocar una peor capacidad de respuesta de la interfaz de usuario y un mayor uso de la memoria.\r\n\r\nResoluciones máximas recomendadas:\r\nIconos: {0} megapíxeles\r\nCarátulas: {1} megapíxeles\r\nFondos: {2} megapíxeles</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Advertencia de rendimiento</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">No mostrar de nuevo</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">El archivo con extensión {0} no es compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Extensión del archivo no válida</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">El archivo de imagen seleccionado puede ser demasiado grande para un rendimiento óptimo.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">¿Está seguro de que desea desinstalar el tema seleccionado? La desinstalación se pondrá en cola para el próximo inicio de la aplicación.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Los temas predeterminados no se pueden desinstalar.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Este tema no es compatible con esta versión de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">¿Está seguro de que desea desinstalar la extensión seleccionada? La desinstalación se pondrá en cola para el próximo inicio de la aplicación.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Las extensiones predeterminadas no se pueden desinstalar.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Esta extensión no es compatible con esta versión de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Directorio de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Directorio de datos</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Generando paquete de diagnóstico…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Subiendo paquete de diagnóstico…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Importar archivo…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">¿Qué es esto?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">¿Estás seguro de que quieres hacer esto?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Tiempo total de juego</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Tiempo promedio de juego</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Tiempo máximo de juego</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Tamaño total de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Vista general</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Mostrar en la barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Restablecer ajustes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Todas los ajustes de la aplicación se restablecerán a valores predeterminados, excluyendo:\r\n- Ubicación de la base de datos\r\n- Lista de exclusión de importación\r\n- Configuración de extensiones, incluyendo las integraciones de bibliotecas.\r\n    \r\nEl reinicio de la aplicación se requiere para finalizar el proceso. ¿Quieres restablecer los ajustes?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Para desarrolladores</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Extensiones externas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Ingrese la ruta completa de la carpeta.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Logros</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Foro</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Noticias</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Página de la tienda</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">La configuración inicial no está completa. Playnite se reiniciará en el modo de escritorio para finalizar el procedimiento.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Jugado recientemente</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Más jugado</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Todo</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Hay filtros aplicados.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Hay filtros adicionales aplicados.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Resultados de la búsqueda de:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Ya existe un elemento con el mismo nombre.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Limitar selección al filtro actual</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Eligir otro</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Complementos…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Ajustes de Extensiones</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Navegar</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Actualizaciones</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Actualizaciones ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">La gestión de extensiones y temas instalados, incluida su configuración, se ha trasladado a un nuevo menú &quot;Complementos&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Todas las extensiones de integración de bibliotecas actualmente instaladas se pueden configurar aquí.\r\n\r\nSi deseas instalar o desinstalar integraciones adicionales, use la opción &quot;Complementos&quot; desde el menú principal.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Temas de Escritorio</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Temas de Pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Buscando...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">El complemento no es compatible con esta versión de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Error al descargar el paquete de instalación del complemento.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Error al descargar el paquete de manifiesto de instalación del complemento.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Se requiere reiniciar la aplicación para aplicar cambios pendientes.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Este complemento está programado para su instalación.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Instalar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Desinstalar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Ya instalado</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">No se han encontrado nuevas actualizaciones de complementos.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Actualizar complementos</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Registro de cambios no disponible</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Programado para instalación</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Descarga fallida</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Licencia rechazada</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Descargando {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Buscando actualizaciones para complementos ...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Una o más actualizaciones de complementos están disponibles.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Seleccione los elementos para actualizar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Instancia de desarrollo de extensión</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">Acuerdo de licencia de {0}</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Aceptar</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Rechazar</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Incluir las acciones de juego de la integración de la biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Seleccione una accion</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Modo de seguimiento</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Ruta de seguimiento</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Retraso inicial de seguimiento</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Frecuencia de seguimiento</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Link</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Archivo</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Script</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Predeterminado</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Proceso</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Carpeta</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Proceso original</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Registrar mensajes trace</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">¡Los siguientes cambios sobrescriben los datos para todos los juegos seleccionados actualmente!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Ninguno</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Sólo objetos</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Inicio y final solamente</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Sensibilidad de desplazamiento</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Desplazamiento suave</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Velocidad de la animación</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">¿Remover elemento?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">¿Estás seguro de que quieres eliminar este elemento?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Mostrar botones en el panel superior:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Ajustes de vista general</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Ajustes de agrupación</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Ajustes de ordenación</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Filtros preestablecidos</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Posición de los elementos de plugin</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Ancho de separador de sección</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Mover el botón del menú principal a la barra lateral.</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Panel de exploración</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Selector de juego aleatorio</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Selector de juego aleatorio de vistas</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Seleccionar juego aleatorio de la vista</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Guarda los ajustes de agrupación y ordenación</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Mostrar como filtro rápido en modo de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">En los últimos 7 días </sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">En los últimos 31 días </sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">En los últimos 365 días </sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Hace más de 365 días</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Configurar</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Guardar preselección</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Minimizar después de iniciar juego.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Minimizar Playnite después de que se inicie un juego.\r\n\r\n¡Desactivar esto puede llevar a problemas en juegos no recibiendo información de entrada en el inicio!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Tamaño de fuente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Tamaño de fuente pequeño</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Soporte para mandos de juegos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Si se desactiva, Playnite no aceptará ninguna entrada de mando de juego.\r\n\r\nDesactiva esta opción si utilizas herramientas que traducen las entradas del mando de juego a entradas de ratón/teclado y se estan obteniendo entradas dobles en Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Mostrar elementos en el menú principal:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Botones X/A en vista principal invertidos.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Intercambia botones para comenzar un juego y mostrar la página de detalles del juego en la vista principal.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Intercambiar enlace de botón de confirmación/cancelación</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Invierte los enlaces del botón A/B para confirmación y cancelación.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Sólo control primario</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Sólo aceptar entradas del control primario cuando esté activado.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">El botón de la guía enfoca Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Volumen de interfaz</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Volumen de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Silenciar cuando se este de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Error al inicializar la interfaz de audio.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API de salida</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API utilizada para la salida de audio. Cambie si se esta experimentando problemas con el sonido.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">General</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Visuales</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Audio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Disposición</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menus </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Entrada</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} se está iniciando...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} se está ejecutando...</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Mayúsculas</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Espacio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Escalador de representación de la imagen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternativo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Equilibrado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Calidad</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Calidad:\r\nMejor calidad de imagen, lento y alto consumo de memoria.\r\n\r\nEquilibrado:\r\nBuena calidad, rápido y bajo consumo de memoria.\r\n\r\nAlternativo:\r\nMejor calidad, velocidad media y bajo consumo de memoria.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Selecciona archivo…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Selecciona carpeta...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Script de inicio</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Ten en cuenta que tanto las extensiones como los temas pueden afectar en gran medida el rendimiento, la estabilidad y la seguridad de Playnite.\r\n\r\nSi comienza a experimentar algunos problemas después de instalar un tema o una extensión, intenta deshabilitarlos/desinstalarlos primero para ver si son la raíz del problema.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Seleccionar en el inicio</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Elegir al inicio</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Perfiles incorporados</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Perfil incorporado</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Perfiles personalizados</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Perfil personalizado</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Manejado por un script incorporado</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Especificación del emulador</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Especificación de la plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Especificación de la región</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Ejecutar antes de comenzar el emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Ejecutar después de que se inicie emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Ejecutar después de salir del emulador</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Ejecutable del emulador no encontrado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">No se ha encontrado la especificación del emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Script de inicio del emulador no encontrado.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Divididir como juegos separados</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Combinar en un juego</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Establecer plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Establecer región</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Escanear Carpeta</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Escanear configuraciones</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Patrones de exclusión para el escanéo checksum</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Los archivos que coincidan con los patrones especificados no se escanearán para la suma de comprobación y se coincidirán con el nombre del archivo. Consulta la página de ayuda del emulador para obtener más información.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Escanear con emulador</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">El nombre debe configurarse al guardar la nueva configuración.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">El emulador o el perfil emulador no se ha establecido.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">El directorio para escanear no se ha especificado o no existe.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">La configuración de escaneo no está configurada correctamente.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Incluir en escaneo automático en masa</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Error al escanear la carpeta para emuladores.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Error al analizar la(s) carpeta(s) para juegos emulados.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Ocultar importados</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Perfiles a importar:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Configuraciones de escaneo automático</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Guardar como configuración de escaneo automático</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Guarda la configuración para su uso posterior durante la actualización de la biblioteca. Las configuraciones guardadas se pueden administrar a través del menú &quot;Configurar emuladores&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Importar usando rutas relativas</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Si es posible importar archivos de juego usando rutas relativas a la carpeta de instalación de Playnite o la carpeta de instalación del emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Escanear subcarpetas</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Escanear dentro de archivos</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Fusionar archivos relacionados</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Combinar archivos de juegos relacionados, como discos de juegos individuales, bajo una sola entrada.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Añadir escáner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Añadir escáner guardado</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Iniciar escaneo</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Agregar la(s) configuración(s) de escaneo con los emuladores para escanear carpetas específicas. Asegurate de que los emuladores estén configurados correctamente antes de importar juegos (a través del menú  Biblioteca -&gt; Configurar Emuladores).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Estado predeterminado asignado a juegos recién agregados</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Estado asignado a juegos jugados por primera vez</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Error al inicializar el tiempo de ejecución del script de PowerShell. Si eres usuario de Windows 7, (re)intente instalando PowerShell 5.1 para solucionar el problema.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">El filtro preestablecido con el nombre especificado ya existe. ¿Actualizar filtro con las nuevas configuraciones?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Estas palabras se eliminarán de el principio del valor de nombre automáticamente rellenado:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Utiliza esto para ignorar las palabras al principio de una cadena para propósitos de ordenación. El valor predeterminado es &quot;The&quot;, &quot;An&quot;, y &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Rellena el nombre de ordenación de los juegos sin uno</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Ordenado</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Rellenando valores de nombre de ordenamiento…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Se ha detectado que el servicio Nahimic se está ejecutando en su sistema. Se sabe que este servicio causa problemas de renderización en Playnite (y otras aplicaciones).\r\n\r\nSi encuentras alguna corrupción de gráficos u otros problemas de renderización en Playnite, se recomienda deshabilitar o desinstalar completamente el servicio Nahimic.\r\n\r\nMás información en https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite se está ejecutando con privilegios elevados (como administrador). ¡Esto no se recomienda, ya que da privilegios elevados a todas las extensiones instaladas y todos los juegos/aplicaciones iniciadas desde Playnite!\r\n\r\nMás información en https://playnite.link/adminfaq </sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Mostrar advertencia si Playnite se está ejecutando con privilegios elevados</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Obtener el tamaño real en la unidad al calcular el tamaño de los juegos</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Si está activado, los escaneos serán más lentos y obtendrán el tamaño real que los archivos usan en la unidad.\r\nSi está desactivado, los escaneos serán más rápidos y usarán el tamaño de los archivos mismos.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Los siguientes complementos se han reportado como potencialmente problemáticos, ya sea debido a un alto impacto en estabilidad/rendimiento o problemas de seguridad. Te recomendamos encarecidamente que los desinstales:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Excluir archivos en línea de escaneo</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Los archivos almacenados en el almacenamiento en la nube no serán escaneados e importados si no están disponibles localmente.\r\nSoporte únicamente para: Google Drive, Dropbox y OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Escanear pero usando el método simplificado sin el contenido de archivo</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Los archivos se importaran pero utilizando un método menos preciso que no requiere que el contenido de los archivos se descargue y este presente localmente.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Aplicar a todos</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Anular el estado de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Cuando se establece, Playnite ignorará el estado de instalación (incluyendo el directorio de instalación) establecido por el plugin de integración que importa este juego.\r\n        \r\nEsta opción puede no funcionar completamente con plugins que usan un método específico de importación de juegos, a menos que también tengan en cuenta esta opción de anulación</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Sólo manualmente</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Una vez al día</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Una vez a la semana</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">En cada inicio</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Buscar actualizaciones del programa</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Buscar actualizaciones de complementos</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Actualizar bibliotecas</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Escanear carpetas de emulación</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Incluir juegos ocultos</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Editar campos</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Seleccionar / Deseleccionar todo</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Abrir</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Activar</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Asignar</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Empieza a escribir para buscar juegos… [F1] para obtener ayuda</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">A partir de # mostrara una lista de comandos disponibles.\r\nA partir de / aparecera una lista de proveedores de búsqueda/plugins disponibles.\r\nEscribiendo la palabra clave de búsqueda y terminando con SPACE cambia inmediatamente a esa búsqueda.\r\n\r\nTAB: cambiar acción\r\nENTER: activar acción seleccionada\r\nSHIFT-ENTER: abrir menú de elementos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Incluir juegos desinstalados</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Incluir juegos ocultos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Juegos desinstalados incluidos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Juegos desinstalados excluidos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Juegos ocultos incluidos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Juegos ocultos excluidos</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Jugar o instalar</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Ir a detalles</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Menú del juego</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Editar juego</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Abrir búsqueda</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Barra de búsqueda</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Botón de búsqueda</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Acción principal del juego</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Acción secundaria del juego</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F abre la búsqueda global en lugar de enfocar la caja de búsqueda</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Guardar ajustes de filtro de juegos entre sesiones de búsqueda</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Proveedores de búsqueda</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Palabras clave por defecto</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Palabras clave personalizada</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Atajo global del sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Búsqueda de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Configuración de Extensiones</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Exclusiones</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Archivos excluidos relativos al directorio de escaneo</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Directorios excluidos relativos al directorio de escaneo</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Añadir archivo a la lista de exclusión</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Añadir directorio a la lista de exclusión</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Las exclusiones sólo pueden añadirse a las configuraciones guardadas del escáner.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Se han añadido exclusiones al escáner &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Reemplazar plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Cuando se establece el escáner asignará esta plataforma a todos los juegos, sobrescribiendo cualquier plataforma detectada automáticamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Incluye comandos en la búsqueda por defecto</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Cuando se desactiva, los comandos no se incluirán en la búsqueda por defecto hasta que se utilice # el prefijo.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Usar coincidencia difusa en el filtro de nombres</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Cuando está activado, el filtro de nombres coincidirá con los nombres del juego de la misma manera que la búsqueda global.\r\nLa coincidencia estricta se puede forzar en un caso individual al utilizar el cáracter ! de prefijo en el filtro.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Campos a mostrar para los resultados de juegos:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Estado oculto</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Copia de seguridad de datos fue cancelada.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Error en la copia de seguridad.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Error de copia de seguridad de datos</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Copia de seguridad de datos en progreso…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Restaurando datos desde la copia de seguridad…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Error al restaurar los datos de la copia de seguridad.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Configuración</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Biblioteca de juegos</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Media de la biblioteca de juegos</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Extensiones instaladas</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Datos de extensiones</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Temas instalados</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Selecciona los datos a restaurar del archivo de copia de seguridad especificado.\r\n    \r\nPlaynite se reiniciará automáticamente para iniciar el proceso de restauración de la copia de seguridad.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Selecciona los elementos a incluir en los datos  de la copia de seguridad. Los ajustes de la aplicación y los datos de la biblioteca de juegos se incluyen por defecto.\r\n    \r\nPlaynite se reiniciará automáticamente para iniciar el proceso de copia de seguridad.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Copia de seguridad automática</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Frecuencia de copia de seguridad automática</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Carpeta de las copias de seguridad</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Rotando copias de seguridad</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Incluir datos adicionales:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Es necesario establecer la carpeta de copia de seguridad si la copia automática está habilitada.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Mostrar notificaciones sólo para los lanzamientos de parches</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Si se activa, sólo se notificarán las actualizaciones disponibles para la versión principal instalada actualmente.\r\nLas nuevas versiones principales no darán como resultado una notificación de actualización.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Usar fechas relativas para la última semana</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Usar fechas relativas en formato &quot;Hoy&quot;, &quot;Ayer&quot;, etc. si la fecha es menor de una semana de edad.\r\n    \r\nEl formato de fecha especificado se utilizará para todas las demás fechas.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Búsqueda de imágenes web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Cadena de búsqueda de imágenes de icono</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Cadena de búsqueda de imagen de portada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Cadena de búsqueda de imágenes de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Obteniendo información del complemento…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">No hay fuentes de metadatos disponibles</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Ajustes de Acción de Juego</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Usar ajustes de escáner</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Seleccionar perfil a iniciar</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Seleccionar emulador al iniciar</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automático</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Siempre activado</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Siempre desactivado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Soporte de accesibilidad (lector de pantalla)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Menú de aplicación</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Menú del juego</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Carpeta del programa</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Directorio de datos de usuario</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Se ha detectado corrupción en el archivo de la biblioteca, Playnite se cerrará.\r\n    \r\nAbre un nuevo problema en la página de GitHub de Playnite con una solicitud para corregir la corrupción en tus archivos.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">¿Quieres guardar los cambios que realizados?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Instalación portátil</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">No se han detectado mandos de juego</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/et_EE.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Eesti</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite'i keel</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Välju</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filter aktiivne</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filter keelatud</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Täiendavad filtrid</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtrid</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Vigased andmed</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Salvesta muudatused?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Koduleht www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Lähtekood GitHub'is</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Loo diagn. pakk</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Saada diagn. teave</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Playnite'i teave</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Lõi Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Kategooria määramine</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Määra kategooriad</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Lisa kategooria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Märgistatud - Määra kategooria\r\nMärgistamata - Eemalda kategooria\r\nMääratlemata - Ei muuda (mitme mängu korraga muutmisel)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Kategooriata</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Platvormita</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ups! Miskit läks valesti…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Ilmnes parandamatu tõrge.\r\n\r\nKui soovid aidata meil seda probleemi lahendada, kirjelda lühidalt enne kokkujooksmist tehtud toiminguid ja seejärel saada diagnostikateave. Kui oled internetiga ühendatud, siis laaditakse pakett analüüsimiseks Playnite'i serverisse.\r\n\r\nVõid ka klõpsata nupul &quot;Teavita krahhist&quot;, et teenuses GitHub luua uus probleemiteade ja teavitada krahhist käsitsi.\r\n\r\nTäname abi eest.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Laiendus &quot;{0}&quot; põhjustas parandamatu tõrke.\r\n\r\nSoovitame salvestada logifaili ja teavitada sellest probleemist laienduse arendajat. Probleemi järjepideval ilmnemisel keela laiendus.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Laiendus &quot;{0}&quot; põhjustas parandamatu tõrke.\r\n\r\nSoovitame sellest probleemist teavitada laienduse arendajat. Probleemi järjepideval ilmnemisel keela laiendus.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Tundmatu laiendus või teema põhjustas parandamatu tõrke.\r\n\r\nSoovitame keelata 3. osapoole lisad, isoleerida problemaatilise ja teavitada sellest veast lisa arendajat.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Ilmnes parandamatu tõrge.\r\n\r\nKui soovid aidata meil seda probleemi lahendada, saada meile diagnostikateave. Aitäh.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Keela laiendus</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Salvesta logifail</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Saada diagn. teave</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Teavita krahhist</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Taaskäivita Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Taaskäivita turvarežiimis</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Keelates kõik 3. osapoole laiendused ja kasutades vaikimisi teemat.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Sulge Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Enne krahhi tehtud toimingud (inglise keeles):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Teegihaldur</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Eemalda mäng(ud)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Ei saa eemaldada - Mäng või installija on töötab. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Ei saa desinstallida - Mäng töötab.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Kas oled kindel, et tahad eemaldada mängu {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Kindel, et soovite eemaldada {0} mängu?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Kas oled kindel, et soovid eemaldada mängu {0}?\r\n\r\nKui valid valiku &quot;lisa välistamiste loendisse&quot;, ei impordita mängu uuesti järgmisel teegi värskendamisel.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Kas oled kindel, et soovid eemaldada {0} mängu?\r\n\r\nKui valid valiku &quot;lisa välistamiste loendisse&quot;, ei impordita mänge uuesti järgmisel teegi värskendamisel.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Kas oled kindel, et tahad eemaldada {0} kirjet, mida hetkel ei kasutata?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Kasutamata väljasid ei leitud.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Jah (lisa välistamiste loendisse)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Siin jaotises on muudatusi, mida pole salvestatud.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Mänguteegi formaadi uuendamine</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Andmebaasi värskendamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Ei saa mängude teeki värskendada. Nõutud on {0} MB vaba ruumi.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">MänguViga</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Ei saa mängu käivitada. Andmebaasist ei leitud: '{0}'.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Ei saa käivitada mängu: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Ei saa tegevust käivitada: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Ei saa avada mängu asukohta: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Ei saanud tuvastada mängu installi suurust: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Viga installi suuruse skannimisel</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Installi suuruse arvutamisel esines {0} viga</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Ei saanud otseteed luua: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Ei saanud avada juhendit: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Ei saa installida mängu: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Ei saa desinstallida mängu: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Sobivaid mängu käivitustegevusi ei leitud. Emulaatori tegevuste kasutamisel veendu, et platvormi määratlused vastaksid mängu ja emulaatori seadistusele.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Installimine pole veel programmis lubatud.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Selle mängu eest vastutav teegi plugin on keelatud või installimata.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Ametlikud metaandmed ei ole allalaadimiseks saadaval.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Mäng pole valitud.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Mängu skripti teostamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Rakenduse skripti teostamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Globaalse skripti teostamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Emulaatori skripti teostamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Mängu tegevuse skripti käivitamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 või uuem ei ole paigaldatud.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Ei suutnud kindlaks määrata, kuidas mängu käivitada.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Lubatud</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Keelatud</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Eemalda</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Eemalda kasutamata</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Nimeta ümber</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopeeri</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Lisa</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Vaikimisi ikoon</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Vaikimisi kaanepilt</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Vaikimisi taustapilt</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Lõpeta</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Järgmine</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Tagasi</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">VALMIS</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">TAGASI</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">TÜHJENDA</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Tühjenda</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Hülga</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Hülga kõik</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Impordi</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nimi</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Moodul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Seeriad</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versioon</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Viimati mängitud</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Enim mängitud</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Mängukordade arv</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Installi suurus</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Kaust</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Märkmed</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Lisatud</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Lisamiskuupäev</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Muudetud</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Muutmiskuupäev</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Veebileht</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Rada</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Salvesta</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Sulge</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Tühista</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Kinnita</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Lähtesta</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Jah</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Ei</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Tere tulemast</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Kohalik kasutaja</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Üldine</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Meedia</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Viited</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Paigaldamine</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Tegevused</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Allalaadimine…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Meedia allalaadimine…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Laadimine…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Liik</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profiil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profiilid</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Eemalda</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Laadi alla</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Otsi</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Resolutsioon:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Mis tahes</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Suumi</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Nimekirja vaade</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Kaanepildid</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Ruudustiku vaade</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Üksikasjalik vaade</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Kohandatud</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Erilised tänud</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Litsents</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Panustajad</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Playnite'i sulgemine…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Täna</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Eile</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Esmaspäev</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Teisipäev</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Kolmapäev</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Neljapäev</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Reede</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Laupäev</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Pühapäev</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Eelmine nädal</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Eelmine kuu</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Eelmine aasta</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Rohkem kui aasta tagasi</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 kuni 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB kuni 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB kuni 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB kuni 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB kuni 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB kuni 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB kuni 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB või rohkem</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Importimine on edukalt lõpetatud.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Kõik mängud</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Mängu id</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Andmebaasi id</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Eelseadistused</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Veerg</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Veerud</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Rida</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Read</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Ei suutnud hankida ikooni Mängimise tegevusest. Tüübiga Fail tegevust pole olemas.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Laadi alla ainult puuduvad metaandmed</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Selle suvandi lubamisel jäetakse metaandmete allalaadimine vahele nende andmeväljade puhul, kus juba on andmeid.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Mängude valimine</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Palun vali, milliste mängude metaandmeid värskendada:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Kõik mängud andmebaasist</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Kõik hetkel filtreeritud mängud</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Ainult valitud mängud</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Ühtegi metaandmete välja pole valitud</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Allalaadimiseks pole valitud ühtegi metaandmete välja. Valige vähemalt üks ja aktiveerige selle jaoks vähemalt üks metaandmete pakkuja.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Ametlik pood</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Palun vali, millised väljad peaks Playnite automaatselt andmetega täitma ja millistest allikatest andmeid hankima.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Palun kaalu ülaloleval logol klõpsamist ja teenuse igdb.com andmebaasi täiendamist, et täiustada Playnite'i kasutatavaid andmeid.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Metaandmete allalaadimine…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Paigaldatud mängude importimine…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">{0}'i mängude importimine…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Emuleeritud mängude importimine kohast {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Teegi värskenduste allalaadimine…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Teegis olevate mängude suuruse skannimine…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Imporditud mängude suuruse skannimine…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Teegi värskendamine valmis</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Ressursside vabastamine…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Konfiguratioon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Seaded…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platvormid ja Emulaatorid</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Seadista emulaatoreid…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Teegihaldur…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Tööriistad</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Laadi alla metaandmed…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Tarkvara vahendid…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Seadista integratsioone…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Ava 3. osapoole klient</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">3. osapoole kliendid</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Värskenda mänguteeki</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Tühista teegi värskendamine</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Värskenda emuleeritud kaustasid</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Lisa mäng</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Käsitsi…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Skanni automaatselt…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emuleeritud mäng…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store'i rakendus…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Playnite'i teave</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Saada tagasiside</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Lülitu täisekraani režiimi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Viited</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Abi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Toeta Patreonis</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Toeta platvormil Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Kasutusjuhend</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK dokumentatsioon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Taaskäivita süsteem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Lülita süsteem välja</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Peata süsteem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Pane süsteem talveunne</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Lukustussüsteem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Logi kasutaja välja</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Vali juhuslik mäng</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Üksikasjade paneelil kuvatavad mängu väljad:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Üksuste vahe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Ilusta ruudustiku üksuste taust</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Ruudustiku piirjoonte paksus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Puuduva mänguikooni allikas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Puuduva mängu kaanepildi allikas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Puuduva mängu taustpildi allikas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Mängu üksikasjade vertikaalne vahe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Ruudustiku vaates üksikasjade asukoht</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Mängude loendi asukoht üksikasjade vaates</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Joonesta paneelide vahele eraldaja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Mängude kaanepildi kõrgus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Mängude loendi ikooni kõrgus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Rakenduse font</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Ühelaiuste märkidega font</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Filtrite paneeli asukoht</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Exploreri paneeli asukoht</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Kaanepildi renderdamine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Siht-kuvasuhe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Järgnevad suvandid mõjutavad ka paanide kuvamist Täisekraani režiimis!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Venitusrežiim</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD karp</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Ruut</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steami bänner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam vertikaalne kaanepilt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Rakendamiseks vajab taaskäivitamist</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Seaded</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Üldine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Ülemine paneel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Välimus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Mängu üksikasjad</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Paigutus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Täpsem</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Täisekraan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Sisend</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Jõudlus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metaandmed</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Värskendamine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Otsing</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Varundamine</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Varunda teegi andmed</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Taasta andmete varukoopia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Impordi teegi muudatused automaatselt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Vigane andmebaasifaili asukoht, sisestama peab õige failiraja.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Konto nimi ei saa olla tühi.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Pärast mängude importimist laadi alla metaandmed</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Käivita Playnite minimeerituna</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Arvuti käivitamisel käivita Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Käivita süsteemisalve minimeerituna</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Playnite'i registreerimine arvuti käivitumisel käivituma ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Käivita täisekraanirežiimis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asünkrooniline piltide laadimine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Võib parandada mänguloendite kerimise sujuvust, vastutasuks aeglasema piltide laadimisaja eest.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Näita kaanepildi puudumisel mängu nime</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Ruudustiku vaates näita mängude nimesid</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Tumenda paigaldamata mängud</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Näita üksikasjalikus vaates mängude ikoone</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Näita rühmade kirjeldustes üksuste arvu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Näita paneelidel Filtrid ja Explorer ainult määratud välju</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Keela riistvara graafikakiirendi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Kasuta katkendliku kuva või sarnaste kasutajaliidese probleemide korral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Näita kiirkäivitusloendites peidetud mänge</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Mõjutab Tööülesannete ja süsteemisalve menüüloendeid.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Kiirkäivitusüksuste arv</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Kasuta akna taustana mängu taustapilti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Hägusta tausta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Kõrge kvaliteet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Tumenda tausta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Näita ruudustiku vaates</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Teema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Teema profiil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Täisekraani teema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Täisekraani teema profiil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Andmebaasi asukoht</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Sisselogimise olek:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite'i seaded</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Tühjenda veebi vahemälu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Võib lahendada kontode linkimisel ilmnenud probleeme.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Kuva süsteemisalves ikoon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimeeri Playnite süsteemisalve</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimeeri Playnite süsteemisalve, kui rakenduse aken on suletud</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Kui mäng käivitub:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Pärast mängu sulgemist:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Mängimisaegu kuvades näita mängitud päevade arvu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Kuupäevade formaadid:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">See logib sind välja kõikidest lingitud teenustest. Vajalik on rakenduse taaskäivitamine, kas tahad jätkata?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Tühjenda vahemälu?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Uue teema rakendamiseks on vajalik Playnite'i taaskäivitamine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Hangi rohkem teemasid</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Loo uus teema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Hangi rohkem laiendusi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Loo uus laiendus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Aidake meil tõlkida Playnite'i</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Uute seadete rakendamiseks tuleb Playnite taaskäivitada. Taaskäivitada kohe?\r\n\r\nTaaskäivitamine tühistab kõik käimasolevad aktiivsed toimingud (allalaadimised).</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Taaskäivita Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite ei saa teegi faile automaatselt teisaldada. Sa pead enne asukoha muutmist failid käsitsi teisaldama/kopeerima. Kui sihtkohas pole mingit teeki, luuakse uus.\r\n\r\nUut andmebaasi asukohta hakatakse kasutama pärast Playnite'i taaskäivitamist. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Mänguaega ei salvestata, kui on valitud &quot;Sulge&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Ridade arv</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Veergude arv</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Kuvatavaid ridu üksikasjade vaates</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Näita peaekraanil taustapilti</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Ei rakendu tagasiulatuvalt olemasolevatele mängudele ilma metaandmete uuesti allalaadimiseta.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Impordi teegis olevate mängude mänguaeg:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Seadistab, millal peaks Playnite importima Playnite'i andmebaasis olevate mängude teegi pluginate poolt teatatud mänguaja. Selle funktsiooni kasutamiseks peavad mängude haldamise eest vastutavad teegi pluginad seda toetama.\r\n\r\nAlati: Impordib äsja imporditud ja Playnite'i andmebaasis olemasolevate mängude mänguaja.\r\nAinult äsja imporditud mängudel: Impordib ainult äsja imporditud mängude mänguaja.\r\nMitte kunagi: Ei impordi mänguaega mitte mingil juhul.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Alati</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Ainult äsja imporditud mängudel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Mitte kunagi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Luba juhtpuldi tugi Töölaua režiimis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Nupp Guide avab Täisekraani režiimi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Automaatse metaandmete allalaadimise sätted värskelt imporditud mängudele.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Sihtkuvar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Alati kasuta esmast kuvarit</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Näita mängude pealkirju</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Kuva aku olek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Näita aku laetuse protsenti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Näita kella</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Peida hiirekursor</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">'Ainult Installitud' kiirfiltrites</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Juhtpuldi nuppude stiil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Paigutus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Horisontaalne kerimine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Vali üks alajaotis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Sätteid pole saadaval</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Sätete laadimine ebaõnnestus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Need skriptid teostatakse igal teegis oleval mängul. Igale mängule eraldi saab skripte määrata mängu üksikasju muutes.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animeeri taustapiltide üleminekud</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Kirja suurused</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automaatne</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Sakiline</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Hallskaala</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideaalne</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Ekraan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Teksti vormindamisrežiim</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Teksti renderdusrežiim</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Mängude kirjeldustes ei kasutata praegu teksti renderdamise ja vormindamise meetodeid.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Eellaadi taustapildid</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Kui lubatud, laadib Playnite taustapildi alla metaandmete allalaadimise ajal, kasutades rohkem kettaruumi ja tehes kujutised võrguühenduseta kättesaadavaks.\r\n\r\nKui see on keelatud, laaditakse taustapildid alla ainult esmavajadusel, kasutades vähem ruumi, kuid kujutiste kuvamisel võib tekkida viivitus ja mõned pildid ei pruugi olla võrguühenduseta saadaval.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Pärast mängust väljumist sulge automaatselt kolmanda osapoole klient</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Kliendi sulgemise viivitus (sekundites)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Ära sulge pärast mänguseansse, mis on lühemad kui (sekundites)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Automaatselt sulge järgnevad kliendid:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Autom. klientide sulgemine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Impordi välistamiste loend</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Hoiata liiga suure mängumeedia määramisel</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Ava kaust käsk</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Eelistatud vanusepiirangu organisatsioon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Värskenda mängude installi suurust teegi värskendamisel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Skannib ja värskendab mängude installi suurust, kui tuvastatakse, et nende faile on pärast viimast skannimist muudetud</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Puudub</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Täida</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Säilita kuvasuhe</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Täida ja säilita kuvasuhe</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Vasakul</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Paremal</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Üleval</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">All</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Viga importimisel</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Autentimine vajalik</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Autentimine ebaõnnestus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Alternatiivne veebivaate kuvamisrežiim</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Kasuta, kui on probleeme veebivaadetega, näiteks integratsioonide autentimise dialoogiakendes.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Suurte mängukirjelduste osaline laadimine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Mahukad kirjeldused võivad mängude valimisel tekitada märgatavat viivitust.\r\n\r\nKui lubatud, laaditakse esmalt ainult osa kirjelduse tekstist, ülejäänud saab laadida soovi korral.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Metaandmete importimine</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Laadi alla metaandmed</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Määra valitud seadistus, et seda kasutataks kõigi tulevaste metaandmete allalaadimiste jaoks.\r\nSeda saab muuta ka rakenduse sätetes.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Emulatsioonide importimise abiline</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">See abiline juhendab sind läbi konsooli emulaatorite allalaadimise ja importimise ning emuleeritud mängude importimise protsessi.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Pea meeles, et rohkem emulaatoreid ja/või mänge saab hiljem lisada peamenüü kaudu (emulaatori sätete jaoks menüü &quot;Teek&quot; ja emuleeritud mängude jaoks &quot;Lisa mänge&quot;).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Allpool on loend emulaatoritest, mida Playnite suudab tuvastada ja automaatselt seadistada. Emulaatorite installijaid saab alla laadida nende veebisaitidelt. Kui oled emulaatorid (käsitsi) installinud, saad need importida emulaatori seadistamise dialoogiaknas.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Mis tahes emulaatori, mis arvutis installitud, importimiseks klõpsa nupul 'Automaatselt tuvasta kaustast…'. Playnite otsib valitud kaustast tuntud emulaatoreid ja pakub võimalust neid importida. Emulaatorite importimiseks erinevatest kaustadest kasuta seda nuppu mitu korda. Emulaatorid lisatakse praeguse loendi lõppu. </sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Sa saad mänge importida nupul 'Skanni kausta Emulaatorit kasutades' klõpsates. Sobiva emulaatori valimine ütleb Playnite'ile, milliseid failitüüpe tuleks skannida ja importida. Kui tahad mänge importida mitmest erinevast kaustast, võid seda nuppu kasutada mitu korda. Mängud lisatakse praeguse loendi lõppu.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Importimiseks pole emulaatorit valitud. Enne emulaatorite seadistamist ei saa emuleeritud mänge automaatselt importida. Kas oled kindel, et tahad jätkata ja importimise protsessist väljuda?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Playnite'is pole emulaatoreid seadistatud. Mänge ei saa importida, kui pole esmalt emulaatorit seadistanud ja sobivaid failitüüpe valinud. Kas tahad kohe emulaatoreid lisada?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Skanni kausta Emulaatorit kasutades</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Vali failid</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Automaatselt tuvasta kaustast…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Seadista emulaatoreid…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Skannimine…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Skannitakse: {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Esmakordne seadistamine</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">See protsess juhendab väliste mänguteekide automaatsel importimisel ja konfigureerimisel. Playnite suudab mänge automaatselt importida mitmest mänguteenusest, näiteks Steam või GOG.\r\n\r\nPea meeles, et hiljem saab peamenüüst mis tahes kohandatud või emuleeritud mängu mis tahes platvormi jaoks käsitsi lisada.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Teegi integratsioon</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Järgnevalt on loetletud mõned Playnite'i teotatud teegi integratsioonid. Valige need, mida soovite paigaldada.\r\n\r\nRohkem integratsioone saab hiljem paigaldada menüüst &quot;Lisad&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Seadistamine on lõpetatud</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Esmane seadistamine on lõpetatud. Pidage meeles, et kõiki sätteid saab hiljem muuta, samuti peamenüüst lisada täiendavaid integratsioone.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Vähemalt ühe laienduse allalaadimine ebaõnnestus.\r\n\r\nIntegratsioone saab lisade menüü kaudu alla laadida ka pärast abilise töö lõppu.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">{0} integratsiooni allalaadimine…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Soovitatud integratsioonide loendi allalaadimine…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Soovitatud integratsioonide loendi allalaadimine ebaõnnestus. Integratsioone saab hiljem alla laadida menüü Lisad kaudu.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Platvormide ja emulaatorite seadistamine</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Emulaatorite seadistamine</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platvormid</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platvorm</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulaatorid</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulaator</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Lisa platvorm</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Vali ikoon</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Vali kaanepilt</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Pildi valimine</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Vali üksus</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Vali taustapilt</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Vali fail</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Vali URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Lisa emulaator</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Toetatud platvorm(id)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Kas tahad platvormi muudatused salvestada?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Kas tahad emulaatori muudatused salvestada?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Täitmisprogramm</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumendid</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Töökaust</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Toetatud failitüübid</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Impordi emulaatoreid…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Laadi emulaatorid alla…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Laadi argumentide eelseadistus tuntud emulaatori profiilist</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Kas oled kindel, et tahad eemaldada emulaatori {0}?\r\nSeda kasutab hetkel {1} mäng(u).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Kas oled kindel, et tahad eemaldada platvormi {0}?\r\nSeda kasutab hetkel {1} mäng(u) ja {2} emulaator(it).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Sätete abi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sorteeri</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Sortimise suund</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Rühmita</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Kasvav</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Kahanev</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Ära rühmita</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Rühmita teegi järgi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Rühmita kategooria järgi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Rühmita platvormi järgi</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Vaate liik</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Vaade</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Exploreri paneel</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Filtreerimise paneel</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ikoon</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Teegi ikoon</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Kaanepilt</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Taustapilt</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Sortimisnimi</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Teek</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manuaal</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nimi</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Installi ketas</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Konto nimi</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platvorm</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategooria</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Žanr</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Väljalaske kuupäev</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Väljalaske aasta</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Arendaja</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Silt</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Väljaandja</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Installimise olek</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Sobitu kõikide filtritega</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Kui lubatud, kaasatakse vaates ainult mängud, mis kasutavad kõikide filtrite kõiki üksuseid.\r\nKui keelatud, kaasatakse vaates mängud, mis kasutavad mistahes filtri mistahes üksust.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Paigaldatud</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Paigaldatud</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Paigaldamata</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Peidetud</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Lemmik</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Luba HDR tugi</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Kui lubatud, lubatakse HDR põhiekraanil enne mängu käivitamist.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Pane tähele, et sinu põhiekraan ei toeta HDR-i.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Viimati mängitud</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategooria</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Kirjeldus</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Paigalduse asukoht</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Kaanepilt</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Viited</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Tõmmise, ROM-i või ISO rada</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Žanr</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Žanrid</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Ettevõte</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Ettevõtted</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Arendaja</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Arendajad</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Väljaandja</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Väljaandjad</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategooria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategooriad</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Silt</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Sildid</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Funktsioon</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Funktsioonid</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Vanusepiirang</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Vanusepiirangud</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Piirkond</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Piirkonnad</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Allikas</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Allikad</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Viimatised tegevused</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Andmebaasi tõrge</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Teegi andmebaasi avamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Andmebaas pole avatud.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Ei pääse teegi andmebaasile ligi. Faili &quot;{0}&quot; kasutab mõni muu protsess või asub ligipääsetamatus kohas.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Diagnostikapaki loomine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Diagnostikapaki automaatne üleslaadimine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Diagnostiline teave edukalt saadetud.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Diagnostikapakk on edukalt loodud ja saadetud.\r\nPalun lisa oma probleemi raportile järgnev ID:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Ei saanud importida mänge kohast {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Ei saanud importida emuleeritud mänge kohast {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Valitud emulaatori profiili järgi ei saa mänge otsida. Profiil ei sisalda faililaiendeid või platvorme.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite ei saanud käivituda. Palun sulge kõik muud programmi eksemplarid ja proovi uuesti.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Ei saanud rakendada teemat &quot;{0}&quot;, värviprofiil &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Ei saaviidet avada, URL on sobimatus vormingus.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Ei saanud rakendust käivitada.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Veebivaate komponendi käivitamine ebaõnnestus. Playnite ei saa käivitumise protsessiga edasi minna.\r\n\r\nRohkem teavet lehel https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Ei saa emulaatoreid importida puuduva või vigase definitsioonifaili tõttu.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Menüü tegevuse käivitamine ebaõnnestus.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Mängu üksikasjade muutmine</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Pildi URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Lisa viide</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Lisa ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Salvesta muudatused</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Rakenda väljade muudatused hetkel muudetava(te)le mängu(de)le.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Lisa tegevus</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Eemalda</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Eemalda mängimise tegevus</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Lisa mänge</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Skanni kausta…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Tuvasta installitud</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Sirvi…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Ava Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Profiili seaded</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Mängu nimi ei või olla tühi.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Mängutegevuste jälgimise kaust ei tohi olla tühi.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Mängu nimi ei tohi enne metaandmete otsimist olla tühi.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Vigased mängu andmed</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Sisesta kehtiv veebi URL, mille alguses kas http:// või https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Vali URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Metaandmete allalaadimine ebaõnnestus: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Allalaadimise viga</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Tühjenda filtrid</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Privaatne konto</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Avalik konto</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API võti</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Käivitamise viga</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Teema tõrge</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Tühjenda kõik</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Paigaldamine</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Desinstallimine</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Käivitamine</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Käivitamine</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Kehtetu URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Ära tee midagi</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimeeri</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Taasta aken</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Taasta aken ainult siis, kui käivitati kasutajaliidese kaudu</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Sulge</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Muuda</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Täpsem</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Mitte kunagi</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Lõpetamisolek</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Lõpetamisolekud</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Kasutaja skoor</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Kriitika skoor</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Kogukonna skoor</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Mängu skriptid</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Rakenduse skriptid</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Skriptid</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Pluginad</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Metaandmete allikad</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Laiendused</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Laienduse ID</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Taaslaadi skriptid</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Interaktiivne SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Kõik skriptid on uuesti laaditud.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Mängud ei vastanud määratud otsingu-/filtrikriteeriumitele</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Ühtegi üksust ei leitud</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Lülitu töölaua režiimile</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Sulge Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Teegid</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Värskenda kõiki</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Autor:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versioon:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Uuendatud:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Moodul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Teek</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistika</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Kõik</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Puudub</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Teavitused</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Laius</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Kõrgus</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Suurus</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Väike</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Tavaline</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Suur</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Suurem</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Suurim</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Vaikimisi</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Vali</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Vali kõik</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Tühista kõik valikud</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Esimene</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Juhuslik</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Kasutaja valik</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Laadi rohkem</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Läbipaistev</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Ahenda</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Laienda</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Ahenda kõik</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Laienda kõik</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Muu</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Teemad</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Emulaatori argumendid</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Integreeritud argumendid</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Kohandatud argumendid</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Emulaatori lisaargumendid</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Kirjuta üle emulaatori argumendid</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Mängimise tegevus</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Metaandmete importimiseks valimine</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Mängude importimiseks valimine</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Metaandmete otsing</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Värskendus on saadaval</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Muudatused alates eelmisest värskendusest</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Laadi alla ja paigalda värskendus</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Otsi värskendusi</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Viga värskendamisel</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Uue versiooni olemasolu kontroll ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Uut versiooni ei leitud, sul on ajakohane versioon.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Värskenduse allalaadimine ja installimine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Mõni taustatöö on praegu pooleli. Kas tahad selle katkestada ja värskendamisega edasi minna?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Mõni taustatöö on praegu pooleli. Kas tahad selle katkestada ja Playnite'i sulgeda?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Mõni taustatöö on praegu pooleli. Režiimide lülitamisel see töö katkestatakse, kas tahad ikkagi režiimi lülitada?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Playnite'ile on saadaval värskendus</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Laadi teemade loend uuesti</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Rakenda valitud teema</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Jälgi failide muudatusi</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Lähtefaili muutumisel rakenda teema automaatselt</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Skripti käivitumise aeg</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Teosta enne mängu käivitamist</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Teosta pärast mängu sulgemist</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Teosta pärast mängu käivitamist</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Teosta rakenduse käivitumisel</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Teosta rakenduse sulgumisel</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Mängu käivitumisaegne skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Mängu käivitumisjärgne skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Mängu lõpetamisaegne skript</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Teosta globaalne skript</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Globaalne</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtreeritud</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Käesolev</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Uus</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Katseta skripti</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Näita ainult valitud üksuseid.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Salvesta vaikimisi</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Lisa lemmikutesse</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Eemalda lemmikutest</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Peida see mäng</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Eemalda peidust</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Luba HDR tugi</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Keela HDR tugi</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Muuda…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Arvuta installi suurus</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Arvuta installi suurus (kõik mängud)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Arvuta installi suurus (ainult puuduvad andmed)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Installi suurus</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Määra kategooria…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Määra lõpetamisolek</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Eemalda</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Mängi</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Paigalda</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Mängu suvandid</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Üksikasjad</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Desinstalli</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Ava paigalduse asukoht</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Loo töölaua otsetee</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Ava manuaal</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Rohkem</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Haldab teegi plugin</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Mängu käivitamise protsessi haldab selle mängu eest vastutav teegi plugin.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Määratud lehelt ei leitud mängu '{0}' kohta asjakohast teavet.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Vihje: Veel edasijõudnuma metaandmete allalaadimise protsessi saab kasutada, redigeerides üksikut mängu menüü &quot;Muuda&quot; kaudu.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Pole saadaval, kui mõni tegevus on käimas.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Kirjelduse tekst on HTML süntaksi tundlik</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Mänguaega loetakse sekundites.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Installi suurus on näidatud baitides.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Väljalaske kuupäev tuleb määrata 'aasta-kuu-päev' formaadis. Kuu ja päeva väärtused saab välja jätta.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Skoori väärtus vahemikus 0 kuni 100 või tühi.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Playnite'i arendamist on toetanud järgnevad patroonid ja Ko-fi liikmed:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Koodi, lokaliseerimise ja muud kaasautorid mitte kindlas järjestuses:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Kas tühistada mängu jälgimine?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Installimise jälgimine on praegu käimas. Kas soovid protsessi tühistada ja mängu tagasi eelmisele olekule viia?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Mängu käivitamise jälgimine on praegu käimas. Kas soovid protsessi tühistada ja mängu tagasi eelmisele olekule viia?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Mängitud aeg</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Viimati mängitud</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}p {1}t {2}min</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}t {1}min</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minutit</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} sekundit</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Pole mängitud</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Töölaua režiimi avamine…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Täisekraani režiimi avamine…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Mänguteegi laadimine…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Installi suuruse arvutamine…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Mängu {0} installi suuruse arvutamine…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Skriptifaili installimine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Skript on edukalt paigaldatud.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Installi skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Skripti viga</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Laienduse funktsiooni teostamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Ava metaandmete kaust</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Arvuta</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Automaatselt arvutab installi suuruse, kasutades kas ROM-i, kui mängul see on, või installikausta, kui see on määratud</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">Klient {0} pole installitud.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Klient {0} nüüd avaneb. Palun logi sisse ja seejärel sulge see teade.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Kasutaja sisselogimise ootel; palun sulge see teade, kui oled valmis…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Mängu installimiskausta ei leitud.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Vigane mängutegevuse seadistus.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Konto sünkroonimise probleemide tõrkeotsing</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Probleemide tõrkeotsing</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Muuda nime</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Lisa uus üksus</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Sisestage nimetus</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Sisestage uus nimetus</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Vähem kui tund</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 kuni 10 tundi</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 kuni 100 tundi</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 kuni 500 tundi</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 kuni 1000 tundi</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Installimise lõpuleviimiseks tuleb Playnite taaskäivitada. Kas tahad kohe taaskäivitada?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Laiendus pole õigesti pakitud.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Teema pole õigesti pakitud.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Laienduse &quot;{0}&quot; laadimine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Ei saa laadida laiendust &quot;{0}&quot;, see ei toeta praegust Playnite'i versiooni.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Teema &quot;{0}&quot; laadimine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Ei saa laadida teemat &quot;{0}&quot;, see ei toeta praegust Playnite'i versiooni.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Laienduse laadimine ebaõnnestus.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Teema laadimine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Teema/Laiendus kasutab mittetoetatud API versiooni.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Paigaldamine oli edukas.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Paigalda laiendus?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Üldine</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Lisa &quot;{0}&quot; paigaldamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Laiendust ei saanud paigaldada.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Kas tahad paigaldada uue laienduse?\r\n\r\n{0}\r\nAutor {1}\r\nVersioon {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Kas tahad värskendada laienduse &quot;{0}&quot;?\r\n\r\nPraegune versioon: {1}\r\nUus versioon: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Teemat ei saanud paigaldada.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Kas tahad paigaldada uue teema?\r\n\r\n{0}\r\nAutor {1}\r\nVersioon {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Kas tahad värskendada teema &quot;{0}&quot;?\r\n\r\nPraegune versioon: {1}\r\nUus versioon: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Sa oled Playnite'ist lahkumas ja avamas järgnevat veebiaadressi oma vaikimisi veebibrauseris. Kas tahad jätkata?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Valitud pilt/pildid võivad optimaalse jõudluse jaoks olla liiga suured. Väga suurte piltide kasutamine võib halvendada kasutajaliidese reageerimist ja suurendada mälukasutust. \r\n\r\nSuurimad soovitatavad resolutsioonid:\r\nIkoonid: {0} megapikslit\r\nKaanepildid: {1} megapikslit\r\nTaustapildid: {2} megapikslit</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Jõudluse hoiatus</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Ära enam näita</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Fail laiendiga {0} ei ühildu.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Ühildumatu faililaiend</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Valitud pilt võib optimaalse jõudluse jaoks olla liiga suur.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Kas oled kindel, et soovid valitud teema desinstallida? Desinstallimine teostatakse rakenduse järgmisel käivitumisel.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Integreeritud teemasid ei saa desinstallida.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">See teema ei toeta seda Playnite'i versiooni.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Kas oled kindel, et soovid valitud laienduse desinstallida? Desinstallimine teostatakse rakenduse järgmisel käivitumisel.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Integreeritud laiendusi ei saa desinstallida.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">See laiendus ei toeta seda Playnite'i versiooni.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Paigalduse asukoht</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Andmete kaust</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Diagnostikapaki loomine…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Diagnostikapaki üleslaadimine…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Impordi fail…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Mis see on?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Kindel, et soovid seda teha?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Mänguaeg kokku</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Keskmine mänguaeg</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Kõrgeim mänguaeg</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Installi kogusuurus</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Ülevaade</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Külgriba</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Näita külgribal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Lähtesta seaded</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Lähtestatakse kõik rakenduse sätted, välja arvatud:\r\n- Andmebaasi asukoht\r\n- Importimiste välistamiste loend\r\n- Laienduste sätte, k.a teekide integratsioonid\r\n    \r\nProtsessi lõpetamiseks on vajalik rakenduse taaskäivitamine. Kas tahad sätete vaikimisi sätted taastada?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Arendajale</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Välised laiendused</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Sisesta täielik kausta rada.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Saavutused</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Foorum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Uudised</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Poeleht</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Esmane seadistamine on lõpetamata. Playnite taaskäivitub Töölaua režiimis, et toiming lõpuni viia.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Viimati mängitud</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Lemmikud</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Enim mängitud</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Kõik</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Rakendatud on filtreid.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Rakendatud on lisafiltreid.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Kuvatakse otsingutulemusi:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Sellise nimega üksus on juba olemas.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Piira valik praegusele filtrile</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Vali teine</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Lisad…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Paigaldatud</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Laienduste seaded</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Sirvi</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Värskendused</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Värskendused ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Paigaldatud laienduste ja teemade, k.a nende sätete, haldamine on liigutatud uude menüüsse &quot;Lisad&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Siin saab seadistada kõiki praegu installitud teegi integratsioonide laiendusi.\r\n\r\nKui tahad integratsioone installida või desinstallida, kasuta menüüd &quot;Lisad&quot; peamenüüs.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Töölaua teemad</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Täisekraani teemad</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Otsimine…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Lisa ei ühildu Playnite'i selle versiooniga.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Lisa installimispaki allalaadimine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Lisa installimismanifesti allalaadimine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Ootel muudatuste rakendamiseks on vaja rakendus taaskäivitada.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">See lisa on installimise järjekorras.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Paigalda</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Desinstalli</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Juba installitud</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Lisade värskendusi ei leitud.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Värskenda lisasid</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Muudatuste logi pole saadaval</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Installimiseks plaanitud</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Allalaadimine ebaõnnestus</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Litsentsist keelduti</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Allalaadimine {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Lisade värskenduste otsimine…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Vähemalt ühele lisale on saadaval värskendus.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Vali, mis värskendada</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Laienduse arendusversioon</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} litsentsileping</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Nõustu</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Keeldu</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Kaasa teegi integratsioonide mängutegevused</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Tegevuse valimine</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Jälgimise viis</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Jälgitav rada</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Algse jälgimise viivitus</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Jälgimise sagedus</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Link</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Fail</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulaator</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Skript</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Vaikimisi</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Protsess</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Kaust</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Esialgne protsess</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Logi jälgede teated</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Järgnevad muudatused kirjutavad üle kõigi hetkel valitud mängude andmed!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Puudub</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Ühtne</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Ainult üksuste vahel</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Ainult alguses ja lõpus</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Kerimise tundlikkus</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Sujuv kerimine</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Animatsiooni kiirus</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Kas eemaldada üksus?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Kas oled kindel, et tahad selle üksuse eemaldada?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Näita ülemisel paneelil nuppe:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Üldised vaate sätted</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Rühmitamise sätted</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Sortimise sätted</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Filtri eelseadistused</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Plugina üksuste asukoht</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Jaotiste eraldaja laius</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Liiguta peamenüü nupp külgribale</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Exploreri paneel</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Suvalise mängu valija</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Vaatest suvalise mängu valija</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Vali vaatest suvaline mäng</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Salvesta rühmitamise ja sortimise sätted</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Näita kiirfiltrina täisekraani režiimil</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Viimase 7 päeva jooksul</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Viimase 31 päeva jooksul</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Viimase 365 päeva jooksul</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Rohkem kui 365 päeva tagasi</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Seadista</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Salvesta eelseadistus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Pärast mängu käivitamist minimeeri aken</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Pärast mängu käivitamist minimeeri Playnite.\r\n\r\nSelle keelamine võib kaasa tuua olukorra, kus mängud ei saa käivitumisel sisendeid kasutada!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Fondi suurus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Fondi suurus väike</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Juhtpuldi tugi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Kui keelatud, ei võta Playnite vastu mitte mingisuguseid juhtpuldi sisendeid.\r\n        \r\nKeela, kui kasutad vahendeid, mis tõlgivad juhtpuldi sisendeid hiire/klaviatuuri sisenditeks ja sa koged Playnite'is topelt sisendeid.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Näita peamenüüs:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Pööratud X/A nupu seostamine peamises vaates</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Vahetab mängu käivitamise ja mängu üksikasjade näitamise nuppude seostamised peamises vaates.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Vahetab kinnitamise/tühistamise nuppude seostamise</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Pöörab A/B nuppude seostamise kinnitamiseks ja tühistamiseks.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Ainult esmane juhtpult</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Kui lubatud, lubatakse ainult esmase juhtpuldi sisendid.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Nupp Guide toob Playnite'i esile</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Liidese helitugevus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Tausta helitugevus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Vaigista, kui taustal</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Heliliidese käivitamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Heliväljundi API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">Heliväljundi jaoks kasutatav API. Kui esineb probleeme heliga, muuda sätet.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Üldine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Väljanägemine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Heli</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Paigutus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menüüd</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Sisend</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} on käivitumas…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} töötab…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Caps</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Tühik</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Piltide renderdamise skaleerija</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternatiivne</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Tasakaalustatud</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Kvaliteet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Kvaliteet:\r\nParim pildikvaliteet, aeglane, kõrge mälukasutus.\r\n    \r\nTasakaalustatud:\r\nHea kvaliteet, kiire, madal mälukasutus.\r\n    \r\nAlternatiivne:\r\nParem kvaliteet, keskmine kiirus, madal mälukasutus.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Vali fail…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Vali kaust…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Käivitusaegne skript</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Pane tähele, et nii laiendused kui ka teemad võivad Playnite'i jõudlust, stabiilsust ja turvalisust oluliselt mõjutada.\r\n    \r\nKui pärast teema või laienduse installimist ilmnevad probleemid, proovi need esmalt keelata/desinstallida, et näha, kas need on probleemi põhjustajaks.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Vali käivitumisel</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Vali käivitumisel</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Integreeritud profiilid</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Integreeritud profiil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Kohandatud profiilid</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Kohandatud profiil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Käsitletud sisseehitatud skripti poolt</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Emulaatori määratlus</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Platvormi määratlus</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Regiooni määratlus</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Teosta enne emulaatori käivitamist</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Teosta pärast emulaatori käivitamist</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Teosta pärast emulaatori sulgemist</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Emulaatori täitmisprogrammi ei leitud.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Emulaatori määratlust ei leitud.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Emulaatori käivitusaegset skripti ei leitud.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Eralda eri mängudeks</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Ühenda üheks mänguks</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Määra platvorm</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Määra regioon</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Skanni kausta</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Skannimise seadistused</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Kontrollsumma skannimise välistamise mustrid</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Määratud mustri(te)le vastavate failide kontrollsummat ei kontrollita ja need vastendatakse failinimega. Lisateabe saamiseks vaata emulaatori abilehte.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Skanni emulaatoriga</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Uue seadistuse salvestamiseks on vaja määrata nimi.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Emulaator või emulaatori profiil on määramata.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Skannitav kaust on määratlemata või seda pole olemas.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Skannimine pole õigesti seadistatud.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Kaasa automaatses hulgiskannimises</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Ei saanud kaustast emulaatoreid skannida.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Ei saanud kausta(de)st emuleeritud mänge skannida.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Peida imporditud</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Profiilid, mis importida:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Automaat-skannimise seadistused</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Salvesta automaat-skannimise seadistusena</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Salvesta seadistus hilisemaks kasutamiseks teegi värskendamisel. Salvestatud seadistusi saab hallata menüü &quot;Seadista amulaatoreid&quot; kaudu.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Impordi suhtelisi radasid kasutades</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Võimalusel impordi mängufailid, kasutades Playnite'i installimiskausta või emulaatori installimiskausta suhtes suhtelisi radasid.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Skanni alamkaustu</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Skanni arhiividest</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Ühenda seotud failid</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Ühenda seotud mängufailid, näiteks eraldi mänguplaadid, ühte mängukirjesse.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Lisa skannija</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Lisa salvestatud skannija</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Käivita skannimine</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Kindlate kaustade skannimiseks lisa emulaatoritega skannimise seadistus(ed). Enne mängude importimist veendu, et emulaatorid oleks õigesti seadistatud (menüüs Teek -&gt; Seadista emulaatoreid).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Äsja lisatud mängudele määratud vaikeolek</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Esmakordselt mängitud mängudele määratud olek</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Ei saanud käivitada PowerShelli skripti. Kui kasutad Windows 7-t, proovi probleemi parandamiseks PowerShell 5.1 (uuesti) installida.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Sellise nimega filtri eelseadistus on juba olemas. Kas uuendada eelseadistus uute sätetega?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Need sõnad eemaldatakse automaatselt täidetud Sortimisnime algusest:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Kasuta seda, et sortimise eesmärkidel eirata sõnede alguses teatud sõnu. Vaikimisi valikuteks on &quot;The&quot;, &quot;An&quot; ja &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Täida Sortimisnimi ilma selleta mängudel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Sortimine</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Sortimisnime väärtuste täitmine…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Sinu süsteemis on tuvastatud teenus Nahimic. On teada, et see teenus põhjustab Playnite'ile (ja muudele rakendustele) renderdamisprobleeme.\r\n\r\nKui avastad Playnite'is vigase graafika või muid renderdusprobleeme, soovitame Nahimici teenuse keelata või täielikult desinstallida.\r\n\r\nLisateavet aadressil https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite töötab kõrgendatud õigustega (administraatorina). See pole soovitatav, kuna see annab kõrgendatud õigused kõigile paigaldatud laiendustele ja Playnite'i kaudu käivitatud mängudele/rakendustele!\r\n\r\nRohkem teavet lehel https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Näita hoiatust, kui Playnite töötab administraatori õigustega</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Mängude suuruse arvutamisel hangi tegelik suurus kettal</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Kui lubatud, on skannimised aeglasemad ja hangitakse tegelik suurus, mida failid kettal enda alla võtavad.\r\nKui keelatud, on skannimised kiiremad ja kasutatakse failide endi suurust.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Järgnev(ad) lisa(d) on raporteeritud kui võimalikud probleemsed, kas stabiilsuse/jõudluse probleemide või turvalisuse tõttu. Soovitame tungivalt need desinstallida:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Ära skanni võrgus olevaid faile</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Pilves salvestatud faile ei skannita ega impordita, kui need pole kohalikult saadaval.\r\nToetatud ainult teenustes: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Skanni, aga kasutades lihtsustatud meetodit ilma faili sisuta</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Failid imporditakse, aga kasutatakse vähem täpset meetodit, mis ei nõua faili sisu allalaadimist ega kohalikku olemasolu.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Rakenda kõigile</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Alista installituse olek</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Kui märgistatud, eirab Playnite mängu importiva integratsiooni plugina poolt määratud installituse olekut (sh. installikaust).\r\n        \r\nSee suvand ei pruugi täielikult töötada pluginatega, mis kasutavad kindlat mängude importimise meetodit, välja arvatud juhul kui need võtavad arvesse seda alistamise suvandit.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Ainult käsitsi</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Kord päevas</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Kord nädalas</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Igal käivitumisel</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Kontrolli programmi värskendusi</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Kontrolli lisade värskendusi</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Värskenda teeke</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Skanni emulatsiooni kaustasid</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Kaasa peidetud mängud</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Muuda väljasid</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Vali kõik / tühista valik</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Ava</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Aktiveeri</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Määra</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Mängude otsimiseks alusta trükkimist… [F1] abi saamiseks</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Alustades märgiga #, kuvatakse saadaolevate käskude loend.\r\nAlustades märgiga /, kuvatakse saadaolevate otsingupakkujate/pluginate loend.\r\nOtsingu märksõna sisestamine ja TÜHIKuga lõpetamine lülitub kohe sellele otsingule.\r\n\r\nTAB: lülitustoiming\r\nENTER: aktiveerib valitud toimingu\r\nSHIFT-ENTER: avab üksuse menüü</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Kaasa paigaldamata mängud</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Kaasa peidetud mängud</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Paigaldamata mängud kaasatud</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Paigaldamata mängud välistatud</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Peidetud mängud kaasatud</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Peidetud mängud välistatud</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Mängi või Installi</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Mine üksikasjade juurde</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Mängu menüü</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Muuda mängu üksikasju</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Ava otsing</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Otsingu kast</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Otsingu nupp</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Esmane mängu tegevus</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Teisene mängu tegevus</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F avab otsingukasti fookustamise asemel otsingukasti</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Salvesta mängufiltri sätted otsinguseansside vahel</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Otsinguteenuse pakkujad</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Vaikimisi märksõna</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Kohandatud märksõna</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Süsteemiülene otseklahv</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite'i otsing</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Laienduste sätted</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Välistamised</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Välistatud failid, skannimiskaustaga suhtelised</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Välistatud kaustad, skannimiskaustaga suhtelised</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Lisa fail välistamiste loendisse</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Lisa kaust välistamiste loendisse</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Välistamisi saab lisada ainult salvestatud skannijate seadistustele.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Välistamised on lisatud skannijale &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Kirjuta platvorm üle</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Kui märgistatud, määrab skannija selle platvormi kõigile mängudele, kirjutades üle automaatselt tuvastatud platvormid.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Kaasa vaikimisi otsingusse käsud</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Kui keelatud, ei kaasata vaikimisi otsingusse käske ilma eesliidet # kasutamata.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Nimefiltris kasuta hägusat vastendamist</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Kui märgistatud, vastendatakse nime filter mängude nimedega, sarnaselt globaalse otsinguga.\r\nRange vastendamise kasutamist saab sundida, lisades filtri ette ! tähemärgi.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Mängude tulemuste jaoks näidatavad väljad:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Peidetuse olek</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Andmete varundamine katkestati.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Andmete varundamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Viga andmete varundamisel</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Andmete varundamine käib…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Andmete taastamine varukoopiast…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Andmete varukoopiast taastamine ebaõnnestus.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Sätted</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Mängude teek</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Mängude teegi meedia</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Paigaldatud laiendused</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Laienduste andmed</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Paigaldatud teemad</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Vali, millised andmed taastada määratletud varukoopiast.\r\n    \r\nPlaynite taaskäivitub automaatselt, et varukoopia taastamisega alustada.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Vali, millised andmed varundamisse kaasata. Rakenduse sätted ja mängude teegi andmed kaasatakse vaikimisi.\r\n    \r\nPlaynite taaskäivitub automaatselt, et varundamisega alustada.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Automaatne andmete varundamine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Automaatsete varundamiste sagedus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Varunduste kaust</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Aktiivseid varundamisi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Kaasa lisaandmed:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Kui automaatne varundamine on lubatud, tuleb määrata varundamiste kaust.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Näita teavitusi ainult väiksemate värskenduspaikade korral</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Kui see on lubatud, näidatakse värskendusteadet ainult praegu installitud põhiväljaande jaoks saadaolevate värskenduste korral.\r\nUued suuremad väljalasked ei too esile värskendusteatist.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Eelmise nädala jaoks kasuta suhtelisi kuupäevi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Kui kuupäev on vähem kui nädal vana, kasuta suhtelisi kuupäevi formaadis &quot;Täna&quot;, &quot;Eile&quot; jne.\r\n    \r\nKõigi teiste kuupäevade puhul kasutatakse määratud kuupäeva formaati.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Piltide otsing veebist</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Ikoonipildi otsingu sõne</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Kaanepildi otsingu sõne</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Taustpildi otsingu sõne</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Lisa teabe hankimine…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Ühtki metaandmete allikat pole saadaval</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Mängimise tegevuse sätted</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Kasuta skannija sätteid</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Vali profiil käivitumisel</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Vali emulaator käivitumisel</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automaatne</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Alati lubatud</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Alati keelatud</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Ligipääsetavuse (ekraanilugeja) tugi</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Rakenduse menüü</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Mängu menüü</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Programmi kaust</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Kasutaja andmete kaust</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Tuvastati rikutud teegifailid, Playnite nüüd sulgub.\r\n    \r\nAva Playnite'i GitHubi lehel uus vearaport taotlusega parandada oma rikutud failid.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Kas tahad tehtud muudatused salvestada?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Portatiivne paigaldus</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Juhtpulte ei tuvastatud</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/fa_IR.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">فارسی</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">زبان برنامه</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">خروج</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">فیلتر فعال</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">فیلتر غیر فعال</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">فیلتر های اضافی</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">فیلترها</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">فیلتر</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">داده نامعتبر</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">ذخیره تغییرات؟</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">صفحه اصلی در www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">کد منبع در گیت‌هاب</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">ساخت بسته diag.</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">ارسال اطلاعات diag.</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">درباره Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">ساخته شده توسط Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">تعیین دسته</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">تنظیم دسته‌بندی‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">افزودن دسته‌بندی</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">بررسی شده - اختصاص دادن دسته‌بندی\r\nانتخاب نشده - زدایش دسته‌بندی\r\nنامعین - بدون تغییر (هنگام ویرایش چندین بازی)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">بدون دسته‌بندی</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">بدون سکو</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">اوه! مشکلی پیش آمد...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">یک خطای غیرقابل بازگشت رخ داده است.\r\n\r\nاگر مایلید به ما در رفع این مشکل کمک کنید، لطفاً اقدامات انجام شده قبل از خرابی را به طور خلاصه توضیح دهید و سپس اطلاعات تشخیصی را ارسال کنید. اگر آنلاین هستید، بسته برای تجزیه و تحلیل به سرور برنامه ارسال می‌شود.\r\n\r\nدر غیر این صورت، می‌توانید روی دکمه &quot;گزارش خرابی&quot; کلیک کنید تا یک مشکل جدید در گیت‌هاب ایجاد کرده و خرابی را به صورت دستی گزارش دهید.\r\n\r\nاز همکاری شما متشکریم.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">افزونه &quot;{0}&quot; باعث ایجاد یک خطای غیرقابل بازگشت شد.\r\n\r\nتوصیه می‌کنیم فایل گزارش را ذخیره کرده و مشکل را به توسعه‌دهنده افزونه گزارش دهید. اگر مشکل همچنان تکرار می‌شود، افزونه را غیرفعال کنید.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">افزونه‌ی &quot;{0}&quot; باعث خطایی بازیابی‌ناپذیر شد.\r\n\r\nما سفارش می‌کنیم مشکل را به سازنده‌ی افزونه گزارش دهید. اگر مشکل همچنان رخ می‌دهد، افزونه را ازکاربیاندازید.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">افزونه یا زمینه‌ی ناشناخته باعث خطایی بازیابی‌ناپذیر شد.\r\n\r\nما سفارش می‌کنیم افزونه‌ی شخص ثالث را ازکارانداخته، مشکل‌ساز را جدا کرده و مشکل را به سازنده‌ی افزونه گزارش دهید.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">خطایی بازیابی‌ناپذیر رخ داد.\r\n\r\nاگر میخواهید در رفع این مشکل کمک کنید، لطفاً اطلاعات تشخیصی را بفرستید. سپاسگزاریم.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">ازکارانداختن افزونه</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">ذخیره پرونده‌ی گزارش‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">فرستادن اطلاعات .diag</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">گزارش خرابی</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">بازراه‌اندازی Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">بازراه‌اندازی در حالت امن</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">ازکارانداختن همه‌ی افزونه‌های شخص ثالث و بکاربردن زمینه‌ی پیش‌فرض.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">خروج از Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">اقدامات انجام شده قبل از اشکال (به انگلیسی):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">مدیر کتابخانه</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">زدایش بازی(ها)؟</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">نمی‌توان زدود - بازی یا نصب‌کننده در حال اجرا است. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">نمی‌توان زدود - بازی در حال اجرا است.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">آیا مطمئن هستید که می‌خواهید {0} را بزدایید؟</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">آیا مطمئن‌ هستید که می‌خواهید {0} بازی را بزدایید؟</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">آیا مطمئن هستید که می‌خواهید {0} را بزدایید؟\r\n\r\nگزینش گزینه‌ی &quot;افزودن به فهرست استثناء&quot; از درون‌برد شدن دوباره‌ی بازی پس از به‌روز شدن کتابخانه پیشگیری خواهد کرد.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">آیا مطمئن هستید که می‌خواهید {0} بازی را بزدایید؟\r\n\r\nگزینش گزینه‌ی &quot;افزودن به فهرست استثناء&quot; از درون‌برد شدن دوباره‌ی بازی‌ها پس از به‌روز شدن کتابخانه پیشگیری خواهد کرد.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">مطمئن هستید که می‌خواهید {0} ورودی را که هم‌اکنون بکارنمی‌روند بزدایید؟</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">فیلد استفاده نشده یافت نشد.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">آره (افزودن به فهرست استثناء)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">در این بخش تغییرات ذخیره نشده وجود دارد</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">به‌روزرسانی چارچوب کتابخانه‌ی بازی...</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">ناکامی در به‌روزرسانی پایگاه داده.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">نمی‌توان کتابخانه‌ی بازی را به‌روز کرد. {0} مگابایت فضای آزاد نیاز است.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">خطا بازی</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">نمی‌توان بازی را آغاز کرد. '{0}' در پایگاه داده یافت نشد.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">نمی‌توان بازی را آغاز کرد: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">نمی‌توان کنش را آغاز کرد: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">نمی‌توان مکان بازی را گشود: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">ناتوانی در شناسایی اندازه‌ی نصب بازی: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">خطای اسکن اندازه‌ی نصب</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">هنگام اسکن اندازه‌ی نصب، {0}  چند خطا وجود داشت</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">ناکامی در ساخت میانبر: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">دستی باز نشد: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">نمی‌توان بازی را نصب کرد: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">نمی‌توان بازی را زدود: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">هیچ کنش راه‌اندازی بازی معتبری یافت نشد. هنگام بکاربری کنش‌های شبیه‌ساز، مطمئن شوید که تعاریف سکو میان بازی و پیکربندی شبیه‌ساز مطابقت دارند.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">پیاده‌سازی نصب در دسترس نیست.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">افزونه‌ی کتابخانه مسئول این بازی ازکارافتاده است یا نصب نشده است.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">بارگیری رسمی فراداده در دسترس نیست.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">هیچ بازی‌ای برگزیده نشده است.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">ناکامی در اجرای اسکریپت بازی.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">ناکامی در اجرای اسکریپت برنامه.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">ناکامی در اجرای اسکریپت سراسری.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">ناکامی در اجرای اسکریپت شبیه‌ساز.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">ناکامی در اجرای کنش اسکریپت بازی.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 یا تازه‌تر نصب نشده است.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">ناتوانی در مشخص کردن شیوه‌ی آغاز بازی.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">بکارافتاده</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">ازکارافتاده</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">زدایش</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">زدایش بکارنبرده‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">بازنامگذاری</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">روگرفت</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">افزودن</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">آیکن پیش‌فرض</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">تصویر کاور پیش‌فرض</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">پس‌زمینه پیش‌فرض</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">پایان</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">بعدی</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">قبلی</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">انجامید</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">بازگشت</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">پاک کردن</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">پاک کردن</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">رد کردن</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">رد کردن همه</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">درون‌برد</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">نام</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">سازنده</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">ماژول</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">سری</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">نسخه</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">آخرین بازی شده</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">بیشترین بازی شده</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">شمار نشست بازی</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">اندازه‌ی نصب</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">پوشه</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">یادداشت‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">افزوده شد</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">تاریخ افزوده شدن</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">دگرگون شده</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">تاریخ دگرگونی</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">تارنما</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">مسیر</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">باشه</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">ذخیره</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">بستن</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">لغو</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">تأیید</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">بازنشانی</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">آره</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">نه</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">خوش آمدید</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">کاربر بومی</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">عمومی</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">رسانه</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">پیوند‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">نصب</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">کنش‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">بارگيری...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">بارگیری رسانه…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">بارکردن…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">گونه</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">نمایه</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">نمایه‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">زدایش</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">بارگیری</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">جستجو</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">وضوح:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">هر</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">بزرگنمايی</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">نمای فهرست</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">کاورها</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">نمای توری</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">نمای جزییات</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">سفارشی</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">سپاس ویژه</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">پروانه</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">مشارکت‌کنندگان</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">خروج از Playnite...</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">امروز</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">دیروز</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">دوشنبه</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">سه‌شنبه</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">چهارشنبه</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">پنجشنبه</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">جمعه</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">شنبه</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">یکشنبه</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">هفته‌‌ی گذشته</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">ماه گذشته</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">سال گذشته</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">بیش از یک سال پیش</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">۰ تا ۱۰۰ مگابایت</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">۱۰۰ مگابایت تا ۱ گیگابایت</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">۱ تا ۵ گیگابایت</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">۵ تا ۱۰ گیگابایت</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">۱۰ تا ۲۰ گیگابایت</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">۲۰ تا ۴۰ گیگابایت</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">۴۰ تا ۱۰۰ گیگابایت</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">۱۰۰ گیگابایت یا بیشتر</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">درون‌برد با موفقیت انجام شد.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">همه‌ی بازی‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">شناسه‌ی بازی</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">شناسه‌ی پایگاه داده</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">پیش‌نشانده‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">ستون</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">ستون‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">ردیف</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">ردیف‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">نماد از کنش بازی دریافت نشد. کنشی از گونه‌ی پرونده وجود ندارد.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">تنها بارگیری فراداده‌های گمشده</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">بکاراندازی این گزینه از بارگیری فراداده برای بخش‌های داده که هم‌اکنون حاوی اطلاعات هستند گذر خواهد کرد.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">گزینش بازی‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">لطفاً انتخاب کنید کدام بازی را باید با ابرداده جدید به روز کنید:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">همه بازی ها از پایگاه داده</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">همه بازی های فیلتر شده فعلی</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">فقط بازی های انتخاب شده</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">هیچ میدان فراداده‌ای برگزیده نشده است.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">هیچ میدان فراداده‌ای برای بارگیری برگزیده نشده است. خواهشمندیم دست‌کم یکی را برگزینید و دست‌کم یک فراهم‌آورندهٔ‌ فراداده برایش فعال کنید.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">فروشگاه رسمی</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">لطفا برگزینید کدام بخش‌ها باید خودکار به دست playnite پر شوند و کدام بنمایه‌ها باید برای گردآوری داده بکارروند.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">لطفاً روی لوگو فوق کلیک کنید و به منظور بروزرسانی در استفاده از Playnite، به پایگاه داده igdb.com کمک کنید.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">در حال بارگیری ابرداده...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">درون‌بردن بازی‌های نصب شده…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">درون‌بردن {0} بازی…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">درون‌بردن بازی‌های شبیه‌سازی شده از {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">بارگرفتن به‌روزرسانی‌های کتابخانه...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">اسکن اندازه‌ی بازی‌ها در کتابخانه…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">اسکن اندازه‌ی بازی‌های درون‌برده…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">بروزرسانی کتابخانه شد.</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">رهش منابع...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">پیکربندی</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">تنظیمات…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">سکوها و شبیه‌سازها</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">پیکربندی شبیه‌سازها…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">مدیر کتابخانه…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">ابزارها</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">بارگیری فراداده…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">ابزارهای نرم‌افزار…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">پیکربندی یکپارچگی‌ها…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">گشودن کلاینت شخص ثالث</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">کلاینت‌های شخص ثالث</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">به‌روزرسانی کتابخانه بازی</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">لغو به‌روزرسانی کتابخانه</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">به‌روزرسانی پوشه‌های شبیه‌سازی‌شده</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">افزودن بازی</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">دستی…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">اسکن خودکار…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">بازی شبیه‌سازی‌شده…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">برنامه فروشگاه مایکروسافت…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">درباره‌ی Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">فرستادن بازخورد</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">تعویض به حالت تمام‌صفحه</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">پیوند‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">کمک</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">پشتیبانی در Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">پشتیبانی در Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">راهنمای کاربر</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">مستندات SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">بازراه‌اندازی رایانه</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">خاموش کردن رایانه</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">تعلیق رایانه</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">فرستادن رایانه به خواب زمستانی</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">قفل کردن رایانه</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">خروج کاربر</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">گزینش یک بازی تصادفی</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">بخش‌های بازی برای نمایش در پهنه‌ی جزئیات:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">فاصله آیتم</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">کشیدن پس‌زمینه‌ی آیتم توری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">پهنای مرز آیتم توری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">منبع نماد بازی گمشده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">منبع کاور بازی گمشده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">منبع پس‌زمینه بازی گمشده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">فاصله‌ی عمودی تا جزئیات بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">جایگاه جزئیات نمای توری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">جایگاه نمای جزئیات فهرست بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">کشیدن میان پهنه‌های جداگر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">بلندای کاور بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">بلندای نماد فهرست بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">فونت برنامه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">فونت هم‌پهنا</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">جایگاه پهنه‌ی پالایه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">جایگاه پهنه‌ی کاوشگر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">نماپردازش کاور هنری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">نسبت نما‌ی هدف</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">گزینه‌های زیر به نماپردازش کاشی‌ها در حالت تمام‌صفحه نیز تاثیر می‌گذارند!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">حالت کشش</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">جعبه‌ی DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">فروشگاه Epic Games</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy ۲٫۰</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">مربع</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">بنر Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">کاور عمودی Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">توییچ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* برای بکاربستن نیازمند بازراه‌اندازی است</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">تنظیمات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">عمومی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">پهنه‌ی بالایی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">ظاهر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">جزییات بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">چیدمان</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">پیشرفته</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">تمام‌صفحه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">درونداد</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">کارایی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">فراداده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">به‌روزرسانیدن</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">جستجو</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">پشتیبان</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">پشتیبان‌گیری از داده‌های کتابخانه</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">بازیابی نسخهٔ پشتیبان داده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">درون‌برد خودکار تغییرات در کتابخانه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">مکان پرونده‌ی پایگاه داده نامعتبر است، مسیر پرونده‌ی درستی باید نشانده شود.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">نام حساب نمی‌تواند خالی باشد.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">پس از درون‌بردن بازی‌ها، فراداده را بارگیرید</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">آغاز Playnite در حالت کمینه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">هنگام راه‌اندازی رایانه Playnite آغاز شود</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">راه‌اندازی درون سینی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">ناکامی در ثبت Playnite برای آغاز هنگام راه‌اندازی رایانه.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">آغاز در حالت تمام‌صفحه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">بارکردن ناهمگام تصویر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">به ازای کندتر شدن زمان بارکنش تصویر، می‌تواند نرمی پیمایش فهرست‌های بازی را بهتر کند.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">اگر کاور هنری گمشده است نام بازی را نمایش بده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">نمایش نام بازی‌ها در نمای توری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">تاریک کردن بازی‌های نصب نشده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">نمایش نمادهای بازی در فهرست نمای جزئیات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">نمایش شمار آیتم‌ها در توضیحات گروه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\"> تنها نمایش بخش‌های واگذاشته در پالایه و پهنه‌های کاوشگر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">ازکارانداختن شتاب سخت‌افزاری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">بکاربردن هنگام تجربه‌ی تپغ یا مشکل‌های همانند آن در میانای کاربری </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">نمایش بازی‌های پنهان در فهرست آغاز تند</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">روی فهرست پرش و فهرست‌های گزینگان سینی تاثیر می‌گذارد.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">شمار آیتم‌های آغاز تند</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">بکاربردن تصویر پس‌زمینه‌ی بازی بعنوان پس‌زمینه‌ی پنجره</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">تاری پس‌زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">کیفیت بالا</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">تاریکی پس‌زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">نمایش در نمای توری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">نمایه‌ی زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">زمینه‌ی تمام‌صفحه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">نمایه‌ی زمینه‌ی تمام‌صفحه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">مکان پایگاه داده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">وضیعت ورود:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">تنظیمات Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">پاک کردن حافظه پنهان وب</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">شاید مشکلات مربوط به هنگام پیوند حساب‌ها را حل کند.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">نمایش نماد سینی رایانه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">کمینه کردن Playnite در سینی رایانه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">کمینه کردن Playnite در سینی رایانه هنگام بسته شدن پنجره‌ی برنامه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">هنگام راه‌اندازی بازی:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">پس از بسته شدن بازی:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">قالب بستن زمان بازی برای نمایش شمار روزهای بازی شده </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">چارچوب‌های تاریخ:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">خروج از حساب شما را از همه‌ی خدمات پیوسته خارج می کند. برنامه به بازراه‌اندازی نیاز دارد، آیا می‌خواهید ادامه دهید؟</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">حافظه پنهان پاک شود؟</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Playnite برای بکاربستن زمینه‌ی نو به بازراه‌اندازی نیاز دارد</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">دریافت زمینه‌های بیشتر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">ساخت زمینه‌ی نو</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">گرفتن افزونه‌های بیشتر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">ساخت افزونه‌ی نو</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">در ترجمه‌ی Playnite به ما کمک کنید</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite برای بکاربستن تنظیمات نو نیاز به بازراه‌اندازی دارد. اکنون بازراه‌اندازی شود؟\r\n\r\nبازراه‌اندازی هرگونه کنش فعال (بارگیری‌ها) در حال انجام را لغو خواهد کرد.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">بازراه‌اندازی Playnite؟</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite نمی تواند پرونده‌های کتابخانه‌ی شما را خودکار جابه‌جا کند. شما باید پیش از دگرگون کردن مکان پرونده‌ها، آنها را دستی روگرفت یا جابه‌جا کنید. اگر در مکان هدف کتابخانه‌ای نباشد، یک کتابخانه‌ی نو ساخته خواهد شد.\r\n\r\nتا زمانی که Playnite بازراه‌اندازی نشود مکان پایگاه داده‌ی نو بکار نخواهد رفت.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">اگر کنش &quot;بستن&quot; نشانده باشد زمان بازی ضبط نخواهد شد.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">شمار ردیف‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">شمار ستون‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">شمار ردیف‌های نمای جزئیات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">نمایش تصویر پس‌زمینه در صفحه‌ی اصلی</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">بدون بازبارگیری فراداده، پس‌نگرانه برای بازی‌های موجود بکاربسته نمی‌شود.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">درون‌برد زمان بازیِ بازی‌ها در کتابخانه:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">برنامه مشخص می‌کند چه زمانی باید زمان بازی گزارش شده توسط افزونه‌های کتابخانه برای بازی‌ها در پایگاه داده برنامه را وارد کند. برای استفاده از این ویژگی، پشتیبانی توسط افزونه‌های کتابخانه‌ای که مسئولیت مدیریت بازی‌ها را بر عهده دارند، نیاز است.\r\n\r\nهمیشه: زمان بازی را برای بازی‌های جدید وارد شده و موجود در پایگاه داده برنامه وارد می‌کند.\r\nفقط برای بازی‌های تازه وارد شده: فقط زمان بازی برای بازی‌های جدید وارد شده وارد می‌شود.\r\nهرگز: هرگز زمان بازی را وارد نمی‌کند.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">همیشه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">تنها برای بازی‌های تازه درون‌برد شده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">هرگز</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">بکاراندازی پشتیبانی دسته‌ی بازی در حالت دسکتاپ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">دکمه‌ی راهنما حالت تمام‌صفحه را می‌گشاید</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">تنظیمات بارگیری خودکار فراداده برای بازی‌های تازه درون‌برد شده.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">نمایشگر هدف</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">همیشه نمایشگر اصلی را بکارببر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">نمایش عنوان‌های بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">نمایش وضعیت باتری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">نمایش درصد باتری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">نمایش ساعت</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">پنهان کردن نشانگر موشی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">نصب شده تنها در پالایه‌های تند</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">پیامواره‌های دکمه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">چیدمان</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">پیمایش افقی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">یکی از زیرمجموعه‌ها را برگزینید</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">تنظیماتی در دسترس نیست</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">ناکامی در بارکردن تنظیمات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">این اسکریپت‌ها برای هر بازی در کتابخانه اجرا می شوند. هنگام ویرایش جزئیات بازی می‌توان جداگانه برای هر بازی اسکریپتی منحصر به فرد واگذاشت.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">پویانماییدن تَرایِش تصویر پس‌زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">اندازه‌ی فونت</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">خودکار</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">دندانه‌ای شده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">درجه‌ی خاکستری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">آرمانی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">نمایشگر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">حالت قالب‌بندی فونت</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">حالت نماپردازش نوشتار</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">روش‌های نماپردازش و قالب‌بندی نوشتار هم‌اکنون برای توضیحات بازی بکار نمی‌روند.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">پیش‌بارکردن تصویرهای پس‌زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">در صورت فعال بودن، Playnite هنگام بارگیری متاداده، آثار هنری پس‌زمینه را نیز بارگیری می‌کند. این کار فضای دیسک بیشتری را مصرف می‌کند، اما آثار هنری در زمان عدم اتصال به اینترنت در دسترس خواهند بود.\r\n\r\nدر صورت غیرفعال بودن، آثار هنری پس‌زمینه تنها زمانی که اولین بار مورد نیاز هستند بارگیری می‌شوند. این کار فضای کمتری را مصرف می‌کند، اما ممکن است باعث تأخیر در نمایش آثار هنری شود و برخی از تصاویر در حالت عدم اتصال به اینترنت در دسترس نباشند.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">پس از خروج از بازی، کلاینت شخص ثالث خودکار بسته شود</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">دیرکرد خاموش کردن کلاینت (به ثانیه)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">پس از نشست‌های بازی کوتاه‌تر از این، نبند (به ثانیه)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">خودکار کلاینت‌های زیر را ببند:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">خودکار بستن کلاینت‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">فهرست استثنای درون‌برد</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">نمایش هشدار هنگام واگذاری رسانه‌ی بازی بیش از اندازه بزرگ</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">فرمان گشودن پوشه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">سازمان رده‌بندی سنی ترجیحی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">اندازه‌ی نصب بازی‌ها را هنگام به‌روزرسانی کتابخانه به روز برسانید</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">اگر یافت شود که پس از آخرین پویش پرونده‌هایشان دگرگون شده است، اندازه‌ی نصب بازی‌ها را پوییده و به‌روز می‌رساند.</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">هیچ</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">پر کردن</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">یکنواخت</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">یکنواخت برای پر کردن</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">چپ</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">راست</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">بالا</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">پایین</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">خطا در درون‌برد</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">نیاز به تایید هویت دارد</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">ناکامی در تایید هویت</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">حالت نماپردازش نمای وب دگرگزین</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">هنگام بروز مشکل در نمای وب بکار ببرید، برای نمونه: دیالوگ‌های یکپارچگی تایید هویت.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">بارکردن پاره‌ای از توضیحات بزرگ بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">توضیحات بزرگ می‌تواند باعث تاخیر چشمگیری هنگام گزینش بازی شود.\r\n\r\nهنگامی که بکارافتاده باشد، تنها پاره‌ای از نوشتار توضیحات در آغاز بار خواهد شد با گزینه‌ای برای بارکردن بقیه هنگام درخواست.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">درون‌برد فراداده</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">بارگیری فراداده</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">پیکربندی برگزیده را برای بکاربردن در همه‌ی بارگیری‌های فراداده در آینده بنشانید.\r\nهمچنین می‌تواند در تنظیمات برنامه دگرگون شود.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">جادوگر درون‌برد شبیه‌ساز</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">این جادوگر شما را در فرآیند بارگیری و درون‌بردن شبیه سازهای کنسول و درون‌بردن بازی‌های شبیه‌سازی شده راهنمایی می‌کند.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">بدانید که همیشه می‌توانید شبیه‌سازهای بیشتر و/یا بازی‌ها را زمانی دیگر با فهرست اصلی (زیر فهرست &quot;کتابخانه&quot; برای تنظیمات شبیه‌ساز و فهرست &quot;افزودن بازی‌ها&quot; برای بازی‌های شبیه‌سازی شده) بیفزایید.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">در زیر فهرستی از شبیه‌سازهایی که Playnite می‌تواند خودکار بشناسد و پیکربندی کند می‌باشد. شما می‌توانید نصب‌کننده‌ی شبیه‌سازها را از تارنمای آنها بارگیری کنید. پس از نصب شبیه‌سازها (به شیوه‌ی دستی)، می‌توانید آنها را روی دیالوگ پیکربندی شبیه‌ساز درون‌برد کنید.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">شما می‌توانید هر شبیه‌سازی را که روی رایانه‌تان نصب شده است را با کلیک کردن بر دکمه‌ی 'شناسایی خودکار از پوشه…' درون‌برد کنید. Playnite پوشه‌ی برگزیده را برای هر شبیه‌ساز شناخته شده جستجو کرده و گزینه‌ای برای درون‌برد آنها فراهم خواهد کرد. شما می‌توانید این دکمه را چندین بار برای درون‌برد شبیه‌سازها از پوشه‌های متفاوت بکار ببرید. شبیه‌سازها به پایین فهرست کنونی افزوده خواهند شد.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">شما می‌توانید بازی‌ها را با کلیک کردن بر دکمه‌ی 'پویش پوشه با شبیه‌ساز' درون‌برد کنید. گزینش شبیه‌ساز مناسب به Playnite خواهد گفت که کدام گونه‌های پرونده باید پوییده و درون‌برد شوند. شما می‌توانید این دکمه را چندین بار برای درون‌برد بازی‌ها از پوشه‌های متفاوت بکار ببرید. بازی‌ها به پایین فهرست کنونی افزوده خواهند شد.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">هیچ شبیه‌سازی برای درون‌برد برگزیده نشده است. شما بدون آنکه نخست شبیه‌سازها را پیکربندی کنید هیچ بازی شبیه‌سازی شده‌ای را نمی‌توانید خودکار درون‌برد کنید. آیا مطمئنید که می‌خواهید ادامه دهید و از فرآیند درون‌برد بیرون بروید؟</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">هیچ شبیه‌سازی در Playnite پیکربندی نشده است. شما نمی‌توانید پیش از آنکه شبیه‌ساز را پیکربندی کرده و گونه‌ی پرونده‌ی مناسب را برگزینید، بازی‌ها را درون‌برد کنید. آیا می‌خواهید اکنون چند شبیه‌ساز بیفزایید؟</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">پویش پوشه با شبیه‌ساز</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">گزینش پرونده‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">شناسایی خودکار از پوشه…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">پیکربندی شبیه‌سازها…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">پوییدن…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">پوییدن {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">نخستین پیکربندی</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">این فرآیند شما را در درون‌برد خودکار و پیکربندی کتابخانه‌ها‌ی بازی بیرونی راهنمایی خواهد کرد. Playnite می‌تواند بازی‌ها را خودکار از چندین فروشگاه‌ بازی همچون Steam یا GOG درون‌برد کند.\r\n\r\nبدانید که می‌توانید به شیوه‌ی دستی نیز هر بازی سفارشی یا شبیه‌سازی شده را برای هر سکویی در زمانی دیگر از فهرست اصلی بیفزایید.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">یکپارچگی کتابخانه</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">در زیر فهرستی از برخی کتابخانه‌های یکپارچگی که Playnite از آنها پشتیبانی می‌کند را می‌بینید. لطفا آنهایی که می‌خواهید نصب کنید را برگزینید.\r\n\r\nاز فهرست &quot;افزونه‌ها&quot; می‌توان یکپارچگی‌های بیشتری نصب کرد.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">پیکربندی پایان یافت</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">نشاندن آغازین پایان یافت. به یاد داشته باشید که می‌توانید در زمانی دیگر همهٔ تنظیمات را دگرگون کرده و همچنین یکپارچگی‌های بیشتری را از فهرست اصلی بیفزایید.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">ناکامی در بارگیری یک یا چند افزونه.\r\n\r\nپس از پایان نخستین اجرای جادوگر می‌توانید برای بازبارگیری یکپارچگی‌ها از فهرست افزونه‌ها بکوشید.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">در حال بارگیری {0} یکپارچگی…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">در حال بارگیری فهرست یکپارگی‌های پیشنهادی…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">ناکامی در بارگیری فهرست یکپارچگی‌های پیشنهادی. می‌توانید در زمانی دیگر از راه فهرست افزونه‌ها برای بازبارگیری یکپارچگی‌ها بکوشید.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">پیکربندی سکوها و شبیه‌سازها</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">پیکربندی شبیه‌سازها</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">سکوها</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">سکو</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">شبیه‌سازها</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">شبیه‌ساز</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">افزودن سکو</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">گزینش نماد</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">گزینش کاور</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">گزینش تصویر</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">گزینش آیتم</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">گزینش پس‌زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">گزینش پرونده</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">گزینش URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">افزودن شبیه‌ساز</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">سکو(های) پشتیبانی شده</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">آیا می‌خواهید دگرگونی‌های سکو را ذخیره کنید؟</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">آیا می‌خواهید دگرگونی‌های شبیه‌ساز را ذخیره کنید؟</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">اجراپذیر</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">آرگومان‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">مسیر در حال کار</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">گونه پرونده‌های پشتیبانی شده</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">درون‌برد شبیه‌سازها…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">بارگیری شبیه‌سازها…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">بار کردن آرگومان‌های پیش‌نشانده از نمایه‌ی شبیه‌ساز شناخته شده</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">آیا از زدایش شبیه‌ساز {0} مطمئن‌اید؟ هم‌اکنون {1} بازی آن را بکار می‌برند.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">آیا از زدایش {0} سکو مطمئن‌اید؟ هم‌اکنون {1} بازی و {2} شبیه‌ساز آن را بکار می‌برند.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">تنظیمات راهنما</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">چینش بر پایهٔ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">سوی چینش</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">گروه‌بندی بر پایهٔ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">بالارونده</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">پایین‌رونده</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">گروه نکنید</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">گروه‌بندی بر پایهٔ کتابخانه</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">گروه‌بندی بر پایه‌ی دسته</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">گروه‌بندی بر پایه‌ی سکو</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">دیدن گونه</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">دید</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">پهنه‌ی کاوشگر</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">پهنه‌ی پالایه</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">نماد</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">نماد کتابخانه</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">تصویر کاور</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">تصویر پس‌زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">چینش بر پایه‌ی نام</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">کتابخانه</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">کتابچه راهنما</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">نام</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">درایو نصب</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">نام حساب</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">سکو</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">دسته‌بندی</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">ژانر</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">تاریخ رهش</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">سال رهش</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">توسعه‌دهنده</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">برچسب</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">ناشر</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">وضعیت نصب</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">سازگار کردن همه‌ی پالایه‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">اگر بکارافتاده باشد، تنها بازی‌هایی که همه‌ی آیتم‌های درون همه‌ی پالایه‌ها را بکار می‌برند در نما خواهند بود.\r\nاگر ازکارافتاده باشد، بازی‌هایی که هر آیتمی در هر پالایه‌ای را بکار می‌برند، در نما خواهند بود.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">  نصب شده</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">  نصب شده</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">نصب نشده</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">پنهان</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">دلخواه</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">بکاراندازی پشتیبانی از HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">اگر بکارافتاده باشد، پیش از آغاز بازی، HDR روی نمایشگر اصلی بکار می‌افتد.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">به یاد داشته باشید که HDR در نمایشگر اصلی شما پشتیبانی نمی‌شود.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">آخرین بازی شده</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">دسته‌بندی</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">توضیحات</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">پوشه‌ی نصب</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">تصویر کاور</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">پیوند‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">تصویر، رام یا مسیر ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">ژانر</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">ژانرها</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">شرکت</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">شرکت‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">توسعه‌دهنده</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">توسعه‌دهندگان</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">ناشر</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">ناشران</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">دسته‌بندی</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">دسته‌بندی‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">برچسب</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">برچسب‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">ویژگی</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">ویژگی‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">رده سنی</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">رده سنی‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">منطقه</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">مناطق</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">منبع</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">منابع</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">کنش‌های اخیر</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">خطا در پایگاه داده</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">ناکامی در گشودن پایگاه داده‌ی کتابخانه.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">پایگاه داده گشوده نیست.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">دسترسی به پایگاه داده‌ی کتابخانه شدنی نیست. یا فرآیند دیگری دارد پرونده‌ی &quot;{0}&quot; را بکار می‌برد یا در مکانی دور از دسترس است.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">ناکامی در ساخت بسته‌ی تشخیصی.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">ناکامی در بارگذاری خودکار بسته‌ی تشخیصی.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">اطلاعات تشخیصی پیروزمندانه فرستاده شد.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">بسته‌ی تشخیصی پیروزمندانه ساخته و فرستاده شد.\r\nلطفا شناسه‌ی زیر را به گزارش مشکل خود بچسبانید:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">ناکامی در درون‌برد بازی‌ها از {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">ناکامی در درون‌برد بازی‌های شبیه‌سازی شده از {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">نمی‌توان با نمایه‌ی شبیه‌ساز برگزیده بازی‌ها را جستجو کرد. نمایه هیچگونه پسوند پرونده یا سکویی ندارد.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite در راه‌اندازی ناکام ماند. لطفا دیگر نمونه‌های آن را بسته و دوباره بکوشید.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">ناکامی در بکاربستن زمینه‌ی &quot;{0}&quot;، نمایه‌ی رنگ &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">نمی‌توان پیوند را گشود، URL در چارچوبی معتبر نیست.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">ناکامی در راه‌اندازی برنامه.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">ناکامی در راه‌اندازی مولفه‌ی نمای وب. Playnite نمی‌تواند فرآیند راه‌اندازی را ادامه دهد.\r\n\r\nاطلاعات بیشتر در https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">به دلیل گمشدگی یا خرابی پرونده‌ی تعریفی، نمی‌توان شبیه‌سازها را درون‌برد کرد.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">ناکامی در اجرای کنش فهرست.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">ویرایش جزییات بازی</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL تصویر</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">افزودن پیوند</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">افزودن ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">ذخیره دگرگونی‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">بکاربستن دگرگونی‌ها میدان در بازی(های) در حال ویرایش.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\"> کنش افزودن</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">زدایش</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">کنش زدایش پخش</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">افزودن بازی‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">پویش پوشه…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">ردیابی نصب‌شده</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">مرور…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">گشودن Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">تنظیمات نمایه</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">نام بازی نمی‌تواند تهی باشد.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">مسیر ردیابی کنش بازی نمی‌تواند تهی باشد.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">نام بازی نمی‌تواند پیش از جستجوی فراداده تهی باشد.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">داده‌ی بازی نامعتبر است</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">URL وب معتبری که با http:// یا https:// آغاز می‌شود وارد کنید.</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">گزینش URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">ناکامی در بارگیری فراداده: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">خطا در بارگیری</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">پاک کردن پالایه‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">حساب شخصی</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">حساب همگانی</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">کلید API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">خطا در راه‌اندازی</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">خطای زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">پاک کردن همه</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">در حال نصب</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">در حال حذف نصب</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">در حال آغاز</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">در حال اجرا</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">URL نامعتبر است</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">کاری نکن</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">کمینه کردن</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">بازیابی پنجره</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">بازیابی پنجره تنها زمانی که از میانای کاربری راه‌اندازی شود</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">بستن</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">دگرگونی</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">پیشرفته</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">هرگز</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">وضعیت تکمیلی</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">وضعیت‌های تکمیل</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">امتیاز کاربر</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">امتیاز منتقدان</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">امتیاز جامعه</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">اسکریپت‌های بازی</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">اسکریپت‌های برنامه</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">اسکریپت‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">افزایه‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">منابع فراداده</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">افزونه‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">شناسه‌ی افزونه</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">بازبارکردن اسکریپت‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">SDK PowerShell تعاملی</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">همه‌ی اسکریپت‌ها پیروزمندانه دوباره بار شدند.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">هیچ بازی برای معیارهای مشخص شده‌ی پالایه/جستجو یافت نشد</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">آیتمی یافت نشد</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">تعویض به حالت میز‌کار</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">خروج از Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">کتابخانه‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">به‌روزرسانی همه</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">ساخته به دست:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">نسخه:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">به‌روز‌رسیده:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">ماژول:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">کتابخانه</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">آمارها</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">همه</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">هیچ</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">آگهی‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">پهنا</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">بلندا</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">اندازه‌</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">کوچک</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">بهنجار</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">بزرگ</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">بزرگتر</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">بزرگترین</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">پیش‌فرض</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">گزینش</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">گزینش همه</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">واگزینش همه</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">نخستین</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">بختوار</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">گزینش کاربر</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">بار کردن بیشتر</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">زلال</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">بستن</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">گسترش</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">بستن همه</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">گسترش همه</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">ديگر</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">زمینه‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">آرگومان‌های شبیه‌ساز</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">آرگومان‌های درونی</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">آرگومان‌های سفارشی</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">آرگومان‌های بیشتر شبیه‌ساز</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">بازنویسی آرگومان‌های شبیه‌ساز</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">کنش بازی</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">فراداده را برای درون‌برد برگزینید</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">گزینش بازی‌ها برای درون‌برد</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">جستجوی فراداده</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">به روزرسانی در دسترس است</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">دگرگونی‌ها از آخرین به‌روزرسانی تاکنون</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">بارگیری و نصب به‌روزرسانی</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">بررسی برای به‌روزرسانی</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">خطا در به‌روزرسانی</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">ناکامی در بررسی برای نسخه‌ی نو.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">نسخه نویی یافت نشد، شما به‌روزاید.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">ناکامی در بارگیری و نصب به‌روزرسانی.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">یک کار پس‌زمینه در جریان کار است. آیا می‌خواهید آن را لغو کنید و به‌روزرسانی را ادامه دهید؟</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">یک کار پس‌زمینه در جریان کار است. آیا می‌خواهید آن را لغو کنید و از Playnite بیرون بروید؟</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">یک کار پس‌زمینه در جریان کار است. دگرگون کردن حالت کار را لغو می‌کند، آیا می‌خواهید دگرگون کنید؟</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">یک به‌روزرسانی برای Playnite در دسترس است</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">بازبار کردن فهرست زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">بکار بستن زمینه‌ی برگزیده</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">دیدن دگرگونی‌های پرونده</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">هنگام دگرگونی پرونده‌ی منبع، زمینه را خودکارانه بکار ببندید</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">اسکریپت زمان اجرا</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">اجرا پیش از آغاز کردن بازی</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">اجرا پس از بیرون شدن از بازی</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">اجرا پس از آغاز شدن بازی</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">اجرا هنگام راه‌اندازی برنامه</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">اجرا هنگام خاموش کردن برنامه</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">اسکریپت آغاز بازی</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">اسکریپت بازی آغازشده</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">اسکریپت بازی ایستانده</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">اجرای اسکریپت سراسری</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">سراسری</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">پالاییده</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">کنونی</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">نو</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">اسکریپت آزمایش</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">تنها آیتم‌های برگزیده را نشان دهید.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">ذخیره بعنوان پیش‌فرض</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">افزودن به دلخواه‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">زدودن از دلخواه‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">پنهان کردن این بازی</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">زدودن از پنهانیده</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">بکاراندازی پشتیبانی از HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">ازکاراندازی پشتیبانی از HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">ویرایش…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">برآورد اندازه‌ی نصب</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">برآورد اندازه‌ی نصب (همه‌ی بازی‌ها)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">برآورد اندازه‌ی نصب (تنها داده‌های گمشده)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">اندازه‌ی نصب</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">نشاندن دسته‌بندی‌ها…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">نشاندن وضعیت تکمیل</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">زدایش</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">آغاز</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">نصب</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">گزینه‌های بازی</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">جزئیات</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">حذف نصب</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">گشودن مکان نصب</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">ساخت میانبر در دسکتاپ</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">گشودن راهنما</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">بیشتر</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">به دست افزایه‌ٔ کتابخانه مدیریت می‌شود</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">فرایند راه‌اندازی بازی به دست افزایهٔ کتابخانه مسئول این بازی مدیریت خواهد شد.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">هیچ اطلاعات مرتبطی دربارهٔ بازی &quot;{0}&quot; در برگهٔ مشخص‌شده یافت نشد.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">نکته: می‌توانید هنگام ویرایش پیشرفتهٔ یک بازی از طریق گزینهٔ &quot;ویرایش&quot;، فرایند بارگیری فرادادهٔ پیشرفته‌تری را بکار ببرید.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">هنگام در جریان بودن یک کنش در دسترس نیست.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">نوشتار توضیحات به نحو HTML حساس است</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">زمان بازی به ثانیه ثبت می‌شود.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">اندازهٔ نصب به بایت نشان داده شده است.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">تاریخ انتشار باید در چارچوب &quot;سال-ماه-روز&quot; نشانده شود. ارزش‌های ماه و روز را می‌توان زدود.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">ارزش‌ها از ۰ تا ۱۰۰ یا تهی از امتیاز.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">توسعهٔ Playnite به دست این پشتیبانان و عضو‌های Ko-fi پشتیبانی می‌شود:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">کد، بومی‌سازی و دیگر کمک‌کنندگان بدون چیدمان مشخص:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">لغو پایش بازی؟</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">پایش نصب هم‌اکنون دارد اجرا می‌شود. آیا می‌خواهید فرایند را لغو کرده و بازی را به حالت پیشین برگردانید؟</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">پایش اجرای بازی هم‌اکنون دارد اجرا می‌شود. آیا می‌خواهید فرایند را لغو کرده و بازی را به حالت پیشین برگردانید؟</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">زمان بازی‌شده</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">آخرین بازی‌شده</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0} روز {1} ساعت {2} دقیقه</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0} ساعت {1} دقیقه</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} دقیقه</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} ثانیه</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">بازی‌نشده</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">گشودن حالت دسکتاپ...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">گشودن حالت تمام‌صفحه...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">بار کردن کتابخانهٔ بازی...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">برآورد اندازهٔ نصب...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">برآورد اندازهٔ نصب از {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">ناکامی در نصب پروندهٔ اسکریپت.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">اسکریپت پیروزمندانه نصب شد.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">نصب اسکرپیت</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">خطای اسکریپت</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">ناکامی در اجرای کارکرد افزونه.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">گشودن پوشهٔ فراداده</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">برآورد</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">اگر بازی ROMی دارد یا مسیر نصبی نشانده شده است، خودکارانه اندازهٔ نصب را با به‌کارگیری آن برآورد می‌کند.</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} کلاینت نصب نشده است.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} کلاینت اکنون گشوده خواهد شد. لطفا درون شوید و سپس این پیام را ببندید.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">در انتظار درون شدن کاربر، لطفا این را پس از انجام ببندید...</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">مکان نصب بازی یافت نشد.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">پیکربندی کنش بازی نامعتبر است.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">عیب‌یابی مشکل‌های همگام‌سازی حساب</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">عیب‌یابی مشکل‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">بازنامگذاری آیتم</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">افزودن آیتم نو</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">نام را وارد کنید</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">نام نو را وارد کنید</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">کمتر از یک ساعت</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">۱ تا ۱۰ ساعت</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">۱۰ تا ۱۰۰ ساعت</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">۱۰۰ تا ۵۰۰ ساعت</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">۵۰۰ تا ۱۰۰۰ ساعت</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">بیشتر از ۱۰۰۰ ساعت</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">برای تکمیل کردن نصب Playnite باید بازراه‌اندازی شود. آیا می‌خواهید اکنون انجام شود؟</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">افزونه به درستی بسته‌بندی نشده است.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">زمینه به درستی بسته‌بندی نشده است.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">افزونهٔ «{0}» به درستی بار نشد.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">نمی‌توان افزونهٔ «{0}» را بار کرد، نسخهٔ کنونی Playnite پشتیبانی نمی‌شود.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">ناکامی در درست بار کردن زمینهٔ «{0}».</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">نمی‌توان زمینهٔ «{0}» را بار کرد، نسخهٔ کنونی Playnite پشتیبانی نمی‌شود.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">ناکامی در درست بار کردن افزونه.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">ناکامی در درست بار کردن زمینه.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">زمینه/افزونه نسخهٔ اِی.پی.آی پشتیبانی‌نشده‌ای را بکار می‌برد.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">نصب پیروزمندانه بود.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">نصب برافزا؟</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">عمومی</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">ناکامی در نصب برافزای «{0}».</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">ناکامی در نصب افزونه.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">آیا می‌خواهید افزونهٔ نویی نصب کنید؟\r\n\r\n{0}\r\nتوسط {1}\r\nنسخهٔ {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">آیا می‌خواهید افزونهٔ «{0}» را به‌روزرسانید؟\r\n\r\nنسخهٔ کنونی: {1}\r\nنسخهٔ نو: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">ناکامی در نصب زمینه.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">آیا می‌خواهید زمینهٔ نویی نصب کنید؟\r\n\r\n{0}\r\nتوسط {1}\r\nنسخهٔ {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">آیا می‌خواهید زمینهٔ «{0}» را به‌روزرسانید؟\r\n\r\nنسخهٔ کنونی: {1}\r\nنسخهٔ نو: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">شما در حال بیرون رفتن از Playnite و رفتن به وبگاه زیر با مرورگر پیش‌فرض خود می‌باشید. آیا می‌خواهید ادامه دهید؟\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">تصویر(های) برگزیده شاید برای کارایی بهینه بیش از اندازه بزرگ باشند. به‌کارگیری تصویرهای بسیار بزرگ می‌تواند باعث واکنش‌پذیری بدتر میانای کاربری و افزایش مصرف حافظه شود.\r\n\r\nبیشینه نسبت نمای پیشنهادی:\r\nنمادها: {0} مگاپیکسل\r\nکاورها: {1} مگاپیکسل\r\nپس‌زمینه‌ها: {2} مگاپیکسل</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">هشدار کارایی</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">دوباره نمایش نده</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">پرونده با پسوند {0} سازگار نیست.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">پسوند پرونده ناسازگار است</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">تصویر برگزیده شاید برای کارایی بهینه بیش از اندازه بزرگ باشد.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">آیا مطمئنید که می‌خواهید زمینهٔ برگزیده را حذف نصب کنید؟ حذف نصب در صف برای اجرا در راه‌اندازی بعدی برنامه گذاشته خواهد شد.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">زمینه‌های درون‌ساخته را نمی‌توان حذف نصب کرد.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">این زمینه نسخهٔ کنونی Playnite را پشتیبانی نمی‌کند.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">آیا مطمئنید که می‌خواهید افزونهٔ برگزیده را حذف نصب کنید؟ حذف نصب در صف برای اجرا در راه‌اندازی بعدی برنامه گذاشته خواهد شد.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">افزونه‌های درون‌ساخته را نمی‌توان حذف نصب کرد.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">این افزونه نسخهٔ کنونی Playnite را پشتیبانی نمی‌کند.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">پوشهٔ نصب</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">پوشهٔ داده</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">زایش بستهٔ تشخیصی…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">بارگذاری بستهٔ تشخیصی…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">درون‌برد پرونده…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">این چیست؟</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">آیا مطمئنید که می‌خواهید این کار را انجام دهید؟</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">زمان بازی کل</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">میانگین زمان بازی</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">بیشترین زمان بازی</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">اندازهٔ کل نصب</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">نمای کلی</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">نوار کناری</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">نمایش در نوار کناری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">بازنشاندن تنظیمات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">همهٔ تنظیمات برنامه به ارزش‌های پیش‌فرض بازگردانده می‌شوند، به جز:\r\n- مکان پایگاه داده\r\n- فهرست برون‌داشت درون‌برد\r\n- تنظیمات افزونه، همچون یکپارچه‌سازی کتابخانه\r\n    \r\nبرای پایان دادن به فرایند، برنامه به بازراه‌اندازی نیاز دارد. آیا می‌خواهید تنظیمات را بازگردانید؟</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">برای توسعه‌دهندگان</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">افزونه‌های برونی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">مسیر کامل پوشه را وارد کنید</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">دستاوردها</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">انجمن</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">خبرها</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">برگهٔ فروشگاه</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">تنظیمات آغازین کامل نیست. اکنون Playnite در حالت رایانه بازراه‌اندازی می‌شود تا رویه پایان یابد.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">اخیرا بازی‌شده</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">دلخواه‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">بیشترین بازی‌شده</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">همه</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">پالایه‌هایی به کار بسته شده‌اند.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">پالایه‌های بیشتری به کار بسته شده‌اند.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">نمایش نتیجه‌های جستجو برای:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">آیتمی با همین نام هم‌اکنون وجود دارد.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">محدود کردن گزینش به پالایهٔ کنونی</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">گزینش دیگری</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">برافزاها…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">نصب‌شده</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">تنظیمات افزونه‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">مرور</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">به‌روزرسانی‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">({0}) به‌روزرسانی</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">مدیریت افزونه‌ها و زمینه‌های نصب‌شده، همچون تنظیمات آنها، به گزینگان نوی «برافزاها» جابه‌جا شده است.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">همهٔ افزونه‌های یکپارچه‌سازی کتابخانه که هم‌اکنون نصب‌شده‌اند را می‌توان در اینجا پیکربندی کرد.\r\n\r\nاگر می‌خواهید یکپارچگی‌های بیشتری نصب یا حذف نصب کنید، گزینهٔ «برافزا» از گزینگان اصلی را به کار ببرید.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">زمینهٔ رایانه</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">زمینه‌های تمام‌صفحه</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">در حال جستجو…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">برافزا با این نسخه از Playnite سازگار نیست.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">ناکامی در بارگیری بستهٔ نصب برافزا.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">ناکامی در بارگیری اعلامیهٔ نصب برافزا.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">بازراه‌اندازی برنامه برای به‌کاربندی دگرش‌های در دست انجام نیاز است.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">این برافزا برای نصب زمان‌بندی شده است.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">نصب</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">نصب مجدد</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">حذف نصب</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">هم‌اکنون نصب‌شده است</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">هیچ به‌روزرسانی نویی برای برافزا یافت نشد.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">به‌روزرسانی برافزاها</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">گزارش دگرش‌ها در دسترس نیست</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">زمان‌بندی‌شده برای نصب</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">ناکامی در بارگیری</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">پروانه رد شد</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">بارگیری {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">به دنبال به‌روزرسانی‌های برافزا…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">جستجوی به‌روزرسانی‌های برنامه...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">یک یا چند به‌روزرسانی افزایه در دسترس است.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">موردها را برای به‌روزرسانی برگزینید</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">نمونهٔ توسعهٔ افزونه</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} قرارداد پروانه</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">پذیرفتن</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">نپذیرفتن</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">یکپارچه‌سازی کتابخانهٔ کنش‌های آغاز را در بر می‌گیرد</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">گزینش کنش</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">حالت ردیابی</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">مسیر ردیابی</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">دیرکرد ردیابی اولیه</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">بسامد ردیابی</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">پیوند</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">پرونده</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">شبیه‌ساز</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">اسکریپت</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">پیش‌فرض</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">فرایند</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">پوشه</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">فرایند اصلی</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">نام فرآیند</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">ثبت پیام‌های ردیابی</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">دگرش‌های زیر دادهٔ همهٔ بازی‌هایی که هم‌اکنون برگزیده‌اند را بازنویسی می‌کند.</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">هیچ</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">یکنواخت</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">تنها آیتم‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">تنها آغاز و پایان</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">حساسیت پیمایش‌گر</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">پیمایش نرم</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">تندی پویانمایی</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">برچیدن آیتم؟</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">از برچیدن این آیتم مطمئنید؟</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">نمایش دکمه‌ها در پهنهٔ بالایی:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">تنظیمات نمای کلی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">تنظیمات گروه‌بندی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">تنظیمات چینش</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">پیش‌نشانده‌های پالایه</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">موقعیت آیتم‌های افزایه</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">پهنای جداکنندهٔ بخش</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">بردن دکمهٔ فهرست اصلی به نوار کناری</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">پهنهٔ کاوشگر</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">گزینش‌گر بازی تصادفی</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">نمایش گزینش‌گر بازی تصادفی</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">بازی تصادفی را از نما برمی‌گزیند</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">ذخیره‌سازی تنظیمات گروه‌بندی و چینش</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">نمایش به‌عنوان پالایهٔ تند در حالت تمام‌صفحه</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">در ۷ روز گذشته</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">در ۳۱ روز گذشته</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">در ۳۶۵ روز گذشته</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">بیش از ۳۶۵ روز پیش</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">پیکربندی</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">ذخیره‌سازی پیش‌نشانده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">کمینه‌سازی پس از آغاز بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Playnite را پس از آغاز بازی کمینه می‌کند.\r\n\r\nاز کار انداختن این گزینه می‌تواند منجر به مشکل‌هایی شود که باعث می‌شوند بازی‌ها در زمان راه‌اندازی تمرکز درونداد را دریافت نکنند!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">اندازهٔ قلم</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">اندازهٔ قلم کوچک</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">فعال کردن پشتیبانی از API کنترلر بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">پشتیبانی از دستهٔ بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">اگر نافعال باشد، Playnite هیچ دستهٔ بازی‌ای را نمی‌پذیرد.\r\n\r\nاگر از ابزارهایی استفاده می‌کنید که دروندادهای دستهٔ بازی را به دروندادهای موس/تخته‌کلید تبدیل می‌کند و در Playnite دروندادهای دوتایی دریافت می‌کنید، از کار بیندازید.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">نمایش آیتم‌ها در فهرست اصلی:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">اتصال دکمهٔ نمای اصلی X/A وارونه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">اتصال‌های دکمه را برای راه‌اندازی بازی و نمایش صفحهٔ جزئیات بازی در نمای اصلی تعویض می‌کند.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">تعویض دکمهٔ تأیید/لغو</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">اتصال‌های دکمه‌های A/B را برای تأیید و لغو وارونه می‌کند.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">تنها دستهٔ بازی اصلی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">تنها زمانی که فعال است از دستهٔ بازی اصلی درونداد بپذیرید.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">دکمهٔ راهنما Playnite را متمرکز می‌کند</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">صدای میانا</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">صدای پس‌زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">بی‌صداسازی در پس‌زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">ناکامی در راه‌اندازی میانای صوتی.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">اِی.پی.آی برونداد</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">اِی.پی.آیی که برای برونداد صوت به کار می‌رود. اگر مشکلی با صدا دارید تغییر دهید.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">عمومی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">دیداری</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">صدا</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">چیدمان</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">فهرست‌ها</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">درونداد</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} در حال آغاز است…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} در حال اجرا است…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">حرف‌های بزرگ</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">فاصله</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">مقیاس‌دهندهٔ پردازش تصویر</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">دگرگزین</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">ترازشده</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">کیفیت</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">کیفیت:\r\nبهترین کیفیت تصویر، کُند، مصرف حافظهٔ بالا.\r\n    \r\nترازشده:\r\nکیفیت خوب، تند، مصرف حافظهٔ کم.\r\n    \r\nدگرگزین:\r\nکیفیت بهتر، تندی متوسط، مصرف حافظهٔ کم.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">گزینش پرونده…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">گزینش پوشه…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">اسکریپتِ راه‌اندازی</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">لطفاً توجه داشته باشید که هم افزونه‌ها و هم زمینه‌ها می‌توانند تأثیر بسیاری بر کارایی، پایداری و امنیت Playnite داشته باشند.\r\n\r\nاگر پس از نصب زمینه یا افزونه‌ای با مشکلی روبه‌رو شدید، نخست برای فهمیدن اینکه آیا دلیل مشکل هستند یا نه آنها را از کار بیندازید/حذف نصب کنید.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">گزینش هنگام راه‌اندازی</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">گزینش هنگام راه‌اندازی</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">نمایه‌های درونی</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">نمایهٔ درونی</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">پروفایل های سفارشی</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">نمایه سفارشی</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">توسط یک اسکریپت داخلی مدیریت می شود</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">مشخصات شبیه ساز</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">مشخصات پلت فرم</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">مشخصات منطقه</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">قبل از شروع شبیه ساز اجرا کنید</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">پس از شروع شبیه ساز اجرا کنید</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">پس از خروج از شبیه ساز اجرا کنید</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">پس از خروج از شبیه ساز اجرا کنید</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">مشخصات شبیه ساز پیدا نشد.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">اسکریپت راه اندازی شبیه ساز پیدا نشد.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">تقسیم به عنوان بازی های جداگانه</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">ادغام در یک بازی</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">تنظیم پلتفرم</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">تنظیم منطقه</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">بررسی پوشه</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">بررسی پیکربندی</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">الگوها را از اسکن جمع‌آزما حذف کنید</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">فایل‌های مطابق با الگو(های) مشخص شده برای چک‌سوم اسکن نمی‌شوند و با نام فایل مطابقت داده می‌شوند. برای اطلاعات بیشتر به صفحه راهنمای شبیه ساز مراجعه کنید.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">اسکن با شبیه ساز</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">هنگام ذخیره پیکربندی جدید، نام باید تنظیم شود.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">شبیه ساز یا نمایه شبیه ساز تنظیم نشده است.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">مسیر برای اسکن مشخص نشده است یا وجود ندارد.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">پیکربندی اسکن به درستی تنظیم نشده است.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">شامل اسکن خودکار اسکن انبوه</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">اسکن پوشه برای شبیه سازها انجام نشد.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">اسکن پوشه(های) بازی های شبیه سازی شده انجام نشد.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">پنهان کردن وارد شده</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">پروفایل‌هایی برای وارد کردن:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">تنظیمات اسکن خودکار</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">تنظیمات اسکن خودکار</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">پیکربندی را برای استفاده بعدی در طول به روز رسانی کتابخانه ذخیره می کند. تنظیمات ذخیره شده را می توان از طریق منوی &quot;پیکربندی شبیه‌ساز ها&quot; مدیریت کرد.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">وارد کردن با استفاده از مسیرهای نسبی</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">در صورت امکان فایل های بازی را با استفاده از مسیرهای مربوط به پوشه نصب Playnite یا پوشه نصب شبیه‌ساز وارد کنید.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">اسکن زیر پوشه ها</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">اسکن داخل آرشیوها</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">ادغام فایل های مرتبط</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">فایل‌های بازی مرتبط، مانند دیسک‌های بازی جداگانه، را یکجا در بازی ادغام کنید.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">افزودن اسکنر</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">اضافه کردن اسکنر ذخیره شده</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">شروع بررسی</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">برای اسکن پوشه های خاص، پیکربندی(های) اسکن را با شبیه سازها اضافه کنید. مطمئن شوید که شبیه سازها قبل از وارد کردن بازی ها به درستی پیکربندی شده اند (از طریق کتابخانه -&gt; منوی پیکربندی شبیه سازها).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">وضعیت پیش‌فرض به بازی‌های تازه اضافه شده اختصاص داده شده است</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">وضعیت اختصاص داده شده به بازی‌هایی که برای اولین بار انجام می شوند</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">خطا در راه‌اندازی محیط اجرای اسکریپت PowerShell. اگر از کاربران ویندوز 7 هستید، سعی کنید PowerShell 5.1 را نصب یا مجدداً نصب کنید تا مشکل برطرف شود.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">فیلتر از پیش تعیین شده با نام مشخص از قبل موجود است. از پیش تنظیم شده با تنظیمات جدید به روز شود؟</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">نام‌های مرتب‌سازی از دست رفته را برای بازی‌های اضافه شده یا ویرایش شده به صورت دسته‌ای، به طور خودکار پر کنید</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">وقتی یک بازی را ویرایش می‌کنید، از طریق به‌روزرسانی کتابخانه، اسکن پوشه شبیه‌ساز یا اسکن پوشه معمولی، بازی‌ها را اضافه می‌کنید، فیلد «نام مرتب‌سازی» به طور خودکار با نمایش مرتب‌سازی بهتری از نام بازی پر می‌شود. برای مثال، «The Witcher 3» نام مرتب‌سازی «Witcher 03» را دریافت می‌کند. این کار هرگز نام مرتب‌سازی‌ای را که با نام بازی متفاوت نیست، تنظیم نمی‌کند و فقط نام‌های مرتب‌سازی خالی را به طور خودکار به‌روزرسانی می‌کند.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">این کلمات از ابتدای مقدار نام مرتب‌سازی که به طور خودکار پر شده حذف می شوند:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">از این برای نادیده گرفتن کلمات در ابتدای رشته برای اهداف مرتب‌سازی استفاده کنید. پیش فرض &quot;The&quot;، &quot;An&quot; و &quot;A&quot; است.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">نام مرتب‌سازی را برای بازی‌های بدون آن پر کنید</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">مرتب‌سازی</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">پر کردن مرتب‌سازی مقادیر نام…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">سرویس Nahimic در سیستم شما شناسایی شده است. این سرویس باعث مشکلات رندر در Playnite (و برنامه‌های دیگر) می‌شود.\r\n\r\nاگر با هرگونه خرابی گرافیکی یا مشکلات رندر در Playnite روبرو شدید، توصیه می‌کنیم سرویس Nahimic را غیرفعال یا به طور کامل حذف نصب کنید.\r\n\r\nاطلاعات بیشتر در این لینک https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite با امتیازات بالا (به عنوان مدیر) در حال اجرا است. این توصیه نمی‌شود زیرا به تمام افزونه‌های نصب‌شده و تمامی بازی‌ها/برنامه‌هایی که از Playnite شروع می‌شوند امتیازات بالایی می‌دهد!\r\n\r\nاطلاعات بیشتر در https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">نمایش هشدار در صورت اجرای Playnite با امتیازات بالا</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">هنگام محاسبه اندازه بازی ها، اندازه واقعی درایو را دریافت کنید</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">اگر فعال باشد، اسکن‌ها کندتر می‌شوند و اندازه واقعی فایل‌ها در درایو را دریافت می‌کنند.\r\nاگر غیرفعال باشد، اسکن ها سریعتر انجام می شود و از اندازه خود فایل ها استفاده می شود.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">افزونه(های) بعدی به دلیل تأثیر پایداری/عملکرد بالا یا مسائل امنیتی به عنوان بالقوه مشکل ساز گزارش شده است. ما شدیداً توصیه می کنیم که آنها را حذف کنید:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">حذف فایل های آنلاین از اسکن</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">فایل‌های ذخیره‌شده در فضای ذخیره‌سازی ابری، اگر به صورت محلی در دسترس نباشند، اسکن و وارد نمی‌شوند.\r\nفقط برای: Google Drive، DropBox، OneDrive پشتیبانی می شود</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">اسکن کنید اما با استفاده از روش ساده بدون محتوای فایل</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">فایل‌ها وارد خواهند شد، اما با استفاده از روشی کمتر دقیق که نیاز به دانلود و حضور محلی محتوای فایل ندارد.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">اعمال بر همه</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">لغو وضعیت نصب</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">وقتی تنظیم شود، Playnite وضعیت نصب (از جمله دایرکتوری نصب) را که توسط افزونه یکپارچه‌سازی که این بازی را وارد می‌کند، نادیده می‌گیرد.\r\n        \r\nاین گزینه ممکن است به طور کامل با افزونه هایی که از روش واردات بازی خاصی استفاده می کنند کار نکند، مگر اینکه این گزینه لغو را نیز در نظر بگیرند.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">تنها دستی</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">یک بار در روز</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">یکبار در هفته</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">در هر راه‌اندازی</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">بررسی به روز رسانی برنامه</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">بررسی بروزرسانی افزونه</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">بروزرسانی کتابخانه ها</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">اسکن پوشه های شبیه سازی</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">شامل بازی های پنهان</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">ویرایش فیلدها</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">انتخاب / لغو انتخاب همه</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">باز کن</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">فعال</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">اختصاص</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">برای جستجوی بازی ها شروع به تایپ کنید… [F1] برای کمک</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">شروع با # فهرستی از دستورها موجود را نشان می دهد.\r\nشروع با / فهرستی از ارائه دهندگان/افزونه های جستجوی موجود را نشان می دهد.\r\nتایپ کلمه کلیدی جستجو و پایان دادن با SPACE بلافاصله به آن جستجو تغییر می کند.\r\n\r\nTAB: عمل سوئیچ\r\nENTER: فعال کردن عمل انتخاب شده\r\nSHIFT-ENTER: منوی مورد را باز کنید</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">شامل بازی های حذف شده</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">شامل بازی های پنهان</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">بازی های حذف شده گنجانده شد</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">بازی های حذف شده محروم شدند</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">شامل بازی های مخفی</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">بازی های پنهان محروم شدند</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">اجرا یا نصب</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">برو به جزئیات</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">منو بازی</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">ویرایش بازی</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">باز شدن جستجو</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">جعبه جستجو </sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">دکمه جستجو</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">عملکرد اولیه بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">عملکرد ثانویه بازی</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F جستجوی سراسری را به جای تمرکز کادر جستجو باز می کند</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">تنظیمات فیلتر بازی را بین جلسات جستجو ذخیره کنید</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">ارائه دهندگان جستجو</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">کلمه کلیدی پیش فرض</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">کلمه کلیدی سفارشی</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">میانبر گسترده سیستم</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">جستجو Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">تنظیمات افزونه</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">استثنائات</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">فایل های استثناء نسبت به پوشه اسکن</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">پوشه های استثناء نسبت به پوشه اسکن</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">افزودن فایل به لیست استثناء</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">افزودن پوشه به لیست استثناء</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">موارد استثنا را فقط می توان به تنظیمات اسکنر ذخیره شده اضافه کرد.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">موارد استثنا به اسکنر &quot;{0}&quot; اضافه شده است.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">لغو پلت فرم</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">هنگامی که اسکنر تنظیم شود، این پلتفرم را به همه بازی‌ها اختصاص می‌دهد و پلتفرم‌های شناسایی شده به‌طور خودکار را بازنویسی می‌کند.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">شامل دستورات در جستجوی پیش فرض</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">وقتی غیرفعال است، تا زمانی که از پیشوند # استفاده نشود، دستورها در جستجوی پیش‌فرض گنجانده نمی‌شوند.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">از تطبیق فازی در فیلتر نام استفاده کنید</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">وقتی فعال باشد، فیلتر نام با نام بازی‌ها مطابق با جستجوی جهانی مطابقت پیدا می‌کند.\r\nتطبیق دقیق را می توان با قرار دادن پیشوند فیلتر با کاراکتر ! انجام داد.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">فیلدهایی که برای نتایج بازی نمایش داده می شوند:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">وضعیت پنهان</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">پشتیبان گیری از داده ها لغو شد.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">پشتیبان گیری از داده ها نشد.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">خطا پشتیبان گیری از داده ها</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">پشتیبان گیری از داده ها...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">بازیابی داده از پشتیبان...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">بازیابی داده از پشتیبان نشد</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">تنظیمات</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">پوشه بازی</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">پوشه رسانه بازی</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">افزونه های نصب شده</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">داده های افزونه ها</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">پوسته‌های نصب شده</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">داده هایی را برای بازیابی از فایل پشتیبان مشخص شده انتخاب کنید.\r\n    \r\nPlaynite به طور خودکار راه‌اندازی مجدد می شود تا فرآیند بازیابی نسخه پشتیبان شروع شود.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">مواردی را انتخاب کنید که با پشتیبان‌گیری داده‌ها همراه شوند. تنظیمات برنامه و داده های کتابخانه بازی به طور پیش فرض گنجانده شده است.\r\n    \r\nبرای شروع فرآیند پشتیبان گیری، Playnite به طور خودکار راه‌اندازی مجدد می شود.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">پشتیبان گیری خودکار اطلاعات</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">فرکانس پشتیبان گیری خودکار</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">پوشه پشتیبان</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">پشتیبان گیری چرخشی</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">شامل داده های اضافی:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">اگر پشتیبان‌گیری خودکار فعال باشد، باید پوشه پشتیبان‌گیری تنظیم شود.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">نمایش اعلان‌ها فقط برای انتشار پچ</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">وقتی فعال باشد، فقط به‌روزرسانی‌های موجود برای نسخه اصلی نصب‌شده در حال حاضر منجر به اعلان به‌روزرسانی می‌شوند.\r\nنسخه های اصلی جدید منجر به اعلان به روز رسانی نمی شوند.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">از تاریخ های نسبی هفته گذشته استفاده کنید</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">اگر تاریخ کمتر از یک هفته است، از تاریخ های نسبی در قالب «امروز»، «دیروز» و غیره استفاده کنید.\r\n    \r\nقالب تاریخ مشخص شده برای تمام تاریخ های دیگر استفاده خواهد شد.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">جستجوی تصویر وب</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">رشته جستجوی تصویر نماد</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">رشته جستجوی تصویر جلد</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">رشته جستجوی تصویر پس زمینه</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">در حال دریافت اطلاعات افزونه…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">هیچ منبع ابرداده ای در دسترس نیست</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">تنظیمات اجرا اکشن</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">استفاده از تنظیمات اسکنر</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">هنگام راه‌اندازی نمایه را انتخاب کنید</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">انتخاب شبیه‌ساز در زمان راه‌اندازی</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">خودکار</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">همیشه روشن</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">همیشه خاموش</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">قابلیت دسترسی (خواننده صفحه نمایش) پشتیبانی می کند</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">منوی برنامه</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">منو بازی</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">پوشه برنامه</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">پوشه اطلاعات کاربر</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">خرابی فایل کتابخانه شناسایی شده است، Playnite اکنون خاموش می‌شود.\r\n    \r\nبا درخواست رفع خرابی برای فایل‌های خود، مسئله جدیدی در صفحه گیت‌هاب Playnite باز کنید.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">آیا می خواهید تغییراتی را که ایجاد کرده اید ذخیره کنید؟</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">نصب قابل حمل</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">کنترلری شناسایی نشد</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/fi_FI.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Suomi</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playniten kieli</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Poistu</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Suodatin käytössä</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Suodatin pois käytöstä</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Muut suodattimet</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Suodattimet</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Suodatin</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Virheellinen data</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Tallenna muutokset?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Kotisivut osoitteessa www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Lähdekoodi GitHubissa</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Luo diag. paketti</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Lähetä diag. tiedot</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Tietoja Playnitesta</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Luonut Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Valitse kategoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Aseta kategoriat</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Lisää kategoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Valittu - Aseta kategoria\r\nEi valittu - Poista kategoria\r\nMäärittelemätön - Ei muutoksia (kun muokataan useita pelejä)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Ei kategoriaa</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Ei alustaa</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Hups, jokin meni pieleen…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Tapahtui peruuttamaton virhe.\r\n\r\nJos haluat auttaa meitä korjaamaan tämän ongelman, kirjoita lyhyt kuvaus siitä, mitä teit ennen virheen tapahtumista ja lähetä\r\ndiagnostiikkatiedot. Jos olet yhdistettynä verkkoon, paketti lähetetään Playnite-palvelimelle tutkimusta varten.\r\n\r\nVaihtoehtoisesti voit painaa &quot;Ilmoita ohjelman kaatumisesta&quot; -nappia ja luoda GitHubiin uuden korjausehdotuksen ja raportoida virheen suoraan sinne.\r\n\r\nKiitos avustasi.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Laajennus &quot;{0}&quot; aiheutti peruuttamattoman virheen.\r\n\r\nSuosittelemme, että tallennat lokitiedoston ja raportoit virheestä laajennuksen kehittäjälle. Jos ongelma toistuu, poista laajennus käytöstä.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Laajennus &quot;{0}&quot; aiheutti peruuttamattoman virheen.\r\n\r\nSuosittelemme, että raportoit virheestä laajennuksen kehittäjälle. Jos ongelma toistuu, ota laajennus pois käytöstä.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Peruuttamaton virhe tapahtui.\r\n\r\nJos haluat auttaa meitä korjaamaan tämän ongelman, ole hyvä ja lähetä diagnostiikkatiedot. Kiitos.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Poista laajennus käytöstä</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Tallenna lokitiedosto</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Lähetä diagnostiikkatiedot</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Ilmoita ohjelman kaatumisesta</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Uudelleenkäynnistä Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Käynnistä uudelleen vikasietotilassa</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Poistetaan kaikki kolmannen osapuolen laajennukset käytöstä ja käytetään oletusteemaa.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Poistu Playnitesta</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Mitä tein ennen kuin ohjelma kaatui (Englanniksi):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Kirjaston hallinta</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Poista peli(t)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Ei voi poistaa - peli tai asennusohjelma on käynnissä. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Asennusta ei voi poistaa - peli on käynnissä.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Oletko varma, että haluat poistaa {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Haluatko varmasti poistaa {0} peliä?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Oletko varma, että haluat poistaa {0}?\r\n\r\nValitsemalla &quot;Lisää ohitus listalle&quot; valinnan estää pelin lisäämisen uudestaan seuraavalla kerralla kun kirjastoa päivitetään. </sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Haluatko varmasti poistaa {0} peliä?\r\n\r\nJos valitset &quot;lisää ohituslistalle&quot; -valinnan näitä pelejä ei tuoda uudestaan seuraavan kerran kun kirjasto päivitetään.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Haluatko varmasti poistaa {0} merkintää, jotka eivät tällä hetkellä ole käytössä?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Käyttämättömiä kenttiä ei löytynyt.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Kyllä (lisää ohituslistalle)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Tässä osiossa on muutoksia, joita ei ole tallennettu</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Päivitetään pelikirjaston formaattia…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Tietokannan päivitys epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Pelikirjastoa ei voida päivittää. Vapaata tilaa tarvitaan {0} megatavua.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Pelivirhe</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Peliä ei voida käynnistää. Tietokannasta ei löytynyt '{0}' peliä.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Peliä ei voida käynnistää: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Toimintoa ei voida käynnistää: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Pelin sijaintia ei voitu avata: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Pelin asennuksen kokoa ei tunnistettu: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Asennuskoon hakuvirhe</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Asennuskoon haun aikana tapahtui {0} virhettä</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Virhe luotaessa pikakuvaketta: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Käyttöoppaan avaaminen epäonnistui: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Peliä ei voida asentaa: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Peliä ei voida poistaa: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Asennusratkaisu ei ole saatavilla.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Tälle pelille ei ole asennettu kirjastoliitännäistä tai se ei ole käytössä.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Virallista metatietoa ei ole saatavilla.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Yhtään peliä ei ole valittu.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Pelin skriptin suoritus epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Yleisen skriptin suoritus epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Emulaattori skriptin suoritus epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Toistokomentosarjan suoritus epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 tai uudempi ei ole asennettuna.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Pelin aloittaminen ei onnistunut.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Käytössä</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Poista</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Poista käyttämättömät</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Nimeä uudelleen</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopioi</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Lisää</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Oletuskuvake</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Oletuskansikuva</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Oletustaustakuva</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Valmis</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Seuraava</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Takaisin</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">VALMIS</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">TAKAISIN</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">TYHJENNÄ</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Tyhjennä</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Ohita</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Ohita kaikki</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Tuo</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nimi</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Tekijä</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Moduuli</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Sarja</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versio</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Viimeksi pelattu</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Eniten pelattu</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Pelikerrat</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Koko asennettuna</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Kansio</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Merkinnät</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Lisätty</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Lisäyspäivä</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Muokattu</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Muokkauspäivä</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Verkkosivusto</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Polku</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Tallenna</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Sulje</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Peruuta</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Vahvista</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Nollaa muutokset</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Kyllä</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Ei</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Tervetuloa</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Paikallinen käyttäjä</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Yleiset</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Media</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Linkit</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Asenna</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Toiminnot</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Ladataan…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Ladataan mediaa…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Ladataan…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Tyyppi</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profiili</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profiilit</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Poista</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Lataa</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Hae</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Resoluutio:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Mikä tahansa</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Zoomaa</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Listanäkymä</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Kannet</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Ruudukkonäkymä</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Lisätietonäkymä</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Mukautettu</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Erikois kiitos</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Lisenssi</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Avustajat</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Playnite suljetaan…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Tänään</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Eilen</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Maanantai</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Tiistai</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Keskiviikko</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Torstai</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Perjantai</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Lauantai</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Sunnuntai</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Viime viikko</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Viime kuukausi</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Viime vuosi</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Yli vuosi sitten</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 – 100Mt</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100Mt – 1Gt</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1 Gt – 5 Gt</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5 Gt – 10 Gt</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10 Gt – 20 Gt</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20 Gt – 40 Gt</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40 Gt – 100 Gt</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100Gt tai enemmän</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Tuonti onnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Kaikki pelit</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Pelin tunnus</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Tietokannan tunnus</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Esiasetukset</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Sarake</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Sarakkeet</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Rivi</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Rivit</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Lataa vain puuttuva metadata</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Ottamalla tämän valinnan käyttöön metadataa ei ladata niille kentille, jotka jo sisältävät tietoa.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Pelikokoelma</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Valitse pelit jotka tulisi päivittää uudella metadatalla:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Kaikki tietokannan pelit</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Kaikki suodatetut pelit</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Vain valitut pelit</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Virallinen kauppa</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Valitse kentät jotka Playniten tulisi automaattisesti täyttää ja mitä lähteitä datan hakemiseen tulisi käyttää.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Parantaaksesi Playniten käyttämää dataa, harkitse yllä olevan logon klikkaamista ja osallistumista igdb.com-tietokannan päivittämiseen.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Ladataan metadataa…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Tuodaan asennettuja pelejä…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Tuodaan {0} pelejä…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Tuodaan emuloituja pelejä kohteesta {0}</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Ladataan kirjaston päivityksiä…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Haetaan kirjaston pelien koot…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Haetaan tuotujen pelien koot…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Kirjaston päivitys suoritettu</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Vapautetaan resursseja…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Määritys</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Asetukset…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Alustat ja emulaattorit</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Määritä emulaattorit…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Kirjaston hallinta…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Työkalut</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Lataa metatieto…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Ohjelmistotyökalut…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Integrointien muokkaus</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Avaa kolmannen osapuolen sovellus</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Kolmannen osapuolen sovellukset</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Päivitä kirjasto</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Peruuta kirjaston päivitys</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Päivitä emuloitujen pelien kansiot</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Lisää peli</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manuaalisesti…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Etsi automaattisesti…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emuloitu peli…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Storen sovellus</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Tietoja Playnitesta</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Lähetä palautetta</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Vaihda televisiotilaan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Linkit</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Ohjeet</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Tue Patreonissa</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK-dokumentaatio</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Käynnistä järjestelmä uudelleen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Sammuta järjestelmä</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Aseta järjestelmä valmiustilaan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Aseta järjestelmä horrostilaan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Valitse satunnainen peli</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Lisätietopaneelissa näytettävät kentät:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Kohteiden välistys</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Näytä ruudukkonäkymän kohteen taustakuva</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Ruudukon kohteen reunaviivan leveys</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Puuttuvan pelikuvakkeen lähde</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Puuttuvan kansikuvan lähde</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Puuttuvan taustakuvan lähde</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Pystysuora välistys pelin lisätietoihin</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Ruudukkonäkymän tietojen paikka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Pelilistan asema lisätietonäkymässä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Piirrä erotin paneelien väliin</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Pelin kansikuvan korkeus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Pelilistan kuvakkeen korkeus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Sovelluksen fontti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Monospace fontti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Suodatinpaneelin paikka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Selainpaneelin paikka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Kansitaiteen renderöinti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Kuvasuhdetavoite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Seuraavat asetukset vaikuttavat myös ruutujen esitykseen televisiotilassa!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Sovitustapa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD-laatikko</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Neliö</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam-juliste</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steamin pystysuuntainen kansikuva</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Käyttöönotto vaatii uudelleenkäynnistyksen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Asetukset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Yleiset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Yläpalkki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Ulkoasu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Pelin lisätiedot</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Asettelu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Lisäasetukset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Televisiotila</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Syöte</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Suorituskyky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Päivitetään</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Haku</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Varmuuskopio</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Varmuuskopioi Kirjaston Tiedot</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Palauta Tiedot Varmuuskopiosta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Tuo kirjaston muutokset automaattisesti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Virheellinen tietokannan sijainti, oikea polku vaaditaan.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Tunnuksen nimi ei voi olla tyhjä.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Lataa metadata pelien tuonnin jälkeen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Käynnistä Playnite pienennettynä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Käynnistä Playnite kun tietokone käynnistyy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Aloita ilmoitusalueelle suljettuna</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Playniten asettaminen koneen käynnistykseen epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Käynnistä kokoruututilassa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asynkroninen kuvan lataus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Parantaa rullauksen sujuvuutta pelilistoissa mutta hidastaa hieman kuvien lataamista.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Näytä pelin nimi jos kansitaide puuttuu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Näytä pelien nimet ruudukkonäkymässä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Himmennä pelit joita ei ole asennettu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Näytä pelien kuvakkeet lisätietonäkymässä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Näytä määrä ryhmien kuvauksissa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Näytä vain käytössä olevat kentät suodatin- ja selainpaneeleissa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Poista laitteistokiihdytys käytöstä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Käytä jos havaitset nykimistä tai muita käyttöliittymän ongelmia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Näytä piilotetut pelit pikakäynnistyslistoilla</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Vaikuttaa ohjelmaikonin listaan sekä ilmaisinalueen ikonin listaan.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Pikakäynnistysnimikkeiden määrä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Käytä pelin taustakuvaa ikkunan taustakuvana</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Sumenna tausta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Korkea laatu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Tummenna tausta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Näytä ruudukkonäkymässä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Teema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Teemaprofiili</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Televisiotilan teema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Televisiotilan teeman profiili</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Tietokannan sijainti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Kirjautumisen tila:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playniten asetukset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Tyhjennä välimuisti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Saattaa ratkaista ongelmia tunnusten linkittämisessä.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Näytä järjestelmäkuvake</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Pienennä Playnite ilmoitusalueelle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Pienennä Playnite ilmoitusalueelle kun sovellusikkuna on suljettu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Kun peli käynnistyy:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Kun peli sulkeutuu:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Päivämäärän esitystapa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Tämä kirjaa sinut ulos kaikista linkitetyistä palveluista. Sovellus pitää käynnistää uudelleen, haluatko jatkaa?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Tyhjennä välimuisti?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Playnite pitää käynnistää uudelleen teeman käyttöönottamiseksi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Hanki lisää teemoja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Luo uusi teema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Hanki lisää laajennuksia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Luo uusi laajennus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Auta meitä kääntämään Playnite muille kielille</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite pitää käynnistää uudelleen, jotta uudet asetukset tulevat voimaan. Käynnistä uudelleen nyt?\r\n\r\nUudelleenkäynnistys peruuttaa kaikki käynnissä olevat aktiiviset tehtävät (lataukset).</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Käynnistä Playnite uudelleen?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite ei voi siirtää kirjaston tiedostoja automaattisesti. Sinun pitää itse siirtää tai kopioida tiedostot ennen sijainnin vaihtamista. Jos kohdehakemistossa ei ole kirjastoa, sinne luodaan uusi kirjasto.\r\n\r\nTietokannan uusi sijainti ei tule käyttöön ennen kuin Playnite on käynnistetty uudelleen. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Peliaikaa ei kirjata jos &quot;Sulje&quot;-toiminto on asetettu.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Rivien määrä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Sarakkeiden määrä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Lisätietonäkymän rivien määrä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Näytä taustakuva pääruudussa</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Ei oteta takautuvasti käyttöön olemassa olevissa peleissä ilman että metadataa ladataan uudelleen.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Tuo kirjaston pelien peliaika:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Aina</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Vain äskettäin tuoduille peleille</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Ei koskaan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Ota peliohjaintuki käyttöön työpöytätilassa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Opas-näppäin avaa televisiotila</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Uusien tuotujen pelien metadatan automaattisen latauksen asetukset.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Kohdenäyttö</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Käytä aina päänäyttöä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Näytä pelien otsikot</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Näytä akun varaus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Näytä akun latausprosentti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Näytä kello</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Piilota kursori</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Asennettu vain pikasuodattimiin</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Painikekehotteet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Asettelu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Vaakasuuntainen vieritys</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Valitse yksi alakohdista</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Ei asetuksia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Asetusten lataus epäonnistui</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Nämä skriptit suoritetaan jokaiselle kirjaston pelille. Jokaiseen peliin voi liittää yksilöityjä skriptejä muokkaamalla pelin tietoja.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animoi taustakuvien siirtymät</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Kirjasinkoot</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automaattinen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Pehmentämätön</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Harmaasävy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ihanteellinen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Näyttö</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Tekstin muotoilutila</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Tekstin esitystila</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Tekstin esitys- ja muotoilutapoja ei tällä hetkellä käytetä pelien kuvausteksteihin.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Esilataa taustakuvat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Jos käytössä, Playnite lataa taustakuvat metatietoja ladatessaan, mikä vie enemmän levytilaa mutta kuvat voidaan näyttää myös offline-tilassa.\r\n\r\nJos ei käytössä, taustakuvat ladataan vain kun niitä ensimmäisen kerran tarvitaan, mikä vie vähemmän levytilaa, mutta taustakuvat saatetaan näyttää viiveellä eikä kaikkia kuvia ole välttämättä saatavilla offline-tilassa.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Sulje automaattisesti kolmannen osapuolen sovellukset pelin sammuttua</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Sovelluksen sammutuksen viive (sekunneissa)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Älä sulje, jos pelisessio on lyhyempi kuin (sekunneissa)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Sulje seuraavat sovellukset automaattisesti:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Sulje automaattisesti sovellukset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Tuo ohituslista</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Näytä varoitus kun ollaan liittämässä liian suurta peliä</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Hakemiston avauskomento</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Ensisijainen ikärajaorganisaatio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Päivitä pelien koot kirjaston päivityksen yhteydessä</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Hae ja päivitä pelien asennuskoot, jos havaitaan, että niiden tiedostot ovat muuttuneet viimeisen skannauksen jälkeen</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Ei mitään</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Täytä</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Yhtenäinen</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Täytä säilyttäen kuvasuhde</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Vasen</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Oikea</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Yläreuna</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Alareuna</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Tuontivirhe</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Todennus vaaditaan</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Todennus epäonnistui</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Vaihtoehtoinen webnäkymän renderöintitila</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\"></sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Metadatan tuonti</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Lataa metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Aseta valittu määritys käytettäväksi jatkossa ladattaessa mitä tahansa metadataa.\r\nVoidaan muuttaa myös sovelluksen asetuksista.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Emulaation tuontivelho</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Tämä ohjattu toiminto opastaa sinua konsoliemulaattorien lataamisessa ja tuomisessa sekä emuloitujen pelien tuomisessa.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Pidä mielessä, että voit aina lisätä emulaattoreita ja/tai pelejä jälkeenpäin päävalikon kautta \r\n(Kirjasto valikkon alta Emulaattori-asetuksista sekä &quot;Lisää peli&quot; valikosta emulaattoripelejä).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Alla on lista emulaattoreista, jotka Playnite voi tunnistaa ja konfiguroida automaattisesti. Voit ladata ja asentaa ne vierailemalla niiden verkkosivuilla. Kun olet asentanut emulaattorit, siirry seuraavaan ruutuun tuodaksesi ne Playniteen. Voit myös konfiguroida ja tuoda minkä tahansa emulaattorin myöhemmin konfiguraatiovalikon kautta.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Voit tuoda minkä tahansa tietokoneellesi asennetun emulaattorin painamalla &quot;Tunnista automaattisesti kansiosta…&quot; -nappia. Playnite etsii valitusta kansiosta tuntemiaan emulaattoreita ja tarjoaa mahdollisuuden tuoda ne. Voit tuoda useista kansioista käyttämällä em. nappia useamman kerran. Emulaattorit lisätään listan loppuun.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Voit tuoda pelejä painamalla &quot;Skannaa hakemisto käyttäen emulaattoria&quot; -nappia. Valitsemalla sopivan emulaattorin Playnite tietää minkä tyyppisiä tiedostoja sen pitää skannata ja tuoda. Voit tuoda useista kansiosta käyttämällä em. nappia useamman kerran. Pelit lisätään listan loppuun.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Emulaattoreita ei ole valittu tuontia varten. Et voi automaattisesti tuoda emuloituja pelejä ilman että määrität emulaattorit ensin. Haluatko varmasti jatkaa ja lopettaa tuontiprosessin?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Emulaattoreita ei ole määritetty Playnitessa. Et voi tuoda pelejä ilman että määrität emulaattorit ensin ja valitset sopivat tiedostotyypit. Haluatko lisätä joitakin emulaattoreita nyt?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Skannaa hakemisto käyttäen emulaattoria</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Valitse tiedostot</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Tunnista automaattisesti kansiosta…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Määritä emulaattorit…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Skannaus…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Skannataan {0}</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Ensimmäisen käynnistyksen määritys</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Tämä ohjattu toiminto opastaa sinua ulkopuolisten pelikirjastojen automaattisessa tuonnissa sekä määrittämisessä. Playnite voi automaattisesti tuoda pelejä useista pelipalveluista, kuten Steam tai GOG, sekä pitää kirjastosi ajan tasalla päivittämällä sen automaattisesti sovelluksen käynnistyksen yhteydessä.\r\n\r\nMuista, että voit aina manuaalisesti lisätä minkä tahansa pelin mille tahansa alustalle klikkaamalla päävalikon &quot;Playnite&quot;-nappia.\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Kirjastointegrointi</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Tuo pelejä automaattisesti oheisista palveluista. Myöhemmät muutokset peleihin (asennuksen tila) päivittyvät automaattisesti Playniten käynnistyessä tai manuaalisesti aloittaen. Valitut asetukset vaikuttavat ensimmäiseen ja kaikkiin myöhempiin tuonteihin.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Määritys suoritettu</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Esiasennus on nyt valmis. Muista, että myöhemmin voit vaihtaa kaikkia asetuksia 'Asetukset' valikosta.\r\n\r\nVoit myöhemmin myös lisätä minkä tahansa pelin painamalla Playnite-logoa.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Ladataan {0} integraatio</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Määritä alustat ja emulaattorit</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Määritä emulaattorit</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Alustat</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Alusta</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulaattorit</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulaattori</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Lisää alusta</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Valitse kuvake</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Valitse kansi</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Valitse kuva</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Valitse kohde</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Valitse tausta</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Valitse tiedosto</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Valitse URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Lisää emulaattori</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Tuetut alustat</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Haluatko tallentaa alustan muutokset?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Haluatko tallentaa emulaattorin muutokset?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Suoritettava ohjelma</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Muuttujat</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Työkansio</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Tuetut tiedostotyypit</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Tuo emulaattoreita…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Lataa emulaattoreita…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Lataa argumenttimallit tunnetusta emulaattoriprofiilista</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Haluatko varmasti poistaa {0} emulaattorin? \r\nSitä käyttää tällä hetkellä {1} peli(ä).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Haluatko varmasti poistaa {0} alustan? \r\nSitä käyttää tällä hetkellä {1} peli(ä) and {2} emulaattori(a).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Asetusten ohje</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Lajittele</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Järjestyssuunta</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Ryhmittele</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Nouseva</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Laskeva</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Älä ryhmittele</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Ryhmittele kirjaston mukaan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Ryhmittele kategorioittain</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Ryhmittele alustan mukaan</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Näkymätyyppi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Näkymä</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Selainpaneeli</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Suodatinpaneeli</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Kuvake</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Kirjaston Kuvake</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Kansikuva</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Taustakuva</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Järjestelynimi</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Kirjasto</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Käyttöopas</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nimi</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Asenna Asemalle</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Tilin nimi</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Alusta</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategoria</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Lajityyppi</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Julkaisupäivä</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Julkaisuvuosi</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Kehittäjä</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Tunniste</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Julkaisija</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Asennuksen tila</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Käytä kaikkia suodattimia</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Asennettu</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Asennettu</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Asentamatta</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Piilotettu</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Suosikki</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Viimeksi pelattu</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategoria</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Kuvaus</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Asennushakemisto</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Kansikuva</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Linkit</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Levykuva-, ROM- tai ISO-polku</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Lajityyppi</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Lajityypit</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Yritys</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Yritykset</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Kehittäjä</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Kehittäjät</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Julkaisija</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Julkaisija</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategoriat</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Tunniste</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Tunnisteet</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Ominaisuus</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Ominaisuudet</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Ikäluokitus</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Ikäluokitus</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Alue</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Alueet</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Lähde</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Lähteet</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Viimeaikainen toiminta</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Tietokantavirhe</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Ei voitu avata tietokantaa.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Tietokantaa ei ole avattu.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Pääsy kirjastotietokantaan ei onnistu. Tiedosto &quot;{0}&quot; on toisen prosessin käytössä tai pääsemättömässä sijainnissa.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Diagnostiikkapaketin luominen epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Automaattinen diagnostiikkapaketin lähettäminen epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Diagnostiikkatietojen lähetys onnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Ongelmanmäärityspaketti on luotu ja lähetetty onnistuneesti.\r\nLisää oheinen tunniste raporttiisi:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Pelejä ei voitu tuoda sijainnista {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Emuloituja pelejä ei voitu tuoda sijainnista {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Ei voida etsiä pelejä valitun emulaattoriprofiilin mukaan. Profiili ei sisällä tiedostopäätteitä tai alustoja.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playniten käynnistys epäonnistui. Sulje ohjelman kaikki muut esiintymät ja yritä uudelleen.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Teeman &quot;{0}&quot; käyttöönotto epäonnistui, väri profiili &quot;{1}&quot;\r\n \r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Linkkiä ei voida alita, URL ei ole oikeassa formaatissa.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Sovelluksen käynnistys epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Emulaattoreita ei voi tuoda puuttuvan tai viallisen määrittelytiedoston takia.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Valikkotoiminnon suorittaminen epäonnistui.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Muokkaa pelin tietoja</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Kuvan URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Lisää linkki</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Lisää ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Tallenna muutokset</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Lisää toiminto</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Poista toiminto</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Poista Pelaa-toiminto</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Lisää pelejä</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Skannaa hakemisto…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Havaitse asennetut</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Selaa…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Avaa Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Profiilin asetukset</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Pelin nimi ei voi olla tyhjä.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Pelin nimi ei voi olla tyhjä haettaessa metadataa.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Virheellinen pelidata</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Anna oikea URL-muoto alkaen http:// tai https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Valitse URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Tietojen lataaminen epäonnistui: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Latausvirhe</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Tyhjennä suodattimet</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Yksityinen tili</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Julkinen tili</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API-avain</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Käynnistyksen virhe</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Teeman virhe</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Tyhjennä kaikki</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Asennetaan</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Poistetaan</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Käynnistetään</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Suoritetaan</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Virheellinen osoite</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Älä tee mitään</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Pienennä</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Palauta ikkuna</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Sulje</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Muuta</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Edistynyt</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Ei koskaan</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Edistyminen</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Edistyminen</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Pisteesi</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Kriitikoiden pisteet</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Yhteisön pisteet</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Skriptit</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Liitännäiset</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Metadatan lähteet</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Laajennukset</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Laajennuksen tunnus</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Lataa skriptit uudelleen</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Kaikki skriptit on ladattu uudelleen onnistuneesti.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Hakua/suodatinta vastaavia pelejä ei löytynyt</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Nimikkeitä ei löytynyt</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Vaihda työpöytätilaan</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Poistu Playnitesta</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Kirjastot</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Päivitä kaikki</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Luoja:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versio:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Päivitetty:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Moduuli:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Kirjasto</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Tilastot</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Kaikki</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Ei mitään</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Ilmoitukset</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Leveys</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Korkeus</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Koko</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Pieni</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normaali</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Suuri</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Suurempi</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Suurin</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Oletus</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Valitse</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Valitse kaikki</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Poista kaikki valinnat</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Ensimmäinen</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Satunnainen</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Käyttäjän valinta</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Lataa lisää</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Läpinäkyvä</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Kutista</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Laajenna</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Kutista kaikki</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Laajenna kaikki</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Muut</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Teemat</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Emulaattorien argumentit</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Sisäänrakennetut parametrit</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Mukautetut parametrit</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Emulaattorin lisä-argumentit</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Ohita emulaattorien argumentit</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Pelaa-toiminto</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Valitse tuotava metadata</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Valitse tuotavat pelit</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Metadatan haku</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Päivitys saatavilla</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Muutokset edellisen päivityksen jälkeen</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Lataa ja asenna päivitys</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Tarkista päivitykset</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Päivitysvirhe</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Uuden version tarkistaminen epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Olet ajan tasalla.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Päivityksen lataaminen ja asentaminen epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Playniteen on saatavilla päivitys</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Lataa teemalista uudelleen</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Ota käyttöön valittu teema</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Seuraa tiedostomuutoksia</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Ota teema automaattisesti käyttöön kun lähdetiedosto muuttuu</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Skriptin suoritus</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Ennen pelin käynnistämistä suoritettava skripti</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Pelin sulkeutumisen jälkeen suoritettava skripti</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Pelin käynnistymisen jälkeen suoritettava skripti</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Suorita sovelluksen käynnistyessä</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Suorita sovellusta suljettaessa</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Suorita yleinen skripti</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Yleinen</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Suodatettu</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Ajantasainen</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Uusi</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Testaa komentosarja</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Tallenna oletukseksi</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Lisää suosikkeihin</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Poista suosikeista</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Piilota tämä peli</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Poista piilotetuista</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Muokkaa…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Laske asennuksen koko</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Asennuksen koko</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Aseta kategoria…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Aseta pelin edistymisen tila</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Poista</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Pelaa</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Asenna</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Pelin asetukset</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Lisätiedot</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Poista asennus</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Avaa asennuksen sijainti</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Luo pikakuvake työpöydälle</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Avaa käyttöopas</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Enemmän</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Kirjastoliitännäisen hallinnoima</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Pelin käynnistysprosessia hallinnoi pelistä vastaava kirjastoliitännäinen.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Määritellyltä sivulta ei löytynyt oleellista tietoa pelistä '{0}'.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Vihje: Voit käyttää edistyneempää metadatan latausprosessia muokatessasi yksittäisen pelin tietoja valikon &quot;Muokkaa&quot;-vaihtoehdon kautta.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Ei saatavilla kun jokin toiminto on käynnissä.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Kuvausteksti huomioi HTML-syntaksin</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Peliaika tallennetaan sekunneissa.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\"></sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Luku välillä 0 ja 100 tai tyhjä jos ei pisteytystä.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Ohjelmoinnissa, lokalisoinnissa ja muussa avustaneet, ei missään erityisessä järjestyksessä:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Peruuta pelin seuranta?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Asennuksen seuranta on käynnissä. Haluatko peruuttaa prosessin ja palauttaa pelin aiempaan tilaan?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Pelin suorittamisen seuranta on käynnissä. Haluatko peruuttaa prosessin ja palauttaa pelin aiempaan tilaan?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Pelattu aika</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Viimeksi pelattu</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minuuttia</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} sekuntia</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Ei pelattu</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Avataan työpöytätilaa…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Avataan televisiotilaan…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Ladataan pelikirjastoa…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Lasketaan asennus kokoa...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Lasketaan {0} asennus kokoa... </sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Skriptiä ei voitu asentaa.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Skriptin asentaminen onnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Asenna skripti</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Skriptivirhe</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Laajennuksen toiminnon suorittaminen epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Avaa metatietokansio</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Laske</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} -sovellusta ei ole asennettu.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} sovellus avautuu nyt. Kirjaudu sisään ja sulje sen jälkeen tämä viesti.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Odotetaan käyttäjän sisäänkirjautumista, sulje tämä kun olet valmis…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Pelin asennuskansiota ei löydy.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Virheellinen pelitoiminnon määritys.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Tilin synkronointiongelmien vianmääritys</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Ongelmien vianmääritys</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Nimeä uudelleen</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Lisää uusi kohde</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Anna nimi</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Syötä uusi nimi</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Alle tunti</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1-10 tuntia</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10-100 tuntia</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100-500 tuntia</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500-1000 tuntia</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite pitää käynnistää uudelleen asennuksen viimeistelyä varten. Haluatko käynnistää uudelleen nyt?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Laajennusta ei ole paketoitu oikein.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Teemaa ei ole paketoitu oikein.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Laajennuksen &quot;{0}&quot; oikein lataaminen epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Teeman &quot;{0}&quot; oikein lataaminen epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Laajennuksen oikein latautuminen epäonnistui.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Teeman oikein lataaminen epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Teema/Laajennus käyttää API-versiota, jota ei tueta.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Asennus onnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Asenna laajennus?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Yleinen</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Lisäosan &quot;{0}&quot; asennus epäonnistui.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Laajennuksen asennus epäonnistui.\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Haluatko asentaa uuden laajennuksen?\r\n\r\n{0}\r\nTekijä: {1}\r\nVersio: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Haluatko päivittää &quot;{0}&quot; -laajennuksen?\r\n\r\nNykyinen versio: {1}\r\nUusi versio: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Teeman asennus epäonnistui.\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Haluatko asentaa uuden teeman?\r\n\r\n{0}\r\nTekijä: {1}\r\nVersio: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Haluatko päivittää &quot;{0}&quot; -teeman?\r\n\r\nNykyinen versio: {1}\r\nUusi versio: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Olet poistumassa Playnitesta ja avaamassa seuraavaa verkkosivua oletussselaimellasi. Haluatko jatkaa?\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Valitut kuvat ovat niin suuria, että ne saattavat heikentää suorituskykyä. Erittäin suurien kuvien käyttö voi hidastaa käyttöliittymän vasteaikaa  sekä lisätä muistin käyttöä. \r\n\r\nSuurimmat suositellut mitat:\r\nKuvakkeet: {0} megapikseliä\r\nKansikuvat: {1} megapikseliä\r\nTaustakuvat: {2} megapikseliä</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Suorituskykyvaroitus</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Älä näytä uudelleen</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Tiedostopääte {0} ei ole yhteensopiva.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Virheellinen tiedostomuoto</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Valittu kuvatiedosto saattaa olla liian suuri optimi tehokkuuteen.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Haluatko varmasti poistaa valitun teeman asennuksen? Asennus poistetaan, kun sovellus käynnistyy seuraavan kerran.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Sisäänrakennettuja teemoja ei voi poistaa.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Tämä teema ei tue Playniten tämänhetkistä versiota.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Haluatko varmasti poistaa valitun laajennuksen asennuksen? Asennus poistetaan, kun sovellus käynnistyy seuraavan kerran.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Sisäänrakennettuja laajennuksia ei voi poistaa.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Tämä laajennus ei tue Playniten tämänhetkistä versiota.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Asennushakemisto</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Datahakemisto</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Luodaan diagnostiikkapakettia…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Lähetetään diagnostiikkapakettia…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Tuo tiedosto…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Mikä tämä on?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Haluatko varmasti tehdä tämän?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Pelattu aika</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Keskimääräinen peliaika</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Suurin peliaika</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Yleiskatsaus</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Sivupalkki</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Näytä sivupalkissa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Nollaa asetukset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Kaikki sovelluksen asetukset palautetaan oletuksiin, poislukien:\r\n- Tietokannan sijainti\r\n- Tuotujen poikkeuslista\r\n- Laajennusten asetukset, mukaan lukien kirjastointegroinnit\r\n    \r\nSovelluksen uudelleenkäynnistys vaaditaan. Haluatko varmasti nollata asetukset?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Kehittäjille</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Ulkoiset laajennukset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Anna täysi kansiopolku.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Saavutukset</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Keskustelupalsta</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Uutiset</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Kaupan sivu</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Alustava asennus ei ole valmis. Toiminnon viimeistelemiseksi Playnite käynnistyy nyt uudelleen työpöytätilassa.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Viimeksi pelatut</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Suosikit</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Eniten pelatut</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Kaikki</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Suodattimia on käytössä.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Suodattimia on käytössä.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Tulokset haulle:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Annettu nimi on jo käytössä.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Rajoita valinta nykyiseen suodattimeen</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Valitse toinen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Lisäosat...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Asennettu</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Laajennusten asetukset</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Selaa</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Päivitykset</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Päivitykset {0}</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Työpöytä-tilan teemat</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Televisiotilan teemat</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Etsitään...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Lisäosa ei ole yhteensopiva tämän Playnite-version kanssa</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Lisäosan asennuspaketin lataaminen epäonnistui</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Tämä lisäosa on ajoitettu asennukseen</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Asenna</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Poista asennus</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Jo asennettu</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Uusia lisäosien päivityksiä ei löytynyt.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Päivitä lisäosat</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Muutosloki ei saatavilla</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Ajoitettu asennettavaksi</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Lataus epäonnistui</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Lisenssi hylätty</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Ladataan {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Haetaan lisäosien päivityksiä…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Yksi tai useampi lisäosapäivitys saatavilla.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Valitse päivitettävät kohteet</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} Käyttöoikeussopimus</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Hyväksy</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Hylkää</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Valitse toiminto</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Linkki</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Tiedosto</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulaattori</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Komentosarja</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Oletus</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Prosessi</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Kansio</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Alkuperäinen prosessi</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Ei mitään</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Yhtenäinen</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Vain kohteet</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Vain alku ja loppu</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Tasainen vieritys</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Poista kohde?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Haluatko varmasti poistaa tämän kohteen?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Näytä painikkeet yläpalkissa:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Yleisasetukset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Ryhmittelyasetukset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Lajitteluasetukset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Suodata esiasetuksia</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Osanerottimen leveys</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Siirrä päämenu-painike sivupalkkiin</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Selainpaneeli</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Satunnainen pelinvalitsin</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Näyttää satunnaisen pelinvalitsimen</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Valitse satunnainen peli näkymästä</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Näytä hakukenttä koko ruudun tilassa</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Viimeisen 7 päivän aikana</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Viimeisen 31 päivän aikana</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Viimeisen 365 päivän aikana</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Yli 365 päivää sitten</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Konfiguroi</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Tallenna esiasetus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Pienennä pelin käynnistämisen jälkeen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Pienennä Playnite pelin käynnistyksen jälkeen.\r\n\r\nTämän asetuksen käytöstä pois ottaminen voi johtaa syötön ongelmiin peliä käynnistettäessä!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Fonttikoko</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Pieni fonttikoko</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Näytä kohteet päävalikossa:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Käännetty X/A pää näkymän nappuloiden sitominen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Vaihda pelin käynnistys ja pelin tiedot sivun napit keskenään.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Vain ensisijainen ohjain</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Opaspainike tuo Playniten esiin</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Käyttöliittymän äänenvoimakkuus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Tausta-äänenvoimakkuus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Mykistä kun taustalla</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Äänijärjestelmää ei voitu käynnistää.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Ulostulon rajapinta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Yleiset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Ulkoasu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Ääni</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Asettelu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Valikot</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Syöte</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} käynnistyy…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} on käynnissä…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Välilyönti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Kuvarenderöinnin skaalain</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Vaihtoehtoinen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Tasapainotettu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Laatu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Laadukas:\r\nParas kuvanlaatu, hidas, korkea muistikäyttö.\r\n     \r\nKeskitaso:\r\nHyvä kuvanlaatu, nopea, pieni muistikäyttö.\r\n    \r\nVaihtoehtoinen:\r\nParempi kuvanlaatu, keskitason nopeus, pieni muistikäyttö.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Valitse tiedosto…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Valitse kansio...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Aloituskomentosarja</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Huomioi että laajennukset ja teemat voivat vaikuttaa Playniten suorituskykyyn, vakauteen ja turvallisuuteen suuresti.\r\n \r\nJos ongelmia ilmenee teeman tai laajennuksen asentamisen jälkeen, kokeile poistaa ne käytöstä/poistaa niiden asennus nähdäksesi johtuuko ongelma niistä.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Valitse käynnistettäessä</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Valitse käynnistettäessä</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Sisäänrakennetut profiilit</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Sisäänrakennettu profiili</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Mukautetut profiilit</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Emulaattorin määritys</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Alustan määritys</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Alueen määritys</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Yhdistä yhdeksi peliksi</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Aseta alusta</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Aseta alue</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Skannaa kansio</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Skannaa emulaattorilla</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Kansion skannaus emulaattorille epäonnistui</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Kansioiden skannaus emuloiduille peleille epäonnistui</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Piilota tuodut</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Tuotavat profiilit:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Skannaa kokoonpanot automaattisesti</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Tallenna autoskannaavana kokoonpanona</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Skannaa alihakemistoista</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Skannaa arkistojen sisältä</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Lisää skanneri</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Lisää tallennettu skanneri</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Käynnistä skannaus</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Järjestäminen</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Käytä kaikille</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Muokkaa kenttiä</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Valitse kaikki / poista kaikki valinnat</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Avaa</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Aktivoi</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Aloita kirjoittaminen etsiäksesi pelejä… [F1] saadaksesi apua</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Sisällytä asentamattomat pelit</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Asentamattomat pelit jätetty pois</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Piilotetut pelit mukana</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Piilotetut pelit jätetty pois</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Käynnistä tai asenna</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Mene lisätietoihin</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Pelivalikko</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Muokkaa peliä</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Avaa haku</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Hakukenttä</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Hakupainike</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Ensisijainen pelin toiminto</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Toissijainen pelin toiminto</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL+F avaa yleisen haun hakukentän valinnan sijaan</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Haun tarjoajat</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Oletus avainsana</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Mukautettu avainsana</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Järjestelmän laajuinen pikanäppäin</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite haku</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Laajennuksen asetukset</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Poikkeukset</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Asetukset</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Haetaan lisäosan tietoja…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Metatietolähdettä ei ole saatavilla</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Pelivalikko</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/fr_FR.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Français</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Langue</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Quitter</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtre activé</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtre désactivé</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Autres filtres</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtres</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtre</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Données invalides</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Sauvegarder les modifications ?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Code source sur GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Créer un dossier de diagnostic</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Envoyer un dossier de diagnostic</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">À propos de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Créé par Josef Nemec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Attribuer une catégorie</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Définir les catégories</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Ajouter une catégorie</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Sélectionné - Attribue une catégorie\r\nNon sélectionné - Retire une catégorie\r\nIndéterminé - Aucun changement</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Sans catégorie</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Sans plateforme</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Oh non, quelque chose s'est mal passé…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Une erreur est survenue.\r\n        \r\nSi vous souhaitez nous aider à corriger ce problème, vous pouvez brièvement décrire ce que vous faisiez au moment du crash puis créer un dossier de diagnostic. Si vous êtes connecté à internet, le rapport généré sera automatiquement envoyé aux serveurs de Playnite pour être analysé.\r\n\r\nVous pouvez également cliquer sur le bouton 'Signaler un Crash' pour créer une nouvelle entrée dans GitHub et rédiger le rapport de crash manuellement. \r\n\r\nMerci de votre aide.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">L'extension &quot;{0}&quot; a causé une erreur critique.\r\n\r\nIl est recommandé de signaler ce problème au développeur de l'extension (via un fichier log) et de la désactiver si il devait persister.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">L'extension &quot;{0}&quot; a causé une erreur critique.\r\n\r\nIl est recommandé de signaler ce problème au développeur de l'extension et de la désactiver si il devait persister.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Une extension ou un thème a provoqué une erreur irrécupérable.\r\n\r\nNous vous recommandons de désactiver les modules complémentaires, d'isoler celui qui pose problème et de signaler le problème au développeur du module en question.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Une erreur est survenue.\r\n        \r\nSi vous souhaitez nous aider à corriger ce problème, veuillez créer un rapport de bug. Merci.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Désactiver l'extension</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Enregistrer le fichier log</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Envoyer les informations de diagnostic</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Signaler un plantage</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Redémarrer Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Redémarrer en mode sans échec</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Désactivation de tous les extensions tierces et activation du thème par défaut.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Quitter Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Activité au moment du crash (à rédiger en anglais) :</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Gestionnaire de bibliothèque</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Supprimer le(s) jeu(x) ?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Suppression impossible - le jeu ou l'installateur est en cours d’exécution.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Le jeu est en cours d'exécution et ne peut être désinstallé.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Êtes-vous sûr de vouloir supprimer {0} ?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Êtes-vous sûr de vouloir supprimer {0} jeux ?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Êtes-vous sûr de vouloir supprimer {0} ?\r\n\r\nL'ajout à la liste d'exclusion empêchera l'importation automatique du jeu concerné lors des prochaines mises à jour de la bibliothèque.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Êtes-vous sûr de vouloir supprimer {0} jeux ?\r\n\r\nAjouter les jeux supprimés à la liste d'exclusion d'importation préviendra leur ajout lors de la prochaine mise à jour de la bibliothèque.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Êtes-vous sûr de vouloir supprimer la ou les données ({0}) actuellement inutilisées ?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Aucune donnée inutilisée n'a été trouvée.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Oui (Ajouter à la liste d'exclusion)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">La section contient des modifications à enregistrer</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Mise à jour de la base de données...</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">La mise à jour de la base de données a échoué.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">La mise à jour de la base de données a échoué. {0} Mo d'espace libre requis.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Erreur de jeu</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Erreur : Impossible de démarrer le jeu. '{0}' n'a pas été trouvé dans la base de données.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Impossible de démarrer le jeu : {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Impossible d'exécuter l'action : {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Erreur : Impossible d'ouvrir l'emplacement du jeu : {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Impossible de détecter la taille de l'installation du jeu : {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Erreur lors de l'analyse de la taille d'installation</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Il y a eu {0} erreurs lors de l'analyse de la taille de l'installation</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Impossible de créer un raccourci : {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Impossible d'ouvrir le manuel : {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Erreur : Impossible d'installer le jeu : {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Impossible de désinstaller le jeu : {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Aucune action de démarrage valide n'a été trouvée. Lorsque vous utilisez des actions d'émulateur, assurez-vous que les définitions de la plateforme sont compatibles entre le jeu et la configuration de l'émulateur.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Fonction d'installation introuvable.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Le plugin responsable de ce jeu a été désactivé ou n'est pas encore installé.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Téléchargement des métadonnées officielles non disponible.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Aucun jeu sélectionné.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Échec de l'exécution du script de jeu.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Échec de l'exécution du script de jeu.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Échec de l'exécution du script global.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Échec de l'exécution du script pour l'émulateur.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Échec de l'exécution du script de jeu.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 ou plus récent n'est pas installé.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Impossible de déterminer une action de lancement.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Activé(e)</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Désactivé</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Supprimer</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Supprimer les données inutilisées</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Renommer</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Copier</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Ajouter</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Icône par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Jaquette par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Arrière-plan par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Terminer</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Suivant</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Retour</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">TERMINÉ</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">RET.</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">EFF.</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Effacer</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Ignorer</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Tout ignorer</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importer</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nom</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Auteur</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Module</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Série</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Version</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Dernière session</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Les plus joués</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Nombre de sessions</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Taille de l'installation</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Dossier</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notes</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Ajouté le</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Date d'ajout</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Modifié le</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Dernière modification</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Site internet</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Chemin</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Sauvegarder</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Fermer</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Annuler</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Confirmer</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Réinitialiser</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Oui</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Non</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Bienvenue</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Utilisateur local</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Général</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Média</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Liens</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Installation</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Actions</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Téléchargement...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Téléchargement des données...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Chargement…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Type</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profils</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Supprimer</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Télécharger</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Chercher</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Résolution :</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Indifférent</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Zoom</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Affichage en liste</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Pochettes</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Affichage en grille</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Affichage détaillé</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Personnalisé</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">Lien</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Remerciements</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licence</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Contributeurs</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Fermeture de Playnite...</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Aujourd'hui</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Hier</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Lundi</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Mardi</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Mercredi</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Jeudi</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Vendredi</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Samedi</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Dimanche</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Cette semaine</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Mois dernier</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Cette année</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Il y a plus d'un an</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0Mo à 100Mo</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100 Mo à 1 Go</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1 Go à 5 Go</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5 Go à 10 Go</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10 Go à 20 Go</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20 Go à 40 Go</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40 Go à 100 Go</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100Go ou plus</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Les informations ont été importées avec succès.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Tous</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Id jeu</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Id base de données</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Préréglages</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Colonne</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Colonnes</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Rangée</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Rangées</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Impossible de générer une icône à partir de cette action de lancement. Le fichier nécessaire n'est pas présent.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Télécharger uniquement les métadonnées manquantes</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Cette option ne téléchargera des métadonnées que pour les champs vides.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Sélection de jeux</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Veuillez sélectionner les jeux qui doivent être mis à jour avec les nouvelles métadonnées :</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Tous les jeux de la base de données</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Tous les jeux actuellement filtrés</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Le ou les jeux actuellement sélectionnés</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Aucun champ de métadonnées sélectionné</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Aucun champ de métadonnées n'est sélectionné pour le téléchargement. Veuillez en sélectionner au moins un, et activer au moins un fournisseur de métadonnées.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Magasin officiel</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Veuillez sélectionner les champs qui doivent être automatiquement remplis par Playnite et les sources à utiliser pour obtenir les données.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Vous pouvez cliquer sur le logo ci-dessus et contribuer à la mise à jour de la base de données igdb.com afin d'améliorer les données utilisées par Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Téléchargement des métadonnées...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importation des jeux installés…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importation depuis {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importation des jeux émulés depuis {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Téléchargement des mises à jour de la bibliothèque…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Analyse de la taille des jeux dans la bibliothèque…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Analyse de la taille des jeux importés…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Mise à jour de bibliothèque terminée</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Rechargement des ressources…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Configuration</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Paramètres</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Plateformes et émulateurs</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Configurer les émulateurs</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Gestionnaire de bibliothèque</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Utilitaires</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Télécharger les métadonnées</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Logiciels utilitaires</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Configurer les intégrations</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Ouvrir un client tiers</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Client tiers</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Actualiser les jeux</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Annuler la mise à jour de la bibliothèque</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Mettre à jour les dossier d'émulation</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Ajouter un jeu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manuellement</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Importer depuis une installation</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Importer des jeux émulés</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Application Microsoft Store</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">À propos de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Envoyer des Commentaires</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Basculer en mode plein écran</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Liens</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Aide</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Soutenir Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Soutenir sur Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Manuel utilisateur</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Documentation</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Redémarrer l'ordinateur</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Arrêter l'ordinateur</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Mettre en veille</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Mettre en veille prolongée</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Verrouiller le système</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Déconnexion de l'utilisateur</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Jouer à un jeu aléatoire</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Sélectionner les éléments à afficher :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Espacement</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Afficher le cadre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Largeur des bordures en mode grille</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Type d'icône par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Type de jaquette par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Image de fond par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Espacement vertical par rapport aux détails du jeu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Position des détails (affichage en grille)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Position de la liste (affichage détaillé)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Afficher un séparateur entre les panneaux</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Hauteur de la jaquette</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Hauteur des icônes (liste de jeux)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Police</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Police monospace</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Position du panneau de filtre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Position du panneau d'explorateur</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Propriétés de l'affichage en grille</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Format d'affichage</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Les options listées ci-dessous affectent également le mode Plein Écran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Mise à l'échelle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Boîtier DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Carré</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Bannière Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Pochettes verticales (Steam)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Redémarrage nécessaire</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Paramètres</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Général</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Panneau supérieur</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Apparence</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Détails</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Affichage</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Autres</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Plein écran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Manette</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Performances</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Métadonnées</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Mises à jour</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Recherche</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Sauvegarde</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Sauvegarder les données de la bibliothèque</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Restaurer une sauvegarde existante</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importer les modifications dans la bibliothèque automatiquement</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">L'emplacement du fichier de base de données n'est pas valide, le chemin de fichier correct doit être défini.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Le nom du profil ne peut pas être vide.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Télécharger les métadonnées automatiquement</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Minimiser la fenêtre au démarrage de l'application</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Lancer Playnite au démarrage de l'ordinateur</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Lancer Playnite et le réduire dans la barre d'état</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Impossible de lancer Playnite au démarrage de l'ordinateur.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Lancer Playnite en mode plein écran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Chargement d'image asynchrone</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Améliore la fluidité du défilement des listes de jeux en chargeant les images plus lentement.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Afficher le nom des jeux à la place des jaquettes manquantes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Afficher le nom des jeux dans le mode d'affichage en grille</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Assombrir les jeux non installés</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Afficher les icônes des jeux dans le mode d'affichage détaillé</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Afficher le nombre d'items dans la description des groupes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Afficher uniquement les champs utilisés dans l'explorateur/filtre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Désactiver l'accélération matérielle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Cocher cette option en cas de ralentissement ou de malfonctionnement de l'interface.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Afficher les jeux masqués dans la liste de lancement rapide</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Affecte les listes en mode barre des tâches et minimisé.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Nombre de jeux dans la liste de lancement rapide</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Utiliser les image de fond des jeux comme arrière-plan de fenêtre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Flouter les images de fond</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">HQ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Assombrir les images de fond</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Utiliser en mode d'affichage en grille</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Thème</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Profil du thème</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Thème plein écran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Thème plein écran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Emplacement de la base de données</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Statut de connexion :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Paramètres de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Effacer le cache Web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Peut résoudre les problèmes rencontrés lors de la liaison de profils.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Réduire dans la barre d'état</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Lorsque la fenêtre est minimisée</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Lorsque la fenêtre est fermée</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Lorsque le jeu démarre :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Lorsque le jeu se ferme :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Formater l'indicateur de temps de jeu pour afficher le nombre de jours joués.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Formats des dates :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Cela vous déconnectera de tous les services liés. Le redémarrage de l'application est requis, voulez-vous continuer ?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Vider le cache ?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Redémarrage nécessaire pour appliquer un nouveau thème</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Obtenir plus de thèmes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Créer un thème</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Obtenir plus d'extensions</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Créer une nouvelle extension</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Contribuer à la traduction</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Les paramètres modifiés nécessitent le redémarrage de l'application. Voulez-vous continuer ? (les tâches en cours d'exécution seront annulées)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Redémarrer Playnite ?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite ne déplace pas automatiquement les fichiers de la bibliothèque, vous devez les déplacer ou les copier avant que l'emplacement ne soit modifié. Si aucune bibliothèque n'existe dans l'emplacement cible, une nouvelle sera créée. \r\n\r\nLe nouvel emplacement de la base de données ne sera utilisé qu'après le redémarrage de l'application.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">La durée de la session ne sera pas enregistrée si Playnite est fermé après le lancement du jeu.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Nombre de rangées</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Nombre de colonnes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Nbr. de rangées (Détails)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Menu : Afficher les images de fond</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Ne peut s'appliquer rétroactivement (à moins de retélécharger les métadonnées).</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importer le temps de jeu de la bibliothèque :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Détermine la façon dont Playnite prend en compte le temps de jeu rapporté par les clients tiers. Le support de la récupération du temps de jeu par les extensions chargées de gérer les clients de jeu est nécessaire pour pouvoir utiliser cette fonctionnalité.\r\n\r\nToujours : Importe le temps de jeu lors de l'ajout initial et pour tous les jeux existants dans la base de données Playnite.\r\nInitialement : N'importe le temps de jeu que lors de l'ajout initial.\r\nJamais : N'importe jamais le temps de jeu.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Toujours</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Initialement</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Jamais</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Activer le support des manettes Xinput en mode bureau</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Le bouton Guide ouvre le mode plein écran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Choisir les paramètres de téléchargement automatique des métadonnées lors de l'importation d'un ou plusieurs jeux.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Affichage utilisé</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Toujours utiliser l'affichage principal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Afficher le nom des jeux</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Afficher l'état de la batterie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Afficher le pourcentage de batterie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Afficher l'heure du système</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Cacher le curseur</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Tri rapide : jeux installés uniquement</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Apparence des boutons</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Affichage</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Défilement Horizontal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Sélectionner une sous-section</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Aucun paramètre n'est disponible</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Impossible de charger les paramètres</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Ces scripts s'appliquent à l'ensemble de la bibliothèque. Des scripts supplémentaires peuvent être assignés individuellement en modifiant les propriétés des jeux désirés.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animer les transitions des images de fond</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Taille du texte</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automatique</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Aliasé</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Niveaux de gris</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Optimal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Affichage</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Formatage du texte</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Mode de rendu du texte</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Les options de rendu et de formatage du texte ne s'appliquent pas actuellement aux textes de description des jeux.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Précharger les images de fond</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Lorsque cette option est active, Playnite téléchargera les images de fond en même temps que le reste des métadonnées. Cela nécessitera davantage d'espace disque mais rendra les images de fond disponible lorsque vous êtes hors-ligne.\r\n\r\nSi cette option est désactivée, les images de fond ne seront téléchargées que lorsqu'elles sont sollicitées. Cela nécessitera moins d'espace disque mais les images de fond pourraient ne pas être disponibles lorsque vous êtes hors-ligne.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Fermer automatiquement les clients après la fin d'une session de jeu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Délai (en secondes) avant la fermeture du client :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Ne pas fermer après une session dont la durée (en secondes) est inférieure à :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Fermer automatiquement les clients suivants :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Fermeture auto.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Liste d'exclusion</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Notifier lorsqu'une image dépasse la taille recommandée</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Ouverture des répertoires par invite de commande</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Système d'évaluation d'âge requis par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Mettre à jour la taille d'installation des jeux lors de l'actualisation de la bibliothèque</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Lorsque cette option est activée, la taille des dossiers d'installation de jeux est mise à jour si des fichiers ont été modifiés depuis la dernière analyse.</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Aucune</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Remplir (étirement)</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Préserver le rapport largeur/hauteur</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Recadrer</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Gauche</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Droite</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Haut</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Bas</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Erreur d'importation</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Statut : Authentification requise</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Statut : Authentification échouée</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Mode de rendu web alternatif</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Peut résoudre certains problèmes avec les fenêtres web, telles que les fenêtres d'authentification.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Chargement partiel des descriptions de jeu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Les descriptions trop longues peuvent ralentir la sélection de certains jeux.\r\n\r\nLe chargement partiel permet d'alléger le chargement initial de la description, le reste étant chargé à la demande.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Importation de Métadonnées</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Télécharger les Métadonnées</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Définit un profil de téléchargement des métadonnées.\r\nPeut également être modifié dans le menu de paramètres.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Assistant d'importation d'émulation</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Cet assistant vous guidera à travers un processus de téléchargement et d'importation d'émulateurs de consoles de jeu. Il vous aidera également à importer les copies de sauvegarde de vos jeux à émuler.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Gardez à l'esprit que vous pourrez toujours ajouter des émulateurs supplémentaires et/ou des jeux plus tard via le menu principal (sous le menu &quot;Bibliothèque&quot; pour les paramètres de l'émulateur et le menu &quot;Ajouter des jeux&quot; pour les jeux émulés).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Voici la liste des émulateurs que Playnite peut reconnaître et configurer automatiquement. Vous pouvez les télécharger et les installer en visitant leur site Web. Une fois les émulateurs manuellement installés, vous pourrez  les importer via le menu de configuration.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Vous pouvez importer les émulateurs installés sur votre PC en cliquant sur le bouton &quot;Scanner un dossier&quot;. Playnite analysera le dossier sélectionné ainsi que ses sous-dossiers à la recherche d'émulateurs reconnus par l'application et vous permettra de les importer automatiquement. Vous pouvez importer à partir de plusieurs dossiers différents. Les émulateurs seront triés puis ajoutés au bas de la liste actuelle.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Vous pouvez importer des jeux en cliquant sur le bouton &quot;Scanner un dossier à l'aide d'un émulateur...&quot;. La sélection de l'émulateur indique à Playnite quels types de fichiers doivent être analysés et importés. Vous pouvez importer à partir de plusieurs dossiers différents. Les jeux seront triés puis ajoutés au bas de la liste actuelle.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Aucun émulateur n'est sélectionné pour l'importation. Vous ne pourrez pas importer automatiquement les jeux émulés sans d'abord configurer les émulateurs. Êtes-vous sûr de vouloir continuer et quitter le processus d'importation ?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Aucun émulateur n'est configuré dans Playnite. Vous ne pouvez pas importer de jeux sans d'abord configurer l'émulateur et les types de fichiers appropriés. Voulez-vous ajouter des émulateurs maintenant ?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Scanner un dossier à l'aide d'un émulateur...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Sélectionner les fichiers</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Scanner un dossier...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Configurer les émulateurs…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Balayage…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Analyse en cours {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Assistant de configuration</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Playnite peut importer des jeux à partir des clients que vous utilisez et mettre à jour votre bibliothèque de manière automatique.\r\n\r\nVous pouvez également ajouter des jeux ne dépendant d'aucun client en cliquant sur 'Ajouter un jeu' à partir du menu principal. Les profils de jeu personnalisés peuvent ensuite être assignés à n'importe quelle plateforme.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Configuration de la bibliothèque</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Importez automatiquement les jeux des services suivants. Tout changement ultérieur tel que l'installation ou l'activation d'un jeu sera automatiquement pris en compte au démarrage de Playnite ou lors d'une actualisation manuelle. Les paramètres sélectionnés affectent les importations initiales et ultérieures.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Configuration terminée</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Vous avez terminé la configuration initiale. N'oubliez pas que vous pouvez modifier la configuration des clients à tout moment via le menu 'Paramètres'\r\n\r\nDe nouveaux jeux peuvent être ajoutés en cliquant sur le logo de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Échec du téléchargement d'une ou plusieurs extensions.\r\n\r\nVous pouvez réessayer via le menu des extensions une fois la configuration initiale achevée.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Téléchargement de {0} intégration(s)…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Téléchargement de la liste d'intégrations recommandées…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Échec du téléchargement de la liste d'intégrations recommandées. Le téléchargement peut être réinitialisé via le gestionnaire d'extensions.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Configurer les plateformes et émulateurs</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Configurer les émulateurs</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Plateformes</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Plateforme</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Émulateurs</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Émulateur</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Ajouter une plateforme</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Sélectionner</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Sélectionner</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Sélectionner</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Sélectionner</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Sélectionner</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Sélectionner le Fichier</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Ajouter l'URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Ajouter un émulateur</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Plateforme(s) compatible(s)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Voulez-vous enregistrer les modifications de la plateforme ?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Voulez-vous enregistrer les modifications de l'émulateur ?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Exécutable</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Arguments</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Répertoire de travail</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Types de fichiers compatible</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importer des émulateurs…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Télécharger des émulateurs…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Charger les arguments prédéfinis à partir du profil d'émulateur connu</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">?Êtes-vous sûr de vouloir supprimer l'émulateur {0} ?\r\nIl est actuellement utilisé par {1} jeu(x).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Voulez-vous vraiment supprimer la plateforme {0} ?\r\nElle est actuellement associée à {1} jeu(x) et {2} émulateur(s).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Aide</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Tri</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Ordre de tri</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Regrouper par</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Ascendant</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Descendant</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Ne pas ordonner</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Ordonner par Bibliothèque</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Ordonner par Catégorie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Ordonner par Plateforme</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">&quot;Type d'affichage&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Affichage</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Explorateur</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Filtres</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Icône</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Icône de bibliothèque</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Jaquette</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Image de fond</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Nom de tri</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Bibliothèque</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manuel</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nom</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Disque d'installation</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Nom du compte</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Plateforme</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Catégorie(s)</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Genre(s)</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Date de sortie</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Année de sortie</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Développeur(s)</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Mot(s) clé(s)</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Éditeur(s)</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">État de l'installation</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Filtrage strict</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Si activé, seuls les jeux correspondant à tous les éléments de filtres seront inclus.\r\nSi désactivé, les jeux correspondant à au moins un élément de filtres seront inclus.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Installés</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Jeu installé</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Non installés</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Masqués</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favoris</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Activer le support HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Lorsque cette option est activée, le mode HDR sera activé sur l'affichage principal avant le démarrage d'un jeu.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Veuillez noter que le mode HDR est uniquement prise en charge par l'affichage principal.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Dernière activité</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Catégorie</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Description</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Répertoire d'installation</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Jaquette</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Liens</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Chemin de l'ISO/ROM</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Genre</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Genres</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Entreprise</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Entreprises</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Développeur</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Développeurs</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Éditeur</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Éditeurs</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Catégories</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Catégories</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Étiquettes</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Étiquette(s)</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Fonctionnalité</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Fonctionnalités</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">PEGI</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">PEGI</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Région</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Régions</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Source</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Sources</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Activité récente</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Erreur de la Base de Données</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Erreur : Impossible d'ouvrir la base de données de la bibliothèque.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">La base de données n'est pas ouverte.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Erreur : Impossible d'accéder à la base de données de la bibliothèque. Le fichier &quot;{0}&quot; est utilisé par un autre processus ou dans un emplacement inaccessible.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Erreur : Impossible de créer le dossier de diagnostic.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Impossible d'envoyer le dossier de diagnostic automatiquement .</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Le dossier de diagnostic a été créé et mis en ligne avec succès.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Le dossier de diagnostic a été créé et mis en ligne avec succès. Veuillez copier le numéro d'identification indiqué ci-dessous pour le communiquer lors de la rédaction de votre rapport de bug sur la page Github du projet (Catégorie : Issues).</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Echec de l'importation depuis {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Échec de l'importation depuis {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Impossible de rechercher des jeux par profil d'émulateur sélectionné. Le profil ne contient aucune extension de fichier ou plateformes.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite n'a pas pu démarrer. Veuillez fermer toutes les instances en cours et réessayer.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Échec de l'application du thème &quot;{0}&quot;, profil de couleur &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Impossible d'ouvrir le lien, l'URL n'est pas au format valide.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Impossible d'ouvrir l'application.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Échec de l'initialisation du composant de vue web. Playnite ne peut pas continuer le processus de démarrage.\r\n\r\nPlus d'informations sur https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Impossible d'importer des émulateurs, le fichier de définition d'émulateur n'existe pas.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Échec de l'exécution de l'action.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Modifier les propriétés</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL de l'image</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Ajouter un lien</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Ajouter une ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Enregistrer les modifications</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Appliquez les changements de champ au(x) jeu(x) en cours d'édition.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Ajouter une action</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Supprimer l'action</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Supprimer l'action</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Ajouter la sélection</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Scanner un dossier…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Détection automatique</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Parcourir…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Ouvrir Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Paramètres de profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Le nom du jeu ne peut pas être vide.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Le répertoire de l'action de jeu ne peut pas être vide.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Le nom du jeu ne peut pas être vide avant de rechercher des métadonnées...</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Données invalides</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Entrez une adresse URL commençant par http:// ou https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Ajouter l'URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Échec du téléchargement des métadonnées : {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Erreur de téléchargement</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Effacer les filtres</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Profil privé</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Profil public</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">Clé API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Erreur de démarrage</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Erreur de thème</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Tout effacer</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Installation en cours...</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Désinstallation en cours...</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Démarrage...</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">En cours d'exécution</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">URL invalide</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Ne rien faire</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimiser</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Restaurer</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Restaurer la fenêtre uniquement lorsque lancé depuis l'interface utilisateur</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Fermer</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Changer</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Avancé</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">[Indéterminé]</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Progression</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Progression</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Ma note</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Note presse</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Note communauté</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Scripts de jeu</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Scripts d'application</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Extensions</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Sources de métadonnées</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Extensions</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID de l'extension</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Actualiser les scripts</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Kit de développement interactif PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Scripts chargés avec succès.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Aucun jeu trouvé avec les critères spécifiés</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Aucun élément n'a été trouvé</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Retour au bureau</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Quitter Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Clients de jeu</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Tout mettre à jour</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Auteur :</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Version :</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Mis à jour le :</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Module :</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Bibliothèque</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistiques</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Tout</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Indéterminé</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Notifications</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Largeur</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Hauteur</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Taille</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Réduite</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normale</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Grande</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Très grande</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Maximale</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Sélectionner</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Tout sélectionner</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Tout désélectionner</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Premier</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Aléatoire</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Sélection de l'utilisateur</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Charger plus</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Transparent</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Réduire</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Développer</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Tout réduire</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Tout développer</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Autres</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Thèmes</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Arguments de l'émulateur</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Arguments par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Arguments personnalisés</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Arguments d'émulateur supplémentaires</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Outrepasser les paramètres de l'émulateur</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Action de lancement</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Sélectionner les métadonnées à importer</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Recherche de jeux</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Recherche de métadonnées</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Mise à jour disponible</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Nouveautés</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Installer la mise à jour</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Mises à jour</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Erreur lors de la mise à jour.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Erreur lors de la recherche.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Vous possédez déjà la dernière version de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Erreur lors de l'installation.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Une tâche de fond est en cours d'exécution. Voulez-vous l'annuler et continuer la mise à jour ?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Une tâche de fond est en cours d'exécution. Voulez-vous l'annuler et fermer Playnite ?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Une tâche de fond est en cours d'exécution. Voulez-vous l'annuler et changer de mode ?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Une nouvelle mise à jour est disponible</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Actualiser la liste des thèmes</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Appliquer le thème sélectionnée</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Actualiser les changements de fichiers</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Appliquer automatiquement le thème lorsque le fichier source change</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Exécution de script</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Exécuter avant le lancement du jeu</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Exécuter après avoir quitté le jeu</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Exécuter après le lancement du jeu</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Exécuter au démarrage de l'application</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Exécuter à l'arrêt de l'application</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Script de lancement</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Script post-lancement</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Script d'arrêt</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Exécuter le script global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Général</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Par filtre</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Actuelles</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Nouvelles</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Tester le script</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">N'afficher que les objets sélectionnés</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Enregistrer comme réglage par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Ajouter aux favoris</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Retirer des favoris</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Masquer la sélection</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Afficher dans la bibliothèque</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Activer le mode HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Désactiver le mode HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Modifier les propriétés…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Calculer la taille de l'installation</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Calculer la taille d'installation (tous les jeux)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Calculer la taille d'installation (uniquement les données manquantes)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Taille d'installation</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Définir des catégories…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Déterminer la progression</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Supprimer</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Jouer</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Installer</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Options</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Propriétés</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Désinstaller</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Ouvrir l'emplacement du jeu</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Créer un raccourci sur le bureau</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Ouvrir le manuel</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Détails</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Géré par le client</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Le client en charge de ce jeu est responsable du processus de lancement.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Pas d'informations pertinentes trouvées pour le jeu '{0}' sur la page spécifiée.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Conseil : Vous pouvez utiliser un processus de téléchargement des métadonnées plus poussé via l'option &quot;Modifier les propriétés&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Indisponible lorsqu'une action est en cours.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Le texte de description est sensible à la syntaxe HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Le temps de jeu est indiqué en secondes.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">La taille de l'installation est indiquée en octets.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">La date de sortie doit être indiquée selon le format &quot;année-mois-jour&quot;. L'indication du mois et du jour ne sont pas nécessaires.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Note entre 0 et 100.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Le développement de Playnite est soutenu par ces Patreon et membres Ko-fi :</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Code, traduction et autres contributions sans ordre particulier :</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Annuler monitoring ?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Le monitoring de l'installation est en cours, voulez-vous l'annuler ?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Le monitoring de l'exécution du jeu est en cours, voulez-vous l'annuler ?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Temps de jeu</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Dernière session</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}j {1}h {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minutes</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} secondes</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Non joué</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Retour au bureau…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Ouverture du mode plein écran…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Chargement de la bibliothèque…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Calcul de la taille d'installation…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Calcul de la taille d'installation de {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Impossible d'installer le script.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Le script a été installé avec succès.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Installer un script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Erreur de script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Impossible d'exécuter la fonction.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Ouvrir dossier de métadonnées</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Calculer</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Calcule automatiquement la taille de l'installation en utilisant les ROMs existantes ou le répertoire d'installation s'il a été indiqué.</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} le client n'est pas installé.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} Le client va maintenant démarrer. Veuillez vous identifier avant de fermer la fenêtre de connexion.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">(Fermer cette fenêtre une fois la connexion établie)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Dossier d'installation introuvable.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Configuration invalide.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Régler les problèmes de synchronisation</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Résolution des problèmes</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Renommer l'élément</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Ajouter un nouvel élément</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Saisir un nom</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Saisir un nouveau nom</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Moins d'une heure</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 à 10 heures</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 à 100 heures</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 à 500 heures</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 à 1000 heures</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite doit être redémarré pour compléter l'installation. Voulez-vous redémarrer maintenant ?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">L'extension n'a pas été archivée correctement.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Le thème n'a pas été archivé correctement.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">L'extension &quot;{0}&quot; ne s'est pas chargée correctement.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">L'extension &quot;{0}&quot; n'est pas supportée par cette version de Playnite et ne peut pas être chargée.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Le thème &quot;{0}&quot; ne s'est pas chargé correctement.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Le thème &quot;{0}&quot; n'est pas supporté par cette version de Playnite et ne peut pas être chargé.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">L'extension ne s'est pas chargée correctement.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Le thème ne s'est pas chargé correctement.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Thème/Extension utilise une version d'API non supportée.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">L'installation a réussi.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Installer l'extension ?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Divers</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Échec d'installation de l'extension &quot;{0}&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">L'installation de l'extension a échoué.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Souhaitez-vous installer une nouvelle extension ?\r\n\r\n{0}\r\nPar {1}\r\nVersion {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Souhaitez-vous mettre à jour l'extension &quot;{0}&quot; ?\r\n\r\nVersion actuelle : {1}\r\nNouvelle version : {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">L'installation du thème a échoué.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Souhaitez-vous installer un nouveau thème ?\r\n\r\n{0}\r\nPar {1}\r\nVersion {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Souhaitez-vous mettre à jour le thème &quot;{0}&quot; ?\r\n\r\nVersion actuelle : {1}\r\nNouvelle version : {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Vous êtes sur le point de quitter Playnite pour ouvrir la page web suivante à l'aide de votre navigateur par défaut. Voulez-vous continuer ?\r\n    \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">L'image ou les images sélectionnées pourraient être trop lourdes pour des performances optimales. Utiliser des images d'une trop grande résolution peut impacter la fluidité de l'interface et accroitre l'utilisation de la mémoire de manière significative.\r\n\r\nLes tailles maximales recommandées sont :\r\nIcônes : {0} px (hauteur)\r\nJaquettes : {1} px (hauteur)\r\nImages de fond : {2} px (hauteur)</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Avertissement de performances</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Ne plus afficher</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Le fichier ayant l'extension {0} n'est pas compatible</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Extension de fichier incompatible</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">L'image sélectionnée pourrait être trop lourde pour des performances optimales.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Voulez-vous désinstaller le thème sélectionné ? La désinstallation sera planifiée pour le prochain lancement de l'application.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Les thèmes par défaut ne peuvent être désinstallés.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Le thème sélectionné est incompatible avec la version actuelle de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Voulez-vous désinstaller l'extension sélectionnée ? La désinstallation sera planifiée pour le prochain lancement de l'application.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Les extensions par défaut ne peuvent être désinstallées.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">L'extension sélectionnée est incompatible avec la version actuelle de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Emplacement d'installation</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Emplacement des données</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Création du dossier de diagnostic...</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Envoi du dossier de diagnostic...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Importer un fichier...</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Qu'est-ce que c'est ?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Valider l'action en cours ?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Temps de jeu global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Temps de jeu moyen</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Temps de jeu le plus élevé</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Taille totale</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Vue d'ensemble</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Barre latérale</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Afficher dans la barre latérale</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Réinitialiser les paramètres</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Tous les paramètres de l'application vont être réinitialisés à l'exception de :\r\n- L'emplacement de la base de données\r\n- La liste d'exclusion d'importation\r\n- Les paramètres d'extension et des bibliothèques\r\n    \r\nL'application va redémarrer pour achever ce processus. Voulez-vous réinitialiser les paramètres ?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Développement</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Extension externes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Indiquer le chemin complet du dossier</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Succès</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Actualités</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Page du magasin</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">La configuration initiale n'est pas achevée. Playnite va maintenant redémarrer en mode Bureau pour continuer la procédure.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Joués récemment</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favoris</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Les plus joués</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Tous</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Des filtres sont actifs</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Des filtres additionnels sont actifs</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Résultats de la recherche :</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Ce nom est déjà utilisé par un autre élément.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Limiter la sélection au filtrage actuel</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Autre choix</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Gestionnaire d'extensions</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Installé(s)</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Paramètres des extensions</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Parcourir</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Mises à jour</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Mises à jour ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">La gestion des extensions et thèmes installés, y compris leurs paramètres, a été déplacée vers le gestionnaire d'extensions</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Les intégrations de bibliothèques actuellement installées peuvent être configurées ici.\r\n\r\nPour installer ou désinstaller des intégrations, utilisez le gestionnaire d'extension depuis le menu principal.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Thèmes (Bureau)</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Thèmes (Plein écran)</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Recherche en cours…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Cette extension n'est pas compatible avec cette version de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Échec du téléchargement du paquet de l'extension.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Échec du téléchargement du manifeste d'extension.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Un redémarrage est requis pour appliquer les paramètres.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Cette extension est en attente d'installation.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Installer</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Réinstaller</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Désinstaller</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Déjà installé</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Aucune mise à jour disponible</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Mettre à jour les extensions</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Notes de version indisponibles</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Installation planifiée</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Échec du téléchargement</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Licence rejetée</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Téléchargement en cours {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Recherche de mises à jour d'extensions…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Recherche de mises à jour du programme…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Une ou plusieurs mises à jour sont disponibles.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Sélectionner le ou les éléments à mettre à jour</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Instance de développement d'extension</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} Contrat d'utilisation</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Accepter</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Refuser</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Inclure les actions de lancement du client</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Sélectionner l'action</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Mode de suivi</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Chemin de suivi</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Délai de suivi initial</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Fréquence de suivi</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Lien</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Fichier</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Émulateur </sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Script</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Défaut</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Processus</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Dossier</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Processus originel</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Nom du processus</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Log</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Les modifications suivantes vont écraser les données pour tous les jeux sélectionnés !</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Aucun</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Items uniquement</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Début et fin uniquement</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Sensibilité du défilement</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Défilement fluide</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Vitesse d'animation</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Supprimer l'élément ?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Êtes-vous certain de vouloir supprimer cet item ?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Boutons à afficher dans le panneau supérieur :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Paramètres d'affichage</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Paramètres de regroupement</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Paramètres de tri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Filtres rapides</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Position des plugins</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Largeur des séparateurs</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Déplacer le bouton du menu principal vers la barre latérale</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Explorateur</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Jeu aléatoire</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Jeu aléatoire (Liste)</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Sélectionner un jeu aléatoire dans la liste/grillle</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Enregistrer les paramètres de tri et de regroupement</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Afficher comme filtre rapide en mode Plein Écran </sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Ces sept derniers jours</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Ces trente et un derniers jours</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Ces 365 derniers jours</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Il y a plus d'un an</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Configurer</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Enregistrer le Préréglage</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Réduire après le lancement du jeu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Réduit Playnite après le lancement du jeu.\r\n\r\nDésactiver cette option peut créer des problèmes de lancement avec certains jeux.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Taille de police</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Taille de police réduite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">Activer la prise en charge de l'API de la manette de jeu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Prise en charge des manettes de jeu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Si désactivé, Playnite n'acceptera aucune entrée de contrôleur de jeu.\r\n        \r\nDésactivez-le si vous utilisez des outils qui convertissent les entrées des contrôleurs de jeu en entrées de souris/clavier et que vous obtenez des entrées doubles dans Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Afficher les éléments dans le menu principal :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Inverser les boutons X/A</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Inverse l'attribution des boutons de lancement et d'affichage des propriétés du jeu.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Inverser les boutons A/B</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Inverse l'attribution des boutons de confirmation et d'annulation.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">N'autoriser que la manette principale</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Si cette option est activée, Playnite n'acceptera que les entrées de la manette principale.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Le bouton guide rétablit le focus du mode plein écran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Volume de l'interface</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Volume d'ambiance</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Rendre muet lorsque la fenêtre est en arrière-plan</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Échec de l'initialisation de l'interface audio.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Sortie audio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">Déterminer l'API utilisée pour la sortie audio. Modifier l'API peut résoudre certains problèmes de son.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Général</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Affichage</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Audio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Disposition</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Entrée</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} est en cours de lancement…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} est en cours d'exécution…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Majuscules</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Espace</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Mode de mise à l'échelle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alernatif</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Equilibré</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Haute qualité</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Haute qualité:\r\nGarantit la meilleur qualité mais peut être lent et utiliser beaucoup de mémoire.\r\n    \r\nÉquilibré:\r\nBon compromis entre qualité et performances.\r\n    \r\nAlternatif:\r\nQualité améliorée avec une pénalité minimale en termes de performances.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Sélectionner un fichier…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Sélectionner un dossier…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Script de lancement</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Veuillez noter que les thèmes et les extensions sont susceptibles d'affecter les performances, la sécurité et la stabilité de Playnite.\r\n    \r\nSi vous rencontrez des problèmes après l'installation d'un thème ou d'une extension, désactivez-les de façon à déterminer si ils peuvent en être la cause.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Choisir au démarrage</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Choisir au démarrage</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Profils intégrés</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Profil intégré</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Profils personnalisés</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Profil personnalisé</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Géré par un script pré-installé</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Spécifications de l'émulateur</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Spécifications de la plateforme</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Région</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Exécuter avant le lancement de l'émulateur</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Exécuter après le lancement de l'émulateur</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Exécuter après avoir quitté l'émulateur</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Exécutable de l'émulateur introuvable.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Spécifications de l'émulateur introuvables.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Le script lié au démarrage de l'émulateur est introuvable.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Séparer en plusieurs jeux.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Fusionner les jeux en un seul.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Indiquer la plateforme</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Indiquer la région</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Dossier d'analyse</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Configurations d'analyse</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Exclure les modèles de l'analyse de somme de contrôle</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Les fichiers correspondant au(x) motif(s) spécifié(s) ne seront pas analysés pour la somme de contrôle et seront comparés au nom du fichier. Voir la page d'aide de l'émulateur pour plus d'informations.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Émulateur d'analyse</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Un nom doit être indiqué pour enregistrer une nouvelle configuration.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">L'émulateur ou le profil d'émulateur n'est pas indiqué.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Le dossier n'est pas spécifié ou n'existe pas.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">La configuration de l'analyse n'est pas correctement paramétrée.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Inclure dans l'auto-scan global</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Échec de l'analyse des dossiers d'émulateurs.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Échec de l'analyse des dossiers de jeux émulés.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Ignorer les exécutables non reconnus</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Profils à importer :</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Configurations d'analyse</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Enregistrer le profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Enregistre la configuration pour une utilisation ultérieure. La configuration enregistrée peut être gérée depuis le menu de configuration des émulateurs.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Importer en utilisant des chemins relatifs\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Si possible, importez les fichiers du jeu en utilisant des chemins relatifs au dossier d'installation de Playnite ou au dossier d'installation de l'émulateur.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Analyser les sous-dossiers</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Analyser dans les archives</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Fusionner les fichiers liés</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Permet de fusionner les fichiers de jeu liés, tels que les disques multiples, dans une fiche de jeu unique.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Créer un profil d'analyse</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Ajouter un profil préexistant</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Lancer l'analyse</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Ajoute des configurations d'analyse aux émulateurs pour des dossiers spécifique. Assurez-vous que les émulateurs sont correctement configurés (via le menu de configuration des émulateurs) avant de lancer l'importation.</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Statut par défaut des jeux nouvellement ajoutés</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Statut des jeux lancés pour la première fois</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Échec de l'initialisation du script PowerShell. Il est recommandé aux utilisateurs de Windows 7 de (ré)installer PowerShell 5.1 pour résoudre ce problème.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Un préréglage portant ce nom existe déjà. Mettre à jour le préréglage avec les nouveaux paramètres ?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Remplissage automatique des noms de tri pour les jeux ajoutés ou modifiés par lots</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Les mots suivants seront ignorés lors de la génération de noms de tri automatique :</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Cette liste permet d'indiquer les premiers mots et lettres d'un nom de jeu que vous souhaitez ignorer lors du tri. &quot;The&quot;, &quot;An&quot; et &quot;A&quot; sont ignorés par défaut.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Ajouter un nom de tri à tous les jeux</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Tri</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Remplissage des valeurs du nom de tri…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Le service Nahimic a été détecté comme étant en cours d'exécution sur votre système. Ce service est connu pour causer de sérieux problèmes de rendu pour Playnite (et d'autres applications).        \r\n\r\nNous vous recommandons de le désactiver ou de le désinstaller complètement pour éviter ces problèmes.\r\n\r\nPlus d'informations sur https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite est actuellement exécuté en mode administrateur. Ce paramètre n'est pas recommandé pour cette application, car les privilèges administrateur attribués à Playnite s'appliquent à tous les jeux et applications lancés par son biais.\r\n\r\nPour plus d'informations : https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Alerter lorsque Playnite est exécuté en mode Administrateur</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Obtenir la taille réelle sur le disque lors du calcul de la taille des jeux</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Si activé, les scans seront plus lents et détemineront la taille réelle des fichiers sur le disque.\r\nSi désactivé, les scans seront plus rapides et utiliseront la taille indiquée par les fichiers.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Les extensions suivantes ont été signalées comme potentiellement problématiques, soit en raison d'un fort impact sur la stabilité/les performances, soit en raison de problèmes de sécurité. Nous vous recommandons fortement de les désinstaller :\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Exclure du scan les fichiers en ligne</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Les fichiers stockés sur le cloud ne seront pas analysés et importés s'ils ne sont pas disponibles localement.\r\nPris en charge uniquement pour : Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Scanner mais en utilisant une méthode simplifiée sans le contenu du fichier</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Les fichiers seront importés mais en utilisant une méthode moins précise qui ne nécessite pas que le contenu du fichier soit téléchargé et présent localement.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Appliquer à tout</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Ignorer l'état d'installation</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Indique à Playnite d'ignorer l'état d'installation (y compris le répertoire d'installation) défini par le plugin d'intégration responsable de l'importation du jeu.\r\n        \r\nCette option peut ne pas fonctionner correctement avec les plugins qui utilisent une méthode spécifique d'importation de jeu, à moins qu'ils ne prennent également en compte cette option de remplacement.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Manuellement</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Une fois par jour</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Une fois par semaine</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">A chaque démarrage</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Vérifier les mises à jour de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Vérifier les mises à jour d'extensions</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Mettre à jour les bibliothèques</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Analyser les dossiers d'émulation</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Inclure les jeux masqués</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Modifier les propriétés</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Sélectionner / Désélectionner tout</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Ouvrir</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Activer</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Attribuer</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Tapez ici pour effectuer une recherche… [F1] : Aide</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Commencer par # permet d'afficher une liste des commandes disponibles.\r\nCommencer par / permet d'affiche une liste des fournisseurs de recherche / plugins disponibles.\r\nTaper le mot clé de recherche puis appuyer sur ENTRÉE focalise le premier résultat suggéré.\r\n\r\nTAB : bascule entre les actions disponibles\r\nENTRÉE : active l'action en subrillance\r\nMAJ-ENTRÉE : ouvre le menu de l'élément sélectionné dans la liste ci-dessous</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Inclure les jeux non installés</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Inclure les jeux masqués</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Jeux non installés inclus</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Jeux non installés exclus</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Jeux cachés inclus</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Jeux cachés exclus</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Jouer ou installer</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Afficher</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Menu du jeu</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Modifier le jeu</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Lancer la recherche globale</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Barre de recherche</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Recherche globale</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Action de lancement principale</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Action de lancement secondaire</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F lance la recherche globale au lieu de focaliser la barre de recherche</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Enregistrer les paramètres de filtre de jeu entre les sessions de recherche</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Moteurs de recherche</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Mots-clé par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Mot-clé personnalisé</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Raccourci pour l'ensemble du système\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Recherche Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Paramètres de l'extension</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Exclusions</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Fichiers exclus lors de l'analyse du dossier</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Sous-dossiers exclus lors de l'analyse du dossier</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Ajouter un fichier à la liste d'exclusion</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Ajouter un dossier à la liste d'exclusion</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Les exclusions ne peuvent être ajoutées qu'aux configurations sauvegardées du scanner.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Les exclusions ont été ajoutées au scanner &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Remplacer la plateforme</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Lorsque défini, le scanner assignera cette plate-forme à tous les jeux, écrasant toutes les plateformes détectées automatiquement.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Inclure les commandes dans la recherche par défaut</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Lorsque cette option est désactivée, les commandes ne seront pas incluses dans la recherche par défaut jusqu'à ce que le préfixe # soit utilisé.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Activer la correspondance approximative dans la barre de recherche</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Lorsque cette option est activée, la barre de recherche utilisera le même mode de correspondance que la recherche globale.\r\nUne correspondance stricte peut être forcée au cas par cas en préfixant la recherche avec le caractère &quot;!&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Informations à afficher pour les résultats de recherche :</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Statut affiché/masqué</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">La sauvegarde des données a été annulée.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">La sauvegarde des données a échoué.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Erreur lors de la sauvegarde des données</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Sauvegarde des données en cours…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Restauration des données à partir de la sauvegarde…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Impossible de restaurer les données de sauvegarde.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Paramètres</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Bibliothèque de jeux</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Médias de la bibliothèque de jeux</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Extensions installées</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Données des extensions</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Thèmes installés</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Sélectionnez les données à restaurer à partir du fichier de sauvegarde spécifié.\r\n    \r\nPlaynite redémarrera automatiquement pour démarrer le processus de restauration de sauvegarde.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Sélectionnez les éléments à inclure avec la sauvegarde des données. Les paramètres de l'application et les données de la bibliothèque de jeu sont inclus par défaut.\r\n    \r\nPlaynite redémarrera automatiquement pour démarrer le processus de sauvegarde.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Sauvegarde automatique des données de l'application</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Fréquence de sauvegarde automatique</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Répertoire de sauvegarde</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Rotation des sauvegardes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Inclure des données supplémentaires :</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Le répertoire de sauvegarde doit être défini si la sauvegarde automatique est activée.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Afficher uniquement les notifications de correctifs</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Lorsque cette option est activée, seules les mises à jour de correctifs entraîneront une notification.\r\nIl n'y aura pas de notifications lorsqu'une mise à jour majeure est disponible.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Utiliser les dates relatives pour la semaine passée</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Utilisez des dates relatives au format &quot;Aujourd'hui&quot;, &quot;Hier&quot;, etc. si la date est inférieure à une semaine.\r\n    \r\nLe format de date spécifié sera utilisé pour toutes les autres dates.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Recherche d'images Web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Chaîne de recherche d'icône</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Chaîne de recherche de jaquette</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Chaîne de recherche d'image de fond</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Récupération des informations</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Aucune source de métadonnées n'est disponible</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Paramètres de l'action de lancement</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Utiliser les paramètres du scanner</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Sélectionner le profil au lancement</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Sélectionner l'émulateur au lancement</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automatique</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Toujours activer</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Laisser désactivé</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Support de la fonction narrateur (lecteur d'écran)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Menu d'applications</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Menu de jeu</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Dossier du programme</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Répertoire de l'utilisateur</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Une corruption a été détectée dans les fichiers de bibliothèque. Playnite va être fermé.\r\n    \r\nSi vous voyez ce message, veuillez ouvrir un ticket sur la page Github de Playnite et demandez un correctif pour la corruption de vos fichiers.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Voulez-vous enregistrer les modifications que vous avez apportées ?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Installation portable</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Aucune manette détectée</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/ga_IE.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\"></sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\"></sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\"></sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCToday\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\"></sys:String>\r\n    <sys:String x:Key=\"LOCMonday\"></sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCThursday\"></sys:String>\r\n    <sys:String x:Key=\"LOCFriday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSunday\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\"></sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameId\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\"></sys:String>\r\n    <sys:String x:Key=\"LOCPresets\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumn\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCRow\"></sys:String>\r\n    <sys:String x:Key=\"LOCRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\"></sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\"></sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\"></sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\"></sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCViewType\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\"></sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\"></sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\"></sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\"></sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\"></sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCChange\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCNever\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\"></sys:String>\r\n    <sys:String x:Key=\"LOCAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\"></sys:String>\r\n    <sys:String x:Key=\"LOCWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirst\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandom\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\"></sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpand\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOther\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\"></sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\"></sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\"></sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\"></sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\"></sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpen\"></sys:String>\r\n    <sys:String x:Key=\"LOCActivate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAssign\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/gl_ES.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Galego</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Lingua do Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Saír</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtro Activo</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtro deshabilitado</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Filtros adicionáis</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtros</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtro:</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Datos non válidos</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Gardar os cambios</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Páxina web en www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Código fonte en GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Crear paquete diag.</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Enviar información de diag.</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Sobre Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Feito por Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Adxudicar categoría</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Establecer categorías</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Engadir categoría</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Sinalado- Adxudicar Categoría\r\nNon Sinalado - Eliminar Categoría\r\nIndeterminado - Sen Trocos (ó editar múltiples xogos)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Sen categoría</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Sen plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">¡Ups! Algunha cousa foi mal…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Sucedeu un erro irrecuperábel.\r\n\r\nSe desexa axudarnos a solucionar este problema, expoña brevemente as accións feitas antes do error e logo envíe a información de diagnose. Se está en liña, o paquete cargarase no servidor de Playnite para a súa análisise.\r\n\r\nDoutro xeito, pode premer no botón 'Informar do Erro' para crear unha nova versión de GitHub e informar do erro a man.\r\n\r\nGracias pola súa axuda.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">A extensión &quot;{0}&quot; causou un erro irrecuperábel.\r\n\r\nAconsellamos gardar o arquivo de rexistro e informar do erro ó desenvolvedor da extensión. Se o erro segue a repetirse, deshabilite a extensión.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">A extensión &quot;{0}&quot; causou un erro irrecuperábel.\r\n\r\nAconsellamos que informe do erro ó desenvolvedor da extensión. Se o erro segue a repetirse, deshabilite a extensión.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Unha extensión descoñecida ou un tema causou un erro irrecuperable.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Producíuse un erro irrecuperábel.\r\n\r\nSe desexa axudarnos a corexir este erro, por favor envíe a información de diagnose. Moitas grazas.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Deshabilitar extensión</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Gardar arquivo de rexistro</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Enviar información de diagnose</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Reportar erro</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Reiniciar Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Reiniciar no Modo Seguro</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Deshabilitando todas as extensións de terceiros e empregando o tema predeterminado.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Saír do Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Accións feitas antes do erro (en Inglés)</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Administrador da biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Eliminar Xogo(s)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Non se pode eliminar - O xogo ou o instalador estase a executar</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Non se pode desinstalar - O xogo estase a executar</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Confirmas que queres quitar {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">¿Seguro que queres eliminar estos {0} xogos?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Confirmas que queres quitar {0}?\r\n\r\nSe seleccionas a opción &quot;engadir á lista de exclusións&quot;, o xogo non se volverá importar de novo a vindeira vez que se actualice a biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">¿Seguro que queres eliminar estos {0} xogos?\r\n\r\nSe escolles a opción &quot;Engadir á lista de exclusións&quot;, evitarase que o xogo se volva a importar a vindeira vez que se actualice a biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">¿Seguro que queres eliminar estas {0} entradas que non se están a usar?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Non se atoparon campos sen uso</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Sí (engadir á lista de exclusións)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Hai cambios sen gardar nesta sección.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Actualizando o formato da biblioteca dos xogos</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Fallou o actualizar a base de datos</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Non se pode actualizar a biblioteca. Necesítanse {0} MBs de espazo libre no disco.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Erro do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Non foi posíbel comezar co xogo. '{0}' non foi atopado na nosa base de datos.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Non foi posíbel comezar o xogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Non foi posíbel comezar a acción: '{0}'</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Non foi posíbel atopar o xogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Non se puido detectar o tamaño da instalación do xogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Erro ao analizar o tamaño da instalación</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Producíronse {0} erros durante a análise do tamaño da instalación</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Erro ó crear o atallo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Erro ó abrir o manual: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Non foi posíbel instalar o xogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Non foi posíbel desinstalar o xogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Non se atoparon accións de comezo de xogo válidas. Cando empregues accións do emulador, asegúrate de que as definicións da plataforma encaixan cas do xogo e a configuración do emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">A implementación da instalación no está dispoñible</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">O complemento da biblioteca responsable deste xogo está deshabilitado ou non instalado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">A descárrega de metadatos oficial non está dispoñíbel.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Ningún xogo foi seleccionado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Fallou a execución do script de accións do xogo.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Fallou a execución do script de accións do xogo.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Fallou a execución do script de accións global.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Fallou a execución do script do emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Fallou a execución do script de xogo.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">O PowerShell 3.0 ou máis novo non foi instalado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Non se puido determinar como comezar o xogo.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Habilitado</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Desactivado</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Eliminar</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Eliminar non empregados.</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Renomear</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Copiar</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Engadir</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Iconas por defecto</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Imaxe da cuberta por defecto</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Imaxe de fondo por defecto</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Rematar</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Seguinte</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Voltar</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">Feito</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">Voltar</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">LIMPAR</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Limpar</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Rexeitar</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Rexeitar todo</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importar</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nome</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor/a</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Módulo</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Series</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versión</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Último xogado</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Máis xogados</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Número de sesións de xogo</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Tamaño da instalación</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Cartafol</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notas</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Engadido</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Engadido na data</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Modificado</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Modificado na data</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Páxina web</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Camiño</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Gardar</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Pechar</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Cancelar</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Confirmar</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Restablecer</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Sí</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Non</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Benvido/a</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Usuario Local</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Xeral</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Medios</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Ligazóns</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Instalación</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Accións</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Descarregando...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Descarregando medios</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Cargando...</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Tipo</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Perfil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Perfís</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Eliminar</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Descarregar</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Procurar</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Resolución</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Calquera</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Zoom</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Vista de lista</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Cuberta</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Vista de Grella</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Vista de Detalles</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Personalizado</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">Ligazón</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Agradecementos especiais</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licenza</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Contribuíntes</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Saíndo do Playnite...</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Hoxe</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Onte</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Luns</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Martes</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Mércores</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Xoves</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Venres</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Sábado</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Domingo</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">A semana pasada</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">O mes pasado</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">O ano pasado</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Fai máis dun ano</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">De 0 a 100 MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">De 100 MB a 1 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">De 1 GB a 5 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">De 5 GB a 10 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">De 10 GB a 20 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">De 20 GB a 40 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">De 40 GB a 100 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100 GB ou máis</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">O proceso de importación completouse axeitadamente </sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Todos os xogos</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Id do Xogo</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Id. da base de datos</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Axustes predefinidos</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Columna</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Columnas</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Ringleira</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Ringleiras</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Non se puido obter a icona de acción de Play. Non hai ningunha acción de tipo de ficheiro presente.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Descarregar só os metadatos que fallan</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Activar esta opción evitará que os metadatos descarguen campos de datos que xa teñen esta información</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Selección de xogos</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Por favor, escolle qué xogos han de actualizarse con novos metadatos:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Todos os xogos da base de datos</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Todos os xogos filtrados na actualidade</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Só os xogos escollidos</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Tenda Oficial</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Por favor, escolle qué campos debe encher automáticamente Playnite y qué fontes empregar para obter os datos.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Por favor, considera premer no logo de enriba e contribuír con actualizacións á base de datos de igdb.com de xeito que se melloren os datos que usa Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Descargando metadatos…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importando xogos instalados</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importando xogos de {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importando xogos emulados de {0} ...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Descargando actualizacións da biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Analizando o tamaño dos xogos da biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Analizando o tamaño dos xogos importados…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Actualización da biblio rematada</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Liberando recursos...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Configuración</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Configuración...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Plataformas e emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Configurar emuladores...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Xestor de biblio...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Ferramentas</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Descargar metadatos...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Ferramentas de software…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Configurar integracións...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">\r\nAbre o cliente de terceiro</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Clientes de terceiros</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">\r\n\r\nActualizar a biblioteca de xogos</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Cancelar a actualización da biblio</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Actualizar cartafois emulados</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Engadir xogo</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manualmente…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Escanear automaticamente...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Xogo Emulado...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Aplicación Microsoft Store ...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Sobre Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Enviar suxestións</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Cambia ao modo de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Ligazóns</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Axuda</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Apoia en Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Apoyame en Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Manual do usuario</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Documentación do SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Reiniciar o sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Apagar o sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Suspender o sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernar o sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Sistema de bloqueo</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Pechar sesión de usuario</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Escolle un xogo ao chou</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Os campos do xogo que se amosarán no panel de detalles</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Espazo entre elementos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">\r\nDebuxa o fondo do elemento da reixa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Ancho do bordo do elemento da reixa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Falta unha fonte de icona do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Falta unha fonte da careta do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Falta a fonte de fondo do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Espazamento vertical dos detalles do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Posición de detalles da vista da reixa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Posición da lista de xogos á vista dos detalles</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Debuxa separador entre paneis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Altura da imaxe da portada do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Altura da icona da lista de xogos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Fonte da aplicación</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Fonte monoespazada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Posición do panel de filtro</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Posición do panel do explorador</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Renderizado da arte da portada </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Relación de aspecto obxectivo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">As seguintes opcións tamén afectan á representación de mosaicos no modo de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Modo de estiramento </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Caixa de DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Cadrado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Banner de Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Portada vertical de Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Require reinicio para aplicar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Axustes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Xeral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Panel superior</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Aparencia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Detalles do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Disposición</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Avanzado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Entrada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Rendemento</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadatos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Actualizando</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Procurar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Copia de seguridade</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Copiar de seguridade da biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Restaurar copia de seguridade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importar cambios na biblio automaticamente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">A localización do ficheiro de base de datos non é válida, debe establecerse unha ruta adecuada.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">O nome da conta non pode estar baleiro.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Descargar metadatos despois de importar xogos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Inicia Playnite minimizado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Inicia Playnite cando inicies o teu ordenador</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Comezar pechado na bandexa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Non se puido rexistrar Playnite para iniciarse cando se inicie o ordenador.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Inicie no modo de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Carga de imaxes asíncrona</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Pode mellorar a fluidez do desprazamento das listas de xogos a cambio de tempos de carga de imaxes máis lentos.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Mostra o nome do xogo se falta a portada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Mostra os nomes dos xogos na vista de cuadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Escurecer os xogos non instalados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Mostra as iconas do xogo na lista de vista de detalles</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Mostra o reconto de elementos nas descricións do grupo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Mostra só os campos seleccionados nos paneis de filtro e explorador</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Desactivar a aceleración de hardware</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Utilízao cando teñas problemas de rendemento ou de interface</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Mostra os xogos ocultos en listas de inicio rápido</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Afecta á barra de tarefas e ás listas minimizadas.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Número de elementos de inicio rápido</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Usa a imaxe de fondo do xogo como fondo da xanela</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Desenfoque de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Alta calidade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Escurecer o fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Mostrar na vista de cuadrícula</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Perfil do tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Tema de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Perfil do tema de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Localización da base de datos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Estado da sesión:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Configuración de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Borrar a caché web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Pode resolver os problemas que se atopan ao ligar contas.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Mostrar a icona da bandexa do sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimizar Playnite á bandexa do sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimiza Playnite á bandexa do sistema cando a xanela da aplicación estea pechada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Ao comezar un xogo:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Despois de pechar o xogo:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Dar formato ao tempo de xogo par indicar a cantidade de días xogados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Formatos de datas:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Isto pechará sesión en todos os servizos vinculados. é necesario reiniciar a aplicación, queres continuar?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Borrar a caché?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Requírese reiniciar Playnite cando cambie o tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Obtén máis temas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Crea un novo tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Obtén máis extensións</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Crear unha nova extensión</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Axúdanos a traducir Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite debe reiniciarse para aplicar a nova configuración. Reiniciar agora?\r\n\r\nAo reiniciar, cancelarase todas as tarefas activas (descargas) en curso.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Reiniciar Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite non pode mover os ficheiros da biblio automaticamente. Debes mover/copiar manualmente os ficheiros antes de cambiar a localización. Se non hai ningunha biblio na localización de destino, crearase unha nova.\r\n\r\nA nova localización da base de datos non se utilizará ata que se reinicie Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">O tempo de xogo non se rexistrará se se establece a acción &quot;Pechar&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Número de ringleiras</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Número de columnas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Número de filas na vista de detalle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Mostra a imaxe de fondo na pantalla principal</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Non se aplica aos xogos existentes sen volver descargar os metadatos.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importar tempo de xogo dos xogos da biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Configura cando debe importar Playnite o tempo de xogo reportado pólos plugins da biblioteca para xogos na base de datos de Playnite. Para poderes utilizar esta característica é necesario o soporte dos plugins da biblioteca a cargo de manexar os xogos.\r\n\r\nSempre: Importa o tempo de xogo para novos xogos importados e existentes na base de datos de Playnite.\r\nSó para os xogos recén importados: Importa tempo de xogo só para os novos xogos importados.\r\nNunca: Non se importa o tempo de xogo baixo ningunha circunstancia.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Sempre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Só para os xogos recén importados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Nunca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Activa a compatibilidade con controis no modo de fiestra</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">O botón guía abre o modo Pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Configuración de descarga automática de metadatos para xogos recentemente importados.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Pantalla de destino</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Use sempre a pantalla de principal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Mostrar títulos dos xogos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Mostra o estado da batería</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Mostrar a porcentaxe de batería</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Mostrar reloxo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Ocultar o cursor do rato</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Instalado só en filtros rápidos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Indicacións de botón</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Disposición</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Desprazamento horizontal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Seleccione unha das subseccións</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Sen axustes dispoñibles</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Errou o cargar os axustes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Estos scripts son executados por cada xogo da biblioteca. Os scripts individuais poden ser atribuidos a cada xogo por separado mentras se editan os detalles do xogo.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animar transicións das imaxes de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Tamaños de letra</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Auto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Suavizado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Escala de grises</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Pantalla</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Modo de formato de texto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Modo de renderizado de texto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Os métodos de renderización de texto e formato non se empregan actualmente para as descripcións dos xogos. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Precargar imaxes de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Se está activado,  Playnite transferirá as ilustracións de fondo cando descarga os metadados, empregando máis espazo de disco e tornando as ilustracións dispoñíbles sen conexión.\r\n \r\nSe está desactivado, as ilustracións de fondo serán descargadas só cando se necesiten a primeira vez, usando menos espazo, máis pode ocorrer que haxa atrasos antes de que a ilustración sexa mostrada e algunhas imaxes poden non estar dispoñibles cando non haxa conexión.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Pechar automáticamente o cliente de terceiros despóis de saír do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Retardo do peche do cliente (en segundos)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Non pechar despóis de sesións de xogo máis curtas que  (en segundos)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Pechar automáticamente os seguintes clientes:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Pechar clientes automáticamente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importar Lista de Exclusión</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Mostra aviso cando se asignen datos de xogos moi grandes</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Comando de apertura de cartafol</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Organización de clasificación por edade preferida</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Actualizar o tamaño da instalación dos xogos ao actualizar a biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Analiza e actualiza o tamaño da instalación dos xogos se se detecta que se modificaron os ficheiros desde a última análise</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Ningún</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Encher</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Uniforme para encher</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Esquerda</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Dereita</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Arriba</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Inferior</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Erro de importación</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Requírese autenticación</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Errou na autenticación</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Modo de redenderizado da vista web alternativo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Usar cando se teñan problemas cas vistas web, por exemplo, na integración dos diálogos de autenticación.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Carga parcial de descricións de xogos longas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">As descricións longas poden producir atrasos notables ao seleccionar xogos.\r\n\r\nSe se activa esta opción, só se cargará parte do texto da descrición cunha opción para cargar o resto se o escolles.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Importación de Metadatos</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Descargar metadatos...</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Usar configuración seleccionada para calquer descarga de metadatos futura.\r\nTamén pode cambiarse nas opcións da aplicación.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Asistente de Importación da Emulación</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Este asistente axudarache no proceso de descargar e importar emuladores de consolas e importar xogos emulados.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Ten conta de que sempre podes engadir despóis emuladores adicionáis e/ou xogos a través do menú principal (debaixo do menú  &quot;Bilbioteca&quot; nos axustes do Emulador e no menú &quot;Engadir Xogos&quot; para sogos emulados).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">A continuación móstrase unha lista de emuladores que Playnite pode recoñecer e configurar automaticamente. Podes descargar instaladores de emuladores dos seus sitios web. Unha vez que teñas os emuladores instalados (manualmente), podes importalos no diálogo de configuración do emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Podes importar calquera emulador que estea instalado no teu PC facendo clic no botón &quot;Detectar automaticamente desde o cartafol...&quot;. Playnite buscará no cartafol seleccionado calquera emulador coñecido e ofrecerá a opción de importalos. Podes usar este botón varias veces para importar emuladores de diferentes cartafois. Os emuladores engadiranse ao final da lista actual.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Podes importar xogos facendo clic no botón &quot;Escanear cartafol usando emulador&quot;. Ao seleccionar o emulador axeitado, Playnite saberá que tipos de ficheiros quere escanear e importar. Podes usar este botón varias veces para importar xogos de diferentes cartafois. Os xogos engadiranse ao final da lista actual.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Non hai emuladores seleccionados para importar. Non poderás importar automaticamente ningún xogo emulado sen configurar primeiro os emuladores. Estás seguro de que queres continuar e saír do proceso de importación?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Non hai emuladores configurados en Playnite. Non podes importar xogos sen antes configurar o emulador e seleccionar os tipos de ficheiro adecuados. Queres engadir algúns emuladores agora?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Escanear cartafol usando Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Seleccionar ficheiro</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Detecta automaticamente desde o cartafol...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Configurar emuladores...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Escaneando…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Escaneando {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Primeira configuración</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Este proceso guiarache a través dunha importación e configuración automáticas de bibliotecas de xogos externas. Playnite pode importar automaticamente xogos de varios servizos de xogos, como Steam ou GOG.\r\n\r\nTeña en conta que tamén pode engadir manualmente calquera xogo personalizado ou emulado para calquera plataforma máis tarde desde o menú principal.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integración de bibliotecas</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">De seguido móstranse algunhas das integracións de bibliotecas que Playnite soporta. Por favor, escolle as que queres instalar.\r\n\r\nPodes instalar máis integracións despóis dende o menú de &quot;Complementos&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Configuración finalizada</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">A configuración inicial completouse. Lembra que podes cambiar todas as opcións máis tarde, así como engadir integracións adicionais desde o menú principal.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Errou ó descargar unha ou máis extensións.\r\n\r\nPodes tentar de descargar as integración dende o menú de complementos despóis de que o asistente de inicio remate.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Descargando a integración de {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">A descargar a lista de integracións recomendadas…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Erro ao descargar a lista de integracións recomendadas. Podes tentar e redescargar as integracións máis adiante no menú de complementos.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Configurar plataformas e emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Configurar emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Plataformas</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Engadir plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Seleccionar icona</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Seleccione Portada</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Seleccionar imaxe</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Seleccionar elemento</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Seleccionar imaxe de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Seleccionar ficheiro</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Seleccionar unha URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Engadir emulador</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Plataforma(s) compatibles</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Queres gardar os cambios de plataforma?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Queres gardar os cambios do emulador?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Executábel</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumentos</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Directorio de traballo</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Tipos de ficheiros admitidos</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importar emuladores...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Descargar emuladores...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Cargar argumentos predefinidos do perfil do emulador coñecido</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Estás seguro de que queres eliminar o emulador de {0}?\r\nActualmente está a ser usado por {1} xogos.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Estás seguro de que queres eliminar a plataforma {0}?\r\nActualmente está a ser usado por {1} xogos e {2} emuladores.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Axuda de configuración</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Ordenar por</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Dirección da orde</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Agrupar por</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Ascendente</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Descendente</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Non agrupar</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Agrupar por biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Agrupar por categoría</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Agrupar por Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Tipo de vista</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Ver</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Panel de exploración</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Panel de filtros</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Icona</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Icona da biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Imaxe da portada</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Imaxe de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Nome para Ordenación</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manual</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nome</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Disco de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Nome da conta</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Categoría</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Xénero</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Data de lanzamento</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Ano de lanzamento</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Desenvolvedor</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Etiqueta</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Editora</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Estado da instalación</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Combina todos os filtros</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Se está activado, só se incluirán na vista os xogos que utilicen todos os elementos en todos os filtros.\r\nSe está desactivado, incluiranse na vista os xogos que utilicen calquera elemento de calquera filtro.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Non instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Oculto</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favorito</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Activar compatibilidade con HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Se se activa esta opción, activarase o HDR na pantalla principal antes de iniciar o xogo.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Ten en conta que a túa pantalla principal non admite HDR.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Última vez xogada</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Categoría</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Descrición</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Cartafol de Instalación</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Imaxe da portada</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Ligazóns</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Imaxe, ROM ou ruta ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Xénero</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Xéneros</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Compañía</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Compañias</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Desenvolvedor</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Desenvolvedores</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Editora</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Editoras</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Categoría</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Categorías</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Etiqueta</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Etiquetas</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Característica</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Características</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Clasificación por idade</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Clasificación por idade</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Rexión</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Rexións</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Orixe</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Orixes</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Actividade recente</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Erro na base de datos</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Fallou ó abrir a base de datos</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Non se puido abrir a base de datos.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Non se pode acceder á base de datos. O arquivo &quot;{0}&quot; está sendo usado por outro proceso ou atópase nunha locación inaccesible.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Erro ó crear o paquete de diagnose.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Erro ó enviar automáticamente o paquete de diagnose.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">A información de diagnose foi enviada con éxito.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">O paquete de diagnose creouse e foi enviado correctamente.\r\nPor favor, achegue o seguinte ID ó seu informe de erros:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Erro ó importar os xogos de {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Erro ó importar xogos emulados de {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Non se poden procurar xogos co perfil do emulador seleccionado. O perfil non contén extensións de arquivos ou plataformas.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite non puido iniciarse. Peche todas as demáis instancias e ténteo de novo.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Erro ó aplicar otema &quot;{0}&quot;, perfil de cor &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Non se conseguiu abrir a ligazón, a URL non está nun formato válido.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Non se puido iniciar a aplicación.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Errou ó inicializar o compoñente da vista web. Playnite non pode continuar co proceso de inicio.\r\n\r\nMáis información en https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Non se poden importar emuladores porque falta ou está danado un arquivo de definición.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Non se puido executar a acción do menú.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Editar detalles do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL da imaxe</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Engadir ligazón</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Engadir ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Gardar os cambios</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Aplica as cambios ao (s) xogo (s) que están a ser editado (s).</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Engadir acción</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Eliminar</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Eliminar Acción de Xogar</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Engadir xogos</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Escanear Carpeta…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Detectar Instalados</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Navegar…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Abrir Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Axustes do perfil</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">O nome da conta non pode estar baleiro.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">O directorio de seguemento de acción de xogo non pode estar valeiro.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">O nome do xogo non pode estar valeiro antes de procurar metadatos.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Información de xogo non válida</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Introduce unha URL válida que comece por http:// ou https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Escolle unha URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Fallou ó descargar os metadatos: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Erro ao descargar</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Limpar filtros</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Conta privada</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Conta pública</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">Chave API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Erro de inicio</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Erro de tema</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Borrar todo</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Instalando</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Desinstalando</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Lanzando</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">En execución</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">URL non válido</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Non facer nada</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimizar</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Restaurar xanela</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Restaurar a xanela só cando se inicia desde a IU</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Pechar</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Cambiar</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Avanzado</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Nunca</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Estado de finalización</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Estados de finalización</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Puntuación do usuario</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Puntuación da crítica</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Puntuación da comunidade</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Scripts de xogo</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Scripts da aplicación</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Complementos</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Fontes de metadatos</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Extensións</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID de extensión</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Recargar scripts</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">PowerShell SDK Interactivo</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Todos os scripts recargaronse correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Non se atoparon xogos para os criterios de busca/filtro especificados</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Ningún elemento atopado</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Cambia ao modo de escritorio</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Pechar Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Bibliotecas</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Actualizar todo</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Creado por:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versión:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Actualización:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Módulo:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Estatísticas</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Todos</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Ningún</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Notificacións</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Largura</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Altura</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Tamaño</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Pequeno</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Grande</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Máis grande</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">O máis grande</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Predefinido</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Escoller</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Seleccionalo todo</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Deseleccionar todo</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Primeiro</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Ao chou</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Selección de usuario</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Cargar máis</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Transparente</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Agochar</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Despregar</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Recollelo todo</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Expandilo todo</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Outro</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Temas</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Parámetros do Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Parámetros integrados</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Parámetros personalizados</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Parámteros do Emulador Adicionáis</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Sobreescribe os  Parámetros do Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Acción de Xogar</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Selecciona os metadatos para importar</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Seleccionar os Xogos para importar</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Procura de metadatos</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Actualización dispoñible</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Cambios dende a última actualización</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Descargar e instalar a actualización</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Buscar actualizacións</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Houbo un erro ao actualizar</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Error ó comprobar actualizacións.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Non se atoparon novas versións, estás ó día</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Errou ó descargar e instalar a actualización.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Algunha tarefa en segundo plano está en curso. Queres cancelalo e continuar coa actualización?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Algunha tarefa en segundo plano está en curso. Queres cancelalo e saír de Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Algunha tarefa en segundo plano está en curso. Cambiar de modo cancelará a tarefa, queres cambiala igualmente?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Hai dispoñible unha actualización para Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Volve a cargar a lista dos temas</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Aplica o tema escollido</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Ver os cambios dos arquivos</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Aplica o tema automáticamente cando o arquivo fonte cambie</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Tempo de execución do Script</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Executar antes de iniciar un xogo</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Executar despóis de saír dun xogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Executar despóis de iniciar un xogo</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Executar ó iniciar a aplicación</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Executar ó pechar a aplicación</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Script de iniciando xogo</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Script de xogo iniciado</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Script de xogo pechado</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Executar script global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrado</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Actual</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Novo</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Probar script</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Mostra só os artigos escollidos</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Gardar como predeterminado</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Engadir a favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Eliminar dos favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Ocultar este xogo</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Eliminar de Oculto</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Activar compatibilidade con HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Desactivar compatibilidade con HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Editar…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Calcular tamaño da instalación</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Calcular tamaño da instalación (tódolos xogos)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Calcular tamaño da instalación (só datos restantes)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Tamaño da instalación</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Establecer categoría…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Establecer estado de finalización</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Eliminar</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Reproducir</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Instalar</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Opcións do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Detalles</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Desinstalar</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Abre a localización de instalación</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Crear atallo no escritorio</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Abrir manual</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Máis</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Xestionado polo complemento da biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">O proceso de inicio do xogo será administrado polo complemento da biblioteca responsable deste xogo.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Non se atopou ningunha información relevante sobre o xogo '{0}' na páxina especificada.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Consello: podes usar un proceso de descarga de metadatos máis avanzado mentres editas un único xogo mediante a opción de menú &quot;Editar&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Non dispoñible cando unha acción está en curso.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">O texto da descrición é sensible á sintaxe HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">O tempo do xogo rexístrase en segundos.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">O tamaño da instalación está indicado en bytes.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">A data de lanzamento debe establecerse no formato &quot;ano-mes-día&quot;. Pódense omitir os valores de mes e día.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Valores entre 0 e 100 ou deixa en branco para indicar que non hai puntuación.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">O desenvolvemento de Playnite conta co apoio destes patrocinadores e membros de Ko-fi:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Código, tradutores e outros colaboradores sen orde en particular:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Queres cancelar o seguimento do xogo?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">A supervisión da instalación está en execución. Queres cancelar o proceso e devolver o xogo ao estado anterior?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">O seguimento da execución do xogo está en execución. Queres cancelar o proceso e devolver o xogo ao estado anterior?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Tempo xogado</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Última vez xogada</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0} d {1} h {2} min</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}min</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} Minutos</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} Segundos</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Non xogado</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Abrindo o modo de escritorio...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Abrindo o modo de pantalla completa...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Cargando biblioteca de xogos...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">A calcular o tamaño da instalación…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">A calcular o tamaño da instalación de {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Erro ao instalar o arquivo script.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">O script instalouse correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Instalar Script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Script con erro</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Produciuse un erro ao executar a función de extensión.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Abrir o cartafol de metadatos</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Calcular</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Calcula automaticamente o tamaño da instalación usando as ROM, se o xogo as ten, ou o directorio de instalación se está configurado</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">O cliente {0} non está instalado.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">O cliente {0} abrirase. Inicia sesión e pecha esta mensaxe.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Agardando pola verificación do usuario, por favor pecha esta xanela cando remates</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Non se atopou o cartafol de instalación do xogo.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Configuración de acción de xogo inválido.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Solución de problemas de sincronización da conta</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Solución de problemas</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Renomear o elemento</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Engadir novo elemento</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Introducir nome</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Introduce un novo nome</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Menos dunha hora</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 a 10 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 a 100 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 a 500 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 a 1000 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite debe reiniciarse para completar a instalación. Queres reiniciar agora?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">A extensión non está empaquetada correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">O tema non está empaquetado correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">A extensión &quot;{0}&quot; non se puido cargar correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Non se pode cargar a extensión &quot;{0}&quot;, a versión actual de Playnite non é compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">O tema &quot;{0}&quot; non se puido cargar correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Non se pode cargar o tema &quot;{0}&quot;, a versión actual de Playnite non é compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">A extensión non se puido cargar correctamente.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">O tema non se puido cargar correctamente.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">O tema/extensión está a usar unha versión da API non compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">A instalación foi exitosa.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">¿Instalar un complemento?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Genérica</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Erro ó instalar o complemento &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Non se puido instalar a extensión.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Queres instalar unha nova extensión?\r\n\r\n{0}\r\nPor {1}\r\nVersión {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Queres actualizar a extensión &quot;{0}&quot;?\r\n\r\nVersión actual: {1}\r\nNova versión: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Non se puido instalar o tema.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Queres instalar un novo tema?\r\n\r\n{0}\r\nPor {1}\r\nVersión {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Queres actualizar o tema &quot;{0}&quot;?\r\n\r\nVersión actual: {1}\r\nNova versión: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Estás a piques de saír de Playnite e navegar ata a seguinte páxina web usando o teu navegador web predeterminado. Queres continuar?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">As imaxes seleccionadas poden ser demasiado grandes para un rendemento óptimo. O uso de imaxes moi grandes pode provocar unha mala resposta da interface de usuario e un aumento do uso da memoria.\r\n\r\nResolucións máximas recomendadas:\r\nIconas: {0} megapíxeles\r\nPlacas frontales: {1} megapíxeles\r\nFondos: {2} megapíxeles</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Aviso de rendemento</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Non mostrar de novo</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">O ficheiro coa extensión {0} non é compatible.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Extensión de ficheiro incompatible</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">O arquivo da imaxe seleccionada pode ser demasiado grande para un rendemento óptimo.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">¿Está seguro de que desexa desinstalar o tema seleccionado? A desinstalación se pondrá en cola para o próximo inicio da aplicación.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Os temas predeterminados non se poden desinstalar.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Este tema non é compatible con esta versión de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Estás seguro de que queres desinstalar a extensión seleccionada? A desinstalación quedará en cola para o próximo inicio da aplicación.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Non se poden desinstalar as extensións predeterminadas.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Esta extensión non é compatible con esta versión de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Cartafol de Instalación</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Directorio de datos</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Xerando paquete de diagnóstico...</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Cargando paquete de diagnóstico...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Importar ficheiros</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Que é isto?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Estás seguro de que queres facelo?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Tempo total de xogo</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Tempo medio de xogo</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Tempo máximo de xogo</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Tamaño total da instalación</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Vista xeral</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Mostrar na barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Restablecer a configuración</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Toda a configuración da aplicación restablecerase á configuración predeterminada, excepto:\r\n- Localización da base de datos\r\n- Importar lista de exclusións\r\n- Configuración de extensións, incluíndo integracións de bibliotecas.\r\n    \r\nÉ necesario reiniciar a aplicación para rematar o proceso. Queres restablecer a configuración?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Para desenvolvedores</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Extensións externas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Introduza a ruta completa do cartafol.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Logros</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Foro</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Novas</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Páxina da tenda</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">A configuración inicial non está completa. Playnite reiniciarase no modo de escritorio para rematar o procedemento.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Xogado recentemente</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Máis xogados</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Todos</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Hai filtros aplicados.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Hai filtros adicionais aplicados.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Mostrando os resultados da busca de:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Xa existe un artigo co mesmo nome.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Limitar a selección ao filtro actual</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Escoller outro</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Complementos…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Configuración das extensións</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Explorar</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Actualizacións</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Actualizacións ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">A xestión das extensións e temas instalados, incluíndo as súas configuracións, moveuse ó novo menú &quot;Complementos&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Todas as extensións de integración de biblioteca instaladas actualmente poden ser configuradas aquí.\r\n\r\nSe queres instalar ou desinstalar integracións adicionáis, vai a opción &quot;Complementos&quot; do menú principal.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Temas de escritorio</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Temas de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">A buscar…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">O complemento non é compatible con esta versión do Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Errou ó descargar o paquete de instalación do complemento.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Errou ó descargar o manifesto de instalación do complemento.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Cómpre reiniciar a aplicación para aplicar as modificacións pendentes.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Este complemento está programado para a súa instalación.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Instalar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Desinstalar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Xa instalado</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Non se atoparon novas actualizacións de complementos.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Actualizar complementos</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Rexistro de cambios non dispoñible</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Instalación programada</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Erro na descarga</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Licenza rexeitada</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">A descargar {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Procurando actualizacións de complementos ...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Unha ou máis actualizacións de complementos están dispoñibles.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Selecciona artigos para actualizalos</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Instancia de desenvolvemento da extensión</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">Acordo da licenza de {0}</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Aceptar</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Rexeitar</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Incluír as accións de xogo da integración da biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Seleccionar acción</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Modo de rexistro</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Ruta do rexistro</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Atraso de seguimento inicial</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Frecuencia de seguimento</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Ligazón</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Ficheiro</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Script</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Predefinido</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Proceso</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Cartafol</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Proceso orixinal</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Rexistrar mensaxes de seguimento</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">As seguintes modificacións sobrescribirán os datos de todos os xogos seleccionados actualmente</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Ningún</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Só artigos</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Só inicio e fin</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Sensibilidade do desprazamento</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Desprazamento suave</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Velocidade de animación</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Queres eliminar o elemento?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Estás seguro de que queres eliminar este elemento?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Mostra os botóns no panel superior:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Configuración xeral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Configuración de agrupación</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Configuración de ordenación</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Filtros predefinidos</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Posición dos elementos do complemento</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Ancho divisor de sección</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Move o botón do menú principal á barra lateral.</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Panel de navegación</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Selector de xogos aleatorios</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Selector de xogo aleatorio de vistas</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Seleccionar xogo aleatorio da vista</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Garda a configuración de agrupación e clasificación</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Mostrar como filtro rápido no modo de pantalla completa</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Nos últimos 7 días</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Nos últimos 31 días</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Nos últimos 365 días</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Hai máis de 365 días</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Configurar</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Gardar preaxuste</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Minimizar despois de comezar o xogo.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Minimizar Playnite despois de comezar un xogo.\r\n\r\nDesactivar isto pode provocar problemas cos xogos que non reciban información de entrada ao inicio.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Tamaño da fonte</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">tamaño de fonte pequeno</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Soporte de controlador de xogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Se está desactivado, Playnite non aceptará ningunha entrada da interface XInput.\r\n\r\nDesactívao se estás a usar ferramentas que traducen XInput a entrada de rato/teclado e estás recibindo entrada dobre en Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Mostrar elementos no menú principal:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Botóns X/A invertidos na vista principal.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Cambia os botóns para iniciar un xogo e mostrar a páxina de detalles do xogo na vista principal.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Intercambiar a ligazón do botón de confirmación/cancelar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Inverte as ligazóns dos botóns A/B para confirmación e cancelación.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Só control primario</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Só acepta entradas do control principal cando estea activado.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">O botón Guía enfoca Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Volume de interface</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Volume de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Silenciar cando está en segundo plano</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Produciuse un erro ao inicializar a interface de audio.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API de saída</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API utilizada para a saída de audio. Cambia se tes problemas de son.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Xeral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Visuais</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Audio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Disposición</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menús</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Entrada</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} está comezando...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} está en execución...</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Maiúsculas</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Espazo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Escalador de representación da imaxe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternativo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Equilibrado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Calidade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Calidade:\r\nMellor calidade de imaxe, lento e alto consumo de memoria.\r\n\r\nEquilibrado:\r\nBoa calidade, rápido e baixo consumo de memoria.\r\n\r\nAlternativo:\r\nMellor calidade, velocidade media e baixo consumo de memoria.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Selecciona o ficheiro…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Selecciona o cartafol…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Script de inicio</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Tanto as extensións coma os temas poden afectar notablemente ao desempeño, a estabilidade e a seguranza de Playnite.\r\n\r\nSe empezas a ter problemas tras instalar un tema ou unha extensión, tenta desactivalo ou desinstalalo primeiro para ver se son a causa do problema.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Escoller ao inicio</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Escoller ao inicio</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Perfís integrados</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Perfil integrado</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Perfís personalizados</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Perfil personalizado</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Controlado por un script integrado</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Especificación do emulador</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Especificación da plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Especificación da rexión</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Executar antes de iniciar o emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Executar tras iniciar o emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Executar tras saír do emulador</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Executador do emulador non atopado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Especificación do emulador non atopada.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Script de inicio do emulador non atopado.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Dividir como xogos distintos</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Combinar nun só xogo</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Establecer plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Establecer rexión</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Analizar cartafol</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Analizar configuración</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Padróns de exclusión da análise da suma de verificación</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Os ficheiros que coinciden cos padróns especificados non se analizarán para a suma de comprobación e combinaranse por nome de ficheiro. Consulta a páxina de axuda do emulador, onde atoparás máis información.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Analizar co emulador</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Cómpre asignar un nome ao gardar unha configuración nova.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Non se estableceu o emulador ou o perfil do emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Non se especificou o directorio para a análise ou non existe.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">A configuración da análise non se establecer correctamente.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Incluír na análise automática en masa</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Erro ao analizar o cartafol para emuladores.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Erro ao analizar o cartafol de xogos emulados.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Ocultar importados</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Perfiles a importar:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Configuracións de análises automáticas</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Gardar como configuración de análise automática</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Garda a configuración para poder usala máis adiante durante a actualización de biblioteca. Podes xestionar as configuracións gardadas no menú &quot;Configurar emuladores&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Importar con rutas relativas</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Se é posible, importa os ficheiros dos xogos con rutas relativas ao cartafol de instalación de Playnite ou ao cartafol de instalación do emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Analizar subcartafois</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Analizar dentro de ficheiros</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Combinar ficheiros relacionados</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Combina os ficheiros de xogos rlacionados, como discos dun mesmo xogo, dentro dunha soa entrada.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Engadir analizador</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Engadir analizador gardado</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Iniciar análise</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Engadir as configuracións de análise con emuladores para analizar cartafois específicos. Asegúrate de que os emuladores están configurados correctamente antes de importar xogos (mediante o menú Biblioteca -&gt; Configurar emuladores).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Estado predefinido asignado a xogos recén engadidos</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Estado asignado aos xogos xogados por primeira vez</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Erro ao inicializar o tempo de execución do script de PowerShell. Se usas Windows 7, tenta (re)instalar PowerShell 5.1 para corrixir o problema.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">O filtro predefinido co nome especificado xa existe. Queres actualizar a predefinición con novos axustes?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Eliminaranse estas palabras do inicio do valor de nome de orde enchido automaticamente:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Usa isto para ignorar palabras ao inicio dunha cadea para a orde. Os valores predeterminados son &quot;The&quot;, &quot;An&quot; e &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Enche o nome de orde para xogos que non teñan un</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Orde</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">A encher os valores de nomes de orde…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Detectouse que o servizo Nahimic estase a executar no teu sistema. Este servizo é coñecido por causar problemas de renderizado no Playnite (e outras aplicacións).\r\n\r\nSe atopas algunha corrupción nos gráficos ou outros problemas de renderizado no Playnite, recoméndase deshabilitar ous desinstalar completamente  o servizo de Nahimic.\r\n\r\nMáis información en https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite está a executarse con privilexios elevados (como administrador). Non é recomendábel porque outorga privilexios elevados a todas as extensións instaladas e a todos os xogos e aplicacións iniciados desde Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Amosar advertencia se Playnite está a executarse con privilexios elevados</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Obter o tamaño real no disco ao calcular o tamaño dos xogos</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Se se activa esta opción, as análises serán máis lentas e obterase o tamaño real dos ficheiros no disco.\r\nSe se desactiva, as análises serán máis rápidas e usarase o tamaño dos propios ficheiros.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Os seguintes complementos foron reportados como potencialmente problemáticos, ben por un alto impacto na estabilidade ou rendemento, ben por problemas de seguridade. Recomendamos fortemente a súa desinstalación:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Excluír ficheiros de internet da análise</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Os ficheiros almacenados en almacenamento na nube non se analizaran e importarán se non están dispoñíbeis localmente.\r\nSó se admite para Google Drive, Dropbox e OneDrive.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Analizar mais cun método simplificado sen o contido do ficheiro</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Os ficheiros importaranse mais cun método menos preciso que non require que se descargue o contido dos ficheiros para que estea presente localmente.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Aplicar a todo</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Sobrescribir o estado da instalación</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Ao establecer esta opción, Playnite ignorará o estado da instalación (incluído o directorio da instalación) establecido polo complemento de integración que importa o xogo.\r\n\r\nÉ posible que esta opción non funcione completamente con complementos que usan métodos de importación de xogos específicos a menos que tamén teñan en conta esta opción de sobrescritura.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Só manualmente</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Diariamente</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Semanalmente</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">En cada inicio</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Comprobar actualizacións do programa</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Comprobar actualizacións de complementos</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Actualizar bibliotecas</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Analizar cartafois de emulación</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Incluír xogos ocultos</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Editar campos</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Seleccionar todo ou cancelar a selección de todo</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Abrir</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Activar</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Asignar</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Comeza a escribir para buscar xogos… Preme [F1] para ver a axuda</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Se escribes #, mostrarase unha lista de comandos dispoñibles.\r\nSe escribes /, mostrarase unha lista de complementos ou fornecedores de busca dispoñibles.\r\nSe escribes unha palabra clave de busca e terminas cun espazo, cambiarase automaticamente a esa busca.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Incluír xogos desinstalados</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Incluír xogos ocultos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Xogos desinstalados incluídos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Xogos desinstalados excluídos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Xogos ocultos incluídos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Xogos ocultos excluídos</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Xogar ou instalar</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Ir aos detalles</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Menú do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Editar xogo</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Abrir a busca</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Cadro de busca</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Botón de busca</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Acción principal do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Acción secundaria do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">Ctrl+F abre unha busca global en lugar de pasar o foco ao cadro de busca</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Gardar a configuración de filtro de xogos entre sesións de busca</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Fornecedores de busca</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Palabra clave predefinida</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Palabra clave personalizada</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Atallo global do sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Busca de Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Axustes da extensión</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Exclusións</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Ficheiros excluídos relacionados co cartafol da análise</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Cartafois excluídos relacionados co cartafol da análise</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Engadir ficheiro á lista de exclusión</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Engadir cartafol á lista de exclusión</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Só se poden engadir exclusións a configuracións do analizador gardadas.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Engadíronse exclusións ao analizador &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Sobrescribir plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Ao establecer esta opción, o analizador asignará esta plataforma a todos os xogos e sobrescribirá as plataformas detectadas automaticamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Incluír comandos na busca predefinida</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Se se desactiva esta opción, non se mostrarán comandos na busca predefinida a menos que se use o prefixo #.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Usar coincidencias parciais no filtro de nomes</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Se se activa esta opción, o filtro de nomes atopará nomes de xogos do mesmo modo que a busca global.\r\nA coincidencia estrita pode aplicarse en casos individuais se comezas o filtro co carácter !.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Campos que se amosarán para resultados de xogos:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Estado oculto</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Cancelouse a copia de seguranza dos datos.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Erro na copia de seguranza dos datos.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Erro na copia de seguranza dos datos</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Copia de seguranza dos datos en curso…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">A restaurar datos dunha copia de seguranza…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Erro ao restaurar datos dunha copia de seguranza.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Axustes</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Biblioteca de xogos</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Ficheiros multimedia da biblioteca de xogos</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Extensións instaladas</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Datos de extensións</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Temas instalados</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Selecciona os datos que queres restaurar do ficheiro de copia de seguranza especificado.\r\n\r\nPlaynite reiniciarase automaticamente para iniciar o proceso de restauración da copia de seguranza.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Selecciona artigos que se incluirán na copia de seguranza dos datos. Os axustes de aplicacións e os datos da biblioteca de xogos están incluídos de modo predefinido.\r\n\r\nPlaynite reiniciarase automaticamente para iniciar o proceso de copia de seguranza.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Copia de seguranza automática dos datos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Frecuencia da copia de seguranza automática</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Cartafol da copia de seguranza</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Copias de seguranza rotativas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Incluír datos adicionais:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Cómpre establecer o cartafol da copia de seguranza se está activada a copia de seguranza automática.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Mostrar notificacións só para a publicación de correccións</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Se se activa esta opción, só se notificará a publicación de actualizacións para a versión principal instalada actualmente.\r\nAs novas versións principais non xerarán unha notificación de actualización.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Usar datas relativas para a semana anterior</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Usar datas relativas en formato de &quot;hoxe&quot;, &quot;onte&quot;, etc. se a data é de hai menos dunha semana.\r\n\r\nO formato de data especificado usarase para todas as outras datas.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Busca de imaxes en internet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Cadea de busca de imaxes de iconas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Cadena de busca de imaxes de portadas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Cadea de busca de imaxes de fondo</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">A obter información do complemento…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Non hai ningunha fonte de metadatos dispoñible</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Axustes da acción de xogo</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Usar axustes do analizador</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Seleccionar perfil ao inicio</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Seleccionar emulador ao inicio</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automático</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Sempre activado</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Sempre desactivado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Compatibilidade coa accesibilidade (lector de pantalla)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Menú da aplicación</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Menú do xogo</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Cartafol do programa</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Directorio dos datos de usuario</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Detectouse un ficheiro da biblioteca danado, polo que Playnite vai pecharse.\r\n\r\nAbre un problema na páxina de GitHub de Playnite e solicita que se arranxe o problema cos teus ficheiros.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Queres gardar os cambios realizados?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Instalación portátil</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Non se detectaron controladores</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/he_IL.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">עברית</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">שפת התצוגה של Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">יציאה</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">סינון פעיל</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">מסנן כבוי</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">מסננים נוספים</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">מסננים</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">מסנן</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">מידע שגוי</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">לשמור שינויים?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">אתר הבית ב www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">קוד המקור ב github</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">צור חבילה דיאגנוסטית</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">שלח מידע דיאגנוסטי</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">אודות פליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">נוצר על ידי Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">הצמד קטגוריה</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">הגדר קטגוריות</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">הוסף קטגוריה</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">מסומן - קטגוריה מוקצת\r\nלא מסומן - הסר קטגוריה\r\nביניים - ללא שינוי (בעריכה של מספר משחקים)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">אין קטגוריה</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">אין פלטפורמה</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">אופס! משהו השתבש…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">קרתה שגיאה שלא ניתנת לתיקון.\r\n        \r\nאם ברצונך לעזור לנו לתקן את הבעיה, אנא תאר בקצרה את הפעולות שנעשו לפני הקריסה ולאחר מכן שלח מידע אבחוני. אם אתם מקוונים, האבחון יועלה לשרתי פליינייט לבדיקה.\r\n\r\nניתן גם להשתמש בכפתור &quot;Report Crash&quot; ליצירת באג חדש בGitHub ולדווח על הקריסה באופן ידני.\r\n\r\nתודה על העזרה.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">ההרחבה &quot;{0}&quot; גרמה לשגיאה שלא ניתנת לתיקון.\r\n\r\nאנו ממליצים לשמור את קובץ הלוג ולדווח על הבעיה למפתח ההרחבה. אם הבעיה ממשיכה להופיע שוב, השבת את ההרחבה.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">ההרחבה &quot;{0}&quot; גרמה לשגיאה שלא ניתנת לתיקון.\r\n\r\nאנו ממליצים לדווח על הבעיה למפתח ההרחבה . אם הבעיה ממשיכה להופיע שוב, השבת את ההרחבה.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">הרחבה לא ידועה או ערכת נושא גרמו לשגיאה שלא ניתנת לתיקון.\r\n\r\nאנו ממליצים להשבית הרחבות של צד שלישי, לבודד את הבעייתית ולדווח על הבעיה למפתח ההרחבה.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">אירעה שגיאה שלא ניתנת לתיקון.\r\nאם ברצונך לעזור לנו לתקן את הבעיה, אנא אבחן את התקלה ושלח לנו את מידע האבחון. תודה.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">השבתת ההרחבה</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">שמור קובץ יומן (log) </sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">שלח מידע אבחון</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">דווח על קריסה</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">הפעל מחדש את פליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">התחל מחדש במצב בטוח</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">משבית את כל הרחבות הצד השלישי ומשתמש בערכת נושא ברירת מחדל</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">צא מפליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">פעולות שקרו לפני הקריסה (באנגלית):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">מנהל ספרייה</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">הסר משחק(ים)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">לא ניתן למחוק משום שהמשחק או תוכנת ההתקנה רצים כרגע</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">לא ניתן להסיר התקנה של משחק שרץ</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">אתה בטוח שברצונך להסיר את {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">אתה בטוח שברצונך להסיר {0} משחקים?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">האם אתה בטוח שאתה רוצה להסיר את {0}?\r\n\r\nבחירת &quot;הוסף לרשימת יוצאים מהכלל&quot; תמנע ייבוא מחדש של המשחק בפעם הבאה שהספריה תעודכן.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">האם אתה בטוח שאתה רוצה להסיר את המשחקים {0}?\r\n\r\nבחירה באפשרות &quot;הוסף לרשימת יוצאים מהכלל&quot; תמנע את ייבוא המשחקים שוב בפעם הבאה שהספריה תעודכן.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">האם אתה בטוח שברצונך להסיר {0} פריטים שאינם בשימוש כרגע?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">לא נמצאו שדות שאינם בשימוש.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">כן (הוסף לרשימת יוצאים מהכלל)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">קיימים שינויים שלא נשמרו באיזור זה</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">מעדכן את מבנה ספריית המשחקים…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">עדכון בסיס הנתונים נכשל.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">עדכון ספריית המשחקים נכשל. {0} MBs של מקום פנוי דרושים.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">שגיאת משחק</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">לא ניתן להפעיל את המשחק. '{0}' לא נמצא בבסיס הנתונים.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">אי אפשר להתחיל משחק: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">לא ניתן להחיל את הפעולה: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">לא ניתן לפתוח את מיקום המשחק: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">לא ניתן לזהות את גודל ההתקנה של המשחק: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">סריקת גודל ההתקנה נכשלה</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">היו {0} שגיאות במהלך סריקת גודל ההתקנה</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">נכשל ביצירת קיצור דרך: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">פתיחת המדריך נכשלה: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">לא ניתן להתקין את המשחק: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">לא ניתן להסיר את המשחק: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">לא נמצאו פעולות הפעלה חוקיות של המשחק. בעת שימוש בפעולות אמולטור, ודא שהגדרות הפלטפורמה תואמות בין תצורת המשחק לתצורת האמולטור.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">מימוש ההתקנה אינו זמין.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">תוסף הספריה האחראי למשחק זה מושבת או אינו מותקן.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">הורדת נתונים רשמית אינו זמין.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">אף משחק אינו בחור.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">נכשל הניסיון לביצוע פעולת הסקריפט של המשחק.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">נכשל ניסיון לבצע את פעולת הסקריפט של הישום.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">נכשל ניסיון לבצע את פעולת הסקריפט הכללית.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">נכשל ניסיון לבצע את פעולת הסקריפט של האמולטור.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">נכשל הניסיון לביצוע פעולת הסקריפט של המשחק.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 או חדשה יותר אינה מותקנת.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">לא הצלחתי לקבוע איך להתחיל את המשחק.\r\n</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">פעיל</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">כבוי</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">הסר</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">הסר את מה שלא שבשימוש</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">שנה שם</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">העתק</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">הוסף</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">סמל ברירת מחדל</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">תמונת עטיפה ברירת מחדל</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">תמונת רקע ברירת מחדל</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">סיים</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">הבא</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">הקודם</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">סיים</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">הקודם</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">נקה</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">נקה</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">דחה</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">בטל הכל</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">יבוא</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">שם</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">יוצר</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">מודול</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">סדרה</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">גירסה</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">שוחק לאחרונה</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">הכי משוחקים</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">כמות משחקים</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">גודל ההתקנה</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">תיקיה</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">הערות</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">נוסף</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">תאריך הוספה</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">נערך</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">נערך לאחרונה</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">אתר</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">נתיב</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">אישור</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">שמור</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">סגור</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">ביטול</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">לאשר</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">אפס</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">כן</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">לא</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">ברוך הבא</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">משתמש מקומי</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">כללי</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">מדיה</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">קישורים</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">התקנה</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">פעולות</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">מוריד…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">מוריד נתונים…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">טוען…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">סוג</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">פרופיל</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">פרופילים</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">הסר</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">הורדה</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">חיפוש</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">רזולוציה:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">כלשהו</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">זום</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">תצוגת רשימה</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">עטיפות</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">תצוגת רשת</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">תצוגה מפורטת</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">התאמה אישית</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">תודה מיוחדת</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">רישיון</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">תורמים</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">יוצא מפליינייט…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">היום</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">אתמול</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">שני</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">שלישי</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">רביעי</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">חמישי</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">שישי</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">שבת</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">ראשון</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">בשבוע האחרון</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">בחודש האחרון</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">בשנה האחרונה</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">לפני יותר משנה</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 עד 100 מגה</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100 מגה עד 1 ג'יגה</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1 ג'יגה עד 5 ג'יגה</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5 ג'יגה עד 10 ג'יגה</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10 ג'יגה עד 20 ג'יגה</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20 ג'יגה עד 40 ג'יגה</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40 ג'יגה עד 100 ג'יגה</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100ג'יגה ומעלה</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">ייבוא הושלם בהצלחה.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">כל המשחקים</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">מזהה המשחק</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">מזהה בסיס הנתונים</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">הגדרות קבועות מראש</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">עמודה</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">עמודות</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">שורה</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">שורות</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">לא הצליח לקבל סמל מפעולת המשחק. פעולה לסוג הקובץ אינה קיימת. </sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">הורד רק נתונים חסרים</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">הפעלת אפשרות זו תדלג על הורדת נתונים עבור שדות אשר כבר מכילים מידע.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">בחירת משקים</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">אנא בחר אילו משחקים צריכים להתעדכן עם נתונים חדשים:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">כל המשחקים מבסיס הנתונים</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">כל המשחקים שמסוננים כעת</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">משחקים נבחרים בלבד</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">לא נבחרו שדות מטא נתונים</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">לא נבחרו שדות מטא נתונים להורדה. צריך לבחור לפחות שדה אחד ולאפשר לפחות מקור מטא נתונים עבורו.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">חנות רשמית</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">אנא בחרו אילו שדות יאוכלסו אוטומטית על ידי פליינייט ובאילו מקורות להשתמש כדי להשיג את הנתונים.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">אנא שיקלו ללחוץ על הלוגו מעל ולתרום עדכונים לבסיס הנתונים של igdb.com כדי לשפר את המידע שבשימוש פליינייט.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">מוריד נתונים…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">מייבא משחקים מותקנים…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">מייבא {0} משחקים…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">מיבא משחקי אמולטורים מ {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">מוריד עדכוני ספריה…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">סורק את גודל המשחקים בספריה</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">סורק את גודל המשחקים מיוובאים</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">עדכון הספריה הושלם</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">משחרר משאבים…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">הגדרות</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">הגדרות…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">פלטפורמות ואמולטורים</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">הגדר אמולטורים…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">מנהל הספריה…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">כלים</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">מוריד נתונים…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">כלי תכנה…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">קביעת תצורה של אינטגרציה...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">פתח תוכנת לקוח צד שלישי</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">לקוחות צד שלישי</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">עדכון ספריית המשחקים</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">ביטול עדכון ספריה</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">עדכון תיקיות אמולטורים</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">הוסף משחק</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">ידנית…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">סרוק אוטומטית…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">משחק אמולטור…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">אפליקציה ממייקרוסופט סטור…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">אודות פליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">שלח משוב</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">עבור למצב מסך מלא</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">קישורים</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">עזרה</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">תמוך באמצעות Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">תמיכה דרך Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">מדריך למשתמש</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">תיעוד SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">איתחול מערכת</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">כבה מערכת</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">השהה מערכת</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">מצב שינה</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">נעל מערכת</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">נתק משתמש</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">בחר משחק אקראי</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">שדות משחק להצגה בפאנל הפרטים:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">ריווח פריטים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">צייר רקע פריט רשת</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">עובי מסגרת פריט רשת</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">מקור סמל משחק חסר</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">מקור עטיפת משחק חסר</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">מקור רקע משחק חסר</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">ריווח אנכי לפרטי משחק</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">מיקום פרטי פריט רשת</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">מיקום רשימת משחקים בתצוגה מפורטת</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">צייר הפרדה בין פאנלים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">גובה תמונת עטיפת משחק</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">גובה סמל רשימת משחקים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">גופן יישום</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">פונט בעל רוחב קבוע</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">מיקום פאנל מסנן</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">מיקום פאנל סייר</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">עיבוד עטיפת משחק</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">יחס גובה-רוחב יעד</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">האפשרויות הבאות משפיעות גם על רינדור גרפיקה במצב מסך מלא!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">מצב מתיחה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">קופסת DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">ריבוע</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam Banner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">כריכה אנכית של Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* דורש הפעלה מחדש</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">הגדרות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">כללי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">פאנל עליון</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">תצוגה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">פרטי משחק</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">פריסה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">מתקדם</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">מסך מלא</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">קלט</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">ביצועים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">נתונים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">מעדכן</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">חיפוש</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">גיבוי</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">נתוני ספריית גיבוי</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">שחזר גיבוי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">ייבא אוטומטית שינויים בספרייה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">מיקום קובץ בסיס נתונים לא תקין, חובה לספק מיקום קובץ מתאים.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">שם חשבון אינו יכול להיות ריק.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">הורד נתונים לאחר יבוא משחקים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">התחל את פליינייט בצורה ממוזערת</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">הפעל את פליינייט בצורה אוטומטית כאשר המחשב יופעל</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">התחיל במצב סוגר לTray</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">נכשל ברישום פליינייט לרוץ בהפעלת המחשב.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">התחל במצב מסך מלא</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">טעינת תמונות ברקע</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">משפר החלקת גלילה של רשימת משחקים בתמורה לטעינה איטית יותר של תמונות.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">הצג את שם המשחק אם העטיפה אינה זמינה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">הצג שמות משחקים בתצוגת רשת</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">החשך משחקים שלא מותקנים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">הצג סמלי משחקים בתצוגה מפורטת</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">הצג כמות פריטים בתיאור קבוצות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">הצגת שדות שהוקצו רק בחלוניות מסנן וסייר</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">בטל האצת חומרה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">השתמש כשנחווה גמגום או בעיות ממשק דומות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">הצג משחקים מוסתרים ברשימות הפעלה מהירה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">משפיע על רשימת קפיצות ותפריטי Tray</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">מספר פריטי הפעלה מהירה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">השתמש בתמונת רקע המשחק כרקע החלון</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">טשטוש הרקע</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">איכות גבוהה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">השחרת הרקע</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">הצג בתצוגת רשת</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">ערכת נושא</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">פרופיל ערכת נושא</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">ערכת נושא למסך מלא</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">פרופיל ערכת נושא מסך מלא</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">מיקום בסיס הנתונים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">סטטוס חיבור:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">הגדרות פליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">ניקוי מטמון</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">יכול לפתור בעיות הנגרמות בעת חיבור חשבונות.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">הצג אייקון ממוזער</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">מזער לאייקון בשורת המשימות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">מזער לאייקון בשורת המשימות כאשר חלון האפליקציה נסגר</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">כשהמשחק מתחיל:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">אחרי שהמשחק נסגר:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">פורמט &quot;זמן שוחק&quot; כדי לציין כמה ימים שוחקו</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">פורמט תאריך</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">פעולה זו תנתק אותך מכל החשבונות המחוברים. נדרשת הפעלה מחדש של האפליקציה, האם ברצונך להמשיך?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">לנקות מטמון?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">אתחול פליינייט דרוש להחלת ערכת נושא חדשה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">קבל ערכות נושא נוספות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">צור ערכת נושא חדשה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">השג הרחבות נוספות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">צור הרחבה חדשה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">עזור לנו לתרגם את פליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">יש להפעיל מחדש את פליינייט כדי להחיל הגדרות חדשות. הפעל מחדש עכשיו?\r\n\r\nהפעלה מחדש תבטל את כל המשימות הפעילות (הורדות) המתבצעות כעת.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">הפעל מחדש את פליינייט?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">פליינייט אינו מזיז קבצי ספריות אוטומטית, נדרש להעתיק\\להזיז את הקבצים לפני שהמיקום משתנה. אם שום ספריה לא קיימת במיקום היעד, ספריה חדשה תיווצר.\r\n\r\nייעשה שימוש במיקום מסד נתונים חדש רק לאחר אתחול האפליקציה. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">משך זמן משחק לא יירשם אם פעולת &quot;סגירה&quot; נקבעה.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">מספר שורות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">מספר עמודות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">מספר שורות תצוגה מפורטת</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">הצג את תמונת הרקע במסך הראשי</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">אינו מוכל רטרואקטיבית על משחקים קיימים ללא הורדת נתונים מחדש.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">ייבוא זמן משחק של משחקים בספריה:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">מגדיר מתי פליינייט מיהא את זמן המשחק שמגווח ע&quot;י הספריות המשחקים במסד הנתונים של פליינייט. נדרשת תמיכה של הפלאגין של הספריה על מנת להשתמש באפשרות זו.\r\n\r\nתמיד: מיבא את הזמן המשוחק עבור משחקים חדשים וקיימים\r\nרק עבור משחקים מיובאים חדשים: מייבא את הסמן המשוחק עבור משחקים חדשים\r\nאף פעם: לא מעדכן זמן משוחק בשום מצב</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">תמיד</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">רק עבור משחקים מיובאים חדשים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">אף פעם</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">אפשר תמיכה בשלט כאשר נמצא במצב חלון </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">כפתור מנחה פותח מצב מסך מלא</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">הורד נתוני משחקים באופן אוטומטי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">תצוגת יעד</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">תמיד השתמש בתצוגה ראשית</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">הצג כותרות משחקים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">הצג מצב סוללה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">הצג אחוז סוללה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">הצג שעון</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">החבא סמן עכבר</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">מותקן רק במסננים מהירים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">הנחיות כפתורים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">פריסה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">גלילה אופקית</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">בחר אחד מתתי הסעיפים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">אין אפשרויות זמינות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">נכשל בטעינת ההגדרות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">סקריפטים אלה מבוצעים עבור כל משחק בספריה. ניתן להקצות סקריפטים בודדים לכל משחק בנפרד תוך עריכת פרטי המשחק.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">הנפשת מעברי תמונת רקע</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">גודלי גופנים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">אוטומטי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">מוחלק</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">גווני אפור</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">אידיאלי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">תצוגה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">מצב עיצוב טקסט</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">מצב עיבוד טקסט</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">אפשרויות עיבוד ועיצוב טקסט לא מופעלות על טקסט תיאור המשחק כעת.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">טען מראש תמונות רקע</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">אם פונקציה זו מופעלת, פליינייט תוריד תמונות רקע בעת הורדת נתונים. הפעלת הפונקציה תגרום לצריכת שטח נוסף ותאפשר לך לגלוש בתמונות במצב לא מקוון.\r\n \r\nאם תכונה זו אינה זמינה, פליינייט תוריד תמונות רקע רק בגישה ראשונה. אי הפעלת הפונקציה תחסוך בשטח אך עלולה לגרום לקריאה איטית של תמונות, ושלא יהיה ניתן להציג תמונות מסוימות במצב לא מקוון.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">סגור אוטומטית את תוכנת הפתיחה של המשחק בעת היציאה מהמשחק</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">השהיית זמן כיבוי הלקוח (בשניות)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">אל תיסגר לאחר הפעלות במשחק קצר מ- (בשניות)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">סגור אוטומטית את התוכנות הבאות:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">סגור קליינטים אוטומטית</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">ייבא רשימת יוצאים מהכלל</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">הצג אזהרה בעת הקצאת מדיה גדולה מדי למשחק</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">פעולת פתיחת תיקיה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">ארגון מועדף לדרוג גיל מתאים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">עדכן נפח התקנה של משחקים בעת עדכון סיפריה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">סורק ומעדכן את נפח ההתקנה אם זוהה שהקבצים השתנו מאז הסריקה האחרונה</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">ללא</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">מילוי</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">אחיד</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">אחיד למילוי</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">שמאלה</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">ימינה</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">למעלה</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">למטה</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">שגיאה בייבוא</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">נדרש אימות</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">האימות נכשל</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">מצב אלטרנטיבי לעיבוד תצוגת רשת</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">השתמש כאשר ישנן בעיות בתצוגת הרשת, לדוגמא חלונות אימות של אינטגרציות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">טעינה חלקית של תאורי משחק ארוכים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">תאורים ארוכים עלולים לגרום ללאג כאשר בוחרים משחקים.\r\n\r\nכאשר מופעל, רק חלק מהתיאור יטען תחילה עם אפשרות לטעון את ההמשך לפי דרישה</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">יבוא נתונים</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">הורד נתונים</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">קבע הגדרה נבחרת לשימוש עבור כל הורדת נתונים עתידית.\r\nניתן לשנות גם דרך הגדרות האפליקציה.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">אשף ייבוא האמולציה</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">האשף ינחה אתכם בתהליך ההורדה והיבוא של אמולטורים לקונסולות ויבוא משחקים</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">זכור שתמיד באפשרותך להוסיף אמולטורים ו\\או משחקים נוספים מאוחר יותר דרך התפריט הראשי (תחת תפריט &quot;כלים&quot; של הגדרות אמולטורים ותפריט &quot;הוסף משחקים&quot; עבור משחקי אמולציה).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">להלן רשימת אמולטורים שפליינייט יכול לזהות ולהגדיר אוטומטית. אפשר להוריד את האמולטורים מהאתרים שלהם. ברגע שהאמולטורים מותקנים (ידנית), אפשר ליבא אותם בחלון הגדרת האמולטורים</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">ניתן לייבא כל אמולטור המותקן על המחשב על ידי לחיצה על כפתור &quot;זיהוי אוטומטי מתיקיה…&quot;. פליינייט יחפש בתיקיה הנבחרת עבור אמולטורים ידועים ויספק אפשרות לייבא אותם.\r\nבאפשרותך להשתמש בלחצן זה מספר פעמים כדי לייבא אמולטורים מתיקיות שונות. אמולטורים יתווספו לתחתית הרשימה הנוכחית.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">ניתן לייבא משחקים על ידי לחיצה על כפתור &quot;סרוק תיקיה על ידי אמולטור&quot;. בחירת אמולטור נכון יאמר ל פליינייט, אילו סוגי קבצים צריכים להיסרק ולייבא. באפשרותך להשתמש בלחצן זה מספר פעמים כדי לייבא משחקים מתיקיות שונות. משחקים יתווספו לתחתית הרשימה הנוכחית.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">אין אמולטורים שנבחרו לייבוא. לא תוכלו לייבא אוטומטית משחקים בלי להגדיר קודם אמולטורים. האם אתה בטוח שברצונך להמשיך ולצאת מתהליך הייבוא?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">אין אמולטורים המוגדרים בפליינייט. לא ניתן לייבא משחקים מבלי להגדיר תחילה את האמולטור ולבחור את סוגי הקבצים המתאימים. האם אתה רוצה להוסיף כמה אמולטורים עכשיו?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">סרוק תיקיה באמצעות אמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">בחר קבצים</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">זיהוי אוטומטי מתיקיה…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">הגדר אמולטורים…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">סורק…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">סורק {0}...</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">הגדרת הפעם הראשונה</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">תהליך זה ינחה אותך בייבוא ותצורה אוטומטיים של ספריות משחקים חיצוניות. פליינייט יכול לייבא באופן אוטומטי משחקים משירותי משחקים מרובים, כגון Steam או GOG.\r\n\r\nזכור שאתה יכול גם להוסיף באופן ידני כל משחק מותאם אישית או אמולטור עבור כל פלטפורמה מאוחר יותר מהתפריט הראשי.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">אינטגרציית ספריה</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">להלן הרשימה של כמה שילובי ספריות שנאספו שפליינייט תומך בהן. אנא בחר את אלה שברצונך להתקין.\r\n\r\nניתן להתקין אינטגרציות נוספות מאוחר יותר מתפריט &quot;הרחבות&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">הסתיימה ההגדרה</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">ההתקנה הראשונית הושלמה. זכור שתוכל לשנות את כל ההגדרות בהמשך בתפריט 'הגדרות'.\r\n\r\nאתה יכול גם להוסיף כל משחק אחר בהמשך על ידי לחיצה על תפריט הלוגו של פליינייט. </sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">נכשל בהורדה של הרחבה אחת או יותר.\r\n\r\nאפשר לנסות להוריד את ההרחבה מחדש מתפריט ההרחבות אחרי שהאשף יסיים.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">מוריד אינטגרציה {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">מוריד רשימה של אינטגרציות מומלצות…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">הורדת רשימה של אינטגרציות מומלצות. אפשר לנסות ולהוריד מחדש יותר מאוחר דרך תפריט התוספים.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">הגדר פלטפורמות ואמולטורים</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">הגדר אמולטורים</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">פלטפורמות</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">פלטפורמה</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">אמולטורים</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">אמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">הוסף פלטפורמה</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">בחר סמל</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">בחר עטיפה</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">בחר תמונה</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">בחר פריט</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">בחר רקע</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">בחר קובץ</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">בחר URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">הוסף אמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">פלטפורמות נתמכות</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">האם ברצונך לשמור שינויי הפלטפורמות?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">האם ברצונך לשמור שינויי האמולטורים?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">ניתן להרצה</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">ארגומנטים</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">תיקיית עבודה</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">סוגי קבצים נתמכים</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">ייבא אמולטורים…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">הורד אמולטורים…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">טען ערכי ארגומנטים קבועים מראש מפרופיל אמולטור ידוע</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">האם אתה בטוח שברצונך להסיר את אמולטור {0}? \r\nהוא כרגע בשימוש על ידי {1} משחק(ים).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">האם אתה בטוח שברצונך להסיר את הפלטפורמה {0}? \r\nהיא כרגע בשימוש על ידי {1} משחק(ים) ו {2} אמולטור(ים).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">עזרה בהגדרות</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">מיין לפי</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">כיוון המיון</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">קבץ לפי</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">סדר עולה</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">סדר יורד</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">אל תקבץ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">קבץ לפי ספריה</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">קבץ לפי קטגוריה</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">קבץ לפי פלטפורמה</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">סוג תצוגה</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">תצוגה</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">פאנל סייר</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">פאנל מסנן</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">סמל</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">איקון סיפרייה</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">תמונת עטיפה</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">תמונת רקע</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">שם מיון</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">ספריה</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">ידני</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">שם</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">קונן התקנה</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">שם חשבון</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">פלטפורמה</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">קטגוריה</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">ז'אנר</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">תאריך שחרור</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">שנת שחרור</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">מפתח</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">תג</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">מפרסם</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">מצב ההתקנה</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">התאם את כל המסננים\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">במידה ומאופשר, רק משחקים המשתמשים בכל הפריטים בסינון יהיו כלולים בתצוגה.\r\nבמידה וכבוי, משחקים אשר משתמשים אפילו רק בפריט אחד בסינון יהיו כלולים בתצוגה.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">מותקן</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">מותקן</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">לא מותקן</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">מוסתר</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">מועדף</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">הפעל תמיכה בHDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">אם מופעל, HDR יופעל בצג הראשי לפני התחלת משחק.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">שים לב שHDR לא נתמך בצג הראשי</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">שוחק לאחרונה</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">קטגוריה</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">תיאור</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">תיקיית התקנה</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">תמונת עטיפה</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">קישורים</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">נתיב קובץ תמונה, ROM או ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">ז'אנר</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">ז'אנרים</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">חברה</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">חברות</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">מפתח</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">מפתחים</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">מפרסם</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">מפרסמים</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">קטגוריה</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">קטגוריות</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">תג</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">תגיות</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">תכונה</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">תכונות</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">דירוג גיל</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">דירוג גיל</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">אזור</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">אזורים</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">מקור</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">מקורות</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">פעילות אחרונה</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">שגיאת בסיס נתונים</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">כשלון בטעינת בסיס נתוני הספריה.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">בסיס הנתונים אינו פתוח.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">לא ניתן לגשת לקובץ בסיס נתוני הספריה. הקובץ &quot;{0}&quot; נמצא בשימוש על ידי תהליך אחר או נמצא במקום לא נגיש.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">נכשל ביצירת חבילת אבחון.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">נכשל בהעלאה אוטומטית של חבילת אבחון.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">מידע אבחון נשלח בהצלחה.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">חבילת האבחון נוצרה והוגשה בהצלחה.\r\nאנא צרף את המזהה הבא לדוח הקריסה:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">נכשל ביבוא משחקים מ {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">נכשל ביבוא משחקי אמולטור מ {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">לא ניתן לחפש עבור משחקים על ידי פרופיל האמולטור הנבחר. הפרופיל לא מכיל סיומות קבצים או פלטפורמות.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">פליינייט נכשל להתחיל. אנא סגרו את כל המופעים הרצים של האפליקציה ונסו שוב.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">כישלון בהחלת ערכת נושא &quot;{0}&quot;, פרופיל צבע &quot;{1}&quot;\r\n \r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">לא ניתן לפתוח קישור, URL לא תקין.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">נכשלה הפעלת האפליקציה.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">נכשל באתחול רכיב תצוגת הרשת. פליינייט לא יכול להמשיך עם תהליך האתחול\r\n\r\nלמידע נוסף:\r\nhttps://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">לא ניתן לייבא אמולטורים כתוצאה מקובץ הגדרות חסר ו/או פגום</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">ביצוע פעולת תפריט נכשלה</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">ערוך פרטי משחק</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">כתובת תמונה</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">הוסף קישור</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">הוסף ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">שמור שינויים</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">הפעל שינוי שדה לכלל המשחקים הנערכים.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">הוסף פעולה</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">מחק פעולה</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">הסר פעולת משחק</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">הוסף משחקים</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">סרוק תיקיה…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">גלה מותקנים</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">עיון…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">פתח את פליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">הגדרות פרופיל</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">שם משחק אינו יכול להיות ריק.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">תיקיית מעקב התקדמות במשחק לא יכולה להיות ריקה.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">שם משחק לא יכול להיות ריק לפני חיפוש נתונים.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">מידע משחק לא תקין</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">הזן כתובת URL חוקית המתחילה ב http:// או https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">בחר URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">נכשלה הורדת נתונים: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">שגיאת הורדה</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">נקה מסננים</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">חשבון פרטי</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">חשבון ציבורי</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">מפתח API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">שגיאת הפעלה</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">שגיאה בערכת נושא</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">נקה הכל</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">מתקין</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">מסיר התקנה</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">מפעיל</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">מריץ</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">URL לא חוקי</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">אל תעשה דבר</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">מזער</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">שחזר חלון</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">שחזור החלון רק כאשר מופעל דרך ה-UI</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">סגור</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">שינוי</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">מתקדם</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">אף פעם</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">סטטוס השלמה</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">סטטוסי השלמה</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">ציון משתמש</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">ציון מבקרים</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">ציון קהילה</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">תסריטי משחק</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">תסריטי אפליקציה</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">סקריפטים</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">תוספים</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">מקורות נתונים</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">הרחבות</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">זיהוי הרחבה</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">טען מחדש סקריפטים</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Interactive SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">כל הסקריפטים נטענו מחדש בהצלחה.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">לא נמצאו משחקים עבור קריטריון חיפוש\\מסנן</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">לא נמצאו פריטים</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">עבור למצב שולחן עבודה</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">צא מפליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">ספריות</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">עדכן הכל</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">נוצר על-ידי:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">גירסה:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">עודכן:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">מודול:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">ספריה</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">סטטיסטיקה</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">הכל</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">ללא</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">התראות</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">רוחב</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">גובה</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">גודל</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">קטן</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">רגיל</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">גדול</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">גדול יותר</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">הכי גדול</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">ברירת מחדל</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">בחר</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">בחר הכל</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">בטל בחירה של הכל</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">ראשון</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">אקראי</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">בחירת משתמש</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">טען עוד</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">שקיפות</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">כווץ</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">הרחב</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">כווץ הכל</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">הרחב הכל</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">אחר</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">ערכות נושא</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">ארגומנטים לאמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">ארגומנטים מובנים</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">ארגומנטים מותאמים אישית</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">ארגומנטים נוספים לאמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">דרוס ארגומנטים לאמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">פעולת משחק</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">בחר מידע מטא לייבוא</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">בחר משחקים לייבא</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">חיפוש נתונים</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">עדכון זמין</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">שינויים מהעדכון האחרון</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">הורד והתקן עדכון</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">חפש עדכונים</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">שגיאת עדכון</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">נכשל בחיפוש גרסה חדשה.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">לא נמצאה גירסה חדשה, אתה מעודכן.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">נכשל בהורדה והתקנת עדכון.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">מספר פעולות רצות ברקע. האם לבטל ולהמשיך עם העדכון?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">מספר פעולות רצות ברקע. האם לבטל ולצאת מפליינייט?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">מספר פעולות רצות ברקע. שינוי מצב יבטל את הפעולות. האם להחליף בכל זאת?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">עדכון זמין לפליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">טען רשימת ערכות נושא מחדש</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">הפעל ערכת נושא נבחרת</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">האזן לשינויי קבצים</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">החל ערכת נושא אוטומטית כאשר קובץ המקור משתנה</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">סביבת סקריפטים</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">סקריפט להרצה לפני תחילת המשחק</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">סקריפט להרצה לאחר יציאה מהמשחק</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">סקריפט להרצה אחרי שמשחק מתחיל</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">הרץ בעת הפעלת האפליקציה</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">הפעל בעת כיבוי האפליקציה</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">סקריפט תחילת משחק</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">סקריפט לאחר תחילת משחק</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">סקריפט לאחר עצירת משחק</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">הרץ סקריפט גלובלי</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">גלובלי</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">מסונן</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">נוכחי</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">חדש</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">סקריפט בדיקה</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">הצג רק פרטים שנבחרו</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">שמור כברירת המחדל</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">הוסף למעודפים</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">הסר ממועדפים</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">הסתר משחק זה</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">הסר מהסתרה</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">הפעל תמיכה בHDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">בטל תמיכה בHDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">ערוך…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">חשב נפח התקנה</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">חשב נפח התקנה (לכל המשחקים)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">חשב נפח התקנה (רק עבור מידע חסר)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">גודל ההתקנה</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">הגדר קטגוריה…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">הגדר סטטוס השלמה</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">הסר</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">שחק</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">התקן</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">אפשרויות משחק</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">פרטים</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">הסר התקנה</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">פתח מיקום התקנה</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">צור קיצור דרך בשולחן העבודה</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">פתח את המדריך</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">עוד</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">מנוהל על ידי תוסף הספריה</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">תהליך הרצת המשחק ינוהל על ידי התוסף תיקיה האחראי על משחק זה.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">לא נמצא מידע רלוונטי עבור המשחק '{0}' בעמוד הבוקש.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">טיפ: ניתן להשתמש בתהליך הורדת נתונים מתקדם יותר בעת עריכת משחק בודד על ידי התפריט &quot;עריכה&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">לא זמין כאשר פעולה כלשהי בתהליך.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">טקסט התיאור הינו רגיש לתחביר HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">זמן המשחק מוקלט לפי שניות</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">נפח ההתקנה מוצג בביטים</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">תאריך השחרור חייב להיות בתצורה 'שנה-חודש-יום'. ערכי החודש והיום יכולים להיות מושמטים.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">ערכים בין 0 ל 100 או ריק לללא ציון.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">פיתוח Playnite מתאפשר באמצעות תמיכה של הפטרונים וחברי Ko-fi הבאים:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">תורמים לקוד, תרגום ואחרים לא בסדר כלשהו:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">בטל ניטור משחקים?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">ניתור התקנה כרגע רץ, הרם ברצונך לבטל את התהליך ולהחזיר את המשחק למצבו הקודם?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">ניתור הרצת משחק כרגע רץ, הרם ברצונך לבטל את התהליך ולהחזיר את המשחק למצבו הקודם?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">משך המשחק</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">שוחק לאחרונה</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0} ימים {1} שעות ו-{2} דקות</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}ש {1}ד</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} דקות</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} שניות</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">לא שוחקו</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">פותח מצב שולחן עבודה…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">פותח מצב מסך מלא…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">טוען ספרית משחקים…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">מחשב נפח התקנה...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">מחשב נפח התקנה של {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">נכשל בהתקנת קובץ סקריפט.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">הסקריפט הותקן בהצלחה.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">סקריפט התקנה</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">שגיאת סקריפט</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">ביצוע פעולת תוסף נכשלה.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">פתח תיקיית נתונים</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">חשב</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">חישוב אוטומטי של גודל ההתקנה באמצעות רום המשחק, במידה ולמשחק יש אחד או תיקיית ההתקנה אם הוגדרה כזו</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">תוכנת {0} אינה מותקנת.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">תוכנת {0} תפתח כעת. אנא התחבר ואז סגור את הודעה זו.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">מחכה להתחברות משתמש, אנא סגרו את זה בסיום…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">תיקיית התקנת משחק לא נמצאה.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">תצורת פעולת משחק לא תקינה.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">טיפול בתקלות סנכרון חשבון</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">פתרון בעיות</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">שנה שם פריט</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">הוסף פריט חדש</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">הכנס שם</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">הזן שם חדש</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">פחות משעה</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">שעה עד 10 שעות</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 עד 100 שעות</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 עד 500 שעות</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 עד 1000 שעות</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">מעל 1000</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">פליינייט צריך לאתחל כדי להשלים התקנה. האם את/ה רוצה לבצע אתחול עכשיו?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">הרחבה אינה ארוזה כראוי.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">ערכת נושא אינה ארוזה כראוי.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">הרחבה &quot;{0}&quot; נכשלה להיטען כראוי.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">אין אפשרת לטעון את ההרחבה &quot;{0}&quot;, הגרסה הנוכחית של פליינייט לא נתמכת.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">ערכת נושא &quot;{0}&quot; נכשלה להיטען כראוי.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">אין אפשרת לטעון את ערכת הנושא &quot;{0}&quot;, הגרסה הנוכחית של פליינייט לא נתמכת.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">הרחבה נכשלה להיטען כראוי.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">ערכת נושא נכשלה להיטען כראוי.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">ערכת נושא\\הרחבה משתמשת בגירסת API שאינה נתמכת.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">ההתקנה הסתיימה בהצלחה.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">להתקין הרחבה?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">כללי</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">נכשל להתקין את התוסף &quot;{0}&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">נכשלה התקנת הרחבה.\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">האם את/ה רוצה להתקין הרחבה חדשה?\r\n\r\n{0}\r\nמאת {1}\r\nגרסה {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">האם את/ה רוצה לעדכן את ההרחבה &quot;{0}&quot;?\r\n\r\nגרסה נוכחית: {1}\r\nגרסה חדשה: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">נכשלה התקנת ערכת נושא.\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">האם את/ה רוצה להתקין ערכת נושא חדשה?\r\n\r\n{0}\r\nמאת {1}\r\nגרסה {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">האם את/ה רוצה לעדכן את ערכת הנושא &quot;{0}&quot;?\r\n\r\nגרסה נוכחית: {1}\r\nגרסה חדשה: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">אתם עומדים לעזוב את Playnite ולנווט לדף אינטרנט על ידי דפדפן ברירת המחדל. האם ברצונך להמשיך?\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">תמונה/תמונות שנבחרו עשויות להיות גדולות מדי לביצוע מיטבי. שימוש בתמונות גדולות מאוד עלול לגרום לתגובה הרבה פחות טובה של ממשק המשתמש ולשיפור השימוש בזיכרון.\r\n\r\nמקסימום החלטות מומלצות:\r\nסמלים: {0} מגה פיקסלים\r\nמכסה: {1} מגה פיקסלים\r\nרקעים: {2} מגה פיקסלים</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">אזהרת ביצועים</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">אל תציג שוב</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">קובץ עם סיומת {0} אינו נתמך.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">סיומת קובץ לא מתאימה</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">קובץ תמונה שנבחר עשוי להיות גדול מדי לביצועים מיטביים.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">האם ברצונך להסיר את ערכת הרקע? ההתקנה תתבצע בפעם הבאה שהתוכנה תופעל מחדש.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">ערכות נושא מובנות לא ניתנות להסרה.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">ערכת נושא זו אינה תומכת בגירסא זו של פליינייט.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">האם ברצונך להסיר את התוסף? הסרת ההתקנה תתבצע בפעם הבאה שהתוכנה תופעל מחדש.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">הרחבות מובנות לא ניתנות להסרה.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">הרחבה זו אינה תומכת בגירסא זו של פליינייט.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">תיקיית התקנה</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">תיקיית מידע</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">מייצר חבילת דיאגנוסטיקה...</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">מעלה חבילת דיאגנוסטיקה...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">ייבא קובץ</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">מה זה?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">אתה בטוח שברצונך לעשות את זה?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">זמן משחק כולל</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">זמן משחק ממוצע</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">זמן משחק מירבי</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">נפח התקנה כולל</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">סקירה כללית</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">סרגל צד</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">הצג בסרגל הצדדי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">אפס הגדרות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">כל הגדרות התוכנה יחזרו להיות ברירת המחדל, כולל:\r\n- מיקום מסד הנתונים\r\n- רשימת החרגות ייבוא\r\n- הגדרות התוספים, כולל אינטגרציות לספריה\r\n    \r\nהפעלת התוכנה נדרשת על מנת להשלים את התהליך. האם לבצע שחזור להגדרות ברירת מחדל?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">עבור מפתחים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">תוספים חיצוניים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">הכנס נתיב תיקיה מלא</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">הישגים</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">פורום</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">חדשות</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">דף חנות</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">הגדרה ראשונית לא הושלמה. פליינייט כעת יאותחל למצב שולחן עבודה לסיום התהליך.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">שוחק לאחרונה</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">מועדפים</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">הכי משוחקים</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">הכל</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">יש מסננים מופעלים.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">ישנם מסננים נוספים פעילים</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">תוצאות חיפוש עבור:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">פריט בעל שם זהה כבר קיים.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">הגבל בחירה למסנן הנוכחי</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">בחר נוסף</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">תוספים...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">מותקן</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">הגדרות הרחבות</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">עיון</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">עדכונים</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">עדכונים ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">ניהול תוספים וערכות רקע מותקנים, כולל ההגדות, הועבר לתפריט חדש - &quot;תוספים&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">ניתן להגדיר את כל התוספים האפשרים חיבור לספריות קיימות כאן.\r\n\r\nבמידה וברצונך להתקין או להסיר תוספי קישור נוספים, יש להשתמש בתפריט &quot;תוספים&quot; תחת התפריט הראשי.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">ערכות נושא שולחן עבודה</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">ערכות נושא מסך מלא</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">מחפש...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">התוסף אינו תואם לגרסה זו של פליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">נכשל בהורדת חבילת התקנה של הרחבה</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">הורדת חבילת ההתקנה של התוסף נכשלה.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">אתחול האפליקציה נדרש על מנת להחיל שינויים שבהמתנה.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">הרחבה זו מתוכננת להתקנה.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">התקן</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">התקנה מחדש</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">הסר התקנה</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">כבר מותקן</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">לא נמצאו עדכוני הרחבות חדשים.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">עדכן תוספים</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">יומן שינויים לא זמין</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">מתוכנן להתקנה</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">הורדה נכשלה</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">רישיון נדחה</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">מוריד {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">מחפש עדכוני הרחבות…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">מחפש עדכוני תוכנה…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">ישנו עדכון הרחבה אחד או יותר זמין.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">בחר פריטים לעדכון</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">תוסף בפיתוח מקומי</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} הסכם רשיון</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">קבל</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">דחה</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">כלול פעולת ניגון של אינטגרצית ספריות</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">בחר פעולה</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">מצב מעקב</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">מיקום מעקב</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">עיכוב בתחילת המעקב</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">תדירות מעקב</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">קישור</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">קובץ</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">אמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">סקריפט</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">ברירת מחדל</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">תהליך</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">תיקיה</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">תהליך מקורי</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">שם התהליך</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">תעד הודעות מעקב</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">השינויים הבאים יגרמו לשינוי נתונים בכל המשחקים שנבחרו!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">ללא</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">אחיד</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">פריטים בלבד</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">התחלה וסיום בלבד</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">רגישות גלילה</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">גלילה חלקה</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">מהירות אנימציה</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">הסר פריט?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">האם אתה בטוח שברצונך להסיר פריט זה?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">הצג כפתורים בפאנל העליון:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">הגדרות תצוגה כלליות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">הגדרות קיבוץ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">הגדרות מיון</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">סנן ערכות מוגדרות מראש</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">מיקום פריטי פלאגין</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">רוחב מפריד אזורים</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">הזז כפתור תפריט ראשי לסרגל הצד</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">פאנל סייר</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">בוחר משחק אקראי</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">בחירת משחק באופן אקראי</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">בחר משחק אקראי מהתצוגה</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">שמור הגדרת קבוצות ומיון</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">הצג כמסנן מהיר במצב מסך מלא</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">ב 7 הימים האחרונים</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">ב 31 הימים האחרונים</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">ב 365 הימים האחרונים</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">לפני יותר מ365 ימים</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">הגדר</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">שמור תצורה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">צמצם לאחר הפעלת משחק</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">צמצם את פליינייט אחרי שמשחק מתחיל</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">גודל גופן</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">גודל גופן קטן</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">תמיכה בבקר משחק</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">אם כבוי, פליינייט לא יקבל שום קלט מאף בקר משחק</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">הצג פריטים בתפריט הראשי:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">הפוך את פעולת הכפתורים X/A בתצוגה הראשית</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">החלף את שיוך הכפתורים עבור התחלת משחק והצגת מידע נוסף בתצוגה הראשית</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">החלף את שיוך כפתורי אישור/ביטול</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">החלף את שיוך הכפתורים A/B עבור אישור או ביטול</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">בקר ראשי בלבד</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">כאשר מופעל, יתקבלו פקודות מהבקר הראשי בלבד</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">כפתור Guide ממקד על פליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">עוצמת ממשק</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">עוצמת רקע</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">השתק כאשר ברקע</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">נכשל באתחול ממשק קול</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API פלט</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API לשימוש עבור פלט קול. במידה ונתקלת בבעיות שמע, אפשר לשנות את הערך הזה.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">כללי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">חזותי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">שמע</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">פריסה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">תפריטים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">קלט</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} מתחיל…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} רץ…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">רישיות</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">רווח</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">מגדיל עיבוד תמונה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">חלופי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">מאוזן</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">איכות</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">איכות גבוהה:\r\nאיכות תמונה הכי טובה, איטי, צריכת זיכרון גבוהה.\r\n    \r\nמאוזן:\r\nאיכות טובה מאוד, מהיר, צריכת זיכרון נמוכה.\r\n    \r\nחלופי:\r\nאיכות טובה, מהירות בינונית, צריכת זיכרון נמוכה.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">בחר קובץ...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">בחר תיקיה...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">תסריט אתחול</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">חשוב לשים לב ששימוש בתוספים וערכות רקע עלול להשפיע משמעותית על הביצועים של פליינייט, יציבות ואבטחת המידע.\r\n    \r\nבמידה ונתקלת בבעיות כלשהן לאחר התקנת תוסף או ערכת רקע. יש קודם לנסות להסיר / לבטל כדי לוודא האם זה מקור הבעיה.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">בחר בעת הפעלה</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">בחר בעת הפעלה</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">פרופילים מובנים</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">פרופיל מובנה</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">פרופילים מותאמים אישית</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">פרופיל מותאמים אישית</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">מנוהל ע&quot;י סקריפט מובנה</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">בחירת אמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">בחירת פלטפורמה</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">מפרט אזור</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">הרץ לפני תחילת אמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">הרץ אחרי הפעלת אמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">הרץ לאחר יציאה מאמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">קובץ הפעלה של אמולטור לא נמצא</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">לא נמצאה בחירת אמולטור.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">סריפט אתחול של אמולטור לא נמצא</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">פצל למשחקים נפרדים</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">אחד למשחק אחד</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">הגדר פלטפורמה</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">הגדר אזור</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">סרוק תיקיה</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">סרוק קונפיגורציות</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">לא לכלול דפוסים מסריקת checksum </sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">לא יבדק checksum עבור הקבצים המתאימים לדפוסים ותבוצע התאמה לפי שם הקובץ. פירוט נוסף נמצא בדף העזרה של האמולטור.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">סרוק עם אמולטור</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">נדרש לקבוע שם כאשר שומרים קונפיגורציה חדשה</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">לא הוגדר אמולטור או פרופיל לאמולטור</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">לא הוגדרה ספריה לסריקה או שהיא אינה קיימת</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">סריקת ההגדרות לא הוגדרה כמו שצריך.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">לכלול בצבר סריקה אוטומטית</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">סריקת תיקיה של אמולטורים נכשלה.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">סריקת תיקיה של משחקים לאמולטורים נכשלה.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">החבא מיובאים</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">פרופילים לייבוא:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">הגדרות סריקה אוטומטית</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">שמור בתור הגדרת סריקה אוטומטית</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">שמירת ההגדרה לשימוש מאוחר יותר בעת עדכון הספריה. ניתן לנהל הגדרות שמורות דרך התפריט &quot;הגדרת אמולטורים&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">ייבוא על ידי שימוש בנתיב יחסי</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">שימוש בנתיב יחסי להתקנת פליינייט או לתיקיית התקנת האמולטור על מנת לייבא משחקים.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">סרוק תקיות משנה</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">סרוק בתוך קבצים מכווצים</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">אחד קבצים קשורים</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">איחוד כל הקבצים הקשורים למשחק</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">הוסף סורק</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">הוסף סורק שנשמר</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">התחלה בסריקה</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">הוספת הגדרות סריקה לתיקיות מסויימות. יש לוודא שהאמולטורים מוגדרים כמו שצריך לפני ייבוא משחקים (דרך התפריט &quot;ספרייה&quot; -&gt; &quot;הגדרת אמולטורים&quot;)</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">סטטוס ברירת מחדל המשוייך למשחקים חדשים שנוספו</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">סטטוס המשוייך למשחקים אשר הופעלו בפעם הראשונה</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">נכשלה הפעלת סקריפט PowerShell. במידה ומערכת ההפעלה היא Windows 7, יש לנסות להתקין מחדש  PowerShell 5.1.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">פילטר עם שם זה כבר קיים, האם לעדכן אותו עם ההגדרות החדשות?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">מילוי אוטומטי של שמות מיון חסרים עבור משחקים שנוספו  בבת אחת או נערכו</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">כאשר מתבצעת עריכת משחק, הוספת משחק באמצעות סריקת תיקיה או סריקת תיקיית אמולטור, יתווסף אוטומטית שם המתאים למיון עבור המשחק, למשל, &quot;The Witcher 3&quot; יקבל את שם המיון &quot;Witcher 03&quot;.\r\nפעולה זו תמיד תיצור שם שונה מאשר שם המשחק המקורי ותעדכן שמות מיון ריקים בלבד.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">המילים האלו יוסרו מתחילת ערך שם המיון האוטומטי:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">השתמש בערך האלו כדי להתעלם ממילים בתחילת שם המשחק למטרות מיון. ברירת המחדל היא &quot;The&quot;, &quot;An&quot;, &quot;A&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">הכנסת ערך שם מיון עבור משחקים שאין להם כזה</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">מיון</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">הכנסת ערכי שם מיון…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">במערכת ההפעלה שלך קיים שירות בשם Nahimic. שירות זה ידוע כגורם בעיות תצוגה בפליינייט (ותוכנות נוספות).\r\n\r\nבמידה ונתקלת בתקלות גרפיות או תקלות תצוגה כלשהן בפליינייט, אנחנו ממליצים על כיבוי או הסרה לחלוטין של Nahimic.\r\n\r\nמידע נוסף זמין בכתובת https://playnite.link/nahimicsucksPlaynite (מידע באנגלית)</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">פליינייט רץ עם הרשאות חזקות (כמו למשל administrator). דבר זה אינו מומלץ מכיוון שכל התוספים, המשחקים והתוכנות אפשר יופעלו דרך פליינייט יקבלו הרשאות כאלו גם כן!\r\n\r\nמידע נוסף זמין בכתובת https://playnite.link/adminfaq (מידע באנגלית)</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">הצג אזהרה אם פליינייט רץ עם זכויות יתר</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">חישוב הערך האמיתי של גודל התיקייה המותקנת בכונן כאשר מחשבים את גודל המשחקים</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">במידה ומופעל, סריקות יהיה איטיות יותר ויחשבו את הגודל האמיתי של הקבצים בכונן הקשיח.\r\nבמידה וכבוי, סריקות יהיו מהירות יותר וישתמשו בגודל הקבצים עצמם.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">התוספים הבאים דווחו כבעלי בעיות אפשריות, או כתוצאה מתקלות ביצועים/יציבות רבות או כתוצאה מבעיות אבטחת מידע. אנחנו מציעים להסיר את התוספים הבאים:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">אל תכלול קבצי אונליין מהסריקה</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">קבצים אשר נמצאים באחסון ענן לא יסרקו ולא יתבצע ייבוא שלהם אם אינם זמינים בכונן מקומי.\r\nנתמך עבור השירותים הבאים בלבד:  Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">ביצוע סריקה תוך התעלמות מתוכן הקובץ</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">יתבצע ייבוא של קבצים אלו אך בצורה מדוייקת פחות בשיטה שלא מצריכה הורדת הקובץ מהענן.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">החל על הכל</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">הגדרה מחדש של מצב ההתקנה</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">כאשר מוגדר, פליינייט יתעלם ממצב ההתקנה (כולל תיקיית ההתקנה) אשר הוגדר באמצעות התוסף שייבא את המשחק.\r\n        \r\nאפשרות זו עלולה שלא לעבוד עם תוספים מסויימים שאינים לוקחים בחשבון אפשרות זו.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">רק באופן ידני</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">פעם ביום</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">פעם בשבוע</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">בכל הפעלה</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">בדוק עדכוני תוכנה</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">בדוק עדכוני הרחבות</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">עדכן ספריות</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">סריקת תיקיית אמולטורים</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">כולל משחקים מוסתרים</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">עריכת שדות</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">בחר/בטל בחירה של הכל</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">פתח</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">הפעל</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">להקצות</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">החל להקליד על מנת לחפש משחקים… [F1] לעזרה</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"># יביא את רשימת כל הפקודות האפשריות\r\n/ יביא את רשימת כלל אפשרויות החיפוש\r\nהקלדת מילת חיפוש המסתיימת ברחח תבצע את החיפוש.\r\nTAB: החלפת פעולה\r\nENTER: הפעלת פעולה נבחרת\r\nSHIFT-ENTER: פתיחת תפריט</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">כלול משחקים לא מותקנים</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">כולל משחקים מוסתרים</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">משחקים לא מותקנים כלולים</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">משחקים לא מותקנים לא כלולים</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">משחקים מוסתרים כלולים</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">למעט משחקים מוסתרים</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">הפעל או התקן</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">עבור לפרטים נוספים</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">תפריט משחק</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">ערוך משחק</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">פתח חיפוש</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">תיבת חיפוש</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">מקש החיפוש</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">פעולת משחק עיקרית</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">פעולת משחק משנית</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F פותח אפשרות חיפוש רחבה</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">שמור הגדרות סינון משחק</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">ספקי חיפוש</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">מילת מפתח ברירת מחדל</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">מילת מפתח מותאמת אישית</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">קיצור דרך גלובלי</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">חיפוש פליינייט</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">הגדרת הרחבות</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">החרגות</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">אל תכלול קבצים יחסיים לסריקת תיקייה</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">אל תכלול תיקיות היחסיות לתייקיית הסריקה</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">הוסף קובץ לרשימת יוצאים מהכלל</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">הוסף תיקיה לרשימת יוצאים מהכלל</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">ניתן להוסיף החרגות רק להגדרות סריקה שמורות.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">החרגות נוספו לסורק &quot;{0}&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">שכתוב ערך פלטפורמה</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">אם מאופשר, הסורק יחיל את ערך הפלטפורמה שהוזן לכלל המשחקים, גם אם נמצא ערך פלטפורמה אחר.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">כלול פקודות בחיפוש ברירת מחדל</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">אם מבוטל, פקודות לא תהיינה חלק מחיפוש ברירת מחדל עד הוספת # כתחילית.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">שימוש בחיפוש מעורפל בשדה השם</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">כאשר מאופשר, סינון לפי שם המשחק יבצע התאמה כמו בחיפוש הכללי.\r\nניתן לבצע התאמה מסויימת במקרה בודד על ידי הוספת התו !</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">שדות אשר יוצגו עבור תוצאות חיפוש משחק:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">סטטוס חבוי</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">גיבוי נתונים בוטל.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">גיבוי נתונים נכשל.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">שגיאה בגיבוי נתונים</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">גיבוי נתונים מתבצע…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">משחזר נתונים מגיבוי…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">שחזור נתונים מגיבוי נכשל.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">הגדרות</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">ספרית משחקים</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">נתוני משחק בספרייה</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">הרחבות מותקנות</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">מידע הרחבות</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">ערכות נושא מותקנות</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">יש לבחור את המידע לשחזור מקובץ הגיבוי שנבחר.\r\n    \r\nפליינייט יבצע הפעלה מחדש ויתחיל את תהליך השחזור באופן אוטומטי.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">יש לבחור את הפריטים לגיבוי. נתוני אפליקציה ונתוני ספריית המשחקים יגובו כברירת מחדל.\r\n    \r\nפליינייט יבצע הפעלה מחדש ויתחיל את תהליך הגיבוי באופן אוטומטי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">גיבוי נתונים אוטומטי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">תדירות גיבוי אוטומטי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">ספריית גיבוי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">גיבויים מתחלפים</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">כלול מידע נוסף:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">יש להגדיר תיקיית גיבוי במידה והופעלה אפשרות הגיבוי האוטומטי.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">הצגת התראות לשחרור עדכונים בלבד</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">כאשר מופעל, רק עדכוני גרסה עיקריים הקשורים לגרסה המותקנת יופיעו בהודעת העדכון.\r\nעדכוני גרסה חדשים לא יופיעו בהודעת העדכון.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">השתמש בתאריכים יחסיים עבור השבוע האחרון</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">יש להשתמש בערכים יחסיים כמו &quot;היום&quot;, &quot;אתמול&quot; במידה ומדובר בפחות משבוע.\r\n    \r\nערך זה ישמש עבור כלל התאריכים.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">חפש תמונה ברשת</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">טקסט לחיפוש איקון</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">טקסט לחיפוש תמונת כיסוי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">טקסט לחיפוש תמונת רקע</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">מביא מידע על הרחבה…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">אין מקור מטא נתונים זמין</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">הגדרות פעולת הפעלה</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">השתמש בהגדרות סורק</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">בחר פרופיל בהפעלה</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">בחר אמולטור בהפעלה</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">אוטומטי</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">תמיד מופעל</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">תמיד כבוי</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">תמיכת נגישות (קורא מסך)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">תפריט האפליקציה</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">תפריט משחק</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">תיקיית התוכנה</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">תיקיית קבצי משתמש</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">שגיאה בקובץ ספריה, פליינייט ייסגר.\r\n    \r\nיש לפתוח בקשה בעמוד ה-GitHub של פליינייט על מנת לבקש תיקון לשגיאה בקבצים אלו.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">האם לשמור את השינויים שביצעת?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">התקנה ניידת</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">לא נמצאו בקרים</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/hr_HR.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Hrvatski</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite jezik</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Izlaz</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtar je aktivan</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filter isključen</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Dodatni filteri</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filteri</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Nevažeći podaci</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Sačuvaj promjene?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Website: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Izvorni kod na GitHubu</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Napravi novi dijagnostički paket</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Pošalji dijagnostičke informacije</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">O Playniteu</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Napravio Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Dodeli kategoriju</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Postavi kategorije</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Dodaj kategoriju</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Čekirano - Dodaj kategoriju\r\nNečekirano - Obriši kategoriju\r\nNeodređeno - Bez izmjena (kada izmjenjujete više igara)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Bez kategorije</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Bez platforme</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ups! Nešto je pošlo po krivom...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Neoporavljiva greška se dogodila.\r\n\r\nAko nam želite pomoći popraviti situaciju, molimo opis poduzetih akcija prije pada, te slanje dijagnostičkih podataka. Ako ste priključeni na internet, paket će se učitati na Playnite poslužitelje za analizu.\r\n\r\nAlternativno, možete kliknuti na 'Prijavi Pad' tipku da napravite novi GitHub slučaj i prijavite pad ručno.\r\n\r\nHvala ti na tvojoj pomoći.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Dodatak &quot;{0}&quot; uzrokovao je neoporavljivu grešku.\r\n\r\nPreporučamo da spremite datoteku zapisa i prijavite slučaj razvijatelju dodatka. Ako se slučaj ponovi, onemogućite dodatak.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Dodatak &quot;{0}&quot; uzrokovao je neoporavljivu grešku.\r\n\r\nPreporučamo da prijavite slučaj razvijatelju dodatka. Ako se slučaj ponovi, onemogućite dodatak.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Nepoznati dodatak ili tema su uzrokovali nepopravljivu grešku.\r\n\r\nPreporučujemo da isključite vanjske dodatke, izolirate problematični dodatak i prijavite problem razvojnom timu dodatka.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Nepopravljiva greška se dogodila.\r\n\r\nAko nam želite pomoći da riješimo ovaj problem, molimo da nam pošaljete dijagnostičke informacije. Hvala vam.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Onemogući dodatak</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Spremi datoteku zapisa</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Pošalji dijag. info</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Prijavi problem</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Restartujte Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Ponovno pokreni u sigurnom načinu rada</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Onemogućavanje svih dodataka trećih strana i korištenje zadane teme.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Izađite iz Playnitea</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Stvari koje ste radili prije greške (na engleskom):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Menadžer biblioteke igara</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Obriši igru(e)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Nemoguće ukloniti - Igra ili instalacija je pokrenuta.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Nemoguće deinstalirati - Igra je pokrenuta.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Želiš li sigurno ukloniti {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Sigurno želite ukloniti {0} igre?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Sigurno želite ukloniti {0} igre?\r\n\r\nOdabir opcije &quot;dodaj na listu izuzetaka&quot; će spriječiti da igre budu ponovno uvedene kada se knjižnica bude ponovno ažurirala.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Jeste li sigurni da hoćete da obrišete {0} odrednica koje nisu u korišćenju?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Nema pronađenih nekorišćenih polja.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Da (dodaj na listu izuzetaka)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Postoje promjene koje nisu spremljene u ovom dijelu</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Ažuriranje formata biblioteke igara…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Neuspjelo ažuriranje baze podataka.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Ne može da se ažurira biblioteka igara. {0} MB-a slobodnog prostora je potrebno za to.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">GreškaIgre</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Ne može da se uđe u igru. '{0}' nije pronađeno u bazi podataka.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Ne može da se uđe u igru: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Ne može da se započne radnja: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Ne može da se otvori lokacija igre: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Nije moguće detektirati veličinu instalacije igrice: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Greška prilikom skeniranja veličine instalacije</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Pojavilo se {0} grešaka prilikom skeniranja veličine instalacije</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Neuspjelo pravljenje prečaca: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Nemoguće je otvoriti priručnik:{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Ne može da se instalira igra: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Ne može da se deinstalira igra: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Instalacija implementacije nije dostupna</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Knjižnični dodatak odgovoran za ovu igru je onemogućen ili nije instaliran.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Preuzimanje zvaničnih metapodataka nije dostupno.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Nije odabrana nijedna igra.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Neuspjelo pokretanje skriptirane radnje igre.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Neuspjelo pokretanje skripte za aplikaciju</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Neuspjelo pokretanje globalne skriptirane radnje.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Neuspjelo pokretanje emulatorske skripte</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Neuspjelo pokretanje skriptirane radnje igre.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 ili noviji nije instaliran.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Nije moguće utvrditi kako pokrenuti igru</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Uključeno</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Obriši</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Obriši nekorišćeno</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Preimenuj</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopiraj</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Dodaj</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Zadana ikona</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Zadana naslovnica</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Zadana pozadina</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Završi</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Dalje</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Natrag</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">ZAVRŠENO</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">NATRAG</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">OČISTI</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Očisti</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Odbaci</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Odbaci sve</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Uvezi</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Naziv</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Serija</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Verzija</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Posljednji put igrano</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Najviše igrano</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Vreme igranja</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Veličina instalacije</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Mapa</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Zabilješke</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Dodato</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Datum dodavanja</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Promijenjeno</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Datum izmjene</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Website</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Putanja</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Sačuvaj</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Zatvori</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Poništi</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Potvrdi</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Ponovno postavi</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Da</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Ne</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Dobrodošli</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Lokalni korisnik</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Općenito</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Media</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Linkovi</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Instalacija</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Radnje</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Preuzimanje…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Preuzimanje medija...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Učitavanje…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Vrsta</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profili</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Obriši</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Preuzmi</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Pretraži</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Rezolucija:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Bilo koja</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Uvećaj</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Prikaz liste</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Naslovnice</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Prikaz rešetke</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Prikaz detalja</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Prilagođeno</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Posebna zahvala</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licenca</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Suradnici</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Izlaženje iz Playnitea…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Danas</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Jučer</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Ponedjeljak</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Utorak</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Srijeda</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Četvrtak</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Petak</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Subota</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Nedjelja</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Prošli tjedan</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Prošli mjesec</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Prošla godina</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Prije više od godinu dana</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 do 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB do 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB do 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB do 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB do 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB do 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB do 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB ili više</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Uvoz je uspješno završen.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Sve igre</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ID Igara</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">ID baze podataka</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Preseti</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Stupac</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Stupci</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Red</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Redovi</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Samo preuzmi metapodatke koji nedostaju</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Uključivanje ove opcije će da preskoči preuzimanje metapodataka za polja podataka koja već sadrže neku informaciju.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Odabir igara</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Molimo izaberite koje igre treba da se ažuriraju novim metapodacima:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Sve igre iz baze podataka</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Sve trenutno filtrirane igre</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Samo odabrane igre</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Zvanična radnja</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Molimo odaberite koja polja trebaju automatsko popunjavanje od strane Playnitea i koji izvori treba da se koriste da bi se iz njih uzeli podaci.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Molimo da ako želite kliknite na logo iznad i doprinesite nadopune na websiteu igdb.com da biste poboljšali podatke koje Playnite koristi.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Preuzimanje metapodataka…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Uvođenje instaliranih igara…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Uvođenje {0} igara…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Uvozim emulirane igre iz {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Preuzimanje ažuriranja biblioteke igara…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Pretraživanje zauzeća igara u biblioteci...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Pretraživanje zauzeća uvezenih igara...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Ažuriranje biblioteke igara završeno</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Odpuštanje resursa…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Konfiguracija</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Postavke...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platforme i emulatori</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Konfiguriraj emulatore…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Menadžer biblioteke igara…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Alati</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Preuzmi metapodatke…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Programski Alati...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Podesi Integracije...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Otvori klijent</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Klijenti Treće Strane</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Ažuriraj biblioteku igara</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Zaustavi ažuriranje biblioteke</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Dodaj igru</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Ručno…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Skeniraj automatski…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emulirana igra…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store aplikacija…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">O Playniteu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Pošalji povratne informacije</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Zameni u mod cijelog zaslona</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Linkovi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Pomoć</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Podržite na Patreonu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Korisnički priručnik</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK dokumentacija</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Ponovno pokreni sustav</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Isključi sustav</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Suspendiraj sustav</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernacija sustava</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Zaključaj sustav</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Odjavi korisnika</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Izaberi igru nasumice</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Polja igara koja će se prikazivati na detaljnom panelu:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Razmak između stvari</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Nacrtaj pozadinu za rešetke</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Širina granice rešetki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Izvor za igre koje nedostaju ikonu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Izvor za igre koje nedostaju naslovnicu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Izvor za igre koje nedostaju pozadinu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Vertikalni razmak detalja igre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Pozicija detalja na rešetkastom prikazu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Pozicija liste igara na detaljnom prikazu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Nacrtaj separator između panela</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Visina naslovnice igre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Visina ikone igre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Aplikacijski font</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Pozicija filterskog panela</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Pozicija istraživačkog panela</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Predstavljanje naslovnice</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Omjer slike</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Slijedeće opcije također utječu na prikaz punog zaslona!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Mod rastezanja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD kutija</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam baner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam vertikalna naslovnica</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Zahtjeva restartovanje da bi se apliciralo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Postavke</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Općenito</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Izgled</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Detalji igara</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Raspored</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Napredno</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Cijeli zaslon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Unos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Performanse</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metapodaci</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Ažuriranje</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Pretraga</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Sigurnosna kopija</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Uvezi promjene u biblioteku igara automatski</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Pogrešna lokacija fajla baze podataka, ispravna putanja se mora podesiti.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Naziv računa ne može biti prazan.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Preuzmi metapodatke nakon uvoženja igara</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Pokreni Playnite smanjen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Pokreni Playnite pri pokretanju računala</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Pokreni spušteno u programskoj traci</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Neuspjelo registriranje pokretanja Playnitea prilikom pokretanja kompjutera.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Pokreni u Prikazu Punog Zaslona</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asinkrono učitavanje slika</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Poboljšava glatkost skrolovanja listi igara u zamjenu za sporije učitavanje slika.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Prikaži naziv igre ako naslovnica nedostaje</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Prikaži nazive igara na prikazu rešetke</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Zatamni igre koje nisu instalirane</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Prikaži ikone igara na listi prikaza detalja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Prikaži broj stavki na grupnim opisima</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Pokaži samo dodjeljena polja na filterima i panelima preglednika</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Isključi hardversko ubrzanje</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Koristite samo kada imate probleme s mucanjem ili sličnim UI problemima</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Prikaži skrivene igre u popisima brzog pokretanja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Broj stvari brzog pokretanja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Koristi pozadinu igre kao pozadinu prozora</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Zamagli pozadinu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Visoka kvaliteta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Potamni pozadinu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Prikaži na prikazu rešetke</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Profil teme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Tema za cijeli zaslon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Profil teme za cijeli zaslon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Lokacija baze podataka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Status prijave:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite postavke</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Očisti web predmemoriju</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Možda popravi probleme pri spajanju računa.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Prikaz sistemske ikone</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Smanji Playnite u sistemsku traku</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Smanji Playnite u sistemsku traku pri zatvaranju prozora aplikacije</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Kada se igra pokrene:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Nakon što se igra zatvori:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Oblikovanje nadnevka:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Ovo će vas odjaviti sa svih povezanih servisa. Restartovanje aplikacije je potrebno za ovo, hoćete li da nastavite dalje?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Očisti predmemoriju?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Restartovanje Playnitea je potrebno da bi se aplicirala nova tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Uzmi više tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Kreiraj novu temu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Nabavite više proširenja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Napravi novo proširenje</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Pomozi nam prevesti Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Restartujte Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Vreme igranja se neće brojati ako je &quot;Zatvori&quot; radnja postavljena.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Broj redova</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Broj stupaca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Broj redova u detaljnom prikazu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Prikaži pozadinu na glavnom zaslonu</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Ne aplicira se retrospektivno već postojećim igrama bez ponovnog preuzimanja metapodataka.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Uvezi vrijeme igranja igara u biblioteci</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Uvijek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Samo za svježe uvezene igre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Nikad</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Uključi podršku za kontroler u desktop načinu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Guide dugme otvara mod cijelog zaslona</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Uvijek koristi glavni zaslon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Prikaži nazive igara</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Prikaži status baterije</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Prikaži postotak baterije</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Prikaži sat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Skrij pokazivač miša</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Samo instalirano u brzim filterima</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Stil tipki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Raspored</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Vodoravno skrolovanje</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Odaberite jedan od pododjeljaka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Nema dostupnih postavki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Učitavanje postavki neuspjelo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Ove skripte se pokreću za svaku igru u biblioteci igara. Pojedinačne skripte mogu se dodeliti svakoj igri odvojeno tokom izmjene igrinih detalja.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animiraj izmjene pozadine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Veličine fonta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automatski</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Ima drugi naziv</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Sivi tonovi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">OčistiVrstu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Idealno</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Zaslon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Mod formatiranja teksta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Mod predstavljanja teksta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Učitaj pozadinske slike unaprijed</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Ako je uključeno, Playnite će da preuzima pozadine tokom preuzimanja metapodataka, samim time koristiće i više prostora na hard disku i omogućiće da slike budu dostupne i kada niste na mreži.\r\n\r\nAko je isključeno, pozadine će se preuzimati samo kada su potrebne, samim time koristiće se i manje prostora, što će možda rezultirati zakašnjenjem prije nego što su slike prikazane i neke slike također neće biti dostupne kada niste na mreži.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Automatski zatvori klijent nakon što se izađe iz igre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Ne zatvaraj nakon sesije igranja kraće od (u sekundama)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Automatski zatvori sljedeće klijente:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Automatski zatvori klijente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Prikaži upozorenje kada dodjeljuješ prevelike medijske podatke za igru</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Ništa</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Popuni</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Uniforma</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Uniforma koja se popunjava</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Lijevo</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Desno</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Vrh</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Dno</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Greška prilikom uvoza</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Autentifikacija potrebna</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Autentifikacija neuspjela</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\"></sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Uvoz metapodataka</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Preuzimanje metapodataka</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Namestite da se odabrana konfiguracija koristi za bilo koja buduća preuzimanja metapodataka.\r\nOvo takođe može da se promjeni i u postavkama aplikacije.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Čarobnjak za uvoz emulatora</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Uvek možete da dodate dodatne emulatore i/ili igre kasnije koristeći glavni meni (ispod &quot;Biblioteka igara&quot; menija za emulatorske postavke i &quot;Dodaj igre&quot; menija za emulirane igre).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Nijedan emulator nije odabran za uvođenje. Nećete moći da automatski uvodite bilo kakve emulirane igre bez prvo konfiguriranja emulatora. Jeste li sigurni da želite da nastavite i izađete iz procesa uvođenja?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Skeniraj folder koristeći emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Odaberi datoteke</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Pronađi u mapi...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Konfiguriraj emulatore…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Skeniranje…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Pretraživanje {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Konfiguriranje pri prvom ulasku u Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Ovaj postupak će te voditi kroz automatski uvoz i postavljanje vanjskih biblioteka igara. Playnite može automatski uvesti igre od više vanjskih biblioteka, kao što su Steam ili GOG.\r\n\r\nImaj na umu da također možeš ručno dodati bilo koju po volji, ili emuliranu igru s bilo koje platforme kasnije kroz glavni izbornik.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integracija biblioteke igara</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Sljedeće predstavlja popis provjerenih integracija biblioteka koje Playnite podržava. Molimo odaberite koje želite instalirati.\r\n\r\nMoguće je instalirati više integracija kasnije kroz izbornik &quot;Dodatci&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Konfiguriranje završeno</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Inicijalno konfiguriranje je sada završeno. Zapamtite da možete uvek da promijenite sve postavke kasnije u &quot;Postavke&quot; meniju.\r\n\r\nMožete također i da dodati bilo koju drugu igru kasnije tako što kliknete na Playnite logo.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Preuzimanje {0} integracije…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Preuzimanje popisa preporučenih integracija…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Neuspješno preuzimanje popisa preporučenih integracija. Možete pokušati preuzeti kasnije putem izbornika &quot;Dodatci&quot;.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Konfiguriraj platforme i emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Konfiguriraj emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platforme</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulatori</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Dodaj platformu</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Odaberite ikonu</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Odaberite naslovnicu</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Odaberite sliku</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Odaberite stavku</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Odaberi pozadinu</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Odaberi datoteku</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Odaberi URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Dodaj emulator</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Podržane platforme</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Želite li sačuvati izmjene za platformu?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Želite li sačuvati izmjene za emulator?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Fajl za pokretanje</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumenti</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Radni direktorij</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Podržane vrste datoteka</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Uvezi emulatore…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Preuzmi emulatore…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Učitaj presete argumenata iz poznatih emulatorskih profila</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Jeste li sigurni da hoćete da obrišete {0} emulator(a)?\r\nUpravo ga(ih) koristi {1} igra(e).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Jeste li sigurni da hoćete da obrišete {0} platformu(i)?\r\nUpravo je(ih) koristi {1} igra(e) i {2} emulator(a).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Pomoć oko postavki</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sortiraj prema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Smjer poretka</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Grupiraj po</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Uzlazno</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Silazno</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Ne grupiraj</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Grupiraj po biblioteci igara</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Grupiraj po kategoriji</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Grupiraj po platformi</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Vrsta prikaza</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Prikaz</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Istraživački panel</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Filterski panel</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ikona</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Naslovnica</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Pozadina</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Sortirajući naziv</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Biblioteka igara</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Priručnik</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Naziv</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Naziv računa</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platforma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategorija</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Žanr</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Datum izdavanja</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Godina objavljivanja</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Developer</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Oznaka</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Izdavač</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Status instalacije</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Instalirano</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Instalirano</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Nije instalirano</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Skriveno</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favorit</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Posljednji put igrano</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategorija</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Opis</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Lokacija instalacije</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Naslovnica</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Linkovi</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Image, ROM ili ISO putanja</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Žanr</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Žanrovi</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Tvrtka</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Tvrtke</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Developer</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Developeri</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Izdavač</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Izdavači</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategorija</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategorije</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Oznaka</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Oznake</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Značajka</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Značajke</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Dobna ocjena</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Dobne ocjene</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Regija</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regije</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Izvor</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Izvori</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Nedavna aktivnost</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Greška u bazi podataka</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Neuspjelo otvaranje baze podataka biblioteke igara.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Baza podataka nije otvorena.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Ne možemo da pristupimo bazi podataka biblioteke igara. Datoteka &quot;{0}&quot; je već korišćena od strane drugog procesa ili je to nepristupačna lokacija.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Neuspjelo pravljenje dijagnostičkog paketa.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Neuspjelo automatsko uploadovanje dijagnostičkog paketa.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Dijagnostičke informacije su uspješno poslate.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Neuspjeli uvod igara iz {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Ne može da se odradi pretraga igara sa odabranim emulatorskim profilom. Profil ne sadrži nikakve ekstenzije datoteka ili platforme.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite se nije uspio pokrenuti. Molimo zatvorite ostale instance i pokušajte ponovno.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Neuspjelo apliciranje teme &quot;{0}&quot;, profil boje &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Ne može da se otvori link, URL nije u validnom formatu.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Neuspjelo pokretanje aplikacije</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Uredite detalje igara</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL slike</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Dodaj link</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Dodaj ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Sačuvaj promjene</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Dodaj radnju</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Obriši radnju</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Ukloni radnju za igru</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Dodaj igre</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Skeniraj folder…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Detektiraj instalirane igre</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Istraži…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Otvori Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Postavke profila</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Naziv igre ne može biti prazan.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Naziv igre ne može biti prazan prije pretrage metapodataka.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Nevažeći podaci o igri</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Napišite validni URL koji počinje sa https:// ili http://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Odaberi URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Neuspjelo preuzimanje metapodataka: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Greška pri preuzimanju</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Očistite filtere</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Privatni račun</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Javni račun</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API ključ</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Greška prilikom pokretanja</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Greška teme</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Počisti sve</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Instalacija</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Deinstaliranje</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Pokretanje</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Pokrenuto</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Neispravan URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Ne čini ništa</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Umanji</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Povrati prozor</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Zatvori</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Promjeni</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Napredno</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Nikad</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Status završenosti</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Ocene korisnika</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Ocene kritičara</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Ocene zajednice</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Skripte</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Pluginovi</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Izvori metapodataka</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Proširenja</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID proširenja</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Osvježi skripte</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Sve skripte uspješno osvježene.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Nijedna igra nije pronađena koristeći filtere i unos koje ste zadali i pretražili</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Promjeni na desktop mod</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Izađite iz Playnitea</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Biblioteke igara</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Ažuriraj sve</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Napravio:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Verzija:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Biblioteka igara</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\"></sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Sve</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Ništa</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Obavijesti</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Širina</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Visina</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Veličina</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Malo</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normalno</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Veliko</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Veće</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Najveće</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Zadano</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Odaberi</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Označi sve</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Odznači sve</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Prvo</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Nasumice</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Korisnički odabir</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Učitaj još</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Transparentno</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Sažmi</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Proširi</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Sažmi sve</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Proširi sve</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Ostalo</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Teme</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Emulatorski argumenti</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Dodatni emulatorski argumenti</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Nadglasaj emulatorske argumente</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Odaberite igre koje hoćete da uvedete</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Pretraga metapodataka</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Dostupna su ažuriranja</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Promjene od poslednjeg ažuriranja</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Preuzmi i instaliraj ažuriranje</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Provjeri ima li ažuriranja</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Greška pri ažuriranju</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Nesupjelo provjeravanje ima li nove verzije.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Nema nove verzije, već imate najnoviju.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Neuspjelo preuzimanje i instaliranje ažuriranja.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Ponovo učitaj listu tema</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Apliciraj odabranu temu</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Nadgledaj promene datoteka</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Automatski apliciraj temu kada se izvorna datoteka promjeni</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Dužina trajanja skripte</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\"></sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Sačuvaj kao zadano</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Dodaj u favorite</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Ukloni iz favorita</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Skrij igru</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Izmjeni…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Veličina instalacije</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Postavi kategoriju…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Postavi status završenosti</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Obriši</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Igraj</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Instaliraj</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Opcije igre</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Detalji</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Deinstaliraj</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Otvori lokaciju instalacije</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Napravi prečac na desktopu</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Otvori priručnik</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Još</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Savjet: Možete koristiti još napredniji proces za preuzimanje metapodataka ako izmjenjujete jednu igru koristeći &quot;Izmjeni&quot; opciju u meniju.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Nije dostupno kada je neka radnja u toku.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Opisni tekst je HTML sintaksa-senzitivan</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Instalacijska veličina je iskazana u bajtovima</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Brojevi od 0 do 100 ili prazno su za bez bodova.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Programiranje, lokalizacija i drugi suradnici bez posebnog redosleda:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Prekinite praćenje igre?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Vreme igranja</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Posljednji put igrano</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minuta</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} sekundi</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Nije igrano</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Otvaranje desktop moda…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Otvaranje moda cijelog zaslona…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Učitavanje biblioteke igara…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Računanje instalacijske veličine...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Neuspjela instalacija skript fajla.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Skripta uspješno instalirana.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Instaliraj skriptu</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Greška u skripti</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Neuspjelo pokretanje funkcije proširenja.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Otvori folder metapodataka</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} klijent nije instaliran.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} klijent je sada otvoren. Molimo prijavite se i onda zatvorite ovu poruku.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Čekanje da se korisnik prijavi, molimo zatvorite ovo kad ste gotovi…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Lokacija instalacije igre nije pronađena.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Pogrešna konfiguracija radnje igre.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Rješavanje problema s sinkronizacijom računa</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Rješavanje problema</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Preimenuj stavku</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Dodaj novu stavku</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Unesite naziv</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Unesite novi naziv</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Manje od sat vremena</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">Od 1 do 10 sati</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">Od 10 do 100 sati</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">Od 100 do 500 sati</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">Od 500 do 1000 sati</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Proširenje nije ispravno zapakirano</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Tema nije ispravno zapakirana</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Proširenje &quot;{0}&quot; se nije ispravno učitalo</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Nije moguće učitati proširenje &quot;{0}&quot;, trenutna verzija Playnite-a nije podržana</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Tema &quot;{0}&quot; se nije uspjela ispravno učitati</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Nije moguće učitati temu &quot;{0}&quot;, trenutna verzija Playnite-a nije podržana</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Proširenje se nije ispravno učitalo</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Tema se nije ispravno učitala</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Tema/proširenje koristi nepodržanu API verziju.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Instalacija je uspješna.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Instaliraj proširenje?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Instalacija dodatka &quot;{0}&quot; nije uspjela</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Neuspjela instalacija proširenja.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Instalacija teme nije uspjela.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Želite li instalirati novu temu?\r\n\r\n{0}\r\nOd {1}\r\nVerzija {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Želite li ažurirati temu &quot;{0}&quot;?\r\n\r\nTrenutna verzija: {1}\r\nNova verzija: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Izaći ćete iz Playnite-a i uputiti se k navedenoj web stranici koristeći svoj zadani web preglednik. Želite li nastaviti?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Upozorenje za performanse</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Ne prikazuj ponovo</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Odabrana slika je možda prevelika za optimalne performanse.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Instalacijska mapa</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Uvezi datoteku</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Pregled</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Bočna traka</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Prikaži na bočnoj traci</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Ponovno postavljanje postavki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Za razvojne programere</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Vanjska proširenja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Unesite potpuni put do mape</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Postignuća</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Vijesti</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Stranica u radnji</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Nedavno igrano</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favoriti</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Najviše igrano</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Sve</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Neki filteri su aplicirani.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Rezultati pretrage za:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Stavka s istim imenom već postoji.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Limitiraj odabir na trenutni filter.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Izaberi drugu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Dodatci…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Instalirano</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Ažuriranja</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Instaliraj</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Već instalirano</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Prihvati</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Odbij</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Poveznica</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Datoteka</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Zadano</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Premjesti tipku glavnog izbornika na površinu stranice</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">U zadnjih 7 dana</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">U zadnjih 31 dan</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">U zadnjih 365 dana</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Prije više od 365 dana</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Postavi</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Spremi predložak</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Smanji nakon pokretanja igre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Smanji Playnite nakon pokretanja igre.\r\n\r\nIsključivanje ove postavke može dovesti do poteškoća s igrama koje ne dobivaju fokus pri pokretanju!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Veličina znakovlja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Mala veličina znakovlja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Odaberi datoteku…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Odaberi mapu…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Nije pronađena skripta pri pokretanju.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpen\"></sys:String>\r\n    <sys:String x:Key=\"LOCActivate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAssign\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Postavke</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Instalirane teme</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Mapa sigurnosne kopije</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/hu_HU.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Magyar</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Nyelv</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Kilépés</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Szűrő bekapcsolva</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Szűrő kikapcsolva</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">További szűrők</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Szűrők</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Szűrés</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Érvénytelen adat</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Módosítások mentése?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Oldalunk címe: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Forráskód a GitHub-on</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Diagnosztikai csomag létrehozása</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Diagnosztika küldése</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Névjegy</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Készítette: Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Hozzáadás kategóriához</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Kategóriákhoz adás</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Új kategória létrehozása</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Pipálva - Kategóriához adás\r\nÜres - Kategória eltávolítása\r\nNégyzet - Ne változzon (több játék állításakor)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Nincs kategória</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Ismeretlen platform</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Hoppá! Valami hiba történt…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Helyrehozhatatlan hiba történt.\r\n\r\nHa segíteni szeretnél a hiba elhárításában, röviden foglald össze, mit csináltál az összeomlás előtt és hozz létre egy diagnosztikai csomagot. Ha online vagy, a csomagot elküldöm a Playnite szerverre, elemzésre.\r\n\r\nMás esetben használhatod a 'Hibajelentés küldése' gombot, hogy új hibajegyet hozz létre a GitHub-on és kézzel készítsd el a hibáról az összefoglalót. Angol nyelven kommunikálj, ha kérhetem.\r\n\r\nKöszönöm a segítséged!</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">&quot;{0}&quot; bővítmény összeomlott.\r\n\r\nJavasoljuk, hogy mentsd el a naplófájlt, és jelentsd a problémát a bővítmény készítőjének. Ha ismétlődik a probléma, tiltsd le a bővítményt.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">&quot;{0}&quot; bővítmény összeomlott.\r\n\r\nJavasoljuk, hogy jelentsd a problémát a bővítmény készítőjének. Ha ismétlődik a probléma, tiltsd le a bővítményt.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Ismeretlen bővítmény vagy téma miatti váratlan összeomlás.\r\n\r\nAzt javasoljuk, hogy tiltsd le a harmadik féltől származó bővítményeket, hogy kizárhasd a hibásat, és utána jelentsd a fejlesztőjének a problémát.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Helyrehozhatatlan hiba történt.\r\n\r\nHa segíteni szeretnél a hiba elhárításában, küldj hibajelentést. Köszönöm!\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Bővítmény tiltása</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Naplófájl mentése</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Diagnosztika küldése</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Hibajelentés küldése</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Playnite újraindítása</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Újraindítás csökkentett módban</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Minden harmadik féltől származó bővítmény letiltása és az alap téma használata.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Kilépés a Playnite-ból.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Röviden foglald össze, mit csináltál az összeomlás előtt (angolul):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Könyvtárkezelő</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Listából való törlés megerősítése</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Nem tudom törölni, a játék vagy a telepítője még fut.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Nem tudom eltávolítani, a játék még fut.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Biztos eltávolítod {0}-t?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Biztos, hogy eltávolítasz {0} játékot?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Biztosan eltávolítod {0} játékot?\r\n        \r\nA &quot;hozzáadás a kivételekhez&quot; beállítást választva megakadályozhatod, hogy a következő könyvtárfrissítéskor hozzáadja ismét a játékot.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Biztosan eltávolítasz {0} játékot?\r\n        \r\nA &quot;hozzáadás a kivételekhez&quot; beállítást választva megakadályozhatod, hogy a következő könyvtárfrissítéskor hozzáadja ismét a játékot.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Biztosan eltávolitasz {0} nem használt játékot?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Nem található üres mező.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Igen (hozzáadás a kivételekhez)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Nem mentett változások vannak</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Játékkönyvtár formátumának frissítése...</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Adatbázis frissítése sikertelen.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Játékkönyvtár frissítése nem sikerült. {0} MB üres hely kell hozzá.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Játék hiba</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Nem lehet elindítani a játékot. '{0}' nem található az adatbázisban.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Nem lehet elindítani a játékot: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Művelet nem elvégezhető: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Játék helye nem megnyitható: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Nem tudtam megállapítani a játék méretét: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Hiba a játék méret megállapítása közben</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">{0} hiba történt a játékok méretének megállapítása közben</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Nem sikerült {0} parancsikonját létrehozni</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Nem sikerült megnyitni {0} kézikönyvét.</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">{0} játék nem telepíthető</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">{0} játék nem eltávolítható</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Nem találtam indítási műveletet. Amikor emulátor műveleteket használsz, győződj meg róla, hogy a platform definíciók azonosak a játéknál és az emulátor beállításaiban.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">A telepítés funkció nem elérhető.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Az ehhez a játékhoz tartozó könyvtár beépülők nincsenek bekapcsolva / engedélyezve.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Hivatalos metaadat letöltés nem elérhető.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Nincs játék kiválasztva.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">A játék indítószkript végrehajtása sikertelen.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Hiba a programszkript futtatásában.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Globális indítószkript végrehajtása sikertelen.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Hiba az emulátorszkript futtatásában.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Indítószkript végrehajtása sikertelen.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 vagy újabb nincs telepítve.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Nem lehet hogy elindítani a játékot.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Bekapcsolva</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Letiltva</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Eltávolítás</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Nem használtak törlése</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Átnevez</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Másolás</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Hozzáadás</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Alapértelmezett ikon</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Alapértelmezett borítókép</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Alapértelmezett háttér</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Kész</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Tovább</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Vissza</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">VISSZA</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">TÖRÖL</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Szűrők törlése</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Mégsem</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Inkább mégsem</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importálás</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Név</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Szerző</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Sorozat</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Verzió</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Utoljára játszott</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Legtöbbet játszott</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Indítások száma</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Telepített méret</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Mappa</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Jegyzetek</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Hozzáadva</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Hozzáadás dátuma</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Módosítva</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Módosítás dátuma</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Weboldal</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Elérési út</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Mentés</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Bezárás</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Mégse</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Megerősít</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Visszaállít</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Igen</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Nem</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Üdvözlünk</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Helyi felhasználó</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Általános</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Média</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Linkek</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Telepítés</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Műveletek</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Letöltés...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Médiaadatok letöltése...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Betöltés…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Típus</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profilok</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Törlés</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Letöltés</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Keresés</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Felbontás:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Bármely</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Nagyítás</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Listanézet</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Borítók</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Rácsnézet</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Részletes nézet</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Egyéni</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Külön köszönet</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licensz</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Közreműködők</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Kilépés a Playnite-ból...</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Ma</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Tegnap</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Hétfő</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Kedd</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Szerda</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Csütörtök</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Péntek</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Szombat</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Vasárnap</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Múlt Héten</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Múlt Hónapban</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Múlt Évben</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Több, mint egy éve</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 és 100MB között</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB és 1GB között</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1 és 5GB között</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5 és 10GB között</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10 és 20GB között</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20 és 40GB között</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40 és 100GB között</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB és nagyobb</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Importálás sikeres</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Összes játék</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Játék azonosító</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Adatbázis azonosító</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Sémák</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Oszlop</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Oszlopok</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Sor</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Sorok</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Nem sikerült ikont kinyerni az indítási műveletből. Nincs futtatható fájl kiválasztva.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Csak a hiányzó metaadatok letöltése</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Ha bekapcsolod, metaadat letöltésekor átugorja a már meglévő adatokkal teli mezőket.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Játék választás</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Kérlek válaszd ki mely játékok metaadatait szeretnéd frissíteni:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Az adatbázis összes játéka</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">A jelenleg szűrt összes játék</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Csak a kiválasztott játékok</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Nincs metaadat mező kiválasztva</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Nincs letöltendő metaadat mező kiválasztva. Válassz ki legalább egyet, és jelölj ki egy metaadat szolgáltatót hozzá.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Hivatalos áruházból</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Kérlek válaszd ki mely mezőket frissítse a Playnite automatikusan, és milyen forrásból.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Támogasd az igdb.com-ot azzal, hogy az adatbázisukhoz hozzájárulsz saját anyaggal.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Metaadatok importálása...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Telepített játékok importálása...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">{0} játék importálása…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">{0} Emulált játékok importálása …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Könyvtár frissítések letöltése...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Játékok méretének megállapłtása…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Importált játékok méretének megállapítása…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Könyvtár frissítve</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Erőforrások felszabadítása...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Beállítások…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platformok és emulátorok</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Emulátorok beállítása...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Könyvtárkezelő...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Eszközök</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Metaadatok importálása...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Szoftvereszközök…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Integrációk beállításai…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Külső kliens megnyitása</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Harmadik féltől származó alkalmazások</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Játékkönyvtár frissítése</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Könyvtár frissítés leállítása</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Emulátorok mappáinak frissítése</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Játék hozzáadása</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manuálisan...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Automatikus beolvasással...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emulált játék...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store alkalmazásból…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Névjegy</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Visszajelzés küldése</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Teljesképernyős mód</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Linkek</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Súgó</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Támogass a Patreon-on</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Támogass a Ko-Fi-n</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Kézikönyv</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK Dokumentáció</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Újraindítás</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Leállítás</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Készenléti állapot</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernálás</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Zárolás</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Kijelentkezés</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Véletlenszerű játék kiválasztása</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Megjelenítendő mezők a részletes nézetnél:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Borítótávolság</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Kép keret megjelenítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Keret szélessége</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Helykitöltő ikon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Helykitöltő borítókép</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Helykitöltő háttérkép</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Függőleges távolság a játékinfók felett</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Rácsnézet részletek helye</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Részletes nézet játéklista helye</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Elválasztó a panelek közé</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Borítókép magassága</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Játéklista ikon magassága</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">A program betűtípusa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Fix szélességű betű</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Szűrőpanel helye</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Platformpanel helye</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Borítókép minőség</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Célzott képarány</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Az alábbi beállítások a teljesképernyős mód bélyegkép megjelenítését is változtatják!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Nyújtás módja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD borító</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store-féle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy-féle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB-féle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Négyzetes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam széles borítók</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam magas borítók</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch-féle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Újraindítás szükséges az alkalmazáshoz</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Általános</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Felső panel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Megjelenés</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Játék részletek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Kinézet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Speciális beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Teljesképernyős mód</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Bevitel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Teljesítmény</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metaadatok</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Frissítés</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Keresés</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Biztonsági mentés</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Könyvtáradatok mentése</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Könyvtáradatok visszaállítása</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Könyvtár változások automatikus követése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Hibás adatbázis útvonal, helyes fájl útvonal kell legyen megadva.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Fióknév nem lehet üres</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Metaadatok importálása a játékok hozzáadása után</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Playnite indítása kis méretben</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Playnite indítása a Windows indításakor</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Indítás tálcaikonként</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Nem sikerült beállítani a Windows indításakori programindítást.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Indítás teljesképernyős módban</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Nem egyidejű kép betöltés</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Simább játéklista görgetés, de lassabb képbetöltés.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Hiányzó borítókép helyett a játék neve látszódjon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Játéknevek a borítók alatt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Nem telepített játékok sötétítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Játékikonok kijelzése a részletes nézetben</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Csoportok leírásánál az elemek számának megjelenítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Csak a kijelölt mezőket mutassa a szűrőknél és platformpanelnél</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Hardveres gyorsítás tiltása</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Kapcsold be, ha szaggat, vagy más hibát produkál a program</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Elrejtett játékok megjelenítése a gyorsindító listákban</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Az ugráslistára és tálcamenüre van hatással.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Gyorsindító lista elemeinek száma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Használja a játék hátterét az ablak hátterének</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Háttérkép életlenítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Jó minőségű életlenítés</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Háttérkép sötétítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Háttérkép rácsnézetben is</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Téma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Téma szín</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Teljesképernyős téma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Teljesképernyős téma profil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Adatbázis helye</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Bejelentkezési állapot</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Gyorsítótár ürítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Megoldhatja a fiókok összekapcsolási problémáit.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Rendszertálca-ikon megjelenítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Playnite rendszertálcára kicsinyítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Playnite rendszertálcára kicsinyítése, amikor bezárod a programot</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Játék indítása után:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Játék bezárása után:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Időformátum a játékidő meghatározására</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Dátum formátum:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Ez kiléptet az összes szolgáltatásból. Ehhez újra kell indítani az alkalmazást, folytatod?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Gyorsítótár ürítése?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">A Playnite újraindítása szükséges a téma alkalmazásához</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Még több téma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Új téma?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Bővítmények letöltése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Új bővítmény létrehozása?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Segíts a Playnite fordításában</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">A beállítások alkamazásához újra kell indítanod a Playnite-ot. Újraindítsam most?\r\n\r\nAz újraindítás minden futó feladatot (letöltést) megszakít.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Újraindítod a Playnite-ot?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">A Playnite nem helyezi át automatikusan a könyvtárak fájljait, azt neked kell átmásolni/átmozgatni, mielőtt itt módosítod a helyüket. Ha nincs könyvtár a célhelyen, akkor újat fog létrehozni.\r\n\r\nAz új adatbázis helye csak újraindítás után lesz alkalmazva. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">A játékidő nem lesz rögzítve ha a &quot;Bezárás&quot; van kiválasztva.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Sorok száma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Oszlopok száma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Sorok száma részletes nézetben</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Háttérkép megjelenítése a főképernyőn</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Visszamenőleg nem vonatkozik a meglévő játékokra a metaadatok letöltése nélkül.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Játékidő importálása az alábbi játékokhoz:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Azt állítja be, hogy a Playnite mikor importálja be a könyvtárbeépülők által megadott játékidőket az adatbázisába. Ehhez a játékokhoz tartozó könyvtárbeépülők támogatása szükséges.\r\n\r\nMindig: mindig beimportálja az új és meglévő játékok játékidejét a Playnite adatbázisba.\r\nCsak új importált játékokat: csak az újonnan importált játékok idejét adja hozzá.\r\nSosem: semmilyen esetben sem importál játékidőt.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Mindig</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Csak új importált játékokat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Sosem</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Játékvezérlő támogatása ablakos módban</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Guide/PS gomb teljesképernyős módra vált</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Automatikus metaadat beállítások új játékok hozzáadásánál.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Megjelenítő kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Mindig az elsődleges képernyő használata.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Játékcímek megjelenítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Akkumulátor szintjének megjelenítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Százalékos töltöttség megjelenítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Óra megjelenítése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Egérkurzor elrejtése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Csak telepítettek a gyorsszűrésnél</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Kontroller gombfeliratok</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Kinézet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Vízszintes görgetés</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Válassz az almenük közül</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Nincsenek elérhető beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Nem sikerült a beállítások betöltése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Ezek a szkriptek minden játéknál lefutnak. Egyéni szkripteket a játékoknál lehet a szerkesztés menüben definiálni.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Háttérkép váltások animálása</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Betűméretek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automatikus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Élsimított</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Szürkeárnyalatos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideális</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Kijelzőhöz igazított</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Szöveg formázás</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Szöveg megjelenítés</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">A szövegformázási és megjelenítési módok jelenleg nincsenek hatással a játékok leírásaira.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Háttérképek előtöltése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Ha engedélyezve van, az összes háttérkép a metaadatokkal együtt töltődik le, ezáltal több tárhelyet használ, de a képek elérhetőek lesznek offline is.\r\n\r\nHa ki van kapcsolva, a háttérképek első megtekintésnél töltődnek le, ezáltal kevesebb tárhelyet használnak, de késleltetve fognak megjelenni, és nem lesznek elérhető offline.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Játék bezárásakor automatikusan zárja be a klienseket is</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Kliens bezárásának késleltetése (másodpercben)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Ne zárja be, ha a játékidő rövidebb volt, mint (másodpercben)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Az alábbi kliensek automatikus bezárása:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Kliensek auto. bezárása</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Kivétellista importálása</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Figyelmeztessen túl nagy méretű médiafájlok importálásakor</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Parancs egyéni mappa nyitáshoz</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Korhatár-besorolás rendezési módja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Frissítésnél újra olvassa-e be a játékok méretét is</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Frissíti a játékok méretét, ha az utolsó beolvasás óta változtak</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Nincs</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Kitöltés</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Arányos</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Arányos kitöltött</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Balra</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Jobbra</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Fent</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Lent</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Hiba importálásnál</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Hitelesítés szükséges</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Nem sikerült bejelentkezni</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Alternatív webes megjelenítési mód</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Akkor használd, ha problémás a weboldalak megjelenítése, pl. felugró párbeszédablakok nem látszanak.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Hosszú játékleírások részleges betöltése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Játékkiválasztásnál a hosszú leírások akadáshoz vezethetnek.\r\n\r\nHa bekapcsolod, csak a leírás eleje fog betöltődni egy lehetőséggel, hogy betöltse az egészet.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Metaadatok importálása</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Metaadatok letöltése</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Beállítja a konfigurációt alapértelmezettnek az elkövetkező metaadat letöltések számára.\r\nA programbeállításoknál is megváltoztatható.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Emulátor Importálás varázsló</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Ez a varázsló segít a játékkonzol emulátorok letöltésének és importálásának folyamatában, valamint az emulált játékromok hozzáadásában.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Ne felejtsd, hogy bármikor adhatsz hozzá emulátort és emulált játékot kézzel a főmenüből (a &quot;Könyvtár&quot; menüpontból eléred az emulátor beállításokat és a &quot;Játék hozzáadása&quot; menüpontból az emulált játékokat).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Az alábbi listában található emulátorokat a Playnite automatikusan felismeri és beállítja. Le tudod tölteni és telepíteni őket a sor végén található linkre kattintva. Ha feltelepítetted az emulátorokat (kézzel), lépj a következő képernyőre hogy beimportálhasd a Playnite-ba őket.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">A gépeden telepített emulátorokat tudod a &quot;Automatikus felismerés mappából...&quot; gombbal importálni. A Playnite végigkeresi a mappákat az általa ismert emulátorok után és felajánlja az importálás lehetőségét. Több mappából is importálhatsz a már említett gombbal; az újonnan felismert emulátorok a lista aljára kerülnek.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">A játékokat a &quot;Játék hozzáadása emulátorhoz&quot; gombbal tudod beimportálni. A megfelelő emulátor kiválasztásával a Playnite tudni fogja, hogy mely fájltípusok legyenek beolvasva és importálva. Több mappából is importálhatsz a már említett gombbal; az újonnan felismert játékok a lista aljára kerülnek.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Nincs kiválasztva emulátor az importáláshoz. Nem tudsz automatikusan importálni egy emulált játékot sem anélkül, hogy először beállítanál egy emulátort. Biztosan folytatod és kilépsz az importálásból?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Nincs egy emulátor sem beállítva a Playnite-ban. Nem tudsz importálni játékokat, ha nem állítod be az emulátorát és választod ki a fájltípusát. Szeretnél most új emulátort beállítani?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Mappa beolvasása az emulátorral</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Fájlok kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Automatikus észlelés mappából...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Emulátorok beállítása…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Beolvasás...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">{0} beolvasása…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Kezdeti lépések</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Ez a varázsló segít beállítani az automatikus játék importálást, és a külső könyvtárak beállítását. A Playnite automatikusan beimportálja a játékszolgáltatóktól (pl. Steam, GOG, Epic games) a játékokat, és frissíti az esetleges változásokat indításkor.\r\n\r\nNe felejtsd, hogy bármikor adhatsz hozzá játékot bármelyik platformhoz kézzel a főmenüből, ha rákattintasz a 'Playnite' gombra bal fent.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Játékkönyvtár integráció</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Automatikusan importálja a játékokat a következő szolgáltatóktól. Bármilyen későbbi változások automatikusan frissülnek a Playnite indulásakor, vagy ha kézzel elindítod a frissítést. A most kiválasztott szolgáltatók befolyásolják a kezdeti és későbbi importálást.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Készen vagyunk a beállításokkal</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">A kezdeti lépésekkel készen vagyunk. Ne feledd, hogy az összes beállítást eléred a 'Beállítások' menüpontból.\r\n\r\nMáshonnan származó játékot hozzáadhatsz a 'Playnite' logós főmenüből (bal felső sarokban).</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Nem sikerült letölteni egy vagy több bővítményt.\r\n\r\nMegpróbálhatod újra letölteni őket a bővítmények menüből, miután lefutott a varázsló.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">{0} integráció letöltése…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Az ajánlott integrációk listájának letöltése…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Nem sikerült az ajánlott integrációkat letölteni. Később újrapróbálhatod a Bővítmények menüből.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Platformok és emulátorok beállítása</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Emulátorok beállításai</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platformok</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulátorok</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulátor</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Platform hozzáadása</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Ikon kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Borító kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Kép kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Elem kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Háttér kiválaszása</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Fájl kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">URL kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Emulátor hozzáadása</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Támogatott platform(ok)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Mented a platform változásokat?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Mented a nem mentett változásokat?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Program</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Paraméterek</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Munkamappa</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Támogatott fájltípusok</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Emulátorok importálása...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Emulátorok letöltése...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Paraméterek betöltése az ismert emulátor profilból</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Biztosan eltávolítod {0} emulátort?\r\nJelenleg {1} játék használja.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Biztosan eltávolítod {0} platformot?\r\nJelenleg {1} játék és {2} emulátor használja.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Beállítások súgó</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sorbarendezés</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Sorbarendezés</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Csoportosítás</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Növekvő</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Csökkenő</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Nincs csoportosítás</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Könyvtár szerinti csoportosítás</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Kategória szerinti csoportosítás</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Platform szerinti csoportosítás</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Nézettípus</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Nézet</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Platformpanel</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Szűrőpanel</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ikon</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Könyvtár ikon</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Borítókép</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Háttérkép</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Rendezési név</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Könyvtár</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Egyéni</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Név</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Meghajtó betűjele</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Fiók neve</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategóriák</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Műfajok</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Megjelenési dátum</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Kiadás éve</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Fejlesztők</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Címkék</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Kiadó</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Telepítési állapot</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Szűrők egyeztetése</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Ha engedélyezve van, csak az összes szűrővel szűrt játék fog látszódni.\r\nHa kikapcsolod, bármelyik szűrővel szűrt játék fog látszódni.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Telepítve</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Telepített</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Nincs telepítve</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Rejtett</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Kedvencek</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">HDR engedélyezése</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Bekapcsolása esetén az elsődleges kijelzőre engedélyezi a HDR-t a játék indítása előtt.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">A HDR nem támogatott az elsődleges kijelződön.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Utoljára játszva</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategória</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Leírás</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Telepítési hely</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Borítókép</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Linkek</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">ROM/ISO mappája</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Műfaj</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Műfajok</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Kiadó</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Kiadók</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Fejlesztő</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Fejlesztők</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Kiadó</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Kiadók</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategória</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategóriák</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Címke</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Címkék</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Jellemző</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Jellemzők</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Korhatár</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Korhatárok</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Régió</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Régiók</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Forrás</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Források</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Aktivitás</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Adatbázis hiba</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Hiba a könyvtár adatbázis megnyitásakor.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Az adatbázist nem lehet megnyitni.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Nem lehet hozzáférni a könyvtár adatbázishoz. A fájl &quot;{0}&quot; egy másik művelet által van használatban, vagy elérhetetlen helyen van.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Hiba történt a diagnosztika csomag létrehozásakor.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Nem sikerült a diagnosztikai csomag automatikus frissítése.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">A diagnosztika csomag sikeresen elküldve.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">A diagnosztika csomag sikeresen létrehozva és feltöltve.\r\nKérlek csatold hozzá a a következő ID-t a hibajegyhez:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Nem sikerült a {0} játékok importálása.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Nem sikerült a {0} emulált játékok importálása.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Nem lehet keresni játékot a kiválasztott emulátor profil alapján. Nincs beállítva platform vagy kiterjesztés.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">A Playnite már fut. Zárd be az összes futó folyamatát, majd próbáld meg újra.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">&quot;{0}&quot; téma és &quot;{1}&quot; színbeállítás nem sikerült\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Nem sikerült a linket megnyitni, az URL nem megfelelő formátumú.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Nem sikerült az alkalmazás elindítása.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Nem sikerült a webes elem elindítása, a Playnite nem indult el.\r\n\r\nTöbb információt a https://playnite.link/cefstartup oldalon találsz.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Nem sikerült az emulátorok importálása, az emulátorok definíciói hiányoznak vagy sérültek.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Menü művelet futtatása nem sikerült.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">játék részletek szerkesztése</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Kép URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Link hozzáadása</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Játék ROM hozzáadása</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Változások mentése</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Szerkesztett játék(ok) módosított mezőinek mentése.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Müvelet hozzáadása</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Művelet eltávolítása</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Indítási művelet eltávolítása</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Játékok hozzáadása</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Mappa beolvasása...</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Telepített játékok importálása</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Tallózás…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Playnite megnyitása</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Profil beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">A játék neve nem lehet üres.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">A játékművelet rögzítő mappája nem lehet kitöltetlen.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Metaadatok keresése előtt a játék neve nem lehet üres.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Hibás játékadat</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Adj meg helyes URL-t, ami http:// -vel VAGY https:// -sel kezdődik</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">URL kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Hiba a metaadatok letöltésekor: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Hiba a letöltésben</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Szűrök törlése</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Nem publikus fiók</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Publikus fiók</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API Kulcs</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Indítási hiba</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Téma hiba</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Az összes törlése</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Telepítés folyamatban</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Eltávolítás</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Indítás</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Fut</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Helytelen URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Ne tegyen semmit</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Tálcára kicsinyítés</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Ablak visszaállítása</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Ablak visszaállítása csak akkor, ha a felhasználói felületről lett indítva</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Bezárás</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Változtatás</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Speciális</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Soha</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Befejezettség</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Befejezettség</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Felhasználók értékelése</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Kritikusok értékelése</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Közösség értékelése</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Játékszkriptek</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Alkalmazásszkriptek</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Szkriptek</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Beépülők</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Metaadat források</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Bővítmények</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Bővítményazonosító</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Szkriptek újratöltése</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Interaktív SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Minden szkript újratöltve.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Nem találtam játékot a megadott adatok alapján</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Nincs találat</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Ablakos módra váltás</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Kilépés a Playnite-ból</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Könytárak</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Az összes frissítése</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Készítő:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Verzió:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Frissítve:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Könyvtár</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statisztikák</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Az összes játék</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Nincs</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Értesítések</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Szélesség</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Magasság</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Méret</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Kicsi</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normál</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Nagy</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Nagyobb</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Legnagyobb</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Alapértelmezés</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Kiválaszt</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Az összes kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Kijelölés törlése</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">az elsőt</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">véletlenszerűen</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">kérdezzen rá</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Továbbiak betöltése</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Átlátszóság</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Összecsukás</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Kibontás</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Az összes összecsukása</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Az összes kibontása</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Egyéb</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Témák</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Emulátor paraméterek</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Beépített paraméterek</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Egyéni paraméterek</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">További emulátor paraméterek</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Emulátor paraméterek felülírása</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Indítási művelet</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Metaadatok kiválasztása importáláshoz</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Importálandó játékok kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Metaadatok keresése</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Frissítés elérhető</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Változások az utolsó frissítés óta</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Frissítés letöltése és telepítése</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Frissítések keresése</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Frissítési hiba</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Nem sikerült ellenőrizni a frissítéseket.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Az aktuális verzió naprakész.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Frissítés letöltése és telepítése sikertelen.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Egy háttérfolyamat jelenleg is fut. Megszakítod, és folytatod a frissítés telepítését?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Egy háttérfolyamat jelenleg is fut. Megszakítod, és bezárod a Playnite-ot?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Egy háttérfolyamat jelenleg is fut. A módok közötti váltás befejezi a háttérfolyamatot. Szeretnéd folytatni?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Playnite frissítés elérhető</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Témalista újratöltése</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Kiválasztott téma használata</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Témafrissítések figyelése</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Frissített téma automatikus alkalmazása</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Szkript futtatás</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Játék indítása előtt futtatott szkript</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Játékból kilépés után futtatott szkript</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Játék indítása után futtatott szkript</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Alkalmazás indításakor futtatandó</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Alkalmazás leállításakor futtatandó</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Játék indítása előtti szkript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Játék futása alatti szkript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Játékból kilépés utáni szkript</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Globális szkript futtatása</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Globális</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Szűrt</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Jelenlegi</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Új</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Szkript tesztelése</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Csak a kijelöltek látszódjanak.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Mentés alapértelmezettként</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Kedvencekhez ad</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Törlés a kedvencekből</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Játék elrejtése</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Törlés a rejtettekből</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">HDR bekapcsolása</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">HDR kikapcsolása</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Szerkesztés…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Játékméret kiszámolása</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Játékméret kiszámolása (minden játéknál)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Játékméret kiszámolása (csak ahol nincs adat)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Játék mérete</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Kategóriához adás…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Befejezettség beállítása</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Törlés</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Indítás</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Telepítés</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Játékbeállítások</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Részletek</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Eltávolítás</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Tartalmazó mappa megnyitása</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Parancsikon az asztalra</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Kézikönyv megnyitása</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Tovább</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Könyvtár beépülő kezeli</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">A játékindítás az ehhez a játékhoz tartozó könyvtár beépülőből lesz kezelve.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">'{0}' játékról nem található használható információ a megadott oldalon.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Protip: Precízebb metaadat importálást lehet használni a játék &quot;Szerkesztés&quot; menüpontját választva.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Nem elérhető néhány folyamat alatt.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">A játékleírásban használhatsz HTML kódot</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Másodperc alapú játékidő követés és rögzítés</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Játékméret, byte-ban.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">A megjelenési dátumnak az 'év-hónap-nap' formátumot kell követnie (a hónap és nap értékek opcionálisak).</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Pontérték 0-100-ig, vagy üres mező, ha nincs értékelve.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">A Playnite fejlődésének támogatói és Ko-Fi adományozói:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Kód, fordítás és egyéb közreműködők:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Játékfigyelés megszüntetése?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">A játék telepítés figyelő jelenleg is fut. Meg akarod szakítani a folyamatot és visszatérsz a játék előző állapotához?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">A játékfigyelő jelenleg is fut. Meg akarod szakítani a folyamatot és visszaállitani a játék előző állapotát?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Játékidő</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Utoljára játszott</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0} nap {1} óra {2} perc</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}:{1}</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} perc</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} másodperc</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Sosem játszott</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Ablakos módba lépés…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Teljesképernyős mód indítása…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Játékkönyvtár megnyitása…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Játékméret kiszámolása…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">{0} méretének kiszámolása…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Szkriptfájl telepítése nem sikerült.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Szkriptfájl sikeresen telepítve.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Szkript telepítése</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Szkript hiba</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">A bővítmény hibát jelzett.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Metaadat mappa megnyitása</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Kiszámol</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Automatikusan kiszámolja a játék méretét a ROM-ok alapján, ha be lett állítva könyvtár a játéknak</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} kliens nincs telepítve.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">A megnyíló {0} kliens ablakában jelentkezz be, és zárd be ezt az üzenet.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Bejelentkezésre vár, zárd be ezt, ha készen vagy…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">A játék telepítési mappája nem található.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Helytelen a művelet konfigurációja</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Fiók szinkronizálási hibaelhárító</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Hibaelhárítás</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Átnevezés</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Új hozzáadása</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Írj be nevet</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Írj be új nevet</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Kevesebb, mint egy óra</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1-től 10 óráig</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10-től 100 óráig</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100-tól 500 óráig</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500-tól 1000 óráig</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000 óra felett</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">A Playnite-ot újra kell indítani a telepítés befejezéséhez. Szeretnéd újraindítani most?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">A bővítmény helytelenül csomagolt.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">A téma helytelenül csomagolt.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">{0} bővítményt nem sikerült betölteni.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">{0} bővítmény betöltése nem sikerült, a Playnite verziója nem támogatott.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">{0} témát nem sikerült betölteni.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">{0} téma betöltése nem sikerült, a Playnite verziója nem támogatott.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">A bővítményt nem sikerült betölteni.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">A témát nem sikerült betölteni.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">A Téma/Bővítmény nem támogatott API-t használ.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Sikeres telepítés.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Telepítsem a bővítményt?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Általános</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">&quot;{0}&quot; bővítmény telepítése nem sikerült.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">{0} bővítmény telepítése nem sikerült.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Telepíted az új bővítményt? {0} \r\nKészítő: {1}\r\nVerziószám: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Frissíted {0} bővítményt?\r\nJelenlegi: {1}, új verziószám: {2}.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">{0} téma telepítése nem sikerült.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Telepíted az új témát? {0} \r\nKészítő: {1}\r\nVerziószám: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Frissíted {0} témát?\r\nJelenlegi: {1}, új verziószám: {2}.</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Elhagyod a Playnite-ot és megnyitod a {0} weboldalt a böngésződdel. Folytatod?</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">A választott kép(ek) túl nagy méretűek az optimális működéshez. A nagy képek miatt több memória lesz használatban és lassabb lesz a felület reakcióideje.\r\n\r\nMaximális ajánlott méretek:\r\nIkonok: {0} megapixel\r\nBorítók: {1} megapixel\r\nHátterek: {2} megapixel</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Csökkent teljesítmény</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Ne mutasd többször</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">{0} fájlkiterjesztés nem támogatott.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Nem támogatott fájl kiterjesztés</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">A kiválasztott kép túl nagy méretű az optimális működéshez. </sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Biztos eltávolítod a kijelölt témát? A következő indításnál fog törlődni.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Beépitett témát nem lehet eltávolítani.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Ez a téma nem támogatja ezt a Playnite verziót.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Biztos eltávolítod a kijelölt bővítményt? A következő indításnál fog törlődni.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Beépitett bővítményt nem lehet eltávolítani.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Ez a bővítmény nem támogatja ezt a Playnite verziót.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Telepítési hely</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Adatmappa</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Diagnosztikai csomag létrehozása…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Diagnosztikai csomag feltöltése…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Fájl importálás…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Mi ez?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Biztosan ezt szeretnéd tenni?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Teljes játékidő</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Átlagos játékidő</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Leghosszabb játékidő</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Teljes játékméret</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Áttekintés</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Oldalsáv</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Megjelenítés az oldalsávban</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Beállítások visszaállítása</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Minden beállítás visszaáll alapállapotba, kivéve::\r\n- adatbázis helye\r\n- kivételek listája exportáláshoz\r\n- bővítmény beállítások,  többek között a játékkönyvtár integrációk\r\n    \r\nÚjra kell indítani az alkalmazást a véglegesítéshez. Visszaállítod a beállításokat?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Fejlesztőknek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Külső bővítmények</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">A mappa elérési útja</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Eredmények</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Fórum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Újdonságok</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Áruházbeli oldala</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">A kezdeti lépések nem lettek befejezve. A Playnite újraindul Ablakos módban, hogy befejezhesd.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Nemrég játszott</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Kedvencek</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Legtöbbet játszott</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Az összes játék</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Szűrt lista.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Több szűrő van beállítva.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Találatok:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Már van ilyen név.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Jeleneg szűrtekből válasszon</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Még egy véletlenszerűen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Bővítmények…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Telepített bővítmények</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Bővítmény beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Bővítmények letöltése</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Frissítések</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">{0} frissítés</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">A telepített bővítmények és témák kezelése és a beállításaik az új &quot;Bővítmények&quot; menübe lettek áthelyezve.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Az összes játékkönyvtár integrációs bővítményt lehet itt állítani.\r\n\r\nHa telepíteni vagy eltávolítani szeretnéd őket, használd a főmenü &quot;bővítmények&quot; menüpontját.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Asztali nézet témák</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Teljes képernyős témák</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Keresés…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Ez a bővítmény nem támogatja ezt a Playnite verziót.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Bővítmény telepítőcsomag letöltése sikertelen.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Bővítmény telepítőcsomag lista letöltése sikertelen.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">A Playnite újraindítása szükséges a változtatások alkalmazásához.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">A bővítmény telepítése ütemezve.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Telepítés</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Újratelepítés</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Eltávolítás</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Már telepített</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Nem találtam frissítést a bővítményekhez.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Bővítmények frissítése</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Változásnapló nem elérhető</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">A telepítés ütemezve</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Sikertelen letöltés</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Licensz elutasítva</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">{0} letöltése…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Bővítmények frissítésének keresése…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Frissítések keresése…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Egy vagy több frissítés elérhető.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Válaszd ki a frissítendőket</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Bővítmény fejlesztői változat</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} licenszfeltételek</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Elfogad</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Elutasít</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Játékkönyvtár integrációkat is beleértve</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Művelet kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Rögzítés módja</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Rögzítés elérési útja</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Játékidő indítás késleltetése</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Játékidő követés gyakorisága</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Link</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Fájl</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulátor</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Szkript</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Alapértelmezés</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Folyamat</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Mappa</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Eredeti folyamat</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Folyamat neve</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Nyomonkövetési üzenetek naplózása</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">A módosítások felülírják az összes kijelölt játék szerkesztett adatát!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Nincs</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Arányos</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Csak az elemek</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Csak kezdés és befejezés</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Görgetési érzékenység</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Sima görgetés</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Görgetés sebessége</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Elem eltávolítása?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Biztos, hogy eltávolítod ezt az elemet?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Gombok a felső panelen:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Nézet beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Csoportosítási beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Sorba rendezési beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Szűrősémák</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Beépülők helye</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Elválasztó szélessége</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Főmenü gomb az oldalsávon</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Platformpanel</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Véletlenszerű játék</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Véletlenszerű játék</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Véletlenszerű játék kiválasztása a listából</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Sorba rendezési és csoportosítási beállítások mentése</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Mutassa gyorsszűrőként teljes képernyős módban</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Az elmúlt 7 napban</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Az elmúlt 31 napban</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Az elmúlt évben</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Több, mint egy éve</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Beállítás</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Szűrőséma mentése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Játék indítása után tálcára kicsinyítés</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Játék indítása után a Playnite tálcára kicsinyítése.\r\n\r\nHa kikapcsolod, bizonyos játékoknál hibát okozhat, hogy nem kapnak indításkor beviteli elsőbbséget.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Betűméret</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Kis betűméret</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">Játékvezérlő API támogatás</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">XInput támogatás</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Ha ki van kapcsolva, a Playnite nem fogja használni a játékvezérlőket.\r\n        \r\nAkkor kapcsold ki, ha olyan programokat használsz, ami játékvezérlő gombnyomásokat billentyűleütésekké és kurzormozgássá alakítja, és duplázza az inputot.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Elemek mutatása a főmenüben:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">X/A gombok funkciójának felcserélése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">A játékindító X és a játék részletei A gomb funkcionalitását felcseréli.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">OK/mégsem gombok funkciójának felcserélése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Megfordítja az A/B gombok funkcionailtását, így az alapértelmezett A: OK és B: vissza épp ellenkezőleg fog működni.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Csak az elsődleges játékvezérlő</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Csak az első játékvezérlővel tudod irányítani a Playnite-ot.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Guide/PS gombbal előtérbe kerül a Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Felület hangerő</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Háttérzene hangerő</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Háttérben némít</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Hangkezelő indítása nem sikerült.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Kimeneti API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">Hangkimeneti illesztő. Akkor változtasd meg, ha problémák vannak a hanggal.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Általános</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Kép</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Hang</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Kinézet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menük</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Bevitel</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} indul…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} fut…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Nagybetűs</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Szóköz</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Képskálázás módja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternatív</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Kiegyensúlyozott</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Minőségi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Minőségi:\r\nLegjobb képminőség, lassú, nagy memóriahasználat.\r\n    \r\nKiegyensúlyozott:\r\nJó képminőség, gyors, alacsony memóriahasználat.\r\n    \r\nAlternatív:\r\nJobb képminőség, közepes sebesség, alacsony memóriahasználat.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Fájl kiválasztása…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Mappa kiválasztása…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Indítószkript</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Érdemes tudnod, hogy a bővítmények és a témák nagyban befolyásolhatják a Playnite teljesítményét, stabilitását és biztonságosságát.\r\n    \r\nHa problémákat észlelsz egy téma vagy bővítmény telepítése után, érdemes azt lekapcsolni/eltávolítani, hátha az volt az okozója.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Indításkor választható</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Indításkor választható</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Beépített profilok</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Beépített profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Egyéni profilok</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Egyéni profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">A beépített szkript kezeli</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Emulátor adatok</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Platform adatok</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Régió adatok</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Emulátor indítása előtt futtatott szkript</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Emulátor indítása után futtatott szkript</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Emulátorból kilépés után futtatott szkript</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Emulátorprogram nem található.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Emulátor beállítások nem találhatóak.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Emulátor indító szkript nem található.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Külön játékokként kezelje</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Egy játékként kezelje</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Platform beállítása</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Régió beállítása</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Mappa beolvasása</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Beolvasás konfigurációk</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Keresési minták kihagyása az ellenőrző keresésből</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Egyéni keresőmintákkal egyező fájlok nem lesznek ellenőrizve, csak fájlnév alapján. Több infóért nézd meg a súgó emulátor oldalát.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Beolvasás az emulátorral</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Add meg az új konfigurációs fájl nevét. </sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Emulátor vagy a profilja nincs beállítva.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Nincs megadva beolvasandó mappa, vagy nem létezik.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Hibásak a beolvasási beállítások.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Olvassa be automatikusan a tömeges beolvasásnál</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Nem sikerült a mappa beolvasása az emulátorhoz.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Emulált játékok mappájának (mappáinak) beolvasása sikertelen.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Importáltak elrejtése</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Importálandó profilok:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Automatikus beolvasás beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Mentse, mint automatikus beolvasás beállítást</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Mentse el a beállítást későbbi használatra könyvtárfrissítéskor. A mentett beállítások később kezelhetők az &quot;Emulátorok beállítása&quot; menüpontból.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Relatív útvonalak használata importáláskor</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Ha lehet, akkor a Playnite-ot vagy emulátort tartalmazó mappák relatív útvonalait használja a teljes útvonal helyett.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Almappák átvizsgálása</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Tömörített fájlok tartalmát is vizsgálja</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Összetartozó fájlok egyesítése</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Összefésüli az eggyé tartozó játékfájlokat, például iso-kat, egy játékcím alá.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Beolvasó hozzáadása</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Mentett beolvasó hozzáadása</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Beolvasás indítása</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Beolvasási beállításokat állíthatsz be az emulátorokhoz, hogy megadott mappákon futtathasd. Győződj meg importálás előtt, hogy az emulátor helyesen be van állítva (Könyvtár / Emulátorok beállítása menüpont)</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Újonnan hozzáadott játékok automatikus állapota</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Elsőnek játszott játékok automatikus állapota</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">PowerShell szkript futtatási hiba. Ha Windows 7 alól tolod, próbáld meg (újra)telepíteni a PowerShell 5.1-et.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Már van ilyen névvel szűrőséma. Felülírod az új beállításokkal?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Töltse ki automatikusan a rendezési nevet a tömegesen hozzáadott vagy szerkesztett játékoknál</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">Ha könyvtárfrissítéssel, emulátor mappa beolvasással, vagy mappabeolvasással adsz hozzá játékokat, automatikusan töltse ki a &quot;Rendezési név&quot; mezőt egy könnyebben sorba rendezhető játéknévvel. Például a &quot;The Witcher 3&quot; a &quot;Witcher 03&quot;-as rendezési nevet fogja kapni. Nem fog az eredetitől különböző nevet adni, és csak az üres rendezési neveket tölti ki.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Ezeket a szavakat automatikusan eltávolítja a rendezési név elejéről:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Így lehet egyszerűen eltávolítani a rendezési nevek elejéről az extra szavakat. Alapértelmezésben a &quot;The&quot;, az &quot;An&quot; és az &quot;A&quot; kerül eltávolításra.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Rendezési név mező automatikus kitöltése</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Sorbarendezés</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Rendezési név értékek kitöltése…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Nahimic észlelve a gépeden. Ez komoly megjelenítésbeli problémákkal járhat a Playnite és más programok esetében.\r\n\r\nAzt ajánljuk, hogy tiltsd le vagy távolítsd el a problémák megelőzésére.\r\n\r\nTöbb információt (angolul) az alábbi linken találsz: https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">A Playnite rendszergazdai jogokkal fut. Nem ajánlott így futtatni, mert az összes bövítménynek és innen indított játéknak is teljes hozzáférése lesz mindenhez.\r\n\r\nJavasoljuk, hogy rendszergazdai jogok nélkül futtasd, ugyanis a Playnite nem ígényli ezt a működéséhez.\r\n\r\nTöbb infót a https://playnite.link/adminfaq linken találsz.</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Figyelmeztessen, ha rendszergazdaként futtatnám a Playnite-ot.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">A háttértáron elfoglalt helyet használja a játék méretének megállapításához</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Ha bekapcsolod, lassabb lesz a beolvasás, mert a fájlok által elfoglalt tárhelyet számolja ki.\r\nHa kikapcsolod, akkor a fájlok méretét számolja és adja össze.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Az alábbi bővítmények lehetségesen problémásnak voltak jelentve, instabilitás, teljesítménycsökkenés vagy biztonsági problémák miatt.\r\nErősen javasoljuk az eltávolításukat:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Az online fájlok kihagyása a keresésből</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">A felhőben tárolt játékok nem lesznek beolvasva és importálva, ha nem elérhetőek a gépen.\r\nTámogatott platformok: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Fájltartalom vizsgálat nélküli, egyszerű beolvasás</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Nem pontos módja a beolvasásnak, ahol a fájlok nem kellenek a gépen letöltve legyenek.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Alkalmazás mindre</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Telepítési állapot felülbírálása</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Ha be van kapcsolva, a Playnite figyelmen kívül hagyja a beépülő által jelentett telepítési állapotot.\r\n                \r\nBizonyos beépülőknél nem működik teljesen, ahol speciális módon történik a játékimportálás.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Csak kézzel</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Naponta egyszer</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Hetente egyszer</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Minden indításkor</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Frissítések keresése</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Bővítmények frissítésének keresése</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Játékkönyvtárak frissítése</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Emulátorok mappáinak frissítése</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Rejtett játékokat is</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Mezők szerkesztése</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Összes kijelölése / kijelölés megszüntetése</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Megnyitás</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Aktiválás</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Hozzáadás</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Kezdj el gépelni a kereséshez… Segítség: [F1] </sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">A # megmutatja az elérhető parancsok listáját.\r\nA / megmutatja a beépülőket/keresőklienseket.\r\nA keresőszavak utáni szóköz azonnal arra a keresésre áll át.\r\n\r\nTAB: művelet váltása\r\nENTER: művelet kiválasztása\r\nSHIFT+ENTER: elem menü megnyitása</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Nem telepített játékokat is</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Rejtett játékokat is</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Eltávolított játékokat is</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Eltávolított játékokat ne</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Rejtett játékokat is</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Rejtett játékokat ne</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Indít vagy telepít</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Részletek</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Játék menüje</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Játék szerkesztése</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Keresés megnyitása</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Keresődoboz</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Keresőgomb</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Elsődleges indítási művelet</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Másodlagos indítási művelet</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL+F a keresést nyitja meg a keresődobozra ugrás helyett</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Elmenti a szűrőbeállításokat a keresések közt</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Keresőszolgáltatók</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Alapértelmezett kulcsszó</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Egyéni kulcsszó</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Rendszerszintű gyorsbillentyű</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite keresés</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Bővítmény Beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Kivételek</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Fájlok kizárása a beolvasott mappából</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Mappák kizárása a beolvasott mappából</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Fájl hozzáadása a kivételekhez</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Mappa hozzáadása a kivételekhez</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">A kivételeket csak elmentett beolvasó beállításokhoz lehet hozzáadni.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Kivételek hozzáadva a/az {0} beolcasóhoz.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Platform felülbírálása</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">A beolvasó ezt a platformot fogja hozzáadni minden játékhoz, felülírva az automatikusan felismert platformot.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Alapértelmezett kereséshez hozzáadott parancsok</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Ha ki van kapcsolva, az alapértelmezett keresésben nem fog parancsokat használni, csak ha a #-et használod.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Névszűrésnél részbeni egyezés is</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Bekapcsolásakor a globális kereséshez hasonlóan, szövegbeni találatokra is keres. Pontos keresést a ! karakterrel kezdődő kereséssel lehet indítani.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Minden egyes találatnál megjelenítendő információk kiválasztása</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Rejtett</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Biztonsági mentés megszakítva.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Biztonsági mentés sikertelen.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Biztonsági mentési hiba</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Biztonsági mentés folyamatban…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Mentés visszaállítása folyamatban…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Mentés visszaállítása nem sikerült.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Beállításokat</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Játékkönyvtárat</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Játékkönyvtárak médiatartalmát</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Telepített bővítményeket</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Bővítmények adatait</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Telepített témákat</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Válaszd ki a mentés fájlból a visszaállítandó adatokat.\r\n    \r\nA Playnite automatikusan újraindul, hogy elkezdhesse a visszaállítást.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Válaszd ki a biztonsági mentésbe kerülő adatokat. A program beállításai és a játékkönyvtár alapértelmezésben belekerül.\r\n    \r\nA Playnite automatikusan újraindul, hogy elkezdhesse a visszaállítást.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Automatikus biztonsági mentés</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Automatikus biztonsági mentés gyakorisága</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Biztonsági mentés célmappája</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Biztonsági mentések számának limitálása</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Az alábbi adatok is mentésre kerülnek:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Egy mappa megadása kötelező az automatikus biztonsági mentések tárolására.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Csak a hibajavításokról küld értesítést</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Bekapcsolása esetén az új nagy verziójú frissítések nem kerülnek telepítésre, csak a jelenlegi hibajavításai.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Az elmúlt hetek dátumait a mai naphoz viszonyítja </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Ha egy hétnél korábbi a dátum, akkor &quot;ma&quot;, &quot;holnap&quot; tegnapelőtt&quot; lesz használatban.\r\n    \r\nA már megadott dátumformátum lesz érvényes az összes többire.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Webes képkeresés</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Ikonkép keresési módja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Borítókép keresési módja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Háttérkép keresési módja</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Bővítmény információk letöltése…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Metaadat forrás nem elérhető</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Indítási művelet beállítások</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Beolvasó beállítások alkalmazása</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Profil kiválasztása indításkor</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Emulátor kiválasztása indításkor</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automatikus</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Mindig bekapcsolva</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Mindig kikapcsolva</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Könnyű hozzáférés (képernyőolvasó)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Alkalmazásmenü</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Játékmenü</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Program mappája</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Felhasználói adat mappája</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Adatbázisfájl sérülést észleltem, a Playnite le fog állni.\r\n    \r\nKérlek nyiss egy új jegyet a Playnite GitHub oldalán angolul, kérve, hogy javítsák meg a sérült könyvtárfájlt.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Szeretnéd menteni változtatásaidat?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Hordozható (portable) telepítés</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Nem található játékvezérlő</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/id_ID.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Bahasa Indonesia</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Bahasa Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Keluar</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filter aktif</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filter dinonaktifkan</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Filter tambahan</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Data Tidak Valid</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Simpan Perubahan?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Beranda di www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Lihat Source Code di GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Buat Paket Diagnosa</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Kirim informasi diagnosis</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Tentang Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Dibuat Oleh Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Beri Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Atur Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Tambah Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Dicek - Beri kategori\r\nTidak dicek - Hilangkan kategori\r\nTidak tentu - Tidak ada perubahan (ketika mengedit banyak game)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Tidak ada kategori</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Tidak ada Platform</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ups! ada kesalahan…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Kesalahan permanen telah terjadi.\r\n\r\nJika butuh bantuan kami, mohon deskripsikan tindakan sebelum kegagalan, lalu kirim informasi diagnostik. Jika online, paket akan di unggah ke server Playnite untuk di analisa.\r\n\r\nAlternatifnya, anda bisa ketuk tombol 'Lapor Kegagalan' untuk membuat isu GitHub baru dan melaporkan kegagalan secara manual.\r\n\r\nTerimakasih atas bantuannya.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Ekstensi &quot;{0}&quot; menyebabkan masalah yang tidak dapat dipulihkan.\r\n\r\nSebaiknya simpan file log dan laporkan masalah tersebut ke pengembang ekstensi. Jika masalah terus berulang, nonaktifkan ekstensi.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Ekstensi &quot;{0}&quot; menyebabkan masalah yang tidak dapat dipulihkan.\r\n\r\nSebaiknya laporkan masalah ini ke pengembang ekstensi. Jika masalah terus berulang, nonaktifkan ekstensi.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Ekstensi atau tema yang tidak dikenal menyebabkan kesalahan yang tidak dapat diperbaiki.\r\n\r\nKami merekomendasikan untuk menonaktifkan add-on pihak ketiga, serta memisahkan add-on yang bermasalah dan melaporkan masalah kepada pengembang add-on.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Terjadi kesalahan yang tidak dapat dipulihkan.\r\n\r\nJika kamu ingin membantu kami memperbaiki issue ini, mohon kirim informasi diagnostik. Terima kasih.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Nonaktifkan ekstensi</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Simpan file log</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Kirim info diag.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Laporkan Masalah</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Muat Ulang Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Mulai ulang dalam Safe Mode</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Menonaktifkan semua ekstensi pihak ke-3 dan menggunakan tema default.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Keluar Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Aksi yang dilakukan sebelum terjadi kesalahan (dalam bahasa Inggris):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Pengelola Pustaka</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Hapus Game yang dipilih?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Tidak dapat menghapus - Game atau penginstal sedang berjalan. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Tidak bisa mencopot - Game sedang berjalan.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Apakah Anda yakin ingin menghapus {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Anda yakin ingin membuang game {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Apakah Anda yakin ingin menghapus {0}?\r\n\r\nDengan memilih opsi &quot;tambahkan ke daftar pengecualian&quot; akan mencegah game diimpor lagi pada saat perpustakaan diperbarui.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Kamu yakin ingin menghapus game {0}?\r\n\r\nPilih opsi &quot;tambahkan ke daftar pengecualian&quot; akan mencegah game diimpor lagi saat perpustakaan diperbarui.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Kamu yakin ingin menghapus entri {0} yang saat ini sedang tidak digunakan?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Tidak ada field yang sedang tidak digunakan</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Ya (tambahkan ke daftar pengecualian)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Ada perubahan yang belum disimpan di bagian ini</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Memperbarui format pustaka gim…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Update database gagal, gagal membuka file database.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Tidak dapat memperbaharui pustaka gim. {0} MB ruang bebas diperlukan.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Game Error</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Gagal memulai game. '{0}' tidak ditemukan di database.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Gagal memulai game: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Gagal memulai aksi: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Gagal membuka lokasi game: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Tidak dapat menemukan besar instalasi permainan: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Kesalahan pemasangan pemindaian ukuran</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Ada {0} kesalahan selama pemindaian ukuran pemasangan</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Gagal membuat shortcut: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Gagal untuk membuka manual: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Gagal menginstal game: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Gagal menguninstall game: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Tidak ditemukan tindakan startup game yang valid. Ketika menggunakan emulator, pastikan definisi platform cocok antara konfigurasi game dan emulator.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Implementasi instalasi tidak tersedia.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Plugin yang diperlukan untuk game ini tidak terpasang atau diaktifkan.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Unduhan metadata resmi tidak tersedia.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Tidak ada permainan yang terpilih.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Eksekusi skrip game gagal.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Eksekusi skrip aplikasi gagal.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Eksekusi skrip global gagal.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Eksekusi skrip emulator gagal</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Eksekusi aksi skrip Play gagal.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell versi 3.0 atau lebih belum terinstal.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Tidak dapat menentukan cara memulai game.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Aktifkan</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Dinonaktifkan</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Hapus</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Hapus yang tidak digunakan</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Ubah Nama</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Salin</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Tambah</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Ikon Default</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Gambar Sampul Default</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Gambar latar belakang default</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Selesai</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Selanjutnya</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Sebelumnya</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">SELESAI</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">KEMBALI</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">BERSIHKAN</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Bersihkan</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Abaikan</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Abaikan Semua</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Impor</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nama</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Pembuat</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Seri</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versi</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Terakhir dimainkan</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Paling sering dimainkan</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Jumlah Main</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Besar Instalasi</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Folder</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Catatan</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Ditambahkan</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Tanggal Ditambahkan</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Dimodifikasi</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Tanggal Diubah</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Situs web</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Jalur</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Simpan</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Tutup</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Batal</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Konfirmasi</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Setel ulang</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Ya</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Tidak</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Selamat Datang</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">User Lokal</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Umum</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Media</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Link</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Instalasi</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Aksi</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Mengunduh…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Mengunduh media...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Memuat...</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Tipe</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Hapus</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Unduh</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Cari</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Resolusi:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Setiap</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Perbesaran</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Tampilan Daftar</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Sampul</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Tampilan Grid</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Tampilan Detail</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Kustom</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Terima kasih khusus</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Lisensi</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Kontributor</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Keluar Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Hari Ini</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Kemarin</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Senin</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Selasa</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Rabu</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Kamis</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Jum'at</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Sabtu</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Minggu</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Minggu lalu</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Bulan lalu</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Tahun Terakhir</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Lebih dari 1 tahun yang lalu</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 hingga 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB hingga 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB hingga 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB hingga 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB hingga 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB hingga 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB hingga 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB atau lebih</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Import berhasil dilakukan.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Semua gim</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ID Game</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">ID Database</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Prasetel</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Kolom</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Kolom</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Baris</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Baris</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Tidak dapat mengambil ikon dari aksi &quot;Play&quot;. Tidak ada aksi untuk tipe berkas ini.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Download metadata yang hilang</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">\r\nMengaktifkan opsi ini akan melewatkan unduhan metadata pada bidang data yang sudah berisi informasi.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Pilih Game</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Pilih game mana yang akan diupdate dengan metadata baru:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Semua game di database</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Semua game yang difilter</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Hanya game yang dipilih</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Situs Resmi</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Silahkan pilih baris mana yang akan otomatis diisi oleh Playnite dan source mana yang akan digunakan sebagai sumber data.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Klik logo di atas untuk berkontribusi di igdb.com agar meningkatkan data yang bisa digunakan oleh Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Mendownload metadata...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Mengimport game yang terinstal...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Mengimport {0} game...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Mengimpor game emulasi dari {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Mengunduh pembaruan pustaka…\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Memindai ukuran game di perpustakaan game…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Mengecek ukuran dari games yang diimpor ...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Update library selesai</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Melepaskan sumber daya...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Konfigurasi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Pengaturan…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platform dan Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Setel Emulator…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Pengelola Pustaka…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Alat</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Mendownload metadata...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Alat Perangkat Halus...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Konfigurasi Integrasi...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Buka Client Pihak Ketiga</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Klien Pihak Ketiga</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Muat Ulang List Game</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Batalkan Update Pustaka</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Perbarui Folder Emulasi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Tambah Game</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Cari...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Scan otomatis...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Game Emulasi…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Aplikasi Microsoft Store...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Tentang Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Kirim Timbal Balik</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Ganti ke mode Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Tautan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Bantuan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Dukung lewat Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Dukungan Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Panduan pengguna</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Dokumentasi SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Restart Sistem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Matikan Sistem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Suspend System</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernasikan Sistem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Kunci Sistem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Pengguna Keluar</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Pilih Game Secara Acak</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Kolom game untuk ditampilkan pada bilah detail:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Spasi antar item</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Gambar latar belakang item grid</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Lebar batas item grid</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Sumber icon game tidak ditemukan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Sumber cover game tidak ditemukan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Sumber background game tidak ditemukan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Spasi vertikal dalam detail game</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Posisi detail Grid View</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Posisi daftar game di Detail view</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Tambah separator di antara panel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Tinggi gambar cover game</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Tinggi ikon di daftar game</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Fon aplikasi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Huruf monospace</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Posisi panel filter</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Posisi panel Explorer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Rendering gambar cover</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Target rasio aspek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Opsi berikut ini juga memengaruhi rendering ubin dalam mode Layar Penuh!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Regang gambar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Boks DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Game Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Kotak</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Banner Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Cover vertikal Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">Restart untuk melihat perubahan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Pengaturan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Umum</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Panel atas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Penampilan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Detail Gim</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Tata letak</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Opsi Lanjut</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Input</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Performa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Memperbarui</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Cari</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Cadangkan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Cadangkan Data Pustaka</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Pulihkan Cadangan Data</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Import perubahan library secara otomatis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Lokasi file database invalid, silahkan set path yang benar.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Nama akun tidak boleh kosong</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Download metadata setelah mengimpor game</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Luncurkan Playnite diperkecil.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Luncurkan Playnite ketika menyala.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Mulai dengan ditutup ke baki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Gagal menambahkan Playnite ke daftar start up</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Luncurkan dalam Mode Layar Penuh</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Muat gambar secara Asinkron</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Menambah kehalusan scroll list game. Lebih lambat memuat gambar.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Tampilkan nama gim jika sampul tidak ditemukan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Perlihatkan nama game di Grid View</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Gelapkan game yang belum terpasang</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Tampilkan ikon game di Tampilan List</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Perlihatkan jumlah  dalam deskripsi group</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Hanya menampilkan bidang yang ditetapkan pada panel filter dan explorer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Matikan Hardware Acceleration</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Gunakan ketika bereksperimen dengan lag atau masalah UI</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Menampilkan game tersembunyi di daftar quick launch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Mempengaruhi Jump List (Daftar Langsung) dan daftar menu baki.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Jumlah objek mulai cepat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Gunakan gambar background terpilih sebagai background window</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Blurkan background</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Kualitas Tinggi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Gelapkan background</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Tampilkan di Grid View</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Tema Profil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Tema Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Warna Tema Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Lokasi Database</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Status login:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Setting Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Bersihkan cache web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Memungkinkan solusi untuk masalah yang berkaitan dengan akun.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Tampilkan ikon system tray</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Perkecil Playnite ke system tray</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Sembunyikan Playnite ke bilah sistem ketika jendela aplikasi ditutup</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Ketika game dimulai:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Setelah gim ditutup:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Format waktu yang dimainkan untuk menunjukkan jumlah hari yang dimainkan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Format tanggal:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Semua akun akan dilogout. Aplikasi harus dimuat ulang. Lanjutkan?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Bersihkan Cache?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Playnite harus dimuat ulang untuk mengganti tema.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Cari tema baru</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Buat tema baru</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Dapatkan ekstensi lain...</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Buat ekstensi baru</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Bantu kami menerjemahkan Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite perlu dijalankan ulang untuk menerapkan pengaturan baru. Mulai ulang sekarang?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Mulai Ulang Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite tidak dapat memindahkan file pustaka anda secara otomatis. Anda harus memindahkan/menyalin file secara manual sebelum mengubah lokasi. Jika tidak ada pustaka di lokasi target, pustaka baru akan dibuat.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Waktu bermain tidak akan direkam jika aksi &quot;Tutup&quot; diatur.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Jumlah baris</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Jumlah kolom</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Jumlah baris tampilan detail</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Tampilkan Gambar Background di Layar Utama</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Tidak berlaku retrospektif untuk game yang sudah ada tanpa mengunduh ulang metadata.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Impor waktu bermain game di pustaka:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Mengonfigurasi kapan Playnite harus mengimpor waktu bermain yang dilaporkan oleh plugin perpustakaan untuk game di database Playnite. Dukungan dari plugin perpustakaan yang bertanggung jawab menangani game diperlukan untuk dapat menggunakan fitur ini.\r\n\r\nSelalu: Mengimpor waktu bermain untuk game yang baru diimpor dan game yang sudah ada di basis data Playnite.\r\nHanya untuk game yang baru diimpor: Mengimpor waktu bermain hanya untuk game yang baru diimpor.\r\nTidak pernah: Tidak pernah mengimpor waktu bermain dalam keadaan apa pun.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Selalu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Hanya untuk game yang baru saja diimpor</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Tidak pernah</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Hidupkan dukungan controller di mode Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Tombol &quot;Guide&quot; membuka mode Layar Penuh</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Pengaturan unduhan Metadata otomatis untuk game yang baru diimpor.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Layar tujuan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Selalu gunakan layar utama</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Tampilkan Judul Game</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Tampilkan Status Baterai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Tampilkan Persentase Baterai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Tampilkan Jam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Sembunyikan kursor</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Hanya yang terinstal di Quick Filter</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Tipe Tombol Kontroler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Tata letak</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Scrollbar Horizontal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Pilih salah satu sub-bagian</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Tidak ada setelan tersedia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Gagal memuat pengaturan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Skrip ini dijalankan untuk setiap game di perpustakaan. Skrip individual dapat ditetapkan ke setiap game secara terpisah saat mengedit detail game.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animasi transisi gambar latar belakang</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Ukuran font</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Otomatis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Tajam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Hitam putih</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Monitor</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Mode pemformatan teks</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Mode render teks</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Metode rendering dan pemformatan teks saat ini tidak digunakan untuk deskripsi game.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Memuat gambar latar belakang terlebih dahulu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Jika diaktifkan, Playnite akan mengunduh artwork latar belakang saat mengunduh metadata, menggunakan lebih banyak ruang disk dan membuat artwork tersedia saat offline.\r\n\r\nJika dinonaktifkan, artwork latar belakang hanya akan diunduh saat pertama kali dibutuhkan, menggunakan lebih sedikit ruang, tetapi dapat mengakibatkan penundaan sebelum artwork ditampilkan dan beberapa gambar mungkin tidak tersedia saat offline.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Secara otomatis menutup client pihak ketiga setelah game keluar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Penundaan penutupan client (dalam hitungan detik)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Jangan tutup setelah sesi permainan lebih pendek dari (dalam detik)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Otomatis matikan klien berikut:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Tutup klien secara otomatis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Impor Daftar Pengecualian</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Menampilkan peringatan saat menetapkan media game yang terlalu besar</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Perintah buka folder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Organisasi pemeringkatan usia yang diutamakan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Perbarui ukuran penginstalan game pada pembaruan perpustakaan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Memindai dan memperbarui ukuran penginstalan game jika terdeteksi bahwa file-file tersebut telah dimodifikasi sejak pemindaian terakhir</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Tidak ada</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Isi</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Seragam</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Menyesuaikan desain pada bagian yang akan diisi</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Kiri</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Kanan</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Atas</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Bawah</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Error Import</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Login dibutuhkan</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Login gagal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Mode rendering tampilan web alternatif</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Gunakan saat mengalami masalah dengan tampilan web, misalnya dialog autentikasi integrasi.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Memuat sebagian dari deskripsi game yang panjang</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Deskripsi yang panjang dapat menyebabkan lag saat memilih game.\r\n\r\nKetika diaktifkan, hanya sebagian teks deskripsi yang akan dimuat pada awal dengan opsi untuk memuat sisanya sesuai permintaan.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Import Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Download Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Mengatur konfigurasi yang dipilih untuk digunakan pada unduhan metadata di masa mendatang.\r\nDapat juga diubah dalam pengaturan aplikasi</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Panduan Import Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Wizard ini akan memandu Anda melalui proses mengunduh dan mengimpor emulator konsol dan mengimpor game emulasi.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Ingatlah bahwa Anda selalu dapat menambahkan emulator dan/atau game tambahan di kemudian hari melalui menu utama (di bawah menu &quot;Library&quot; untuk pengaturan Emulator dan menu &quot; Tambah Game&quot; untuk game emulasi).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Di bawah ini adalah daftar emulator yang dapat dikenali dan dikonfigurasikan secara otomatis oleh Playnite. Anda dapat mengunduh penginstal emulator dari situs web mereka. Setelah emulator terinstal (secara manual), Anda dapat mengimpornya pada dialog konfigurasi emulator.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Anda dapat mengimpor emulator apa pun yang terinstal di PC Anda dengan mengeklik tombol 'Autodetect Dari Folder...'. Playnite akan mencari folder yang dipilih untuk emulator yang dikenal dan memberikan opsi untuk mengimpornya. Anda dapat menggunakan tombol ini beberapa kali untuk mengimpor emulator dari folder yang berbeda. Emulator akan ditambahkan ke bagian bawah daftar saat ini.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Anda dapat mengimpor game dengan mengeklik tombol 'Pindai Folder Menggunakan Emulator'. Memilih emulator yang sesuai akan memberi tahu Playnite jenis file mana yang harus dipindai dan diimpor. Anda dapat menggunakan tombol ini beberapa kali untuk mengimpor game dari folder yang berbeda. Game akan ditambahkan ke bagian bawah daftar saat ini.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Tidak ada emulator dipilih untuk diimpor. Anda tidak bisa mengimport game emulasi secara otomatis tanpa memilih emulator terlebih dahulu. Apa anda yakin untuk melanjutkan dan tutup proses impor game?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Tidak ada emulator yang dikonfigurasi di Playnite. Anda tidak dapat mengimpor game tanpa mengonfigurasi emulator terlebih dahulu dan memilih jenis file yang sesuai. Apakah Anda ingin menambahkan beberapa emulator sekarang?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Cari folder menggunakan Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Pilih file</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Deteksi Automatis dari Berkas...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Konfigurasi Emulator…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Memindai…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Memindai {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Konfigurasi Awal</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Proses ini akan memandu Anda melalui impor otomatis dan konfigurasi perpustakaan game eksternal. Playnite dapat mengimpor game secara otomatis dari beberapa layanan game, seperti Steam atau GOG.\r\n\r\nIngatlah bahwa Anda juga dapat menambahkan game kustom atau game emulasi secara manual untuk platform apa pun nanti dari menu utama.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integrasi Library</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Berikut ini adalah daftar beberapa integrasi perpustakaan yang didukung Playnite. Pilih salah satu yang ingin Anda instal.\r\n\r\nIntegrasi lainnya dapat diinstal nanti dari menu &quot; Add-ons&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Konfigurasi telah Selesai</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Setelan awal sudah selesai. Ingat bahwa Anda bisa mengubah kembali semua setelan kapan saja di menu 'Setelan'\r\n\r\nKamu juga bisa menambah game lainnya kapanpun dengan mengklik logo Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Gagal mengunduh satu atau beberapa ekstensi.\r\n\r\nAnda dapat mencoba mengunduh ulang integrasi dari menu add-ons setelah wizard pertama kali selesai.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Mengunduh integrasi {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Mengunduh daftar integrasi yang direkomendasikan…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Gagal mengunduh daftar integrasi yang direkomendasikan. Anda dapat mencoba dan mengunduh ulang integrasi nanti melalui menu Addons.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Konfigurasi Platform dan Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Setel Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Tambah</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Pilih Ikon</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Pilih Sampul</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Pilih Gambar</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Pilih Item</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Pilih Background</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Pilih File</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Dari URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Tambah Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Platform yang didukung</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Simpan perubahan platform?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Simpan perubahan emulator?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">File program (file .exe/.sh/.bat, dll..)</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumen</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Direktory Kerja</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Tipe File yang Didukung</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Impor Emulator...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Download Emulator...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">muat argumen preset dari profil emulator yang tersedia</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Apakah Anda yakin ingin menghapus emulator {0}?\r\nEmulator ini sedang digunakan oleh game {1}.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Apakah Anda yakin ingin menghapus platform {0}? Platform ini sedang digunakan oleh {1} game dan {2} emulator.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Bantuan pengaturan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sortir</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Menyortir Arah</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Kelompokkan Berdasarkan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Menaik</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Menurun</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Jangan buat grup</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Kelompokan berdasarkan Pustaka</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Grup berdasarkan Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Grup berdasarkan Platform</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Tipe Tampilan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Tampil</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Panel Penjelajah</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Panel Filter</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ikon</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Ikon Pustaka</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Gambar Sampul</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Gambar Background</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Nama Sortir</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Pustaka</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Petunjuk</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nama</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Instal Drive</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Nama Akun</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Genre</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Tanggal Rilis</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Tahun Rilis</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Developer</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Tag</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Publisher</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Status Instalasi</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Cocokkan semua filter</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Jika diaktifkan, hanya permainan yang menggunakan semua item di semua filter yang akan disertakan dalam tampilan.\r\nJika dinonaktifkan, permainan yang menggunakan item apa pun dalam filter apa pun akan disertakan dalam tampilan.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Terinstal</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Terinstal</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Belum terpasang</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Tersembunyi</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favorit</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Aktifkan Dukungan HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Jika diaktifkan, HDR akan diaktifkan pada tampilan utama sebelum memulai permainan.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Perlu diperhatikan bahwa HDR tidak didukung di layar utama Anda.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Aktivitas terakhir</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Deskripsi</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Direktori Instalasi</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Gambar Sampul</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Link</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Path untuk Image/ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Genre</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Genre</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Perusahaan</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Perusahaan</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Pengembang</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Developer</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Penerbit</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Publisher</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Tag</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Tag</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Fitur</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Fitur</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Rating Umur</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Rating Umur</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Kawasan</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Region</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Sumber</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Sumber</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Aktivitas Terbaru</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Error Database</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Gagal membuka library database.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Database tidak terbuka.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Tidak dapat mengakses database perpustakaan. File &quot;{0}&quot; sedang digunakan oleh proses lain atau berada di lokasi yang tidak dapat diakses.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Gagal membuat paket diagnosa.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Gagal mengunggah paket diagnostik secara otomatis.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Informasi diagnostik berhasil dikirim.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Paket diagnostik telah berhasil dibuat dan dikirimkan.\r\nHarap lampirkan ID berikut ke laporan masalah Anda:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Gagal mengimpor game dari {0}</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Gagal mengimpor game emulasi dari {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Tidak bisa mencari game dengan profil emulator yang dipilih. Profil tidak memiliki tipe file atau emulator apapun.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite gagal memulai. Harap tutup semua instance lainnya dan coba lagi.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Gagal menerapkan tema &quot;{0}&quot;, profil warna &quot;{1}&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Tidak bisa membuka link, URL format tidak valid.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Gagal dalam menjalankan aplikasi.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Gagal menginisialisasi komponen tampilan web. Playnite tidak dapat melanjutkan proses startup.\r\n\r\nInformasi lebih lanjut klik di https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Tidak dapat mengimpor emulator karena file definisi hilang atau rusak.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Gagal mengeksekusi aksi menu.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Edit Rincian Game</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL Gambar</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Tambah Link</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Tambahkan ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Simpan Perubahan</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Terapkan perubahan bidang pada permainan yang sedang diedit.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Tambah Aksi</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Hapus Aksi</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Hilangkan Tombol Mainkan</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Tambah Game</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Pindai Folder...</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Deteksi yang Terinstal</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Telusuri...</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Buka Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Setting Profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Nama game tidak boleh kosong.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Direktori pelacakan aksi permainan tidak boleh kosong.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Nama game tidak boleh kosong sebelum mencari metadata.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Data game Invalid</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Masukan URL web yang valid. Sertakan http:// atau https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Pilih URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Gagal mendownload metadata: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Download Error</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Bersihkan Filter</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Akun Privat</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Akun Publik</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">Kunci API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Error saat memuat</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Tema Error</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Bersihkan semua</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Menginstal...</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Menguninstal</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Meluncurkan...</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Sedang beroperasi</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">URL invalid</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Diamkan aplikasi</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimalkan</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Kembalikan jendela ini</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Pulihkan jendela hanya ketika diluncurkan dari UI</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Tutup aplikasi</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Ubah</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Opsi Lanjut</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Jangan pernah</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Penyelesaian</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Status Penyelesaian</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Skor Pemain</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Skor Kritik</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Skor Komunitas</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Skrip permainan</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Skrip aplikasi</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Skrip</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Plugin</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Sumber Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Ekstensi</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID Ekstensi</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Muat Ulang Skrip</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">SDK PowerShell Interaktif</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Semua skrip berhasil dimuat ulang.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Tidak ada permainan yang ditemukan untuk kriteria pencarian/filter tertentu</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Item tidak ditemukan</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Beralih ke Mode Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Keluar dari Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Koleksi</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Perbarui Semua</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Dibuat Oleh:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versi:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Diperbarui:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Pustaka</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistik</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Semua</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Tidak ada</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Notifikasi</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Lebar</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Panjang</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Ukuran</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Kecil</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Besar</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Lebiih Besar</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Paling Besar</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Bawaan</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Pilih</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Pilih Semua</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Batalkan Semua Pilihan</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Pertama</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Acak</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Pilih Pengguna</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Muat lebih banyak</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Transparan</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Runtuhkan</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Perluas</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Runtuhkan Semua</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Perluas Semua</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Lainnya</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Argumen untuk Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Argumen bawaan</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Argumen Khusus</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Argumen tambahan untuk Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Tindih argumen Emulator dengan...</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Mainkan aksi</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Pilih metadata untuk dimuat</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Pilih game untuk diimport</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Cari metadata</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Update Tersedia</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Perubahan sejak update terakhir</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Install Update</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Periksa Pembaruan</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Update Error</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Gagal memeriksa pembaruan.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Versi baru tidak ditemukan</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Gagal mengunduh dan memasang pembaruan.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Beberapa tugas latar belakang sedang berlangsung. Apakah Anda ingin membatalkannya dan melanjutkan pembaruan?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Beberapa tugas latar belakang sedang berlangsung. Apakah Anda ingin membatalkannya dan keluar dari Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Beberapa tugas latar belakang sedang berlangsung. Beralih mode akan membatalkan tugas, apakah Anda tetap ingin beralih?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Update untuk Playnite tidak tersedia</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Muat ulang list tema</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Gunakan tema yang dipilih</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Saksikan perubahan file</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Gunakan tema secara otomatis ketika source berubah</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Waktu proses skrip</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Jalankan sebelum memulai permainan</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Jalankan setelah keluar dari permainan</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Jalankan setelah permainan dimulai</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Jalankan saat aplikasi dimulai</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Jalankan saat aplikasi dimatikan</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Skrip awal permainan</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Skrip permainan dimulai</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Skrip permainan berhenti</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Eksekusi Skrip Global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Disaring</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Saat ini</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Baru</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Uji skrip</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Hanya tampilkan item yang dipilih.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Simpan sebagai standar</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Tambah ke Favorit</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Hapus dari Favorit</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Sembunyikan game</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Hapus dari Sembunyi</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Aktifkan Dukungan HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Nonaktifkan Dukungan HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Edit</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Hitung ukuran pemasangan</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Hitung ukuran pemasangan (Semua game)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Hitung ukuran pemasangan (Hanya data yang hilang)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Ukuran Instalasi</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Tentukan Kategori...</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Tetapkan Status Penyelesaian</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Hapus</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Mainkan</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Instal</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Opsi Game</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Rincian</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Uninstal</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Buka folder game</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Buat Shortcut di Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Buka Manual</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Lainnya...</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Dikelola oleh plugin pustaka</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Proses memulai permainan akan dikelola oleh plugin perpustakaan yang bertanggung jawab untuk permainan ini.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Tidak ada informasi relevan tentang permainan '{0}' yang ditemukan pada laman yang ditentukan.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Tip: Kamu bisa menggunakan metadata editor yang lebih lengkap di menu &quot;Edit&quot; per game.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Tidak tersedia. Ada yang masih diproses.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Teks deskripsi ini menggunakan format HTML.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">waktu bermain di rekam dalam detik.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Ukuran instalasi ditunjukkan dalam byte.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Tanggal rilis harus ditetapkan dalam format 'tahun-bulan-hari'. Nilai Bulan dan Hari dapat dihilangkan.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Nilai dari 0 sampai 100 atau kosong untuk tidak menilai.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Perkembangan Playnite didukung oleh pelanggan dan anggota Ko-fi berikut:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Kode, lokalisasi, dan kontribusi lainnya, tanpa urut:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Batalkan pemantauan permainan?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Pemantauan instalasi sedang berjalan. Apakah Anda ingin membatalkan proses dan mengembalikan game ke keadaan sebelumnya?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Pemantauan eksekusi permainan sedang berjalan. Apakah Anda ingin membatalkan proses dan mengembalikan game ke keadaan sebelumnya?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Waktu Dimainkan</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Terakhir dimainkan</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0} hari {1} jam {2} menit</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}j {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} menit</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} detik</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Belum Dimainkan</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Buka dalam mode Desktop...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Buka mode layar penuh…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Memuat pustaka game…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Menghitung ukuran instalasi…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Menghitung ukuran pemasangan {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Gagal memasang file skrip.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Modul berhasil diinstall</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Pasang Skrip</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Modul gagal</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Gagal menjalankan fungsi ekstensi.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Buka folder metadata</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Hitung</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Menghitung ukuran penginstalan secara otomatis menggunakan ROM jika game tersebut memiliki ROM atau direktori penginstalan jika telah ditetapkan</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} klien belum terpasang.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} akan dibuka. Silahkan masuk lalu tutup pesan ini.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Menunggu pengguna untuk masuk, silahkan tutup ini setelah Anda selesai...</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Folder instalasi game tidak ditemukan</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Konfigurasi tindakan game tidak valid.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Memecahkan masalah sinkronisasi akun</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Memecahkan masalah</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Ganti nama </sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Tambah</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Beri nama</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Beri nama baru</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Kurang dari satu jam</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 sampai 10 jam</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 sampai 100 jam</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 sampai 500 jam</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 sampai 1000 jam</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite wajib di restart untuk menyelesaikan instalasi. Apakah Anda ingin untuk merestart sekarang?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Ekstensi tidak dikemas dengan benar.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Tema tidak dikemas dengan benar.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Ekstensi &quot;{0}&quot; gagal untuk dimuat dengan sempurna.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Tidak dapat memuat ekstensi &quot;{0}&quot;, versi Playnite saat ini tidak didukung.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Tema &quot;{0}&quot; gagal dimuat dengan sempurna</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Tidak dapat memuat tema &quot;{0}&quot;, versi Playnite saat ini tidak mendukung.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Ekstensi gagal dimuat dengan sempurna.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Tema gagal dimuat dengan benar.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Tema/Ekstensi menggunakan versi API yang tidak didukung.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Instalasi berhasil.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Instalasi tambahan?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Umum</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Gagal memasang add-on &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Gagal menginstal ekstensi.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Apakah anda ingin memasang ekstensi baru?\r\n\r\n{0}\r\nOleh {1}\r\nVersi {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Apakah Anda ingin memperbaharui ekstensi &quot;{0}&quot;?\r\n\r\nVersi saat ini: {1}\r\nVersi baru: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Gagal memasang tema.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Apakah Anda ingin menginstalasi tema baru?\r\n\r\n{0}\r\nDibuat oleh {1}\r\nVersi {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Apakah anda ingin meng-update tema &quot;{0}&quot;?\r\n\r\nVersi saat ini: {1}\r\nVersi terbaru: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Anda akan meninggalkan Playnite dan pergi ke halaman web dengan browser defaut anda. Apakah anda ingin melanjutkan?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Gambar yang dipilih mungkin terlalu besar untuk performa yang optimal. Gambar dengan ukuran yang sangat besar dapat memperburuk respons UI dan menambah penggunaan memori.\r\n\r\nSaran resolusi maksimal:\r\nIkon: {0} megapiksel\r\nCover: {1} megapiksel\r\nLatar belakang: {2} megapiksel</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Peringatan Performa</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Jangan Tampilkan Lagi</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">File dengan ekstensi {0} tidak kompatibel.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Ekstensi file tidak kompatibel</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">File gambar yang dipilih mungkin terlalu besar untuk kinerja yang optimal.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Apakah anda yakin ingin menghapus tema yang dipilih? Penghapusan instalasi akan menunggu hingga aplikasi dimulai kembali</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Tema bawaan tidak dapat di-uninstall</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Tema ini tidak mendukung Playnite versi ini</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Apakah anda yakin ingin menghapus ekstensi yang dipilih? Penghapusan instalasi akan menunggu hingga aplikasi dimulai kembali</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Ekstensi bawaan tidak dapat di-uninstall</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Ekstensi ini tidak mendukung Playnite versi ini</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Folder instalasi:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Folder data</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Membuat paket diagnostik...</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Mengupload paket diagnostik...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Muat berkas...</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Apa ini?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Apakah Anda yakin ingin melakukan ini?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Total waktu bermain</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Rata-rata waktu bermain</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Waktu bermain teratas</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Total ukuran instalasi</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Ringkasan</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Bilah Sisi</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Tampilkan Bilah Sisi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Reset pengaturan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Semua pengaturan aplikasi akan diatur ulang ke default, termasuk:\r\n- Lokasi database\r\n- Daftar import yang dikecualikan\r\n- Pengaturan ekstensi, termasuk integritas pustaka\r\n    \r\nAplikasi harus dimulai ulang untuk menyelesaikan proses. Apakah anda ingin mengatur ulang pengaturan?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Untuk pengembang</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Ekstensi eksternal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Masukkan path folder lengkap</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Pencapaian</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Berita</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Laman Toko</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Penyiapan awal belum selesai. Playnite akan mulai ulang ke mode Desktop untuk menyelesaikan prosedur</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Terakhir Dimainkan</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favorit</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Paling sering dimainkan</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Semua</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Ada filter yang diterapkan.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Ada filter tambahan yang diterapkan.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Hasil pencarian :</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Item dengan nama yang sama telah ada.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Batasi pilihan ke filter saat ini</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Pilih lain</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Tambahan...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Terinstal</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Pengaturan ekstensi</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Telusuri</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Pembaruan</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Perbarui ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Pengurusan dari ekstensi dan tema yang sudah terinstall, termasuk settingnya, telah dipindah ke menu &quot;Tambahan&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Semua ekstensi integrasi pustaka yang saat ini terinstal dapat dikonfigurasi di sini.\r\n\r\nJika anda ingin menginstal atau meng-uninstal integrasi tambahan, gunakan menu &quot;Add-ons&quot; di menu utama.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Tema Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Tema mode layar penuh</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Mencari…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Add-on tidak mendukung Playnite versi ini.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Gagal mendownload paket instalasi add-on.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Gagal mendownload manifest penginstalan add-on.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Mulai ulang aplikasi diperlukan untuk menerapkan perubahan yang tertunda.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Add-on ini dijadwalkan untuk penginstalan.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Pasang</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Hapus</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Telah dipasang</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Tidak ditemukan pembaruan add-on baru.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Perbaharui tambahan</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Catatan perubahan tidak tersedia</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Dijadwalkan untuk penginstalan</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Gagal diunduh</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Lisensi ditolak</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Mengunduh {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Mencari pembaruan add-on...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Terdapat satu atau lebih add-on tersedia untuk di-update.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Pilih item untuk di-update</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Sesi pengembangan ekstensi</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">Persetujuan lisensi {0}</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Terima</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Tolak</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Sertakan tindakan permainan integrasi pustaka</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Pilih aksi</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Mode Pelacakan</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Jalur Pelacakan</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Penundaan pelacakan awal</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Kecepatan pelacakan</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Tautan</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">File</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Script</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Default</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Dalam Proses</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Folder</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Proses awal</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Log pesan jejak</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Perubahan berikut ini akan menimpa data untuk semua game yang sedang dipilih!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Tidak ada</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Proporsional</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Hanya item</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Hanya di awal dan akhir</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Sensitivitas scroll</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Scroll halus</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Kecepatan animasi</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Hapus item?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Apakah Anda yakin ingin menghapus item ini?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Tampilkan tombol di panel atas:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Pengaturan tampilan umum</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Pengaturan pengelompokan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Pengaturan pengurutan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Filter bawaan</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Posisi item plugin</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Lebar pemisah bagian</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Memindahkan tombol menu utama ke samping</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Panel penjelajah</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Pemilih permainan acak</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Pemilih permainan acak dari tampilan</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Pilih permainan acak dari tampilan</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Simpan pengaturan pengelompokan dan pengurutan</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Tampilkan sebagai filter cepat dalam mode Layar Penuh</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Dalam 7 hari terakhir</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Dalam 31 hari terakhir</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Dalam 365 hari terakhir</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Lebih dari 30 hari yang lalu</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Konfigurasi</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Simpan Preset</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Minimalkan setelah memulai permainan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Minimalkan Playnite setelah permainan dimulai.\r\n\r\nMenonaktifkan ini dapat menyebabkan masalah dengan permainan yang tidak mendapatkan fokus input saat startup!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Ukuran font</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Ukuran Font Kecil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Dukungan kontroler game</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Jika dinonaktifkan, Playnite tidak akan menerima input kontroler game apa pun.\r\n        \r\nNonaktifkan jika Anda menggunakan alat yang menerjemahkan input pengontrol game ke input mouse/keyboard dan Anda mendapatkan input ganda di Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Tampilkan item pada menu utama:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Balik binding tombol tampilan utama X/A</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Tukar binding tombol untuk memulai permainan dan menampilkan halaman detail permainan pada tampilan utama</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Tukar binding tombol konfirmasi/pembatalan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Balik binding tombol A/B untuk konfirmasi dan pembatalan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Kontroler utama saja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Hanya menerima input dari kontroler utama bila diaktifkan.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Tombol Guide memfokuskan Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Volume antarmuka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Volume latar belakang</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Bisukan saat di latar belakang</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Gagal melakukan inisialisasi antarmuka audio.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API Output</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API yang digunakan untuk output audio. Ubah jika Anda mengalami masalah dengan suara.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Umum</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Visual</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Audio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Tata Letak</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Input</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} sedang memulai...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} sedang berjalan...</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Kapitalisasi</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Spasi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Penskalaan rendering gambar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternatif</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Seimbang</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Kualitas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Kualitas:\r\nKualitas gambar terbaik, lambat, penggunaan memori tinggi.\r\n    \r\nSeimbang:\r\nKualitas bagus, cepat, penggunaan memori rendah.\r\n    \r\nAlternatif:\r\nKualitas yang lebih baik, kecepatan menengah, penggunaan memori rendah</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Pilih file…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Pilih folder…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Skrip startup</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Harap diperhatikan bahwa ekstensi dan tema dapat sangat memengaruhi kinerja, stabilitas, dan keamanan Playnite.\r\n    \r\nJika Anda mulai mengalami masalah setelah menginstal tema atau ekstensi, coba nonaktifkan/hapus instalannya terlebih dahulu untuk mengetahui penyebab masalahnya.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Pilih saat startup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Pilih saat memulai</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Profil bawaan</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Profil bawaan</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Profil kustom</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Profil kustom</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Diatur oleh script bawaan</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Spesifikasi emulator</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Spesifikasi platform</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Spesifikasi negara</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Jalankan sebelum memulai emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Jalankan setelah emulator dimulai</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Jalankan setelah keluar dari emulator</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Emulator yang dapat dieksekusi tidak ditemukan.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Spesifikasi emulator tidak ditemukan.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Script pemulaian emulator tidak ditemukan.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Bagi sebagai game terpisah</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Gabung menjadi satu game</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Atur platform</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Atur wilayah</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Folder pemindaian</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Pindai konfigurasi</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Kecualikan pola dari pemindaian checksum</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">File yang sesuai dengan pola tertentu tidak akan dipindai untuk checksum dan akan dicocokkan dengan nama file. Lihat halaman bantuan emulator untuk informasi lebih lanjut</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Pindai dengan emulator</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Nama harus ditetapkan ketika menyimpan konfigurasi baru</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Emulator atau profil emulator tidak diatur.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Direktori yang akan dipindai tidak ditentukan atau tidak ada</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Konfigurasi pemindaian tidak diatur dengan baik.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Termasuk dalam pemindaian otomatis secara massal</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Gagal memindai folder untuk emulator.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Gagal memindai folder untuk game emulasi.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Sembunyikan yang diimpor</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Profil yang akan diimpor:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Konfigurasi pemindaian otomatis</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Simpan sebagai konfigurasi pemindaian otomatis</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Menyimpan konfigurasi untuk digunakan nanti selama pembaruan pustaka. Konfigurasi yang disimpan dapat diatur melalui menu “Konfigurasi Emulator”.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Impor menggunakan jalur relatif</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Jika memungkinkan impor file game menggunakan jalur relatif ke folder instalasi Playnite atau folder instalasi emulator.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Pindai subfolder</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Pindai di dalam arsip</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Gabungkan file terkait</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Gabung file game yang serupa, seperti disk game individual, di bawah satu entri game.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Tambahkan pemindai</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Tambahkan pemindai tersimpan</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Mulai memindai</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Tambahkan konfigurasi pemindaian dengan emulator untuk memindai folder tertentu. Pastikan emulator dikonfigurasi dengan benar sebelum mengimpor permainan (melalui menu Perpustakaan -&gt; Konfigurasi Emulator).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Status default diterapkan untuk game yang baru ditambahkan</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Status diterapkan untuk game yang dimainkan untuk pertamakalinya</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Gagal meninisialisasi PowerShell script runtime. Jika anda pengguna Windows 7, coba install (ulang) PowerShell 5.1 untuk memperbaiki isu ini.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Filter preset dengan nama yang ditentukan telah tersedia. Perbarui preset dengan pengaturan yang baru?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Kata-kata ini akan dihapus dari awal nilai Nama Pengurutan yang diisi secara otomatis:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Gunakan ini untuk mengabaikan kata yang berada di awal untuk kepentingan pengurutan. Secara defaultnya &quot;The&quot;, &quot;An&quot;, dan &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Isi Nama Pengurutan untuk game yang tidak memiliki nama</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Penyortiran</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Mengisi data Nama Pengurutan...</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Layanan Nahimic telah terdeteksi berjalan di sistem Anda. Layanan ini diketahui menyebabkan masalah rendering pada Playnite (dan aplikasi lainnya).\r\n\r\nJika Anda mengalami kerusakan grafis atau masalah rendering lainnya di Playnite, kami sarankan untuk menonaktifkan atau menghapus layanan Nahimic sepenuhnya.\r\n\r\nInformasi lebih lanjut di https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite berjalan dengan akses yang lebih tinggi (sebagai administrator). Hal ini tidak disarankan karena memberikan akses yang lebih tinggi ke semua ekstensi yang terpasang dan semua game/aplikasi yang dimulai dari Playnite!\r\n\r\nInformasi lebih lanjut di https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Tampilkan peringatan jika Playnite berjalan dengan akses tingkat tinggi</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Dapatkan ukuran aktual pada penyimpanan saat menghitung ukuran permainan</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Jika diaktifkan, pemindaian akan lebih lambat dan akan mendapatkan ukuran sebenarnya yang digunakan file dalam penyimpanan.\r\nJika dinonaktifkan, pemindaian akan lebih cepat dan akan menggunakan ukuran file itu sendiri.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Pengaya berikut ini telah dilaporkan berpotensi bermasalah, baik karena dampak stabilitas/kinerja yang tinggi atau masalah keamanan. Kami sangat menyarankan Anda untuk menghapus pengaya tersebut:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Kecualikan file online dari pemindaian</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">File yang disimpan di penyimpanan cloud tidak akan dipindai dan diimpor jika tidak tersedia secara lokal.\r\nDukungan hanya untuk: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Pindai tetapi menggunakan metode yang disederhanakan tanpa konten file</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">File akan diimpor tetapi menggunakan metode yang kurang akurat sehingga tidak memerlukan konten file untuk diunduh dan ditampilkan secara lokal.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Terapkan ke semua</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Timpa status instalasi</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Ketika diatur, Playnite akan mengabaikan status instalasi (termasuk direktori instalasi) yang ditetapkan oleh plugin integrasi yang mengimpor permainan ini.\r\n        \r\nOpsi ini mungkin tidak sepenuhnya berfungsi dengan plugin yang menggunakan metode impor permainan tertentu kecuali jika plugin tersebut juga mempertimbangkan opsi pengabaian ini.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Hanya secara manual</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Sekali sehari</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Sekali seminggu</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Di setiap startup</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Periksa pembaruan program</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Periksa pembaruan pengaya</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Perbarui pustaka</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Pindai folder emulasi</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Sertakan permainan tersembunyi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Edit isian</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Pilih / Batalkan semua</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Buka</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Aktivasi</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Setel</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Mulai mengetik untuk mencari permainan... [F1] untuk bantuan</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Dimulai dengan # akan menampilkan daftar perintah yang tersedia.\r\nMemulai dengan / akan menampilkan daftar penyedia/plugin pencarian yang tersedia.\r\nMengetik kata kunci pencarian dan diakhiri dengan SPASI akan langsung beralih ke pencarian tersebut.\r\n\r\nTAB: beralih aksi\r\nENTER: mengaktifkan aksi yang dipilih\r\nShift-ENTER: membuka menu item</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Sertakan permainan yang tidak terpasang</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Sertakan permainan tersembunyi</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Termasuk permainan yang tidak terinstal</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Kecuali permainan yang tidak terinstal</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Termasuk permainan tersembunyi</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Kecuali permainan tersembunyi</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Mainkan atau Pasang</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Buka detail</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Menu permainan</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Edit game</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Buka pencarian</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Kotak pencarian</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Tombol pencarian</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Aksi permainan utama</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Aksi permainan kedua</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F membuka pencarian global daripada memfokuskan kotak pencarian</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Simpan pengaturan filter permainan di antara sesi pencarian</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Penyedia pencarian</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Kata kunci bawaan</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Kata kunci kustom</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Pintasan di seluruh sistem</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Pencarian Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Pengaturan Ekstensi</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Pengecualian</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">File yang dikecualikan relatif terhadap folder untuk pemindaian</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Folder yang dikecualikan relatif terhadap folder untuk pemindaian</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Tambahkan file ke daftar pengecualian</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Tambahkan folder ke daftar pengecualian</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Pengecualian hanya dapat ditambahkan ke konfigurasi pemindai yang disimpan.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Pengecualian telah ditambahkan ke pemindai “{0}”.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Pilih Platform</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Apabila diatur, pemindai akan menetapkan platform ini ke semua game, menimpa platform yang terdeteksi secara otomatis.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Sertakan perintah dalam pencarian bawaan</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Jika dinonaktifkan, perintah tidak akan disertakan dalam pencarian bawaan hingga awalan # digunakan.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Gunakan pencocokan samar pada filter nama</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Jika diaktifkan, filter nama akan mencocokkan nama permainan dengan cara yang sama seperti pencarian global.\r\nPencocokan ketat dapat diberlakukan pada setiap huruf dengan mengawali filter dengan tanda !</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Kolom yang akan ditampilkan untuk hasil permainan:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Status Tersembunyi</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Pencadangan data dibatalkan.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Pencadangan data gagal dilakukan.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Kesalahan pencadangan data</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Pencadangan data dalam proses...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Memulihkan data dari cadangan...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Gagal memulihkan data dari cadangan.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Pengaturan</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Pustaka Game</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Media pustaka game</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Ekstensi terpasang</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Data ekstensi</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Tema terpasang</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Pilih data yang akan dipulihkan dari file cadangan yang ditentukan.\r\n    \r\nPlaynite akan secara otomatis dimulai ulang untuk memulai proses pemulihan cadangan.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Pilih item yang akan disertakan dengan cadangan data. Pengaturan aplikasi dan data perpustakaan game disertakan secara bawaan.\r\n    \r\nPlaynite akan dimulai ulang secara otomatis untuk memulai proses pencadangan.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Pencadangan data otomatis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Periode pencadangan otomatis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Folder cadangan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Rotasi cadangan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Sertakan data tambahan:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Folder pencadangan perlu diatur jika pencadangan otomatis diaktifkan.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Tampilkan pemberitahuan hanya untuk rilis patch saja</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Ketika diaktifkan, hanya pembaruan yang tersedia untuk rilis utama yang sedang diinstal yang akan menampilkan notifikasi pembaruan.\r\nRilis utama baru tidak akan menampilkan pemberitahuan pembaruan.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Gunakan tanggal relatif selama pekan lalu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Gunakan tanggal relatif dalam format “Hari ini”, “Kemarin”, dsb. jika tanggalnya kurang dari seminggu.\r\n    \r\nFormat tanggal yang ditentukan akan digunakan untuk semua tanggal lainnya.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Pencarian gambar di web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Teks pencarian gambar ikon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Teks pencarian gambar sampul</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Teks pencarian gambar latar belakang</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Mendapatkan informasi pengaya...</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Tidak ada sumber metadata yang tersedia</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Pengaturan tindakan bermain</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Gunakan pengaturan pemindai</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Pilih profil saat memulai</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Pilih emulator  saat memulai</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Otomatis</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Selalu nyala</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Selalu mati</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Dukungan aksesibilitas (pembaca layar)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Menu aplikasi</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Menu Game</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Folder program</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Direktori data pengguna</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Kerusakan file perpustakaan telah terdeteksi, Playnite sekarang akan ditutup.\r\n    \r\nBuka masalah baru di halaman GitHub Playnite dengan permintaan untuk memperbaiki kerusakan pada file Anda.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Apakah Anda ingin menyimpan perubahan yang Anda buat?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Pemasangan portabel</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Tidak ada kontroler yang terdeteksi</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/it_IT.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Italiano</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Lingua Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Esci</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtro attivo</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtro disattivato</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Filtri aggiuntivi</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtri</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtro</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Dati non validi</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Salvare le modifiche?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Pagina principale su www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Codice sorgente su GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Crea pacchetto diagnostica</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Invia le informazioni diagnostica</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Informazioni su Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Creato da Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Assegna una categoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Imposta categorie</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Aggiungi una categoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Selezionato - Assegna categoria\r\nNon selezionato - Rimuovi categoria\r\nIndeterminato - Nessuna modifica (mentre si modificano più giochi)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Nessuna categoria</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Nessuna piattaforma</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ops! Qualcosa è andato storto...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Si è verificato un errore irrecuperabile.\r\n\r\nSe vuoi aiutarci a risolvere questo problema, per favore descrivi brevemente le azioni intraprese prima del crash e poi invia le informazioni diagnostiche. Se sei online, il pacchetto sarà caricato sul server di Playnite per l'analisi.\r\n\r\nIn alternativa, puoi cliccare sul pulsante &quot;Segnala Crash&quot; per creare un nuovo problema su GitHub e segnalare il crash manualmente.\r\n\r\nGrazie per il tuo aiuto.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">L'Estensione &quot;{0}&quot; ha causato un errore irreparabile.\r\n\r\nConsigliamo di salvare il file di registro e di riportare il problema allo sviluppatore dell'estensione. Se il problema persiste, disattivare l'estensione.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Estensione &quot;{0}&quot; ha causato un errore irreparabile.\r\n\r\nConsigliamo di riportare il problema allo sviluppatore dell'estensione. Se il problema persiste, disattivare l'estensione.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Estensione o un tema sconosciuto hanno causato un errore irrecuperabile.\r\n\r\nConsigliamo di disattivare le estensioni di terze parti, isolando quello problematico e segnalando il problema allo sviluppatore dell'estensione.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Si è verificato un errore fatale.\r\n \r\nSe vuoi aiutarci a risolvere questo problema, invia informazioni diagnostiche. Grazie.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Disattiva l'estensione</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Salva il file di registro</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Invia info di diagnostica</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Segnala crash</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Riavvia Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Riavvia in modalità sicura</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Disabilita tutte le estensioni di terze parti e usa il tema predefinito</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Esci da Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Azioni eseguite prima dell'arresto (in inglese):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Gestione libreria</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Rimuovere gioco/i?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Impossibile rimuovere - Un gioco o l'installazione è in esecuzione.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Impossibile disinstallare - Il gioco è in esecuzione</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Sei sicuro di voler eliminare {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Sei sicuro di voler rimuovere {0} giochi?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Sei sicuro di voler rimuovere {0}?\r\n\r\nSelezionando &quot;Aggiungi alla lista delle esclusioni&quot; i giochi non saranno importati nuovamente quando la libreria sarà aggiornata.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Sei sicuro di voler rimuovere {0} giochi?\r\n\r\nSelezionando l'opzione &quot;Aggiungi alla lista delle esclusioni&quot; i giochi non saranno importati nuovamente quando la libreria sarà aggiornata.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Sicuro di voler rimuovere {0} voci al momento inutilizzate?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Nessun campo inutilizzato trovato.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Sì (aggiungi alla lista delle esclusioni)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Ci sono modifiche non salvate in questa sezione</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Aggiornamento del database a versione…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Aggiornamento del database fallito.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Aggiornamento del database fallito. {0} MB di spazio libero richiesti.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Errore di gioco</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Impossibile avviare il gioco. '{0}' non è stato trovato nel database.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Impossibile avviare gioco: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Impossibile avviare l'azione: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Impossibile aprire il percorso del gioco: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Impossibile rilevare la dimensione di installazione del gioco: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Errore di scansione dimensione installazione</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Si sono verificati {0} errori durante la scansione delle dimensioni di installazione</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Impossibile creare il collegamento: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Impossibile aprire il manuale: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Impossibile installare il gioco: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Impossibile disinstallare il gioco: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Nessuna azione di avvio del gioco valida trovata. Quando utilizzi le azioni dell'emulatore, assicurati che le definizioni della piattaforma corrispondano tra il gioco e la configurazione dell'emulatore.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Implementazione dell'installazione non è disponibile.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Il plugin della libreria responsabile per questo gioco non è installato o abilitato.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Il download ufficiale dei metadati non è disponibile.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Nessun gioco selezionato.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Avvio dello script di gioco fallito.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Esecuzione dello script dell'applicazione non riuscita.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Avvio dello script globale fallito.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Avvio dello script dell'emulatore fallito.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Avvio dello script d'azione fallito.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 o superiore non installato.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Impossibile determinare come avviare il gioco.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Abilitato</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Disattivato</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Rimuovi</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Rimuovere i titoli inutilizzati</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Rinomina</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Copia</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Aggiungi</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Icona di base</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Copertina di base</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Sfondo predefinito</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Finito</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Avanti</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Indietro</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">FINITO</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">INDIETRO</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">PULITO</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Elimina</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Scarta</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Scarta tutto</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importa</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nome</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autore</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modulo</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Serie</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versione</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Giocato l'ultima volta</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Più giocato</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Numero di partite</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Dimensione Installazione</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Cartella</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Note</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Aggiunto</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Data di aggiunta</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Modificato</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Data di modifica</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Sito</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Percorso</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Salva</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Chiudi</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Cancella</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Confermare</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Azzera</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Sì</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">No</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Benvenuto</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Utente locale</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Generale</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Media</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Collegamenti</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Installazione</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Azioni</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Download…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Scaricamento dei metadati…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Caricamento…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Tipo</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profilo</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profili</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Rimuovi</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Scarica</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Cerca</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Risoluzione</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Qualsiasi</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Zoom</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Visualizzazione elenco</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Copertine</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Visualizzazione griglia</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Visualizzazione dettagliata</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Personalizzato</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Ringraziamenti speciali</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licenza</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Contributori</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Chiusura di Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Oggi</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Ieri</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Lunedì</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Martedì</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Mercoledì</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Giovedì</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Venerdì</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Sabato</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Domenica</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Settimana scorsa</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Mese scorso</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Anno scorso</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Più di un anno fa</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 a 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">da 100MB a 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">da 1GB a 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">da 5GB a 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">da 10GB a 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">da 20GB a 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">da 40GB a 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB o più</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Importazione completata con successo.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Tutti i giochi</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Id del gioco</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Id del database</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Preimpostazioni</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Colonna</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Colonne</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Riga</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Righe</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Impossibile ottenere l'icona dall'azione Play. Non è presente alcuna azione di tipo File.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Scarica soltanto il metadata mancante</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Abilitando questa opzione verrà saltato il download dei metadati per i campi dati che contengono già informazioni.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Selezione Giochi</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Seleziona quali giochi dovrebbero essere aggiornati con nuovi metadati:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Tutti i giochi dalla banca dati</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Tutti i giochi al momento filtrati</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Solo i giochi selezionati</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Nessun campo di metadati selezionato</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Nessun campo di metadati selezionato per il download. Si prega di selezionarne almeno uno e abilitare almeno un provider di metadati.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Negozio ufficiale</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Selezionare quali campi dovrebbero essere automaticamente popolati da Playnite e da quali fonti dovrebbero essere usati per ricavare i dati.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Si prega di considerare di cliccare sul logo sopra e di contribuire agli aggiornamenti al database igdb.com per migliorare l'uso dei dati da Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Scaricamento dei metadati…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importazione dei giochi installati…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importazione giochi di {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importa giochi emulati da {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Scaricamento degli aggiornamenti della libreria…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Scansione della dimensione dei giochi nella libreria…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Dimensione della scansione dei giochi importati…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Aggiornamento libreria completato</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Rilascio delle risorse…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Configurazione</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Impostazioni…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Piattaforme ed emulatori</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Configura gli emulatori…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Gestione libreria…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Strumenti</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Scaricamento metadata…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Strumenti software...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Configurare l'integrazione</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Aprire Client di terze parti</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Client di terze parti</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Aggiorna la lista dei giochi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Annulla l'aggiornamento della libreria</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Aggiorna cartelle emulate</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Aggiungere gioco</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manualmente…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Scansiona automaticamente…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Gioco emulato…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Applicazione di Microsoft Store...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Informazioni su Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Invia commento</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Imposta a schermo intero</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Collegamenti</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Aiuto</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Supporta su Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Supportaci su Ko-Fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Manuale utente</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Documentazione SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Riavvia il sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Arresta il sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Sospendi il sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Ibernare il sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Sistema Di Blocco</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Disconnetti utente</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Scegli un gioco casuale</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Campi del gioco da visualizzare nel pannello dettagli:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Spaziatura oggetti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Disegna sfondo elemento griglia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Larghezza del bordo dell'oggetto nella griglia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Fonte dell'icona del gioco mancante</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Fonte della copertina del gioco mancante</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Fonte dello sfondo di gioco mancante</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Spaziatura verticale ai dettagli del gioco</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Posizione dettagli a griglia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Posizione lista dettagli</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Disegna separatore tra i pannelli</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Altezza immagine della copertina gioco</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Altezza icona lista giochi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Carattere dell'applicazione</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Carattere monospaziato</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Posizione pannello filtro</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Posizione pannello esplora</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Rendering copertina</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Rapporto d'aspetto dell'oggetto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Le seguenti opzioni avranno effetto anche sulla visualizzazione a griglia in modalità schermo intero</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Modalità ampliata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Confezione DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Game Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Quadrato</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Banner Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Cover verticali Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Richiede il riavvio per applicare</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Impostazioni</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Generale</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Pannello superiore</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Aspetto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Dettagli del gioco</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Avanzate</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Schermo intero</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Input</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Prestazioni</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadati</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">In aggiornamento</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Ricerca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Backup</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Backup dei dati della libreria</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Ripristina il backup dei dati</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importa automaticamente le modifiche alla libreria</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Il percorso del file della banca dati non valido, dev'essere impostato un percorso file corretto.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Il campo dell'account non può essere vuoto.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Scaricare i metadati dopo l'importazione dei giochi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Avvia Playnite minimizzato</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Avvia Playnite all'avvio del computer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Avvia ridotto nella barra delle applicazioni</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Impossibile registrare l'avvio di Playnite all'avvio del computer.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Avvia in modalità schermo Intero</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Caricamento asincrono dell'immagine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Migliora la fluidità dello scorrimento delle liste giochi a discapito dei tempi di caricamento dell'immagine.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Mostra il nome del gioco quando la copertina risulta mancante</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Mostra i nomi dei giochi  in copertina</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Oscura i giochi non installati\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Mostra le icone del gioco nella visualizzazione a lista</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Mostra il conto degli oggetti nelle descrizioni del gruppo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Mostra solo i campi assegnati nei pannelli di filtro e di esplorazione</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Disattiva l'accelerazione hardware</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Utilizzare quando si presentano scatti o problemi simili nell'interfaccia grafica</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Mostra i giochi nascosti nella lista avvio rapido</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Ha effetto sulla Jumplist e sulle liste dell'area di notifica.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Numero di oggetti in avvio veloce</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Usa l'immagine di sfondo del gioco come sfondo della finestra</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Sfocatura dello sfondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Qualità elevata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Sfondo scuro</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Visualizza griglia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Profilo del tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Tema Schermo Intero</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Colore del tema Schermo Intero</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Posizione del database</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Stato accesso:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Impostazioni di Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Cancella cache web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Potrebbe risolvere i problemi riscontrati durante il collegamento degli account.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Mostra l'icona nell'area di notifica</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimizza Playnite nell'area di notifica</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimizza Playnite nell'area di notifica quando la finestra viene chiusa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Quando si avvia il gioco:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Dopo la chiusura del gioco:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Formato tempo di gioco per indicare il numero di giorni giocati</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Formato delle date:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Questo  ti farà uscire da tutti i servizi collegati. E' richiesto il riavvio dell'applicazione, desideri procedere?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Ripulire la cache?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">E' richiesto il riavvio di Playnite per applicare il nuovo tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Ottieni più temi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Crea un nuovo tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Ottieni più estensioni</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Crea una nuova estensione</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Aiutaci nella traduzione di Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite deve essere riavviato per applicare le nuove impostazioni. Riavviare ora?\r\n\r\nRiavviare annullerà tutte le attività attualmente in corso (download)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Riavviare Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite non può spostare automaticamente i file della libreria. Devi spostarli/copiarli prima di cambiare la posizione. Se nessuna libreria è presente nella posizione di destinazione, ne verrà creata una nuova.\r\n\r\nLa nuova posizione del database verrà utilizzata solo dopo il riavvio dell'applicazione. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Il tempo di gioco non sarà registrato se l'azione &quot;Chiudi&quot; è impostata.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Numero di righe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Numero di colonne</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Numero di dettagli delle righe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Mostra immagine sfondo nello Schermo Principale</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Non si applica retroattivamente ai giochi esistenti senza dover riscaricare i metadati.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importa il tempo di riproduzione dei giochi nella libreria:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Configura quando Playnite deve importare il tempo di riproduzione riportato dai plug-in della libreria per i giochi nel database Playnite. Per poter utilizzare questa funzione è necessario il supporto dei plugin della libreria incaricati della gestione dei giochi.\r\n\r\nSempre: importa il tempo di gioco per i nuovi giochi importati ed esistenti nel database di Playnite.\r\nSolo per i nuovi giochi importati: importa il tempo di gioco solo per i nuovi giochi importati.\r\nMai: non importa mai il tempo di riproduzione in nessuna circostanza.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Sempre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Solo per i giochi appena importati</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Mai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Abilità il supporto per il controller in modalità desktop</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Il pulsante guida apre la modalità a schermo intero</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Impostazioni per lo scaricamento automatico dei Metadata per i giochi appena importati</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Schermata utilizzata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Usare sempre lo schermo principale</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Visualizza titoli dei giochi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Mostra lo stato della batteria</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Mostra la percentuale della batteria</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Visualizza orologio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Nascondi il cursore</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Solo Installati nei Filtri Rapidi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Funzioni dei pulsanti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Scorrimento orizzontale</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Seleziona una delle sottosezioni</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Nessuna impostazione disponibile</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Caricamento delle impostazioni non riuscito</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Questi script sono eseguiti per ogni gioco nella libreria. I singoli script possono essere assegnati a ogni gioco separatamente mentre si modificano i dettagli del gioco.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Transizione per le immagini di sfondo animate</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Dimensione caratteri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automatico</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Con alias</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Scala di grigi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideale</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Schermo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Modalità della formattazione del testo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Modalità di rendering del testo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">I metodi di rendering e di formattazione non sono al momento utilizzati per le descrizioni del gioco.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Precarica le immagini di sfondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Se disattivato, Playnite scaricherà l'immagine dello sfondo durante lo scaricamento del metadata. Utilizzando più spazio del disco e rendendo l'immagine disponibile quando non è connesso.\r\n \r\nSe disattivato, l'immagine dello sfondo sarà scaricata soltanto quando sarà richiesto. Utilizza meno spazio, ma potrebbe causare un ritardo prima di mostrare lo sfondo e alcune immagini potrebbero essere non disponibili quando non si è connessi.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Chiudere automaticamente il launcher dopo essere usciti dal gioco</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Ritardo della chiusura del client (in secondi)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Non chiudere dopo delle sessioni di gioco più corte di (in secondi)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Chiudere automaticamente i seguenti client:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Chiudere i client automaticamente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importa la lista delle esclusioni</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Mostra un avvertimento quando si assegna un'immagine troppo grande del gioco</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Comando di apertura cartella</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Organizza per la classificazione d'età</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Aggiorna la dimensione di installazione dei giochi nell'aggiornamento della libreria</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Scansiona e aggiorna la dimensione di installazione dei giochi se viene rilevato che i loro file sono stati modificati dall'ultima scansione</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Niente</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Riempi</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Uniforma</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Uniforma per riempire</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">A sinistra</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">A destra</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">In alto</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">In basso</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Errore di importazione</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Autenticazione richiesta</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Autenticazione fallita</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Modalità di rendering web alternativo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Usa quando si presentano problemi con finestre web, per esempio l'integrazione dei dialoghi di autentificazione.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Caricamento parziale delle grandi descrizioni dei giochi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Le grandi descrizioni possono causare lag notevole quando si selezionano i giochi.\r\n\r\nSe abilitato, solo una parte del testo della descrizione verrà inizialmente caricata con un'opzione per caricare il resto su richiesta.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Importazione dei metadati</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Scaricamento dei metadati</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Imposta la configurazione selezionata da utilizzare per qualsiasi download futuro dei metadati.\r\nPuò essere modificata anche nelle impostazioni dell'applicazione.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Wizard dell'importazione dell'emulazione</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Lo strumento ti guiderà attraverso il processo di scaricamento e importazione degli emulatori console e dei giochi emulati</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Ricorda che puoi sempre aggiungere emulatori aggiuntivi e/o giochi più tardi tramite menu principale (sotto il menu &quot;Strumenti&quot; per le impostazioni Emulator e il menu &quot;Aggiungi giochi&quot; per i giochi emulati).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Di seguito la lista di emulatori che Playnite può riconoscere e configurare automaticamente. Può scaricarli e installarli visitando i loro siti. Una volta che hai installato gli emulatori, procedi nella schermata successiva per importarli in Playnite.\r\n \r\nPuoi anche configurare e importare ogni emulatore personalizzato attraverso il menù di configurazione.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Puoi importare qualsiasi emulatore installato sul PC premendo sul tasto &quot;Scansione automatica dalla cartella...&quot;. Playnite cercherà la cartella selezionata per ogni emulatore conosciuto e fornirà l'opzione di importarli. Puoi importare da più cartelle usando tale tasto più volte, gli emulatori saranno aggiunti sul fondo della lista attuale.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Puoi importare i giochi premendo il tasto &quot;Scansiona la cartella usando l'emulatore&quot; . Selezionando l'emulatore appropriato, sarà comunicato a Playnite quali tipi di tile dovrebbero essere scansionati e importati. Puoi anche importare da più cartelle usando tale tasto più volte, i giochi saranno aggiunti sul fondo della lista attuale.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Non ci sono emulatori selezionati per l'importazione. Non sarai in grado di importare automaticamente ogni gioco emulato senza configurare per prima gli emulatori. Sicuro di voler continuare e uscire dal processo di importazione?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Non ci sono emulatori configurati in Playnite. Non puoi importare i giochi senza configurare l'emulatore e selezionando i tipi di file appropriati. Desideri aggiungere ora qualche emulatore?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Scansiona la cartella usando l'emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Seleziona i file</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Scansione automatica dalla cartella...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Configura gli emulatori…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Scansione…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Analizzando {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Configurazione iniziale</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Questa procedura guidata ti guiderà attraverso il processo di importazione e di configurazione automatica delle librerie di gioco esterne. Playnite può importare automaticamente i giochi da più servizi di gioco come Steam o GOG, e può inoltre mantenere aggiornata la libreria aggiornandola automaticamente durante l'avvio dell'applicazione.\r\n\r\nRicorda che puoi sempre aggiungere manualmente qualunque gioco personalizzato da qualsiasi piattaforma cliccando sul tasto &quot;Playnite&quot; nel menù principale. \r\n</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integrazione della libreria</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Di seguito è riportato l'elenco di alcune integrazioni di librerie curate che Playnite supporta. Seleziona quelle che vuoi installare.\r\n\r\nAltre integrazioni possono essere installate in seguito dal menu &quot;Componenti aggiuntivi&quot;.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Configurazione completata</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">La configurazione iniziale è completata. Ricorda che puoi cambiare le impostazioni in seguito dal menu 'Impostazioni'.\r\n\r\nPuoi anche aggiungere altri giochi cliccalndo sul menu 'Playnite'.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Fallito il download di una o più estensioni.\r\n\r\nPuoi provare a riscaricare le integrazioni dal menu dei componenti aggiuntivi dopo che la prima esecuzione della procedura guidata è terminata.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Scaricamento di {0} integrazione/ni…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Scaricamento elenco delle integrazioni raccomandate…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Impossibile scaricare l'elenco delle integrazioni consigliate. Puoi provare a scaricare nuovamente le integrazioni in seguito tramite il menu Addons.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Configurazione delle piattaforme e degli emulatori</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Configurazione degli emulatori</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Piattaforme</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Piattaforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulatori</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Aggiungi piattaforma</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Seleziona icona</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Seleziona copertina</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Seleziona Immagine</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Seleziona elemento</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Seleziona Sfondo</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Seleziona file</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Seleziona URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Aggiungi emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Piattaforma/e supportata/e</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Desidera salvare le modifiche della piattaforma?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Desidera salvare le modifiche dell'emulatore?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Eseguibili</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Parametri</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Cartella di lavoro</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Tipologie di file supportati</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importa emulatori…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Scarica emulatori…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Caricare parametri di base da profilo emulatore conosciuto</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Sicuro di voler rimuovere l'emulatore {0} ?\r\nE'al momento utilizzato da {1} gioco/chi.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Sicuro di voler rimuovere la piattaforma {0} ?\r\nE' al momento utilizzata da {1} gioco/chi e {2} emulatore/i.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Aiuto impostazioni</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Ordina per</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Ordina Direzione</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Raggruppa per</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Crescente</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Decrescente</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Non raggruppare</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Raggruppa per distributore</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Raggruppa per categoria</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Raggruppa per piattaforma</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Tipo di visualizzazione</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Visualizza</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Pannello Esplora</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Pannello dei filtri</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Icona</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Icona Libreria</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Immagine di copertina</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Immagine dello sfondo</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Nome ordinamento</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Libreria</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manuale</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nome</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Installa Drive</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Nome Account</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Piattaforma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Genere</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Data di uscita</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Anno di uscita</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Sviluppatore</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Etichetta</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Editore</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Stato dell'installazione</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Abbina tutti i filtri</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Se abilitato, solo i giochi che usano tutti gli elementi in tutti i filtri saranno inclusi nella vista.\r\nSe disabilitato, i giochi che usano qualsiasi elemento in qualsiasi filtro saranno inclusi nella vista.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Installati</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Installati</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Non installato</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Nascosti</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Preferiti</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Abilita supporto HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Se abilitato, HDR sarà attivato sul display principale prima di iniziare il gioco.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Nota che l'HDR non è supportato sul tuo display principale.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Giocato l'ultima volta</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Descrizione</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Cartella d'installazione</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Immagine di copertina</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Collegamenti</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Percorso Immagine/ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Genere</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Generi</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Azienda</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Compagnie</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Sviluppatore</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Sviluppatori</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Editore</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Editori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Categorie</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Etichetta</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Etichette</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Funzionalità</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Funzioni</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Classificazione di età</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Classificazioni di età</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Regione</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regioni</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Sorgente</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Sorgenti</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Attività recenti</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Errore della banca dati</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Impossibile aprire la banca dati della libreria</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Il database non è aperto.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Impossibile accedere la banca dati della libreria. Il file &quot;{0}&quot; è stato utilizzato da un'altro processo o è in un percorso inaccessibile.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Creazione del pacchetto diagnostica fallito.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Caricamento automatico del pacchetto diagnostica fallito.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Le informazioni del modulo di diagnostica sono state inviate con successo.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Pacchetto di diagnostica è stato creato e caricato con successo.\r\nLa prego di allegare il seguente codice ID al seguente resoconto del crash:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Importazione giochi da {0} fallita.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Importazione giochi da {0} fallita.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Impossibile cercare giochi per profilo di emulatore selezionato. Il profilo non contiene estensioni di file o piattaforme.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Avvio di Playnite fallito. Chiudere tutti i processi attivi e riprovare.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">L'applicazione del tema &quot;{0}&quot;, profilo colore &quot;{1}&quot; \r\n {2} fallita</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Impossibile aprire il collegamento, l'URL non è in un formato valido.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Impossibile avviare l'applicazione.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Impossibile inizializzare il componente di visualizzazione Web. Playnite non può continuare con il processo di avvio.\r\n\r\nMaggiori informazioni su https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Impossibile importare gli emulatori a causa del file di definizione mancante o corrotto.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Impossibile eseguire la funzione di estensione.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Modifica i dettagli del gioco</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL immagine</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Aggiungi Link</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Aggiungi ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Salva modifiche</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Applica modifica del campo al gioco/chi modificati.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Aggiungi Azione</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Cancella Azione</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Rimuovi Azione di avvio</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Aggiungi giochi</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Scansione cartella…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Rilevazione automatica</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Sfoglia…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Apri Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Impostazioni del profilo</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Il nome del gioco non può essere vuoto.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">La directory di tracciamento delle azioni di gioco non può essere vuota.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Il nome del gioco non può essere vuoto prima della ricerca del metadata.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Dati di gioco invalidi</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Inserire un URL web valido che inizia con http:// o https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Seleziona URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Scaricamento del metadata fallito: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Errore di scaricamento</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Ripulire i filtri</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Account privato</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Account pubblico</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">Chiave API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Errore all'avvio</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Errore tema</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Ripulire tutto</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Impostazione in corso...</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Disinstallazione...</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Avvio</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Esecuzione</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">URL non corretto</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Non fare niente</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimizza</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Ripristina finestra</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Ripristina finestra solo quando lanciata dall'interfaccia utente</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Chiudi</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Cambia</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Avanzate</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Mai</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Stato di completamento</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Stato di completamento</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Voto dell'utenza</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Voto della critica</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Voto della comunità</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Script di gioco</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Script dell'applicazione</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Script</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Plugin</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Fonti dei metadati</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Estensioni</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID dell'estensione</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Ricarica gli script</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">SDK interattivo PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Tutti gli script sono stati ricaricati con successo.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Nessun gioco trovato secondo i criteri di ricerca/filtri specifici</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Nessun elemento trovato</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Imposta in modalità desktop</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Esci da Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Librerie</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Aggiorna tutto</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Creato Da:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versione:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Aggiornato:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modulo:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Libreria</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistiche</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Tutti</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Nessuno</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Notifiche</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Larghezza</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Altezza</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Dimensioni</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Piccolo</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normale</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Grande</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Più grande</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Massimo</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Predefinito</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Seleziona</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Seleziona tutto</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Deseleziona tutto</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Primo</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Casuale</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Selezione utente</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Carica altro</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Trasparente</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Comprimi</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Espandi</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Comprimi Tutto</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Espandi Tutto</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Altro</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Temi</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Argomenti dell'emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Parametri integrati</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Parametri personalizzati</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Ulteriori argomenti dell'emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Sovvrascrivi gli argomenti dell'emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Azione di avvio</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Seleziona metadata da importare</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Seleziona un gioco da importare.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Ricerca del metadata</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Aggiornamento disponibile</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Modifiche dall'ultimo aggiornamento</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Installa l'aggiornamento</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Controlla aggiornamenti</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Errore aggiornamento</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Controllo della nuova versione fallito.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Nessuna nuova versione trovata, hai già la versione più recente.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Impossibile scaricare e installare l'aggiornamento.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Un'attività in background è attualmente in corso. Vuoi annullarla e procedere con l'aggiornamento?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Un'attività in background è attualmente in corso. Vuoi annullarla e uscire da Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Un'attività in background è attualmente in corso. Cambiare modalità annullerà il processo, vuoi cambiare comunque?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Un aggiornamento per Playnite è disponibile</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Ricarica la lista dei temi</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Applica il tema selezionato</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Osserva la modifica del file</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Applicare automaticamente il tema quando il file di sorgente viene cambiato</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Durata dello script</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Script da eseguire prima dell'avvio di un gioco</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Script da eseguire dopo l'uscita da un gioco</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Script da eseguire dopo l'avvio di un gioco</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Esegui all'avvio dell'applicazione</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Esegui alla chiusura dell'applicazione</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Script di avvio gioco</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Script di gioco avviato</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Script di arresto gioco</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Esegui lo script globale</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Globale</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrato</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Corrente</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Nuovo</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Testa lo script</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Mostra solo gli elementi selezionati.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Salva come predefiniti</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Aggiungi ai preferiti</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Rimuovi dai preferiti</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Nascondi questo gioco</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Rimuovi dalla lista nascosta</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Abilita Supporto HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Disabilita Supporto HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Modifica…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Calcola dimensione installazione</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Calcola la dimensione dell'installazione (tutti i giochi)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Calcola la dimensione dell'installazione (solo i dati mancanti)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Dimensione installazione</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Imposta la categoria…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Stato di completamento</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Rimuovi</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Gioca</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Installa</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Opzioni di Gioco</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Dettagli</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Disinstalla</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Apri percorso gioco</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Crea collegamento nel desktop</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Apri il manuale</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Altro</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Gestito dal plugin della libreria</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Il processo di avvio del gioco sarà gestrito dal plugin della libreria responsabile per questo gioco.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Nessuna informazione rilevante riguardo il gioco '{0}' è stata trovata nella pagina specificata.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Consiglio: puoi utilizzare un processo di scaricamento del metadata più avanzato durante la modifica del gioco attraverso l'opzione del menu &quot;Modifica&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Non disponibile mentre alcune azioni sono in corso.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">La descrizione del testo è sensibile alla sintassi HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Il tempo di gioco è registrato in secondi.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">La dimensione dell'installazione è indicata in byte.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">La data di uscita deve essere impostata in &quot;anno-mese-giorno&quot;. I valori del mese e del giorno possono essere ommessi.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">I valori da 0 a 100 o nulli per nessun punteggio.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Lo sviluppo di Playnite è supportato da questi patrons e membri Ko-Fi:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Codice, traduzione e altri contributori in nessun ordine particolare:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Annullare il monitoraggio del gioco?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Il monitoraggio dell'installazione è tutt'ora in corso. Desidera cancellare il processo e far tornare il gioco a uno stadio precedente? </sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Il monitoraggio del gioco in esecuzione è tutt'ora in corso, desideri cancellare il processo e far tornare il gioco a uno stadio precedente?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Tempo di gioco</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Giocato l'ultima volta</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}g {1}h {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}o {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minuti</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} secondi</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Non giocato</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Apertura della modalità desktop…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Apertura della modalità schermo intero…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Caricamento della libreria di gioco…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Calcolo dimensione installazione…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Calcolo della dimensione di installazione di {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Installazione del file script fallita.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Script installato con successo.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Installazione script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Errore script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Impossibile eseguire la funzione di estensione.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Aprire la cartella dei metadati</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Calcola</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Calcola automaticamente la dimensione di installazione usando i Roms se il gioco ha una o la directory di installazione se è stata impostata</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} client non installato.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Il client di {0} si aprirà ora. Accedi e poi chiudi questo messaggio.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">In attesa dell'accesso dell'utente, chiudi questo quando hai finito…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Cartella di installazione del gioco non trovata.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Configurazione dell'azione del gioco non valida.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Risoluzione dei problemi di sincronizzazione dell'account</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Risoluzione dei problemi</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Rinomina oggetto</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Aggiungi nuovo elemento</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Inserisci nome</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Inserisci nuovo nome</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Meno di un'ora</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">da 1 a 10 ore</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">da 10 a 100 ore</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">da 100 a 500 ore</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">da 500 a 1000 ore</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">Più di 1000</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite deve essere riavviato per compeltare l'installazione. Desidera raivviare ora?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">L'estensione non è confezionata correttamente</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Il tema non è stato impacchettato a dovere.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">L'estensione &quot;{0}&quot; non è stata caricata correttamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Impossibile caricare l'estensione &quot;{0}&quot;, l'attuale versione di Playnite non è supportata.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Tema &quot;{0}&quot; non è stato caricato correttamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Impossibile caricare il tema &quot;{0}&quot;, l'attuale versione di Playnite non è supportata.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">L'estensione non è stata caricata correttamente.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Tema non è stato caricato correttamente.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Tema/Estensione sta usando una versione API non supportata.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Installazione avvenuta con successo.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Installare il componente aggiuntivo?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Generico</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Impossibile installare il componente aggiuntivo &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Installazione estensione fallita.\r\n\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Vuoi installare una nuova estensione?\r\n\r\n{0}\r\nAutore {1}\r\nVersione {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Vuoi aggiornare l'estensione &quot;{0}&quot;?\r\n\r\nVersione attuale: {1}\r\nNuova versione: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Impossibile installare il tema.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Vuoi installare un nuovo tema?\r\n\r\n{0}\r\nDi {1}\r\nVersione {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Vuoi aggiornare il tema &quot;{0}&quot;?\r\n\r\nVersione attuale: {1}\r\nNuova versione: {2}\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Stai per lasciare Playnite e navigare nella pagina web seguente utilizzando il browser web predefinito. Vuoi continuare?\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">L'immagine/le immagini selezionato/te potrebbero essere troppo grandi per la prestazione ottimale. Usare immagini molto grandi potrebbe risultare in una responsività della UI pesantemente peggiorata e un'aumento dell'utilizzo della memoria.\r\n\r\nDimensioni massime raccomandate:\r\nIcone: {0} px altezza\r\nCopertine: {1} px altezza\r\nSfondi: {2} px altezza</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Avviso di prestazione</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Non mostrare più</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">File con estensione {0} non è compatibile.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Estensione del file incompatibile</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Il file dell'immagine selezionata potrebbe essere troppo grande per delle performance ottimali.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Sicuro di voler installare il tema selezionato?  La disintallazione sarà messa in coda al prossimo avvio dell'applicazione.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Le estensioni native non possono essere disinstallate.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Questa estensione non è supportata da questa versione di Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Sei sicuro di voler disinstallare l'estensione selezionata? La disinstallazione sarà accodata al prossimo avvio dell'applicazione.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Le estensioni native non possono essere disinstallate</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Questa estensione non supporta questa versione di Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Cartella d'installazione</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Dati della directory</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Generazione pacchetto di diagnostica...</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Invio pacchetto di diagnostica...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">importazione file...</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Cos'è questo?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Vuoi davvero eseguire questa operazione?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Tempo totale di gioco</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Tempo di gioco medio</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Tempo di gioco massimo</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Dimensione totale installazione</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Panoramica</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Barra laterale</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Mostra barra laterale</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Ripristina impostazioni</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Tutte le impostazioni dell'applicazione saranno riportate ai valori predefiniti, esclusi:\r\n- Posizione del database\r\n- Elenco di esclusione delle importazioni\r\n- Impostazioni delle estensioni, incluse le integrazioni delle librerie\r\n    \r\nIl riavvio dell'applicazione è richiesto per finire il processo. Vuoi resettare le impostazioni?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Per gli sviluppatori</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Estensioni esterne</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Inserisci il percorso completo della cartella</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Obiettivi</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Notizie</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Pagina del negozio</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">La prima configurazione non è completa. Playnite ora si riavvierà alla modalità desktop per terminare la procedura.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Giocati di recente</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Preferiti</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Più giocati</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Tutti</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Ci sono filtri applicati.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Ci sono filtri aggiuntivi applicati.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Risultati della ricerca per:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Impossibile rinominare il file o la cartella è già esistente.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Limita la selezione al filtro attuale</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Selezionare altro</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Componenti aggiuntivi...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Installato/i</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Opzioni dei componenti</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Sfoglia</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Aggiornamenti</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Aggiornamenti {0}</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">La gestione delle estensioni e dei temi installati, comprese le loro impostazioni, è stata spostata in un nuovo menu &quot;Componenti aggiuntivi&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Tutte le estensioni di integrazione della libreria attualmente installate possono essere configurate qui.\r\n\r\nSe vuoi installare o disinstallare ulteriori integrazioni, usa l'opzione &quot;Estensioni&quot; dal menu principale.\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Temi desktop</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Temi schermo intero</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Ricerca in corso...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Questo componente aggiuntivo non è compatibile con questa versione di Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Impossibile scaricare il pacchetto di installazione del componente aggiuntivo.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Impossibile scaricare il manifesto di installazione del componente aggiuntivo.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Riavvio dell'applicazione è richiesto per applicare le modifiche.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Questo componente aggiuntivo è previsto per l'installazione.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Installa</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Reinstalla</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Disinstalla</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Già installato</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Nessun aggiornamento disponibile per i componenti aggiuntivi.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Aggiorna estensioni</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Changelog non disponibile</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Programmato per l'installazione</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Download non riuscito</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Licenza rifiutata</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Scaricando {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Controllo degli aggiornamenti per i componenti aggiuntivi...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Ricerca aggiornamenti del programma...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Sono disponibili uno o più aggiornamenti per componenti aggiuntivi.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Seleziona gli elementi da aggiornare</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Istanza di sviluppo dell'estensione</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">Accordo di licenza {0}</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Accetta</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Declina</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Include le azioni di esecuzione dell'integrazione della libreria.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Selezione azione</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Modalità di monitoraggio</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Percorso Di Tracciamento</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Ritardo iniziale di monitoraggio</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Frequenza di monitoraggio</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Collegamento</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">File</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Script</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Predefinito</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Processo</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Cartella</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Processo originale</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Nome del processo</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Registra i messaggi fissati</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Le seguenti modifiche sovrascriveranno i dati di tutti i giochi selezionati!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Nessuno</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Solo Oggetti</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Inizio e fine solamente</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Sensibilità di scorrimento</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Scorrimento fluido</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Velocità di animazione</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Rimuovere l'oggetto?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Sei sicuro di voler rimuovere questo elemento?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Mostra i pulsanti nel pannello superiore:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Impostazioni di visualizzazione generale</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Impostazioni di ragruppamento</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Impostazioni di ordinamento</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Parametri di filtraggio</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Posizione di oggetti del plugin</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Larghezza di separatore della sezione</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Sposta il pulsante del menu principale sulla barra laterale</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Pannello di esplorazione</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Selettore di gioco casuale</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Visualizza selettore casuale del gioco</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Seleziona un gioco casuale dalla vista</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Salva le impostazioni di raggruppamento e di ordinamento</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Mostra come filtro rapido in modalità schermo intero</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Negli ultimi 7 giorni</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Negli ultimi 31 giorni</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Negli ultimi 365 giorni</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Più di 365 giorni</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Configura</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Salva preimpostazione</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Riduci dopo aver avviato il gioco</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Riduci Playnite dopo l'avvio del gioco.\r\n\r\nDisattivare questa opzione può portare a problemi con i giochi che non ottengono la messa a fuoco dei comandi all'avvio!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Dimensione carattere</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Dimensione caratteri piccola</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">Abilita il supporto API del controller di gioco</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Supporto controller di gioco</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Se disabilitato, Playnite non accetta nessun input del controller di gioco.\r\n        \r\nDisabilita se usi strumenti che traducono gli input del controller di gioco in ingressi del mouse/tastiere e stai ricevendo doppi ingressi in Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Mostra oggetti nel menu principale:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Pulsanti X/A nella pagina principale invertiti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Inverti l'associazione di pulsanti per avviare un gioco e mostrando la pagina dei dettagli del gioco nella pagina principale.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Scambio associazione pulsante conferma/annullamento </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Inverte le associazioni dei pulsanti A/B per conferma e cancellazione.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Solo controller primario</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Accetta input dal controller primario solo se abilitato.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Il pulsante guida focalizza Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Volume dell'interfaccia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Volume di sfondo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Muta quando è nello sfondo</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Impossibile inizializzare l'interfaccia audio.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API di uscita</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API usato per l'uscita audio. Cambia se stai avendo problemi con il suono.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Generale</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Effetti visivi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Audio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Disposizione</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Input</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} in avvio...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} in esecuzione…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Maiuscole</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Spazio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Scalatore di rendering dell'immagine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternativo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Bilanciato</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Qualità</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Qualità:\r\nMigliore qualità dell'immagine, lento, alto utilizzo della memoria.\r\n    \r\nBilanciato:\r\nBuona qualità, veloce, basso utilizzo della memoria.\r\n    \r\nAlternativa:\r\nMigliore qualità, velocità media, basso utilizzo della memoria.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Seleziona un file...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Seleziona cartella...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Script di avvio</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Tieni presente che entrambe le estensioni e i temi posso influenzare la prestazione, la stabilità e la sicurezza di Playnite.\r\n\r\nSe cominci ad avere qualche problema dopo l'installazione di un tema o di una estensione, prova a disattivare/disinstallare l'estensione/ni per determinare se è la causa del problema.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Scegli all'avvio</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Scegli all'avvio</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Profili integrati</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Profilo integrato</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Profili personalizzati</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Profilo personalizzato</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Gestito da uno script integrato</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Specifiche dell'emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Specificazioni della piattaforma</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Specificazione della regione</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Avvia prima di avviare l'emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Eseguire dopo l'avvio dell'emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Avvia dopo essere uscito dall'emulatore</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Eseguibile dell'emulatore non trovato.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Specifica dell'emulatore non trovata.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Script avvio dell'emulatore non trovato.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Separa in più giochi</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Raggruppa in un unico gioco</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">indica la piattaforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Imposta regione</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Scansiona cartella</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Scansione delle configurazioni</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Escludi i modelli dalla scansione di integrità dati</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">I file che corrispondono al modello specificato non saranno analizzati per il controllo integrità dati e saranno abbinati al nome del file. Vedi la pagina di aiuto dell'emulatore per maggiori informazioni.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Scansiona con emulatore</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Il nome deve essere impostato quando si salva una nuova configurazione.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">L'emulatore o il profilo dell'emulatore non è impostato.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">La directory da scansionare non è specificata o non esiste.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">La configurazione della scansione non è impostata correttamente.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Includi nella scansione automatica globale</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Impossibile scansionare le cartelle per gli emulatori.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Impossibile scansionare le cartelle per i giochi emulati.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Nascondi gli importati</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Profili da importare:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Configurazioni della scansione automatica</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Salva come configurazione della scansione automatica</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Salva la configurazione per un suo successivo durante l'aggiornamento della libreria. Configurazioni salvate possono essere mangiate attraverso il menu &quot;Configura emulatori&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Importa utilizzando percorsi relativi</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Se possibile importa i file di gioco utilizzando i percorsi relativi alla cartella di installazione di Playnite o alla cartella di installazione dell'emulatore.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Scansiona le sottocartelle</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Scansione all'interno degli archivi</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Unisci file correlati</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Unisci i file di gioco correlati, come i singoli dischi di gioco, sotto una voce di gioco.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Aggiungi scanner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Aggiungi scanner salvato</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Avvia scansione</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Aggiungi scansione della/delle configurazione/i con emulatori per scansionare cartelle specifiche. Accertati che gli emulatori siano configurati prima di importare i giochi (via il menu Libreria -&gt; menu di Configurazione Emulatori). </sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Stato di default assegnato ai giochi recentemente aggiunti</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Status assegnato ai giochi giocati per la prima volta</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Impossibile inizializzare lo script PowerShell. Se sei un utente Windows 7, prova a (re)installare PowerShell 5.1 per riparare il problema.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Il preset del filtro con il nome specificato esiste già. Aggiornare il preset con le nuove impostazioni?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Riempi automaticamente i nomi di ordinamento mancanti per i giochi aggiunti o modificati in batch</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">Quando modifichi un gioco, aggiungi giochi tramite un aggiornamento della libreria, una scansione della cartella dell'emulatore o una normale scansione della cartella, compila automaticamente il campo “Nome di ordinamento” con una rappresentazione del nome del gioco più facilmente ordinabile. Ad esempio, “The Witcher 3” avrà come nome di ordinamento “Witcher 03”. In questo modo non verrà mai impostato un nome di ordinamento che non differisca dal nome del gioco e verranno aggiornati automaticamente solo i nomi di ordinamento vuoti.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Queste parole verranno rimosse dall'inizio del valore del nome di ordinamento compilato automaticamente:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Usalo per ignorare le parole all'inizio di una stringa per scopi di ordinamento. Il valore predefinito è &quot;The&quot;, &quot;An&quot; e &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Riempi il nome di ordinamento per i giochi senza uno</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Ordinamento</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Riempimento dei valori del nome…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">È stato rilevato che il servizio Nahimic è in esecuzione sul tuo sistema. Questo servizio è noto per causare problemi di rendering a Playnite (e altre applicazioni).\r\n\r\nSe incontri corruzione grafica o altri problemi di rendering in Playnite, ti consigliamo di disabilitare o disinstallare completamente il servizio Nahimic.\r\n\r\nMaggiori informazioni su https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite è in esecuzione con privilegi elevati (come amministratore). Questo non è raccomandato poiché dà privilegi elevati a tutte le estensioni installate e a tutti i giochi/app avviati da Playnite!\r\n\r\nMaggiori informazioni su https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Mostra avviso se Playnite è in esecuzione con privilegi elevati</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Ottenere la dimensione reale sul disco quando si calcola la dimensione dei giochi</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Se abilitata, le scansioni saranno più lente e otterranno la dimensione reale che i file usano nell'unità.\r\nSe disabilitata, le scansioni saranno più rapide e useranno le dimensioni dei file stessi.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">I seguenti add-on sono stati segnalati come potenzialmente problematici, sia a causa di un alto impatto sulla stabilità/prestazione che per problemi di sicurezza. Ti consigliamo vivamente di disinstallarli:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Escludi i file online dalla scansione</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">I file memorizzati sul cloud storage non saranno scansionati e importati se non sono disponibili localmente.\r\nSupportato solo per: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Scansiona ma usa metodo semplificato senza il contenuto del file</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">I file saranno importati ma usando un metodo meno accurato che non richiede il contenuto del file di essere scaricati e presenti localmente.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Applica a tutti</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Sovrascrivi lo stato di installazione</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Quando impostato, Playnite ignorerà lo stato di installazione (inclusa la directory di installazione) impostato dal plugin di integrazione che importa questo gioco.\r\n        \r\nQuesta opzione potrebbe non funzionare completamente con plugin che utilizzano un metodo di importazione di gioco specifico a meno che non tengano conto anche di questa opzione di override.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Solo manualmente</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Una volta al giorno</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Una volta a settimana</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Ad ogni avvio</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Controlla gli aggiornamenti del programma</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Controlla aggiornamenti aggiuntivi</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Aggiorna librerie</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Scansione cartelle di emulazione</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Includi giochi nascosti</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Modifica campi</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Seleziona / Deseleziona tutto</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Apri</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Attiva</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Assegna</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Inizia a digitare per cercare giochi… [F1] per aiuto</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">A partire da # porta su un elenco di comandi disponibili.\r\nA partire da / porta su un elenco di provider di ricerca/plugin disponibili.\r\nDigitare la parola chiave di ricerca e terminare con SPACE passa immediatamente a quella ricerca.\r\n\r\nTAB: cambia azione\r\nINVIO: attiva l'azione selezionata\r\nSHIFT-ENTER: apri il menu item</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Includi giochi disinstallati</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Includi giochi nascosti</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Giochi non installati inclusi</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Giochi disinstallati esclusi</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Giochi nascosti inclusi</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Giochi nascosti esclusi</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Riproduci o installa</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Vai ai dettagli</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Menu di partita</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Modifica partita</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Apri ricerca</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Casella di ricerca</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Pulsante ricerca</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Azione di gioco primaria</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Azione secondaria di gioco</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F apre la ricerca globale invece di focalizzare la casella di ricerca</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Salva le impostazioni del filtro di gioco tra le sessioni di ricerca</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Cerca per provider</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Parola chiave predefinita</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Parola chiave personalizzata</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Collegamenti di sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Ricerca Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Impostazioni estensione</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Esclusioni</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">File esclusi relativi alla cartella di scansione</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Cartelle escluse relative alla cartella di scansione</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Aggiungi file all'elenco di esclusione</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Aggiungi cartella all'elenco di esclusione</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Le esclusioni possono essere aggiunte solo alle configurazioni dello scanner salvate.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Le esclusioni sono state aggiunte allo scanner &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Sovrascrivi piattaforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Quando impostato lo scanner assegnerà questa piattaforma a tutti i giochi, sovrascrivendo le piattaforme automaticamente rilevate.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Includi i comandi nella ricerca predefinita</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Quando disabilitato, i comandi non saranno inclusi nella ricerca predefinita finché non verrà utilizzato il prefisso #</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Usa corrispondenza fuzzy nel filtro nomi</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Se abilitato, il filtro dei nomi corrisponderà ai nomi dei giochi allo stesso modo della ricerca globale.\r\nLa corrispondenza rigorosa può essere applicata su un singolo caso prefissando il filtro con il carattere !</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Campi da visualizzare per i risultati del gioco:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Stato nascosto</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Backup dati annullato.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Backup dei dati fallito.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Errore di backup dati</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Backup dei dati in corso…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Ripristino dati dal backup…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Impossibile ripristinare i dati dal backup.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Impostazioni</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Libreria giochi</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Media libreria dei giochi</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Estensioni installate</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Dati estensioni</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Temi installati</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Seleziona i dati da ripristinare dal file di backup specificato.\r\n    \r\nPlaynite verrà automaticamente riavviato per avviare il processo di ripristino del backup.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Seleziona gli elementi da includere con il backup dei dati. Le impostazioni dell'applicazione e i dati della libreria di gioco sono inclusi per impostazione predefinita.\r\n    \r\nPlaynite si riavvierà automaticamente per avviare il processo di backup.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Backup automatico dei dati</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Frequenza di backup automatico</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Cartella di backup</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Backup rotanti</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Includi dati aggiuntivi:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">La cartella di backup deve essere impostata se il backup automatico è abilitato.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Mostra solo le notifiche per le patch rilasciate</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Se abilitata, solo gli aggiornamenti disponibili per la versione principale attualmente installata comporteranno una notifica di aggiornamento.\r\nLe nuove versioni principali non comporteranno una notifica di aggiornamento.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Usa date relative per la settimana passata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Usa le date relative nel formato &quot;Oggi&quot;, &quot;Ieri&quot; ecc. se la data è inferiore a una settimana.\r\n    \r\nIl formato di data specificato verrà utilizzato per tutte le altre date.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Ricerca immagine web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Stringa di ricerca immagine icona</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Coprire la stringa di ricerca immagine</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Stringa di ricerca immagine sfondo</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Ricerca informazioni aggiuntive…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Nessuna fonte dati disponibile</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Riproduci impostazioni di azione</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Usa le impostazioni dello scanner</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Seleziona il profilo all'avvio</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Seleziona emulatore all'avvio</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automatico</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Sempre acceso</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Sempre spento</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Accessibilità (screen reader) supporto</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Menu applicazione</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Menu di partita</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Cartella programma</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Directory dati utente</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">È stata rilevata la corruzione del file della libreria, Playnite ora verrà arrestato.\r\n    \r\nApri un nuovo problema sulla pagina GitHub di Playnite con una richiesta di correggere la corruzione nei tuoi file.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Vuoi salvare le modifiche?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Installazione portatile</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Nessun controllore rilevato</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/ja_JP.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">日本語</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite の言語</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">終了</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">フィルター有効</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">フィルター無効</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">追加のフィルター</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">フィルター</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">フィルター</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">無効なデータ</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">変更した内容を保存しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">ホームページ www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">ソースコードは Github で公開されています</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">診断パッケージを作成する</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">システム情報を送信する</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Playnite について</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Made by Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">カテゴリーを設定</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">カテゴリーを設定</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">カテゴリーを追加</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">チェックあり - カテゴリーの割り当て\r\nチェックなし - カテゴリーを削除\r\n不確定 - 変更なし (複数のゲームを編集する場合)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">カテゴリーなし</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">プラットフォームなし</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">おっと！ 何か間違いがあったようです。</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">回復不能なエラーが発生しました。\r\n\r\nこの問題の修正を支援する場合は、クラッシュの前に実行されたアクションを簡単に説明してから、診断パッケージを作成してください。オンラインの場合、そのパッケージは解析のためにPlayniteサーバーにアップロードされます。\r\n\r\n「クラッシュのレポート」ボタンを使用して、GitHubで新しい問題を作成し、クラッシュを手動でレポートすることもできます。\r\n\r\nご協力ありがとうございます。</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">拡張機能 &quot;{0}&quot; で回復不能なエラーが発生しました。\r\n\r\nログファイルを保存し、問題を拡張機能の開発者に報告することをお勧めします。問題が再発する場合は、拡張機能を無効にしてください。</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">拡張機能 &quot;{0}&quot; で回復不能なエラーが発生しました。\r\n\r\nこの問題を拡張機能の開発者に報告することをお勧めします。問題が再発する場合は、拡張機能を無効にしてください。</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">不明な拡張機能またはテーマが原因で回復不能なエラーが発生しました。\r\n\r\nサードパーティのアドオンを無効にして、問題のあるアドオンを特定し、アドオンの開発者に問題を報告することをお勧めします。</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">回復不能なエラーが発生しました。\r\n\r\nこの問題の修正を支援する場合は、診断情報を送信してください。よろしくお願いします。</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">拡張機能を無効にする</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">ログファイルを保存</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">診断情報を送信</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">クラッシュレポート</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Playnite を再起動</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">セーフモードで再起動</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">すべてのサードパーティー製の拡張機能を無効にし、デフォルトテーマを使用します。</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Playnite を終了</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">クラッシュ前の操作 (英語)</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">ライブラリの管理</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">ゲームを削除しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">削除できません - ゲームまたはインストーラーが起動しています。</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">アンインストールできません - ゲームが実行中です。</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">{0} を削除してもよろしいですか？</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">{0} ゲームを削除してもよろしいですか？</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">{0} を削除してもよろしいですか？\r\n\r\n「除外リストに追加」オプションを選択すると、次回ライブラリが更新されたときにゲームが再びインポートされるのを防ぐことができます。</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">{0} ゲームを削除してもよろしいですか？\r\n\r\n「除外リストに追加」オプションを選択すると、次回ライブラリが更新されたときにゲームが再びインポートされるのを防ぐことができます。</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">現在使用されていない {0} の項目を削除しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">未使用のフィールドは見つかりませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">はい (除外リストに追加)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">このページには保存されていない変更点があります</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">ゲームライブラリのフォーマットを更新中…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">データベースの更新に失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">ゲームライブラリを更新できません。 {0} MBの空き容量が必要です。</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">ゲームエラー</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">ゲームを開始できませんでした。データベースに '{0}' が見つかりません。</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">ゲームを開始できませんでした: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">アクションを開始できませんでした: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">ゲームのインストール先を開くことができません: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">ゲームのインストールサイズを検出できませんでした: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">インストールサイズのスキャン時にエラーが発生しました</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">インストールサイズのスキャン中に {0} 個のエラーが発生しました</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">ショートカットの作成に失敗しました: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">マニュアルを開けませんでした: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">ゲームをインストールできません: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">ゲームをアンインストールできません: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">有効なゲーム起動アクションが見つかりませんでした。エミュレータアクションを使用する場合は、ゲームとエミュレーターの構成の間でプラットフォーム定義が一致していることを確認してください。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">インストールの実装は利用できません。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">このゲームを管理するライブラリプラグインがインストールされていないか、有効になっていません。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">公式のメタデータダウンロードは利用できません。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">ゲームが選択されていません。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">ゲームスクリプトの実行に失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">アプリケーションスクリプトの実行に失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">グローバルスクリプトの実行に失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">エミュレータスクリプトの実行に失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">スクリプトアクションの実行に失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 以降がインストールされていません。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">ゲームを起動する方法を特定できませんでした。</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">有効</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">無効</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">削除</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">未使用のものを除去する</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">名前の変更</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">コピー</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">追加</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">既定のアイコン</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">既定のカバー画像</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">既定の背景画像</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">終了</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">次へ</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">戻る</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">完了</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">戻る</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">消去</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">消去</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">消去</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">すべて消去</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">インポート</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">タイトル</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">作者</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">モジュール</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">シリーズ</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">バージョン</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">最後のプレイ</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">最もプレイした</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">プレイ回数</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">インストールサイズ</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">フォルダ</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">備考</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">追加日</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">追加日</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">変更日</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">更新日</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Web サイト</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">ファイルの場所</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">保存</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">閉じる</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">キャンセル</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">確認</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">リセット</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">はい</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">いいえ</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">ようこそ</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">ローカルユーザー</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">一般</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">メディア</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">関連リンク</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">インストール</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">アクション</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">ダウンロード中</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">メディアをダウンロード中…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">読み込み中…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">タイプ</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">プロファイル</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">プロファイル</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">削除</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">ダウンロード</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">検索</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">解像度:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">すべて</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">ズーム</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">リストビュー</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">カバー</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">グリッドビュー</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">詳細ビュー</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">カスタム</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">謝辞</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">ライセンス</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">貢献者</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Playnite を終了しています…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">今日</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">昨日</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">月曜日</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">火曜日</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">水曜日</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">木曜日</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">金曜日</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">土曜日</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">日曜日</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">過去 1 週間</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">過去 1 ヶ月間</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">過去 1 年間</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">1 年以上前</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 から 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB から 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB から 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB から 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB から 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB から 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB から 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB 以上</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">インポートが正常に完了しました。</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">すべてのゲーム</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ゲーム ID</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">データベース ID</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">プリセット</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">列</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">列</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">行</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">行</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Play アクションからアイコンを取得できませんでした。 ファイルタイプのアクションはありません。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">不足しているメタデータのみをダウンロード</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">このオプションを有効にすると、すでに情報が含まれているデータフィールドのメタデータのダウンロードがスキップされます。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">ゲームセレクト</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">どのゲームを新しいメタデータで更新するか選択してください。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">データベースに登録されているすべてのゲーム</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">現在フィルターが適用されているすべてのゲーム</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">選択したゲームのみ</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">メタデータフィールドが選択されていません</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">ダウンロード対象のメタデータフィールドが選択されていません。少なくとも1つを選択し、少なくとも1つのメタデータプロバイダを有効にしてください。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">公式ストア</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Playnite によって、どのソースからデータを取得し、どの項目に自動的に入力されるのかを選択してください。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Playnite が使用するデータを改善するために、上のロゴをクリックして igdb.com データベースの更新に貢献することを検討してください。</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">メタデータを取得中…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">インストール済みのゲームをインポート中…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">{0} のゲームをインポート中…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">{0} からエミュレータのゲームをインポート中…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">ライブラリの更新をダウンロード中…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">ライブラリ内のゲームのサイズをスキャン中…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">インポートされたゲームのサイズをスキャン中…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">ライブラリの更新完了</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">リソースを解放中…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">設定</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">設定…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">プラットフォームとエミュレータ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">エミュレータの設定…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">ライブラリの管理…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">ツール</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">メタデータを取得…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">ソフトウェアツール…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">連携設定…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">サードパーティークライアントを開く</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">サードパーティークライアント</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">ゲームライブラリを更新</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">ライブラリの更新をキャンセル</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">エミュレータゲームのフォルダを更新</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">ゲームを追加</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">手動追加…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">自動スキャン…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">エミュレータゲームを追加…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">マイクロソフトストアアプリケーション…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Playnite について</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">フィードバックを送信</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">フルスクリーンモードに切り替え</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">関連リンク</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">ヘルプ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Patreon でサポート</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Ko-Fi でサポート</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">ユーザーマニュアル</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK ドキュメンテーション</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">システムの再起動</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">システムのシャットダウン</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">システムのスリープ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">システムの休止</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">システムのロック</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">ユーザーのログアウト</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">ゲームをランダムに選択</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">詳細パネルに表示されるゲームフィールド:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">アイテムの間隔</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">グリッドアイテムの背景を描画する</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">グリッドアイテムの境界幅</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">ゲームアイコンのソースがない場合</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">ゲームカバーのソースがない場合</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">ゲーム背景のソースがない場合</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">ゲーム詳細の垂直方向の間隔</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">グリッドビューの詳細表示の位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">ゲームリストの詳細表示の位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">パネル間のセパレーターを描画する</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">ゲームカバー画像の高さ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">ゲームリストアイコンの高さ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">フォント</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">等幅フォント</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">フィルターパネルの位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">エクスプローラーパネルの位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">カバーアートのレンダリング</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">ターゲットのアスペクト比</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">以下のオプションは、フルスクリーンモードでのレンダリングにも影響します！</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">ストレッチモード</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD ボックス</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">四角</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam バナー</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam 縦カバー</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* 変更を適用するためには再起動が必要です。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">一般設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">トップパネル</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">外観設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">ゲーム詳細</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">レイアウト</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">詳細設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">フルスクリーン</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">入力</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">パフォーマンス</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">メタデータ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">更新</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">検索</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">バックアップ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">ライブラリデータのバックアップ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">バックアップから復元</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">ライブラリの変更を自動的にインポート</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">データベースファイルの場所が無効です。正しいファイルパスを設定する必要があります。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">アカウント名は空にできません。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">ゲームのインポート後にメタデータをダウンロード</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">最小化した状態で起動</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">PC 起動時に Playnite を起動</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">トレイに閉じた状態で起動</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">コンピュータの起動時に、Playnite を実行するよう登録することができませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">フルスクリーンモードで起動</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">非同期画像読み込み</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">画像の読み込み時間を遅くする代わりに、ゲームリストのスクロールの滑らかさを向上させることができます。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">カバー画像がない場合はゲーム名を表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">グリッドビューでゲーム名を表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">インストールされていないゲームの暗転表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">詳細ビューリストにゲームのアイコンを表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">グループの説明にアイテム数を表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">フィルターおよびエクスプローラーパネルで未使用の項目を隠す</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">ハードウェアアクセラレーションを無効にする</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">表示崩れなどの UI の問題が発生した場合に使用します。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">クイック起動リストに非表示ゲームを表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">ジャンプリストとトレイメニューリストに影響します。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">クイック起動の項目数</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">ウィンドウの背景にゲームの背景画像を使用する</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">背景をぼかす</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">高品質</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">背景を暗くする</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">グリッドビューで表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">テーマ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">テーマのプロファイル</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">フルスクリーンテーマ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">フルスクリーンテーマのプロファイル</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">データベースの場所</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">ログイン状態:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite 設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Web キャッシュを削除</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">アカウントのリンク中に発生した問題を解決できる可能性があります。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">システムトレイアイコンを表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Playnite をシステムトレイに最小化</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">アプリウィンドウを閉じたときに Playnite をシステムトレイに最小化</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">ゲーム起動時:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">ゲーム終了後:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">プレイ日数を示すプレイ時間に書式を適用</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">日付の書式:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">これにより、リンクされているすべてのサービスからログアウトします。 アプリケーションの再起動が必要です。続行しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">キャッシュをクリアしますか？</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">新しいテーマを適用するには Playnite の再起動が必要です。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">さらにテーマを入手</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">新しいテーマを作る</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">さらに拡張機能を入手</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">新しい拡張機能を作る</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">翻訳を手伝う</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">新しい設定を適用するためには Playnite を再起動する必要があります。今すぐ再起動しますか？\r\n\r\n現在進行中のタスク (ダウンロード) は再起動でキャンセルされます。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Playnite を再起動しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite はライブラリファイルを自動的に移動しません。場所を変更する前にそれらを移動/コピーする必要があります。ターゲットの場所にライブラリが存在しない場合、新しいライブラリが作成されます。\r\n\r\n新しいデータベースの場所は、アプリケーションの再起動後にのみ使用されます。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">「閉じる」アクションが設定されている場合は、ゲームプレイ時間が記録されません。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">行数</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">列数</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">詳細ビューの行数</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">メイン画面に背景画像を表示</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">メタデータを再ダウンロードせずに既存のゲームに遡って適用することはありません。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">ゲームのプレイ時間をライブラリにインポート:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Playnite データベース内のゲームについて、ライブラリプラグインから報告されたプレイ時間をいつ Playnite にインポートするかを設定します。\r\nこの機能を利用するには、ゲームの処理を行うライブラリプラグインのサポートが必要です。\r\n\r\n常に有効: Playnite データベース内の新しくインポートされたゲームと既存のゲームのプレイ時間をインポートします。\r\n新しくインポートされたゲームのみ: 新しくインポートされたゲームのプレイ時間のみをインポートします。\r\n常に無効: いかなる状況でもプレイ時間をインポートしません。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">常に有効</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">新しくインポートされたゲームのみ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">常に無効</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">デスクトップモードでゲームコントローラーのサポートを有効にします。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">ガイドボタンでフルスクリーンモードを開く</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">新しく取り込んだゲームのメタデータの自動ダウンロード設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">ターゲットのディスプレイ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">常にプライマリディスプレイを使用する</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">ゲームのタイトルを表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">バッテリー状態を表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">バッテリー残量を表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">時計を表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">マウスカーソルを隠す</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">クイックフィルター内のインストールゲームのみ表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">ボタン表記</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">レイアウト</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">横スクロール表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">以下のオプションから選択</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">利用可能な設定がありません</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">設定の読み込みに失敗しました</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">これらのスクリプトは、ライブラリ内のすべてのゲームに対して実行されます。ゲームの詳細を編集する際に、個々のスクリプトを各ゲームに個別に割り当てることができます。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">背景画像の遷移をアニメーション化</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">フォントサイズ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">自動</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">エイリアス</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">グレースケール</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideal (最適)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Display (GDI 互換)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">テキストの書式設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">テキストのレンダリングモード</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">テキストのレンダリングと書式のオプションは現在、ゲームの説明文には適用されません。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">背景画像のプリロード</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">有効にすると、Playnite はメタデータのダウンロード中に背景のアートワークをダウンロードし、より多くのディスク容量を使用して、オフライン時にアートワークを利用できるようにします。\r\n\r\n無効にすると、背景アートワークは最初に必要なときにのみダウンロードされ、スペースが少なくなりますが、アートワークが表示される前に遅延が発生し、オフライン時には一部の画像が利用できなくなる場合があります。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">ゲーム終了時に他のクライアント (Steam 等) を自動的に終了する</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">クライアントシャットダウンの猶予期間 (秒)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">ゲームのセッションが指定時間 (秒) より短いときに閉じない</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">以下のクライアントを自動的に閉じる:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">クライアント自動終了</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">インポートの除外リスト</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">大きすぎるゲームメディアを割り当てるときに警告を表示</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">ディレクトリを開くコマンド</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">年齢制限機関の設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">ライブラリの更新時にゲームのインストールサイズを更新</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">前回のスキャン以降にファイルの変更が検出された場合、ゲームのインストールサイズをスキャンして更新します。</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">無し</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">埋める</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">均等</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">均等に埋める</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">左</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">右</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">上</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">下</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">インポートエラー</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">認証が必要です</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">認証に失敗しました</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">ウェブビューの代替レンダリングモード</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">内蔵認証ダイアログなどのウェブビューで問題が発生する場合に使用します。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">大きなゲーム説明文を分割して読み込む</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">大きな説明文はゲームの選択時に顕著なラグを引き起こす可能性があります。\r\n\r\n有効にすると、説明文の一部のみが最初に読み込まれ、残りは必要に応じて読み込まれるようになります。</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">メタデータのインポート</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">メタデータを取得</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">選択した構成を、今後のメタデータのダウンロードに使用するように設定します。\r\nアプリケーション設定でも変更できます。</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">エミュレーションインポートウィザード</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">このウィザードは、コンソールエミュレータのダウンロードとインポート、エミュレートされたゲームのインポート手順を案内します。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">後から、いつでもメインメニューを介して、エミュレータやゲームを追加することができます。(エミュレータ設定の場合は[ツール]メニュー、エミュレートゲームの場合は[ゲームの追加]メニュー)</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">以下は Playnite が認識し自動的に設定できるエミュレータのリストです。あなたはこれらのウェブサイトを訪問し、ダウンロードしてインストールすることができます。エミュレータをインストールしたら、次の画面に進んでそれらを Playnite にインポートします。\r\n        \r\nまた、後で設定メニューからカスタムエミュレータを設定してインポートすることもできます。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">「フォルダから自動検出」ボタンを押すと、PC にインストールされているエミュレータをインポートできます。Playnite は選択されたフォルダから既知のエミュレータを探し、それらをインポートするオプションを提供します。ボタンを複数回使用して複数のフォルダからインポートすることができ、エミュレータは現在のリストの一番下に追加されます。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">「エミュレータを使用してフォルダをスキャン」ボタンを押すことでゲームをインポートできます。適切なエミュレータを選択すると、Playniteにどのファイルタイプをスキャンしてインポートするかを指示します。ボタンを複数回使用して複数のフォルダからインポートすることができ、ゲームは現在のリストの一番下に追加されます。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">インポート用のエミュレータが選択されていません。エミュレータを設定しない限り、エミュレートされたゲームを自動的にインポートすることはできません。 インポート処理を続行して終了してもよろしいですか？</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Playnite に設定されたエミュレータがありません。まずエミュレータを設定し、適切なファイルタイプを選択しなければ、ゲームをインポートすることはできません。エミュレータを追加しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">エミュレータを使用してフォルダをスキャン</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">ファイルを選択</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">フォルダから自動検出…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">エミュレータの設定…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">スキャン中</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">{0} をスキャン中…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">初回設定</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">このウィザードは、自動ゲームインポートプロセスと外部ゲームライブラリの設定を案内します。PlayniteはSteamやGOGなどの複数のゲームサービスから自動的にゲームをインポートすることができます。また、アプリケーションの起動時にライブラリを自動的に更新することでライブラリを最新の状態に保ちます。\r\n        \r\nいつでも'Playnite'のメインメニューから、あらゆるプラットフォーム用のカスタムゲームを追加できます。   \r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">ライブラリ連携</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">以下は Playnite がサポートしているライブラリの一覧です。インストールしたいものを選択してください。\r\n\r\n「アドオン」メニューから追加の連携機能をインストールすることができます。</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">設定完了</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">初期設定が完了しました。メインメニューから追加の連携を追加するだけでなく、後ですべての設定を変更できることを忘れないでください。</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">1 つ以上の拡張機能のダウンロードに失敗しました。\r\n\r\nウィザードの初回実行が終了したら、アドオンメニューから連携機能の再ダウンロードをお試しください。</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">{0} 連携機能をダウンロードしています…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">推奨される連携リストをダウンロード中…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">推奨される連携リストをダウンロードできませんでした。後でアドオンメニューから再ダウンロードできます。</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">プラットフォームとエミュレータを設定する</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">エミュレータの設定</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">プラットフォーム</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">プラットフォーム</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">エミュレータ</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">エミュレータ</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">プラットフォームを追加</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">アイコンを選択</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">カバーを選択</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">画像を選択</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">項目を選択</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">背景を選択</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">ファイルを選択</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">URL を選択</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">エミュレータを追加</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">サポートされているプラットフォーム</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">プラットフォームの変更を保存しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">エミュレータの変更を保存しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">実行ファイル</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">引数</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">作業フォルダ</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">サポートされているファイルの種類</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">エミュレータをインポート…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">エミュレータをダウンロード…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">既知のエミュレータプロファイルからプリセット引数を読み込む</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">エミュレータ {0} を削除してもよろしいですか？       \r\n現在 {1} 個のゲームで使用されています。</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">プラットフォーム {0} を削除してもよろしいですか？       \r\n現在 {1} 個のゲームおよび {2} 個のエミュレータで使用されています。</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">設定のヘルプ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">並べ替え</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">並べ替え方向</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">グループ化</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">昇順</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">降順</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">グループ化しない</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">ライブラリでグループ化</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">カテゴリーでグループ化</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">プラットフォームでグループ化</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">ビュータイプ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">ビュー</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">エクスプローラーパネル</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">フィルターパネル</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">アイコン</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">ライブラリアイコン</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">カバー画像</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">背景画像</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">ソート用タイトル</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">ライブラリ</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">マニュアル</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">タイトル</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">インストール先</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">アカウント名</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">プラットフォーム</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">カテゴリー</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">ジャンル</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">発売日</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">発売年</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">開発元</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">タグ</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">パブリッシャー</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">インストール状態</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">すべてに一致</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">有効にすると、すべてのフィルターの項目を使用しているゲームだけがビューに含まれます。\r\n無効の場合、いずれかのフィルターの項目を使用しているゲームがビューに含まれます。</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">インストール済み</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">インストール済み</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">未インストール</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">非表示</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">お気に入り</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">HDR を有効にする</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">有効にすると、ゲームを開始する前にプライマリディスプレイでHDRが有効になります。</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">※HDR はあなたのプライマリディスプレイではサポートされていないことに注意してください。</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">最後のプレイ</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">カテゴリー</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">説明</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">インストールフォルダ</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">カバー画像</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">関連リンク</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">ROM/ISO イメージのパス</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">ジャンル</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">ジャンル</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">企業</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">企業</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">開発元</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">開発元</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">パブリッシャー</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">パブリッシャー</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">カテゴリー</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">カテゴリー</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">タグ</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">タグ</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">特徴</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">特徴</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">年齢別レーティング</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">年齢別レーティング</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">地域</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">地域</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">ソース</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">ソース</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">最近のアクティビティ</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">データベースエラー</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">ライブラリデータベースを開けませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">データベースが開かれていません。</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">ライブラリデータベースにアクセスできません。ファイル &quot;{0}&quot;は別のプロセスによって使用されているか、アクセスできない場所にあります。</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">診断パッケージを作成できませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">診断パッケージを自動的にアップロードできませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">診断情報が正常に送信されました。</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">診断パッケージが作成され、正常にアップロードされました。\r\nクラッシュレポートに次のIDを添付してください:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">{0} からゲームをインポートできませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">{0} からエミュレータゲームをインポートできませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">選択したエミュレータプロファイルではゲームを検索できません。プロファイルにファイル拡張子やプラットフォームが含まれていません。</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite は起動に失敗しました。実行中のすべての Playnite のプログラムを閉じてからやり直してください。</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">テーマ &quot;{0}&quot;、カラープロファイル &quot;{1}&quot;の適用に失敗しました。\r\n        \r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">リンクを開けません。URL が無効な形式です。</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">アプリケーションの起動に失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Webview コンポーネントの初期化に失敗しました。Playnite は起動処理を続行できません。\r\n\r\n詳細は https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">定義ファイルが見つからないか壊れているため、エミュレータをインポートできません。</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">メニューアクションの実行に失敗しました。</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">ゲーム詳細を編集</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">画像 URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">関連リンクを追加</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">ROM の追加</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">保存</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">編集中のゲームにフィールドの変更を適用します。</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">アクションの追加</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">アクションの削除</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">プレイアクションの削除</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">ゲームを追加</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">フォルダをスキャン…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">インストール済みを検出</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">参照…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Playnite を開く</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">プロファイル設定</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">ゲーム名は空欄にできません。</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">ゲームアクショントラッキングディレクトリを空にすることはできません。</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">メタデータを検索する前にゲーム名を空欄にすることはできません。</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">無効なゲームデータ</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">http:// または https:// で始まる有効な Web URL を入力してください。</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">URLの選択</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">メタデータをダウンロードできませんでした: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">ダウンロードエラー</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">フィルターを解除</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">非公開アカウント</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">公開アカウント</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API キー</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">起動エラー</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">テーマエラー</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">すべて消去</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">インストール中</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">アンインストール中</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">起動中</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">実行中</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">無効な URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">何もしない</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">最小化</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">ウィンドウを復元する</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">UI から起動した場合のみウィンドウを復元する</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">終了</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">変更</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">高度な設定</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">未プレイ</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">プレイ状況</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">プレイ状況</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">スコア</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">批評家スコア</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">ユーザースコア</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">ゲームスクリプト</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">アプリケーションスクリプト</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">スクリプト</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">プラグイン</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">メタデータのソース</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">拡張機能</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">拡張 ID</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">スクリプトの再読み込み</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">インタラクティブ SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">すべてのスクリプトが正常に再読み込みされました。</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">指定された検索/フィルター条件に一致するゲームは見つかりませんでした</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">アイテムが見つかりません</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">デスクトップモードに切り替え</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Playnite を終了</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">ライブラリ</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">すべて更新</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">開発元:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">バージョン:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">更新日:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">モジュール:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">ライブラリ</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">統計</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">すべて</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">無し</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">通知</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">幅</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">高さ</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">サイズ</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">小</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">中</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">大</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">より大きい</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">最大</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">デフォルト</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">選択</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">すべて選択</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">すべての選択を解除</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">最初</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">ランダム</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">ユーザー選択</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">更に読み込む</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">透過</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">折り畳む</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">展開する</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">すべて畳む</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">すべてを展開</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">その他</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">テーマ</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">エミュレータ引数</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">組み込み用引数</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">カスタム引数</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">追加のエミュレータ引数</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">エミュレータ引数を上書きする</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">プレイアクション</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">インポートするメタデータの選択</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">インポートするゲームを選択</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">メタデータ検索</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">更新が利用可能です</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">最終更新からの変更点</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">更新をダウンロードしてインストール</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">更新を確認</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">更新エラー</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">新しいバージョンを確認できませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">新しいバージョンは見つかりませんでした。最新版です。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">更新のダウンロードとインストールに失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">いくつかのバックグラウンドタスクが現在進行中です。キャンセルして更新を続けますか？</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">いくつかのバックグラウンドタスクが現在進行中です。 キャンセルして Playnite を終了しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">いくつかのバックグラウンドタスクが現在進行中です。モードを切り替えるとタスクがキャンセルされますが、それでも切り替えますか?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Playnite の更新が利用可能です。</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">テーマリストを再読み込み</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">選択したテーマを適用</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">ファイルの変更を監視する</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">ソースファイルが変更されたとき、自動的にテーマを適用する</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">スクリプト実行時間</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">ゲームの開始前に実行</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">ゲームの終了後に実行</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">ゲームの開始後に実行</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">アプリケーションの起動時に実行</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">アプリケーションのシャットダウン時に実行</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">ゲーム起動時のスクリプト</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">ゲーム実行時のスクリプト</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">ゲーム終了時のスクリプト</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">グローバルスクリプトの実行</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">全般</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">フィルター済み</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">現在</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">新規</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">スクリプトをテスト</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">選択した項目のみを表示</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">デフォルトとして保存</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">お気に入りに追加</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">お気に入りから削除</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">このゲームを非表示</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">非表示から削除</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">HDR を有効にする</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">HDR を無効にする</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">編集…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">インストールサイズを計算</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">インストールサイズを計算する (すべてのゲーム)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">インストールサイズを計算する (不足しているデータのみ)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">インストールサイズ</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">カテゴリーを設定</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">プレイ状況を設定</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">削除</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">プレイ</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">インストール</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">ゲームオプション</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">詳細</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">アンインストール</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">インストール先を開く</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">デスクトップショートカットを作成</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">説明書を開く</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">さらに表示</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">ライブラリプラグインで管理</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">ゲームの開始プロセスは、このゲームを担当するライブラリプラグインによって管理されます。</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">指定されたページにゲーム「{0}」に関する関連情報は見つかりませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">ヒント:「編集」メニューオプションで単一のゲームを編集中、より高度なメタデータのダウンロード処理を使用できます。</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">何らかのアクションが進行中のときは利用できません。</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">説明テキストは HTML 構文に依存します</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">ゲーム時間は秒で記録されます。</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">インストールサイズはバイト単位で表示されます。</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">発売日は「年-月-日」形式で設定する必要があります。月と日の値は省略可能です。</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">0 から 100 までの値、またはスコアなしの場合は空です。</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Playnite の開発はこれらの利用者によって支えられています:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">コード、ローカライゼーション、その他の貢献者の順番は特に決まっていません:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">ゲームモニタリングをキャンセルしますか？</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">インストールモニタリングが現在実行中です。プロセスをキャンセルしてゲームを以前の状態に戻しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">ゲーム実行モニタリングが現在実行中です。プロセスをキャンセルしてゲームを以前の状態に戻しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">プレイ時間</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">最後のプレイ</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0} 日 {1} 時間 {2} 分</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0} 時間 {1} 分</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} 分</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} 秒</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">未プレイ</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">デスクトップモードへ切り替え中…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">フルスクリーンモードへ切り替え中…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">ゲームライブラリをロード中…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">インストールサイズを計算中…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">{0} のインストール容量を計算中…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">スクリプトファイルのインストールに失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">スクリプトは正常にインストールされました。</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">スクリプトのインストール</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">スクリプトエラー</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">拡張機能の実行に失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">メタデータフォルダを開く</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">計算</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">ゲームに ROM がある場合はそれを、インストールディレクトリが設定されている場合はそれを使用して、インストールサイズを自動的に計算します。</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} クライアントがインストールされていません。</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">クライアントが開きます。サインインしてからこのメッセージを閉じてください。</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">ユーザーがログインするのを待っています。完了したら閉じてください。</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">ゲームのインストールフォルダが見つかりません。</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">無効なゲームアクション設定です。</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">アカウント同期問題のトラブルシューティング</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">問題のトラブルシューティング</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">アイテムの名前を変更</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">新しいアイテムの追加</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">名前を入力</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">新しい名前を入力</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">1 時間未満</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 から 10 時間</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 から 100 時間</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 から 500 時間</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 から 1000 時間</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000 時間以上</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">インストールを完了するためには再起動が必要です。今すぐ再起動しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">拡張機能は適切にパッケージされていません。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">テーマは適切にパッケージされていません。</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">拡張機能 &quot;{0}&quot; を正常に読み込めませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">拡張機能 &quot;{0}&quot; を読み込むことができません。現在の Playnite バージョンではサポートされていません。</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">テーマ &quot;{0}&quot; を正常に読み込めませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">テーマ &quot;{0}&quot; を読み込むことができません。現在の Playnite のバージョンではサポートされていません。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">拡張機能を正常に読み込めませんでした。</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">テーマを正常に読み込めませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">テーマ/拡張機能にサポートされていない API が使用されています。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">インストールに成功しました。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">アドオンをインストールしますか？</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">全般</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">アドオン &quot;{0}&quot; のインストールに失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">拡張機能のインストールに失敗しました。\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">新しい拡張機能をインストールしますか？\r\n\r\n{0}\r\nBy {1}\r\nVersion {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">&quot;{0}&quot; 拡張機能をアップデートしますか？\r\n\r\n現在のバージョン：{1}\r\n新しいバージョン：{2}\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">テーマのインストールに失敗しました。\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">新しいテーマをインストールしますか？\r\n\r\n{0}\r\nBy {1}\r\nVersion {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">&quot;{0}&quot; テーマをアップデートしますか？\r\n\r\n現在のバージョン：{1}\r\n新しいバージョン：{2}\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">デフォルトのウェブブラウザを使って次のウェブページに行きます。続行しますか？\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">選択した画像は最適なパフォーマンスには大きすぎる可能性があります。非常に大きな画像を使用すると、UIの反応が低下し、メモリ使用量が増加する場合があります。\r\n\r\n推奨される最大解像度：\r\nアイコン: {0} メガピクセル\r\n表紙: {1} メガピクセル\r\n背景: {2} メガピクセル</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">パフォーマンス警告</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">次回から表示しない</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">ファイル拡張子 {0} は互換性がありません。</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">互換性のないファイル拡張子</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">選択された画像は最適なパフォーマンスには大きすぎる可能性があります。</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">選択したテーマをアンインストールしますか？アンインストールは次回アプリ起動時に行われます。</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">ビルトインテーマはアンインストールできません。</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">このテーマは現在の Playnite ではサポートされていません。</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">選択した拡張機能をアンインストールしますか？アンインストールは次回アプリ起動時に行われます。</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">ビルトインテーマはアンインストールできません。</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">この拡張機能は現在の Playnite ではサポートされていません。</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">インストールフォルダ</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">データフォルダ</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">診断パッケージを生成中…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">診断パッケージをアップロード中…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">ファイルのインポート...</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">これは何ですか？</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">実行してもいいですか？</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">総プレイ時間</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">平均プレイ時間</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">トップのプレイ時間</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">合計インストールサイズ</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">概観</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">サイドバー</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">サイドバーに表示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">設定のリセット</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">以下を除くすべてのアプリケーションの設定が初期化されます。\r\n- データベースの場所\r\n- インポート除外リスト\r\n- ライブラリ連携を含む拡張機能の設定\r\n    \r\n処理を終了するには、アプリケーションの再起動が必要です。設定をリセットしますか？</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">開発者向け</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">外部拡張機能</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">フォルダのフルパスを入力してください。</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">実績</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">フォーラム</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">ニュース</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">ストアページ</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">初回設定はまだ完了していません。Playnite は手順を完了させるためにデスクトップモードで再起動します。</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">最近のプレイ</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">お気に入り</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">最もプレイしたゲーム</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">すべて</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">フィルターが適用されています。</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">追加のフィルターが適用されています。</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">次の条件での検索結果:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">同じ名前のアイテムが既に存在します。</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">選択を現在のフィルターに制限する</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">別のものを選ぶ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">アドオン…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">インストール済み</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">拡張機能の設定</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">参照</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">更新</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">{0} を更新</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">インストールされた拡張機能およびテーマの管理とその設定は、新しい「アドオン」メニューに移されました。</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">現在インストールされているライブラリ連携拡張機能はすべて、ここで設定できます。\r\n\r\n追加の連携をインストールまたはアンインストールしたい場合は、メインメニューから「アドオン」オプションを使用してください。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">デスクトップテーマ</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">フルスクリーンテーマ</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">検索中…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">アドオンは、このバージョンの Playnite と互換性がありません。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">アドオンインストールパッケージのダウンロードに失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">アドオンインストールマニフェストのダウンロードに失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">変更を適用するにはアプリケーションの再起動が必要です。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">このアドオンはインストール予定です。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">インストール</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">再インストール</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">アンインストール</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">インストール済み</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">新しいアドオンの更新は見つかりませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">アドオンの更新</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">更新履歴は利用できません</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">インストール予定</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">ダウンロードに失敗しました</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">ライセンスが拒否されました</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">{0} をダウンロード中…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">アドオンの更新を検索中...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">プログラムのアップデートを探しています…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">1 つ以上のアドオンの更新が利用可能です。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">更新する項目を選択</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">拡張機能開発インスタンス</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} ライセンス契約</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">同意</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">拒否</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">ライブラリ連携プレイアクションを含める</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">アクションを選択</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">トラッキングモード</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">トラッキングパス</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">初期トラッキング遅延</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">トラッキング間隔</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">リンク</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">ファイル</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">エミュレータ</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">スクリプト</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">デフォルト</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">プロセス</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">フォルダ</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">元のプロセス</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">プロセス名</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">メッセージをログに記録する</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">以下の変更は、現在選択されているすべてのゲームのデータを上書きします。</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">無し</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">均一</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">項目のみ</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">最初と最後のみ</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">スクロールの感度</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">スムーズスクロール</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">アニメーション速度</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">アイテムを削除しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">このアイテムを削除してもよろしいですか？</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">トップパネルに表示するボタン:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">全般的な表示設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">グループ設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">並べ替え設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">フィルタープリセット</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">プラグインの項目の位置</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">セクションセパレータの幅</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">メインメニューボタンをサイドバーに移動</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">エクスプローラーパネル</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">ランダムゲームピッカー</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">ランダムゲームピッカー</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">ビューからランダムにゲームを選択</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">グループ化と並べ替えの設定を保存する</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">フルスクリーンモードでクイックフィルターとして表示</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">過去 7 日間</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">過去 31 日間</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">過去 365 日間</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">365 日以上前</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">設定</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">プリセットを保存</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">ゲーム開始後に最小化</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">ゲームを開始した後、Playnite を最小化します。\r\n\r\n無効にすると、ゲーム起動時に入力フォーカスが当たらないという問題が発生することがあります。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">文字サイズ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">フォントサイズ小</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">ゲームコントローラーAPIのサポートを有効にする</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">ゲームコントローラーのサポート</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">無効にすると、Playnite はあらゆるゲームコントローラーの入力を受け付けなくなります。\r\n\r\nゲームコントローラーの入力をマウス/キーボードの入力に変換するツールを使用していて、Playnite で入力が二重になってしまう場合は無効にしてください。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">メインメニューに項目を表示する:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">X/A メインビューボタンを入れ替える</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">ゲームを開始したりメインビューにゲームの詳細を表示するためにボタンの割当を入れ替えます。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">確認/キャンセルボタン設定を入れ替える</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">確認とキャンセルのための A/B ボタンの割り当てを反転します。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">プライマリーコントローラーのみ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">有効な場合にのみプライマリコントローラからの入力を受け付けます。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">ガイドボタンで Playnite にフォーカス</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">インターフェイスの音量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">背景の音量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">バックグラウンドでミュート</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">オーディオインターフェースの初期化に失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">出力 API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">音声出力に使用する API です。サウンドに問題がある場合は変更してください。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">一般</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">外観</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">音声</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">レイアウト</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">メニュー</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">入力</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} を起動中…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} を実行中…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Caps</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">スペース</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">画像レンダリングスケーラー</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">代替</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">バランス</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">画質</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">画質：\r\n最高の画質、低速、高メモリ使用量。\r\n    \r\nバランス：\r\n中画質、高速、低メモリ使用量。\r\n    \r\n代替：\r\n高画質、中速、低メモリ使用量。\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">ファイルを選択</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">フォルダを選択…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">起動スクリプト</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">拡張機能とテーマのどちらとも Playnite のパフォーマンス、安定性、セキュリティに大きな影響を与える可能性がありますので、ご注意ください。\r\n    \r\nテーマや拡張機能をインストールした後に何らかの問題が発生した場合は、まずそれらを無効化またはアンインストールして、問題の原因であるかどうかを確認してください。</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">起動時に選択</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">起動時に選択</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">ビルトインプロファイル</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">ビルトインプロファイル</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">カスタムプロファイル</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">カスタムプロファイル</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">内蔵スクリプトで処理</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">エミュレータの指定</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">プラットフォームの指定</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">地域の指定</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">エミュレータの起動前に実行</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">エミュレータの起動後に実行</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">エミュレータの終了後に実行</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">エミュレータの実行ファイルが見つかりません。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">エミュレータの指定が見つかりません。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">エミュレータ起動スクリプトが見つかりません。</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">別々のゲームとして分割する</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">1つのゲームに統合する</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">プラットフォームの設定</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">地域を設定</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">フォルダをスキャン</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">スキャン設定</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">チェックサムスキャンからパターンを除外する</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">指定されたパターンに一致するファイルは、チェックサムのスキャンを行わず、ファイル名でマッチングされます。詳細はエミュレータのヘルプを参照してください。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">エミュレータでのスキャン</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">新しい設定を保存するときに名前を設定する必要があります。</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">エミュレータまたはエミュレータプロファイルが設定されていません。</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">スキャンするディレクトリが指定されていないか、存在しません。</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">スキャン設定が正しく設定されていません。</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">一括スキャンのオートスキャンに含める</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">エミュレータのフォルダをスキャンできませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">エミュレータゲームのフォルダをスキャンできませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">インポート済みを非表示</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">インポートするプロファイル:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">オートスキャン設定</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">オートスキャン設定として保存</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">ライブラリの更新時に使用するために設定を保存します。保存した設定は「エミュレータの設定」メニューで管理できます。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">相対パスを使用してインポート</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">可能であれば、Playnite のインストールフォルダまたはエミュレータのインストールフォルダからの相対パスを使用してゲームをインポートしてください。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">サブフォルダをスキャン</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">アーカイブ内をスキャン</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">関連ファイルを統合する</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">個々のゲームディスクのように、関連するゲームファイルを 1 つのゲームエントリの下に統合します。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">スキャナを追加</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">保存したスキャナを追加</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">スキャンを開始</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">特定のフォルダをスキャンするために、エミュレータのスキャン設定を追加します。ゲームをインポートする前に、エミュレータが適切に設定されていることを確認してください（「ライブラリ」→「エミュレータの設定」メニューから）。</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">新しく追加されたゲームに付与される既定のステータス</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">初めてプレイするゲームに付与されるステータス</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">PowerShell スクリプトランタイムの初期化に失敗しました。Windows 7 を使用している場合は、PowerShell 5.1 を (再) インストールすると問題が解決します。</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">指定された名前のフィルタープリセットはすでに存在します。新しい設定でプリセットをアップデートしますか？</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">一括追加または編集されたゲームについて、欠落しているソート名を自動的に補完する</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">ゲームを編集する際、ライブラリ更新、エミュレータフォルダスキャン、または通常のフォルダスキャンを通じてゲームを追加する際は、「ソート名」フィールドにゲームの名前をより適切にソートできる形式で自動的に入力します。例えば「ロックマン 3」の場合、ソート名は「ロックマン 03」となります。ゲーム名と同一のソート名は設定されず、空欄のソート名のみが自動的に更新されます。</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">これらの単語は自動的に入力されたソート用タイトルの先頭から削除されます:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">並べ替えの目的で文字列の先頭にある単語を無視する場合に使用します。デフォルトは &quot;The&quot;, &quot;An&quot;, &quot;A&quot; です。</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">ソート用タイトルのないゲームにソート名を設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">並べ替え</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">ソート用タイトルの値を設定中…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Nahimic サービスがシステムで実行されていることが検出されました。このサービスは、Playnite  (および他のアプリ) にレンダリングの問題を引き起こすことが知られています。\r\n\r\nもし Playnite でグラフィックの破損やその他のレンダリングの問題が発生した場合、Nahimic サービスを無効にするか完全にアンインストールすることをお勧めします。\r\n\r\n詳細については以下の URL を参照してください。\r\nhttps://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite は管理者権限で実行されています。インストールされているすべての拡張機能と、Playnite から起動されたすべてのゲーム/アプリに管理者権限を与えるため、これはお勧めしません。\r\n\r\n詳細については以下のURLを参照してください。\r\nhttps://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Playnite が管理者権限で実行されている場合に警告を表示</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">ゲームのサイズを計算するときにドライブ上の実際のサイズを取得する</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">有効にすると、スキャンは遅くなり、ファイルがドライブで使用する実際のサイズを取得します。\r\n無効にすると、スキャンはより高速になり、ファイルのサイズ自体が使用されます。</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">次のアドオンは、高い安定性/パフォーマンスへの影響またはセキュリティの問題のいずれかが原因で、潜在的に問題があると報告されています。 アンインストールすることを強くお勧めします。\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">オンラインファイルをスキャン対象から除外する</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">クラウドストレージに保存されているファイルは、ローカルで利用できない場合はスキャンおよびインポートされません。\r\nサポート対象：Googleドライブ、DropBox、OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">スキャンしますが、ファイルの内容を含まないシンプルな方法を使用します</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">ファイルはインポートされますが、ファイルの内容をダウンロードしてローカルに表示する必要がない、精度の低い方法を使用します。</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">すべてに適用</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">インストール状態を上書き</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">設定すると、Playnite はこのゲームをインポートする連携プラグインによって設定されたインストール状態 (インストールディレクトリを含む) を無視します。\r\n\r\nこのオプションは、特定のゲームのインポート方法を使用するプラグインでは、このオーバーライドオプションも考慮に入れない限り、完全に動作しない場合があります。</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">手動のみ</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">1日に1回</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">週に1回</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">すべての起動時</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">プログラムの更新を確認</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">アドオンの更新を確認</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">ライブラリを更新</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">エミュレータゲームのフォルダをスキャン</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">非表示ゲームを含める</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">フィールドを編集</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">すべて選択/選択解除</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">開く</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">有効にする</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">割り当て</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">ゲームを検索するために入力を開始… [F1] でヘルプを表示</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"># で始めると、利用可能なコマンドのリストが表示されます。\r\n/ で始めると、利用可能な検索プロバイダ/プラグインのリストが表示されます。\r\n検索キーワードを入力し、最後に Space を入力すると、すぐにその検索に切り替わります。</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">未インストールのゲームを含める</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">非表示ゲームを含める</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">アンインストールされたゲームを含める</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">アンインストールされたゲームを除外する</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">非表示ゲームを含める</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">非表示ゲームを除外する</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">プレイまたはインストール</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">詳細に移動</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">ゲームメニュー</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">ゲームを編集</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">検索を開く</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">検索ボックス</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">検索ボタン</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">第１ゲームアクション</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">第２ゲームアクション</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">Ctrl+F で検索ボックスにフォーカスする代わりにグローバル検索を開く</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">検索セッション間でゲームフィルターの設定を保存</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">検索プロバイダー</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">デフォルトのキーワード</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">カスタムキーワード</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">システム全体のショートカット</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite の検索</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">拡張機能の設定</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">除外</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">スキャンフォルダに関連する除外ファイル</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">スキャンフォルダに関連する除外フォルダ</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">除外リストにファイルを追加</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">除外リストにフォルダを追加</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">除外は、保存されたスキャナ設定にのみ追加できます。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">&quot;{0}&quot; スキャナーに除外しました。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">プラットフォームを上書き</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">設定すると、スキャナはこのプラットフォームをすべてのゲームに割り当て、自動的に検出されたプラットフォームを上書きします。</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">デフォルトの検索にコマンドを含める</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">無効にすると、# プレフィックス が使用されるまで、コマンドはデフォルトの検索に含まれません。</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">名前フィルターであいまい検索を使用</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">有効にすると、名前フィルターはグローバル検索と同じようにゲーム名をマッチさせます。\r\nフィルターの前に ! 文字を付けることで、個々のケースに対して厳密なマッチングを行うことができます。</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">ゲーム結果に表示されるフィールド:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">非表示状態</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">データのバックアップはキャンセルされました。</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">データのバックアップに失敗しました。</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">データのバックアップに失敗しました！</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">データのバックアップ中…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">バックアップからデータを復元中…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">バックアップからデータを復元できませんでした。</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">設定</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">ゲームライブラリ</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">ゲームライブラリメディア</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">インストールされている拡張機能</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">拡張機能データ</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">インストールされているテーマ</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">指定したバックアップファイルから復元するデータを選択してください。\r\n    \r\nPlaynite は自動的に再起動し、バックアップの復元処理を開始します。</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">データのバックアップに含める項目を選択します。アプリケーションの設定とゲームライブラリのデータは、デフォルトで含まれます。\r\n\r\nPlaynite は自動的に再起動し、バックアップ処理を開始します。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">データの自動バックアップ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">自動バックアップ間隔</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">バックアップフォルダ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">バックアップの循環</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">追加データを含める:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">自動バックアップが有効な場合は、バックアップフォルダを設定する必要があります。</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">パッチリリースの通知のみを表示</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">有効にすると、現在インストールされているメジャーリリースで利用可能な更新のみが更新通知されます。\r\n新しいメジャーリリースの更新は通知されません。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">過去 1 週間に相対日付を使用</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">日付が 1 週間以内の場合は、「今日」、「昨日」などの相対日付を使用します。\r\n    \r\n指定された日付書式は、その他すべての日付に使用されます。</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">ウェブ画像検索</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">アイコン画像の検索文字列</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">カバー画像の検索文字列</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">背景画像の検索文字列</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">アドオン情報を取得中…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">メタデータソースがありません</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">プレイアクション設定</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">スキャナ設定を使用する</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">起動時にプロファイルを選択</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">起動時にエミュレータを選択</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">自動</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">常にオン</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">常にオフ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">アクセシビリティ(スクリーンリーダー)のサポート</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">アプリケーションメニュー</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">ゲームメニュー</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">プログラムフォルダ</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">ユーザーデータディレクトリ</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">ライブラリファイルの破損が検出されました。Playnite はシャットダウンします。\r\n    \r\nPlaynite の Github ページで新しい issue を開き、ファイルの破損の修正をリクエストしてください。</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">変更した内容を保存しますか？</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">ポータブルインストール</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">コントローラーが検出されませんでした</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/ko_KR.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">한국어</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite 언어</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">종료</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">필터 적용 중</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">필터 비활성화됨</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">추가 필터</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">필터</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">필터</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">잘못된 데이터</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">변경 사항을 저장하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">홈페이지: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">GitHub에서 소스 코드 보기</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">진단 패키지 생성</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">시스템 정보 전송</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Playnite에 관하여</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Josef Němec이 개발함</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">카테고리 지정</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">카테고리 설정</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">카테고리 추가</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">체크됨 - 카테고리 지정\r\n체크되지 않음 - 카테고리 삭제\r\n다중 값 - 변경 사항 없음 (여러 게임 편집 시)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">카테고리 없음</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">플랫폼 없음</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">이런! 문제가 발생했어요…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">복구할 수 없는 오류가 발생했습니다.\r\n\r\n이 문제를 해결할 수 있도록 도움을 주시고 싶으시다면 오류가 발생하기 이전에 헀던 동작에 대해서 설명해주시고 분석 정보를 보내주세요. 온라인이면 패키지가 분석을 위해서 Playnite 서버로 보내집니다.\r\n\r\n또는 '충돌 보고' 버튼을 눌러서 GitHub에 직접 새로운 이슈를 만들어서 보고할 수도 있습니다.\r\n\r\n도움을 주셔서 감사합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">확장 프로그램 &quot;{0}&quot;에 의해 복구할 수 없는 오류가 발생했습니다.\r\n\r\n로그 파일을 저장한 다음 확장 개발자에게 이 문제를 보고하는 것을 권장합니다. 오류가 계속 발생한다면 확장을 비활성화해주세요.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">확장 프로그램 &quot;{0}&quot;에 의해 복구할 수 없는 오류가 발생했습니다.\r\n\r\n확장 개발자에게 이 문제를 보고하는 것을 권장합니다. 오류가 계속 발생한다면 확장을 비활성화해주세요.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">알 수 없는 확장 프로그램 또는 테마로 인해 복구할 수 없는 오류가 발생했습니다.\r\n\r\n서드파티 애드온을 비활성화하고 문제가 있는 애드온을 제거한 뒤 애드온 개발자에게 이 문제를 보고하는 것을 권장합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">복구할 수 없는 오류가 발생했습니다.\r\n\r\n이 이슈를 고칠 수 있도록 돕고 싶다면 분석 정보를 보내주세요. 감사합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">확장 프로그램 비활성화</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">로그 파일 저장</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">분석 정보 보내기</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">오류 보고</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Playnite 재시작</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">안전 모드로 재시작하기</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">모든 서드파티 확장 프로그램을 비활성화하고 기본 테마를 사용합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Playnite 나가기</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">충돌이 발생하기 전에 수행한 행동 (영어로 작성):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">라이브러리 관리자</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">게임을 제거 하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">제거 불가 - 게임 또는 설치 관리자가 실행 중입니다. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">제거 불가 - 게임이 실행되고 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">정말로 {0}을(를) 제거하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">정말로 게임 {0}개를 제거하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">정말 {0}을(를) 제거하시겠습니까?\r\n\r\n&quot;제외 목록에 추가&quot; 옵션을 선택하면 다음에 라이브러리가 업데이트될 때 게임을 다시 가져오지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">정말로 {0} 게임을 제거하시겠습니까?\r\n\r\n&quot;예외 목록에 추가&quot; 옵션을 선택하면 다음에 라이브러리가 업데이트되도 불러오지 않도록 할 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">정말로 현재 사용하지 않는 {0}개의 항목을 제거하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">사용하지 않는 필드를 찾을 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">녜 (예외 목록에 추가)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">저장하지 않은 변경사항이 있습니다</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">게임 라이브러리 형식 업데이트 중…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">데이터베이스 업데이트를 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">게임 라이브러리를 업데이트할 수 없습니다. {0} MB의 여유 공간이 필요합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">게임 에러</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">게임을 시작할 수 없습니다. '{0}'을 데이터베이스에서 찾을 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">게임을 시작할 수 없습니다: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">액션을 시작할 수 없습니다: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">게임 위치를 열 수 없습니다: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">설치 용량을 인식 실패: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">설치 용량 계산 오류</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">설치용량을 계산하는데 {0}개의 오류가 발생했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">바로가기를 생성하지 못했습니다: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">수동 열기 실패: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">게임을 설치할 수 없습니다: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">게임을 삭제할 수 없습니다: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">올바른 게임 시작 액션을 찾을 수 없습니다. 에뮬레이터 액션을 사용할 때는 게임과 에뮬레이터 구성 간의 플랫폼 정의가 일치하는지 확인하십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">설치 구현을 사용할 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">이 게임을 담당하는 라이브러리 플러그인이 비활성화되었거나 설치되지 않았습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">공식 메타데이터 다운로드를 사용할 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">선택한 게임이 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">게임 스크립트 실행에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">프로그램 스크립트 실행에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">전역 스크립트 실행에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">에뮬레이터 스크립트 실행에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">플레이 스크립트 액션 실행에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 또는 그 이후 버전이 설치되어 있지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">게임을 시작하는 방법을 결정하지 못했습니다.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">활성화</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">비활성화</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">제거</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">사용되지 않는 항목 제거</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">이름 바꾸기</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">복사</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">추가</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">기본 아이콘</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">기본 커버 이미지</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">기본 배경 이미지</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">완료</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">다음</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">이전</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">완료</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">이전</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">지우기</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">초기화</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">무시</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">모두 무시</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">가져오기</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">게임 이름</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">제작자</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">모듈</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">시리즈</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">버전</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">최근 플레이</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">가장 많이 플레이</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">플레이 횟수</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">설치 용량</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">폴더</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">메모</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">추가일</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">추가된 날짜</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">수정일</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">변경된 날짜</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">웹사이트</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">경로</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">확인</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">저장</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">닫기</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">취소</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">확인</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">재설정</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">예</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">아니오</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">환영합니다</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">로컬 사용자</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">일반</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">미디어</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">링크</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">설치</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">액션</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">다운로드 중…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">미디어 다운로드 중...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">로딩 중…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">유형</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">프로필</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">프로필</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">제거</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">다운로드</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">검색</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">해상도:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">모두</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">확대 및 축소</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">목록 보기</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">커버</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">바둑판식 보기</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">자세히 보기</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">사용자 지정</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">도움 주신 분들</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">라이센스</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">기여자</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Playnite 나가는 중…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">오늘</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">어제</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">월요일</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">화요일</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">수요일</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">목요일</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">금요일</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">토요일</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">일요일</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">지난 주</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">지난 달</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">지난 해</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">1년 이상</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 ~ 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB ~ 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB ~ 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB ~ 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB ~ 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB ~ 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB ~ 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB 이상</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">가져오기를 성공적으로 완료했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">모든 게임</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">게임 Id</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">데이터베이스 Id</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">프리셋</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">열</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">열</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">행</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">행</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">플레이 액션에서 아이콘을 가져올 수 없습니다. 액션에서 File type을 정의하지 않았습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">누락된 메타데이터만 다운로드</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">이 옵션을 활성화할 경우 이미 다운로드 받은 정보는 다운로드하지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">게임 선택</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">새 메타데이터로 업데이트할 게임을 선택하십시오:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">데이터베이스의 모든 게임</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">현재 필터된 모든 게임</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">선택한 게임만</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">공식 스토어</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">어떤 항목을 자동으로 채울지, 데이터를 얻기 위해 사용할 소스가 어디인지 선택하십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">위의 로고를 클릭하여 Playnite가 사용하는 igdb.com의 데이터 베이스 강화에 기여해주십시오.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">메타데이터 다운로드 중...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">설치된 게임 가져오는 중…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">{0} 개의 게임을 가져오는 중…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">{0}에서 에뮬레이터 게임을 가져오는 중...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">라이브러리 업데이트 중…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">라이브러리에 있는 게임의 용량을 계산하는 중...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">가져온 게임의 용량을 계산하는 중...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">라이브러리 업데이트 완료</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">리소스 해제 중...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">설정</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">설정…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">플랫폼 및 에뮬레이터</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">에뮬레이터 설정…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">라이브러리 관리…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">도구</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">메타데이터 다운로드...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">소프트웨어 도구…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">통합 구성…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">서드파티 클라이언트 열기</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">서드파티 클라이언트</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">게임 라이브러리 업데이트</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">라이브러리 업데이트 취소</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">에뮬레이터 폴더 업데이트</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">게임 추가</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">직접추가...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">자동으로 검색...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">에뮬레이터 게임...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store 응용프로그램</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Playnite에 관하여</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">피드백 보내기</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">전체 화면 모드로 전환</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">링크</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">도움말</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Patreon으로 후원하기</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Ko-fi로 후원하기</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">사용자 설명서</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK 개발 문서</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">시스템 재시작</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">시스템 종료</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">시스템 정지</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">시스템 최대 절전</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">시스템 잠금</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">사용자 로그아웃</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">무작위로 게임 고르기</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">상세보기에 표시할 게임 정보</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">간격</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">배경에 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">테두리 두께</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">게임 아이콘 없음</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">게임 이미지 없음</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">게임 배경 출처 없음</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">상세보기 세로 간격</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">바둑판식 방식에서 상세정보 위치</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">상세보기에서 게임 목록 위치</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">구분선 그리기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">커버 이미지 높이</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">게임 목록 아이콘 높이</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">글꼴</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">고정폭 글꼴</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">필터 패널 방식에서 상세정보 위치</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">탐색창 방식에서 상세정보 위치</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">커버 아트 렌더링</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">고정 비율 설정</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">다음 옵션은 전체 화면 모드의 타일 렌더링에도 영향을 미칩니다!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">늘이기 모드</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD 박스</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">에픽게임즈 스토어</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">정사각형</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam 베너</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam 수직 커버</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* 재시작이 필요한 설정 항목</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">설정</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">일반</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">상단 패널</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">보기 방식</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">게임 상세 정보</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">레이아웃</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">고급 설정</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">전체 화면</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">입력</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">성능</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">메타데이터</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">업데이트</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">검색</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">백업</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">라이브러리 데이터 백업</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">백업된 데이터 복원</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">라이브러리 변경 사항을 자동으로 가져오기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">올바르지 않은 데이터베이스 파일 위치입니다. 올바른 파일 위치로 설정되어야 합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">계정 이름은 비워둘 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">게임을 가져온 후 메타데이터 다운로드</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Playnite를 최소화된 상태로 시작</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">컴퓨터를 부팅했을 때 Playnite 실행</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">트레이로 숨김</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Playnite를 시작프로그램으로 등록하지 못했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">전체 화면 모드로 시작</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">비동기 이미지 로딩</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">이미지 로드 시간을 늦추는 대신 게임 목록의 스크롤이 더 부드러워집니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">커버 아트가 없을 경우 게임 이름 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">바둑판식 보기에서 게임 이름 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">설치하지 않은 게임 어둡게 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">자세히 보기 방식의 목록에서 게임 아이콘 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">그룹 설명에 항목 수 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">필터 및 탐색기 패널에 할당된 필드만 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">하드웨어 가속 비활성화</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">끊기는 현상이 발생하거나 비슷한 UI 문제가 발생할 때 사용하십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">빠른 실행 목록에서 숨겨진 게임 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">점프 목록과 알림 영역 목록이 영향을 받습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">빠른 실행 항목 갯수</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">게임 이미지를 배경으로 사용</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">배경 흐림</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">고품질</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">배경 어둡기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">바둑판식 보기에서 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">테마</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">테마 프로파일</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">전체 화면 테마</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">전체 화면 테마 프로파일</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">데이터베이스 위치</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">로그인 상태:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite 설정</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">웹 캐시 삭제</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">계정을 연동하는데 발생하는 문제를 해결할 수도 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">알림 영역에 아이콘 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">알림 영역으로 Playnite 최소화</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">프로그램 창을 닫았을 때 알림 영역으로 Playnite 최소화</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">게임 시작 시:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">게임 종료 시:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">플레이한 일수를 표시하기 위해 플레이 시간 형식 지정</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">날짜 표시 방법:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">연동된 모든 서비스를 로그아웃시킵니다. 응용 프로그램을 재시작해야합니다. 계속하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">캐시를 삭제하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">새로운 테마를 적용하기 위해선 Playnite를 재시작해야합니다</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">더 많은 테마</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">새로운 테마 생성</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">더 많은 확장 프로그램 받기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">새 확장 만들기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Playnite 번역을 도와주세요</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">새 설정을 적용하려면 Playnite를 재시작해야 합니다. 지금 재시작하시겠습니까?\r\n\r\n재시작하면 현재 진행 중인 작업 (다운로드)이 중지됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Playnite를 재시작하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite는 자동으로 라이브러리 파일을 이동할 수 없습니다. 위치를 변경하기 전에 반드시 직접 파일을 이동하거나 복사해야 합니다. 해당 경로에 라이브러리가 없다면 새로 생성됩니다.\r\n\r\n새 데이터베이스 위치는 Playnite가 재시작되기 전까지 사용되지 않습니다. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">&quot;닫기&quot; 액션이 설정되어있으면 플레이 시간이 기록되지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">행 수</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">열 수</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">자세히 보기 방식의 열 수</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">메인 화면에 배경 이미지 표시</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">메타데이터를 다시 다운로드하지 않으면 기존 게임에는 소급 적용되지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">플레이 시간 가져오기:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Playnite 데이터베이스의 게임에 대해 라이브러리 플러그인이 보고한 플레이 시간을 Playnite가 가져올 시점을 구성합니다. 이 기능을 사용하려면 게임 처리를 담당하는 라이브러리 플러그인의 지원이 필요합니다.\r\n\r\n항상: Playnite 새로 가져온 게임과 기존 게임의 플레이 시간을 가져옵니다.\r\n새로 가져온 게임에만: 새로 가져온 게임의 플레이 시간만 가져옵니다.\r\n안 함: 플레이 시간을 가져오지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">항상 가져오기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">새로운 게임을 가져올 때만</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">가져오지 않음</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">데스크탑 모드에서 컨트롤러 지원 활성화</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">가이드 버튼으로 전체 화면 모드 전환</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">새로 가져온 게임에 대한 자동 메타데이터 다운로드 설정입니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">대상 디스플레이</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">항상 주 디스플레이 사용</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">게임 이름 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">배터리 상태 보기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">배터리 잔량 % 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">시계 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">마우스 커서 숨기기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">빠른 필터 내 설치된 것만 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">버튼 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">레이아웃</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">수평 스크롤</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">하위 섹션 중 하나 선택</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">사용 가능한 설정이 없습니다</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">설정 불러오기 실패</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">이 스크립트는 라이브러리의 모든 게임에서 실행됩니다. 독립된 스크립트는 각각의 게임에 게임 자세한 정보 설정을 통해서 지정할 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">배경 이미지 애니메이션 전환</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">글꼴 크기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">자동</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">사용 안함</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">회색조</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">클리어타입</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">일반</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">디스플레이</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">텍스트 표시 모드</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">텍스트 안티 앨리어싱</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">텍스트 안티 앨리어싱 및 표시 모드 설정은 게임 설명에 적용되지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">배경화면 미리 불러오기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">이 옵션을 설정하면 Playnite는 메타데이터를 다운로드할 때 배경 아트워크를 다운로드하며, 더 많은 디스크 공간을 사용하며 오프라인에서 아트워크를 사용할 수 있습니다.\r\n\r\n해제할 경우 배경 아트워크는 처음에 필요할 때에만 다운로드되며, 더 적은 공간을 사용하지만 아트워크가 표시되기까지 시간이 걸리며 몇몇 이미지는 오프라인에서 사용할 수 없게 됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">게임을 나가면 자동으로 서드파티 클라이언트 닫기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">클라이언트 종료 지연 시간 (초)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">다음보다 게임 세션이 짧으면 닫지 않음 (초)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">다음 클라이언트 자동으로 닫기:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">자동으로 클라이언트 닫기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">예외 목록 불러오기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">너무 큰 게임 미디어를 지정할 때 경고 표시하기</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">경로 열기 명령어</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">선호하는 등급 분류 기구</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">라이브러리 업데이트 시 설치 용량 업데이트</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">마지막 계산 이후에 게임 파일의 변경이 감지된 경우 게임의 설치 용량를 계산하고 업데이트합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">적용 안함</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">채우기</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">원본 비율로 크기에 맞추기</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">원본 비율로 가장 크게 맞추기</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">왼쪽</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">오른쪽</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">상단</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">하단</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">가져오기 오류</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">인증이 필요함</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">인증 실패</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">대체 웹 페이지 렌더링 사용</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">통합 인증창 등 웹페이지 표시에 문제가 있는 경우에 사용합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">큰 설명 데이터 부분 로딩</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">설명 데이터가 크면 게임을 선택할 때 눈에 띄게 지연이 발생할 수 있습니다.\r\n\r\n이 옵션을 활성화하면 설명 내용의 일부만 처음에 불러오고 나머지는 필요할 때 불러올 수 있습니다.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">메타데이터 가져오기</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">메타데이터 다운로드</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">선택된 설정을 모든 메타데이터 다운로드에 적용합니다.\r\n설정에서도 수정할 수 있습니다.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">에뮬레이터 게임 가져오기 도구</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">이 마법사는 콘솔 에뮬레이터를 다운로드 및 불러오기를 하는 방법과 에뮬레이팅 게임을 불러오는 방법에 대해서 알려줍니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">추가적인 에뮬레이터나 게임을 언제든 메인 메뉴에서 추가할 수 있다는 것을 기억하십시오. (에뮬레이터 설정은 &quot;라이브러리&quot; 메뉴에서 가능하며 에뮬레이터 게임은 &quot;게임 추가&quot; 메뉴에서 가능합니다.)</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">다음은 Playnite가 자동으로 인식하고 구성할 수 있는 에뮬레이터 목록입니다. 웹사이트에서 설치 프로그램을 다운로드할 수 있습니다. 에뮬레이터를 수동으로 설치한 뒤 에뮬레이터 설정 창에서 에뮬레이터를 가져올 수 있습니다. </sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">'폴더에서 자동으로 감지…'버튼을 클릭하여 PC에 설치된 에뮬레이터를 가져올 수 있습니다. Playnite는 선택한 폴더에서 알려진 에뮬레이터를 검색하고 가져올 수 있는 옵션을 제공합니다. 이 버튼을 여러 번 사용하여 다른 폴더에서 에뮬레이터를 가져올 수 있습니다. 에뮬레이터는 현재 목록의 맨 아래에 추가됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">'에뮬레이터를 사용하여 폴더 스캔' 버튼을 클릭하여 게임을 가져올 수 있습니다. 적절한 에뮬레이터를 선택하면 어떤 파일 유형을 스캔하고 가져와야 하는지를 Playnite에 알려줍니다. 이 버튼을 여러 번 사용하여 다른 폴더에서 게임을 가져올 수 있습니다. 현재 목록의 맨 아래에 게임이 추가됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">불러오기 위한 에뮬레이터가 선택되지 않았습니다. 에뮬레이터 설정 없이 자동으로 에뮬레이터 게임을 불러올 수 없습니다. 불러오기 과정을 계속 진행하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Playnite에 에뮬레이터 설정이 없습니다. 에뮬레이터 설정과 파일 형식 없이 게임을 불러올 수 없습니다. 에뮬레이터를 추가하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">에뮬레이터를 사용하여 폴더 검색</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">파일 선택</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">폴더에서 자동 감지…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">에뮬레이터 설정…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">검색 중...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">{0} 검색 중...</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">처음 설정</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">이 프로세스는 외부 게임 라이브러리를 자동으로 가져오고 구성하는 과정을 안내합니다. Playnite는 Steam이나 GOG와 같은 여러 게임 서비스에서 자동으로 게임을 가져올 수 있다.\r\n\r\n나중에 메인 메뉴에서 플랫폼에 대한 사용자 지정 게임이나 에뮬레이션 게임을 수동으로 추가할 수도 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">라이브러리 통합</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">자동적으로 다음과 같은 서비스에서 게임을 불러옵니다. 게임에 변화 (설치 상태)가 Playnite의 초기 실행 또는 설정을 통하여 자동으로 업데이트됩니다. \r\n선택된 설정은 초기 불러오기 및 불러오기 절차에 반영됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">설정 완료</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">초기 설정이 완료되었습니다. 이후에도 '설정' 메뉴에서 모든 설정을 변경할 수 있습니다.\r\n\r\n또한 Playnite 로고 메뉴를 눌러서 이후에도 다른 게임을 추가할 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">하나 이상의 확장 프로그램을 다운로드하지 못했습니다.\r\n\r\n최초 실행 마법사가 완료된 후 애드온 메뉴에서 통합을 다시 다운로드할 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">{0} 통합 다운로드 중...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">권장 통합 목록 다운로드 중...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">권장 통합 목록을 다운로드하지 못했습니다. 나중에 애드온 메뉴를 통해 통합을 다시 다운로드할 수 있습니다.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">플랫폼 및 에뮬레이터 설정</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">에뮬레이터 설정</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">플랫폼</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">플랫폼</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">에뮬레이터</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">에뮬레이터</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">플랫폼 추가</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">아이콘 선택</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">커버 선택</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">이미지 선택</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">항목 선택</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">배경 선택</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">파일 선택</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">URL 선택</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">에뮬레이터 추가</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">지원되는 플랫폼</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">플랫폼 변화를 저장하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">에뮬레이터 변화를 저장하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">실행파일</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">실행 변수</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">작업 디렉터리</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">지원되는 파일 유형</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">에뮬레이터 불러오기...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">에뮬레이터 다운로드...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">에뮬레이터 프로파일에서 실행 변수 프리셋 불러오기</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">정말로 {0} 에뮬레이터를 제거하시겠습니까?\r\n현재 {1} 게임에서 사용되고 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">정말로 {0} 플랫폼을 제거하시겠습니까?\r\n현재 {1} 게임과 {2} 에뮬레이터에서 사용되고 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">설정 도움말</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">정렬 기준</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">정렬 순서</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">묶기 기준</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">오름차순</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">내림차순</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">묶지 않기</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">라이브러리 별로 묶기</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">카테고리로 묶기</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">플랫폼으로 묶기</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">유형 보기</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">보기</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">탐색창</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">필터 창</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">아이콘</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">라이브러리 아이콘</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">커버 이미지</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">배경 이미지</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">정렬 이름</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">라이브러리</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">매뉴얼</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">이름</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">설치 드라이브</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">계정이름</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">플랫폼</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">카테고리</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">장르</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">출시일</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">출시 년도</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">개발사</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">태그</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">배급사</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">설치 상태</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">모든 조건 일치</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">이 옵션을 설정하면 설정된 모든 필터 조건을 만족하는 게임만 표시합니다.\r\n해제하면 필터에서 설정된 필터 조건에 해당하는 모든 게임을 표시합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">설치됨</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">설치됨</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">설치되지 않음</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">숨겨짐</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">즐겨찾기</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">HDR 지원 활성화</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">활성화하면 게임을 시작하기 전에 기본 디스플레이에서 HDR이 활성화됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">기본 디스플레이에서는 HDR이 지원되지 않을 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">최근 플레이</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">카테고리</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">설명</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">설치 경로</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">커버 이미지</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">링크</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">이미지, ROM or ISO 경로</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">장르</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">장르</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">회사</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">회사</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">개발사</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">개발</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">배급사</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">배급</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">카테고리</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">카테고리</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">태그</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">태그</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">기능</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">기능</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">연령 등급</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">심의 등급</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">지역</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">지역</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">소스</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">소스</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">최근 활동</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">데이터베이스 오류</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">라이브러리 데이터 베이스 열기 실패</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">데이터베이스가 열리지 않았습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">라이브러리 데이터베이스에 접근 할 수 없습니다. &quot;{0}&quot; 파일이 다른 프로세서에 의하여 사용되고 있거나 접근할 수 없는 경로에 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">진단 패키지 생성 실패.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">진단 패키지 자동 업로드 실패.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">진단 정보가 성공적으로 보내졌습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">분석 패키지가 성공적으로 생성되었으며 성공적으로 제출되었습니다.\r\n다음 아이디를 이슈 리포트에 첨부해주세요:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">{0}(으)로부터 게임 불러오기 실패.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">{0}에서 게임을 가져오지 못했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">선택된 에뮬레이터 프로파일로 부터 게임을 찾을 수 없습니다. 프로파일이 파일 확장자나 플랫폼 정보를 포함 하고 있지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite 실행 실패. 실행 중인 프로그램을 모두 종료하고 다시 시도해 보십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">&quot;{0}&quot;, 색상 프로필 &quot;{1}&quot; 적용 실패\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">링크를 열 수 없습니다. URL이 올바른 포맷이 아닙니다.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">프로그램 실행 실패.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">웹 보기 구성 요소를 초기화하지 못했습니다. Playnite가 시작 프로세스를 진행할 수 없습니다.\r\n\r\n자세한 내용은 https://playnite.link/cefstartup을 참고하십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">정의 파일이 없거나 손상되어 에뮬레이터를 가져올 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">메뉴 작업을 실행하는 데에 실패했습니다.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">게임 상세정보 편집</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">이미지 URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">링크 추가</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">ROM 추가</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">변경 사항 저장</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">편집 중인 필드 변경사항을 적용합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">액션 추가</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">액션 제거</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">실행 액션 제거</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">게임 추가</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">폴더 검색...</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">설치된 프로그램 감지</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">찾아보기...</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Playnite 열기</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">프로필 설정</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">게임 이름은 공백일 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">게임 액션 추적 디렉터리는 비워 둘 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">메타 데이터를 찾기 전까지 게임 이름은 공백일 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">유효하지 않은 게임 데이터</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">http:// 또는 https://로 시작하는 웹 URL을 입력하십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">URL 선택</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">메타 데이터 다운로드 실패 : {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">다운로드 오류</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">필터 초기화</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">비공개 계정</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">공개 계정</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API 키</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">시작 오류</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">테마 오류</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">모두 초기화</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">설치 중</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">설치 제거 중</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">시작 중</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">실행 중</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">유효하지 않은 URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">아무것도 하지않음</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">최소화</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">창 복구</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">UI에서 실행할 때에만 창 복구</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">닫기</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">변경</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">고급 설정</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">안함</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">완료 상태</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">완료 상태</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">유저 점수</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">크리틱 점수</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">커뮤니티 점수</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">게임 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">프로그램 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">플러그인</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">메타데이터 출처</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">확장 프로그램</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">확장 프로그램 ID</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">스크립트를 다시 로드</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Interactive SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">모든 스크립트 다시 로드 성공.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">검색/필터 기준에 맞는 게임 없음</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">항목 없음</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">데스크톱 모드로 전환</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Playnite 나가기</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">라이브러리</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">모두 업데이트</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">작성자:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">버전:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">업데이트:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">모듈:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">라이브러리</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">통계</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">전체</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">없음</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">알림</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">폭</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">높이</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">크기</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">작게</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">보통</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">크게</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">더 크게</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">가장 크게</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">기본값</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">선택</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">모두 선택</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">모두 선택 해제</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">첫번째</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">무작위</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">유저 선택</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">더 보기</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">투명</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">접기</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">펼치기</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">모두 접기</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">모두 펼치기</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">기타</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">테마</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">에뮬레이터 실행 변수</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">내장 실행 변수</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">사용자 실행 변수</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">추가 에뮬레이터 실행 변수</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">에뮬레이터 실행 변수 덮어쓰기</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">플레이 액션</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">불러올 메타데이터 선택</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">불러올 게임 선택</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">메타데이터 검색</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">업데이트 사용 가능</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">마지막 업데이트 이후 변화</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">업데이트 다운로드 및 설치</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">업데이트 확인</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">업데이트 오류</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">새로운 버전 확인에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">새로운 버전을 찾지 못했습니다. 최신 버전입니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">업데이트 다운로드 및 설치 실패.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">백그라운드 작업이 진행중입니다. 작업을 중단하고 업데이트를 진행하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">백그라운드 작업이 진행중입니다. 작업을 중단하고 Playnite를 종료하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">백그라운드 작업이 진행중입니다. 모드를 전환하면 작업이 중단됩니다.\r\n전환하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Playnite 업데이트 사용 가능</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">테마 이미지 다시 불러오기</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">선택된 테마 적용</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">파일 변화 감시</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">감시 파일이 변경되었을 경우 자동으로 테마 적용</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">스크립트 런타임</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">게임 시작 전 실행할 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">게임 종료 전 실행할 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">게임 시작 후 실행할 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">프로그램 시작 시 실행할 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">프로그램 종료 시 실행할 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">게임 시작 전 실행 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">게임 시작 후 실행 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">게임 중단 후 실행 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">전역 스크립트 실행</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">모든 게임</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">필터링 된 게임</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">현재</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">신규</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">스크립트 테스트</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">선택된 항목만 표시합니다.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">기본값으로 저장</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">즐겨찾기에 추가</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">즐겨찾기에서 제거</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">이 게임 숨기기</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">숨김에서 제거</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">HDR 지원 활성화</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">HDR 지원 비활성화</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">편집...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">설치 용량 계산</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">설치 용량 계산 (모든 게임)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">설치 용량 계산 (누락된 데이터만)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">설치 용량</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">카테고리 설정...</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">완료 상태 설정</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">제거</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">플레이</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">설치</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">게임 옵션</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">자세히</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">설치 제거</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">설치 위치 열기</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">바탕화면 바로가기 생성</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">설명서 열기</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">더 보기</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">라이브러리 플러그인에 의해 관리됨</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">이 게임의 실행 과정이 라이브러리 플러그인에 의해 관리됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">지정된 페이지에서 '{0}' 게임에 대한 관련 정보를 찾을 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">팁: &quot;편집&quot; 메뉴 옵션을 통해 단일 게임을 편집하면 고급 메타데이터 다운로드 기능을 사용할 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">다른 절차가 진행중일 경우 사용할 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">설명은 html 구문에 민감합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">게임 시간은 초 단위로 기록됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">설치 용량은 바이트로 표시됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">출시 날짜는 '년-월-일' 형식으로 작성되어야 합니다. 월, 일은 생략할 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">0에서 100사이의 값 또는 점수가 없으면 빈칸.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Playnite 개발은 다음의 Patron과 Ko-fi 후원자들의 지원을 받습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">코드, 번역 및 기타 기여는 특별한 순서가 없습니다:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">게임 모니터링을 취소하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">설치 모니터링이 실행 중입니다. 중단하고 게임을 이전 상태로 되돌리시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">게임 실행 모니터링이 실행 중입니다. 중단하고 게임을 이전 상태로 되돌리시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">플레이 시간</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">최근 플레이</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}일 {1}시간 {2}분</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}시간 {1}분</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} 분</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} 초</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">플레이 하지 않음</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">데스크탑 모드 실행...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">전체화면 실행...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">게임 라이브러리 불러오는중...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">설치 용량 계산 중...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">{0}의 설치 용량 계산 중...</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">스크립트 파일 설치 실패.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">스크립트 설치 성공.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">스크립트 설치</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">스크립트 오류</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">확장기능 실행에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">메타데이터 폴더 열기</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">계산</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">ROM 또는 설치 디렉토리에서 설치 용량을 자동으로 계산합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} 클라이언트가 설치되지 않았습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} 클라이언트가 실행됩니다. 로그인후 이 메세지를 닫아주세요.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">로그인을 기다리고 있습니다. 로그인 후 이 창을 닫아주십시오...</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">게임 설치 폴더를 찾을 수 없음.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">잘못된 액션 설정.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">계정 연동 문제 가이드</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">문제 해결</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">항목 이름 재설정</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">새 항목 추가</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">이름 입력</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">새로운 이름 입력</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">1시간 미만</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1시간에서 10시간</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10시간에서 100시간</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100시간에서 500시간</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500시간에서 1000시간</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000시간 이상</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">설치를 완료하려면 Playnite를 재시작해야 합니다. 지금 재시작하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">올바른 확장 프로그램 패키지가 아닙니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">올바른 테마 패키지가 아닙니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">&quot;{0}&quot; 확장 프로그램을 제대로 불러오지 못했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">{0} 확장 프로그램을 로드할 수 없습니다. 현재 Playnite 버전에서 지원되지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">&quot;{0}&quot; 테마를 제대로 불러오지 못했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">{0} 테마를 로드할 수 없습니다. 현재 Playnite 버전에서 지원되지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">확장 프로그램을 제대로 불러오지 못했습니다.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">테마를 제대로 불러오지 못했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">테마 또는 확장 프로그램이 지원하지 않는 API 버전을 사용중입니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">설치 성공.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">애드온을 설치하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">일반</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">애드온 &quot;{0}&quot; 설치에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">확장 설치에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">새 확장 프로그램을 설치하시겠습니까?\r\n\r\n{0}\r\n게시자: {1}\r\n버전: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">&quot;{0}&quot; 확장 프로그램을 업데이트하시겠습니까?\r\n\r\n현재 버전: {1}\r\n새 버전: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">테마 설치에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">새 테마를 설치하시겠습니까?\r\n\r\n{0}\r\n게시자: {1}\r\n버전: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">&quot;{0}&quot; 테마를 업데이트하시겠습니까?\r\n\r\n현재 버전: {1}\r\n새 버전: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Playnite에서 나가서 기본 브라우저를 통해 해당 웹 페이지로 가려고 합니다. 계속하시겠습니까?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">선택한 이미지는 너무 크며 성능이 저하될 수 있습니다. 큰 이미지를 사용하는 것은 UI 반응에 나쁜 결과를 가져올 수 있으며 더 많은 메모리를 사용합니다.\r\n\r\n추천 최대 해상도:\r\n아이콘: {0} 메가 픽셀\r\n커버: {1} 메가 픽셀\r\n배경: {2} 메가 픽셀</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">퍼포먼스 주의</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">다시 표시 안함</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">파일 확장자 &quot;{0}&quot;은 지원되지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">지원되지 않는 확장자</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">선택한 이미지는 너무 크며 성능이 저하될 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">선택한 테마를 제거하시겠습니까? 다음에 프로그램을 실행할 때 제거됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">기본 탑재된 테마는 제거할 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">이 테마는 현재 버전의 Playnite를 지원하지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">선택한 확장 프로그램을 제거하시겠습니까? 프로그램이 다시 실행될 때 제거됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">기본 탑재된 확장 프로그램은 제거할 수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">이 확장 프로그램은 현재 버전의 Playnite를 지원하지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">설치 경로</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">데이터 경로</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">분석 패키지 생성 중…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">분석 패키지 업로드 중…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">파일 가져오기…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">이게 뭔가요?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">정말로 이 작업을 수행하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">총 플레이 시간</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">평균 플레이 시간</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">최고 플레이 시간</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">전체 설치 용량</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">개요</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">사이드바</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">사이드바에 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">설정 초기화</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">다음을 제외한 모든 애플리케이션 설정이 기본값으로 재설정됩니다.\r\n- 데이터베이스 위치\r\n- 가져오기 제외 목록\r\n- 라이브러리 통합을 포함한 확장 프로그램 설정\r\n\r\n작업을 완료하려면 프로그램을 다시 시작해야 합니다. 설정을 재설정하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">개발자용</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">외부 확장 프로그램</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">전체 경로를 입력하십시오.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">도전 과제</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">포럼</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">소식</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">상점 페이지</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">초기 설정이 완료되지 않았습니다. 최초 설치를 완료하기 위하여 Playnite가 데스크탑 모드로 재실행됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">최근 플레이</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">즐겨찾기</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">가장 많이 플레이</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">모두</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">필터 적용됨.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">적용된 추가 필터가 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">검색 결과:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">같은 이름이 이미 사용중입니다.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">현재 필터로 선택 제한</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">다른 게임 선택</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">애드온…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">설치된 확장 프로그램</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">확장 프로그램 설정</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">탐색</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">업데이트</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">업데이트 ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">설치된 확장 프로그램 및 테마 관리 및 설정 기능이 새 &quot;애드온&quot; 메뉴로 이동되었습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">현재 설치된 모든 라이브러리 통합 확장 프로그램을 여기서 구성할 수 있습니다.\r\n\r\n추가 통합을 설치하거나 제거하려면 메인 메뉴의 &quot;애드온&quot; 옵션을 사용하십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">데스크톱 테마</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">전체화면 테마</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">검색 중...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">애드온이 현재 버전의 Playnite와 호환되지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">애드온 설치 패키지 다운로드에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">애드온 설치 매니페스트 다운로드에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">변경사항을 적용하려면 프로그램을 재시작해야 합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">이 애드온은 설치될 예정입니다.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">설치</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">설치 제거</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">이미 설치 됨</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">새로운 업데이트가 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">애드온 업데이트</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">변경 이력 없음</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">설치 예약됨</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">다운로드 실패</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">라이선스 동의 거절</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">{0} 다운로드 중...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">업데이트된 애드온을 확인하는 중...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">하나 이상의 애드온 업데이트가 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">업데이트 할 항목 선택</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">개발용 확장 프로그램</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} 라이선스 동의</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">수락</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">거부</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">라이브러리 통합 플레이 액션 포함</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">동작 선택</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">트래킹 모드</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">트래킹 경로</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">초기 추적 지연</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">빈도 추적</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">링크</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">파일</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">에뮬레이터</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">기본값</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">프로세스</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">폴더</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">원본 프로세스</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">추적 메시지 로깅하기</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">다음 변경 사항은 현재 선택한 모든 게임의 데이터를 덮어씁니다!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">없음</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">원본 비율로 크기에 맞추기</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">항목만</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">처음과 마지막 만</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">스크롤 감도</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">부드러운 스크롤</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">애니메이션 속도</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">항목을 제거하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">정말로 이 항목을 삭제하시겠습니까?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">상단 패널에 표시할 버튼:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">일반 보기 설정</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">그룹 설정</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">정렬 설정</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">필터 프리셋</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">플러그인 아이템 정렬</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">섹션 간격</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">메인 메뉴 버튼을 사이드바로 이동</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">탐색 패널</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">무작위로 게임 고르기</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">보기에서 무작위로 선택</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">보기에서 무작위로 게임 선택</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">그룹 및 정렬 설정 저장</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">전체화면 모드에서 빠른 필터 보기</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">지난 7일</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">지난 31일</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">지난 365일</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">지난 365일보다 더 오래됨</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">설정</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">프리셋 저장</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">게임이 시작되면 최소화</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">게임이 시작되면 Playnite를 최소화합니다.\r\n\r\n이 설정을 끄면 게임이 시작될 때 입력이 되지 않는 문제가 발생할 수 있습니다!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">글꼴 크기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">작은 글꼴 크기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">게임 컨트롤러 지원</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">이 설정을 해제하면 Playnite는 게임 컨트롤러 입력을 처리하지 않습니다.\r\n        \r\n게임 컨트롤러 입력을 마우스/키보드 입력으로 변환하는 도구로 인해 Playnite에서 이중 입력이 발생할 경우 해제하십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">메인 메뉴 표시 항목:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">메인 보기에서 X/A버튼 바인딩 바꾸기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"> 메인 보기에서 게임 시작 또는 세부 정보 표시 버튼의 바인딩을 바꿉니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">확인/취소 버튼 바인딩 바꾸기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">A/B 버튼의 확인 취소 바인딩을 바꿉니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">주 컨트롤러만 사용</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">이 옵션을 설정하면 주 컨트롤러의 입력만 처리합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">가이드 버튼으로 Playnite 열기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">인터페이스 볼륨</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">배경음악 볼륨</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">프로그램이 활성화 되어있을 때만 재생</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">오디오 인터페이스 초기화에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">출력 API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">오디오 출력에 사용할 API. 소리 재생에 문제가 있는 경우 변경하십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">일반</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">비주얼</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">오디오</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">레이아웃</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">메뉴</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">입력</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} 시작 중...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} 실행 중...</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">대/소문자</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">공백</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">이미지 스케일링</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">균형</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">성능</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">품질</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">품질:\r\n최고 품질, 느림, 높은 메모리 사용.\r\n    \r\n성능:\r\n보통 품질, 빠름, 적은 메모리 사용.\r\n    \r\n균형:\r\n고품질, 보통, 적은 메모리 사용.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">파일 선택...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">폴더 선택...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">시작 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">애드온과 테마 모두 Playnite의 성능, 안정성 및 보안에 큰 영향을 미칠 수 있습니다.\r\n\r\n테마 또는 확장 프로그램을 설치한 후 일부 문제가 발생하기 시작하는 경우 먼저 해당 항목을 비활성화 또는 제거하여 문제를 유발하는지 여부를 확인하십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">시작 시 선택</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">시작 시 선택</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">내장 프로필</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">내장 프로필</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">사용자 프로필</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">사용자 프로필</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">내장 스크립트로 처리</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">에뮬레이터 사양</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">플랫폼 사양</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">지역 사양</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">에퓰레이터 시작 전 실행 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">에퓰레이터 시작 후 실행 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">에퓰레이터 종료 후 실행 스크립트</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">에퓰레이터 실행파일을 찾을수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">에뮬레이터 사양을 찾을수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">에뮬레이터 시작 스크립트를 찾을수 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">별도 게임으로 분리</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">하나의 게임으로 병합</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">플랫폼 설정</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">지역 설정</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">검색할 폴더</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">검색 설정</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">체크섬 검색에서 제외</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">지정된 패턴과 일치하는 파일은 체크섬을 확인하지 않고 파일 이름으로 일치합니다. 자세한 내용은 에뮬레이터 도움말 페이지를 참조하십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">검색할 에뮬레이터</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">새 구성을 저장할 때 이름을 설정해야 합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">에뮬레이터나 에뮬레이터 프로필이 설정되지 않았습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">검색할 디렉터리가 지정되지 않았거나 존재하지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">검색 구성이 올바르게 설정되지 않았습니다.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">자동 검색에 일괄 검색 포함</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">폴더에서 에뮬레이터를 검색하지 못했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">에뮬레이터 게임 폴더를 검색하지 못했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">이미 가져온 항목 숨김</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">불러올 프로필:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">자동 검색 설정</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">자동 검색 설정으로 저장</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">나중에 라이브러리 업데이트 중에 사용할 수 있도록 구성을 저장합니다. 저장된 구성은 &quot;에뮬레이터 설정&quot; 메뉴를 통해 관리할 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">상대경로로 가져오기</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">가능한 경우 Playnite의 설치 폴더 또는 에뮬레이터의 설치 폴더와 관련된 경로를 검색하여 게임 파일을 가져옵니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">하위 폴더 검색</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">압축파일 내 검색</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">관련 파일 병합</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">개별 게임 디스크 등의 관련 게임 파일을 하나의 게임 항목 아래에 병합합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">검색기 추가</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">저장된 검색기 추가</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">검색 시작</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">검색 설정을 추가하여 특정 폴더를 검색합니다. 게임을 가져오기 전에 에뮬레이터가 올바르게 구성되었는지 확인하십시오.(라이브러리 -&gt; 에뮬레이터 설정 메뉴)</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">게임을 처음 추가했을 때의 상태</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">게임을 최초로 플레이했을 때의 상태</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">PowerShell 스크립트 런타임을 초기화하지 못했습니다. 윈도우즈 7 사용자인 경우 PowerShell 5.1을 다시 설치하여 문제를 해결해 보십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">지정한 이름의 필터 프리셋이 이미 있습니다. 프리셋을 새 설정으로 업데이트하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">다음 단어를 자동으로 부여되는 정렬 이름의 앞부분에서 제외</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">정렬을 위해 문자열의 시작 부분에 있는 단어를 무시할 때 사용합니다. 기본값은 &quot;The&quot;, &quot;An&quot; 및 &quot;A&quot;입니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">정렬 이름이 없는 게임의 값 채우기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">정렬</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">정렬 이름 설정 중...</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">시스템에 Nahimic 서비스가 실행 중인 것으로 탐지되었습니다. 이 서비스는 Playnite(및 기타 앱)에 렌더링 문제를 일으키는 것으로 알려져 있습니다.\r\n\r\nPlaynite에서 그래픽 손상 또는 기타 렌더링 문제가 발생하는 경우 Nahimic 서비스를 사용하지 않도록 설정하거나 완전히 제거하는 것이 좋습니다.\r\n\r\n자세한 내용은 https://playnite.link/nahimicsucks를 참고하십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite가 관리자 권한으로 실행되고 있습니다.\r\n설치된 확장 프로그램과 게임/앱에 높은 권한을 부여하기 때문에 추천하지 않습니다.\r\n\r\n더 많은 정보를 얻고 싶다면 https://playnite.link/adminfaq 를 방문해주세요.</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Playnite가 상승된 권한으로 실행 중인 경우 경고 표시</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">게임의 용량을 계산할 때 실제 디스크 사용량을 가져옵니다.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">이 옵션을 설정하면 된 경우 느리지만 실제 드라이브에서 파일이 차지하는 용량을 가져올 수 있습니다.\r\n해제하면 파일의 크기만 빠르게 가져옵니다.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">다음 애드온(들)은 안정성 및 성능에 큰 영향을 주거나 보안 문제로 인해 잠재적으로 문제가 있는 것으로 보고되었습니다.\r\n다음을 제거하는 것을 권장합니다.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">검색 시 온라인 파일 제외</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">로컬에서 사용할 수 없는 경우 클라우드 저장소에 저장된 파일을 검색하고 가져오지 않습니다.\r\nGoogle Drive, DropBox, OneDrive에서만 지원됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">파일 내용을 확인하지 않는 간단한 스캔 방식 사용</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">파일을 가져오지만 파일 내용을 로컬로 다운로드하여 표시할 필요가 없는 정확도가 낮은 방법을 사용합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">모두 적용</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">설치 상태 재정의</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">설정하면 Playnite는 이 게임을 가져오는 통합 플러그인이 설정한 설치 상태(설치 디렉터리 포함)를 무시합니다.\r\n        \r\n이 옵션은 특정 게임 가져오기 방법을 사용하는 플러그인에서도 이 오버라이드 옵션을 고려하지 않으면 제대로 작동하지 않을 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">수동으로만</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">하루에 한 번</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">일주일에 한 번</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">시작할 때마다</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">프로그램 업데이트 확인</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">애드온 업데이트 확인</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">라이브러리 업데이트</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">에뮬레이터 폴더 검색</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">숨긴 게임 포함</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">정보 편집</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">모두 선택/해제</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">열기</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">활성화</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">적용</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">검색어를 입력하십시오... [F1] 도움말 보기</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">검색어 앞에 #을 붙이면 이용 가능한 명령어 목록을 표시합니다.\r\n검색어 앞에 /을 붙이면 이용 가능한 검색 공급자 및 플러그인 목록을 표시합니다.\r\nTyping search keyword and ending with SPACE switches immediately to that search.\r\n\r\nTAB: 동작 변경\r\nENTER: 선택한 동작 활성화\r\nSHIFT-ENTER: 선택한 항목 메뉴 열기</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">제거된 게임 포함</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">숨긴 게임 포함</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">제거된 게임 포함</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">제거된 게임 제외</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">숨긴 게임 포함됨</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">숨긴 게임 제외됨</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">플레이 또는 설치</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">자세히 보기</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">게임 메뉴</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">게임 편집</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">검색 열기</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">검색 상자</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">검색 버튼</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">기본 동작</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">보조 동작</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL+F를 눌렀을 때 검색 상자로 이동하는 대신 검색 열기</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">검색 세션간 게임 필터 저장</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">검색 공급자</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">기본 키워드</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">사용자 키워드</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">시스템 단축키</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite 검색</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">확장 프로그램 설정</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">제외 항목</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"> 폴더 검색에서 제외할 파일</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">폴더 검색에서 제외할 폴더</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">제외 목록에 파일 추가</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">제외 목록에 폴더 추가</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">제외 항목은 저장된 검색기 설정에만 추가할 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">제외 항목이 &quot;{0}&quot; 검색기에 추가되었습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">플랫폼 재정의</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">자동으로 인식한 플랫폼 값을 선택한 플랫폼으로 덮어씁니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">명령어를 기본 검색에 포함</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">이 옵션을 선택하지 않으면 # 접두어를 사용하지 않을 경우 명령어가 검색결과에 포함되지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">이름 필터에서 퍼지 매칭 사용</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">활성화하면 이름 필터가 글로벌 검색과 동일한 방식으로 게임 이름을 검색합니다.\r\n필터 앞에 ! 문자를 추가하여 대/소문자가 일치한 항목을 검색할 수 있습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">결과에 표시할 항목</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">숨김 상태</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">백업이 취소되었습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">데이터 백업에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">데이터 백업 오류</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">데이터 백업 중...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">데이터 복원 중...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">백업 데이터 복원에 실패했습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">설정</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">게임 라이브러리</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">게임 라이브러리 미디어</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">설치된 확장 프로그램</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">확장 프로그램 데이터</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">설치된 테마</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">복원할 백업 파일을 선택하십시오.\r\n\r\n백업 데이터 복원을 위해 Playnite가 자동으로 재시작됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">데이터 백업에 포함할 항목을 선택하십시오. 프로그램 설정 및 게임 라이브러리 데이터는 기본적으로 포함됩니다.\r\n\r\n백업 작업을 시작하기 위해 Playnite가 자동으로 다시 시작됩니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">데이터 자동 백업</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">자동 백업 주기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">백업 폴더</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">백업 세트 수</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">포함할 추가 데이터:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">자동 백업이 설정된 경우 백업 폴더를 지정해야 합니다.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">패치 릴리즈에 대한 알림만 표시</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">이 옵션을 설정하면 현재 설치된 Major 버전에 대한 업데이트에 대해서만 알람을 표시합니다.\r\n새로운 Major 버전이 릴리즈되면 알림이 발생하지 않습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">일주일 이내의 기간은 상대 시간 표시</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">일주일 이내의 기간에 대해서는 &quot;오늘&quot;, &quot;어제&quot; 등의 상대 시간으로 표시합니다.\r\nThe specified date format will be used for all other dates.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">웹 이미지 검색</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">아이콘 이미지 검색어</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">커버 이미지 검색어</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">배경 이미지 검색어</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">애드온 정보를 가져오는 중...</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">사용 가능한 메타데이터 출처가 없습니다.</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">플레이 액션 설정</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">검색기 설정 사용</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">시작 시 프로필 선택</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">시작 시 에뮬레이터 선택</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">자동</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">항상 켜기</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">항상 끄기</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">접근성(스크린 리더) 지원</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">프로그램 메뉴</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">게임 메뉴</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">프로그램 폴더</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">사용자 데이터 디렉터리</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">라이브러리 파일 손상이 감지되어 Playnite를 종료합니다.\r\n    \r\nPlaynite GitHub 페이지에서 손상된 파일을 수정해 달라는 이슈를 생성해 주십시오.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">변경 사항을 저장하시겠습니까?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">포터블 설치</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">컨트롤러가 감지되지 않음</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/locstatus.json",
    "content": "{\r\n  \"ar\": 98,\r\n  \"bg\": 98,\r\n  \"ca\": 98,\r\n  \"cs\": 100,\r\n  \"cy\": 0,\r\n  \"da\": 26,\r\n  \"de\": 100,\r\n  \"el\": 98,\r\n  \"es-ES\": 98,\r\n  \"et\": 98,\r\n  \"fa\": 100,\r\n  \"fi\": 68,\r\n  \"fr\": 100,\r\n  \"ga-IE\": 0,\r\n  \"gl\": 97,\r\n  \"he\": 99,\r\n  \"hr\": 47,\r\n  \"hu\": 100,\r\n  \"id\": 97,\r\n  \"it\": 100,\r\n  \"ja\": 100,\r\n  \"ko\": 97,\r\n  \"lt\": 53,\r\n  \"mr\": 56,\r\n  \"nl\": 99,\r\n  \"no\": 98,\r\n  \"pl\": 100,\r\n  \"pt-BR\": 100,\r\n  \"pt-PT\": 61,\r\n  \"ro\": 48,\r\n  \"ru\": 98,\r\n  \"sk\": 61,\r\n  \"sr\": 88,\r\n  \"sv-SE\": 76,\r\n  \"tr\": 100,\r\n  \"uk\": 100,\r\n  \"vi\": 100,\r\n  \"zh-CN\": 100,\r\n  \"zh-TW\": 98\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Localization/lt_LT.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Lietuvių</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite kalba</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Išeiti</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtras aktyvus</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtras išjungtas</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Papildomi filtrai</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtrai</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtras</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Neteisingi duomenys</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Išsaugoti pakeitimus?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Tinklapis: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Atvirąjį kodą rasite GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Sukurti diagnostinį paketą</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Siųsti sistemos informaciją</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Apie Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Kūrėjas: Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Priskirti kategorijai</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Nustatyti kategorijas</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Pridėti kategoriją</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Pažymėta - Priskirti kategoriją\r\nAtžymėžta - Pašalinti kategoriją\r\nNepažymėta - Jokių pakeitimų (Kai modifikuojami keli žaidimai)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Nenurodyta kategorija</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Nenurodyta platforma</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ooops!Taškas nutiko blogai...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Įvyko nepataisoma klaida.\r\n\r\nJei norite padėti išspręsti šią problemą, trumpai apibūdinkite, ką darėt prieš užlužima, tada atsiųskite diagnostikos informaciją. Jei esate prisijungę, paketas bus įkeltas į Playnite serverį analizei.\r\n\r\nArba galite spustelėti mygtuką „Pranešti apie gedimą“, kad sukurtumėte naują „GitHub“ problemą ir praneštumėte apie gedimą rankiniu būdu.\r\n\r\nAčiū už pagalbą.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Plėtinys &quot;{0}&quot; sukėlė nesuprantama klaida.\r\n\r\nMes rekomenduojame išsaugoti &quot;log&quot; failą ir pranešti problema plėtinio kurėjui.Jeigu klaida tesiasi, išjunkite plėtinį.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Plėtinys &quot;{0}&quot; sukėlė nesuprantama klaida.\r\n\r\nMes rekomenduojame pranešti problema plėtinio kurėjui.Jeigu klaida tesiasi, išjunkite plėtinį.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Nežinomas priedo ar tema sukėlė nepataisoma klaida.\r\n\r\nRekomenduojame išjungti trečiūjų šalių priedus, izoliuoti problematiška prieda ir pranešti gedimą  priedo kūrėjui ne mum</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Nesuprantama atsitiko klaida.\r\n\r\nJeigu norite padėti sutaisyti klaidą, atsiųskite diagnostine informaciną.Ačių.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Išjunkite plėtinį</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Išsaugoti &quot;log&quot; failą</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Siųsti diag. informaciją</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Pranešti apie problemą</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Iš naujo paleisti Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Perkrauti saugumo režime</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Išjunkite visas trečiujų šalių plėtinius ir naudoti numatytają tema.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Uždaryti Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Veiksmai padaryti prieš gedimą :</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Bibliotekos vedlys</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Pašalinti žaidimą(us)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Negalima ištrinti - Žaidimas arba instaliotojas yra paleistas.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Negalima ištrinti - žaidimas yra paleistas</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Ar tikrai norite pašalinti {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Ar jūs esate tikras ,kad norite ištrinti &quot;{0}&quot; šita žaidimą?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Ar tikrai norite pašalinti {0}?\r\n\r\nPasirinkus &quot;įtraukti į išimčių sąrašą&quot; žaidimas nebebus importuotas kito bibliotekos atnaujinimo metu.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Ar tikrai norite pašalinti {0} žaidimus?\r\n\r\nPasirinkus opciją &quot;pridėti į išimčių sąrašą&quot; programa neleis žaidimų automatiškai įtraukti kitą kartą atnaujinus biblioteką.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Ar tikrai norite pašalinti {0} įrašų, kurie šiuo metu nėra nenodojami ?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Nerasta nenaudojamų laukų.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Taip (įtraukti į išimčių sąrašą)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Šioje sekcijoje yra neįrašytų pakeitimų</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Atnaujinamas žaidimų bibliotekos formatas...</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Duombazės atnaujinimas nepavyko, nepavyko atidaryti duombazės failo.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Nepavyksta atnaujinti žaidimų bibliotekos. Reikia {0} MB papildomos vietos.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Žaidimo Klaida</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Nepavyko paleisti žaidimo. '{0}' nerastas duombazėje.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Nepavyko paleisti žaidimo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Nepavyko atlikti veiksmo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Nepavyko atidaryti failo vietos: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Nepavyko aptikti instaliuoto žaidimo dydį: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Instaliuoto dydžio skenavimo klaida</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Buvo {0} klaidos(-ą) instaliuoto dydžio skenavimo</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Nepavyko sukurti nuorodos: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Nepavyko atidaryti žaidimo vadovo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Nepavyko įrašyti žaidimo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Nepavyko ištrinti žaidimo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Nerasta tinkamų žaidimo paleidimo veiksmų. Kai naudojate emuliatoriaus, įsitikinkite, kad platformos atitinka žaidimo ir emuliatoriaus konfigūraciją.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Įdiegimo funkcija nėra prieinama.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Bibliotekos įskiepis valdantis šį žaidimą nėra įgalintas ar įdiegtas</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Oficialių metaduomenų atsisiuntimas nėra galimas.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Nepasirinktas joks žaidimas</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Žaidimo skripto vykdymas nepavyko.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Programos script paleidimo klaida.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Globalaus skripto vykdymas nepavyko.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Emuliatoriaus skripto vykdymas nepavyko.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Žaidimo veiksmo skripto vykdymas nepavyko.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">Neįdiegta PowerShell 3.0 ar naujesnė versija.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Nepavyko nustatyti kaip paleisti žaidimą.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Įgalinta</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Išjungta</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Pašalinti</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Pašalinti nenodojamus</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Pervadinti</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopijuoti</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Pridėti</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Numatytoji piktograma</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Numatytasis viršelio paveikslėlis</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Numatytasis fono paveikslėlis</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Baigti</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Toliau</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Atgal</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">BAIGTA</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">GRĮŽTI</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">IŠVALYTI</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Išvalyti</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Atmesti</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Atmesti visus</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Įtraukti</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Pavadinimas</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Kūrėjas</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modulis</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Serija</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versija</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Paskutinį kartą žaista</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Daugiausiai žaista</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Žaista kartų</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Įdiegtas dydis</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Aplankas</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Pastabos</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Pridėta</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Pridėjimo data</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Modifikuota</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Redagavimo data</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Tiklalapis</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Kelias iki žaidimo</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">Gerai</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Išsaugoti</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Uždaryti</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Atšaukti</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Patvirtinti</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Atstatyti</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Taip</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Ne</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Sveiki</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Vietinis vartotojas</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Bendra</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Medija</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Nuorodos</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Instaliavimas</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Veiksmai</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Siunčiama…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Siunčiama medija…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Kraunama...</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Typas</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profilis</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profiliai</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Pašalinti</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Atsisiųsti</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Paieška</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Raiška:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Betkoks</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Keisti dydį</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Sąrašo rodinys</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Viršeliai</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Tinklelio rodinys</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Išsamusis rodinys</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Pasirinktinis</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">Nuoroda</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Ypatinga padėka</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licenzija</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Prisidėję</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Playnite išjungiamas...</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Šiandien</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Vakar</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Pirmadienį</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Antradienį</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Trečiadienį</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Ketvirtadienį</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Penktadienį</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Šeštadienį</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Sekmadienį</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Praėjusią savaitę</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Pastarąjį mėnesį</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Pastaraisiais metais</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Seniau nei prieš metus</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">Nuo 0 iki 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">Nuo 100MB iki 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">Nuo 1GB iki 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">Nuo 5GB iki 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">Nuo 10GB iki 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">Nuo 20GB iki 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">Nuo 40GB iki 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB ir daugiau</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Importavimas sėkmingai baigtas.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Visi žaidimai</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Žaidimo Id</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Duombazės Id</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Ruošiniai</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Stulpelis</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Stulpeliai</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Eilutė</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Eilutės</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Nepavyko gauti žaidimo veiksmo ikonos. Nėra failo tipo priskirto veiksmui.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Atsiųsti tik trūkstamus metaduomenis</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Įjungus šita parinkima bus praleisti metadatos atsiuntimai, kuriuose jau yra informacijos.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Žaidimų pasirinkimas</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Pasirinkite, kuriuos žaidimus norite atnaujinnti su nauja metadata:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Visi žaidimai iš duombazės</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Visi išfiltruoti žaidimai</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Tik pasirinkti žaidimai</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Oficiali parduotuvė</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Pasirinkite laukus, kuriuos Playnite užpildys automatiškai, ir  šaltinį, iš kurio Playnite gaus informaciją.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Apsvarstykite galimybę spustelėti aukščiau esantį logo ir atnaujinti igdb.com databazę, kad patobulintumėte Playnite duomenis.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Siunčiami metaduomenys…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importuojami neįrašyti žaidimai</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importuojami {0} žaidimai...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importuoti emuliuotus žaidimus iš {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Siunčiami bibliotekos atnaujinimai...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Skenuojamas žaidimų dydis kurių yra bibliotekoje...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Skenuojamas importuotų žaidimų dydį...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Bibliotekos atnaujinimai baigti</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Atlaisvinami resursai...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Konfigūravimas</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Nustatymai…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platformos ir emuliatoriai</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Konfigūruoti emuliatorius…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Bibliotekos vedlys...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Įrankiai</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Atsisiųsti metaduomenis...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Programiniai įrankiai...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Konfigūruoti integracijas...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Atidaryti kitą klientą</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Kiti klientai</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Atnaujinti žaidimų biblioteką</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Atšaukti bibliotekos atnaujinimą</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Atnaujinti emuliuojamus aplankalus</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Pridėti žaidimą</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Rankiniu būdu…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Skenuoti automatiškai...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emuliuojamas žaidimas...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store aplikacija...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Apie Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Siųsti atsiliepimą</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Perjungti į viso ekrano rėžimą</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Nuorodos</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Pagalba</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Paremti &quot;Patreon&quot; platformoje</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Paremkite Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Vartotojo instrukcijos</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK Documentacija</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Perkrauti sistemą</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Išjungti sistemą</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Užmigdyti sistemą</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Sistemą užmigdyti įrašius</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Ūžrakto sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Atjungti vartotoja</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Pasirinkti atsitiktinį žaidimą</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Žaidimo laukai bus rodomi detalių  panelėje:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Atstumas tarp objektų.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Rodyti tinklelio daiktus fone</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Tinlelio daiktų kampo plotis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Nenurodytas žaidimo ikonos šaltinis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Nenurodytas žaidimo viršelio šaltinis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Nenurodytas žaidimo fono šaltinis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Vertikalus atsstumas tarp žaidimų detalių</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Papildomos informacijos pozicija tinklelio rėžimu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Detalus žaidimų pozicijų sarašas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Rodyti skirtuka tarp panelių</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Žaidimo viršelio paveikslėlio aukštis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Žaidimų sarašo ikonų aukštis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Programos šriftas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Lygiaplotis šriftas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Filtrų skydelio pozicija</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Naršymo skydelio pozicija</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Viršelio paveikslėlio atvaizdavimas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Pageidaujamas vaizdo santykis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Šie nustatymai taip pat turi įtakos plytelių atvaizdavimui pilno ekrano režimu!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Ištempto vaizdo rėžimas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Žaidimo dėžutė</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Kvadratinis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam baneris</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam vertikalus viršelis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Reikia paleisti iš nauja ,kad pradėtu veikt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Nustatymai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Bendri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Viršutinė panelė</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Išvaizda</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Informacija apie žaidimą</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Išdėstymas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Išplėstiniai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Viso ekrano rėžimas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Įvestis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Efektyvumas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metaduomenys</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Atnaujinama</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Paieška</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Atsarginė kopija</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Išsaugoti bibliotekos duomenis</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Atkurti atsarginę kopiją</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Įtraukti bibliotekos pakeitimus automatiškai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Neteisinga duombazės failo vieta, nurtodykite tikslų kelią iki failo.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Vartotojo vardas negali būti tuščias.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Atsisiųsti metaduomenis po žaidimų importavimo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Paleisti Playnite sumažintą</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Leisti Playnite įjungus kompiuterį</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Pradėti uždaryta į užduočių juosta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Nepavyko užregistruoti Playnite paleidimo paleidžiant kompiuterį.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Paleisti viso ekrano rėžime</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asinchroninis paveikslėlių krovimas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Pagreitina navigavimą žaidimų sąraše, bet sulėtina paveikslėlių krovimą.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\"> Rodyti žaidimo pavadinimą, kai nėra viršelio paveikslėlio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Rodyti žaidimo pavadinimą tinklelio rėžime</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Patamsinti neįdiegtus žaidimus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\"> Rodyti žaidimų piktogramas sąrašo rodinyje</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Rodyti objektų skaičių grupės aprašyme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Rodyti tik pasirinktus laukus filtre ir explorer panelėse</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Išjungti aparatinės įrangos spartinimą</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Naudoti, kai pastebimas strigimas vartotojo sąsajoje.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Rodyti paslėptus žaidimus greito paleidimo sarašus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Įtakos dešinio pelės sąrašui ir užduočių juostos programėłės meniu sąrašams.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Greito paleidimo daiktų skaičius</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Naudoti žaidimą kaip lango fona</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Sulieti foną</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Aukšta Kokybė</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Užtamsinti foną</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Rodyti tinklelio rodinyje</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Temos profilis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Viso ekrano rėžimo tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Viso ekrano rėžimo temos profilis </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Duomenų bazės vieta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Prisijungimo būsena:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite nustatymai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Išvalyti talpyklą</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Gali padėti išspręsti problemas, atsiradusias bandant susieti paskyras.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Rodyti sistemos dėklo piktogramą</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Sutraukti Playnite į sistemos dėklą</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Sutraukti Playnite į sistemos dėklą kai programos langas yra uždarytas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Kai žaidimas paleidžiamas:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Kai žaidimas uždaromas:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Rodyti žaidimo laiką dienomis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Datos formatas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Šis veiksmas atjungs Jus nuo visų paskyrų. Reikalingas programos paleidimas iš naujo, ar norite tęsti?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Išvalyti Talpyklą?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Pritaikius naują temą Playnite reikės paleisti iš naujo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Gauti daugiau temų</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Sukurti naują temą</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Gauti daugiau plėtinių</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Sukurti naują plėtinį</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Padėk mums išversti Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Norint pritaikyti naujus nustatymus, Playnite reikia paleisti iš naujo. Paleisti iš naujo dabar?\r\n\r\nPaleidus iš naujo bus atšauktos visos šiuo metu vykdomos aktyvios užduotys (atsiuntimai).</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Paleisti Playnite iš naujo?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite negali automatiškai perkelti bibliotekos failų. Prieš keisdami vietą, turite rankiniu būdu perkelti / nukopijuoti failus. Jei tiksliname aplanke vietoje nėra bibliotekos, bus sukurta nauja.\r\n\r\nNauja duomenų bazės vieta nebus naudojama, kol „Playnite“ nebus paleista iš naujo.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\"> Žaidimo laikas nebus išsaugotas jei pasirinksite komandą &quot;Uždaryti&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Eilučių skaičius</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Stulpelių skaičius</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Detalaus rodinio eilučių skaičius</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Rodyti fono paveikslėlį pagrindiniame lange</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Playnite kaip foną naudos turimas žaidimo nuotraukas, o ne paveikslėlius gautus iš duombazės.\r\nNetaikoma žaidimams, kurie jau yra bibliotekoje.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importuoti žaidimo laika iš bibliotekos:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Konfigūruojamas, kada Playnite turėtų importuoti žaidimo laiką, kurį praneša žaidimų bibliotekos priedai Playnite duomenų bazėje. Norint naudotis šia funkcija, reikalingas bibliotekos papildinių, atsakingų už žaidimo (-ų) tvarkymą, palaikymas.\r\n\r\nVisada: importuoja naujų importuotų ir esamų žaidimų žaidimo laiką Playnite duomenų bazėje.\r\nTik naujai importuotiems žaidimams: importuojamas tik naujų importuotų žaidimų žaidimo laikas.\r\nNiekada: neimportuoja žaidimo laiko jokiomis aplinkybėmis.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Visada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Tik neseniai importuotiem žaidimam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Niekada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Įgalinti žaidimų pultelio palaikymą darbalaukio rėžime</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Kažkoks mygukas atidaro pilno ekrano režima atroda kažkas pamiršo angliškai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Automatinis Metadatos atsiuntimų nustatymai naujai  importotiem žaidimam.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Naudojamas ekranas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Visada naudoti pagrindinį ekraną</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Rodyti Žaidimų Pavadinimus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Rodyti akumuliatoriaus būseną</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Rodyti akumuliatoriaus įkrovimą procentais</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Rodyti laikrodį</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Slėpti pelės rodiklį</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Instaliuota tik greituose filtruose</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Pulto mygtuko stilius</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Išdėstymas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Gulsčiasis slinkimas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Parinkite vieną iš subkategorijų</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Nėra pasiekiamų nustatymų</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Nepavyko užkrauti nustatymus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Šie script vykdomi kiekvienam bibliotekoje esančiam žaidimui. Redaguojant žaidimo informaciją, kiekvienam žaidimui galima priskirti atskirus script.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animuotas fono paveikslėlio perėjimas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Šrifto dydžiai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automatinis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">teksto Aliasing</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Pilki tonai</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Idealus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Ekranas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Teksto formatavimo būdas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Teksto atvaizdavimo būdas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Šiuo metu žaidimų aprašymams teksto atvaizdavimo ir formatavimo metodai nenaudojami.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Iš anksto rodyti fono paveikslėlį</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Jei įjungta, „Playnite“ atsisiųs fono meno kūrinius, kol atsisiųs metaduomenis, naudos daugiau vietos diske ir padarys meno kūrinius pasiekiamus neprisijungus.\r\n\r\nJei išjungta, fono meno kūriniai atsisiunčiami tik tada, kai reikia pirmą kartą, naudojant mažiau vietos, tačiau gali užtrukti, kol meno kūriniai bus rodomi, o kai kurie vaizdai gali būti nepasiekiami neprisijungus.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Automatiškai išjungti trečiūjų šalių paleidiklį kai žaidimas išsijungs</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Kliento uždarymo atidėjimas (sekundėmis)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Neuždarykite lango po žaidimo sesijos per mažiau negu (sekundėmis)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Automatiškai uždaryti šiuos klientus:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Automatiškai uždaryti klientus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importuoti išimčių sąrašą</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Rodyti pranešimą kada žaidimų biblioteka per didelė</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Aplanko atidarymo komanda</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Numatyta amžiaus vertinimo organizacija</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Atnaujinimo dydis po bibliotekos atnaujinimo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Skenuoja ir atnaujina instaliuotų žaidimų dydį jei bus aptikta ,kad failai buvo modifuokoti po praeito skenavimo</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Nieko</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Užpildyti</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Suvienodinti</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Suvienodinti ir užpildyti</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Kairėje</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Dešinėje</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Viršuje</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Apačioje</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Įtraukimo klaida</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Reikalinga autentifikacija</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Autentifikuoti nepavyko</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Alternativus webview rendering režimas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Naudoti kada  vyksta  problemos su webviews, pavizdžiui authentikacijos dialogo integracija.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Dalinis krovimas ilgiems žaidimų aprašymams</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Ilgi aprašymai gali pastebimai striginti programa kada pasirenkami žaidimai.\r\n\r\nKada įjungta, užkraus tik dalį teksto ,o vėliau užkraus kitus kada reikalinga.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Metadata įtraukimas</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Atsisiųsti metadatą</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Nustatyti kurią konfiguracija naudoti naujiem metadata atisiuntimams.\r\nGali būti pakeista nustatymose</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Emuliacijos importavimo vedlys</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Šis langas parodys kaip atsiūsti ir importuoti konsolių emuliatorius ir importuoti emuliuotus žaidimus.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Nepamirškite, kad papildomus emuliatorius ir / ar žadimus galite įtraukti pagrindiniame meniu (pasirinkus &quot;Įrankiai&quot; norint įtraukti emuliatorių ir &quot;Pridėti žaidimą&quot; norint pridėti emuliuojamą žaidimą).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Nėra pasirinkta emuliatorių įtraukimui. Negalėsite automatiškai įtraukti emuliuojamų žaidimų kol nesukonfiguruotas emuliatorius. Ar tikrai nori tęsti ir nutraukti emuliatoriaus įtraukimo procedūrą?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Ieškoti aplanke naudojant emulatorių</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Pasirinkti failus</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Automatiškai Surasti Aplanke...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Konfigūruoti emuliatorius…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Ieškoma…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Pirminė konfigūracija</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Bibliotekos integracija</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Konfigūravimas baigtas</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Konfigūruoti platformas ir emulatorius</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Nustatyti emuliatorius</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platformos</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emuliatoriai</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emuliatorius</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Pridėti platformą</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Pasirinkti piktogramą</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Pasirinkti viršelį</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Pasirinkite Paveikslėlį</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Pasirinkti elementą</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Pasirinkite foną</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Pasirinkti failą</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Pasirinkti URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Pridėti emuliatorių</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Palaikomos platformos</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Ar norite išsaugoti platformos pakeitimus?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Ar norite išsaugoti emuliatoriaus pakeitimus?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Programinis failas</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumentai</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Pasirinkta direktorija</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Palaikomi failų formatai</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Įtraukti emuliatorius...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Atsisiųsti Emuliatorius...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Paleisti argumentus, kurie pateikti emuliatoriaus profilyje</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Pagalba</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Rūšiuoti pagal:</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Grupuoti pagal</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Kylantys</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Besileidžiantys</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Negrupuoti</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Grupuoti pagal šaltinį</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Grupuoti pagal kategoriją</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Grupuoti pagal platformą</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Rodinio tipas</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Peržiūra</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Naršymo skydelis</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Filtrų skydelis</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Piktograma</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Viršelis</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Fono paveikslėlis</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Rūšiavimo vardas</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Šaltinis</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Žaidimo vadovas</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Pavadinimas</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Vartotojo vardas</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platforma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategorija(os)</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Žanras(ai)</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Išleidimo data</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Išleidimo metai</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Kūrėjas(ai)</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Žymė(s)</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Leidėjas(ai)</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Diegimo būsena</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Įrašytas</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Įdiegtas</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Neįdiegta</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Paslėptas</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Mėgstamas</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Paskutinį kartą žaista</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategorija</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Aprašymas</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Žaidimo direktorija</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Viršelio paveikslėlis</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Nuorodos</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Atvaizdo/ISO kelias</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Žanras</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Žanrai</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Įmonė</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Kompanijos</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Kūrėjas</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Kūrėjai</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Leidėjas</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Leidėjai</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategorija</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategorijos</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Žymė</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Žymės</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Ypatybė</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Ypatybės</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Amžiaus reitingas</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Amžiaus reitingai</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Regionas</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regionai</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Šaltinis</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Šaltiniai</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\"></sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Duombazės klaida</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Nepavyko atidaryti bibliotekos duombazės.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Duombazė neatidaryta.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Nepavyko pasiekti bibliotekos duombazės. Failas &quot;{0}&quot; yra nepasiekiamas arba jį naudoja kitas procesas.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Nepavyko sukurti diagnostinio paketo.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Nepavyko automatiškai patalpinti diagnostikos paketo.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Diagnostinė informacija buvo sėkmingai išsiųsta.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Diagnostinis paketas sukurtas ir perduotas sėkmingai.\r\nPrašome įtraukti nurodytą ID į klaidos pranešimą:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Importuoti žaidimus iš {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Nepavyko surasti žaidimų pasirinktam emuliatoriaus profiliui.Nenurodytas failo tipas arba platforma.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Nepavyko pritaikyti temos &quot;{0}&quot;, spalvų profilio &quot;{1}&quot;\r\n        \r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Nepavyko atidaryti nuorodos, netinkamas URL formatas.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Nepavyko paleisti aplikacijos.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Keisti žaidimo informaciją</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Paveikslėlio URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Pridėti nuorodą</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Išsaugoti pakeitimus</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Pridėti veiksmą</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Pašalinti veiksmą</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Pašalinti žaidimo veiksmą</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Pridėti žaidimus</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Ieškoti aplanke…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Aptikti įrašytus</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Naršyti…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Atidaryti Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Profilio nustatymai</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Žaidimo pavadinimas negali būti tuščias.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Žaidimo pavadinimas negali būti tuščias kai ieškoma metadata.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Neteisinga žaidimo informacija</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Įveskite teisingą URL, kuris prasideda http:// arba https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Pasirinkti URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Nepavyko atsisiųsti metadata: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Atsiuntimo klaida</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Išvalyti filtrus</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Privatus vartotojas</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Viešas vartotojas</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API raktas</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Paleisties klaida</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Temos klaida</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Išvalyti viską</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Vyksta diegimas</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Išdiegti</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Paleidžiama</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Veikia fone</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Neteisingas URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Nieko nedaryti</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Sumažinti</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Atkurti programos langą</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Uždaryti</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Pakeisti</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Išplėsti</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Niekada</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Užbaigimo būsena</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Vartotojo įvertinimas</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Kritikų įvertinimas</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Žaidėjų įvertinimas</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Skriptai</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Įskiepiai</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Metaduomenų šaltiniai</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Plėtiniai</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Plėtinio ID</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Iš naujo paleisti skriptus</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Visi skriptai paleisti iš naujo sėkmingai.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Nepavyko rasti žaidimų pagal paieškos/filtro kriterijus</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Nerasta elementų</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Perjungti į darbalaukio rėžimą</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Uždaryti Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Bibliotekos</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Naujinti viską</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Sukurta:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versija:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Atnaujinta:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modulis:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Biblioteka</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistika</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Visi</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Nieko</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Pranešimai</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Plotis</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Aukštis</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Dydis</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Mažas</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normalus</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Didelis</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Didesnis</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Didžiausias</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Numatytas</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Pasirinkti</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Pasirinkti viską</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Panaikinti visus pasirinkimus</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Pirmas</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Atsitiktinis</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Įkelti daugiau</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Permatomas</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Sutraukti</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Išskleisti</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Sutraukti Visus</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Išskleisti Visus</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Kita</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Apipavidalinimas</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Emuliatoriaus argumentai</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Papildomi emuliatoriaus argumentai</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Teikti pirmenybę papildomiems emuliatoriaus argumentams</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Žaidimo veiksmas</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Pasirinkti žaidimus įtraukimui</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Metadata paieška</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Galimas atnaujinimas</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Pasikeitimai nuo paskutinio atnaujinimo</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Įrašyti atnaujinimą</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Tikrinti, ar yra atnaujinimų</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Atnaujinimo klaida</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Nepavyko patikrinti ar yra naujinimų.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Nerasta atnaujinimų, naudojate naujausią versiją.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Nepavyko atsiųsti ir įdiegti atnaujinimo.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Yra pasiekiamas Playnite atnaujinimas</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Atnaujinti temų sąrašą</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Pritaikyti pasirinktą temą</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Ieškoti failų pakeitimų</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Automatiškai atnaujinti temą kai pasikeičia šaltinio failai</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\"></sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Paleisti po žaidimo išjungimo</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Paleisti po žaidimo paleidimo</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Žaidimo paleidimo skriptas</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Žaidimo paleido skriptą</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Žaidimas sustabdė skriptą</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Paleisti globalų skriptą</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Globalus</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtruotas</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Dabartinis</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Naujas</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Išbandyti skriptą</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Rodyti tik pasirinktus elementus.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Išsaugoti kaip numatytąjį</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Pridėti prie mėgstamų</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Pašalinti iš mėgstamų</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Slėpti šį žaidimą</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Pašalinti iš paslėptų</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Keisti…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Apskaičiuoti įdiegties dydį</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Apskaičiuoti įdiegties dydį (visiems žaidimams)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Apskaičiuoti įdiegties dydį (tik ten, kur nėra)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Įdiegties dydis</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Nustatyti kategoriją…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Nustatyti žaidimo būseną</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Pašalinti</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Žaisti</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Įrašyti</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Žaidimo Parinktys</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Išsamiau</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Ištrinti</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Atidaryti žaidimo direktoriją</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Sukurti darbalaukio nuorodą</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Atidaryti žaidimo vadovą</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Daugiau</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Valdomas bibliotekos įskiepių</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Žaidimo paleidimo procesą valdys bibliotekos įskiepis atsakingas už šį žaidimą.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Patarimas: Detalesnis metadata atsisiuntimo valdymas pavieniui žaidimui galimas pasirinkus punktą &quot;Keisti&quot; .</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Negalimas, kai vyksta veiksmas fone.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Aprašymo tekstas yra jautrus HTML sintaksei</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Įdiegties dydis nurodytas baitais.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Vertė nuo 0 iki 100 arba tuščią kai nėra rezultato.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Playnite kūrimą remia šie Patron ir Ko-fi nariai:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Prie kodo, lokalizacijos ir kito tobulinimo prisidėjo:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Stabdyti žaidimo stebėjimą?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Šiuo metu stebimas žaidimo įrašymo procesas. Ar norite tai nutraukti ir gražinti žadimą į ankstesnę būseną?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Šiuo metu stebimas žaidimo paleidimas. Ar norite tai nutraukti šį procesą ir gražinti žadimą į ankstesnę būseną?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\"> Iš viso žaista</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Paskutinį kartą žaista</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0} d. {1} val. {2} min.</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}val. {1}min</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minučių</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} sekundes</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Nežaista</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Atidaryti darbalaukio rėžime…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Atidaromas viso ekrano rėžimas…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Kraunama žaidimų biblioteka…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Skaičiuojamas įdiegties dydis...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Skaičiuojamas {0} įdiegties dydis...</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Nepavyko įdiegti skripto failo.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Skriptas įdiegtas sėkmingai.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Įdiegti skriptą</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Skripto klaida</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Nepavyko įvykdyti įskiepio funkcijos.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Atidaryti metaduomenų aplanką</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Apskaičiuoti</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Automatiškai apskaičiuoja įdiegties dydį pasinaudodamas ROM'ais, jei žaidimas tokių turi, arba įdiegties aplanku, jei toks nustatytas</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} klientas yra neįdiegtas.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Bus atidarytas {0} klientas. Prašome prisijungti ir uždaryti šį langą.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Nerasta įdiegto žaidimo katalogas.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Neteisingai nustatytas žaidimo veiksmas.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Spręsti vartotojo sinchronizacijos problemas</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Pervadinti objektą</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Pridėti objektą</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Įveskite pavadinimą</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Įvesti naują pavadinimą</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Mažiau nei valandą</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">Nuo 1 iki 10 valandų</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">Nuo 10 iki 100 valandų</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">Nuo 100 iki 500 valandų</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">Nuo 500 iki 1000 valandų</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Plėtinio &quot;{0}&quot; nepavyko tinkamai įkelti.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Nepavyko įkelti plėtinio &quot;{0}&quot;, dabartinė Playnite versija nepalaikoma.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Temos &quot;{0}&quot; nepavyko tinkamai įkelti.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Nepavyko įkelti temos &quot;{0}&quot;, dabartinė Playnite versija nepalaikoma.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Plėtinio nepavyko tinkamai įkelti.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Temos nepavyko tinkamai įkelti.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Tema/Plėtinys naudoja nepalaikomą API versiją.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\"> Įdiegta sėkmingai.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Įdiegti plėtinį?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Bendriniai</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Nepavyko įdiegti &quot;{0}&quot; plėtinio.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Nepavyko įdiekti plėtinių.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Nepavyko įdiegti temos.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Daugiau neberodyti</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Failai su plėtiniu {0} yra nesuderinami.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Nesuderinas failo plėtinys.</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Žaidimo aplankas</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Duomenų aplankas</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Generuojamas diagnostinis paketas</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Įkeliamas diagnostinis paketas...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Importuoti failą...</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Kas tai?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Ar tikrai norite atlikti šį veiksmą? </sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Bendras žaidimo laikas\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Vidutinis žaidimo laikas</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Apžvalga</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Šoninė juosta</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Rodyti šoninėje juostoje</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Atstatyti nustatymus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Kūrėjams</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Pasiekimai</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forumas</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Naujienos</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Parduotuvės tinklalapis</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Neseniai žaista</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Mėgstamiausi</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Daugiausiai žaista</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Visi</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Yra taikomi filtrai.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Yra taikomi papildomi filtrai.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Paieškos rezultatai pagal:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Pasirinkti kitą</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Plėtiniai...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Įdiegta</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Plėtinių nustatymai</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Naršyti</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Atnaujinimai</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Atnaujinimai ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Ieškoma...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Plėtinys nesuderinamas su šia Playnite versija.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Nepavyko atsiųsti plėtinio diegimo paketo.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Nepavyko atsiųsti plėtinio diegimo manifesto failo.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Įdiegti</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Išdiegti</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Jau įdiegta</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Nerasta jokių plėtinio atnaujinimų.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Atnaujinti plėtinius</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Atsisiuntimas nepavyko</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Licencija atmesta</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Atsiunčiama {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Ieškoma plėtinių atnaujinimų…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Rasta vieno arba daugiau plėtinių atnaujinimų.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} licencijos sutartis</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Suvienodinti</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Per paskutines 7 dienas</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Per paskutinę 31 dieną</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Per paskutines 365 dienas</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Daugiau nei prieš 365 dienas</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Konfigūruoti</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Išsaugoti ruošinį</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Šrifto dydis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Šrifto dydis Mažas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Išvesties API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Bendri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Išvaizda</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Garsas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Išdėstymas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Meniu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Įvestis</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} paleidžiamas...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Didžiosios raidės</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternatyvus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Subalansuotas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Kokybiškas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Pasirinkite failą...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Pasirinkite aplanką...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Praleidimo skriptas</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Pasirinkti paleidžiant</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpen\"></sys:String>\r\n    <sys:String x:Key=\"LOCActivate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAssign\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Redaguoti žaidimą</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Atidaryti paiešką</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Paieškos laukas</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Paieškos mygtukas</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Išimtys</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Nustatymai</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/mr_IN.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">मराठी</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">प्लेनाइटची भाषा</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">बाहेर पडा</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">गाळणी सक्षम</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">गाळणी अक्षम</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">अधिक गाळण्या</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">गाळण्या</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">गाळणी</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">अवैध डेटा</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">बदल सेव्ह करावे?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">मुखपृष्ठ: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">GitHub येथे सोर्स कोड पाहा</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">निदानी पाकीट निर्माण करा</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">निदानी माहिती पाठवा</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">प्लेनाइटविषयी माहिती</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">निर्माता: योसेफ नेमेक</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">वर्ग नेमा</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">वर्ग सेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">वर्ग जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">वर्ग नाही</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">प्लॅटफॉर्म नाही</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">अरेरे! काहीतरी गडबड झाली आहे...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">एक्स्टेंशन अक्षम करा</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">लॉग फाइल सेव्ह करा</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">निदान माहिती पाठवा</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">क्रॅशचा अहवाल द्या</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">प्लेनाइट रीस्टार्ट करा</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">सेफ मोडमध्ये रीस्टार्ट करा</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">सर्व बाह्य एक्स्टेंशन अक्षम करून डीफॉल्ट थीम वापरत आहे.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">प्लेनाइटहून बाहेर पडा</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">क्रॅश व्हायच्या आधी आपण केलेल्या क्रिया (इंग्रजीत):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">लायब्ररी व्यवस्थापक</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">गेम काढावे?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">काढता आले नाही - गेम किंवा इन्स्टॉलर चालू आहे. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">अनइन्स्टॉल करता आले नाही - गेम चालू आहे.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">{0} नक्की काढून टाकायचे आहे का?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">तुम्हाला नक्की {0} गेम काढून टाकायचे आहेत का?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">{0} नक्की काढून टाकायचे आहे का?\r\n\r\n&quot;वगळायच्या यादीत जोडा&quot; हा पर्याय निवडल्याने पुढच्या अपडेटच्या वेळी दिलेला गेम पुन्हा आयात केला जाणार नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">{0} गेम नक्की काढून टाकायचे आहेत का?\r\n\r\n&quot;वगळायच्या यादीत जोडा&quot; हा पर्याय निवडल्याने पुढच्या अपडेटच्या वेळी दिलेले गेम पुन्हा आयात केला जाणार नाहीत.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">न वापरलेले असे कोणतेही रकाने सापडले नाहीत.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">होय (वगळायच्या यादीत जोडा)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">या भागात सेव्ह न केलेले बदल आहेत</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">गेम लायब्ररी स्वरूप अपडेट करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">डेटाबेस अपडेट अपयशी झाले.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">गेम लायब्ररी अपडेट करता आली नाही. {0} एम.बी.पूर्ती मोकळी जागा आवश्यक आहे.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">गेममध्ये त्रुटी</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">गेम सुरू करता आला नाही. '{0}' डेटाबेसमध्ये सापडला नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">गेम सुरू करता आला नाही: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">क्रिया सुरू करता आला नाही: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">गेम स्थान उघडता आले नाही: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">गेमच्या स्थापनेचा आकार शोधून काढता आला नाही: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">स्थापना आकार स्कॅन त्रुटी</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">स्थापना आकार स्कॅन करताना {0} त्रुट्या आढळल्या</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">शॉर्टकट बनवण्यात अपयशी: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">मॅन्युअल उघडण्यात अयशस्वी: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">गेम स्थापित करता आला नाही: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">गेम विस्थापित करता आला नाही: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">या गेमसाठी जबाबदार असणारा लायब्ररी प्लगइन एक तर निष्क्रिय आहे नाही तर स्थापित केला नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">कोणताही गेम निवडलेला नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">गेमची स्क्रिप्ट कार्यवाही अयशस्वी झाली.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">अ‍ॅप्लिकेशनची स्क्रिप्ट कार्यवाही अयशस्वी झाली.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">जागतिक स्क्रिप्ट कार्यवाही अयशस्वी झाली.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">एम्युलेटरची स्क्रिप्ट कार्यवाही अयशस्वी झाली.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">खेळायची स्क्रिप्ट क्रिया कार्यवाही अयशस्वी झाली.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 किंवा त्याची नवीन आवृत्ती स्थापित नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">गेम सुरू कसा करायचा हे निश्चित करता आले नाही.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">सक्षम</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">अक्षम</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">काढून टाका</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">न वापरलेले काढून टाका</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">नाव बदला</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">कॉपी करा</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">डीफॉल्ट आयकन</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">डीफॉल्ट कव्हर प्रतिमा</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">डीफॉल्ट पार्श्वभूमी प्रतिमा</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">समाप्त करा</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">पुढचे</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">मागचे</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">झाले</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">मागे</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">साफ करा</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">साफ करा</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">डिसमिस करा</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">सर्व डिसमिस करा</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">आयात करा</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">नाव</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">निर्माता</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">मॉड्यूल</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">श्रेणी</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">आवृत्ती</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">याआधी खेळलेले</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">सर्वात जास्त खेळलेले</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">खेळल्याची मोजणी</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">स्थापनेचा आकार</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">फोल्डर</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">टिप</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">जोडले</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">जोडण्याची तारीख</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">बदलले</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">बदलण्याची तारीख</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">संकेतस्थळ</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">स्थान</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">ओके</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">सेव्ह करा</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">बंद करा</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">रद्द करा</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">निश्चित करा</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">रिसेट</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">होय</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">नाही</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">सुस्वागतम</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">स्थानिक प्रयोक्ता</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">साधारण</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">माध्यमे</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">दुवा</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">स्थापना</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">क्रिया</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">डाउनलोड करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">माध्यमे डाउनलोड करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">लोड करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">प्रकार</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">प्रोफाइल</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">प्रोफाइल</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">काढून टाका</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">डाउनलोड करा</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">शोध घ्या</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">रेझल्युशन:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">कोणतेही</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">झूम</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">यादी दृश्य</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">कव्हर</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">ग्रिड दृश्य</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">तपशील दृश्य</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">सानुकूल</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">यू.आर.एल.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">विशेष आभार</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">परवाना</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">योगदानकर्ते</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">प्लेनाइटहून बाहेर पडत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">आज</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">काल</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">सोमवार</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">मंगळवार</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">बुधवार</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">गुरुवार</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">शुक्रवार</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">शनिवार</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">रविवार</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">मागील आठवडा</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">मागील महिना</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">मागील वर्ष</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">एक वर्षापूर्वी</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">० ते १०० एम.बी.</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">१०० एम.बी. ते १ जी.बी.</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">१ ते ५ जी.बी.</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">५ ते १० जी.बी.</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">१० ते २० जी.बी.</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">२० ते ४० जी.बी.</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">४० ते १०० जी.बी.</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">१०० जी.बी. किंवा जास्त</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">यशस्वीरित्या आयात प्रक्रिया पूर्ण झाली.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">सर्व गेम</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">गेम आय.डी.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">डेटाबेस आय.डी.</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">प्रीसेट</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">स्तंभ</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">स्तंभ</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">ओळ</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">ओळी</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">&quot;खेळा&quot; क्रियेने आयकन मिळवता आला नाही. &quot;फाइल&quot; प्रकारची कोणतीही क्रिया उपस्थित नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">केवळ नसलेला मेटाडेटा डाउनलोड करा</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">हा पर्याय सक्षम केल्याने ज्या डेटा रकान्यांमध्ये आधीच माहिती आङे, त्यांसाठी मेटाडेटा डाउनलोड केला जाणार नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">गेम निवड</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">नवीन मेटाडेटाने कोणते गेम अपडेट करायचे आहेत हे निवडा:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">डेटाबेसमधील सर्व गेम</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">या वेळी गाळलेले सर्व गेम</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">केवळ निवडलेले गेम</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">अधिकृत दुकान</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">प्लेनाइटने कोणते रकाने आपोआप भरले पाहिजेत व कोणत्या स्रोतांपासून डेटा मिळवली पाहिजे हे निवडा.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">वरील लोगोवर क्लिक करून igdb.com च्या डेटाबेसला अपडेट करायचा विचार करा. प्लेनाइट जो डेटा वापरतो तो या योगदानाने सुधारेल.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">मेटाडेटा डाउनलोड करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">इनस्टॉल केलेले गेम आयात करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">{0} गेम आयात करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">एम्युलेट केलेले गेम {0} पासून आयात करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">लायब्ररी अपडेट डाउनलोड करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">लायब्ररीतील गेम्सचा आकार स्कॅन करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">आयात केलेल्या गेम्सचा आकार स्कॅन करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">लायब्ररी अपडेट पूर्ण झाले</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">संसाधन सोडून देत आहे…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">कॉन्फिगरेशन</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">सेटिंग्झ…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">प्लॅटफॉर्म आणि एम्युलेटर</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">एम्युलेटर कॉन्फिगर करा…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">लायब्ररी व्यवस्थापक…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">साधने</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">मेटाडेटा डाउनलोड करा…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">सॉफ्टवेअर साधने…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">एकत्रिकरण कॉन्फिगर करा…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">थर्ड पार्टी क्लायंट उघडा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">थर्ड पार्टी क्लायंट</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">गेम लायब्ररी अपडेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">लायब्ररी अपडेट रद्द करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">एम्युलेट केलेले फोल्डर अपडेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">गेम जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">हाताने…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">आपोआप स्कॅन करा…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">एम्युलेट केलेला गेम…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">मायक्रोसॉफ्ट स्टोअर अ‍ॅप्लिकेशन…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">प्लेनाइटविषयी माहिती</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">फीडबॅक पाठवा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">फुलस्क्रीन मोड सुरू करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">दुवा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">मदत</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">पेट्रीऑनवर समर्थन करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Ko-fi वर समर्थन करा</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">प्रयोक्ता माहितीपुस्तिका</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">एसडीके दस्तऐवज</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">सिस्टम रीस्टार्ट करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">सिस्टम बंद करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">सिस्टम विलंबित करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">सिस्टम हायबरनेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">सिस्टम लॉक करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">प्रयोक्त्याला लॉगआउट करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">यादृच्छिकरित्या गेम निवडा</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">तपशील पॅनलवर दाखवले जाणारे गेमचे रकाने:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">वस्तू अंतरण</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">ग्रिड वस्तू पार्श्वभूमी दर्शवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">ग्रिड वस्तू सीमेची रुंदी</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">गेम आयकन स्रोत अनुपस्थित</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">गेम कव्हर स्रोत अनुपस्थित</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">गेम पार्श्वभूमी स्रोत अनुपस्थित</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">ग्रिड दृश्यात तपशील स्थान</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">तपशील दृश्यात गेम यादी स्थान</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">पॅनलांच्या मध्ये विभाजक लावा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">गेम कव्हर चित्राची उंची</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">गेम यादी आयकनची उंची</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">अ‍ॅप्लिकेशन फाँट</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">मोनोस्पेस्ड फाँट</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">गाळणी पॅनलचे स्थान</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">एक्सप्लोरर पॅनलचे स्थान</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">कव्हर प्रतिमा रेंडरिंग</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">प्रसर गुणोत्तर निशाण</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">खालील पर्यायांचा फुलस्क्रीन मोडमधील टाइल रेंडरिंगला देखील परिणाम पडेल!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">खेचा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">डी.व्ही.डी. बॉक्स</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">एपिक गेम्स स्टोअर</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">चौकोन</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">स्टीम बॅनर</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">स्टीम उभे कव्हर</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">ट्विच</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* लागू करण्यास रीस्टार्ट करणे आवश्यक</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">सेटिंग्झ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">साधारण</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">सर्वात वरचा पॅनल</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">देखावा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">गेमचे तपशील</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">लेआऊट</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">आधुनिक</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">फुलस्क्रीन</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">इनपुट</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">परफॉर्मन्स</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">मेटाडेटा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">अपडेट करत आहे</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">शोध घ्या</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">बॅकअप</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">लायब्ररी डेटा बॅकअप करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">डेटा बॅकअप पुनःस्थापित करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">लायब्ररीत बदल आपोआप आयात करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">अवैध डेटाबेस फाईल स्थान. योग्य फाईल मार्ग सेट केला पाहिजे.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">खात्याचे नाव रिकामे नसू शकत.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">गेम आयात केल्यावर मेटाडेटा डाउनलोड करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">प्लेनाईट मिनिमाइझ करून सुरू करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">प्लेनाईट कम्प्यूटर सुरू केल्याबरोबर सुरू करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">सुरू करताना बंद करून ट्रेमध्ये ठेवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">कम्प्यूटर सुरू केल्याबरोबर प्लेनाईट सुरू करणे याची नोंद करण्यात अपयशी</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">फुलस्क्रीन मोडमध्ये सुरू करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">असंकालिकपणे प्रतिमा लोड करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">गेम याद्यांमध्ये स्क्रोलिंग सुधारून सुरळीत होऊ शकते, पण चित्र लोड व्हायचा वेळ कमी होऊ शकेल</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">कव्हर प्रतिमा गहाळ असल्यास गेमचे नाव दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">ग्रि़ड दृश्यात गेमचे नाव दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">स्थापित न केलेले गेम अंधारा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">तपशील दृश्य यादीत गेम आयकन दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">गटाच्या वर्णनांवर वस्तूंची मोजणी दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">गाळणी आणि एक्सप्लोरर पॅनलांवर केवळ नेमलेले रकाने दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">हार्डवेअर अ‍ॅक्सलरेशन अक्षम करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">स्टटरिंग किंवा त्यासारख्या यूआय समस्या अनुभवल्यास याचा वापर करावा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">जलद सुरूवात यादींत लपवलेले गेम दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">जम्प यादी आणि ट्रे मेन्यू यादी यांवर परिणाम होईल.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">जलद सुरूवात वस्तूंची संख्या</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">गेम पार्श्वभूमी प्रतिमा ही विंडो पार्श्वभूमी म्हणून वापरा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">पार्श्वभूमी अस्पष्ट करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">उच्च गुणवत्तेने</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">पार्श्वभूमी अंधारा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">ग्रिड दृश्यात दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">थीम</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">थीम प्रोफाइल</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">फुलस्क्रीन थीम</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">फुलस्क्रीन थीम प्रोफाइल</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">डेटाबेस स्थान</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">लॉगइन स्थिती:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">प्लेनाईट सेटिंग्झ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">वेब कॅश साफ करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">खाते लिंक करताना आढळलेल्या समस्या सुटल्या जाऊ शकतात.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">सिस्टम ट्रे आयकन दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">प्लेनाईटला मिनिमाइझ करून सिस्टम ट्रेमध्ये ठेवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">अ‍ॅप्लिकेशन विंडो बंद केल्यावर प्लेनाईटला मिनिमाइझ करून सिस्टम ट्रेमध्ये ठेवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">गेम सुरू झाल्यावर:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">गेम बंद झाल्यावर:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">दिनांक स्वरूप: </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">याने आपण सर्व जोडलेल्या सुविधांपासून लॉग-आउट व्हाल. अ‍ॅप्लिकेशन रीस्टारट करावं लागेल. पुढे जायचे का?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">कॅश साफ करायचे का?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">नवीन थीम लागू करायला प्लेनाईट रीस्टार्ट करावे लागणार आहे</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">अधिक थीम मिळवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">नवीन थीम बनवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">अधिक एक्स्टेंशन मिळवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">नवीन एक्स्टेंशन बनवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">प्लेनाईटचा अनुवाद करण्यात आमची मदत करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">नवीन सेटिंग्झ लागू करण्यासाठी प्लेनाईट रीस्टार्ट करावे लागेल. आता रीस्टार्ट करावे का?\r\n\r\nरीस्टार्ट केल्याने या वेळी चालू असलेल्या क्रिया (डाउनलोड) रद्द केल्या जातील.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">प्लेनाइट रीस्टार्ट करायचे का?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">प्लेनाईट आपल्या लायब्ररीच्या फायली आपोआप हलवू शकत नाही. स्थान बदलण्या अगोदर आपण फायली स्वहस्ते मूव्ह/कॉपी केल्या पाहिजेत. निशाण स्थानावर लायब्ररी नसल्यास नवीन लायब्ररी निर्माण केली जाईल.\r\n\r\nप्लेनाईट रीस्टार्ट करेपर्यंत हे नवीन डेटाबेस स्थान वापरले जाणार नाही. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">&quot;बंद करा&quot; हा पर्याय सेट असला तर खेळायची कालावधी रेकॉर्ड केली जाणार नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">ओळींची संख्या</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">स्थंभांची संख्या</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">तपशील दृश्यात दिसणार्‍या ओळींची संख्या</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">मुख्य स्क्रीनवर पार्श्वभूमी प्रतिमा दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">लायब्ररीतील गेम खेळलेल्याची कालावधी आयात करा:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">नेहमीच</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">फक्त अलीकडे आयात केलेल्या गेम्ससाठी</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">कधीच नाही</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">डेस्कटॉम मोडमध्ये कंट्रोलर समर्थन सक्षम करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">गाइड बटण दाबून फुलस्क्रीन मोड उघडतो</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">निशाण डिस्प्ले</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">नेहमीच प्राथमिक डिस्प्ले वापरा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">गेम शिर्षक दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">बॅटरी स्थिती दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">बॅटरी टक्‍केवारी दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">घड्याळ दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">माउस करसर लपवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">जलद गाळण्यांमध्ये केवळ स्थापित गेम दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">बटण चिन्ह</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">लेआऊट</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">आडवे स्क्रोलिंग</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">एक उपभाग निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">कोणतेही सेटिंग्झ उपलब्ध नाही</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">सेटिंग्झ लोड करण्यात अपयशी</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">फाँट आकार</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">आपोआप</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">एलिअस केलेले</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">ग्रेस्केल</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">क्लियरटाइप</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">नमुनेदार</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">डिस्प्ले</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">मजकूर फॉरमॅट मोड</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">मजकूर रेंडर मोड</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">मजकूर रेंडर आणि फॉरमॅट पद्धती यावेळी गेम वर्णनांसाठी वापरल्या जात नाहीत.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">पार्श्वभूमी प्रतिमा प्रीलोड करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">गेम बंद झाल्यानंतर बाह्य क्लाएंट आपोआप बंद करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">खालील क्लाएंट आपोआप बंद करा: </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">क्लायंट आपोआप बंद करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">वगळायची यादी आयात करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">फोल्डर उघडण्याचा आदेश</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">लायब्ररी अपडेट झाल्यावर गेम्सच्या स्थापनांचे आकार अपडेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">कोणतेही नाही</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">भरा</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">एकसमान</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">भरण्यास एकसमान</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">डाविकडे</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">उजवीकडे</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">वर</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">खाली</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">आयात करण्यात त्रुटी</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">प्रमाणीकरणाची गरज आहे</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">प्रमाणीकरण अयशस्वी झाली</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">वैकल्पिक वेब दृश्य रेन्डर करण्याचा मोड</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\"></sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">मेटाडेटा आयात करणे</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">मेटाडेटा डाउनलोड करणे</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">एम्युलेशन आयात विझर्ड</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">एम्युलेटर वापरून फोल्डर स्कॅन करा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">फायली निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">फोल्डरमधून आपोआप शोधून काढा…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">एम्युलेटर कॉन्फिगर करा…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">स्कॅन करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">{0} स्कॅन करत आहे…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">पहिल्या वेळीचे कॉन्फिगरेशन</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">लायब्ररी एकत्रीकरण</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">कॉन्फिगरेशन पूर्ण झाले</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">{0} एकत्रीकरण डाउनलोड करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">सुचवलेले एकत्रीकरणाची यादी डाउनलोड करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">सुचवलेल्या एकत्रीकरणाची यादी डाउनलोड करताना अयशस्वी झाले. काही वेळा नंतर अ‍ॅडऑन मेन्यूमधून एकत्रीकरण पुन्हा डाउनलोड करायचा आपण प्रयत्न करू शकता.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">प्लॅटफॉर्म आणि एम्युलेटर कॉन्फिगर करा</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">एम्युलेटर कॉन्फिगर करा</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">प्लॅटफॉर्म</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">प्लॅटफॉर्म</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">एम्युलेटर</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">एम्युलेटर</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">प्लॅटफॉर्म जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">आयकन निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">कव्हर निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">प्रतिमा निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">वस्तू निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">पार्श्वभूमी निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">फाईल निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">यू.आर.एल. निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">एम्युलेटर जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">समर्थित प्लॅटफॉर्म</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">प्लॅटफॉर्म बदल सेव्ह करायचे का?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">एम्युलेटर बदल सेव्ह करायचे का?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">एग्झेक्युटेबल</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">आर्ग्युमेंट</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">वापरातील डिरेक्टरी</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">समर्थित फाईल प्रकार</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">एम्युलेटर आयात करा…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">एम्युलेटर डाउनलोड करा…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">तुम्हाला {0} हा एम्युलेटर नक्की काढून टाकायचा आहे का?\r\nसध्या {1} गेम किंवा गेम्स त्याच्या वापर करत आहेत.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">तुम्हाला {0} हा प्लॅटफॉर्म नक्की काढून टाकायचा आहे का?\r\nसध्या {1} गेम्स व {2} एम्युलेटर त्याच्या वापर करत आहेत.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">सेटिंग मदत</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">क्रमवारी</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">क्रमवारी दिशा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">याने गट बनवा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">चढत्या क्रमात</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">उतरत्या क्रमात</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">गट बनवू नका</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">लायब्ररीप्रमाणे गट बनवा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">वर्गाप्रमाणे गट बनवा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">प्लॅटफॉर्मप्रमाणे गट बनवा</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">दृश्याचा प्रकार</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">दृश्य</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">एक्सप्लोरर पॅनल</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">गाळणी पट्टी</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">आयकन</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">लायब्ररी आयकन</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">कव्हर प्रतिमा</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">पार्श्वभूमी प्रतिमा</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">क्रमातील नाव</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">लायब्ररी</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">माहितीपुस्तिका</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">नाव</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">स्थापनेची ड्राइव्ह</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">अकाउंटचे नाव</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">प्लॅटफॉर्म</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">वर्ग</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">शैली</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">रिलीझ तारीख</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">रिलीझ वर्ष</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">विकासक</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">खूणचिट्ठी</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">प्रकाशक</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">स्थापना स्थिती</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">सर्व गाळण्या जुळल्या पाहिजेत</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">स्थापित</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">स्थापित</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">विस्थापित</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">लपवलेला</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">आवडीचा</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">एचडीआर समर्थन सक्षम करा</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">याआधी खेळलेले</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">वर्ग</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">वर्णन</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">स्थापना फोल्डर</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">कव्हर प्रतिमा</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">दुवा</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">इमेज, रॉम किंवा आयएसओचा मार्ग</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">शैली</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">शैल्या</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">कंपनी</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">कंपन्या</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">विकासक</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">विकासक</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">प्रकाशक</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">प्रकाशक</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">वर्ग</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">वर्ग</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">खूणचिट्ठी</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">खूणचिट्ठ्या</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">फीचर</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">फीचर</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">वयाचे रेटिंग</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">वयाचे रेटिंग</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">प्रदेश</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">प्रदेश</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">स्रोत</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">स्रोत</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">अलीकडील उपक्रम</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">डेटाबेस त्रुटी</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">लायब्ररी डेटाबेस उघडण्यात अपयशी.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">डेटाबेस उघडले नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">लायब्ररी डेटाबेस उघडता आला नाही. &quot;{0}&quot; ही फाईल एक तर दुसर्‍या प्रॉसेसमध्ये वापरात आहे, नाही तर ती एका न उघडता येणार्‍या स्थानी आहे.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">{0} पासून गेम आयात करण्यात अपयशी.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">{0} पासून एम्युलेट केलेले गेम आयात करण्यात अपयशी.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">&quot;{0}&quot; ही थाम व &quot;{1}&quot; ही रंग प्रोफाइल लागू करण्यात अपयशी\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">लिंक उघडता आली नाही, यू.आर.एल. वैध स्वरूपात नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">अ‍ॅप्लिकेशन सुरू करण्यात अपयशी.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">गेमचे तपशील संपादित करा</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">प्रतिमा यू.आर.एल.</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">दुवा जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">रॉम जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">बदल सेव्ह करा</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">कृती जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">काढून टाका</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">गेम जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">फोल्डर स्कॅन करा…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">स्थापित असलेले शोधून काढा</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">चाळा…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">प्लेनाइट उघडा</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">प्रोफाइल सेटिंग</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">गेमचे नाव रिकामे ठेवले जाऊ शकत नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">मेटेाडेटाचा शोध घेण्याअगोदर गेमचे नाव रिकामे असू शकत नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">अवैध गेम डेटा</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">http:// किंवा https:// यांनी सुरू होणारे वैध वेब यूआरएल प्रविष्ट करा</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">यू.आर.एल. निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">मेटाडेटा डाउनलोड करण्यात अयशस्वी: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">डाउनलोड त्रुटी</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">गाळण्या पुसून टाका</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">खाजगी खाते</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">सार्वजनिक खाते</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API की</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">सुरू करताना त्रुटी</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">थीम त्रुटी</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">सर्व पुसून टाका</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">स्थापित करत आहे</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">विस्थापित करत आहे</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">सुरू करत आहे</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">चालू आहे</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">अवैध यू.आर.एल.</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">काहीही करू नका</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">मिनिमाइझ करा</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">विंडो रिस्टोर करा</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\">बंद करा</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">बदला</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">प्रगत</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">कधीच नाही</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">पूर्ण केल्याची स्थिती</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">पूर्ण केल्याच्या स्थित्या</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">प्रयोक्ता स्कोर</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">समीक्षकांचा स्कोर</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">सामूहिक स्कोर</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">गेम स्क्रिप्ट</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">अ‍ॅप्लिकेशन स्क्रिप्ट</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">स्क्रिप्ट</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">प्लगइन</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">मेटाडेटा स्रोत</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">एक्स्टेंशन</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">एक्स्टेंशन आयडी</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">स्क्रिप्ट रीलोड करा</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">दिलेल्या शोध/गाळणी निकषासाठी कोणतेही गेम सापडले नाहीत</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">कोणत्याही वस्तू सापडल्या नाहीत</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">डेस्कटॉप मोड चालू करा</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">प्लेनाइटहून बाहेर पडा</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">लायब्ररी</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">सर्व अपडेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">निर्माता:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">आवृत्ती:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">अपडेट केले:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">मॉड्यूल:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">लायब्ररी</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">आकडेवारी</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">सर्व</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">कोणतेही नाही</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">सूचना</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">रुंदी</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">उंची</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">आकार</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">छोटा</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">साधारण</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">मोठा</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">अजून मोठा</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">सर्वात मोठा</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">डीफॉल्ट</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">सर्व निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">सर्व निवडी काढा</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">पहिले</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">यादृच्छिक</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">प्रयोक्त्याची निवड</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">अधिक लोड करा</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">पारदर्शक</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">संक्षिप्त करा</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">विस्तारा</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">सर्व संक्षिप्त करा</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">सर्व विस्तारा</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">इतर</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">थीम</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">एम्युलेटर आर्ग्युमेंट</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">खेळायची क्रिया</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">आयात करायचा मेटाडेटा निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">आयात करायचे गेम निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">मेटाडेटा शोध</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">अपडेट उपलब्ध</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">अपडेट डाउनलोड करून स्थापित करा</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">अपडेटकरीता तपासा</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">अपडेट करण्यात त्रुटी</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">नवीन आवृत्तीचा तपास घेण्यात अयशस्वी.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">कोणतीही नवीन आवृत्ती सापडली नाही. आपल्याकडे आधीच नवीनतम आवृत्ती आहे.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">अपडेट डाउनलोड करून स्थापित करण्यात अयशस्वी.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">सध्या पार्श्वभूमीत कोणतेतरी कार्य चालू आहे. ते रद्द करून अपडेट चालू ठेवायचे आहे का?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">सध्या पार्श्वभूमीत कोणतेतरी कार्य चालू आहे. ते रद्द करून प्लेनाइट बंद करायचे आहे का?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">सध्या पार्श्वभूमीत कोणतेतरी कार्य चालू आहे. मोड बदलल्याने ते कार्य रद्द केले जाईल. तरीही मोड बदलायचा आहे का?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">प्लेनाईटसाठी अपडेट उपलब्ध आहे</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">थीम्सची यादी पुनः लोड करा</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">निवडलेली थीम लागू करा</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">स्क्रिप्ट रनटाइम</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">गेम सुरू करण्याआधी बजावा</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">गेमहून बाहेर पडताना बजावा</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">गेम सुरू झाल्यानंतर बजावा</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">गेम स्क्रिप्ट सुरू करत आहे</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">गेमने स्क्रिप्ट सुरू केली</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">गेमने स्क्रिप्ट थांबवली</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">जागतिक स्क्रिप्ट बजावा</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">जागतिक</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">गाळलेले</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">वर्तमान</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">नवीन</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">चाचणी स्क्रिप्ट</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">केवळ निवडलेल्या वस्तु दाखवा.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">डीफॉल्ट म्हणून सेव्ह करा</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">आवडीच्या गेम्समध्ये जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">आवडीच्या गेम्समधून काढून टाका</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">हा गेम लपवा</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">लपवलेल्यांमधून काढून टाका</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">एचडीआर समर्थन सक्षम करा</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">एचडीआर समर्थन अक्षम करा</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">संपादित करा…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">स्थापनेचा आकार मोजा</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">स्थापनेचा आकार मोजा (सर्व गेम्ससाठी)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">स्थापनेचा आकार मोजा (केवळ नसलेल्या डेटासाठी)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">स्थापनेचा आकार</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">वर्ग सेट करा…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">पूर्ण केल्याची स्थिती सेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">काढून टाका</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">खेळा</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">स्थापित करा</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">गेम पर्याय</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">तपशील</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">विस्थापित करा</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">स्थापना स्थान उघडा</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">डेस्कटॉप शॉर्टकट बनवा</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">माहितीपुस्तिका उघडा</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">अधिक</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">लायब्ररी प्लगइनद्वारे व्यवस्था</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">गेम सुरू करायच्या प्रॉसेसचे व्यवस्थापन हे या गेमसाठी जबाबदार असलेला लायब्ररी प्लगइन करेल.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">दिलेल्या पानावर '{0}' गेमविषयी कोणतीही निगडित माहिती सापडली नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">टीप: एक गेम संपादित करत असताना अधिक आधुनिक मेटाडेटा डाउनलो प्रक्रियेचा वापर करू शकता. &quot;संपादन&quot; मेन्यू पर्याय पाहा.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">एखादे कार्य चालू असताना हे उपलब्ध नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">वर्णन मजकुरात एचटीएमएल सिंटॅक्स वापरले जाईल</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">खेळलेल्याची कालावधी सेकंदांमध्ये नोंदवली जाते.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">स्थापनेचा आकार बाइटमध्ये दर्शवला जाईल.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">रिलीझ दिनांक &quot;वर्ष-महिना-दिवस&quot; या स्वरूपात सेट केले पाहिजे. महिना आणि दिवस यांचे मूल्य वगळले तरी चालतील.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">0 पासून 100 पर्यंतचे मूल्य, किंवा स्कोअर द्यायचा नसेल तर रिकामे ठेवा.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">कोड, भाषांतर व इतर योगदानकर्ता, अनुक्रमात न लावता:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">गेमचे अनुबोधन रद्द करावे का?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">स्थापना अनुबोधन सध्या चालू आहे. ही प्रक्रिया रद्द करून गेमला आधीच्या स्थितीत परत करायचे आहे का?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">खेळल्याची कालावधी</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">याआधी खेळले</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}दि {1}ता {2}मि</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0} ता. {1} मि.</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} मिनिटे</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} सेकंद</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">खेळले नाही</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">डेस्कटॉप मोडमध्ये उघडत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">फुलस्क्रीन मोडमध्ये उघडत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">गेम लायब्ररी लोड कर आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">स्थापनेचा आकार मोजत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">{0} च्या स्थापनेचा आकार मोजत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">स्क्रिप्ट फाइल स्थापित करण्यात अयशस्वी.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">स्क्रिप्ट यशस्वीरित्या स्थापित केली.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">स्क्रिप्ट स्थापित करा</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">स्क्रिप्टमध्ये त्रुटी</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">मेटाडेटा फोल्डर उघडा</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">मोजा</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} हा क्लाएंट स्थापित नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} क्लाएंट आता उघडला जाईल. कृपया त्यात साइन-इन करा व मगच हा संदेश बंद करा.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">प्रयोक्ता साइन-इन होण्यास थांबले आहे. तसे झाल्यावर हा संदेश बंद करा…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">गेमच्या स्थापनेचा फोल्डर सापडला नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">वस्तुचे नाव बदला</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">नवीन वस्तु जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">नाव प्रविष्ट करा</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">नवीन नाव प्रविष्ट करा</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">एक तासापेक्षा कमी</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">१ ते १० तास</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">१० ते १०० तास</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">१०० ते ५०० तास</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">५०० ते १००० तास</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">१००० पेक्षा अधिक तास</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">स्थापना पूर्ण करण्यास पेलनाईट रीस्टार्ट करावे लागणार आहे. आता रीस्टार्ट करायचे का?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">एक्स्टेंशन नीट पॅकेज केले नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">थीम नीट पॅकेज केली नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">&quot;{0}&quot; हे एक्स्टेंशन नीट लोड होण्यात अयशस्वी.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">&quot;{0}&quot; हे एक्स्टेंशन लोड करता आले नाही. प्लेनाइटची सध्याची आवृत्ती समर्थित नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">&quot;{0}&quot; ही थीम नीट लोड करण्यात अपयशी.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">ही थीम किंवा हा एक्सटेंशन असमर्थित API आवृत्ती वापरत आहे.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">स्थापना यशस्वीरित्या पार पडली.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">अ‍ॅडऑन स्थापित करायचे का?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">जेनेरिक</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">&quot;{0}&quot; हा अ‍ॅडऑन स्थापित करण्यात अपयशी.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">एक्सटेंशन स्थापित करण्यात अपयशी.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">तुम्हाला नवीन एक्स्टेंशन स्थापित करायचा आहे का?\r\n\r\n{0}\r\nनिर्माता: {1}\r\nआवृत्ती {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">थीम स्थापित करण्यात अपयशी.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">तुम्हाला नवीन थीम स्थापित करायची आहे का?\r\n\r\n{0}\r\nनिर्माता: {1}\r\nआवृत्ती {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">पुन्हा दाखवू नका</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">निवडलेली थीम नक्की विस्थापित करायचे आहे का? अ‍ॅप्लिकेशन यापुढे सुरू करताना विस्थापन रांगेत लावले जाईल.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">अंतर्गत थीम विस्थापित करता येत नाहीत.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">ही थीम प्लेनाइटच्या या आवृत्तीचे समर्थन करत नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">निवडलेले एक्स्टेंशन नक्की विस्थापित करायचे आहे का? अ‍ॅप्लिकेशन यापुढे सुरू करताना विस्थापन रांगेत लावले जाईल. </sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">एकत्रित एक्स्टेंशन विस्थापित करता येत नाहीत.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">हे एक्स्टेंशन प्लेनाइटच्या या आवृत्तीचे समर्थन करत नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">स्थापना फोल्डर</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">डेटा फोल्डर</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">फाइल आयात करा…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">हे काय आहे?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">तुम्हाला नक्की असे करायचे आहे का?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">खेळलेल्याची एकूण कालावधी</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">खेळलेल्याची सरासरी कालावधी</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">खेळलेल्याची कमाल कालावधी</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">एकूण स्थापनेचा आकार</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">विहंगावलोकन</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">साइडबार</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">साइडबारमध्ये दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">सेटिंग रिसेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">विकासकांकरिता</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">बाह्य एक्स्टेंशन</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">संपूर्ण फोल्डर पाथ प्रविष्ट करा.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">अचीव्हमेंट</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">मंच</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">बातम्या</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">दुकानाचे पृष्ठ</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">प्रारंभिक सेटअप पूर्ण झाले नाही. प्लेनाईट आता डेस्कटॉप मोडमध्ये रीस्टार्ट होईल, ज्याने ही प्रक्रिया पूर्ण करता येईल.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">अलीकडे खेळलेले</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">आवडीचे</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">सर्वात जास्त खेळलेले</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">सर्व</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">गाळण्या वापरल्या आहेत.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">अधिक गाळण्या वापरल्या आहेत.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">या शोधाचे परिणाम दाखवत आहे:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">याच नावाची वस्तू आधीपासून अस्तित्वात आहे.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">वर्तमान गाळण्यांपुरती निवड मर्यादित करा</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">दूसरा निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">अ‍ॅडऑन…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">स्थापित</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">एक्स्टेंशन सेटिंग</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">चाळा</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">अपडेट</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">अपडेट ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">स्थापित केलेले एक्स्टेंशन व थीम यांचे व्यवस्थापन व त्यांचे सेटिंग एका नवीन &quot;अ‍ॅडऑन&quot; मेन्यू येथे हलवण्यात आले आहे.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">थीम - डेस्कटॉप</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">थीम - फुलस्क्रीन</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">शोध घेत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">अ‍ॅडऑन स्थापना पॅकेज डाउनलोड करण्यात अपयशी.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">अ‍ॅडऑन स्थापना मॅनिफेस्ट डाउनलोड करण्यात अपयशी.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">प्रलंबित बदल लागू करण्यास अ‍ॅप्लिकेशन रीस्टार्ट आवश्यक आहे.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">या अ‍ॅडऑनची स्थापना शेड्यूल केली गेली आहे.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">स्थापित करा</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">विस्थापित करा</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">आधिच स्थापित केले आहे</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">कोणतेही नवीन अ‍ॅडऑन अपडेट सापडले नाहीत.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">अ‍ॅडऑन अपडेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">चेन्जलॉग उपलब्ध नाही</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">स्थापना करण्यास शेड्यूल केले</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">डाउनलोड अयशस्वी</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">परवाना नाकारला गेला</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">{0} डाउनलोड करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">अपडेट करण्यास वस्तू निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">स्वीकारा</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">नाकारा</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">क्रिया निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">दुवा</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">फाईल</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">एम्युलेटर</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">स्क्रिप्ट</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">डीफॉल्ट</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">प्रक्रिया</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">फोल्डर</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">कोणतेही नाही</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">एकसमान</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">केवळ वस्तू</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">केवळ सुरुवातीला व शेवटला</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">स्क्रोल संवेदनशीलता</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">सुरळीत स्क्रोल</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">अ‍ॅनिमेशन वेग</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">वस्तु काढून टाकायची का?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">ही वस्तू नक्की काढून टाकायची आहे का?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">ही बटणे वरच्या पॅनलवर दाखवा:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">साधारण दृश्य सेटिंग</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">गटपाडणी सेटिंग</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">क्रमवारी सेटिंग</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">गाळणी प्रीसेट</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">प्लगइन वस्तू स्थान</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">विभाग विभाजक रुंदी</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">मुख्य मेन्यू बटण बाजूच्या पट्टीत ठेवा</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">एक्सप्लोरर पॅनल</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">यादृच्छिक गेम निवडक</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">दृश्यातून एखादे गेम यादृच्छिकरित्या निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">गट बनवायचे व क्रमवारी लावायचे सेटिंग सेव्ह करा</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">फुलस्क्रीन मोडमध्ये जलद गाळणी म्हणून दाखवा</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">गेल्या 7 दिवसांत</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">गेल्या ३१ दिवसांत</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">गेल्या ३६५ दिवसांत</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">३६५ पेक्षा जास्त दिवसांपूर्वी</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">कॉन्फिगर</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">प्रीसेट सेव्ह करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">गेम सुरू केल्यानंतर मिनिमाइझ करा</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">एखादा गेम सुरू केल्यानंतर प्लेनाइट मिनिमाइझ करा.\r\n\r\nहे अक्षम केले तर गेम सुरू केल्यावर गेममध्ये इनपुट न मिळण्याच्या समस्या आढळू शकतील!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">फाँट आकार</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">छोटा फाँट आकार</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">गेम कंट्रोलर समर्थन</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">मेन मेन्यूवर वस्तू दाखवा:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">केवळ प्राथमिक कंट्रोलर</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">सक्षम केल्यावर केवळ प्राथमिक कंट्रोलरपासून इनपुट स्वीकारले जाईल.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">इंटरफेस व्हॉल्यूम</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">पार्श्वभूमी व्हॉल्यूम</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">पार्श्वभूमीत असताना म्यूट करा</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">ऑडियो इंटरफेस आरंभ करण्यात अयशस्वी.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">आउटपुट API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">ऑडियो आउटपुटसाठी वापरला जाणारा API. आवाजात समस्या अनुभवत असलात तर हे बदला.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">साधारण</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">दृश्य</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">ऑडिओ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">मांडणी</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">मेन्यू</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">इनपुट</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} सुरू होत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} चालू आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">कॅपिटल</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">स्पेस</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">चित्र रेंडर करणारे स्केलर</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">वैकल्पिक</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">संतुलित</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">गुणवत्ता</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">फाईल निवडा…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">फोल्डर निवडा…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">स्टार्टअप स्क्रिप्ट</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">स्टार्टअपच्या वेळी निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">स्टार्टअपच्या वेळी निवडा</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">अंतर्गत प्रोफायली</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">अंतर्गत प्रोफाईल</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">सानुकूल प्रोफायली</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">सानुकूल प्रोफाईल</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">एम्युलेटर सुरू करण्याअगोदर बजावा</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">एम्युलेटर सुरू केल्यानंतर बजावा</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">एम्युलेटरहून बाहेर पडताना बजावा</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">एम्युलेटर एग्झेक्युटेबल सापडले नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">एक गेम म्हणून विलीन करा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">प्लॅटफॉर्म सेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">प्रदेश सेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">फोल्डर स्कॅन करा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">कॉन्फिगरेशन स्कॅन करा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">चेकसम स्कॅनमधून पॅटर्न वगळा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">विनिर्दिष्ट केलेल्या पॅटर्नांशी जुळणार्‍या फायली चेकसमसाठी स्कॅन केल्या जाणार नाहीत. त्याऐवजी त्यांची जुळणी फाइलच्या नावाशी होईल. अधिक माहितीसाठी एम्युलेटर मदत पान पाहा.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">एम्युलेटरने स्कॅन करा</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">नवीन कॉन्फिगरेशन सेव्ह करताना नाव सेट केले पाहिजेच.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">एम्युलेटर किंवा एम्युलेटर प्रोफाइल सेट केले नाही.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">आयात केलेले लपवा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">आयात करायचे प्रोफाइल:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">सबफोल्डर स्कॅन करा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">स्कॅनर जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">वाचवून ठेवलेला स्कॅनर जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">स्कॅन सुरू करा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">ही स्थिती पहिल्यांदाच खेळल्यावर गेम्सना नेमली जाते</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">या नावाचा गाळणी प्रीसेट आधीच अस्तित्वात आहे. तो प्रीसेट नवीन सेटिंग्झने अपडेट करायचा आहे का?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">क्रमवारी</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">गेमांचा आकार मोजताना ड्राइव्हवरील प्रत्यक्ष आकार मिळवा</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">हे सक्रिय केल्याने स्कॅनचा वेग कमी असेल व ड्राइव्हवर असलेल्या फायलींचा प्रत्यक्ष आकार मिळवला जाईल.\r\nहे निष्क्रिय केल्याने स्कॅनचा वेग जास्त असेल व फायलींचा स्वतःचा आकार वापरला जाईल.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">स्कॅनमधून ऑनलाइन फाइल वगळा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">स्थानिक पातळीवर उपलब्ध नसल्यास क्लाउड स्टोरेजवर साठवलेल्या फायली स्कॅन करून आयात केल्या जाणार नाहीत.\r\nकेवळ यांसाठी समर्थित आहे: गूगल ड्राइव्ह, ड्रॉपबॉक्स, वनड्राइव्ह</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">सर्वांवर लागू करा</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">दिवसातून एकदा</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">आठवड्यातून एकदा</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">प्रत्येक स्टार्टअपला</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">लायब्ररी अपडेट करा</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">एम्युलेशन फोल्डर स्कॅन करा</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">लपवलेले गेम सामील करा</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">रकाने संपादित करा</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">सर्व निवडा / निवड काढा</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">उघडा</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">सक्रिय करा</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">नेमणूक करा</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">गेम्सचा शोध घेण्यास टाइप करायला सुरुवात करा… मदतीसाठी [F1] दाबा</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">विस्थापित केलेले गेम सामील करा</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">लपवलेले गेम सामील करा</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">विस्थापित केलेले गेम सामील करून</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">विस्थापित गेम वगळून</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">लपवलेले गेम सामील करून</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">लपवलेले गेम सामील नसून</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">खेळा किंवा स्थापित करा</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">तपशील पाहा</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">गेम मेन्यू</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">गेम संपादित करा</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">शोध घ्या</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">शोध पट्टी</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">शोध बटण</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">प्राथमिक गेम क्रिया</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">द्वितीयक गेम क्रिया</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F दाबल्याने शोध बॉक्सवर लक्ष केंद्रित करण्याऐवजी जागतिक शोध उघडावे</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">शोध पुरवणारे</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">प्लेनाइट शोध</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">एक्स्टेंशन सेटिंग</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">वगळलेले</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">फाइल वगळायच्या यादीत जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">फोल्डर वगळायच्या यादीत जोडा</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">वगळायच्या वस्तू केवळ सेव्ह केलेल्या स्कॅनर कॉन्फिगरेशनशी जोडता येतात.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">&quot;{0}&quot; स्कॅनर यात वगळायच्या वस्तू जोडण्यात आल्या आहेत.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">लपवल्याची स्थिती</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">डेटा बॅकअप रद्द करण्यात आले.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">डेटा बॅकअप अयशस्वी.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">डेटा बॅकअप त्रुटी</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">डेटा बॅकअप चालू आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">बॅकअपमधून डेटा पुनःस्थापित करत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">सेटिंग</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">गेम लायब्ररी</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">गेम लायब्ररी मीडिया</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">स्थापित केलेले एक्स्टेंशन</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">एक्स्टेंशन डेटा</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">स्थापित केलेल्या थीम</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">बाकअप फोल्डर</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">अधिक डेटा सामील करा:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">वेब चित्र शोध</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">अ‍ॅडऑनविषयी माहिती मिळवत आहे…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">कोणतेही मेटाडेटा स्रोत उपलब्ध नाही</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">प्ले क्रिया सेटिंग</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">सुरू झाल्यावर प्रोफाईल निवडावी</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">सुरू झाल्यावर एम्युलेटर निवडावे</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">आपोआप</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">नेहमीच चालू</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">नेहमीच बंद</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">अ‍ॅप्लिकेशन मेन्यू</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">गेम मेन्यू</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">प्रोग्राम फोल्डर</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">प्रयोक्ता डेटा फोल्डर</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">तुम्ही केलेले बदल तुम्हाला सेव्ह करायचे आहेत का?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">सुवाह्य स्थापना</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">कोणतेही कंट्रोलर सापडले नाहीत</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/nl_NL.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Dutch</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite Taal</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Afsluiten</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filter Actief</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filter Uitgeschakeld</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Aanvullende filters</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filters</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Ongeldige Data</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Wijzigingen Opslaan?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Homepagina op www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Source Code op GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Maak diag. package</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Diagnostische informatie verzenden</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Over Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Gemaakt door Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Wijs Categorie Toe</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Stel Categorieën In</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Categorie Toevoegen</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Aangevinkt - Wijs categorie toe\r\nUitgevinkt - Verwijder categorie\r\nEr tussenin - Geen wijzigingen (bij bewerken van meerdere spellen)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Geen Categorie</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Geen Platform</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Oops! Er ging iets fout...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Er onherstelbare fout heeft opgetreden.\r\n\r\nAls je ons wilt helpen dit probleem op te lossen, omschrijf dan alsjeblieft kort welke acties je hebt ondernomen vóór de crash, en maak dan een diagnose pakket. Als je online bent wordt dit pakket geüpload naar de Playnite server voor analyse.\r\n\r\nAls alternatief kan je de 'Rapporteer Crash' knop gebruiken om een nieuw probleem topic aan te maken op GitHub en de crash handmatig te rapporteren.\r\n\r\nBedankt voor je hulp.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Extensie {0} veroorzaakte een onherstelbare fout.\r\n\r\nWe raden aan om het log bestand op te slaan en het probleem te rapporteren aan extensie ontwikkelaar. Als het probleem zich blijft voordoen. Schakel de extensie dan uit.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Extensie {0} heeft een onherstelbare fout veroorzaakt.\r\n\r\nWe raden aan om het probleem te rapporteren aan de extensie ontwikkelaar. Als het probleem zich blijft voordoen, schakel de extensie dan uit.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Onbekende extensie of thema veroorzaakte een onherstelbare fout.\r\n\r\nWe bevelen aan extensies van derde partijen uit te schakelen, de problematische extensie te isoleren en het probleem te rapporteren aan de ontwikkelaar van die extensie.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Onherstelbare fout opgetreden.\r\n\r\nAls je ons wilt helpen dit probleem op te lossen, stuur ons dan alsjeblieft diagnostische informatie. Bedankt.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Schakel de extensie uit.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Sla het log bestand op.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Verstuur diag. info</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Rapporteer Probleem</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Herstart Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Herstart in Veilige modus</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Schakel alle 3de partij extensies uit en gebruik het standaard thema.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Sluit Playnite af</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Acties ondernomen vóór de crash (in Engels):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Bibliotheek Beheerder</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Verwijder Spel(len)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Kan niet verwijderen - Game of de installer is bezig.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Kan niet de-installeren - Game is bezig.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Weet u zeker dat u {0} wilt verwijderen?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Weet u zeker dat u {0} spellen wilt verwijderen?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Weet u zeker dat u {0} wilt verwijderen?\r\n\r\nHet selecteren van de &quot;Ja (voeg toe aan uitsluitingslijst)&quot; optie zorgt ervoor dat bij het updaten van de bibliotheek, deze game niet opnieuw wordt geïmporteerd.\r\n\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Weet u zeker dat u {0} spellen wilt verwijderen?\r\n\r\nAls u de optie &quot;toevoegen aan uitsluitingslijst&quot; selecteert, wordt voorkomen dat de game de volgende keer dat de bibliotheek wordt bijgewerkt, opnieuw wordt geïmporteerd.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Weet je zeker dat je {0} entries wilt verwijderen die momenteel niet worden gebruikt?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Geen ongebruikte velden gevonden.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Ja (voeg toe aan uitsluitingslijst)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Er zijn niet-opgeslagen wijzigingen in deze sectie</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Database versie aan het updaten…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Database update mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Kan de spelbibliotheek niet bijwerken. {0} MB vrije ruimte is vereist.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Spel Error</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Kan het spel niet starten. '{0}' kon niet worden gevonden in de database.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Kan het spel niet starten: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Kan de actie niet starten: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Kan de spellocatie niet openen: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Kon de installatiegrootte van het spel niet detecteren: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Fout bij installatiegrootte scan</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Er waren {0} fouten tijdens het scannen van de installatiegrootte</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Snelkoppeling maken mislukt: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Kan handleiding niet openen: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Kan het spel niet installeren: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Kan het spel niet deïnstalleren: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Geen geldige spelstartup acties gevonden. Zorg ervoor dat platformdefinities overeenkomen tussen het spel en de emulator configuratie.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Installatie implementatie is niet beschikbaar</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">De bibliotheek plug-in die verantwoordelijk is voor deze game is uitgeschakeld of niet geïnstalleerd.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Officiële metadata download is niet beschikbaar.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Er is geen spel geselecteerd.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Game's script actie executie is gefaald.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Uitvoering van applicatiescript is mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Globale script actie executie is gefaald.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Emulator Script uitvoering is mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Speel script actie is mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 of nieuwer is niet geïnstalleerd.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Kon niet bepalen hoe de game te starten.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Ingeschakeld</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Uitgeschakeld</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Verwijderen</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Verwijder ongebruikt</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Hernoemen</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopiëren</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Toevoegen</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Standaard Icoon</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Standaard Cover Afbeelding</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Standaard achtergrondafbeelding</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Klaar</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Volgende</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Vorige</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">GEREED</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">TERUG</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">WISSEN</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Wissen</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Negeren</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Negeer alles</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importeren</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Naam</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Auteur</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Module</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Series</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versie</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Laatst Gespeeld</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Meest gespeeld</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Aantal Keer Gespeeld</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Installatiegrootte</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Map</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notities</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Toegevoegd</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Datum Toegevoegd</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Bewerkt</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Datum Gewijzigd</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Website</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Pad</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">Oké</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Opslaan</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Sluiten</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Annuleren</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Bevestigen</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Reset</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Ja</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Nee</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Welkom</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Lokale Gebruiker</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Algemeen</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Media</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Installatie</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Acties</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Downloaden…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Downloaden media…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Laden…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Type</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profiel</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profielen</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Verwijderen</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Download</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Zoeken</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Resolutie:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Alle</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Zoom</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Lijstweergave</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Covers</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Rasterweergave</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Details-weergave</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Aangepast</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Speciale dank aan</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licentie</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Bijdragers</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Playnite wordt afgesloten…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Vandaag</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Gisteren</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Maandag</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Dinsdag</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Woensdag</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Donderdag</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Vrijdag</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Zaterdag</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Zondag</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Afgelopen Week</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Afgelopen Maand</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Afgelopen Jaar</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Meer dan 1 jaar geleden</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 tot 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB tot 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB tot 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB tot 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB tot 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB tot 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB tot 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB of meer</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Importeren succesvol voltooid.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Alle Spellen</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Spel Id</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Database-ID</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Voorinstellingen</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Kolom</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Kolommen</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Rij</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Rijen</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Kon geen icoon uit Speel actie halen. Er is geen actie met het type bestand aanwezig.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Download alleen missende metadata</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Het inschakelen van deze optie zal het downloaden van metadata overslaan voor gegevensvelden die al informatie bevatten.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Spellen selectie</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Selecteer alsjeblieft de spellen die moeten worden geüpdatet met nieuwe metadata:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Alle spellen uit de database</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Alle huidig gefilterde spellen</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Alleen geselecteerde spellen</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Geen metadata velden geselecteerd</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Er zijn geen metadata velden geselecteerd om te downloaden. Selecteer er ten minste één en schakel ten minste één metadata aanbieder in.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Officiële Winkel</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Selecteer alsjeblieft welke velden Playnite automatisch moet invullen en welke bronnen gebruikt moeten worden om deze data te verkrijgen.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Overweeg om op het bovenstaande logo te klikken en updates bij te dragen aan de igdb.com database om de gegevens waar Playnite gebruik van maakt te verbeteren.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Metadata aan het downloaden…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Geïnstalleerde spellen aan het importeren…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">{0} spellen aan het importeren…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importeer geemuleerde games van {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Bibliotheek updates aan het downloaden…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Scannen van spelgrootte in bibliotheek…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Grootte van geïmporteerde spellen scannen…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Biblotheekupdate afgerond</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Bronnen vrijgeven…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Configuratie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Instellingen…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platforms en Emulators</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Emulators configureren</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Bibliotheekbeheer…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Gereedschappen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Download Metadata...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Softwaretools</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Configureer Integraties</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Open Cient van derde Partij</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">3de Partij Clients</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Herlaad Spellen Lijst</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Annuleer bibliotheek update</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Update Geemuleerde mappen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Voeg Spel Toe</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Handmatig…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Scan Automatisch...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Geëmuleerd Spel...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store applicatie…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Over Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Stuur Feedback</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Overschakelen naar volledige scherm modus</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Koppelingen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Hulp</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Steun op Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Ondersteun {0} op Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Gebruikershandleiding</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK Documentatie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Opnieuw opstarten</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Systeem uitschakelen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Systeem Onderbreken</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Systeem in slaapstand zetten</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Vergrendel systeem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Gebruiker afmelden</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Kies een Willekeurig Spel</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Spelvelden weer te geven op detailspaneel:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Itemafstand</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Teken grid item achtergrond</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Grensbreedte rasteritem</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Bron ontbrekende spelicoon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Bron ontbrekende spelomslag</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Mist game achtergrond bron</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Verticale afstand tot speldetails</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Positie details in rasterweergave</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Positie spellijst in detailsweergave</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Teken scheidingslijn tussen panelen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Afbeeldingshoogte spelomslag</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Icoonhoogte spellijst</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Toepassingslettertype</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Lettertype vaste breedte</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Positie filter paneel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Positie verkenner paneel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Omslagweergave</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Gerichte hoogte-breedteverhouding</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">De volgende opties heb ook invloed op tegel rendering in Fullscreen Modus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Uitrekmodus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD-box</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Vierkant</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam-banner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam verticale cover</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Vereist herstart om toe te passen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Instellingen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Algemeen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Boven paneel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Uiterlijk</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Speldetails</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Opmaak</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Geavanceerd</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Volledig scherm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Invoer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Prestatie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Bijwerken</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Zoeken</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Back-up</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Backup Bibliotheekgegevens</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Back-up Herstellen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importeer veranderingen in de bibliotheek automatisch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Ongeldige database bestandslocatie, er moet een correct bestandspad ingesteld zijn.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Accountnaam mag niet leeg zijn.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Download metadata na het importeren van spellen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Start Playnite geminimaliseerd</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Start Playnite wanneer u computer start</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Start gesloten in het systeemvak</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Het registreren van Playnite om te starten bij het opstarten van de computer is mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Start in Volledig Scherm Modus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asynchroon laden van afbeeldingen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Zorgt voor soepeler scrollen in de spellijst in ruil voor het langzamere laden van afbeeldingen.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Toon spelnaam als omslag ontbreekt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Toon spelnaam op cover weergave</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Verduister niet geïnstalleerde games</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Toon game iconen in Lijstweergave</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Toon Item hoeveelheid op groep beschrijving</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Toon alleen toegewezen velden op filter en verkenning panelen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Gebruik hardware acceleratie niet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Gebruik als je stotteren ervaart in de UI of soortgelijke problemen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Toon verborgen games in Snel start lijst</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Beïnvloed spring lijsten en lade menu lijsten.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Aantal snel start items </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Gebruik spelachtergrond als vensterachtergrond</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Vervaag achtergrond</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Hoge kwaliteit</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Verdonker achtergrond</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Toon in rasterweergave</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Thema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Themaprofiel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Volledig Scherm Thema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Volledig Scherm Thema Kleur</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Database Locatie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Loginstatus:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite Instellingen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Leeg web cache</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Kan problemen oplossen bij het linken van accounts.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Systeemvakicoon weergeven</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimaliseer Playnite naar systeemvak</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimaliseer Playnite naar systeemvak wanneer de applicatie is gesloten</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Als een spel start:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Na het sluiten van het spel:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Maak speeltijd op om het aantal gespeelde dagen aan te geven</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Datumnotatie:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Dit logt je uit bij alle gelinkte services. Herstart van applicatie is nodig. Wil je verdergaan?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Leeg Cache?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Om het thema toe te passen moet Playnite opnieuw opgestart worden</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Vind meer thema's</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Maak nieuw thema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Vind meer extensies</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Creëer nieuwe extensie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Help ons met vertalen van Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite moet herstart worden alvorens de nieuwe instelling worden toegepast. Wil je nu herstarten?\r\nHerstarten zal huidige taken (downloads) die nu bezig zijn stopzetten.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Herstart Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite verplaatst bibliotheek bestanden niet automatisch, verplaats/kopieer ze voor dat de locatie is veranderd. Als er geen bibliotheek aanwezig is op de aangewezen locatie zal er een nieuwe gemaakt worden. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Speeltijd zal niet worden bijgehouden als de &quot;Sluit&quot; actie is ingesteld.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Aantal rijen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Aantal kolommen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Aantal detailweergave rijen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Toon Achtergrond afbeelding op het Hoofd Scherm</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Geldt niet retrospectief voor bestaande spellen zonder metadata opnieuw te downloaden.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importeer de speeltijd van spellen in de bibliotheek:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Configureert wanneer Playnite de speeltijd moet importeren die door bibliotheek plugins voor spellen in de Playnite database wordt gerapporteerd. Ondersteuning door de bibliotheek plugins die verantwoordelijk zijn voor het verwerken van de spel(s) is nodig om deze functie te kunnen gebruiken.\r\n\r\nAltijd: Importeer de speeltijd voor nieuw geïmporteerde en bestaande spellen in de Playnite database.\r\nAlleen voor nieuw geïmporteerde spellen: Importeer speeltijd alleen voor nieuwe geïmporteerde spellen.\r\nNooit: Importeer onder geen enkele omstandigheid speeltijd.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Altijd</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Alleen voor nieuw geïmporteerde spellen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Nooit</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Activeer controller ondersteuning in Desktop modus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Gids knop opent volledig scherm modus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Automatisch Metadata download instelling voor nieuwe geïmporteerde games.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Doel scherm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Gebruik altijd het primaire beeldscherm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Toon Speltitels</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Toon Batterijstatus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Toon Batterijpercentage</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Toon Klok</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Verberg muis cursor</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Alleen Geïnstalleerd in Snelle Filters</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Knop Prompts</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Horizontaal Scrollen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Selecteer een van de subsecties</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Geen instellingen beschikbaar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Mislukt om instellingen te laden</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Deze script worden uitgevoerd voor elke game in de bibliotheek. Individuele scripts kunnen toegewezen worden aan elke game afzonderlijk tijdens het bewerken van game details </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animeer achtergrond afbeelding transities</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Lettertype grootte</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automatisch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Gealiast</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Grijswaarden</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideaal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Scherm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Tekstopmaak</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Tekst weergavemodus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Tekstweergave- en vomgevingmethodes worden voorlopig nog niet gebruikt voor gamebeschrijvingen.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Laad achtergrond afbeelding vooraf</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Wanneer ingeschakeld, zal Playnite achtergrondafbeeldingen samen met de metadata downloaden, wat meer schijfruimte gebruikt maar de afbeeldingen offline beschikbaar maakt.\r\n\r\nWanneer uitgeschakeld, worden achtergrondafbeeldingen enkel wanneer nodig gedownload, wat minder schrijfruimte gebruikt. Dit kan ervoor zorgen dat er een vertraging is voor de afbeeldingen worden weergegeven en dat sommige afbeeldingen offline niet beschikbaar zijn.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Sluit andere clients automatisch af na het sluiten van een game.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Afsluitvertraging van andere clients (in seconden)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Sluit niet af na gamesessies die minder lang duurden dan (in seconden)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Sluit automatisch de volgende clients af:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Sluit clients automatisch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importeer uitsluitings lijst</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Geef een waarschuwing weer wanneer te grote gamemedia worden toegekend.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">&quot;Open map&quot;-commando</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Gewenste leeftijdsclassificatie-organisatie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Update installatiegrootte van spellen bij update bibliotheek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Scant en werkt de installatiegrootte van spellen bij als blijkt dat de bestanden zijn gewijzigd sinds de laatste scan</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Geen</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Vullen</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Uniform</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Uniform te vullen</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Rechts</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Boven</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Onder</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Importeer Error</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Authenticatie nodig</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Authenticatie mislukt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Alternatieve web weergave rendering modus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Gebruik wanneer er problemen zijn met webviews, bijvoorbeeld die van authenticatie van integraties.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Gedeeltelijk laden van grote spelomschrijvingen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Grote beschrijvingen kunnen merkbare vertraging veroorzaken bij het selecteren van spellen.\r\n\r\nWanneer ingeschakeld, wordt slechts een deel van de beschrijvingstekst geladen met een optie om de rest op verzoek te laden.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Metadata Importeren</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Download Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Stel de geselecteerde configuratie in om gebruikt te worden voor alle toekomstige metadata downloads.\r\nKan ook gewijzigd worden in de applicatie instellingen.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Emulatie Import Wizard</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Deze wizard zal je door het download- en importeerproces van emulators en geëmuleerde games leiden.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Je kunt later altijd extra emulators en/of geëmuleerde games toevoegen via het configuratiescherm voor emulators (Bibliotheek &gt; Emulators configureren ).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">De volgende emulators kan Playnite automatisch herkennen en configureren. Je kan de installatieprogramma's van hun website downloaden. Wanneer je de emulators (handmatig) geïnstalleerd hebt, kan je ze importeren in het configuratiemenu.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Je kan geïnstalleerde emulators importeren door op de knop 'Automatisch herkennen in map' te klikken. Playnite zal de geselecteerde map doorzoeken en de optie geven gekende emulators te importeren. Je kan dit verschillende keren doen om emulators in verschillende mappen te importeren. De emulators zullen onderaan de lijst worden toegevoegd.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Je kan games importeren door op de knop 'Map scannen met emulator' te klikken. Door de juiste emulator te selecteren, weet Playnite welke bestandstypen moeten worden gescand en geïmporteerd. Je kunt deze knop meerdere keren gebruiken om games uit verschillende mappen te importeren. Games worden onderaan de huidige lijst toegevoegd.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Er zijn geen emulators geselecteerd om te importeren. Je kan niet automatisch geëmuleerde spellen importeren zonder eerst emulators te configureren. Weet je zeker dat je verder wilt gaan en het importeerproces wilt afsluiten?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Er zijn geen emulator geconfigureerd in Playnite. Je kan geen geëmuleerde games importeren zonder eerst een emulator te configureren en de juiste bestandstypen te selecteren. Wil je nu emulators toevoegen?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Scan map met Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Selecteer bestanden</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Automatisch herkennen in map</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Emulators configureren</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Scannen…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">{0} scannen...</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Eerste Configuratie</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Deze wizard leidt je door het automatische import- en configuratieproces van externe spelbibliotheken. Playnite kan automatisch games importeren van meerdere gameservices, zoals Steam of GOG, en ook je bibliotheek up-to-date houden door deze automatisch bij te werken wanneer de applicatie wordt gestart.\r\n\r\nHoud er rekening mee dat je later altijd nog handmatig een aangepast spel voor elk platform kunt toevoegen door op de knop 'Playnite' in het hoofdmenu te klikken.\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Bibliotheek Integratie</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Importeer automatisch games uit de onderstaande services. Alle latere spelwijzigingen (installatiestatus) worden automatisch bijgewerkt bij het opstarten van Playnite of wanneer ze handmatig worden geactiveerd. De geselecteerde instellingen zijn van invloed op de eerste en alle volgende importen.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Configuratie Klaar</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">De eerste installatie is voltooid. Onthoud dat je alle instellingen later kunt wijzigen in het menu 'Instellingen'.\r\n\r\nJe kunt later ook een ander spel toevoegen door op het Playnite-icoon te klikken.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Downloaden van één of meerdere extensions is mislukt.\r\nJe kan proberen deze opnieuw te downloaden via het add-ons menu na de eerste keer opstarten.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Integratie {0} downloaden...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Lijst van aanbevolen integraties aan het downloaden…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Downloaden van lijst van aanbevolen integraties mislukt. U kunt later proberen om de integraties opnieuw te downloaden via het Uitbreidingen menu.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Platforms en emulators configureren</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Emulators configureren</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platforms</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulators</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Voeg Platform Toe</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Selecteer Icoon</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Selecteer Cover</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Afbeelding selecteren</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Item selecteren</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Selecteer achtergrond</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Selecteer Bestand</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Selecteer URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Voeg Emulator Toe</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Ondersteunde Platform(s)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Wil je de platform veranderingen opslaan?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Wil je de emulator veranderingen opslaan?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Uitvoerbaar bestand</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumenten</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Werkmap</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Ondersteunde Bestandstypes</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importeer Emulators...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Download Emulators...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Laad argumenten presets van bekend emulator profiel</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Weet je zeker dat je {0} emulator wilt verwijderen?        \r\nHet wordt op dit moment door {1} spel(len) gebruikt.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Weet u zeker dat je {0} platform wilt verwijderen?\r\nHet wordt momenteel gebruikt door {1} game(s) en {2} emulator(s).Begin the Emulation Import Wizard\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Instellingen hulp</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sorteren op</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Sorteerrichting</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Groeperen Op</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Oplopend</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Aflopend</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Niet groeperen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Groepeer op Leverancier</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Groepeer op Categorie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Groepeer op Platform</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Weergave Type</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Weergave</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Verkenner Paneel</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Filter Paneel</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Icoon</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Bibliotheek Icoon</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Cover Afbeelding</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Achtergrond Afbeelding</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Sorteer Naam</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Leverancier</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Handleiding</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Naam</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Installatieschijf</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Account Naam</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Categorie(ën)</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Genre(s)</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Datum van uitgave</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Release Jaar</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Ontwikkelaar(s)</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Tag(s)</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Uitgever(s)</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Installatiestatus</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Alle filterwaarden vereist</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Indien ingeschakeld: alleen spellen die aan alle items in elk filter voldoen zullen worden weergegeven.\r\nIndien uitgescshakeld: spellen die voldoen aan tenminste één item in elk filter zullen worden weergegeven.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Geïnstalleerd</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Geïnstalleerd</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Niet geïnstalleerd</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Verborgen</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favoriet</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">HDR ondersteuning inschakelen</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Indien ingeschakeld, zal HDR ingeschakeld worden op de primaire display voordat u het spel start.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Merk op dat HDR niet ondersteund wordt op uw primair beeldscherm.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Laatst Gespeeld</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Categorie</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Beschrijving</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Installatie Map</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Cover Afbeelding</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Image/ISO Pad</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Genre</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Genres</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Bedrijf</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Bedrijven</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Ontwikkelaar</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Ontwikkelaars</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Uitgever</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Uitgevers</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Categorie</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Categorieën</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Tag</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Tags</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Functie</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Functies</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Leeftijdsclassificatie</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Leeftijdsclassificatie</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Regio</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regio's</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Bron</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Bronnen</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Recente Activiteit</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Databasefout</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Openen van de bibliotheek database is mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Database is niet geopend.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Kan geen toegang krijgen tot de bibliotheek database. Bestand &quot;{0}&quot; wordt gebruikt door een ander proces of bevind zich op een ontoegankelijke locatie.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Diagnostics package maken mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Automatisch uploaden van diagnostische pakket mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Diagnostische informatie is succesvol verzonden.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Het diagnostische pakket is gemaakt en verzonden.\r\nVoeg de volgende ID toe aan het probleemrapport:\r\n\r\n</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Kan geen spellen importeren van {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Kan geen geëmuleerde spellen importeren van {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Kan niet zoeken naar spellen met het geselecteerde emulator profiel. Het profiel bevat geen extensies of platforms.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite kan niet worden gestart. Sluit alle andere instanties van Playnite en probeer het opnieuw.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Kan thema &quot;{0}&quot;, kleurprofiel &quot;{1}&quot; niet toepassen\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Kan link niet openen, URL is ongeldig.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Het starten van de applicatie is mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Kan de webweergave component niet initialiseren. Playnite kan niet doorgaan met het opstart-proces.\r\n\r\nMeer informatie op https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Kan emulators niet importeren vanwege ontbrekend of beschadigd definitiebestand.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Kan menuactie niet uitvoeren.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Bewerk Spel Details</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Afbeelding URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Voeg Link Toe</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">ROM toevoegen</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Sla Wijzigingen Op</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Wijzigingen in dit veld toepassen op spel(len) die bewerkt worden.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Voeg Actie Toe</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Verwijder Actie</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Verwijder Speel Actie</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Voeg Spellen Toe</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Scan Map...</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Detecteer Geïnstalleerd</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Bladeren...</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Open Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Profiel Instellingen</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Spelnaam kan niet leeg zijn.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Speeltijd volgmap kan niet leeg zijn.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Spelnaam kan niet leeg zijn bij het zoeken naar metadata.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Ongeldige spel data</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Voer een geldige web URL beginnend met http:// of https:// in</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Selecteer URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Downloaden van metadata mislukt: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Download Fout</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Wis Filters</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Privé Account</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Openbaar Account</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API Sleutel</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Opstart Error</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Thema Error</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Wis Alles</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Aan het installeren</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Aan het deinstalleren</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Aan het starten</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Actief</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Ongeldige URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Doe niets</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimaliseer</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Herstel Venster</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Herstel venster alleen wanneer gelanceerd vanuit UI</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Sluiten</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Wijzig</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Geavanceerd</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Nooit</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Voltooiingsstatus</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Voltooiingsstatussen</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Gebruikersscore</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Criticusscore</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Communityscore</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Spel scripts</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Applicatie scripts</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Plugins</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Metadata Bronnen</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Extensies</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Extensie ID</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Herlaad Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Interactieve SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Alle scripts succesvol herladen.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Geen games gevonden voor opgegeven zoek of filtercriteria</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Geen items gevonden</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Omschakelen naar Desktop Modus</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Sluit Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Bibliotheken</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Alles bijwerken</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Aangemaakt door:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versie:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Bijgewerkt:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Module:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Bibliotheek</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistieken</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Alles</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Geen</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Meldingen</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Breedte</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Hoogte</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Formaat</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Klein</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normaal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Groot</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Groter</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Grootst</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Standaard</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Selecteer</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Selecteer alles</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Selectie opheffen</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Eerste</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Willekeurig</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Gebruikersselectie</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Laad meer</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Doorzichtig</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Samenvouwen</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Uitvouwen</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Alles samenvouwen</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Alles uitklappen</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Andere</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Thema's</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Emulator Argumenten</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Ingebouwde argumenten</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Aangepaste Argumenten</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Extra Emulator Argumenten</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Overschrijf Emulator Argumenten</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Speel actie</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Selecteer metadata om te importeren</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Selecteer Spellen om te Importeren</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Metadata zoeken</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Update Beschikbaar</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Veranderingen sinds laatste update</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Installeer Update</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Controleer op updates</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Update Fout</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Controleren op nieuwe versie mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Geen nieuwe versie gevonden, u bent up-to-date.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Downloaden en installeren van update mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Er is momenteel een achtergrondtaak actief. Wilt u deze annuleren en verdergaan met de update?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Er is momenteel een achtergrondtaak actief. Wilt u deze annuleren en Playnite sluiten?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Er is momenteel een achtergrondtaak actief. Van modus wisselen zal deze taak annuleren. Wil je nog steeds van modus wisselen?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Er is een update voor Playnite beschikbaar.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Herlaad thema lijst</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Geselecteerd thema toepassen</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Kijk naar bestandsveranderingen</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Pas het thema automatisch toe als de bronbestanden veranderen</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Script runtime</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Script dat moet worden uitgevoerd voordat een spel wordt gestart</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Script om uit te voeren na het afsluiten van een game</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Script om uit te voeren nadat een spel is gestart</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Uitvoeren bij opstarten programma</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Uitvoeren bij afsluiten van programma</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Spel starten script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Spel gestart script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Spel gestopt script</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Globaal script uitvoeren</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Globaal</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Gefilterd</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Huidig</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Nieuw</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Test script</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Alleen geselecteerde items tonen.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Opslaan als standaard</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Voeg toe aan Favorieten</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Verwijder uit Favorieten</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Verberg deze game</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Verwijder uit verborgen</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">HDR ondersteuning inschakelen</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">HDR ondersteuning uitschakelen</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Bewerk…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Bereken installatiegrootte</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Installatiegrootte berekenen (alle spellen)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Installatiegrootte berekenen (alleen ontbrekende gegevens)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Installatiegrootte</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Categorie Instellen...</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Stel Voltooiingstatus in</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Verwijderen</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Speel</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Installeer</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Spelinstellingen</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Details</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Deïnstalleer</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Open spel locatie</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Maak bureaublad snelkoppeling</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Open Handleiding</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Meer</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Beheerd door bibliotheek-plugin</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Het startproces van het spel wordt beheerd door de bibliotheekplug-in die verantwoordelijk is voor dit spel.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Er is geen relevante informatie over het spel '{0}' gevonden op de opgegeven pagina.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Tip: Je kan een geavanceerder metadata download proces gebruiken wanneer je een individueel spel bewerkt via de &quot;Bewerken&quot; menu optie.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Niet beschikbaar als sommige acties nog bezig zijn.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Beschrijvingstekst is HTML syntax sensitief</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Speltijd wordt opgenomen in seconden.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Installatiegrootte is aangegeven in bytes.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Datum van uitgave moet in 'jaar-maand-dag' datumnotatie. Maand en Dag kunnen weggelaten worden.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Waarden van 0 tot 100 of leeg voor geen score.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Playnite ontwikkeling wordt ondersteund door deze patrons en Ko-fi leden:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Code, lokalisatie en andere and other bijdragers in willekeurige volgorde:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Spelmonitoring annuleren?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Er wordt momenteel installatiemonitoring uitgevoerd. Wil je het proces annuleren en het spel terugbrengen naar de vorige staat?\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Spel executie monitoring wordt momenteel uitgevoerd. Wil je het proces annuleren en het spel terugbrengen naar de vorige staat?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Tijd Gespeeld</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Laatst Gespeeld</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}d {1}u {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}u {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minuten</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} seconden</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Niet Gespeeld</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Openen Desktop modus…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Openen volledig scherm modus…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Laden spel bibliotheek…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Installatiegrootte berekenen…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Installatiegrootte van {0} berekenen…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Kan script bestand niet installeren.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Script succesvol geïnstalleerd.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Installatiescript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Scriptfout</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Uitvoeren van extensie functie mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Open metadata map</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Berekenen</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Berekent automatisch de installatiegrootte met behulp van de Roms als die er zijn, of als het spel een installatiemap heeft</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} client is niet geïnstalleerd.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} client zal nu openen. Log in a.u.b. en sluit dan dit bericht.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Wachten op aanmelding van gebruiker, sluit dit alstublieft af wanneer je klaar bent…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Installatiemap van spel niet gevonden.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Ongeldige spel-actie configuratie.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Probleemoplossingen account sync</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Probleemoplossing</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Item hernoemen</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Nieuw item toevoegen</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Naam invoeren</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Nieuwe naam invoeren</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Minder dan een uur</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 tot 10 uur</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 tot 100 uur</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 tot 500 uur</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 tot 1000 uur</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite moet opnieuw worden opgestart om de installatie te voltooien. Wil je nu opnieuw opstarten?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Extensie is niet correct verpakt.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Thema is niet correct verpakt.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Extensie &quot;{0}&quot; kon niet correct geladen worden.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Kan &quot;{0}&quot; extensie niet laden; huidige versie van Playnite wordt niet ondersteund.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Thema &quot;{0}&quot; kon niet correct geladen worden.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Kan &quot;{0}&quot; thema niet laden; huidige versie van Playnite wordt niet ondersteund.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Extensie kon niet correct geladen worden.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Thema kon niet correct geladen worden.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Thema/Extensie gebruikt niet-ondersteunde API versie.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Installatie is gelukt.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Extensie installeren?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Algemeen</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Installeren van extensie &quot;{0}&quot; mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Extensie installeren mislukt.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Wilt u een nieuwe extensie installeren?\r\n\r\n{0}\r\nDoor {1}\r\nVersie {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Wilt u de extensie &quot;{0}&quot; updaten?\r\n\r\nHuidige versie: {1}\r\nNieuwe versie: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Thema installeren mislukt.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Wilt u een nieuw thema installeren?\r\n\r\n{0}\r\nDoor {1}\r\nVersie {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Wilt u thema &quot;{0}&quot; updaten?\r\n\r\nHuidige versie: {1}\r\nNieuwe versie: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Je staat op het punt Playnite te verlaten en naar de volgende webpagina te gaan met je standaard webbrowser. Wil je doorgaan?\r\n\r\n{0}\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">De geselecteerde afbeelding(en) zijn mogelijk te groot voor optimale prestaties. Het gebruik van zeer grote afbeeldingen kan leiden tot een slechtere UI-respons en meer geheugengebruik.\r\n\r\nMaximaal aanbevolen resoluties:\r\nPictogrammen: {0} megapixels\r\nOmslagen: {1} megapixels\r\nAchtergronden: {2} megapixels</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Performantie Waarschuwing</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Niet Opnieuw Weergeven</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Bestand met extensie {0} is niet compatibel.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Ongeschikte bestandsextensie </sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Het geselecteerde afbeeldingsbestand is mogelijk te groot voor optimale prestaties.\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Weet je zeker dat je het geselecteerde thema wilt verwijderen? Verwijdering wordt in de wachtrij geplaatst tot de volgende start van de toepassing.\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Ingebouwde thema's kunnen niet worden verwijderd.\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Dit thema ondersteunt deze versie van Playnite niet.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Weet u zeker dat u de geselecteerde extensie wilt verwijderen? Verwijdering wordt in de wachtrij geplaatst tot de volgende start van de toepassing.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Ingebouwde extensies kunnen niet worden verwijderd.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Deze extensie ondersteunt deze versie van Playnite niet.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Installatie map</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Gegevensmap</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Diagnostiek pakket genereren...</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Opladen diagnostiek pakket...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Bestand importeren</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Wat is dit?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Weet je zeker dat je dit wilt doen?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Totale speeltijd</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Gemiddelde speeltijd</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Hoogste Speeltijd</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Totale installatiegrootte</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Overzicht</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Zijbalk</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Toon in zijbalk</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Instellingen terugzetten</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Alle applicatie-instellingen zullen terug worden gezet naar hun standaardwaarde, met uitzondering van:\r\n- Database locatie\r\n- Import uitsluitingslijst\r\n- Extensie instellingen, inclusief bibliotheek-integraties\r\n\r\nDe applicatie moet opnieuw opgestart worden om het proces af te ronden. Wil je de instellingen terugzetten naar de standaardwaardes?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Voor ontwikkelaars</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Externe extensies</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Vul volledig pad naar map in.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Prestaties</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Nieuws</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Winkel pagina</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">De initiële installatie is niet voltooid. Playnite zal nu herstarten naar Desktop Mode om de procedure te voltooien.\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Onlangs Gespeeld</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favorieten</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Meest gespeeld</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Alle</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Er zijn filters toegepast.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Er zijn aanvullende filters toegepast.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Zoekresultaten voor:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Een item met dezelfde naam bestaat al.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Beperk de selectie tot de huidige filter</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Kies iets anders</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Uitbreidingen…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Geïnstalleerd</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Extensie instellingen</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Zoeken</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Updates</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Updates {0}</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Beheer van geïnstalleerde extensies en thema's, inclusief hun instellingen, is verhuisd naar een nieuw &quot;Add-ons&quot; menu.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Alle nu geïnstalleerde bibliotheek-integratie extensies kunnen hier geconfigureerd worden.\r\n\r\nAls je extra integraties wil installeren of verwijderen, gebruik dan de &quot;Add-ons&quot; optie vanuit het hoofdmenu.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Thema's Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Thema's Volledig Scherm</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Zoeken…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Add-on is niet te gebruiken met deze versie van Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Downloaden van add-on installatie pakket mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Downloaden van het installatiemanifest van de add-on is mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">De toepassing moet opnieuw starten om de nieuwe instellingen toe te passen.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Installatie van deze add-on is ingepland.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Installeer</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Opnieuw installeren</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Verwijder</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Reeds geïnstalleerd</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Geen nieuwe extensie updates gevonden.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Werk add-ons bij</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Changelog is niet beschikbaar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Ingepland voor installatie</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Download mislukt</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Licentie afgewezen</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Downloaden {0}</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Aan het zoeken naar add-on updates...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Op zoek naar programma-updates…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Eén of meerdere add-on updates zijn beschikbaar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Selecteer items om te updaten</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Extensie ontwikkelings-instantie</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} licentieovereenkomst</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Accepteer</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Weigeren</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Speel acties van de bibliotheek overnemen</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Actie selecteren</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Speeltijd volgmodus</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Trackingpad</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Initiële trackingvertraging</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Trackingfrequentie</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Link</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Bestand</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Script</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Standaard</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Proces</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Map</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Oorspronkelijk proces</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Procesnaam</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Log trace berichten</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">De volgende wijzigingen overschrijven data voor alle geselecteerde spellen!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Geen</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Uniform</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Alleen items</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Alleen start en eind</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Scrollgevoeligheid</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Vloeiend scrollen</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Animatiesnelheid</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Item verwijderen?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Weet je zeker dat je dit item wil verwijderen?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Toon knoppen op het top-paneel:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Algemene weergaveinstellingen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Groeperingsinstellingen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Sorteerinstellingen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Filter presets</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Plugin items positie</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Sectie scheidingslijn breedte</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Verhuis hoofdmenuknop naar de zijbalk</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Verkenningspaneel</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Kies een willekeurig spel</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Willekeurige spelkiezer bekijken</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Kies een willekeurig spel uit de zichtbare lijst</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Bewaar sorteer- en groeperingsinstellingen</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Toon als snelfilter in Fullscreen modus</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">In de afgelopen 7 dagen</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">In de afgelopen 31 dagen</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">In de afgelopen 365 dagen</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Meer dan 365 dagen geleden</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Configureer</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Voorkeursinstellingen opslaan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Minimaliseer na spel opstarten</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Minimaliseer Playnite nadat een spel opgestart wordt\r\n\r\nDit uitschakelen kan leiden tot problemen waarbij spellen geen invoer-focus krijgen bij het opstarten!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Lettertype grootte</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Klein lettertype grootte</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Ondersteuning voor spelcontroller</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Als dit uitgeschakeld is accepteert Playnite geen spelcontrollerinvoer.\r\n\r\nSchakel dit uit als je tools gebruikt die spelcontrollerinvoer vertalen naar muis- of toetsenbordinvoer en je dubbele invoer krijgt in Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Toon items in het hoofdmenu:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Omgekeerde X/A hoofdweergave knop binding</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Verwisselt de knoppen voor het starten van een spel en het tonen van de speldetailpagina in de hoofdweergave.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Verwissel bevestigings- en annulerings-knop</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Knoppen A/B omkeren voor bevestiging en annulering.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Alleen primaire controller</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Accepteer alleen inputs van primaire controller wanneer ingeschakeld.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Guide knop focust Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Interface volume</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Achtergrondvolume</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Dempen in de achtergrond</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Audio-interface initialiseren mislukt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Uitvoer API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API voor het uitvoeren van audio. Wijzigen als je problemen ondervindt met geluid.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Algemeen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Visueel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Audio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menu's</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Invoer</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} start...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} draait...</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Hoofdletters</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Spatiebalk</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Afbeelding rendering scaler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternatief</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Gebalanceerd</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Kwaliteit</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Kwaliteit:\r\nBeste beeldkwaliteit, traag, hoog geheugengebruik.\r\n\r\nGebalanceerd:\r\nGoede kwaliteit, snel, laag geheugengebruik.\r\n\r\nAlternatief:\r\nBetere kwaliteit, gemiddelde snelheid, laag geheugengebruik.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Selecteer bestand...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Selecteer map...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Opstartscript</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Hou er rekening mee dat zowel extensies als thema's in grote mate Playnite's prestaties, stabiliteit en veiligheid kunnen beïnvloeden.\r\n\r\nAls je problemen ervaart na het installeren van een thema of extensie, probeer die dan eerst uit te schakelen of te de-installeren om te kijken of dat de oorzaak is.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Kiezen bij opstarten</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Kiezen bij opstarten</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Ingebouwde profielen</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Ingebouwd profiel</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Aangepaste profielen</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Aangepast profiel</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Afgehandeld door een ingebouwd script</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Emulatorspecificatie</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Platformspecificatie</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Regiospecificatie</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Uitvoeren vóór het starten van de emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Uitvoeren nadat de emulator gestart is</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Uitvoeren na het afsluiten van de emulator</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Uitvoerbaar bestand van de emulator niet gevonden.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Emulatorspecificatie niet gevonden.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Emulator opstartscript niet gevonden.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Splitsen als aparte spellen</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Samenvoegen tot één spel</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Platform instellen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Regio instellen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Map scannen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Scan instellingen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Patronen uitsluiten van checksum-scan</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Bestanden die overeenkomen met de patronen zullen niet gescand worden op hun checksum en zullen gematcht worden op hun bestandsnaam. Zie emulator-hulppagina voor meer informatie.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Scan met emulator</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Naam is verplicht bij het opslaan van een nieuwe configuratie.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Emulator of emulatorprofiel is niet ingesteld.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Map om te scannen is niet opgegeven of bestaat niet.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Scan-configuratie is niet goed ingesteld.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Betrek bij bulk scan auto-scan</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Map scannen op emulators mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Map(pen) scannen op geëmuleerde spellen mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Geïmporteerde verbergen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Profielen om te importeren:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Auto-scan instellingen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Opslaan als auto-scan configuratie</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Slaat de configuratie op voor later gebruik bij een bibliotheekupdate. Opgeslagen configuraties kunnen beheerd worden via het &quot;Configureer Emulators&quot; menu.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Importeren via relatieve paden</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Indien mogelijk spelbestanden importeren met behulp van relatieve paden ten opzichte van Playnite's installatiemap of de emulator's installatiemap.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Submappen scannen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Scan in archieven</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Samenvoegen van gerelateerde bestanden</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Voeg gerelateerde spelbestanden samen, net als individuele spelschijven, onder één spel-invoer.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Scanner toevoegen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Opgeslagen scanner toevoegen</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Scan starten</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Voeg scanconfiguratie(s) met emulators toe om specifieke mappen te scannen. Zorg ervoor dat emulators goed geconfigureerd zijn voordat je spellen importeert (via het Bibliotheek -&gt; Configureer Emulators menu).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Standaardstatus die toegewezen wordt aan nieuwe spellen</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Status die toegewezen wordt aan spellen die voor het eerst gespeeld zijn</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Kon de Powershell script runtime niet initializeren. Als u Windows 7 gebruikt, probeer dan PowerShell 5.1 (opnieuw) te installeren om dit op te lossen.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Filter preset met de opgegeven naam bestaat al. Preset updaten met nieuwe instellingen?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Automatisch ontbrekende sorteernamen invullen voor spellen die in batch toegevoegd of bewerkt zijn</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">Als je een spel bewerkt, voeg dan spellen toe via een bibliotheek update, een scan van een emulator map of een normale map, vul automatisch het &quot;Sorteernaam&quot; veld in met een betere weergave van de naam van het spel. Bijvoorbeeld &quot;The Witcher 3&quot; krijgt een Sorteernaam van &quot;Witcher 03&quot;. Dit zal nooit een sorteernaam instellen die niet verschilt van de spelnaam, en het zal alleen automatisch sorteernamen bijwerken die leeg zijn.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Deze woorden zullen verwijderd worden van het begin van de automatisch ingevulde sorteernaam:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Gebruik dit voor het negeren van woorden aan het begin van een naam voor sorteerdoeleinden. De standaardwaarde is &quot;The&quot;, &quot;An&quot; en &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Vul Sorteernaam voor spellen zonder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Sortering</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Vullen Sorteernaam waardes…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Nahimic service is gedetecteerd op dit systeem. Van deze service is bekend dat hij rendering problemen bij Playnite (en andere apps) kan veroorzaken.\r\n\r\nAls je grafische corruptie of andere rendering problemen in Playnite ervaart, bevelen we aan deze service uit te zetten of Nahimic service compleet te de-installeren.\r\n\r\nMeer informatie is te vinden op https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite draait nu met administrator rechten. Dit is niet aanbevolen sinds dit ook verhoogde rechten geeft aan alle geïnstalleerde extensies en alle spellen/applicaties die vanuit Playnite gestart worden!\r\n\r\nMeer informatie op https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Toon waarschuwing als Playnite met administrator rechten draait</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Krijg de werkelijke grootte op de schijf bij het berekenen van de grootte van spellen</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Indien ingeschakeld, zijn scans langzamer en krijgen ze de werkelijke grootte die bestanden innemen op de schijf.\r\nIndien uitgeschakeld, zijn scans sneller en zal de grootte van de bestanden zelf worden gebruikt.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">De volgende extensie(s) zijn gerapporteerd als mogelijk problematisch, door grote stabiliteits- of prestatie-impact of beveiligingsproblemen. We raden sterk aan deze te verwijderen:\r\n\r\n{0}\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Online bestanden uitsluiten van scan</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Bestanden in cloud opslag worden niet gescand en geïmporteerd als deze niet lokaal beschikbaar zijn.\r\nAlleen ondersteund voor: Google Drive, DropBox, OneDrive </sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Scan met versimpelde methode zonder bestandsinhoud te bekijken</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Bestanden worden geïmporteerd met een minder accurate methode die geen bestandsinhoud op de lokale schijf vereist.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Op alle toepassen</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Installatiestatus overschrijven</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Wanneer ingesteld, negeert Playnite de installatiestatus (inclusief installatie directory) die is ingesteld door de integratieplugin die dit spel importeert.\r\n        \r\nDeze optie werkt mogelijk niet volledig met plugins die een specifieke game import methode gebruiken, tenzij ze ook rekening houden met deze overschrijving.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Alleen handmatig</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Eens per dag</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Eens per week</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Bij elke start</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Controleren op programma-updates</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Controleren op add-on updates</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Bibliotheken bijwerken</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Scan emulatiemappen</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Inclusief verborgen spellen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Velden bewerken</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Selecteer / Deselecteer alle</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Open</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Activeren</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Toewijzen</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Begin met typen om een spel te zoeken... [F1] voor hulp</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Starten met # toont een lijst met beschikbare commando's.\r\nStarten met / toont een lijst met beschikbare zoekaanbieders/plugins.\r\nTypt zoekwoord en eindigen met SPATIE schakelt direct naar die zoekopdracht.\r\n\r\nTAB: switch actie\r\nENTER: activeer geselecteerde actie\r\nSHIFT-ENTER: open item menu</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Inclusief gedeïnstalleerde spellen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Inclusief verborgen spellen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Niet geïnstalleerde spellen inbegrepen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Niet-geïnstalleerde spellen uitgesloten</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Inclusief verborgen spellen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Exclusief verborgen spellen</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Spelen of installeren</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Ga naar details</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Spelmenu</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Bewerk spel</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Open zoeken</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Zoekbalk</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Zoekknop</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Primaire spelactie</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Primaire spelactie</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F opent globale zoekopdracht in plaats van de focus op het zoekvak</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Spelfilter instellingen tussen zoeksessies opslaan</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Zoekmachines</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Standaard trefwoorden</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Aangepast trefwoord</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Systeemwijde snelkoppeling</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Zoeken in Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Extensie instelling</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Uitsluitingen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Uitgesloten bestanden ten opzichte van de scan map</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Uitgesloten mappen ten opzichte van de scan map</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Bestand toevoegen aan uitsluitingslijst</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Map toevoegen aan uitsluitingslijst</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Uitsluitingen kunnen alleen worden toegevoegd aan de configuraties van de opgeslagen scanner.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Uitsluitingen zijn toegevoegd aan de &quot;{0}&quot; scanner.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Platform overschrijven</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Wanneer ingesteld, zal scanner dit platform toewijzen aan alle spellen, en de automatisch gedetecteerde platformen overschrijven.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Opdrachten opnemen in standaard zoeken</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Indien uitgeschakeld, zullen commando's niet worden opgenomen in de standaard zoekopdracht totdat # prefix is gebruikt.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Fuzzy matching in naam filter gebruiken</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Wanneer ingeschakeld, zal de naam filter gelijk zijn aan de spelnamen zoals globale zoekopdrachten.\r\nStrikte matching kan op individuele gevallen worden afgedwongen door een filter met een !</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Velden die worden weergegeven voor spellen in zoekresultaten:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Verborgen Status</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Gegevens back-up geannuleerd</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Gegevens back-up mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Fout in data back-up</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Gegevens back-up bezig...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Data herstellen van back-up...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Gegevens herstellen van back-up mislukt.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Instellingen</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Bibliotheek</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Spelbibliotheekmedia</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Geïnstalleerde Extensies</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Extensiedata</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Geïnstalleerde Thema's</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Selecteer de data te herstellen vanuit het opgegeven back-upbestand.\r\n    \r\nPlaynite zal automatisch herstarten om de backup te herstellen.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Selecteer items om op te nemen in data backup. Applicatieinstellingen en gamebibliotheek zijn standaard inbegrepen.\r\n    \r\nPlaynite zal automatisch herstarten om het back-upproces te starten.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Automatische data-back-up</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Automatische back-up frequentie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Back-up map</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Roterende back-ups</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Aanvullende gegevens toevoegen:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Reservekopiemap moet worden ingesteld als automatische back-up is ingeschakeld.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Toon alleen meldingen voor patch releases</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Wanneer ingeschakeld, zullen alleen updates die beschikbaar zijn voor momenteel geïnstalleerde hoofdrelease resulteren in een update notificatie.\r\nNieuwe grote releases resulteren niet in een update notificatie.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Gebruik relatieve datums voor de afgelopen week</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Gebruik relatieve datums in &quot;Vandaag&quot;, &quot;gisteren&quot; etc. formaat als de datum minder dan een week oud is.\r\n    \r\nDe opgegeven datumnotatie zal worden gebruikt voor alle andere datums.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Webafbeelding zoeken</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Pictogramafbeelding zoekstring</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Zoekstring omslagfoto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Zoekstring voor achtergrondafbeelding</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Add-on informatie verkrijgen...</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Geen metadatabron beschikbaar</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Speel Actie instellingen</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Instellingen voor scanner gebruiken</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Selecteer profiel bij opstarten</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Selecteer emulator bij het opstarten</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automatisch</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Altijd aan</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Altijd uit</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Toegankelijkheid (schermlezer) ondersteuning</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Applicatie menu</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Spel menu</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Programma map</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Gebruikers data locatie</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Corruptie bibliotheekbestand is gedetecteerd, Playnite wordt nu afgesloten.\r\n    \r\nOpen het nieuwe probleem op Playnite's GitHub-pagina met een verzoek om corruptie in je bestanden op te lossen.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Wil je de wijzigingen opslaan?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Draagbare installatie</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Geen controllers gedetecteerd</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/no_NO.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Norsk</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Bytt språk</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Avslutt</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filter i bruk</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filter deaktivert</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Flere filtre</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtre</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Ugyldig data</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Lagre endringer?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Hjemmeside på www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Kildekode på GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Opprett diagnostikkpakke</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Send diagnoseinformasjon</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Om Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Laget av Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Tildel kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Velg kategorier</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Legg til kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">På - Tildel kategori\r\nAv - Fjern kategori\r\nUbestemt - Ingen endringer (ved redigering av flere spill)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Ingen kategori</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Ingen plattform</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Huff da! Noe gikk galt ...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">En uopprettelig feil har oppstått.\r\n\r\nHvis du vil hjelpe oss med å løse dette problemet, kan du kort beskrive handlingene som ble utført før krasjet, og deretter sende diagnoseinformasjon. Hvis du er tilkoblet internett, blir pakken lastet opp til Playnite-serveren for analyse.\r\n\r\nAlternativt kan du trykke på &quot;Rapporter krasj&quot;-knappen for å opprette en ny issue på GitHub og rapportere krasjet manuelt.\r\n\r\nTakk for hjelpen.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Utvidelsen &quot;{0}&quot; forårsaket en uopprettelig feil.\r\n\r\nVi anbefaler at du lagrer loggfilen og rapporterer problemet til utvikleren av utvidelsen. Hvis problemet fortsetter bør du deaktivere utvidelsen.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Utvidelsen&quot;{0}&quot; forårsaket en uopprettelig feil.\r\n\r\nVi anbefaler at du rapporterer problemet til utvikleren av utvidelsen. Hvis problemet fortsetter, deaktivere utvidelsen.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">En ukjent utvidelse eller et ukjent tema forårsaket en uopprettelig feil.\r\n\r\nVi anbefaler at du deaktiverer tredjepartstillegg etter tur for å isolere den som skaper problemer, og rapporterer feilen til utvikleren av tillegget.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Uopprettelig feil oppstod.\r\n\r\nHvis du vil hjelpe oss med å løse dette problemet, gjerne send oss diagnoseinformasjon. Takk.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Deaktiver utvidelse</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Lagre loggfil</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Send diagnoseinformasjon</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Rapporter krasj</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Restart Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Restart i trygg modus</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Deaktivering av alle tredjepartsutvidelser og bruker av standardtema.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Lukk Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Utførte handlinger før krasjet (på Engelsk):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Biblioteksbehandler</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Fjern spill?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Kan ikke fjerne — Spillet eller installatøren kjører. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Kan ikke avinstallere - Spill kjører.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Er du sikker på at du vil fjerne {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Er du sikker på at du vil fjerne {0} spill?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Er du sikker på at du vil fjerne {0}?\r\n\r\nVed å velge &quot;legg til ekskluderingsliste&quot;, forhindrer du spillet i å bli importert igjen neste gang biblioteket oppdateres.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Er du sikker på at du vil fjerne {0} spill?\r\n\r\nVelger du alternativet &quot;legg til ekskluderingsliste&quot;, blir ikke spillene importert på nytt neste gang biblioteket oppdateres.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Er du sikker på at du vil fjerne {0} oppføringer som for øyeblikket ikke er i bruk?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Ingen ubrukte felt ble funnet.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Ja (legg til ekskluderingslisten)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Det er ulagrede endringer i denne seksjonen</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Oppdaterer formatet til spillbiblioteket…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Databaseoppdatering feilet.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Kan ikke oppdatere spillbibliotek. {0} MB av tilgjengelig plass er nødvendig.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Spillfeil</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Kan ikke starte spill. '{0}' ble ikke funnet i databasen.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Kan ikke starte spill: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Kan ikke starte handling: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Kan ikke åpne spillokasjon: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Kunne ikke finne spillinstallasjonsstørrelse: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Feil ved skanning av installasjonsstørrelse</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Det oppstod {0} feil under installasjonsstørrelse skanning</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Opprettelse av snarvei feilet: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Kunne ikke åpne manualen: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Kan ikke installere spill: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Kan ikke avinstallere spill: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Ingen gyldige spilloppstartshandlinger ble funnet. Når du bruker emulatorhandlinger, må du sørge for at plattformdefinisjonene samsvarer mellom spillet og emulatorkonfigurasjonen.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Installasjonsimplementering er ikke tilgjengelig.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Bibliotekutvidelsen som er ansvarlig for dette spillet er deaktivert eller ikke installert.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Offisiell metadatanedlastning er ikke tilgjengelig.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Inget spill er valgt.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Utføringen av spillets skripthandling mislyktes.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Kjøring av applikasjonsskript mislyktes.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Utføringen av global skripthandling mislyktes.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Kjøring av emulatorskript mislyktes.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Utføringen av spillets skripthandling mislyktes.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 eller nyere er ikke installert.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Kunne ikke avgjøre hvordan spillet skal startes.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Aktivert</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Deaktivert</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Fjern</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Fjern ubrukte oppføringer</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Endre navn</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopier</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Legg til</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Standard ikon</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Standard coverbilde</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Standard bakgrunnsbilde</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Fullfør</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Neste</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Tilbake</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">FERDIG</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">TILBAKE</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">FJERN</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Tøm</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Avvis</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Avvis alle</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importer</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Navn</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Forfatter</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Serier</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versjon</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Sist spilt</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Mest spilte</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Antall spilløkter</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Installasjonsstørrelse</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Mappe</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notater</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Lagt til</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Dato lagt til</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Redigert</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Endringsdato</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Nettside</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Bane</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Lagre</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Lukk</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Avbryt</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Bekreft</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Nullstill</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Ja</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Nei</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Velkommen</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Lokal bruker</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Generelt</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Media</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Lenker</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Installasjon</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Handlinger</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Laster ned …</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Laster ned media …</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Laster …</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Type</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profiler</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Fjern</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Last ned</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Søk</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Oppløsning:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Alle</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Forstørr</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Listevisning</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Omslag</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Rutenettvisning</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Detaljert visning</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Egendefinert</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Spesiell takk til</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Lisens</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Bidragsytere</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Lukker Playnite …</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">I dag</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">I går</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Mandag</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Tirsdag</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Onsdag</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Torsdag</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Fredag</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Lørdag</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Søndag</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Siste uke</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Siste måned</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Siste år</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Mer enn ett år siden</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 til 100 MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100 MB til 1 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1 GB til 5 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5 GB til 10 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10 GB til 20 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20 GB til 40 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40 GB til 100 GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100 GB eller mer</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Importeringen var vellykket.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Alle spill</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Spill-id</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Database-id</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Forhåndsinnstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Kolonne</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Kolonner</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Rad</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Rader</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Kunne ikke hente ikon fra spill-handling. Ingen handling er tilgjengelig for filtypen.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Last bare ned manglende metadata</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Aktivering av dette alternativet vil hoppe over nedlasting av metadata for datafelt som allerede har informasjon.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Spillvalg</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Velg hvilke spill som skal oppdateres med nye metadata:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Alle spill</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Alle filtrerte spill</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Kun valgte spill</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Ingen metadatafelt valgt</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Ingen metadatafelt er valgt for nedlasting. Velg minst ett, og aktiver minst en metadata-leverandør for feltet.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Offisiell butikk</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Velg hvilke felt som skal fylles automatisk av Playnite, og hvilke kilder data skal hentes fra.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Klikk gjerne på logoen over og bidra med oppdateringer til igdb.com-databasen, slik at dataene Playnite bruker forbedres.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Laster ned metadata …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importerer installerte spill …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importerer {0} spill …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importerer emulerte spill fra {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Laster ned biblioteksoppdateringer …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Analyserer størrelse på spill i biblioteket…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Finner størrelsen til importerte spill …</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Biblioteksoppdatering vellykket</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Frigir ressurser …</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Konfigurasjon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Innstillinger …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Plattformer og emulatorer</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Konfigurer emulatorer …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Biblioteksbehandler …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Verktøy</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Last ned metadata …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Programvareverktøy …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Konfigurer integrasjoner …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Åpne tredjepartsklient</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Tredjepartsklienter</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Oppdater spillbibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Avbryt biblioteksoppdatering</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Oppdater emuleringsmapper</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Legg til spill</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manuelt …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Gjennomsøk automatisk …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emulert spill …</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store-applikasjon…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Om Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Gi tilbakemelding</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Bytt til fullskjermmodus</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Lenker</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Hjelp</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Støtt på Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Gi din støtte via Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Brukermanualer</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK-dokumentasjon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Systemomstart</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Slå av systemet</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Suspender systemet</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Dvalemodus</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Lås systemet</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Logg ut bruker</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Velg et tilfeldig spill</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Spillfelt som vises i detaljpanelet:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Gjenstandsmellomrom</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Tegn rutenettbakgrunn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Grensebredde til rutenettgjenstander</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Kilde for manglende spill-ikon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Kilde for manglende spillomslag</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Manglende bakgrunnskilde for spillet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Vertikal avstand til spilldetaljer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Detaljkolonnens posisjon i rutenettvisning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Spillistens posisjon i detaljvisning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Tegn separator mellom panelene</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Bildehøyde for spillomslag</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Spilllistens ikonhøyde</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Applikasjonsfont</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Font med fast bredde</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Filtrer panelets plassering</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Utforskerpanelets posisjon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Gjengivelse av omslagskunst</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Målformat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Følgende alternativer påvirker også gjengivelse i fullskjermmodus!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Strekkmodus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD-boks</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Kvadrat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam-banner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Vertikalt omslag fra Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">*Krever omstart</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Innstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Generelt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Toppanel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Utseende</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Spilldetaljer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Utforming</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Avansert</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Fullskjerm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Inndata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Ytelse</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Oppdaterer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Søk</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Sikkerhetskopier</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Sikkerhetskopier bibliotekdata</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Gjenopprett sikkerhetskopi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importer endringer i biblioteket automatisk</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Ugyldig plass for databasefil, du må oppgi en gyldig filbane.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Kontonavnet kan ikke være tomt.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Last ned metadata etter importering av spill</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Start Playnite minimert</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Kjør Playnite når du starter datamaskinen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Forbli lukket i systemstatusfeltet ved oppstart</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Kunne ikke sette Playnite til å starte når datamaskinen starter.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Start i fullskjermmodus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asynkron innlasting av bilder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Gir jevnere rulling i spillister i bytte mot tregere innlasting av bilder.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Vis spillnavn hvis omslagskunst mangler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Vis spillnavn i rutenettvisning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Mørklegg avinstallerte spill</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Vis spillikoner på detaljvisningslisten</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Vis antall gjenstander i gruppebeskrivelser</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Vis bare tildelte felt i filter- og utforskerpaneler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Deaktiver maskinvareakselerasjon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Brukes når du opplever hakking eller lignende problemer med brukergrensesnittet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Vis skjulte spill i hurtiglister</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Påvirker &quot;jumplisten&quot; og skuffmenyer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Antall hurtigstart-elementer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Bruk bakgrunnsbilde fra spillet som vindusbakgrunn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Uklar bakgrunn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Høy kvalitet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Mørk bakgrunn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Vis i rutenettvisning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Temaprofil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Fullskjermstema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Fullskjermtemaprofil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Databaseplassering</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Innloggingsstatus:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite-innstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Tøm nettbuffer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Kan løse problemer som oppstår når du kobler kontoer.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Vis ikon i systemstatusfeltet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimer Playnite til systemstatusfeltet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimer Playnite til systemstatusfeltet når programvinduet lukkes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Når spillet starter:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Etter at spillet lukkes:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Formater spilletid for å angi antall dager spilt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Datoformater:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Dette vil logge deg ut av alle tilknyttede tjenester. Restart av applikasjon er nødvendig. Vil du fortsette?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Tøm hurtigminne?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Det kreves omstart av Playnite for å bruke nytt tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Hent flere temaer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Lag nytt tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Hent flere utvidelser</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Lag ny utvidelse</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Hjelp oss med å oversette Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite må startes på nytt for å kunne bruke nye innstillinger. Start på nytt nå?\r\n\r\nOmstart vil avbryte aktive oppgaver (nedlastinger) som pågår.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Start Playnite på nytt?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite flytter ikke bibliotekfiler automatisk, du må flytte / kopiere dem før stedet endres. Hvis det ikke er noe bibliotek på målstedet, opprettes et nytt.\r\n\r\nNy databaseplassering vil bare bli brukt etter at Playnite startes på nytt. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Spilletid blir ikke registrert hvis &quot;Lukk&quot; -handling er angitt.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Antall rader</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Antall kolonner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Antall detaljvisningsrader</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Vis bakgrunnsbilde på hovedskjermen</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Gjelder ikke retrospektivt på eksisterende spill uten å laste ned metadata på nytt.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importer spilletid for spill i biblioteket:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Angir når Playnite skal importere spilletiden som rapporteres av biblioteksutvidelser for spill i Playnite-databasen. Støtte i biblioteksutvidelsen som er ansvarlig for å håndtere spillet er nødvendig for å kunne bruke denne funksjonen.\r\n\r\nAlltid: Importerer spilletid for nylig importerte og eksisterende spill i Playnite-databasen.\r\nBare for nylig importerte spill: Importer kun spilletid for nylig importerte spill.\r\nAldri: Importer aldri spilletid under noen omstendigheter.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Alltid</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Bare for nylig importerte spill</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Aldri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Aktiver kontrollerstøtte i skrivebordsmodus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Guide-knappen åpner fullskjermmodus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Automatiske nedlastingsinnstillinger for metadata til nylig importerte spill.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Skjermvalg</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Bruk alltid primærskjerm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Vis spilltitler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Vis batteristatus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Vis batteriprosent</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Vis klokke</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Skjul musepekeren</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Kun installert i hurtigfilter</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Kontrollertype</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Visning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Vannrett rullefelt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Velg en av underseksjonene</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Ingen innstillinger tilgjengelig</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Kan ikke laste inn innstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Disse skriptene blir utført for hvert spill på biblioteket. Individuelle skript kan tilordnes hvert spill separat når du redigerer spilldetaljer.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animer bakgrunnsoverganger</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Skriftstørrelser</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Auto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Med anti-aliasing</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Gråtone</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideell</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Skjerm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Tekstformateringsmodus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Tekstopptegningsmodus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Metoder for tekstgjengivelse og -formatering gjelder for øyeblikket ikke for spillenes beskrivelsestekst.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Last inn bakgrunnsbilder på forhånd</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Om denne aktiveres, vil Playnite laste ned bakgrunnbilder når metadata lastes ned, noe som vil kreve mer lagringsplass, men sikre at bakgrunnsbilder er tilgjengelig uten internettilkobling.\r\n\r\nOm den deaktiveres, blir bakgrunnsbilder først lastet ned når de trengs, noe som sparer plass, men som samtidig kan resultere i en forsinkelse før bakgrunnsbilder vises og at noen bilder ikke vil være tilgjengelig uten internettilkobling.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Lukk tredjepartsklient automatisk etter at spillet avsluttes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Avslutningsforsinkelse for klient (i sekunder)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Ikke lukk etter spilleøkter kortere enn (i sekunder)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Lukk følgende klienter automatisk:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Lukk klienter automatisk</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importer ekskluderingsliste</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Vis advarsel når for store spillmedier tildeles</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Åpne katalog-kommando</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Foretrukket aldersgrenseorganisasjon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Oppdater størrelsen til spill ved biblioteksoppdatering</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Analyser og oppdater installasjonsstørrelsen for spill hvis det oppdages at filer er endret siden forrige skanning</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Ingen</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Fyll</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Bevar forhold</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Fyll men bevar forhold</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Venstre</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Høyre</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Topp</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Bunn</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Importeringsfeil</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Godkjennelse er påkrevd</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Autentisering mislyktes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Alternativ rendering-modus for web view</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Bruk ved problemer med web view, som for eksempel i autentiseringsvinduer for integrasjoner.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Delvis lasting av store spillbeskrivelser</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Store beskrivelser kan gi merkbare forsinkelser ved valg av spill.\r\n\r\nNår dette valget er aktivert, vil bare en del av beskrivelsen begynne å lastes inn med mulighet for å laste resten på etterspørsel.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Importer metadata</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Last ned metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Angi at valgt konfigurasjon skal brukes til fremtidige nedlastinger av metadata.\r\nKan også endres i applikasjonsinnstillingene.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Veiviser for emulering</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Denne veiviseren vil lede deg gjennom prosessen med å laste ned og importere konsollemulatorer og importere emulerte spill.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Husk at du alltid kan legge til flere emulatorer og/eller spill senere via hovedmenyen (under &quot;Bibliotek&quot;-menyen for emulatorinnstillinger og &quot;Legg til spill&quot;-menyen for emulerte spill).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Nedenfor ser du en liste over emulatorene Playnite kan gjenkjenne og konfigurere automatisk. Du kan laste ned emulatorinstallasjonsprogrammer fra deres respektive nettsider. Når de er installert (manuelt), kan du importere dem ved hjelp av emulatorkonfigurasjonsvinduet.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Du kan importere alle emulatorer som er installert på din PC ved å trykke på &quot;Automatisk gjenkjenning fra mappe …&quot; -knappen. Playnite søker i valgt mappe etter alle kjente emulatorer og gir mulighet til å importere dem. Du kan importere fra flere mapper ved å bruke nevnte knapp flere ganger. Emulatorer vil bli lagt til nederst i gjeldende liste.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Du kan importere spill ved å trykke på &quot;Skann mappe ved hjelp av Emulator&quot; -knappen. Valg av rett emulator vil fortelle Playnite hvilke filtyper som skal skannes og importeres. Du kan importere fra flere mapper ved å bruke nevnte knapp flere ganger. Spill vil bli lagt til nederst i gjeldende liste.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Ingen emulatorer er valgt for import. Du vil ikke kunne importere emulerte spill automatisk uten å konfigurere emulatorer først. Er du sikker på at du vil fortsette, og avslutte importprosessen?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Det er ingen emulatorer konfigurert i Playnite. Du kan ikke importere spill uten å konfigurere emulator først og velge passende filtyper. Vil du legge til noen emulatorer nå?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Skann mappe ved hjelp av Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Velg filer</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Automatisk gjenkjenning fra mappe …</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Konfigurer emulatorer …</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Gjennomsøker …</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Søker {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Førstegangs konfigurering</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Denne veiviseren vil hjelpe deg gjennom den automatiske prosessen for importering og konfigurasjon av eksterne spillbiblioteker. Playnite kan automatisk importere spill fra ulike spilltjenester som Steam eller GOG, og holde biblioteket ditt oppdatert ved å oppdatere det automatisk ved oppstart av applikasjonen.\r\n        \r\nHusk at du alltid kan legge til et hvilket som helst spill fra en hvilken som helst plattform manuelt fra hovedmenyen, ved å klikke på 'Playnite' -knappen.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Biblioteksintegrering</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Importer spill automatisk fra tjenestene nedenfor. Eventuelle senere spillendringer (installasjonsstatus) blir automatisk oppdatert ved oppstart av Playnite eller når oppdatering utløses manuelt. Valgte innstillinger påvirker innledende og all påfølgende import.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Konfigurasjonen er fullført</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Det første oppsettet er fullført. Husk at du kan endre alle innstillinger senere i 'Innstillinger' -menyen.\r\n\r\nDu kan også legge til et hvilket som helst annet spill senere ved å klikke på Playnite-logo-menyen.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Kunne ikke laste ned en eller flere utvidelser.\r\n\r\nDu kan prøve å laste ned integrasjoner på nytt fra utvidelsesmenyen etter at førstekjøringsveiviseren er ferdig.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Laster ned integrasjonen {0} …</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Laster ned liste over anbefalte integrasjoner …</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Kunne ikke laste ned liste over anbefalte integrasjoner. Du kan prøve å laste ned integrasjoner senere fra tilleggsmenyen.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Konfigurer plattformer og emulatorer</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Konfigurer emulatorer</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Plattformer</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Plattform</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulatorer</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Legg til plattform</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Velg ikon</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Velg omslag</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Velg bilde</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Velg gjenstand</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Velg bakgrunn</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Velg fil</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Velg URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Legg til emulator</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Støttede plattform(er)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Vil du lagre plattformendringer?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Vil du lagre emulatorendringer?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Kjørbar fil</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumenter</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Arbeidsmappe</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Filtyper som støttes</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importer emulatorer …</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Last ned emulatorer …</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Last inn argumenter forhåndsinnstilt fra kjent emulatorprofil</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Er du sikker på at du vil fjerne emulatoren {0}?\r\nDen brukes for øyeblikket av {1} spill.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Er du sikker på at du vil fjerne plattformen {0}?\r\nDen brukes for øyeblikket av {1} spill og {2} emulator(er).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Hjelp til innstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sorter etter</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Sorteringsretning</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Grupper etter</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Stigende</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Synkende</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Ikke grupper</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Sorter etter Bibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Grupper etter kategori</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Grupper etter plattform</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Visningstype</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Vis</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Utforskerkolonne</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Filterkolonne</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ikon</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Biblioteksikon</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Omslagsbilde</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Bakgrunnsbilde</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Sorteringsnavn</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Bibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manual</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Navn</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Lagringsstasjon</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Kontonavn</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Plattform</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Sjanger</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Utgivelsesdato</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Lanseringsår</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Utvikler</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Stikkord</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Utgiver</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Installasjonsstatus</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Bruk alle filtre</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Hvis denne aktiveres, vil kun spill som passer med alle filtre bli inkludert i visningen.\r\nVed deaktivering vil alle spill som passer med et hvilket som helst aktivt filter bli inkludert i visningen.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Installert</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Installert</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Ikke installert</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Skjult</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favoritt</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Aktiver HDR-støtte</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Når dette valget er aktivert, blir HDR aktivert på hovedskjermen før spill starter.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Merk at HDR ikke støttes på din hovedskjerm.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Sist spilt</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Beskrivelse</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Installasjonsmappe</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Omslagsbilde</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Lenker</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Bilde-, ROM- eller ISO-filbane</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Sjanger</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Sjangere</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Selskap</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Selskaper</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Utvikler</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Utviklere</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Utgiver</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Utgivere</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategorier</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Stikkord</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Stikkord</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Funksjon</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Funksjoner</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Aldersgrense</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Aldersgrense</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Region</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regioner</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Kilde</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Kilder</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Siste aktivitet</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Databasefeil</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Åpning av biblioteksdatabasen mislyktes.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Databasen er ikke åpnet.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Kan ikke få tilgang til bibliotekdatabasen. Filen &quot;{0}&quot; brukes av en annen prosess, eller den er utilgjengelig.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Kunne ikke lage diagnosepakke.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Kunne ikke laste opp diagnosepakke automatisk.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Diagnostisk informasjon ble sendt.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Diagnostikkpakke ble opprettet og lastet opp.\r\nVennligst legg ved følgende ID til krasjrapporten din:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Kunne ikke importere spill fra {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Kunne ikke importere emulerte spill fra {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Kan ikke søke etter spill basert på valgt emulatorprofil. Profilen inneholder ingen filutvidelser eller plattformer.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite klarte ikke å starte. Lukk Playnite-prosesser som allerede kjører, og prøv igjen.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Kunne ikke bruke temaet &quot;{0}&quot;, fargeprofil &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Kan ikke åpne linken. URL har ikke et gyldig format.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Kunne ikke starte applikasjonen.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Kan ikke initialisere web-visningskomponenten. Playnite kan ikke fortsette oppstartsprosessen.\r\n\r\nMer informasjon er tilgjengelig på https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Kan ikke importere emulatorer på grunn av manglende eller ødelagt definisjonsfil.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Kunne ikke utføre menyhandling.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Rediger spilldetaljer</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Bilde-URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Legg til lenke</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Legg til ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Lagre endringer</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Gjennomfør endringene i aktiverte felt for spill som redigeres.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Legg til handling</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Slett handling</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Fjern spillhandling</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Legg til spill</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Søk gjennom mappe …</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Oppdag installert</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Bla …</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Åpne Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Profilinnstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Spillnavn kan ikke være tomt.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Sporingsmappe for spillhandling kan ikke være tom</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Spillnavn kan ikke være tomt før du søker i metadata.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Ugyldig spilldata</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Angi gyldig nettadresse som starter med http:// eller https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Velg URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Kunne ikke laste ned metadata: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Feil ved nedlasting</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Fjern filtre</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Privat konto</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Offentlig konto</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API-nøkkel</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Oppstartsfeil</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Temafeil</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Fjern alt</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Installerer</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Avinstallerer</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Starter</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Kjører</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Ugyldig URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Gjør ingenting</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimer</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Gjenopprett vindu</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Gjenopprett vinduet kun ved oppstart fra brukergrensesnittet</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Lukk</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Endre</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Avansert</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Aldri</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Fullføringsstatus</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Fullføringsstatuser</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Brukerpoeng</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Kritikerpoeng</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Samfunnspoeng</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Spillskript</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Applikasjonsskript</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Skript</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Utvidelser</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Metadatakilder</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Tilleggsfunksjoner</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Tilleggsfunksjons-ID</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Oppdater skript</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Interaktivt SDK-PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Alle skriptene ble lastet på nytt.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Ingen spill funnet for spesifiserte søke- og filterkriterier</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Ingen elementer funnet</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Bytt til skrivebordmodus</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Lukk Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Biblioteker</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Oppdater alle</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Laget av:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versjon:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Oppdatert:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Bibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistikk</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Alle</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Ingen</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Varslinger</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Bredde</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Høyde</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Størrelse</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Liten</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Stor</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Større</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Størst</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Standard</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Velg</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Velg alle</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Opphev alle valg</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Først</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Tilfeldig</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Brukervalg</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Last inn flere</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Gjennomsiktig</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Fold sammen</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Utvid</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Fold sammen alle</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Utvid alle</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Andre</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Temaer</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Emulator-argumenter</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Innebygde argumenter</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Tilpassede argumenter</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Ytterligere emulator-argumenter</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Overstyr emulator-argumenter</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Spillhandling</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Velg metadata som skal importeres</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Velg spill som skal importeres</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Metadatasøk</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Oppdatering er tilgjengelig</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Endringer siden siste oppdatering</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Last ned og installer oppdatering</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Se etter oppdateringer</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Oppdateringsfeil</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Oppdateringssjekk mislyktes.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Ingen ny versjon funnet. Du er oppdatert.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Kunne ikke laste ned og installere oppdatering.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">En bakgrunnsprosess pågår. Ønsker du å stoppe den og gjennomføre oppdatering?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">En bakgrunnsprosess pågår. Ønsker du å stoppe den og lukke Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">En bakgrunnsprosess pågår. Bytte av modus vil avbryte prosessen. Ønsker du likevel å bytte?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">En oppdatering for Playnite er tilgjengelig</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Last inn temaliste på nytt</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Bruk valgte tema</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Se på filendringer</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Bruk tema automatisk når kildefilen endres</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Skriptkjøringsmiljø</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Skript som skal utføres før du starter et spill</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Skript som skal utføres etter du avslutter et spill</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Skript som skal utføres etter at et spill er startet</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Kjør ved programstart</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Kjør ved programavslutning</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Skript som kjøres før spillstart</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Skript som kjøres etter oppstart</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Skript som kjøres etter avslutning</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Utfør globalt skript</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Globalt</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrert</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Gjeldende</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Ny</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Test skript</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Vis kun valgte elementer.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Lagre som standard</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Legg til i favoritter</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Fjern fra favoritter</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Skjul dette spillet</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Fjern fra skjult</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Aktiver HDR-støtte</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Deaktiver HDR-støtte</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Rediger …</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Beregn installasjonsstørrelse</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Beregn installasjonsstørrelse (alle spill)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Beregn installasjonensstørrelse (kun manglende data)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Installasjonsstørrelse</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Velg kategori …</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Velg fullføringsstatus</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Fjern</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Spill</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Installer</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Spillalternativer</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Detaljer</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Avinstaller</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Åpne installasjonssted</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Lag skrivebordssnarvei</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Åpne manual</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Mer</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Administreres av biblioteksutvidelsen</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Spillets startprosess vil bli administrert av biblioteksutvidelsen som er ansvarlig for dette spillet.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Ingen relevant informasjon om «{0}» - spillet er funnet på den angitte siden.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Tips: Du kan bruke en mer avansert nedlastingsprosess for metadata når du redigerer hvert enkelt spill via menyen &quot;Rediger&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Ikke tilgjengelig mens noen handlinger pågår.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Beskrivelsestekst er HTML-syntaksfølsom</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Spilletiden registreres i sekunder.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Installeringsstørrelse blir angitt i bytes</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Lanseringsdato må velges med &quot;år-måned-dag&quot;-format. Måned og dag kan utelates.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Verdier fra 0 til 100, eller tom for ingen poeng.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Utviklingen av Playnite støttes av disse Patreon-brukerne:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Bidragsytere til koding, lokalisering og annet i tilfeldig rekkefølge:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Vil du avbryte spillovervåking?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Installasjonsovervåking kjører for øyeblikket. Vil du avbryte prosessen og returnere spillet til sin tidligere tilstand?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Spillutførelsesovervåking kjører for øyeblikket. Vil du avbryte prosessen og returnere spillet til sin tidligere tilstand?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Spilletid</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Sist spilt</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}d {1}t {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}t {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minutter</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} sekunder</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Ikke spilt</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Åpner skrivebordsmodus …</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Åpner fullskjermmodus …</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Laster inn spillbibliotek …</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Beregner installasjonsstørrelse…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Beregner installasjonsstørrelse for {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Kunne ikke installere skriptfilen.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Skriptet ble installert.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Installer skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Skriptfeil</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Kunne ikke utføre utvidelsesfunksjonen.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Åpne metadatamappe</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Beregn</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Beregn installasjonsstørrelsen automatisk ved hjelp av rom-fil dersom spillet har en, eller installasjonsmappe dersom en slik er angitt.</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0}-klient er ikke installert.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0}-klienten vil nå åpnes. Vennligst logg inn, og lukk deretter denne meldingen.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Venter på at brukeren skal logge inn. Vennligst lukk dette vinduet når du er ferdig …</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Spillets installasjonskatalog ikke funnet.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Ugyldig spillhandlingskonfigurasjon.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Feilsøking for kontosynkroniseringsproblemer</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Feilsøking av problemer</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Gi nytt navn til gjenstand</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Legg til ny gjenstand</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Angi navn</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Angi nytt navn</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Mindre enn 1 time</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 til 10 timer</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 til 100 timer</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 til 500 timer</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 til 1000 timer</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">\r\nPlaynite må startes på nytt for å fullføre installasjonen. Vil du starte på nytt nå?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Utvidelse er ikke pakket ordentlig.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Tema er ikke pakket ordentlig.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Utvidelsen &quot;{0}&quot; lastet ikke inn riktig.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Kan ikke laste utvidelsen &quot;{0}&quot;. Denne versjonen av Playnite er ikke støttet.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Temaet &quot;{0}&quot; lastet ikke inn riktig.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Kan ikke laste inn temaet &quot;{0}&quot;. Denne versjonen av Playnite er ikke støttet.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Utvidelsen lastet ikke inn riktig.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Temaet lastet ikke inn riktig.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Tema eller utvidelse bruker ikke-støttet API-versjon.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Installasjonen var vellykket.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Installér utvidelsen?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Generelt</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Installasjon av utvidelsen &quot;{0}&quot; mislyktes.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Kunne ikke installere utvidelsen.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Vil du installere en ny utvidelse?\r\n\r\n{0}\r\nAv {1}\r\nVersjon {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Vil du oppdatere utvidelsen &quot;{0}&quot;?\r\n\r\nNåværende versjon: {1}\r\nNy versjon: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Kunne ikke installere tema.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Vil du installere et nytt tema?\r\n\r\n{0}\r\nAv {1}\r\nVersjon {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Vil du oppdatere temaet &quot;{0}&quot;?\r\n\r\nNåværende versjon: {1}\r\nNy versjon: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Du er i ferd med å forlate Playnite, og navigere til følgende webside ved hjelp av din standardnettleser. Vil du fortsette?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Valgte bilde(r) er for store til å gi optimal ytelse. Bruk av veldig store bilder kan føre til betydelig dårligere brukergrensesnittresponsivitet og økt minnebruk.\r\n\r\nMaksimale anbefalte størrelser:\r\nIkoner: {0} megapiksler\r\nOmslag: {1} megapiksler\r\nBakgrunner: {2} megapiksler\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Ytelsesadvarsel</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Ikke vis igjen</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Fil med filendelsen {0} er ikke kompatibel.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Inkompatibel filendelse</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Den valgte bildefilen kan være for stor til å gi optimal ytelse.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Er du sikker på at du vil avinstallere valgt tema? Avinstallering vil stå i kø til neste applikasjonsstart.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Innebygde temaer kan ikke avinstalleres.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Dette temaet støtter ikke denne versjonen av Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Er du sikker på at du vil avinstallere valgte utvidelse? Avinstallering vil stå i kø til neste applikasjonsstart.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Innebygde utvidelser kan ikke avinstalleres.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Denne utvidelse støtter ikke denne versjonen av Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Installasjonskatalog</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Dataområde</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">\r\nGenererer diagnostikkpakke …</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Laster opp diagnostikkpakke …</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Importer fil …</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Hva er dette?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Er du sikker på at du vil gjøre dette?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Total spilletid</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Gjennomsnittlig spilletid</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Mest spilt</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Total installasjonsstørrelse</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Oversikt</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Sidepanel</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Vis i sidestolpe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Tilbakestill innstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Alle programinnstillinger vil bli tilbakestilt til standardverdier, med unntak av :\r\n- Databaselokasjon\r\n- Importekskluderingsliste\r\n- Utvidelsesinnstillinger, inkludert bibliotekintegrasjoner\r\n    \r\nOmstart av programmet er nødvendig for å fullføre prosessen. Ønsker du å tilbakestille innstillingene?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">For utviklere</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Eksterne utvidelser</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Fyll inn komplett mappesti.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Prestasjoner</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Nyheter</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Butikkside</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Første gangs oppsett er ikke fullført. Playnite vil nå restarte til skrivebordsmodus for å fullføre prosessen.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Nylig spilt</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favoritter</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Mest spilt</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Alle</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Filtre er i bruk.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Ytterligere filtre er i bruk.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Søkeresultater for:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">En gjenstand med samme navn finnes fra før.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Begrens valget til gjeldende filter</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Velg en annen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Tillegg …</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Installert</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Utvidelsesinnstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Bla gjennom</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Oppdateringer</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Oppdateringer ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Administrering av installerte utvidelser og temaer, inkludert deres innstillinger, er flyttet til en ny &quot;Tillegg-&quot;meny.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Alle installerte biblioteksintegrasjonsutvidelser kan konfigureres der.\r\n\r\nHvis du vil installere eller avinstallere ytterligere integrasjoner, kan du bruke &quot;Tillegg&quot;-valget i hovedmenyen.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Temaer skrivebord</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Temaer fullskjerm</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Søker …</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Tillegg er ikke kompatibelt med denne versjonen av Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Kunne inn laste ned installasjonspakke for tillegg.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Kunne ikke last ned installasjonsmanifest for tillegg.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Omstart av programmet er påkrevd for at nye innstillinger skal tre i kraft.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Dette tillegget er satt i kø for installasjon.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Installer</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Avinstaller</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Allerede installert</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Ingen nye oppdateringer for utvidelser er funnet.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Oppdater tillegg.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Endringslogg er ikke tilgjengelig.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Satt i kø for installasjon.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Nedlasting mislyktes</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Lisens ble avvist</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Last ned {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Ser etter oppdateringer for tillegg …</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">En eller flere oppdateringer for tillegg er tilgjengelig.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Velg elementer som skal oppdateres</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Utvidelse utvikles eksternt</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">Lisensavtale for {0}</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Godta</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Avslå</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Inkluder spillhandlinger fra biblioteksutvidelser</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Velg handling</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Sporingsmodus</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Sporingssti</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Første sporingsforsinkelse</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Sporingsfrekvens</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Lenke</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Fil</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Skript</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Standard</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Prosess</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Mappe</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Opprinnelig prosess</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Logg sporingsmeldinger</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Følgende endringer overskriver data for alle valgte spill!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Ingen</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Uniformt</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Kun elementer</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Kun første og siste</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Rullefølsomhet</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Jevn rulling</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Animasjonshastighet</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Fjern element?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Er du sikker på at du vil fjerne dette elementet?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Vis knapper i toppanelet:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Generelle visningsinnstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Grupperingsinnstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Sorteringsinnstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Filteroppsett</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Posisjon for plugin-knapper</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Seksjonsskillenes bredde</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Flytt hovedmenyknappen til sidestolpen</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Utforskerkolonne</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Tilfeldig spill-velger</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Velger for tilfeldig spill fra visning</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Velg et tilfeldig spill fra visningen</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Lagre grupperings- og sorteringsinnstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Vis som hurtigfilter i fullskjermsmodus</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Siste 7 dager</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Siste 31 dager</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Siste 365 dager</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Mer enn 365 dager</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Konfigurer</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Lagre oppsett</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Minimer etter at spill er startet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Minimer Playnite etter at spill er startet.\r\n\r\nDeaktivering av denne funksjonen kan gjøre at spill ikke får fokus ved oppstart!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Skriftstørrelse</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Liten skriftstørrelse</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Støtte for spillkontroller</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Deaktivering vil gjøre at Playnite ikke tar imot kommandoer fra spillkontrollere.\r\n\r\nDeaktiver hvis du bruker verktøy som oversetter spillkontrollerkommandoer til mus- og tastaturkommandoer, og du får doble trykk i Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Vis oppføringer på hovedmenyen:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Inverter X- og A-knappene på hovedskjermen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Bytt om knappene for oppstart av spill og visning av spilldetaljsiden i hovedskjermen.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Bytt om knapper for bekreftelse og kansellering</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Bytt om A/B-knappenes bindinger for bekreftelse og kansellering.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Kun hovedkontroller</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Når denne er aktivert godtas kun kommandoer fra hovedkontrolleren.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Guide-knappen fokuserer Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Grensesnittvolum</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Bakgrunnsvolum</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Demp når programmet er i bakgrunnen</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Kunne ikke ta i bruk lydgrensesnitt.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Utgangs-API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">Valg av API som brukes til lydavspilling. Bytt hvis du opplever problemer med lyden.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Generelt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Visuelt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Lyd</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Oppsett</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menyer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Inndata</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} starter …</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} kjører …</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Store bokstaver</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Mellomrom</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Skalerer for bilde-rendering</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternativ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Balansert</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Kvalitet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Kvalitet:\r\nBeste bildekvalitet, treg, høy minnebruk.\r\n    \r\nBalansert:\r\nGod bildekvalitet, rask, lav minnebruk.\r\n    \r\nAlternativ:\r\nBedre bildekvalitet, medium hastighet, lav minnebruk.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Velg fil …</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Velg mappe …</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Oppstartsskript</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Husk at både utvidelser og temaer kan ha stor innvirkning på Playnites ytelse, stabilitet og sikkerhet.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Velg ved oppstart</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Velg ved oppstart</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Innebygde profiler</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Innebygget profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Egendefinerte profiler</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Egendefinert profile</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Håndtert av et innebygget skript</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Emulator-valg</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Plattformvalg</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Regionsvalg</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Utfør før emulator startes</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Kjør etter at emulator er startet</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Kjør etter at emulator er avsluttet</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Emulator-program ble ikke funnet.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Emulator-spesifisering ble ikke funnet.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Oppstartsskript for emulator ble ikke funnet.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Del opp som separate spill</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Slå sammen til ett spill</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Velg plattform</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Velg region</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Søk gjennom mappe </sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Søk gjennom konfigurasjoner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Ekskluder mønster fra kontrollsum-skann</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Filer som passer med spesifiserte mønstre vil ikke ble sjekket mot kontrollsum, og vil bli koblet med filmnavn. Se hjelpesiden for emulatorer for mer informasjon.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Søk med emulator</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Navn må velges når nye konfigurasjon skal lagres.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Emulator eller emulator-profil er ikke valgt.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Mappe som skal søkes i er ikke spesifisert eller eksisterer ikke.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Søkekonfigurasjon er ikke riktig angitt.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Inkluder i globalt automatisk søk</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Kunne ikke søke gjennom mapper etter emulatorer.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Kunne ikke søke gjennom mapper etter emulerte spill.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Skjul importerte</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Profiler som skal importeres:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Autosøk-konfigurasjoner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Lagre som autosøk-konfigurasjon</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Lagrer konfigurasjon til senere bruk under biblioteksoppdatering. Lagrede konfigurasjoner kan administreres via &quot;Konfigurer emulatorer&quot;-menyen.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Importer med relative baner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Importer spillfiler ved hjelp av baner som er relative til Playnites installasjonsmappe eller emulatorers installasjonsmappe hvis mulig.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Søk gjennom undermapper </sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Søk gjennom arkiv</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Slå sammen relaterte filer</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Slå sammen relaterte spillfiler, som for eksempel individuelle spilldisker, under én spilloppføring.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Legg til skanner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Legg til lagret skanner</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Start søk</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Bruk søkekonfigurasjoner med emulatorer for å søke gjennom bestemte mapper. Pass på at emulatorer er riktig konfigurert før du importerer spill (via Bibliotek -&gt; Konfigurer Emulatorer).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Standardstatus tilordnet spill som nylig er lagt til</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Status tilordnet spill som spilles for første gang</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Kunne ikke initialisere PowerShell-skriptkjøringsmiljø. Hvis du bruker Windows 7, kan du prøve å (re-)installere PowerShell 5.1 for å rett opp problemet.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Et filteroppsett med dette navnet eksisterer allerede. Vil du oppdatere oppsettet med nye innstillinger?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Disse ordene vil bli fjernet fra begynnelsen av den automatisk innfylte sorteringsnavneverdien:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Bruk dette feltet for å ignorere ord i starten av en streng med tanke på sortering. Standardverdiene er &quot;The&quot;, &quot;An&quot;, og &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Fyll inn sorteringsnavn for spill som ikke har</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Sortering</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Fyller inn sorteringsnavnverdier …</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Tjenesten Nahimic er oppdaget på maskinen din. Det er kjent at denne tjenesten kan forårsake grafiske feil i Playnite (og andre programmer).\r\n\r\nHvis du opplever grafiske feil eller andre problemer i Playnite, så anbefaler vi at du deaktiverer eller avinstallerer Nahimic.\r\n\r\nMer informasjon er tilgjengelig her: https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite kjører med forhøyede rettigheter (som administrator). Dette gir forhøyede rettigheter til alle spill/apper som startes fra Playnite, og er derfor ikke anbefalt!\r\n\r\nMer informasjon er tilgjengelig på https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Vis advarsel hvis Playnite kjører med forhøyede rettigheter</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Bruk den faktiske størrelsen på disk når størrelsen til spill beregnes</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Ved aktivering går skanning saktere og du får den faktiske størrelsen filer opptar på disken.\r\nVed deaktivering går skanning fortere og størrelsen til selve filene blir brukt.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Følgende tillegg har blitt rapportert som potensielt problematisk , enten fordi stabilitet eller ytelse påvirkes, eller på grunn av sikkerhetsproblemer. Vi anbefaler avinstallering på det sterkeste:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Ekskluder filer i skyen fra søk</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Filer som er lagret på skytjenester blir ikke skannet og importert om de ikke er tilgjengelig lokalt.\r\nKun støttet for Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Søk, men med forenklet metode uten filinnhold</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Filer vil bli imponert, men ved bruk av en mindre nøyaktig metode som ikke krever at filinnhold er lastet ned og tilgjengelig lokalt.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Bruk for alle</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Overstyr installasjonsstatus</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Når dette er valgt, vil Playnite ignorere statusen til installasjonen (inkludert installasjonsmappe) satt av integrasjonsutvidelsen som importerer dette spillet.\r\n        \r\nDette alternativet vil kanskje ikke fungere riktig med utvidelser som bruker en spesifikk spillimportmetode med mindre de også tar hensyn til dette overstyringsalternativet.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Bare manuelt</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">En gang om dagen</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">En gang i uken</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Ved hver oppstart</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Se etter programoppdateringer</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Ser etter oppdateringer for tillegg </sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Oppdater biblioteker</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Søk gjennom emuleringsmapper</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Inkluder skjulte spill</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Rediger felt</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Velg / velg bort alt</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Åpne</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Aktiver</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Tildel</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Begynn å skrive for å søke etter spill … [F1] for hjelp</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"># gir deg en liste over tilgjengelige kommandoer.\r\n/ gir deg en liste over tilgjengelige søkeleverandører/programtillegg.\r\nInntasting av søkeord etterfulgt av Mellomrom, gjør at du bytter umiddelbart til dette søket.\r\n\r\nTAB: bytt handling\r\nENTER: aktiver valgt handling\r\nSHIFT-ENTER: åpne elementmeny</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Inkluder avinstallerte spill</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Inkluder skjulte spill</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Avinstallerte spill inkludert</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Avinstallerte spill ekskludert</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Skjulte spill inkludert</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Skjulte spill ekskludert</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Spill eller installer</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Gå til detaljer</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Spillmeny</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Rediger spill</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Åpne søk</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Søkefelt</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Søkeknapp</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Primær spillhandling</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Sekundær spillhandling</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F åpner globalt søk i stedet for å fokusere søkefeltet</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Lagre spillets filterinnstillinger mellom søkeøkter</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Søkeleverandører</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Standardnøkkelord</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Tilpassede nøkkelord</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Systemsnarvei</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite-søk</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Utvidelsesinnstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Utelatelser</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Ekskluderte filer relativt til søkemappe</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Ekskluderte mapper relativt til søkemappe</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Legg til fil i ekskluderingsliste</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Legg til mappe i ekskluderingsliste</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Ekskluderinger kan bare legges til i lagrede skannekonfigurasjoner.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Ekskluderinger er lagt til i &quot;{0}&quot; søk.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Overstyr plattform</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Når dette er valgt vil skanningen tilordne denne plattformen til alle spill, og samtidig overskrive automatisk angitte plattformer.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Inkluder kommandoer i standardsøk</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Når deaktivert, vil ikke kommandoer inkluderes i standard søk med mindre #-prefiks er brukt.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Bruk tilnærmede treff i navnefilter</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Når dette valget er aktivert, vil navnefilter samsvare med spillnavn på samme måte som globalt søk.\r\nStrengt samsvar kan håndheves i hvert enkelt tilfelle ved å bruke utropstegn (!) før filternavnet!</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Felter som skal vises for spillresultater:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Skjult status</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Sikkerhetskopiering av data ble avbrutt.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Sikkerhetskopiering mislyktes.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Feil ved sikkerhetskopiering</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Sikkerhetskopiering av data pågår …</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Gjenoppretter data fra sikkerhetskopi …</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Gjenoppretting av sikkerhetskopi mislyktes.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Innstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Spillbibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Media i spillbiblioteket</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Installerte utvidelser</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Utvidelsesdata</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Installerte temaer</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Velg data som skal gjenopprettes fra angitt sikkerhetskopifil.\r\n    \r\nPlaynite vil automatisk starte på nytt for å gjennomføre gjenopprettingsprosessen.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Velg elementer som skal inkluderes i sikkerhetskopien. Programinnstillinger og spillbibliotekdata er inkludert som standard.\r\n    \r\nPlaynite vil automatisk starte på nytt for å gjennomføre sikkerhetskopieringsprosessen.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Automatisk sikkerhetskopiering</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Frekvens for automatisk sikkerhetskopiering</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Sikkerhetskopimappe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Roterende sikkerhetskopier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Inkluder ekstra data:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Sikkerhetskopieringsmappen må angis dersom automatisk sikkerhetskopiering er aktivert.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Vis kun varsler for deloppdateringer</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Når denne funksjonen er aktivert vil bare oppdateringer som er tilgjengelig for nåværende installerte hovedversjon av programmet føre til varsel om oppdatering.\r\nNye hovedversjoner vil ikke resultere i oppdateringsvarsel.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Bruk relative datoer for den siste uken</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Bruke relative datoer i formatet «i dag», «i går» osv. hvis datoen er mindre enn en uke gammel.\r\n    \r\nDet angitte datoformatet vil bli brukt til alle andre datoer.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Bildesøk på web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Søkestreng for ikonbilde</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Søkestreng for omslagsbilde</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Søkestreng for bakgrunnsbilde</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Henter tilleggsinformasjon …</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Ingen metadatakilde er tilgjengelig</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Innstillinger for spillhandlinger</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Bruk skanneinnstillinger</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Velg profil ved oppstart</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Velg emulator ved oppstart</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automatisk</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Alltid på</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Alltid av</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Tilgjengelighetsstøtte (skjermleser)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Applikasjonsmeny</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Spillmeny</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Programmappe</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Mappe for brukerdata</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Feil i bibliotekfil er oppdaget. Playnite avsluttes.\r\n    \r\nÅpne ny sak på Playnite's GitHub-side med en forespørsel om å fikse feilen i filene dine.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Vil du lagre endringene du har gjort?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Flyttbar installasjon</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Ingen kontrollere funnet</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/pl_PL.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Polski</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Język</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Zamknij aplikację</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtr aktywny</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtr wyłączony</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Dodatkowe filtry</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtry</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtr</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Nieprawidłowe dane</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Zapisać zmiany?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Strona główna - www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Kod źródłowy na GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Utwórz pakiet diagnostyczny</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Wysyłaj informacje diagnostyczne</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">O aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Autor: Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Dodaj do kolekcji</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Dodaj</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Utwórz nową kolekcję</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">  • Zaznacz, aby dodać do kolekcji\r\n  • Odznacz, aby usunąć z kolekcji\r\n  • Nieokreślone pozostaną bez zmian (podczas edycji wielu gier)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Bez kategorii</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Brak platformy</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ups! Coś poszło nie tak.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Wystąpił nieodwracalny błąd.\r\n\r\nJeśli chcesz nam pomóc w naprawieniu tego błędu, prosimy o krótki opis działań podjętych przed awarią, a następnie stworzenie pakietu diagnostycznego. Jeśli jesteś online, pakiet zostanie przesłany na serwer Playnite do analizy.\r\n\r\nAlternatywnie, możesz użyć przycisku 'Zgłoś awarię', aby utworzyć nowy problem na GitHubie i zgłosić awarię ręcznie.\r\n\r\nDziękujemy za pomoc.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Rozszerzenie „{0}” spowodowało nieodwracalny błąd.\r\n\r\nZalecamy zapisanie pliku dziennika i zgłoszenie problemu twórcy rozszerzenia. Jeśli problem będzie się powtarzał, wyłącz to rozszerzenie.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Rozszerzenie „{0}” spowodowało nieodwracalny błąd.\r\n\r\nZalecamy zapisanie pliku dziennika i zgłoszenie problemu twórcy rozszerzenia. Jeśli problem będzie się powtarzał, wyłącz to rozszerzenie.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Nieznane rozszerzenie lub motyw spowodował nieodwracalny błąd.\r\n\r\nZalecamy wyłączenie rozszerzeń innych firm, aby wyizolować problematyczny dodatek i zgłosić problem do jego twórców.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Wystąpił nieodwracalny błąd.\r\n \r\nJeśli chcesz nam pomóc rozwiązać ten problem, wyślij informacje diagnostyczne. Dziękujemy.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Wyłącz rozszerzenie</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Zapisz plik dziennika</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Wyślij dane diagnostyczne</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Zgłoś błąd</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Uruchom ponownie</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Uruchom ponownie w trybie awaryjnym</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Zablokuj wszystkie nieoficjalne rozszerzenia i użyj domyślnego motywu.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Zamknij aplikację</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Opisz jak doszło do błędu (w języku angielskim):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Menedżer biblioteki</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Usunąć?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Nie można usunąć - gra lub instalator działa w tle.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Nie można odinstalować uruchomionej gry.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Czy na pewno chcesz usunąć {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Czy jesteś pewien, że chcesz usunąć {0} gier?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Czy na pewno chcesz usunąć {0}?\r\n\r\nWybranie opcji &quot;dodaj do listy wykluczeń&quot; uniemożliwi ponowne zaimportowanie gry przy aktualizacji biblioteki następnym razem.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Na pewno chcesz usunąć {0} gier?\r\n\r\nWybranie opcji  &quot;dodaj do listy wykluczeń&quot;, pozwoli pominąć zaimportowanie tej gry podczas kolejnej aktualizacji biblioteki.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Czy jesteś pewien, że chcesz usunąć {0} wpisów, które nie są aktualnie w użyciu? </sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Nie znaleziono żadnych niewykorzystanych pól.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Tak (dodaj do listy wyjątków)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">W tej sekcji są niezapisane zmiany</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Aktualizowanie formatu biblioteki gier…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Aktualizacja bazy danych nie powiodła się.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Nie można zaktualizować biblioteki gier. Potrzeba {0} MB wolnego miejsca.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Błąd gry</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Nie można uruchomić gry. '{0}' nie znaleziono w bazie danych.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Nie można uruchomić gry: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Nie można uruchomić akcji: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Nie można otworzyć lokalizacji gry: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Nie można wykryć rozmiaru instalacji gry: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Błąd skanowania rozmiaru instalacji</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Liczba błędów podczas sprawdzania rozmiaru instalacji: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Stworzenie skrótu się nie powiodło: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Błąd otwarcia instrukcji: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Nie można zainstalować gry: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Nie można odinstalować gry: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Nie znaleziono prawidłowych akcji uruchamiania gry. Podczas używania akcji emulatora, upewnij się, że definicje platformy pasują do konfiguracji gry i emulatora.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Instalacja implementacji nie jest dostępna.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Wtyczka biblioteki odpowiedzialna za tę grę nie jest zainstalowana lub włączona.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Oficjalne metadane nie są dostępne.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Nie wybrano gry.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Uruchomienie skryptu gry nie powiodło się.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Nieudane uruchomienie aplikacji skryptu.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Uruchomienie globalnego skryptu nie powiodło się.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Uruchomienie skryptu emulatora nie powiodło się,</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Uruchomienie skryptu akcji nie powiodło się.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 lub nowszy nie jest zainstalowany.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Nie można określić jak uruchomić grę.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Włączone</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Wyłączone</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Usuń</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Usuń nieużywane</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Zmień nazwę</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopiuj</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Dodaj</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Domyślna ikona</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Domyślny obraz okładki</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Domyślny obraz tła</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Zakończ</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Następne</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Wstecz</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">GOTOWE</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">COFNIJ</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">WYCZYŚĆ</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Wyczyść</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Odrzuć</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Odrzuć wszystkie</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importuj</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nazwa</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Moduł</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Seria</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Wersja</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Ostatnio uruchomiono</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Najczęściej grane</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Liczba uruchomień</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Rozmiar instalacji</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Folder</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notatki</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Dodano</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Dodano</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Zmodyfikowano</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Data modyfikacji</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Strona WWW</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Ścieżka</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Zapisz</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Zamknij</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Anuluj</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Zatwierdź</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Reset</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Tak</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Nie</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Witaj</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Użytkownik lokalny</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Ogólne</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Media</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Odnośniki</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Instalacja</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Polecenia</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Pobieranie…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Pobieranie metadanych…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Wczytywanie…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Typ</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profile</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Usuń</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Pobierz</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Szukaj</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Rozdzielczość:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Dowolny</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Powiększenie</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Widok listy</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Okładki</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Widok siatki</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Widok szczegółowy</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Personalizacja</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">Adres</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Szczególne podziękowania</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licencja</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Współtwórcy</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Zamykanie aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Dzisiaj</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Wczoraj</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Poniedziałek</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Wtorek</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Środa</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Czwartek</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Piątek</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Sobota</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Niedziela</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Zeszły tydzień</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Zeszły miesiąc</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Zeszły rok</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Więcej niż rok temu</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">Od 0 do 100 MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">Od 100MB do 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">Od 1GB do 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">Od 5GB do 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">Od 10GB do 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">Od 20GB do 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">Od 40GB do 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100 GB lub więcej</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Import zakończony pomyślnie.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Wszystkie gry</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ID gry</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">ID bazy danych</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Szablony</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Kolumna</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Kolumny</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Wiersz</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Wiersze</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Nie udało się pobrać ikony z polecenia &quot;Graj&quot;. Dla tego typu pliku nie jest dostępne żadne polecenie.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Pobieraj tylko brakujące metadane</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Ta opcja pominie pobieranie metadanych tam, gdzie już znajdują się informacje.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Wybór gier</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Wybierz, które gry należy zaktualizować o nowe metadane:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Wszystkie gry z bazy danych</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Wszystkie aktualnie filtrowane gry</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Tylko wybrane gry</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Nie wybrano żadnego pola metadanych</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Nie wybrano żadnego pola metadanych do pobrania. Wybierz co najmniej jedno i włącz dla niego co najmniej jednego dostawcę metadanych.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Oficjalny sklep</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Wybierz pola, które mają być automatycznie wypełniane przez Playnite oraz źródła, z których należy pobrać dane.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Zachęcamy do kliknięcia na powyższe logo oraz wprowadzania poprawek w bazie danych IGDB.com w celu udoskonalenia danych widocznych w Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Pobieranie metadanych…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importowanie zainstalowanych gier…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importowanie gier {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importowanie emulowanych gier z {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Aktualizowanie biblioteki…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Skanowanie rozmiaru gier w bibliotece...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Skanowanie rozmiaru importowanych gier...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Ukończono aktualizację biblioteki</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Zwalnianie zasobów…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Konfiguracja</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Ustawienia</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platformy i emulatory</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Konfiguracja emulatorów</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Zarządzanie biblioteką</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Narzędzia</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Pobierz metadane</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Narzędzia</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Konfiguracja integracji</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Otwórz klienta</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Platformy</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Aktualizacja biblioteki</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Anuluj aktualizację biblioteki</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Aktualizuj foldery emulowane</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Dodaj grę</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manualnie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Automatyczne skanowanie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Gra emulowana</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Gra z Microsoft Store</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">O aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Wyślij opinię</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Tryb pełnoekranowy</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Odnośniki</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Pomoc</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Wesprzyj na Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Wesprzyj na Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Instrukcja użytkownika</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Dokumentacja SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Uruchom ponownie system</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Zamknij system</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Uśpij system</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernacja systemu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Blokada systemu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Wyloguj użytkownika</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Wylosuj grę</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Wyświetlane pola gry w panelu szczegółowym:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Odstęp</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Pokazuj tło pod tytułami</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Szerokość ramki okładki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Brak źródła ikony gry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Brak źródła okładki gry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Brak źródła tła gry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Odstęp pionowy szczegółów gry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Pozycja szczegółów w widoku siatki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Pozycja listy gier w widoku szczegółowym</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Separator pomiędzy panelami</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Wysokość obrazu okładki gry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Wysokość ikony na liście gier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Czcionka aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Czcionka o stałej szerokości</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Pozycja panelu filtrowania</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Pozycja panelu eksploratora</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Renderowanie okładek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Współczynnik proporcji</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Powyższa opcja wpływa również na renderowanie okładek w trybie pełnoekranowym!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Sposób skalowania</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Pudełko DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Pole</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Baner Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Pionowe okładki Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Wymaga ponownego uruchomienia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Ustawienia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Ogólne</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Panel górny</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Wygląd</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Szczegóły gry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Układ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Zaawansowane</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Pełny ekran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Wprowadź</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Wydajność</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadane</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Aktualizacja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Szukaj</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Kopia zapasowa</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Wykonaj kopię zapasową</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Przywróć kopię zapasową</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importuj automatycznie zmiany w bibliotece</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Nieprawidłowe położenie pliku bazy danych, należy ustawić właściwą ścieżkę pliku.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Nazwa konta nie może być pusta.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Pobierz metadane po imporcie gier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Uruchamiaj Playnite w trybie zminimalizowanym</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Uruchom Playnite wraz z systemem</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Uruchom zamknięty do zasobnika</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Nie zarejestrowano Playnite do uruchomienia podczas startu systemu.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Uruchom w trybie pełnoekranowym</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asynchroniczne ładowanie obrazu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Poprawia płynność przewijania listy gier kosztem wolniejszego ładowania się grafiki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Pokaż nazwę gry, jeśli brakuje okładki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Pokaż nazwy gier w widoku siatki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Przyciemnij niezainstalowane gry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Pokaż ikony gier na liście widoku szczegółowego</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Pokazuj liczbę gier obok nazwy grupy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Pokazuj tylko zaznaczone pola w filtrze i panelu eksploratora</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Wyłącz przyspieszanie sprzętowe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Użyj, gdy występują problemy z szarpaniem (suttering) lub podobne problemy z interfejsem użytkownika</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Pokazuj ukryte gry w pasku szybkiego dostępu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Wpływa na menu kontekstowe oraz menu zasobnika.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Liczba pozycji w pasku szybkiego dostępu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Dynamiczne tło - używaj tła gier jako tła aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Rozmycie tła</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Wysoka jakość</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Przyciemnienie tła</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Pokaż w widoku siatki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Motyw</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Motyw profilu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Motyw pełnoekranowy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Pełnoekranowy motyw profilu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Lokalizacja bazy danych</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Status logowania:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Ustawienia aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Wyczyść pamięć podręczną</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Może pomóc rozwiązać problemy napotkane podczas próby powiązania kont.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Wyświetlaj ikonę w zasobniku systemowym</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimalizuj Playnite do zasobnika systemu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Kiedy okno aplikacji jest zamykane, zminimalizuj Playnite do zasobnika systemowego</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Po uruchomieniu gry:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Po zamknięciu gry:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Formatuj czas gry, aby wskazać liczbę dni rozgrywki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Formaty dat:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Spowoduje to wylogowanie Cię z wszystkich powiązanych usług. Wymagany jest restart aplikacji, czy chcesz kontynuować?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Wyczyścić pamięć podręczną?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Uruchom ponownie, aby zastosować nowy motyw</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Pobierz więcej motywów</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Stwórz nowy motyw</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Pobierz więcej rozszerzeń</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Stwórz nowe rozszerzenie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Pomóż w tłumaczeniu aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Należy uruchomić ponownie Playnite, aby zastosować zmiany. Uruchomić ponownie teraz?\r\n\r\nPonowne uruchomienie anuluje wszystkie aktualnie wykonywane zadania (pobierania).</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Uruchomić ponownie aplikację?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite nie przenosi plików biblioteki automatycznie, musisz je przenieść / skopiować przed zmianą lokalizacji. Jeśli w docelowej lokalizacji nie ma plików biblioteki, zostanie utworzony nowy plik.\r\n\r\nNowa lokalizacja bazy danych zostanie użyta dopiero po ponownym uruchomieniu aplikacji. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Czas gry nie będzie rejestrowany, jeśli wybrano opcję &quot;Zamknij&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Liczba wierszy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Liczba kolumn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Liczba wierszy z szczegółami</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Pokaż obraz tła na ekranie głównym</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Nie dotyczy obrazów tła w istniejących grach bez ponownego pobierania metadanych.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importuj czas gry z gier w bibliotece:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Konfiguruje kiedy Playnite powinien importować czas gry zgłoszony przez wtyczki biblioteki dla gier w bazie Playnite. Obsługa wtyczek biblioteki odpowiedzialnych za obsługę gier jest potrzebna, aby móc korzystać z tej funkcji.\r\n\r\nZawsze: Importuje czas gry dla nowo zaimportowanych i istniejących gier w bazie danych Playnite.\r\nTylko dla nowo zaimportowanych gier: Importuj czas gry tylko dla nowo zaimportowanych gier.\r\nNigdy: Nigdy nie importuj czasu gry w żadnych okolicznościach.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Zawsze</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Tylko dla nowo zaimportowanych gier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Nigdy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Włącz obsługę kontrolera w trybie pełnoekranowym</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Przycisk Guide otwiera tryb pełnoekranowy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Automatyczne pobieranie metadanych dla nowo zaimportowanych gier.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Docelowy wyświetlacz</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Zawsze używaj wyświetlacza głównego</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Pokaż tytuły gier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Pokaż status baterii</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Pokaż procent baterii</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Pokaż zegar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Ukryj kursor myszy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Tylko zainstalowane (w podręcznych filtrach)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Przyciski kontrolera</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Układ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Przewijanie w poziomie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Wybierz jedną z podsekcji</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Brak dostępnych ustawień</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Nie udało się wczytać ustawień</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Skrypty poniżej są wykonywane dla każdej gry w bibliotece Playnite. Indywidualne skrypty mogą być przypisane do każdej gry oddzielnie podczas edycji informacji o grze.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animacja przejść obrazów tła</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Wielkość czcionki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automatycznie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Bez wygładzania</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Skala szarości</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Display</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Sposób formatowania tekstu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Sposób renderowania tekstu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Ustawienia renderowania i formatowania tekstu nie są obecnie stosowane do tekstu w opisach gier.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Ładowanie wstępne obrazów tła</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Jeżeli włączone, Playnite będzie pobierał tła gier kiedy będzie pobierał metadane. Ta opcja używa więcej miejsca na dysku i pozwala oglądać tła gier kiedy jesteś w trybie offline.\r\n\r\nJeżeli wyłączone, Playnite będzie pobierał tła gier tylko w tedy kiedy będą wymagane po raz pierwszy. Ta opcja używa mniej miejsca na dysku, ale może spowodować opóźnienie przed wyświetleniem tła, a niektóre tła mogą być niedostępne offline.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Automatycznie zamykaj aplikację klienta po wyjściu z gry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Czas oczekiwania na zamknięcie klienta (w sekundach)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Nie zamykaj po sesji gry krótszej niż (w sekundach)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Automatycznie zamykaj następujące klienty:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Automatyczne zamykaj klienta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importuj listę wyjątków</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Wyświetlaj ostrzeżenie przy dodawaniu zbyt dużych plików z obrazami</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Otwórz folder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Preferowany system klasyfikacji wiekowej</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Aktualizuj rozmiar gier przy aktualizacji biblioteki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Skanuje i aktualizuje rozmiar instalacji gier, jeśli zostanie wykryte, że ich pliki zostały zmodyfikowane od ostatniego skanowania</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Brak</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Wypełnij</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Dopasuj</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Dopasuj i wypełnij</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Po lewej</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Po prawej</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Na górze</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Na dole</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Importuj błąd</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Wymagane uwierzytelnienie</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Błąd uwierzytelnienia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Tryb alternatywnego renderowanie podglądu sieci</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Użyj, jeśli masz problem z podglądem strony, np. z oknami autoryzacji integracji.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Częściowe ładowanie dużych opisów gier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Duże opisy mogą spowodować zauważalne opóźnienie podczas wybierania gier.\r\n\r\nGdy włączone, tylko część opisu zostanie załadowana z opcją załadowania reszty na żądanie.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Importowanie metadanych</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Pobierz metadane</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Wybierz dane konfigurację pobierania metadanych do pobierania w przyszłości. Możesz to zmienić w ustawieniach aplikacji.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Kreator importu emulatorów</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Kreator poprowadzi Cię przez proces pobierania i importowanie emulatorów oraz pobieranie emulowanych gier.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Pamiętaj, że możesz zawsze dodać dodatkowe emulatory (menu---&gt; biblioteka--&gt; konfiguracja emulatorów) i/lub gry (menu--&gt;dodaj grę--&gt;emulowana gra) później używając menu głównego.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Poniżej znajduje się lista emulatorów, które Playnite może rozpoznawać i automatycznie konfigurować. Możesz je pobrać i zainstalować, odwiedzając ich stronę internetową. Po zainstalowaniu emulatorów (recznie) przejdź do następnego ekranu, aby zaimportować je do Playnite.\r\n        \r\nMożesz także skonfigurować i importować dowolny niestandardowy emulator później za pośrednictwem menu konfiguracji.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Można importować dowolne emulatory zainstalowane na komputerze, naciskając przycisk &quot;Skanowanie folderów...&quot;. Playnite przeszuka wybrany folder dla wszystkich znanych emulatorów i udostępni opcję ich importowania. Możesz importować dane z wielu folderów, używając tego przycisku kilka razy, emulatory zostaną dodane na dole bieżącej listy.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Możesz importować gry, naciskając przycisk &quot;Skanuj folder dla ROM/ISO&quot;. Wybór odpowiedniego emulatora powie Playnite, które typy plików powinny być skanowane i importowane. Możesz importować z wielu folderów, używając tego przycisku kilka razy, gry zostaną dodane na dole bieżącej listy.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Nie wybrano żadnych emulatorów do zaimportowania. Automatyczne importowanie emulowanych gier nie będzie możliwe bez wcześniejszego skonfigurowania emulatora. Czy na pewno chcesz kontynuować i opuścić proces importowania?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">W Playnite nie ma skonfigurowanych emulatorów. Nie można importować gier bez uprzedniego skonfigurowania emulatora i wybrania odpowiednich typów plików. Czy chcesz teraz dodać kilka emulatorów?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Skanuj folder dla ROM/ISO</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Wybierz pliki</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Skanowanie folderów…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Konfiguracja emulatorów…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Skanowanie…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Skanowanie {0}...</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Pierwsza konfiguracja</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Ten kreator poprowadzi cię przez proces automatycznego importu gier i konfiguracji zewnętrznych bibliotek. Playnite może automatycznie importować gry z wielu platform, takich jak Steam czy GOG, a także na bieżąco aktualizować twoją kolekcję poprzez automatyczną synchronizację bibliotek w trakcie uruchamiania aplikacji.\r\n\r\nZauważ, że zawsze możesz dodać dowolną grę na którąkolwiek z platform ręcznie, klikając przycisk 'Playnite' w menu głównym.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integracja biblioteki</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Automatycznie importuj gry z następujących usług. Wszelkie późniejsze zmiany (status instalacji) zostaną automatycznie zaktualizowane przy uruchomieniu Playnite. Wybrane ustawienia dotyczą początkowego i wszystkich kolejnych importów.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Konfiguracja zakończona</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Wstępne ustawienia zakończone. Pamietaj, że możesz zmienić wszystkie ustawienia w &quot;Ustawienia&quot;.\r\n\r\nAby dodać inne gry poźniej, kliknij na logo Playnite.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Nie udało się pobrać jednego lub więcej rozszerzeń.\r\n\r\nMożesz spróbować pobrać ponownie integracje z menu dodatków po zakończeniu kreatora pierwszego uruchomienia.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Pobieranie {0} integracji...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Pobieranie listy rekomendowanych integracji…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Nie udało się pobrać listy zalecanych integracji. Możesz spróbować ponownie pobrać integrację później w menu Dodatki.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Konfiguruj platformy i emulatory</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Konfiguracja emulatorów</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platformy</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulatory</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Dodaj platformę</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Wybierz ikonę</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Wybierz okładkę</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Wybierz obraz</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Wybierz pozycję</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Wybierz tło</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Wybierz plik</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Wybierz URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Dodaj emulator</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Wspierana platforma</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Czy chcesz zapisać zmiany platformy?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Czy chcesz zapisać zmiany emulatora?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Plik wykonywalny</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Parametry</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Katalog roboczy</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Wspierane typy plików</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importowanie emulatorów…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Pobieranie emulatorów…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Wczytaj ustawienia parametrów z profilu emulatora</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Czy na pewno chcesz usunąć emulator {0}?\r\nEmulator jest wykorzystywany przez następującą liczbę gier {1}.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Czy na pewno chcesz usunąć platformę {0}?\r\nPlatforma jest wykorzystywana przez następującą liczbę gier {1} i emulatorów {2}.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Pomoc ustawień</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sortuj według</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Kierunek sortowania</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Grupuj według</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Rosnąco</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Malejąco</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Nie grupuj</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Grupuj według bibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Grupuj według kolekcji</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Grupuj według platform</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Typ widoku</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Widok</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Panel eksploratora</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Panel filtrowania</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ikona</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Ikona biblioteki</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Okładka</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Obraz tła</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Nazwa sortowania</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Biblioteka</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Instrukcja</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nazwa</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Zainstaluj dysk</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Nazwa konta</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platforma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kolekcja</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Gatunek</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Data wydania</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Rok wydania</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Producent</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Tagi</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Wydawca</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Stan instalacji</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Zastosuj wszystkie filtry</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Jeżeli aktywne, zostaną wyświetlone tylko te gry, które spełniają warunki dla wszystkich wybranych filtrów.\r\nJeżeli nieaktywne, zostaną wyświetlone te gry, które spełniają minimum jeden z wybranych filtrów.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Zainstalowane</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Zainstalowane</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Nie zainstalowane</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Ukryte</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Ulubione</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Włącz obsługę HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Jeśli włączone, HDR będzie włączony na ekranie głównym przed rozpoczęciem gry.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Zauważ, że HDR nie jest obsługiwany na Twoim głównym wyświetlaczu.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Ostatnio uruchomiono</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kolekcja</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Opis</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Ścieżka instalacji</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Okładka</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Odnośniki</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Ścieżka ROM lub ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Gatunek</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Gatunek</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Firma</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Firmy</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Producent</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Producent</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Wydawca</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Wydawca</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kolekcja</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kolekcje</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Tag</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Tagi</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Funkcje</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Funkcje</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Klasyfikacja wiekowa</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Klasyfikacja wiekowa</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Region</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regiony</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Źródło</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Źródła</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Ostatnia aktywność</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Błąd bazy danych</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Nie można otworzyć bazy danych biblioteki.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Baza danych nie jest otwarta.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Nie można uzyskać dostępu do bazy danych biblioteki. Plik &quot;{0}&quot; jest używany przez inny proces lub jest w niedostępnej lokalizacji.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Nie można utworzyć diag. packege.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Błąd przy udostępnianiu pakietu diagnostycznego.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Informacje diagnostyczne zostały wysłane pomyślnie.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Pakiet diagnostyczny utworzono i udostępniono.\r\nDołącz następujący identyfikator do raportu błędu:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Nie udało się zaimportować gier {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Nie udało się zaimportować emulowanych gier {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Nie można wyszukać gier według wybranego profilu emulatora. Profil nie zawiera żadnych rozszerzeń plików ani platform.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Nie udało się uruchomić Playnite. Zamknij wszystkie działające procesy programu i spróbuj ponownie.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Nie udało się zastosować motywu &quot;{0}&quot;, profil kolorów &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Nie można otworzyć linku, URL ma nieprawidłowy format.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Nie udało się uruchomić aplikacji.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Nie udało się zainicjować komponentu widoku internetowego. Playnite nie może kontynuować procesu uruchamiania.\r\n\r\nWięcej informacji na https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Nie można zaimportować emulatorów z powodu braku lub uszkodzenia pliku z konfiguracją.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Nie udało się uruchomić akcji menu.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Edytuj szczegóły gry</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Obraz URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Dodaj link</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Dodaj ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Zapisz zmiany</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Zastosuj zmiany pola edytowanych gier.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Dodaj polecenie</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Usuń polecenie</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Usuń polecenie &quot;Graj&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Dodaj</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Skanuj folder</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Wykryj zainstalowane</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Przeglądaj</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Otwórz</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Ustawienia profilu</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Nazwa gry nie może być pusta.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Katalog śledzenia akcji gry nie może być pusty.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Nazwa gry nie może być pusta przed wyszukiwaniem metadanych.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Nieprawidłowe dane gry</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Wprowadź poprawny adres zaczynający się od https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Wybierz URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Nie udało się pobrać metedanych: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Błąd pobierania</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Wyczyść filtry</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Konto prywatne</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Publiczne konto</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">Klucz API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Błąd uruchamiania</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Błąd motywu</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Wyczyść wszystko</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Instalowanie</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Odinstalowywanie</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Włączanie</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Uruchomiona</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Błędny URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Nic nie rób</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimalizuj</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Przywróć okno</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Przywróć okno tylko w przypadku uruchomienia z interfejsu użytkownika</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Zamknij</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Zmień</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Zaawansowane</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">–</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Stopień ukończenia</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Stopień ukończenia</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Ocena</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Krytycy</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Gracze</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Skrypty gry</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Skrypty aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Skrypty</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Wtyczki</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Źródła metadanych</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Rozszerzenia</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID rozszerzenia</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Przeładuj skrypty</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Interaktywne SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Wszystkie skrypty przeładowano pomyślnie.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Nie znaleziono gier według określonych kryteriów wyszukiwania lub filtra</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Nie znaleziono gier</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Wyłącz tryb pełnoekranowy</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Zamknij aplikację</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Biblioteki</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Aktualizuj wszystko</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Autor:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Wersja:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Zaktualizowano:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Moduł:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Biblioteka</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statystyki</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Wszystko</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Nic</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Powiadomienia</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Szerokość</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Wysokość</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Rozmiar</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Mała</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normalna</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Duża</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Większa</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Największa</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Domyślne</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Wybierz</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Zaznacz wszystkie</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Odznacz wszystko</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Pierwszy</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Losowo</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Wybór użytkownika</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Wczytaj więcej</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Przezroczyste</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Zwiń</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Rozwiń</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Zwiń wszystkie</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Rozwiń wszystkie</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Inne</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Motywy</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Parametry emulatora</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Wbudowane parametry</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Własne parametry</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Dodatkowe parametry emulatora</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Nadpisz parametry emulatora</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Polecenie &quot;Graj&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Wybierz metadane do importowania</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Wybierz gry do importu</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Wyszukaj metadane</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Dostępna aktualizacja</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Zmiany od ostatniej aktualizacji</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Pobierz i zainstaluj aktualizację</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Szukaj aktualizacji</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Błąd aktualizacji</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Błąd sprawdzania nowej wersji.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Aplikacja jest aktualna.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Nie udało się pobrać i zainstalować aktualizacji.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">W tle jest wciąż aktywne zadanie. Czy chcesz je anulować i kontynuować aktualizację?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">W tle jest wciąż aktywne zadanie. Czy chcesz je anulować i zamknąć Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">W tle jest wciąż aktywne zadanie. Przełączenie trybu spowoduje anulowanie zadania, czy na pewno chcesz przełączyć?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Dostępna jest aktualizacja aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Przeładuj listę motywów</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Zatwierdź wybrany motyw</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Oglądaj zmiany w plikach</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Automatycznie zastosuj motyw, gdy plik źródłowy się zmieni</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Środowisko wykonawcze skryptu</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Skrypt do wykonania przed uruchomieniem gry</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Skrypt do wykonania po wyjściu z gry</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Skrypt do wykonania po uruchomieniu gry</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Wykonaj przy starcie aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Wykonaj przy zamknięciu aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Skrypt uruchamiania gry</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Skrypt uruchomionej gry</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Skrypt zatrzymanej gry</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Wykonanie skryptu globalnego</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Ogólne</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrowane</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Aktualny</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Nowe</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Testuj skrypt</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Pokaż tylko wybrane elementy.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Zapisz jako domyślne</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Dodaj do ulubionych</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Usuń z ulubionych</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Ukryj</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Usuń z ukrytych</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Włącz obsługę HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Wyłącz obsługę HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Edytuj</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Oblicz rozmiar instalacji</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Oblicz rozmiar instalacji (wszystkie gry)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Oblicz rozmiar instalacji (tylko brakujące dane)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Rozmiar instalacji</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Dodaj do kolekcji</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Ustaw stan ukończenia</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Usuń</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Graj</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Instaluj</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Opcje gry</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Szczegóły</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Odinstaluj</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Otwórz folder instalacji</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Utwórz skrót na pulpicie</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Otwórz instrukcję</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Więcej</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Zarządzane przez wtyczkę biblioteki</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Proces uruchamiania będzie zarządzany przez wtyczkę biblioteki obsługującą tę grę.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Brak żadnych informacji o grze &quot;{0}&quot; na danej stronie.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Wskazówka: Możesz użyć zaawansowanego sposobu pobierania metadanych dla pojedynczej gry za pomocą opcji z menu &quot;Edytuj&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Niedostępne, gdy niektóre procesy są w toku.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">W tekście opisu można umieścić kod HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Czas gry jest liczony w sekundach</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Rozmiar instalacji jest wskazany w bajtach.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Data premiery musi być w formacie 'rok-miesiąc-dzień'. Wartości Miesiąca i Dnia mogą zostać pominięte.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Wartości od 0 do 100 lub puste bez oceny.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Playnite jest rozwijany dzięki wsparciu patronów i członków Ko-fi:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Programowanie, tłumaczenie oraz inni współtwórcy \r\n(kolejność przypadkowa):</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Anulować monitorowanie gry?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Monitorowanie instalacji jest obecnie uruchomione, czy chcesz anulować proces i przywrócić grę do poprzedniego stanu?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Monitorowanie wykonania gry jest aktualnie uruchomione, czy chcesz anulować proces i przywrócić grę do poprzedniego stanu?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Czas gry</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Ostatnio uruchomiono</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}d {1}g {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} sekund(y)</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">–</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Włączanie trybu pełnoekranowego</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Otwieranie trybu pełnoekranowego…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Ładowanie biblioteki gier…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Obliczanie rozmiaru instalacji…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Obliczanie rozmiaru instalacji {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Nie udało się zainstalować pliku skryptu.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Skrypt pomyślnie zainstalowano.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Instaluj skrypt</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Błąd skryptu</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Nie udało się uruchomić funkcji rozszerzenia.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Otwórz folder metadanych</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Oblicz</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Automatycznie oblicza rozmiar instalacji przy użyciu Romów, jeśli gra taki posiada lub przy użyciu katalogu instalacyjnego, jeśli został ustawiony</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">Klient {0} nie jest zainstalowany.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Klient {0} zostanie uruchomiony. Zaloguj się, a następnie zamknij ten komunikat.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Oczekiwanie na zalogowanie się użytkownika. Zamknij to, gdy się skończy…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Nie odnaleziono katalogu instalacyjnego gry.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Nieprawidłowa konfiguracja polecenia.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Rozwiązywanie problemów z synchronizacją konta</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Rozwiązywanie problemów</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Zmień nazwę elementu</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Dodaj nowy element</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Wprowadź nazwę</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Podaj nową nazwę</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Mniej niż godzinę</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 do 10 godzin</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 do 100 godzin</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 do 500 godzin</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 do 1000 godzin</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Aby ukończyć instalację Playnite, należy go ponownie uruchomić. Czy chcesz teraz uruchomić ponownie Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Rozszerzenie zostało niepoprawnie spakowane.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Motyw został niepoprawnie spakowany.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Rozszerzenie &quot;{0}&quot; nie zostało prawidłowo wczytane.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Nie można załadować &quot;{0}&quot; rozszerzeń, obecna wersja Playnite nie jest wspierana.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Motyw &quot;{0}&quot; nie został prawidłowo wczytany.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Nie można załadować &quot;{0}&quot; motywów, obecna wersja Playnite nie jest wspierana.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Rozszerzenie nie zostało prawidłowo wczytane.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Motyw nie został prawidłowo wczytany.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Motyw/Rozszerzenie używa niewspieranego API.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Zainstalowano poprawnie.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Czy zainstalować rozszerzenie?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Ogólny</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Nie udało się zainstalować rozszerzenia &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Nie udało się zainstalować rozszerzenia.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Czy chcesz zainstalować nowe rozszerzenie?\r\n\r\n{0}\r\nStworzone przez {1}\r\nWersja {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Czy chcesz zaktualizować rozszerzenie &quot;{0}?\r\n\r\nObecna wersja: {1}\r\nNowa wersja: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Nie udało się zainstalować motywu.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Czy chcesz zainstalować nowy motyw?\r\n\r\n{0}\r\nStworzone przez {1}\r\nWersja {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Czy chcesz zaktualizować motyw &quot;{0}?\r\n\r\nObecna wersja: {1}\r\nNowa wersja: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Za chwilę opuścisz Playnite i przejdziesz do następującej strony internetowej przy użyciu domyślnej przeglądarki internetowej. Czy chcesz kontynuować?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Wybrany obraz jest zbyt duży, by zapewnić optymalną wydajność. Użycie bardzo dużych obrazów może skutkować gorszą responsywnością UI i większym zużyciem pamięci.\r\n\r\nZalecana rozdzielczość maksymalna:\r\nIkony: {0} megapiksele\r\nOkładki: {1} megapiksele\r\nTła: {2} megapiksele</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Ostrzeżenie dotyczące wydajności</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Nie pokazuj ponownie</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Plik z rozszerzeniem {0} nie jest kompatybilny.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Niekompatybilne rozszerzenie pliku</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Wybrany plik obrazu może być zbyt duży, aby uzyskać optymalną wydajność.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Czy na pewno chcesz odinstalować wybrany motyw? Dezinstalacja będzie zakolejkowana do następnego uruchomienia aplikacji.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Wbudowane motywy nie mogą być odinstalowane.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Ten motyw nie wspiera obecnej wersji Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Czy na pewno chcesz odinstalować wybraną wtyczkę? Dezinstalacja będzie zakolejkowana do następnego uruchomienia aplikacji.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Wbudowane wtyczki nie mogą być odinstalowane.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Ta wtyczka nie wspiera obecnej wersji Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Ścieżka instalacji</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Katalog danych</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Tworzenie pakietu diagnostycznego...</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Wysyłanie pakietu diagnostycznego...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Importuj plik...</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Co to jest?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Czy na pewno chcesz to zrobić?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Całkowity czas gry</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Średni czas gry</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Najdłuższy czas gry</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Całkowity rozmiar instalacji</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Przegląd</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Pasek boczny</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Wyświetl w panelu bocznym</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Zresetuj ustawienia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Wszystkie ustawienia aplikacji zostaną zresetowanie do wartości domyślnych, oprócz:\r\n-Lokalizacji bazy danych\r\n-Listy wyjątków\r\n-Ustawień rozszerzeń, łącznie z biblioteką integracji\r\n    \r\nAplikacja musi zostać uruchomiona ponownie aby zakończyć operację. Na pewno chcesz zresetować ustawienia?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Dla programistów</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Zewnętrzne rozszerzenia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Wprowadź pełną ścieżkę folderu.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Osiągnięcia</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Aktualności</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Strona w sklepie</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Wstępna konfiguracja nie została ukończona. Playnite zostanie uruchomiony ponownie w trybie pełnoekranowym, aby zakończyć konfigurowanie.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Ostatnio uruchomione</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Ulubione</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Najczęściej grane</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Wszystko</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Zastosowano filtry.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Zastosowano dodatkowe filtry.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Wyniki wyszukiwania dla:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Element o tej nazwie już istnieje.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Zawęź wybór do bieżącego filtra</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Wybierz inną</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Dodatki</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Zainstalowano</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Ustawienia rozszerzeń</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Przeglądaj</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Aktualizacje</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Aktualizacje ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Zarządzanie zainstalowanymi rozszerzeniami, wraz z ich ustawieniami, zostało przeniesione do nowego menu &quot;Dodatki&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Wszystkie zainstalowane rozszerzenia bibliotek integracji mogą być tutaj konfigurowane.\r\n\r\nJeśli chcesz zainstalować lub odinstalować dodatkowe integracje, użyj opcji &quot;Dodatki&quot; z głównego menu.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Motywy pulpitu</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Motywy pełnoekranowe</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Wyszukiwanie...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Dodatek nie jest kompatybilny z tą wersją Playnite. </sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Nie udało się pobrać pakietu instalacyjnego dodatków.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Nie udało się pobrać manifestu instalacyjnego dodatków.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Wymagane jest ponowne uruchomienie aplikacji, aby zastosować oczekujące zmiany.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Ten dodatek został zakolejkowany do instalacji.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Instaluj</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Ponowna instalacja</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Odinstaluj</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Zainstalowano</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Nie znaleziono nowych aktualizacji dodatku.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Aktualizacja dodatków</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Lista zmian jest niedostępna</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Zaplanowana instalacja</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Pobieranie nieudane</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Licencja odrzucona</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Pobieranie {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Wyszukiwanie aktualizacji dodatków...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Wyszukiwanie aktualizacji programu…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">aktualizacja jednego lub większej ilości dodatków jest dostępna.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Wybierz elementy do aktualizacji</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Instancja rozwoju rozszerzenia</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} umowa licencyjna</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Akceptuj</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Odrzuć</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Uwzględnij działania związane z integracją biblioteki</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Wybierz akcję</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Tryb śledzenia</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Ścieżka śledzenia</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Wstępne opóźnienie śledzenia</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Śledzenie częstotliwości</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Link</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Plik</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Skrypt</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Domyślnie</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Proces</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Folder</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Oryginalny proces</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Nazwa procesu</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Rejestruj powiadomienia śledzenia</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Powyższe zmiany nadpiszą dane dla wszystkich wybranych gier!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Brak</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Jednolita</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Tylko obiekty</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Tylko początek i koniec</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Czułość przewijania</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Płynne przewijanie</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Szybkość animacji</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Usunąć element?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Jesteś pewien, że chcesz usunąć ten element?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Pokaż przyciski na panelu górnym:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Ustawienia widoku głównego</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Ustawienia grupowania</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Ustawienia sortowania</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Szablony filtrowania</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Położenie elementów wtyczki</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Szerokość separatora sekcji</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Przenieś przycisk głównego menu do panelu bocznego</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Panel eksploratora</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Losowa gra</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Wyświetla losowy selektor gier</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Wybierz losową grę z widoku</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Zapisz ustawienia grupowania i sortowania</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Pokaż jako szybki filtr w trybie pełnego ekranu</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">W minionych 7 dniach </sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">W minionych 31 dniach</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">W minionych 356 dniach</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Więcej niż 365 dni temu</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Konfiguruj</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Zapisz szablon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Minimalizuj po uruchomieniu gry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Minimalizuj Playnite po uruchomieniu gry.\r\n\r\nZablokowanie tej opcji może prowadzić do problemów z grami wymagającymi pełnej uwagi podczas uruchamiania!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Rozmiar czcionki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Mały rozmiar czcionki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">Włącz obsługę API kontrolera gier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Wsparcie dla kontrolera gry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Jeśli jest wyłączona, Playnite nie będzie akceptować żadnych wejść kontrolera gry.\r\n\r\nWyłącz, jeśli używasz narzędzi, które tłumaczą wejścia kontrolera gry na wejścia myszy/klawiatury i otrzymujesz podwójne wejścia w Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Wyświetlaj w menu głównym:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Odwrócone przypisanie przycisków X/A w widoku głównym</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Zamienia przypisania przycisków dla uruchamianej gry i pokazuje szczegóły gry w widoku głównym.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Zamień powiązanie przycisku potwierdzenia/anulowania</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Odwraca przypisania przycisków A/B do potwierdzenia i anulowania.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Tylko główny kontroler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Akceptuj dane wejściowe z podstawowego kontrolera tylko wtedy, gdy włączone.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Przycisk przewodnika wyzwala Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Głośność interfejsu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Głośność tła</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Wycisz, kiedy jest w tle</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Nie można zainicjować interfejsu audio. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Wyjście API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API użyty jako wyjście audio. Zmień, jeśli masz problemy z dźwiękiem.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Ogólny</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Wygląd</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Audio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Układ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Wejście</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} jest uruchamiane..</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} jest uruchomione...</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Caps</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Spacja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Skaler renderowania obrazu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Opcjonalnie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Zbalansowane</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Jakość</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Jakość:\r\nNajlepsza jakość, niska wydajność, wysokie zużycie pamięci.\r\n    \r\nZbalansowane:\r\nDobra jakość, wysoka wydajność, niskie zużycie pamięci.\r\n    \r\nOpcjonalnie:\r\nLepsza jakość, średnia wydajność, niskie zużycie pamięci.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Wybierz plik...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Wybierz folder...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Skrypt startowy</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Proszę wziąć pod uwagę, że zarówno rozszerzenia jak i motywy mogą w dużym stopniu wpływać na wydajność, stabilność i bezpieczeństwo Playnite.\r\n    \r\nJeżeli doświadczasz problemów po instalacji motywu lub rozszerzenia, spróbuj je zablokować/odinstalować aby sprawdzić czy są źródłem problemu.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Wybierz podczas uruchomienia</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Wybierz przy uruchamianiu</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Wbudowane profile</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Wbudowany profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Profile niestandardowe</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Profil niestandardowy</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Obsługiwane przez wbudowany skrypt</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Specyfikacja emulatora</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Specyfikacja platformy</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Specyfikacja regionu</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Wykonaj przed uruchomieniem emulatora</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Wykonaj po uruchomieniu emulatora</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Wykonaj po zakończeniu emulacji</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Nie znaleziono pliku wykonawczego emulatora.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Nie znaleziono specyfikacji emulatora.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Nie znaleziono skryptu uruchamiającego emulatora.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Podziel jako oddzielne gry</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Połącz w jedną grę</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Ustaw platformę</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Ustaw region</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Skanuj folder</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Skanuj konfigurację</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Wyklucz wzorce ze skanu sumy kontrolnej</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Pliki spełniające dany wzorzec nie będą skanowane pod kątem sumy kontrolnej oraz zostaną dopasowane po nazwie pliku. Więcej informacji dostępne na stronie pomocy emulatora.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Skanuj przy pomocy emulatora</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Należy podać nazwę przy zapisywaniu nowej konfiguracji.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Emulator lub profil emulatora nie jest ustawiony.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Skanowany katalog nie został określony lub nie istnieje.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Konfiguracja skanowania nie została ustawiona poprawnie.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Zawrzyj w automatycznym skanowaniu zbiorczym</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Skanowanie folderu w poszukiwaniu emulatorów nie powiodło się.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Skanowanie folderów w poszukiwaniu emulowanych gier nie powiodło się.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Ukryj zaimportowane</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Profile do importu:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Automatyczne skanowanie konfiguracji</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Zapisz jako automatyczne skanowanie konfiguracji</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Zapisz konfiguracje do dalszego użytku w trakcie aktualizacji biblioteki. Zapisane konfiguracje mogą być zarządzane przez menu &quot;Konfiguracja Emulatorów&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Importuj używając ścieżek względnych</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Jeśli to możliwe, zaimportuj pliki gry używając ścieżek względem folderu instalacyjnego Playnite lub folderu instalacyjnego emulatora.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Skanowanie podfolderów</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Zeskanuj wewnątrz archiwów</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Scal powiązane pliki</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Scal powiązane pliki gry, takie jak indywidualne dyski gry, pod jednym wpisem do gry.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Dodaj skaner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Dodaj zapisany skaner</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Rozpocznij skanowanie</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Dodaj konfiguracje skanowania emulatorami do skanowania konkretnych folderów. Upewnij się, że emulatory zostały poprawnie skonfigurowane przed importowaniem gier (za pomocą menu Biblioteka -&gt; Konfiguruj Emulatory).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Status domyślny przypisany do nowo dodanych gier.</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Status przypisany do gier uruchomianych po raz pierwszy</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Nie udało się znacjonalizować skryptu uruchomienia PowerShell. Jeżeli używasz Windows 7, spróbuj przeinstalować PowerShell 5.1 aby naprawić problem.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Szablon filtrowania o podanej nazwie już istnieje. Zaktualizować przy pomocy nowych ustawień?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Automatyczne uzupełnianie brakujących nazw sortowania dla gier dodanych lub edytowanych zbiorczo</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">Podczas edycji gry, dodawania gier poprzez aktualizację biblioteki, skanowania folderu emulatora lub normalnego skanowania folderu program automatycznie wypełni pole „Nazwa sortowania” lepszym, łatwiejszym do sortowania oznaczeniem nazwy gry. Na przykład „The Witcher 3” otrzyma nazwę sortowania „Witcher 03”. Nie zostanie ustawiona nazwa sortowania, która różni się od nazwy gry, przy czym automatycznie aktualizowane będą tylko puste nazwy sortowania.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Te słowa zostaną usunięte z początku automatycznie wypełnionej wartości Nazwa Sortowania:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Użyj tego, aby zignorować słowa na początku ciągu do sortowania. Wartością domyślną jest &quot;The&quot;, &quot;An&quot; i &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Wypełnij Nazwę Sortowania dla gier, które go nie mają</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Sortowanie</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Wypełnianie wartości Nazwy Sortowania</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Wykryto uruchomioną usługę Nahimic na Twoim systemie. Usługa znana jest z tego, że powoduje poważne problemy z renderowaniem w Playnite (i innych aplikacjach).\r\n\r\nJeżeli napotkasz jakiekolwiek problemy z grafiką lub inne problemy z renderowaniem w Playnite, zalecamy wyłączenie lub całkowite odinstalowanie usługi Nahimic.\r\n\r\nWięcej informacji na stronie https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite jest uruchomiony z uprawnieniami administratora. Nie jest to zalecane, ponieważ przyznaje to uprawnienia dla wszystkich zainstalowanych rozszerzeń i wszystkich gier/aplikacji uruchamianych z Playnite!\r\n\r\nWięcej informacji na https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Pokaż ostrzeżenia jeżeli Playnite jest uruchomiony z uprawnieniami administratora</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Uzyskaj rzeczywisty rozmiar na dysku przy obliczaniu rozmiaru gier</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Jeśli włączone, skanowanie będzie wolniejsze, ale uzyska rzeczywisty rozmiar plików używanych na dysku.\r\nJeśli wyłączone, skanowanie będzie szybsze , ale użyje rozmiaru samych plików.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Poniższe rozszerzenia zostały zgłoszone jako potencjalnie problematyczne mający duży wpływ na stabilność/wydajność lub problemy z bezpieczeństwem. Zalecamy, ich odinstalowanie:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Wykluczenie online plików ze skanowania</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Pliki przechowywane w chmurze nie będą skanowane i zaimportowane, dopóki nie będą dostępne lokalnie.\r\nWsparcie tylko dla: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Skanuj używając uproszczonej metody bez zawartości plików</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Pliki zostaną zaimportowane, wykorzystując mniej dokładną metodę, która nie wymaga pobierania zawartości pliku i zapisania go lokalnie</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Zastosuj dla wszystkich</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Zastąp stan instalacji</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Po ustawieniu Playnite zignoruje stan instalacji (w tym katalog instalacyjny) ustawiony przez wtyczkę integracyjną, która importuje tę grę.\r\n        \r\nTa opcja może nie działać w pełni z wtyczkami, które używają konkretnej metody importu gry, chyba że wezmą również pod uwagę tę opcję nadpisania.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Tylko ręcznie</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Raz dziennie</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Raz w tygodniu</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Przy każdym uruchomieniu</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Sprawdź aktualizacje programu</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Sprawdź aktualizację dodatków</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Aktualizuj bibliotekę</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Skanuj foldery emulacji</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Uwzględnij ukryte gry</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Edytuj pola</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Zaznacz / Odznacz wszystko</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Otwórz</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Aktywuj\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Przypisz\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Wpisz, aby wyszukać | Pomoc: [F1]</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Przydatne funkcje:\r\n• # – wyświetla listę dostępnych poleceń\r\n• / – wyświetla listę dostępnych dostawców wyszukiwarek/wtyczek\r\n• Wprowadzenie słowa kluczowego i spacji przełącza do wyników\r\n\r\n• TAB – przełącza akcję\r\n• ENTER – aktywuje wybraną akcję\r\n• SHIFT+ENTER – otwiera menu pozycji</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Uwzględnij niezainstalowane gry</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Uwzględnij ukryte gry</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Niezainstalowane gry są dołączone</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Niezainstalowane gry są wykluczone</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Ukryte gry uwzględnione</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Wykluczone ukryte gry</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Graj lub zainstaluj</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Szczegóły</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Menu gry</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Edytuj grę</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Otwórz wyszukiwarkę</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Pole wyszukiwania</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Przycisk szukaj</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Podstawowa akcja gry</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Drugorzędna akcja gry</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F otwiera wyszukiwanie globalne zamiast podświetlenia pola wyszukiwania</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Zapisz ustawienia filtra gry pomiędzy sesjami wyszukiwania</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Dostawcy wyszukiwania</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Domyślne słowo kluczowe</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Własne słowo kluczowe</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Skrót systemowy</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Wyszukiwanie Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Ustawienia rozszerzenia</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Wykluczenia</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Wykluczone pliki względem folderu skanowania</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Wykluczone foldery względem folderu skanowania</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Dodaj plik do listy wykluczonych</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Dodaj folder do listy wykluczonych</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Wykluczenia mogą być dodawane tylko do zapisanych konfiguracji skanera.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Wykluczenia zostały dodane do skanera &quot;{0}.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Nadpisz platformę</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Kiedy ustawiony, skaner przypiszę tę platformę do wszystkich gier, nadpisując automatycznie wykryte platformy.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Dołącz polecenia w domyślnym wyszukiwaniu</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Po wyłączeniu, polecenia nie będą uwzględniane w domyślnym wyszukiwaniu, dopóki nie zostanie użyty prefiks #.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Użyj analizy podobieństw tekstu w filtrze nazw</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Gdy włączone, filtr nazw będzie odpowiadał nazwom gry w taki sam sposób, jak wyszukiwanie globalne.\r\nŚcisłe dopasowanie może być wymuszone na pojedynczym przypadku używając prefiksu &quot;!&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Pola wyświetlane dla wyników gry:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Ukryty Status</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Tworzenie kopii zapasowej zostało anulowane</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Tworzenie kopii zapasowej nie powiodło się</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Wystąpił błąd podczas tworzenia kopii zapasowej</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Tworzenie kopii zapasowej...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Przywracanie danych z kopii zapasowej...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Przywracanie danych z kopii zapasowej zakończone niepowodzeniem.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Ustawienia</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Biblioteka gier</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Media biblioteki gier</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Zainstalowane rozszerzenia</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Dane rozszerzeń</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Zainstalowane motywy</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Wybierz dane do przywrócenia z określonego pliku kopii zapasowej.\r\n    \r\nPlaynite automatycznie uruchomi się ponownie, aby rozpocząć proces przywracania kopii zapasowej.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Wybierz elementy, które mają być dołączone do kopii zapasowej danych. Ustawienia aplikacji i dane biblioteki gier są domyślnie włączone.\r\n    \r\nPlaynite automatycznie uruchomi się ponownie, aby rozpocząć proces tworzenia kopii zapasowej.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Automatyczna kopia zapasowa danych</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Częstotliwość automatycznej kopii zapasowej</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Folder kopii zapasowych</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Rotacyjne kopie zapasowe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Dołącz dodatkowe dane:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Folder kopii zapasowej musi być określony, jeśli funkcja automatycznej kopii zapasowej jest włączona.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Pokaż powiadomienia tylko o wydaniach łatki</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Gdy włączone, tylko aktualizacje dostępne dla aktualnie zainstalowanego głównego wydania spowodują powiadomienie o aktualizacji.\r\nNowe główne wydania nie będą skutkować powiadomieniem o aktualizacji.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Użyj dat względnych dla ostatniego tygodnia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Użyj względnych dat w formacie &quot;Dziś&quot;, &quot;Wczoraj&quot; itp. jeśli data nie jest starsza niż tydzień.\r\n    \r\nOkreślony format daty będzie używany dla wszystkich innych dat.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Wyszukiwanie obrazów w Internecie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Ciąg wyszukiwania obrazów ikon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Ciąg wyszukiwania obrazu okładki</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Ciąg wyszukiwania obrazów w tle</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Pobieranie informacji o dodatku…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Brak źródła metadanych</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Otwórz ustawienia akcji</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Użyj ustawień skanera</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Wybierz profil przy uruchamianiu</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Wybierz emulator przy starcie</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automatyczny</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Zawsze włączone</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Zawsze wyłączone</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Dostępność (czytnik ekranu)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Menu aplikacji</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Menu gry</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Folder programu</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Katalog danych użytkownika</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Wykryto uszkodzenie pliku biblioteki, Playnite zostanie wyłączony.\r\n    \r\nOtwórz nowy problem na stronie GitHub Playnite z prośbą o naprawienie uszkodzeń w plikach.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Czy chcesz zapisać zmiany?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Instalacja przenośna</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Nie wykryto kontrolerów</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/pt_BR.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Português Brasileiro</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Idioma do Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Sair</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtro ativado</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtro desativado</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Filtros adicionais</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtros</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtro</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Dados Inválidos</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Salvar alterações?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Site oficial em www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Código fonte no GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Criar pacote de diagnóstico</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Enviar informações de diagnóstico</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Sobre o Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Criado por Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Atribuir categorias</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Definir categorias</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Adicionar categoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Selecionada - Atribui a categoria\r\nNão selecionada - Remove a categoria\r\nIndeterminada - Nenhuma alteração (quando editando vários jogos)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Sem categoria</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Sem plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ops! Algo deu errado…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Ocorreu um erro irrecuperável.\r\n\r\nSe você deseja nos ajudar à arrumar este problema, por favor, explique brevemente as ações realizadas antes do erro, e envie os dados de diagnóstico. Se você estiver online, o pacote será enviado para os servidores da Playnite para análise.\r\n\r\nOu também, você pode clicar em &quot;Relatar Falha&quot; e criar um tópico no GitHub e relatar o travamento manualmente.\r\n\r\nObrigado pela sua ajuda.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">A extensão &quot;{0}&quot; causou um erro irrecuperável.\r\n\r\nRecomendamos que você salve o arquivo de log e relate o problema para o desenvolvedor da extensão. Se os problemas persistirem, desabilite a extensão.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">A extensão &quot;{0}&quot; causou um erro irrecuperável.\r\n\r\nRecomendamos que você relate o problema para o desenvolvedor da extensão. Se os problemas persistirem, desabilite a extensão.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Uma extensão ou tema desconhecido causou um erro irrecuperável.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Ocorreu um erro irrecuperável.\r\n \r\nSe você deseja nos ajudar a corrigir este problema, por favor envie informações de diagnóstico. Obrigado.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Desabilitar extensão</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Salvar arquivo de log</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Enviar diagnóstico</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Relatar falha</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Reiniciar o Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Reiniciar no modo de segurança</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Desabilitando todas as extensões de terceiros e usando o tema padrão.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Sair do Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Ações executadas antes do travamento (em inglês):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Gerenciador da biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Remover jogo(s)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Não foi possível remover - Jogo ou instalador em execução.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Não foi possível desinstalar - Jogo em execução.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Tem certeza que deseja remover {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Tem certeza de que deseja remover estes {0} jogos?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Tem certeza que deseja remover {0}?\r\n\r\nSelecionar a opção &quot;adicionar a lista de exclusão&quot; impedirá que o jogo seja importado novamente na próxima vez que a biblioteca for atualizada.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Tem certeza de que deseja remover estes {0} jogos?\r\n\r\nSelecionar a opção &quot;adicionar a lista de exclusão&quot; impedirá que o jogo seja importado novamente na próxima vez que a biblioteca for atualizada.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Você tem certeza de que deseja remover {0} entradas que atualmente não estão em uso?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Nenhum campo não utilizado encontrado.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Sim (adicionar à lista de exclusão)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Existem alterações não salvas nesta seção</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Atualizando o formato da biblioteca de jogos…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Falha ao atualizar o banco de dados, não foi possível abrir o arquivo.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Não foi possível atualizar a biblioteca. Pelo menos {0} MBs de espaço livre são necessários para continuar.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Erro do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Não foi possível iniciar o jogo. &quot;{0}&quot; não foi encontrado no banco de dados.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Não foi possível iniciar o jogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Não foi possível iniciar a ação: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Não foi possível abrir o local do jogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Não foi possível detectar o tamanho da instalação do jogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Erro ao procurar o tamanho da Instalação</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Ocorreram {0} erros durante a varredura do tamanho da instalação</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Falha ao criar o atalho: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Falha ao abrir manual: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Não foi possível instalar o jogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Não foi possível desinstalar o jogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Nenhuma ação válida de inicialização do jogo foi encontrada. Ao usar ações do emulador, certifique-se de que as definições da plataforma correspondem entre a configuração do jogo e o emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Implementação da instalação indisponível.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">A extensão da biblioteca responsável por este jogo está desabilitada ou não foi instalada.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">O download de metadados oficial não está disponível.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Nenhum jogo foi selecionado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">A execução do script da ação do jogo falhou.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">A execução do script da aplicação falhou.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">A execução do script da ação global falhou.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Execução do script do emulador falhou.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">A execução do script de ação de jogar falhou.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 ou mais recente não está instalado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Não foi possível determinar como iniciar o jogo.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Habilitado</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Desabilitado</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Remover</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Remover não utilizadas</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Renomear</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Copiar</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Adicionar</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Ícone padrão</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Imagem de capa padrão</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Imagem de fundo padrão</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Concluir</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Próximo</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Anterior</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">CONCLUÍDO</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">VOLTAR</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">LIMPAR</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Limpar</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Recusar</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Recusar tudo</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importar</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nome</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Módulo</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Série</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versão</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Última sessão</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Mais jogado</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Vezes jogado</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Tamanho da Instalação</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Pasta</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notas</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Adicionado</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Data de adição</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Modificado</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Data de modificação</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Site</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Caminho</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Salvar</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Fechar</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Cancelar</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Confirmar</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Reiniciar</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Sim</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Não</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Boas-vindas</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Usuário local</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Geral</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Mídia</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Instalação</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Ações</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Baixando…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Baixando mídia…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Carregando…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Tipo</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Perfil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Perfis</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Remover</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Baixar</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Buscar</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Resolução:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Qualquer</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Ampliar/Reduzir</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Visualização de lista</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Capas</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Visualização de grade</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Visualização de detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Personalizado</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Agradecimentos especiais</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licença</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Colaboradores</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Saindo do Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Hoje</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Ontem</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Segunda-feira</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Terça-feira</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Quarta-feira</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Quinta-feira</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Sexta-feira</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Sábado</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Domingo</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Na última semana</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">No último mês</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">No último ano</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Há mais de um ano</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 a 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB a 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB a 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB a 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB a 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB a 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB a 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB ou mais</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Importação concluída com sucesso.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Todos os jogos</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Id do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Id no banco de dados</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Predefinições</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Coluna</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Colunas</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Linha</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Linhas</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Não foi possível extrair ícone da ação Jogar. Não há ação do tipo de Arquivo presente.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Baixar somente metadados ausentes</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Habilitar esta opção fará com que novos metadados não sejam baixados para os campos já preenchidos.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Seleção de jogos</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Selecione quais jogos devem ser atualizados com novos metadados:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Todos os jogos do banco de dados</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Todos os jogos filtrados atualmente</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Todos os jogos selecionados</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Nenhum campo de metadados selecionado</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Não há campos de metadados selecionados para download. Por favor, selecione pelo menos um e ative pelo menos um provedor de metadados para ele.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Loja oficial</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Selecione quais campos devem ser preenchidos automaticamente pelo Playnite e quais fontes devem ser usadas para obter os dados.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Por favor, considere clicar no logo acima e contribuir com informações para o banco de dados do igdb.com para melhorar os dados utilizados pelo Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Baixando metadados…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importando jogos instalados…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importando jogos do(a) {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importando jogos emulados de {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Baixando atualizações da biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Verificando o tamanho dos jogos na biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Verificando tamanho dos jogos importados…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Atualização da biblioteca concluída</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Liberando recursos…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Configuração</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Configurações…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Plataformas e emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Configurar emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Gerenciador da biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Ferramentas</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Baixar metadados…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Ferramentas…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Configurar Integrações…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Abrir cliente de terceiros</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Clientes de terceiros</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Recarregar lista de jogos</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Cancelar atualização de biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Atualizar pastas emuladas</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Adicionar jogos</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manualmente…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Escanear automaticamente…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Jogo emulado…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Aplicativo da Microsoft Store…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Sobre o Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Enviar comentários</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Mudar para o modo tela cheia</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Ajuda</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Apoie-nos no Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Apoie-me no Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Manual do usuário</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Documentação do SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Reiniciar o sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Desligar o sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Suspender o sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernar o sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Bloquear Sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Logout de Usuário</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Selecionar um jogo aleatório</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Campos de jogo exibidos no painel de detalhes:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Espaçamento entre itens</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Desenhar fundo nos itens da grade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Largura das bordas no esquema de grade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Fonte do ícone do jogo ausente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Fonte da capa do jogo ausente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Fonte do fundo do jogo ausente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Espaçamento vertical nos detalhes do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Posição dos detalhes na visualização de grade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Posição da lista de jogos na visualização de detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Desenhar separador entre painéis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Altura da capa do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Altura dos ícones na lista de jogos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Fonte do aplicativo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Fonte monoespaçada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Posição do painel de filtros</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Posição do painel de navegação</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Renderização da arte da capa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Proporção correta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">As seguintes opções também afetam a renderização lado-a-lado no modo tela inteira!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Modo de ampliação</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Caixa do DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Quadrado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Banner da Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Capa vertical da Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Requer reinicialização para aplicar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Configurações</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Geral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Painel superior</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Aparência</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Detalhes do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Esquema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Avançado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Tela cheia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Entrada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Desempenho</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Atualizando</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Busca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Backup</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Dados da biblioteca de backup</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Restaurar Backup de Dados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importar alterações na biblioteca automaticamente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Local do arquivo do banco de dados inválido, o caminho correto do arquivo deve ser configurado.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">O nome da conta não pode estar vazio.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Baixar metadados depois de importar jogos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Abrir o Playnite minimizado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Abrir o Playnite quando o seu computador for iniciado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Iniciar minimizado para a bandeja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Falha ao registrar o Playnite para ser executado ao iniciar o sistema.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Abrir no modo tela inteira</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Carregamento de imagens assíncrono</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Melhora a suavidade da rolagem nas listas de jogos, mas as imagens podem carregar mais lentamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Mostrar o nome do jogo quando não houver capa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Mostrar o nome dos jogos na visualização de grade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Escurecer jogos não instalados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Mostrar o ícone dos jogos na visualização de detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Mostrar um contador de itens nas descrições de grupos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Mostrar somente campos selecionados nos painéis de filtro e explorar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Desabilitar a aceleração de hardware</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Use se experienciar travamentos ou problemas com a interface.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Mostrar jogos escondidos na lista de inicio rápido</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Afeta a lista de opções e lista de menu de bandeja.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Número de itens na lista de inicialização rápida</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Usar a imagem de fundo do jogo como fundo da janela</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Desfocar fundo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Alta qualidade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Escurecer fundo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Mostrar na visualização de grade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Perfil do tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Tema em tela cheia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Perfil do tema em tela cheia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Local do banco de dados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Estado da sessão:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Configurações do Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Limpar o cache web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Pode resolver problemas encontrados ao vincular contas.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Mostrar ícone da bandeja de sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimizar Playnite para a bandeja de sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimizar Playnite para a bandeja de sistema quando a janela for fechada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Ao iniciar um jogo:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Ao fechar um jogo:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Formatar tempo jogado para indicar o número de dias jogados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Formatos de datas:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Todas as contas de serviços configuradas serão desvinculadas. Será necessário reiniciar o aplicativo, você deseja continuar?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Limpar o cache?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">É necessário reiniciar o Playnite para aplicar um novo tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Baixar mais temas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Como criar um novo tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Obter mais extensões</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Criar uma nova extensão</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Ajude-nos a traduzir Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite precisar ser reiniciado para aplicar as novas configurações. Reiniciar agora?\r\n\r\nReiniciar cancelará qualquer tarefa ativa (downloads) atualmente em andamento.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Reiniciar o Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite não pode mover os arquivos da biblioteca automaticamente. Você deve mover/copiar os arquivos manualmente antes de alterar o local. Se não houver nenhuma biblioteca no local selecionado, uma nova será criada.\r\n\r\nO novo local do banco de dados não será utilizado até Playnite ser reiniciado.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">O tempo de jogo não será gravado se a ação de fechar for definida.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Número de linhas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Número de colunas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Número de linhas na visualização de detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Mostrar imagem de fundo na tela principal</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Não se aplica retroativamente a jogos existentes sem baixar novamente os metadados.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importar tempo jogado de jogos na biblioteca:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Configura quando o Playnite deve importar o tempo de jogo relatado pelos plugins da biblioteca para jogos no banco de dados do Playnite. O suporte pelos plugins da biblioteca responsáveis por lidar com o(s) jogo(s) é necessário para poder usar este recurso.\r\n\r\nSempre: Importe o tempo de jogo para jogos recém-importados e para jogos existentes no banco de dados do Playnite.\r\nSomente para jogos recém-importados: Importe o tempo de jogo somente para novos jogos importados.\r\nNunca: Não importe o tempo de jogo sob nenhuma circunstância.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Sempre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Somente para jogos recém-importados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Nunca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Habilitar suporte para controles no modo janela</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Botão painel abre o modo tela cheia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Download automático de metadados para jogos importados recentemente.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Monitor de destino</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Sempre usar monitor principal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Mostrar títulos dos jogos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Mostrar estado da bateria</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Mostrar porcentagem da bateria</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Mostrar relógio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Esconder cursor do mouse</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Instalado apenas nos filtros rápidos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Aparência dos botões</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Esquema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Rolagem horizontal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Selecione uma das subseções</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Não há configurações disponíveis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Falha ao carregar configurações.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Estes scripts serão executados para todos os jogo na sua biblioteca. Scripts individuais podem ser atribuídos a cada jogo separadamente ao editar os detalhes de um jogo.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Transições para imagens de fundo animadas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Tamanhos das fontes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automático</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Sem suavização</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Tons de cinza</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Tela</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Modo de formatação de texto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Modo de renderização de texto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Atualmente, as opções de renderização e formatação de texto não se aplicam ao texto na descrição dos jogos.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Pré-carregar imagens de fundo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Se habilitado, o Playnite baixará as imagens de fundo enquanto baixa os metadados. Mais espaço em disco será usado e disponibilizando as imagens mesmo quando estiver offline.\r\n \r\nSe desabilitado, as imagens de fundo só serão baixadas quando necessário. Menos espaço será usado, mas pode resultar em atrasos na exibição das imagens e algumas imagens podem não estar disponíveis quando estiver offline.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Fechar automaticamente lançadores de terceiros ao sair do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Período de atraso ao fechar cliente (em segundos)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Não fechar após sessões mais curtas do que (em segundos)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Fechar automaticamente os seguintes clientes:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Fechar clientes automaticamente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importar lista de exclusão</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Exibir aviso quando atribuir arquivos de mídia muito grandes a jogos</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Comando para abrir diretório</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Organização de classificação etária preferida</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Atualizar o tamanho da instalação de jogos ao atualizar a biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Verifica e atualiza o tamanho de instalação dos jogos se for detectado que seus arquivos foram modificados desde a última verificação</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Nenhum</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Preenchimento</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Preenchimento uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Esquerda</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Direita</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Topo</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Fundo</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Erro de importação</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Autenticação requerida</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Falha na autenticação</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Modo de renderização de visualização da web alternativo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Usar quando experienciar problemas com web views, por exemplo os diálogos  de autenticação  de integrações.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Carregamento parcial de descrições de jogo longas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Grandes descrições podem causar um atraso visível ao selecionar os jogos.\r\n\r\nQuando ativado, somente parte do texto da descrição será inicialmente carregado, com uma opção para carregar o resto sob demanda.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Importar metadados</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Baixar metadados</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Defina a configuração selecionada para ser usada sempre que metadados forem baixados.\r\nEsta opção também pode ser alterada nas configurações do aplicativo.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Assistente de importação de emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Este assistente irá guiá-lo no processo de baixar e importar emuladores de consoles e jogos de console emulados.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Tenha em mente que você sempre pode adicionar outros emuladores e/ou jogos mais tarde através do menu principal (no menu &quot;Biblioteca&quot; para configurações de emuladores e no menu &quot;Adicionar jogos&quot; para jogos emulados).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Abaixo está alista de emuladores que Playnite pode reconhecer e configurar automaticamente. Você pode baixar os instaladores de seus respectivos websites. Depois de ter os emuladores instalados (manualmente), você pode importa-los no diálogo de configuração de emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Você pode importar qualquer emulador que esteja instalado em seu computador clicando no botão 'Detectar automaticamente da pasta…'. Playnite irá pesquisar a pasta selecionada por qualquer emulador conhecido e fornecerá a opção de importá-los. Você pode usar este botão várias vezes para importar emuladores de pastas diferentes. Emuladores serão adicionados na parte inferior da lista atual.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Você pode importar jogos clicando no botão 'Escanear Pasta Usando Emulador'. Selecionando o emulador apropriado dirá para Playnite quais tipos de arquivo devem ser escaneados e importados. Você pode usar este botão várias vezes para importar jogos de pastas diferentes. Jogos serão adicionados na parte inferior da lista atual.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Não há emuladores selecionados para importação. Você não poderá importar automaticamente nenhum jogo emulado sem configurar os emuladores primeiro. Tem certeza de que deseja continuar e sair do processo de importação?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Não há emuladores configurados no Playnite. Você não pode importar jogos sem antes configurar o emulador e selecionar os tipos de arquivo apropriados. Deseja adicionar alguns emuladores agora?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Escanear pasta usando um emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Selecionar arquivos</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Detectar automaticamente da pasta…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Configurar emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Escaneando…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Escaneando {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Configuração inicial</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Este assistente irá guiá-lo no processo de importação e configuração automático de bibliotecas de jogos externas. O Playnite pode importar jogos automaticamente de vários serviços, como Steam ou GOG, além de manter a sua biblioteca atualizada, atualizando automaticamente quando a aplicação é iniciada.\r\n\r\nTenha em mente que você pode adicionar qualquer jogo personalizado de qualquer plataforma manualmente através do botão 'Playnite' no menu principal.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integração com a biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Abaixo temos uma lista curada de algumas integrações de biblioteca que o Playnite suporta. Por favor selecione as que você deseja instalar.\r\n\r\nMais integrações poderão ser instaladas posteriormente a partir do menu de &quot;Extensões&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Configuração concluída</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">A configuração inicial foi concluída. Lembre-se que você pode alterar várias opções a qualquer momento no menu &quot;Configurações&quot;.\r\n\r\nVocê também sempre pode adicionar mais jogos clicando no menu no logo do Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Falha ao baixar uma ou mais extensões.\r\n\r\nVocê pode tentar baixar novamente as integrações pelo menu de extensões após o assistente de primeira execução terminar.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Baixando {0} integrações...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Baixando lista de integrações recomendadas…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Falha ao baixar a lista de integrações recomendadas. Você pode tentar e baixar novamente as integrações mais tarde através do menu de extensões.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Configurar plataformas e emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Configurar emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Plataformas</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Adicionar plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Selecionar ícone</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Selecionar capa</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Selecionar imagem</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Selecionar item</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Selecionar fundo</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Selecionar arquivo</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Selecionar URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Adicionar emulador</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Plataformas compatíveis</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Você deseja salvar as alterações nas plataformas?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Você deseja salvar as alterações nos emuladores?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Executável</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumentos</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Pasta de trabalho</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Tipos de arquivo compatíveis</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importar emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Baixar emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Carregar argumentos predefinidos do perfil de um emulador conhecido</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Tem certeza de que deseja remover o emulador {0}?\r\nEle está sendo usado por {1} jogos(s).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Tem certeza de que deseja remover a plataforma {0}?\r\nEla está sendo usada por {1} jogos(s) e {2} emulador(es).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Ajuda para configuração</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Classificar por</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Direção de classificação</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Agrupar por</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Ascendente</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Descendente</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Não agrupar</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Agrupar por biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Agrupar por categoria</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Agrupar por plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Tipo de visualização</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Visualização</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Painel de navegação</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Painel de filtros</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ícone</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Ícone de Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Imagem de capa</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Imagem de fundo</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Nome de classificação</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manual</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nome</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Unidade de Instalação</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Nome da conta</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Categorias</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Gêneros</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Data de lançamento</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Ano de lançamento</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Desenvolvedor</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Marcadores</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Distribuidora</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Estado da instalação</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Combinar todos os filtros</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Se habilitado, só jogos que usem todos os itens em todos os filtros serão incluídos na visualização.\r\nSe desabilitado, jogos que usem qualquer item em qualquer filtro serão incluídos na visualização.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Não instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Oculto</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favorito</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Ativar o suporte HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Se ativado, o HDR ficará ativo no monitor principal antes de iniciar o jogo.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Note que seu monitor principal não suporta HDR.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Última sessão</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Categorias</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Descrição</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Local de instalação</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Imagem de capa</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Links</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Caminho da imagem, ROM ou ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Gênero</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Gêneros</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Empresa</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Empresas</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Desenvolvedor</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Desenvolvedores</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Distribuidora</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Distribuidoras</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Categorias</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Marcador</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Marcadores</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Característica</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Características</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Classificação indicativa</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Classificação indicativa</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Região</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regiões</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Fonte</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Fontes</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Atividade Recente</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Erro no banco de dados</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Falha ao abrir o banco de dados da biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">O banco de dados não está aberto.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Não foi possível acessar o banco de dados da biblioteca. O arquivo &quot;{0}&quot; está sendo usado por outro processo ou está em um local inacessível.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Falha ao criar o pacote de diagnóstico.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Falha ao enviar automaticamente o pacote de diagnósticos.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">As informações de diagnóstico foram enviadas com sucesso.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">O pacote de diagnósticos foi criado e enviado com sucesso.\r\nAnexe a seguinte ID ao seu relatório de falha:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Falha ao importar os jogos de {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Falha ao importar os jogos emulados de {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Não foi possível procurar por jogos usando o perfil do emulador selecionado. O perfil não contém extensões de arquivos ou plataformas.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Não foi possível iniciar o Playnite. Feche todas as instâncias em execução e tente novamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Falha ao aplicar o tema &quot;{0}&quot; usando o perfil de cores &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Não foi possível abrir o link, o URL não está em um formato válido.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Falha ao iniciar o aplicativo.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Falha ao inicializar a visualização do componente da web. Playnite não pode continuar com o processo de inicialização.\r\n\r\nMais informações em https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Não foi possível importar os emuladores devido ao arquivo de definição ausente ou corrompido.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Falha ao executar ação do menu.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Editar detalhes do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL da imagem</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Adicionar link</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Adicionar ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Salvar alterações</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Aplique as alterações ao (s) jogo (s) sendo editado (s).</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Adicionar ação</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Remover ação</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Remover ação de jogar</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Adicionar jogos</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Escanear pasta…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Detectar instalação</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Procurar…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Abrir o Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Configurações do perfil</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">O nome do jogo não pode estar vazio..</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Diretório de monitoramento de ação de jogo não pode estar vazia.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">O nome do jogo não pode estar vazio antes de buscar metadados.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Dados do jogo inválidos</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Insira um URL válido iniciado com http:// ou https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Selecionar URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Falha ao baixar metadados: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Erro ao baixar</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Limpar filtros</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Conta privada</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Conta pública</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">Chave da API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Erro de inicialização</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Erro no tema</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Limpar tudo</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Instalando</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Desinstalando</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Iniciando</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Executando</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">URL inválido</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Não fazer nada</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimizar</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Restaurar janela</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Restaurar janela apenas quando lançado pela interface de usuário</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Fechar</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Alterar</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Avançado</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Nunca</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Estado de conclusão</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Estados de conclusão</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Avaliação do usuário</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Avaliação da crítica</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Avaliação da comunidade</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Scripts de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Scripts do aplicativo</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Extensões</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Fontes de metadados</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Extensões</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Id de extensão</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Recarregar scripts</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">SDK Interativo PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Todos os scripts foram recarregados com sucesso.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Não foram encontrados jogos para os critérios de pesquisa/filtragem especificados</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Nenhum item encontrado</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Mudar para o modo janela</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Sair do Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Bibliotecas</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Atualizar tudo</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Criada por:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versão:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Atualizado:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Módulo:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Estatísticas</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Tudo</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Nenhum</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Notificações</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Largura</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Altura</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Tamanho</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Pequeno</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Grande</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Muito grande</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Enorme</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Padrão</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Selecionar</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Selecionar todos</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Desmarcar todos</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Primeiro</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Aleatório</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Selecionar usuário</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Carregar mais</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Transparente</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Recolher</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Expandir</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Recolher todos</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Expandir todos</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Outros</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Temas</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Argumentos do emulador</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Argumentos integrados</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Argumentos Customizados</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Argumentos adicionais do emulador</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Substituir argumentos do emulador</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Ação de jogar</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Selecionar metadados para importar</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Selecione jogos para importar</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Buscar por metadados</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Atualização disponível</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Alterações desde a última versão</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Baixar e instalar atualização</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Verificar se há atualizações</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Erro na atualização</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Falha ao verificar se há uma nova versão.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Nenhuma nova versão encontrada, você está na mais recente.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Falha ao baixar e instalar a atualização.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Alguma tarefa de plano de fundo está atualmente em andamento. Deseja cancelar e continuar com a atualização?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Alguma tarefa de plano de fundo está atualmente em andamento. Deseja cancelar e e sair do Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Alguma tarefa de plano de fundo está atualmente em andamento. Alternar modos cancelará a tarefa, quer alterar de qualquer forma?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Uma atualização para o Playnite está disponível</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Recarregar lista de temas</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Aplicar o tema selecionado</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Verificar alterações em arquivos</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Aplicar o tema automaticamente quando algum arquivo for alterado</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Execução do script</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Executar antes de iniciar um jogo</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Executar depois de sair de um jogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Executar após um jogo ser iniciado</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Executar ao iniciar o programa</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Executar ao fechar o programa</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Jogo iniciando o script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Jogo iniciou o script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Jogo encerrou o script</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Executar o script global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrado</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Atual</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Novo</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Testar script</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Mostrar apenas itens selecionados.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Salvar como padrão</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Adicionar aos favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Remover dos favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Ocultar este jogo</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Remover de ocultos</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Ativar o suporte HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Desativar o suporte HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Editar…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Calcular tamanho da instalação</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Calcular tamanho da instalação (Todos os jogos)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Calcular tamanho da instalação (Somente dados faltantes)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Tamanho da Instalação</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Definir categorias…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Definir estado de conclusão</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Remover</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Jogar</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Instalar</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Opções do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Desinstalar</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Abrir o local do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Criar atalho na área de trabalho</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Abrir manual</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Mais</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Gerenciado pela extensão da biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">O processo de inicialização do jogo será gerenciado pela extensão da biblioteca responsável por este jogo.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Nenhuma informação relevante sobre o jogo '{0}' foi encontrado na página especificada.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Dica: você pode usar um processo mais avançado para baixar metadados ao editar um único jogo através da opção &quot;Editar...&quot; no menu de contexto.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Indisponível enquanto houver alguma ação em andamento.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">O texto de descrição é sensível à sintaxe HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Tempo de jogo é gravado em segundos.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">O tamanho da instalação é indicado em bytes.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">A data de lançamento precisa estar no formato &quot;ano-mês-dia&quot;. Os campos de mês e dia podem ser omitidos.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Valores de 0 a 100. Deixe vazio para não definir uma avaliação.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">O desenvolvimento do Playnite é apoiado por estes patronos:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Programadores, tradutores e demais colaboradores sem uma ordem específica:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Cancelar o monitoramento do jogo?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">O monitoramento de instalação está atualmente em execução. Você deseja cancelar o processo e retornar o jogo ao estado anterior?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">O monitoramento de execução do jogo está atualmente em execução. Você deseja cancelar o processo e retornar o jogo ao estado anterior?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Tempo de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Última sessão</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0} d {1} h {2} m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minutos</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} segundos</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Não jogado</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Abrindo modo janela…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Abrindo modo tela cheia…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Carregando a biblioteca de jogos…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Calculando tamanho da instalação…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Calculando tamanho da instalação de {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Falha ao instalar o arquivo de script.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Script instalado com sucesso.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Instalar script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Erro no script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Falha ao executar a função da extensão.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Abrir a pasta de metadados</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Calcular</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Calcula automaticamente o tamanho de instalação usando as Roms se o jogo possuir alguma ou o diretório de instalação caso haja sido definido</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">Cliente do {0} não instalado.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">O cliente do(a) {0} será executado agora. Inicie a sessão e então feche esta janela.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Aguardando que o usuário inicie a sessão, feche esta janela quando terminar…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Diretório de instalação do jogo não encontrado.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Configuração de ação do jogo inválida.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Solução de problemas de sincronização de contas</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Soluções de problemas</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Renomear item</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Adicionar novo item</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Insira um nome</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Insira um novo nome</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Menos de uma hora</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 a 10 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 a 100 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 a 500 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 a 1000 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite precisa ser reiniciado para completar a instalação. Deseja reiniciar agora?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Extensão não foi empacotada corretamente.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">O tema não foi empacotado corretamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Falha ao carregar extensão &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Impossível carregar  extensão &quot;{0}&quot; , versão atual do Playnite não suportada.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Falha ao carregar tema &quot;{0}&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Impossível carregar  tema &quot;{0}&quot; , versão atual do Playnite não suportada.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Falha ao carregar extensão.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Falha ao carregar tema.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">O tema ou extensão está usando uma versão não compatível da API.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Instalação bem-sucedida.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Instalar extensão?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Genérico</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Falha ao instalar a extensão &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Falha ao instalar extensão.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Deseja instalar a nova extensão?\r\n\r\n{0}\r\nPor {1}\r\nVersão {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Deseja atualizar a extensão {0}?\r\n\r\nVersão atual: {1}\r\nNova versão: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Falha ao instalar tema.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Deseja instalar o novo tema?\r\n\r\n{0}\r\nPor {1}\r\nVersão {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Deseja atualizar o tema {0}?\r\n\r\nVersão atual: {1}\r\nNova versão: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Você está prestes a deixar o Playnite e abrir a seguinte página da web usando o seu navegador padrão. Você deseja continuar?\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">As imagens selecionadas podem ser grandes demais para desempenho ideal. O uso de imagens muito grandes pode resultar em uma perda significativa na responsividade da interface e um aumento no uso de memória.\r\n\r\nResoluções máximas recomendadas:\r\nÍcones: {0} mega pixels\r\nCapas: {1} mega pixels\r\nImagens de fundo: {2} mega pixels</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Aviso de desempenho</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Não mostrar novamente</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">O arquivo com a extensão {0} não é compatível.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Extensão de arquivo incompatível</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">A imagem selecionada pode ser grande demais para um desempenho ideal.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Tem certeza que deseja desinstalar o tema selecionado? A desinstalação será realizada na próxima vez que a aplicação for iniciada.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Temas integrados não podem ser desinstalados.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Este tema não é suportado por esta versão do Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Tem certeza que deseja desinstalar a extensão selecionada? A desinstalação será realizada na próxima vez que a aplicação for iniciada.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Extensões integradas não podem ser desinstaladas.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Esta extensão não é suportada por esta versão do Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Diretório de instalação</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Diretório de dados</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Gerando pacote de diagnóstico…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Enviando pacote de diagnóstico…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Importar arquivo…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">O que é isto?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Tem certeza de que deseja fazer isso?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Tempo de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Tempo médio de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Tempo máximo de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Tamanho total da instalação</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Visão geral</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Exibir na barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Redefinir configurações</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Todas as configurações da aplicação serão redefinidas a seus valores padrão, excluindo:\r\n- O local do banco de dados\r\n- A lista de exclusão de importações\r\n- As configurações de extensões, incluindo integrações de biblioteca\r\n\r\nO reinicio da aplicação será necessário para terminar o processo. Você deseja redefinir as configurações?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Para desenvolvedores</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Extensões externas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Inserir o caminho completo da pasta.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Conquistas</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Fórum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Notícias</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Página na loja</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">A configuração inicial não foi concluída. O Playnite irá reiniciar no modo janela para que o processo seja concluído.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Jogados recentemente</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Mais jogados</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Tudo</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Alguns filtros foram aplicados.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Filtros adicionais foram aplicados.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Buscar resultados para:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Um item com o mesmo nome já existe.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Limitar seleção ao filtro atual</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Selecionar outro</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Extensões...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Configurações de extensões</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Navegar</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Atualizações</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Atualizações ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">O gerenciamento de extensões e temas instalados, incluindo suas configurações, foi movida para o novo menu de &quot;extensões&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Todas as integrações de biblioteca atualmente instaladas podem ser configuradas aqui.\r\n\r\nSe você deseja instalar ou desinstalar integrações adicionais, use a opção &quot;extensões&quot; do menu principal.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Temas para desktop</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Temas de tela cheia</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Procurando...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">A extensão não é compatível com essa versão do Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Falha ao baixar o pacote de instalação da extensão.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Falha ao baixar o manifesto de instalação da extensão.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">O reinício da aplicação é necessário para aplicar as alterações pendentes.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Esta extensão está agendada para instalação.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Instalar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Reinstalar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Desinstalar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Já instalado</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Nenhuma atualização de extensão foi encontrada.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Atualizar extensões</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Registro de mudanças não disponível</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Agendado para instalação</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">O download falhou</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Licença rejeitada</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Baixando {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Procurando por atualizações para as extensões...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Procurando por atualizações do programa...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Uma ou mais atualizações de extensões estão disponíveis.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Selecione itens para atualizar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Instância de extensão em desenvolvimento</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} acordos de licença</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Aceitar</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Recusar</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Incluir ações de jogar da integração da biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Selecionar ação</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Modo de monitoramento</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Localizando caminho</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Atraso do rastreamento inicial</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Frequência de rastreio</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Link</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Arquivo</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Script</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Padrão</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Processo</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Pasta</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Processo original</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Nome do processo</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Registrar mensagens de vestígios</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">As mudanças seguintes sobrescrevem dados em todos os jogos selecionados no momento!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Nenhum</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Itens apenas</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Início e fim apenas</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Sensibilidade de rolagem</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Rolagem suave</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Velocidade da animação</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Remover item?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Você tem certeza que deseja remover este item?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Mostrar botões no painel superior:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Configurações gerais de visualização</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Configurações de agrupamento</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Configurações de classificação</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Predefinições de filtros</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Posição de itens de plugin</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Largura do separador de seções</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Mover o menu principal para a barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Painel de navegação</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Escolher jogo aleatório</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Visualiza seletor de jogos aleatório</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Selecionar um jogo aleatório da lista</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Salvar configurações de agrupamento e classificação</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Mostrar como um filtro rápido no modo de tela cheia</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Nos últimos 7 dias</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Nos últimos 31 dias</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Nos últimos 365 dias</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Mais de 365 dias atrás</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Configurar</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Salvar predefinição</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Minimizar após iniciar o jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Minimize o Playnite após um jogo ser iniciado.\r\n\r\nDesabilitar essa opção pode levar a problemas com os jogos não recebendo comandos ao iniciar!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Tamanho da fonte</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Tamanho da fonte pequena</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">Ativar suporte a API para controles de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Suporte para controles de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Se desativado, o Playnite não aceitará nenhuma entrada do controle de jogo.\r\n        \r\nDesative se você usar ferramentas que traduzem entradas de controle de jogo para inserir mouse/teclados, e você está recebendo entradas duplas no Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Mostrar itens no menu principal:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Inverter o vínculo dos botões X/A na visualização padrão</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Trocar o vínculo entre os botões de iniciar um jogo e de mostrar os detalhes do jogo na visualização padrão.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Inverter botões de confirmação/cancelamento</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Inverte o botão A/B para confirmação e cancelamento.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Apenas o controlador primário</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Apenas aceitar as entradas do controlador primário quando habilitado.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Botão guia foca o Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Volume da interface</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Volume em segundo plano</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Silenciar quando em segundo plano</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Falha ao inicializar a interface de áudio. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API de saída</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API utilizada para a saída de audio. Troque-a se você experienciar problemas com o som.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Geral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Visuais</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Áudio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Esquema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Entrada</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} está iniciando...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} está em execução...</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Caps</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Espaço</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Forma de escala para renderizar imagens</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternativo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Balanceado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Qualidade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Qualidade:\r\nMelhor qualidade de imagem, lento, alto uso de memória.\r\n\r\nBalanceado:\r\nBoa qualidade, rápido, baixo uso de memória.\r\n\r\nAlternativo:\r\nMelhor qualidade do que o balanceado, velocidade média, baixo uso de memória.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Selecionar arquivo...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Selecionar pasta...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Script de inicialização</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Por favor, note que tanto extensões quanto temas podem afetar severamente a performance, estabilidade e segurança do Playnite.\r\n\r\nSe você começar a experienciar problemas após a instalação de um tema ou extensão, primeiro tente desabilitar-lo/desinstala-lo para checar se eram a raiz do problema.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Escolher ao iniciar</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Escolher ao iniciar</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Perfis integrados</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Perfil integrado</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Perfis personalizados</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Perfil personalizado</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Manipulado por um script integrado</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Especificação de emulador</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Especificação de plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Especificação de região</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Executar antes de iniciar o emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Executar depois do emulador ser iniciado</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Executar depois de fechar o emulador</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Executável do emulador não encontrado</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Especificação do emulador não encontrada</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Script de inicialização do emulador não encontrado</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Divida como jogos separados</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Unir em um jogo</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Definir plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Definir região</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Escanear pasta</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Verificando configurações</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Excluir padrão da verificação de Hash</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Arquivos que correspondem ao (s) filtros não serão verificados quanto Hash e serão comparados pelo nome do arquivo. Consulte a página de ajuda do emulador para obter mais informações.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Escanear com emulador</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Nenhum nome informado ao salvar nova configuração.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Emulador ou perfil de emulador não está definido.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Para para pesquisa não especificada ou ela não existe.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">A configuração de pesquisa não está definida corretamente.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Incluir escaneamentos automáticos no escaneamento em massa</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Falha em escanear pasta por emuladores.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Falha em escanear pasta(s) por jogos emulados.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Esconder importados</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Perfis para importar:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Configurações de escaneamento automático</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Salvar como uma configuração de escaneamento automático</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Salve a configuração para um uso posterior durante a atualização da biblioteca. Configurações salvas podem ser gerenciadas pelo menu de &quot;configurar emuladores&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Importar usando caminhos relativos</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Se possível, importar arquivos de jogos usando caminhos relativos à pasta de instalação do Playnite ou à pasta de instalação do emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Analisar subpastas</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Analisar dentro dos arquivos</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Combine arquivos relacionados</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Combine arquivos relacionados, como jogos com vários discos, em apenas uma entrada de jogo.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Adicionar escâner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Adicionar escâner salvo</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Iniciar escaneamento</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Adicione configurações para emuladores escanearem pastas especificas. Tenha certeza que esses emuladores estão corretamente configurados antes de importar jogos (pelo menu &quot;biblioteca&quot; -&gt; &quot;configurar emuladores&quot;)</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Estado padrão designado a jogos recentemente adicionados</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Estado designado a jogos executados pela primeira vez</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Falha na inicialização da execução do script PowerShell. Se você for usuário Windows 7, tente (re)instalar PowerShell 5.1 para corrigir o problema.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Já existe uma filtro com o nome especificado. Atualizar com novas configurações? </sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Preenche automaticamente nomes de classificação ausentes para jogos adicionados em lote ou editados</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">Quando você editar um jogo, adicionar jogos através de uma atualização de biblioteca, um escaneamento de pastas de emuladores ou uma verificação de pasta normal, preencha automaticamente o campo &quot;Nome da Classificação&quot; com uma melhor representação classificável do nome do jogo. Por exemplo, &quot;The Witcher 3&quot; receberá &quot;Witcher 03&quot;. Isso nunca definirá um nome de classificação que não difere do nome do jogo, e só atualizará automaticamente os nomes de classificação vazios.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Estas palavras serão removidas do início do valor de Nome de Classificação preenchido automaticamente:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Usar isto para ignorar as palavras no início do nome do jogo para fins de classificação. O padrão é &quot;The&quot;, &quot;An&quot; e &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Preencher Nome de Classificação para jogos que não possuam nenhum</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Classificação</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Preenchendo valores de Nome de Classificação…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Serviço Nahimic foi detectado rodando em seu sistema. Sabemos que serviço causa problemas de renderização no Playnite (e outros apps).\r\n\r\nSe você tiver quaisquer problemas de renderização ou gráficos corrompidos no Playnite, recomendamos desabilitá-lo ou desinstalá-lo completamente o serviço Nahimic.\r\n\r\nMais informações em https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite está rodando com privilégios elevados (como administrador). Não é a recomendação já que dá privilégios elevados para todas as extensões instaladas e todos os jogos/apps iniciados pelo Playnite!\r\n\r\nMais informações em https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Mostrar aviso se Playnite estiver rodando com privilégios elevados</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Obter o tamanho real na unidade de armazenamento ao calcular o tamanho dos jogos</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Se ativado, as varreduras serão mais lentas e obterão o tamanho real que os arquivos ocupam na unidade de armazenamento.\r\nSe desativado, as varreduras serão mais rápidas e utilizarão o tamanho dos próprios arquivos.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">As seguintes extensões foram reportados como potencialmente problemáticos, seja pelo alto impacto na estabilidade/performance ou problemas de segurança. Recomendamos fortemente que os desinstale:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Excluir arquivos online do escaneamento</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Arquivos armazenados na nuvem não serão escaneados e importados se não estiverem disponíveis localmente.\r\nSuporte somente para: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Escanear mas usando método simplificado sem conteúdo do arquivo</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Arquivos serão importados, mas usando método menos preciso que não requer que o conteúdo do arquivo seja baixado.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Aplicar a todos</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Sobrescrever estado da instalação</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Quando definido, o Playnite ignorará o estado de instalação (incluindo o diretório de instalação) definido pelo plugin de integração que importa esse jogo.\r\n        \r\nEsta opção pode não funcionar totalmente com plugins que usam método específico de importação de jogos, a menos que levem esta opção em conta.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Apenas manualmente</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Uma vez por dia</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Uma vez por semana</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Em cada inicialização</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Verificar se há atualizações do programa</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Verificar atualizações de complementos</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Atualizar bibliotecas</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Escanear pastas de emulação</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Incluir jogos ocultos</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Editar campos</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Selecionar / Desmarcar todos</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Abrir</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Ativar</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Atribuir</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Comece a digitar para procurar por jogos… [F1] para obter ajuda</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Começar com # traz uma lista de comandos disponíveis.\r\nComeçãr com / traz uma lista de provedores/plugins de pesquisa disponíveis.\r\nDigite a palavra-chave de busca e termine com ESPAÇO alterna imediatamente para essa pesquisa.\r\n\r\nTAB: ação de mudar\r\nENTER: ativar a ação selecionada\r\nSHIFT-ENTER: abrir menu de itens</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Incluir jogos desinstalados</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Incluir jogos ocultos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Jogos desinstalados incluídos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Jogos desinstalados excluídos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Jogos ocultos incluídos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Jogos ocultos excluídos</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Jogar ou Instalar</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Ir para detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Menu do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Editar jogo</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Abrir a busca</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Caixa de busca</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Botão de pesquisa</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Ação primária do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Ação secundária do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F abre a pesquisa global em vez de foco na caixa de pesquisa</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Salvar configurações de filtro de jogos entre sessões de pesquisa</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Provedores de pesquisa</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Palavras-chave padrão</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Palavra-chave personalizada</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Atalho de sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Pesquisa Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Configurações de extensão</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Exclusões</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Arquivos excluídos relativos à pasta de escaneamento</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Pastas excluídas relativas à pasta de escaneamento</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Adicionar arquivo à lista de exclusão</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Adicionar pasta à lista de exclusão</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Exclusões só podem ser adicionadas às configurações do scanner salvo.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Exclusões adicionadas ao scanner &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Substituir plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Quando definido, o scanner atribuirá esta plataforma a todos os jogos, substituindo quaisquer plataformas detectadas automaticamente.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Incluir comandos na pesquisa padrão</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Quando desativado, os comandos não serão incluídos na pesquisa padrão até que o prefixo # seja usado.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Usar correspondência ampla no filtro de nomes</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Quando ativado, o filtro de nomes vai corresponder aos nomes de jogos da mesma maneira que a busca global.\r\nUma filtragem mais rigorosa pode ser imposta em um caso individual, prefixando o filtro com o símbolo !</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Campos a serem exibidos para os resultados do jogo:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Status Oculto</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">O backup dos dados foi cancelado.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Backup de dados falhou.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Erro no backup dos dados</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Backup de dados em progresso…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Restaurando dados do backup…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Falha ao restaurar dados do backup.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Configurações</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Biblioteca de jogos</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Mídia da biblioteca do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Extensões instaladas</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Dados de extensões</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Temas instalados</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Selecione os dados a serem restaurados do arquivo de backup especificado.\r\n    \r\nO Playnite reiniciará automaticamente para iniciar o processo de restauração do backup.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Selecione os itens a serem incluídos no backup de dados. As configurações de aplicativo e os dados da biblioteca do jogo são incluídos por padrão.\r\n    \r\nO Playnite será automaticamente reiniciado para iniciar o processo de backup.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Backup automático de dados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Frequência de backup automático</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Pasta de backup</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Rotação de backups</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Incluir dados adicionais:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">A pasta de backup precisa ser definida se o backup automático estiver ativado.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Mostrar notificações apenas para versões de patch</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Quando ativado, apenas atualizações disponíveis para a versão principal atualmente instalada resultarão em notificação de atualização.\r\nNovas versões principais não resultarão em notificação de atualização.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Usar datas relativas para a última semana</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Usar datas relativas em formato &quot;Hoje&quot;, &quot;Ontem&quot; etc. se a data for menor que uma semana.\r\n    \r\nO formato de data especificado será usado em todas as outras datas.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Pesquisa de Imagens na Internet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">String de pesquisa de imagens de ícone</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">String de pesquisa de imagens de capa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">String de pesquisa de imagens de fundo</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Obtendo informações do complemento…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Nenhuma fonte de metadados está disponível</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Reproduzir configurações de ação</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Usar configurações do scanner</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Selecionar perfil na inicialização</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Selecionar emulador na inicialização</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automático</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Sempre ligado</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Sempre desligado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Suporte de acessibilidade (leitor de tela)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Menu do aplicativo</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Menu do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Pasta do programa</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Pasta do usuário</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Corrupção em arquivo da biblioteca foi detectada. O Playnite será fechado.\r\n    \r\nAvise do problema na página do Playnite no GitHub com um pedido de correção.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Você quer salvar as alterações feitas?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Instalação portátil</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Nenhum controle detectado</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/pt_PT.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Português Europeu</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Idioma do Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Sair</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtro Ativado</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtro Desativado</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Filtros adicionais</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtros</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtro</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Dados Inválidos</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Guardar alterações?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Página Web em www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Código Fonte no GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Criar pacote de diagnóstico</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Enviar informação de diagnóstico</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Sobre o Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Criado por Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Atribuir Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Definir Categorias</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Adicionar Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Marcado - Atribuir categoria\r\nDesmarcado - Remover categoria\r\nIndeterminado - Sem alterações (ao editar vários jogos)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Sem Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Sem Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ups! Algo correu mal…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Um erro irrecuperável ocorreu.\r\n \r\nSe queres ajudar-nos a corrigir este problema, por favor descreve, de forma breve, que ações foram tomadas antes do erro ter ocorrido e depois cria um pacote de diagnóstico. Se estiveres online, o pacote será transferido para o servidor do Playnite para análise.\r\n\r\nAlternativamente, podes usar o botão &quot;Reportar Crash&quot; para criar um novo tópico nas Issues do GitHub e reportar o crash manualmente.\r\n\r\nObrigado pela tua ajuda.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Extensão &quot;{0}&quot; causou um erro irrecuperável.\r\n\r\nNós recomendamos salvar o teu ficheiro de log e reportar o problema para o desenvolvedor da extensão. Se o problema continuar a acontecer, desabilita a extensão.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Extensão &quot;{0}&quot; causou um erro irrecuperável.\r\n\r\nNós recomendamos reportar o problema para o desenvolvedor da extensão. Se o problema continuar a ocorrer, desabilita a extensão.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Extensão desconhecida ou tema causou um erro irrecuperável.\r\n\r\nRecomendamos desativar complementos de terceiros, isolando o problema e relatando o problema ao desenvolvedor do complemento.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Ocorreu um erro irrecuperável.\r\n\r\nSe quiseres ajudar-nos a corrigir este problema, por favor envia informação de diagnóstico. Obrigado.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Desabilitar extensão</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Guardar o arquivo log </sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Enviar informação do diagnóstico</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Reportar Crash</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Reiniciar o Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Reiniciar no Modo Seguro</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Desabilitando todas as extensões de terceiros e usando o tema padrão.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Sair do Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Ações tomadas antes do crash (em Inglês):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Gestor de Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Remover Jogo(s)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Não foi possível remover - Jogo ou instalador em execução.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Não foi possível desinstalar - Jogo em execução.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Tem a certeza que quer remover {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Tens a certeza de que queres remover estes {0} jogos?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Tem certeza de que deseja remover estes {0} jogos?\r\n\r\nSelecionando a opção &quot;adicionar a lista de exclusão&quot; impedirá que o jogo seja importado novamente na próxima vez que a biblioteca for atualizada.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Tem certeza de que deseja remover estes {0} jogos?\r\n\r\nSelecionando a opção &quot;adicionar a lista de exclusão&quot; impedirá que o jogo seja importado novamente na próxima vez que a biblioteca for atualizada.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Tens a certeza que pretendes remover {0} entradas que não estão atualmente em uso?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Não foram encontrados campos não utilizados.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Sim (adicionar à lista de exclusão)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Existem alterações não salvas nesta secção</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">A atualizar o formato da biblioteca de jogos…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Falha na atualização da base de dados.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Não é possível atualizar a biblioteca de jogos. É necessário {0} MBs de espaço livre.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Erro do Jogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Não foi possível iniciar o jogo. '{0}' não foi encontrado na base de dados.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Não foi possível iniciar o jogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Não foi possível iniciar a ação: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Não foi possível abrir a localização do jogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Não foi possível detectar o tamanho de instalação do jogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Erro ao pesquisar o tamanho da instalação</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Ocorreram {0} erros durante a procura do tamanho da instalação</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Falha ao criar atalho: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Falha ao abrir o manual: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Não foi possível instalar o jogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Não foi possível desinstalar o jogo: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Não foi encontrada nenhuma ação válida. Quando usa um emulador de ações, tenha a certeza que as definições da plataforma correspondem às configurações tanto do jogo como do emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Implementação de instalação não está disponível</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">O plugin da biblioteca responsável por este jogo está desabilitado ou desinstalado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Transferência de metadados oficiais não disponível.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Nenhum jogo selecionado.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">A execução da ação de script do jogo falhou.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">A execução do script da aplicação falhou.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">A execução da ação de script global falhou.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Execução do script do emulador falhou.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Falha ao executar a ação do script.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 ou mais recente não está instalada.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Não foi possível determinar como iniciar o jogo.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Ativo</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Desativado</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Remover</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Remover não utilizados</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Alterar nome</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Copiar</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Adicionar</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Ícone Predefinido</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Imagem de Capa Predefinida</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Imagem de Fundo Predefinida</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Concluir</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Próximo</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Voltar</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">FEITO</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">VOLTAR</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">LIMPAR</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Limpar</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Ignorar</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Ignorar Todos</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importar</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nome</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Módulo</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Série</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versão</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Última sessão de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Mais Jogado</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Número de Sessões de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Tamanho de instalação</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Pasta</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notas\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Adicionado</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Data de Adição</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Modificado</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Data de Modificação</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Página Web</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Caminho</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Guardar</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Fechar</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Cancelar</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Confirmar</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">redefinir</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Sim</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Não</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Bem-vindo</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Utilizador Local</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Geral</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Mídia</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Ligações</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Instalação</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Ações</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">A transferir…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Fazendo download da media...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">A carregar…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Tipo</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Perfil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Perfis</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Remover</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Transferir</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Pesquisar</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Resolução:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Qualquer</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Ampliar/Reduzir</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Vista de Lista</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Capas</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Vista de Grelha</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Vista de Detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Personalizado</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">Endereço</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Reconhecimento adicional</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licença</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Contribuidores</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">A fechar o Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Hoje</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Ontem</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Segunda-feira</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Terça-feira</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Quarta-feira</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Quinta-feira</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Sexta-feira</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Sábado</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Domingo</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Semana Passada</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Mês Passado</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Ano Passado</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Há mais de um ano</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 a 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB a 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB a 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB a 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB a 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB a 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB a 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB ou mais</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Importação concluída com sucesso.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Todos os Jogos</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ID do Jogo</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">ID da Base de Dados</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Predefinições</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Coluna</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Colunas</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Linha</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Linhas</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Não foi possível obter o ícone da ação Jogar. Não existe ação do tipo Arquivo presente.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Transferir apenas metadados em falta</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Ativar esta opção irá saltar a transferência de metadados para campos já preenchidos.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Seleção de jogos</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Por favor, seleciona quais os jogos que devem ser atualizados com novos metadados:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Todos os jogos da base de dados</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Todos os jogos atualmente filtrados</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Apenas jogos selecionados</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Nenhum campo de metadados selecionado </sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Nenhum campo de metadados foi selecionado para transferência. Por favor, selecione pelo menos um, e ative pelo menos um provedor de metadados para o mesmo.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Loja Oficial</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Por favor, seleciona quais os campos que devem ser preenchidos automaticamente pelo Playnite e quais as fontes que devem ser usadas para obter esses dados.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Por favor, considera clicar no logótipo acima e contribuir com atualizações para a base de dados do igdb.com de forma a melhorar os dados utilizados pelo Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">A transferir metadados…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">A importar jogos instalados…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">A importar {0} jogos…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importando jogos emulados de {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">A transferir atualizações da biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Verificando o tamanho dos jogos na biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Verificando tamanho dos jogos importados…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Atualização da biblioteca concluída</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">A libertar recursos...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Configuração</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Definições…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Plataformas e Emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Configurar Emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Gestor de Biblioteca…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Ferramentas</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Transferir Metadados…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Ferramentas do Software...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Configurar integrações…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Abrir Cliente de terceiros</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Clientes de terceiros</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Atualizar biblioteca de jogos</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Cancelar atualização da biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Atualizar Pastas emuladas</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Adicionar Jogo</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manualmente…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Examinar Automaticamente…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Jogo Emulado…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Applicação da Microsoft Store…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Sobre o Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Enviar Feedback</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Alterar para Modo de Ecrã Inteiro</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Ligações</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Ajuda</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Apoia o projeto no Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Dê apoio no Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Manual do utilizador</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Documentação SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Reiniciar Sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Desligar Sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Suspender Sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernar Sistema</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Sistema de Bloqueio</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Terminar Sessão da Conta</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Escolher um Jogo Aleatório</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Campos que serão mostrados no painel de detalhes:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Espaçamento de Itens</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Mostrar fundo dos itens da grelha</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Largura das bordas dos itens da grelha</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Fonte de ícone de jogo em falta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Fonte de capa de jogo em falta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Fonte de fundo de jogo em falta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Espaçamento vertical para detalhes dos jogos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Posição dos detalhes na vista de grelha</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Posição da lista de jogos na vista de detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Mostrar separador entre painéis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Altura da imagem da capa do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Altura dos ícones da lista de jogos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Fonte da aplicação</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Fonte monoespaçada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Posicionamento do painel de filtros</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Posicionamento do painel do explorador</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Renderização de arte da capa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Rácio de aspeto a utilizar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">As seguintes opções também afectam a renderização de mosaicos no modo de ecrã inteiro!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Modo de redimensionamento</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Caixa de DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Loja Epic Games</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Quadrado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Banner do Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Capa vertical do Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* É necessário reiniciar para aplicar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Definições</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Geral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Painéis do Topo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Aparência</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Detalhes do Jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Disposição</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Avançado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Ecrã Inteiro</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Entrada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Desempenho</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">A atualizar...</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Pesquisa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Cópia de segurança</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Recuperação da Informação da Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Restaurar cópia de segurança</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importar alterações da biblioteca automaticamente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Localização do ficheiro da base de dados inválida, um caminho correto deve ser definido.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Nome de conta não pode estar vazio.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Transferir metadados após importar jogos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Executar o Playnite minimizado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Abrir Playnite quando o seu computador for ligado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Iniciar minimizado na bandeja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Falha ao registar o Playnite para iniciar quando o computador iniciar.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Iniciar no Modo de Ecrã Inteiro</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Carregamento assíncrono de imagens</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Melhora a suavidade de scroll nas listas de jogos, em troca de carregamento de imagens mais lento.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Mostrar nome do jogo se a capa estiver em falta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Mostrar nomes dos jogos em vista de Grelha</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Escurecer jogos não instalados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Mostra ícones do jogo na vista de Detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Mostra a contagem de itens nas descrições de grupo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Mostrar somente campos selecionados nos painéis de filtro e explorador</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Desativar aceleração de hardware</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Usa em caso de bloqueios ou problemas similares com a interface</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Mostrar jogos ocultos nas listas de início rápido</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Afeta a Lista de Saltos e as listas do menu bandeja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Número de itens de início rápido</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Utilizar a imagem de fundo do jogo como fundo da janela</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Desfocar fundo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Alta Qualidade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Escurecer fundo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Mostrar na vista de Grelha</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Perfil de Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Tema de Ecrã Inteiro</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Perfil de Tema de Ecrã Inteiro</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Localização da Base de Dados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Estado de autenticação:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Definições do Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Limpar web cache</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Pode resolver problemas encontrados ao ligar contas.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Mostrar ícone de bandeja</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimizar o Playnite para a bandeja do sistema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimizar o Playnite para a bandeja do sistema quando a janela da aplicação for fechada</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Quando o jogo inicia:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Após o jogo fechar:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Formatar tempo jogado para indicar o número de dias jogados</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Formato da data:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Isto eliminará o acesso de todos os serviços ligados. É necessário reiniciar o programa, pretendes continuar?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Limpar Cache?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">É necessário reiniciar o Playnite para aplicar o novo tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Obter mais temas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Criar novo tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Obter mais extensões</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Criar nova extensão</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Ajude-nos a traduzir o Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite precisa de ser reiniciado para aplicar as novas configurações. Reiniciar agora?\r\n\r\nReiniciar irá cancelar qualquer tarefa ativa (transferências) em progresso.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Reiniciar Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite não consegue mover os ficheiros da sua biblioteca automaticamente. Deves movê-los/copá-los manualmente antes de alterar a localização. Se nenhuma biblioteca estiver presente no destino indicado, uma nova será criada.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">O tempo de jogo não será gravado se a ação &quot;Fechar&quot; for ativada.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Número de linhas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Número de colunas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Número de linhas na vista de detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Mostrar Imagem de Fundo no Ecrã Principal</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Não se aplica retroativamente a jogos preexistentes sem transferir novamente os metadados.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importar tempo de jogo na biblioteca:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Configura quando o Playnite deve importar o tempo de jogo relatado pelos plugins da biblioteca para os jogos no banco de dados do Playnite. É necessário, para puder usar esta funcionalidade, que os plugins da biblioteca que têm responsabilidade pelo(s) jogo(s) tenham suporte.\r\n\r\nSempre: Importa o tempo de jogo a novos jogos importados e os já existentes no banco de dados do Playnite.\r\nApenas a jogos recém-importados: Importa o tempo de jogo somente a novos jogos importados.\r\nNunca: Nunca importa o tempo de jogo sob nenhuma circunstância.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Sempre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Apenas para jogos recém-importados.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Nunca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Ativar suporte de comando no modo Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Botão Guia do comando abre o modo de Ecrã Inteiro</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Opções de transferência automática de metadados para jogos recém-importados.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Monitor desejado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Usar sempre o monitor principal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Mostrar Títulos dos Jogos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Mostrar Estado de Bateria</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Mostrar Percentagem de Bateria</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Mostrar relógio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Ocultar cursor do rato</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Instalado Apenas em Filtros Rápidos</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Estilo dos Botões</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Disposição</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Scroll Horizontal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Seleciona uma das subsecções</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Sem definições disponíveis</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Falha ao carregar as configurações</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Estes scripts são executados para todos os jogos na biblioteca. Scripts individuais podem ser atribuídos a cada jogo separadamente ao editar os detalhes do jogo.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animar transições entre imagens de fundo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Tamanhos de fonte</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automático</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Sem suavização</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Escala de cinza</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Monitor</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Modo de formatação de texto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Modo de renderização de texto</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">A renderização de texto e a formatação de métodos atualmente não se aplicam às descrições dos jogos.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Carrega imagens de fundo previamente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Se ativado, o Playnite transferirá imagens de fundo enquanto transfere os metadados, utilizando mais espaço de disco e tornando as imagens disponíveis offline.\r\n \r\nSe desativado, as imagens de fundo serão transferidas apenas quando necessárias pela primeira vez, resultando em menos espaço usado, mas num maior atraso na exibição das mesmas. Algumas imagens poderão não estar disponíveis offline.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Fechar automaticamente clientes de terceiros após sair do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Atraso para o encerramento do Cliente (em segundos)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Não fechar após sessões de jogo de menos de (em segundos)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Fechar automaticamente os seguintes clientes:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Fechar Clientes Automaticamente</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importar Lista de Exclusão</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Mostrar aviso quando for atribuída a jogos mídia de dimensões demasiado grandes</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Comando de abrir pasta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Atualizar tamanho da instalação de jogos ao atualizar a biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Verifica e atualiza o tamanho de instalação dos jogos se for detetado que os seus ficheiros foram modificados desde a última verificação</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Nenhum</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Preencher</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Preenchimento uniforme</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Esquerda</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Direita</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Topo</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Fundo</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Erro de Importação</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Autenticação necessária</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Falha na autenticação</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Modo alternativo de renderização da visualização da Web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Use quando tiver problemas com visualizações da Web, por exemplo, diálogos de autenticação de integração</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Carregamento parcial de grandes descrições do jogo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Grandes descrições podem causar um atraso visível ao selecionar os jogos.\r\n\r\nQuando ativado, somente parte do texto da descrição será inicialmente carregado com uma opção para carregar o resto sob demanda.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Importar Metadados</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Transferir Metadados</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Define uma configuração para ser usada em futuras transferências de metadados.\r\nEsta opção também pode ser alterada nas configurações da aplicação.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Assistente de Importação de Emulação</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Este feiticeiro irá guiá-lo pelo processo de transferência e importação de emuladores de consola e importação de jogos emulados</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Tem em atenção que podes sempre adicionar outros emuladores e/ou jogos mais tarde, através do menu principal (na opção &quot;Biblioteca&quot; para configuração de emuladores e na opção &quot;Adicionar jogos&quot; para jogos emulados).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Abaixo está uma lista de emuladores que o Playnite consegue reconhecer e configurar automaticamente. Pode descarregar instaladores dos emuladores a partir das respetivas páginas Web. Após instalar os emuladores (manualmente), pode importá-los na caixa de diálogo de configuração do emulador.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Pode importar quaisquer emuladores instalados no seu computador clicando no botão &quot;Detetar automaticamente a partir da pasta… &quot;. O Playnite irá procurar na pasta selecionada quaisquer emuladores conhecidos e fornecerá a opção de os importar. Pode usar este botão várias vezes para importar emuladores de diferentes pastas. Os emuladores serão adicionados ao final da lista atual.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Não há emuladores selecionados para importação. Não poderás importar automaticamente nenhum jogo emulado sem antes configurar os emuladores. Tens a certeza que pretendes continuar e sair do processo de importação?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Examinar pasta usando Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Selecionar ficheiros</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Configurar Emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">A examinar…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Configuração Inicial</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integração de Bibliotecas</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Configuração concluída</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">A configuração inicial foi concluída. Lembra-te que podes modificar todas as opções mais tarde no menu &quot;Definições&quot;.\r\n\r\nPodes também adicionar quaisquer outros jogos mais tarde clicando no menu com o logótipo do Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Configurar Plataformas e Emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Configurar Emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Plataformas</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emuladores</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Adicionar Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Selecionar Ícone</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Selecionar Capa</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Selecionar Imagem</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Selecionar Item</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Selecionar fundo</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Selecionar Ficheiro</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Selecionar Endereço</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Adicionar Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Plataforma(s) suportada(s)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Pretendes guardar as alterações da plataforma?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Pretendes guardar as alterações do emulador?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Executável</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argumentos</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Pasta de Trabalho</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Tipos de Ficheiro Suportados</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importar Emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Transferir Emuladores…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Carregar argumentos predefinidos do perfil de um emulador conhecido</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Tens a certeza de que pretendes remover o emulador {0}?\r\nEstá atualmente a ser usado por {1} jogo(s).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Tens a certeza de que pretendes remover a plataforma {0}?\r\nEstá atualmente a ser usada por {1} jogo(s) e {2} emulador(es).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Ajuda de configurações</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Ordenar Por</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Sentido da ordenação</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Agrupar Por</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Ascendente</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Descendente</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Não agrupar</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Agrupar por Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Agrupar por categoria</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Agrupar por Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Ver Tipo</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Ver</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Painel do Explorador</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Painel de Filtros</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ícone</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Ícone de Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Imagem de Capa</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Imagem de Fundo</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Nome para Ordenação</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manual</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nome</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Unidade de Instalação</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Nome da Conta</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Plataforma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Género</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Data de Lançamento</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Ano de Lançamento</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Desenvolvedor</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Etiqueta</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Editora</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Estado da Instalação</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Combinar todos os filtros</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Se ativado, apenas jogos que usam todos os itens em todos os filtros serão incluídos na exibição.\r\nSe desativado, jogos que usam qualquer item em qualquer filtro serão incluídos na exibição.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Não instalado</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Escondido</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favorito</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Ativar o suporte HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Se ativado, o HDR será ativado no display primário antes de iniciar o jogo.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Note que o HDR não é suportado no seu monitor principal.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Última sessão de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Descrição</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Pasta de instalação</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Imagem de Capa</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Ligações</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Caminho da Imagem, ROM ou ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Género</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Géneros</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Empresa</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Empresas</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Desenvolvedor</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Desenvolvedores</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Editora</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Editoras</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Categoria</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Categorias</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Etiqueta</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Etiquetas</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Funcionalidade</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Funcionalidades</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Classificação Etária</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Classificações Etárias</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Região</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regiões</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Fonte</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Fontes</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Actividade Recente</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Erro na Base de Dados</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Falha ao abrir a base de dados da biblioteca.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Base de dados não está aberta.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Não foi possível aceder à base de dados da biblioteca. O ficheiro &quot;{0}&quot; está a ser usado por outro processo ou está numa localização inacessível.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Falha ao criar pacote de diagnóstico.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Falha ao transferir automaticamente pacote de diagnóstico.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">A informação de diagnóstico foi enviada com sucesso.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">O pacote de diagnóstico foi criado e submetido com sucesso.\r\nPor favor, anexe o seguinte ID ao seu problema reportado:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Falha ao importar jogos de {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Falha ao importar os jogos emulados de {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Não foi possível procurar jogos usando o perfil do emulador selecionado. O perfil não contém nenhuma extensão de ficheiro ou plataformas.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Não foi possível iniciar o Playnite. Por favor, fecha todas as instâncias do programa e tenta de novo.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Falha ao aplicar tema &quot;{0}&quot;, perfil de cor &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Não foi possível abrir a ligação, o endereço não tem um formato válido.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Falha ao iniciar a aplicação.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Falha ao inicializar a visualização do componente da web. Playnite não pode continuar com o processo de inicialização.\r\n\r\nMais informações em https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Não foi possível importar os emuladores devido a ficheiros de definições em falta ou corrompidos.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Falha ao executar ação do menu.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Editar Detalhes do Jogo</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Endereço da Imagem</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Adicionar Ligação</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Adicionar ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Guardar Alterações</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Aplicar alterações de campo ao(s) jogo(s) sendo editado.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Adicionar Ação</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Apagar Ação</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Remover Ação de Jogo</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Adicionar Jogos</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Examinar Pasta…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Detetar Instalações</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Procurar…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Abrir Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Definições de Perfil</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">O nome do jogo não pode estar vazio.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Nome do jogo não pode estar vazio antes de procurar metadados.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Dados de jogo inválidos</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Escreve um endereço web válido, iniciado com http:// ou https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Selecionar Endereço</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Falha ao transferir metadados: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Erro na transferência</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Limpar Filtros</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Conta Privada</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Conta Pública</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">Chave de API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Erro de Inicialização</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Erro no Tema</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Limpar Tudo</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">A instalar</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">A desinstalar</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">A iniciar</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Em execução</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Endereço Inválido</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Não fazer nada</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimizar</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Restaurar janela</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Fechar</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Alterar</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Avançado</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Nunca</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Estado de Conclusão</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Avaliação do Utilizador</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Avaliação da Crítica</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Avaliação da Comunidade</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Scripts de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Scripts de aplicação</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Componentes</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Fontes de Metadados</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Extensões</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID da extensão</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Recarregar Scripts</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">SDK Interativo PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Todos os scripts recarregados com sucesso.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Nenhum jogo encontrado com os critérios de pesquisa/filtragem especificados</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Nenhum item encontrado</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Alterar para o Modo Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Sair do Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Bibliotecas</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Atualizar Tudo</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Criado Por:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versão:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Atualizado:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Módulo:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Biblioteca</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Estatísticas</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Tudo</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Nenhum</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Notificações</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Largura</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Altura</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Tamanho</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Pequeno</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Grande</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Maior</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Ainda Maior</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Predefinido</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Selecionar</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Seleccionar Todos</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Desmarcar tudo</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Primeiro</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Aleatório</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Seleção do utilizador</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Carregar mais</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Transparente</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Ocultar</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Abrir</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Ocultar tudo</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Expandir tudo</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Outros</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Temas</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Argumentos do Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Argumentos integrados</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Argumentos Personalizados</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Argumentos de Emulador Adicionais</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Substituir Argumentos de Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Executar</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Seleccionar itens para importar</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Selecionar Jogos para Importar</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Pesquisa de metadados</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Atualização Disponível</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Alterações desde a última atualização</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Transferir e Instalar Atualização</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Procurar Atualizações</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Erro de Atualização</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Falha ao verificar atualizações.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Nenhuma nova versão encontrada, estás atualizado.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Falha ao transferir e instalar atualização.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Uma tarefa em segundo plano encontra-se em progresso. Quer cancelá-la e proceder à atualização?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Uma tarefa em segundo plano está atualmente em execução. Pretendes cancelá-la e fechar o Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Uma tarefa em segundo plano está atualmente em execução. Mudar de modo vai cancelar a tarefa, pretendes mudar de qualquer modo?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Uma atualização do Playnite está disponível</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Recarregar lista de temas</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Aplicar tema selecionado</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Vigiar alterações de ficheiro</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Aplicar automaticamente o tema quando o ficheiro fonte for alterado</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Execução do script</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Executar antes de iniciar um jogo</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Executar depois de sair de um jogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Executar depois que um jogo for iniciado</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Executar ao inicia a aplicação</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Executar ao fechar a aplicação</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrado</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Actual</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Novo</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Testar script</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Mostrar apenas os itens selecionados.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Guardar como predefinição</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Adicionar aos Favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Remover dos Favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Ativar o suporte HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Desativar o suporte HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Editar…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Definir Categoria…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Definir Estado de Conclusão</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Remover</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Executar</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Instalar</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Opções de Jogo</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Desinstalar</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Abrir Local de Instalação</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Criar Atalho na Área de Trabalho</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Abrir Manual</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Mais</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Dica: Podes usar um processo mais avançado de transferência de metadados ao editar um jogo individualmente, através da opção &quot;Editar&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Não disponível quando existe alguma ação em curso.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">O texto de descrição é sensível a sintaxe HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\"></sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Valores de 0 a 100, ou vazio para ausência de avaliação.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Código, tradução e outros contribuidores sem nenhuma ordem em particular:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Cancelar monitorização de jogo?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Tempo Jogado</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Última sessão de jogo</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}d {1}h {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minutos</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} segundos</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Não Jogado</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">A abrir o modo Desktop…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">A abrir o modo de Ecrã Inteiro…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">A carregar biblioteca de jogos…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Calculando tamanho da instalação…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Calculando tamanho de instalação de {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Falha ao instalar o ficheiro de script.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Script instalado com sucesso.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Instalar Script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Erro no script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Falha ao executar a função da extensão.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Abrir a pasta dos metadados</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">O cliente {0} não está instalado.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">O cliente {0} irá agora abrir. Por favor, inicia sessão e, de seguida, fecha esta mensagem.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">À espera de início de sessão do utilizador, por favor fecha esta mensagem quando terminares…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Pasta de instalação do jogo não encontrada.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Configuração de ação de jogo inválida.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Resolução de problemas de sincronização de conta</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Resolução de problemas</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Renomear item</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Adicionar novo item</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Introduzir nome</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Digita novo nome</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Menos de uma hora</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 a 10 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 a 100 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 a 500 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 a 1000 horas</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Tema/Extensão está a utilizar uma versão da API não suportada.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Instalação bem sucedida.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Instalar extensão?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Falha ao instalar extensão. {0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Falha ao instalar tema. {0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Alerta de Desempenho</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Não Mostrar Novamente</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">A imagem selecionada pode ser demasiado grande para um desempenho ideal.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Diretório d'instalação</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Diretório de dados</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\"></sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">O que é isto?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Tens a certeza de que pretendes fazer isto?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Tamanho total da instalação</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Mostrar na barra lateral</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Para desenvolvedores</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Extensões externas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Troféus</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Fórum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Notícias</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Página da Loja</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Jogado Recentemente</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favoritos</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Mais Jogado</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Tudo</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Existem filtros aplicados.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Procurar resultados para:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Já existe um item com o mesmo nome.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Limitar seleção ao filtro atual</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Escolher outro</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Complementos…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Instalado</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Atualizações</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Atualizações ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Instalar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Desinstalar</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Não foi possível transferir</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Aceitar</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Recusar</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Caminho de rastreamento</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Ficheiro</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulador</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Predefinido</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Processo</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Pasta</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Velocidade da animação</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Remover item?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Nos últimos 7 dias</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Nos últimos 31 dias</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Nos últimos 365 dias</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Mais de 365 dias atrás</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Configurar</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Tamanho da Letra</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Áudio</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} está iniciando…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} está executando…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Equilibrado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Qualidade</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Selecionar ficheiro...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Seleccionar pasta...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Perfil personalizado</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Combinar num jogo</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Combinar arquivos relacionados</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Combine arquivos de jogos relacionados, como jogos individuais, numa entrada de jogo.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Adicionar scanner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">O serviço Nahimic foi detetado a correr no seu sistema. Este serviço é conhecido por causar problemas de renderização no Playnite (e outras aplicações).\r\n\r\nSe encontrar qualquer corrupção de gráficos ou outros problemas de renderização no Playnite, recomendamos que desabilite ou desinstale por completo o serviço Nahimic.\r\n\r\nMais informação em https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Aplicar a todos</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Apenas manualmente</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Uma vez por dia</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Uma vez por semana</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Em cada inicialização</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Incluir jogos ocultos</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Abrir</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAssign\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Incluir jogos desinstalados</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Incluir jogos ocultos</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Ir para detalhes</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Editar jogo</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Abrir pesquisa</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Caixa de pesquisa</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Exclusões</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Usar correspondência incerta no filtro de nome</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Quando ativado, o filtro de nomes vai corresponder aos nomes de jogos da mesma maneira que a pesquisa global.\r\nA correspondência estrita pode ser imposta em um caso individual, prefixando o filtro com !</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Definições</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Extensões instaladas</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Temas instalados</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Automático</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Sempre ligado</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Sempre desligado</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Pasta do programa</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Diretório do utilizador</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Corrupção no arquivo da biblioteca foi detectada. O Playnite será desligado.\r\n    \r\nAbra um novo problema na página do GitHub do Playnite com um pedido para corrigir seus arquivos.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Deseja guardar as alterações efetuadas?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/ro_RO.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Română</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Limbă Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Iesire</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtru activ</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtru dezactivat</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Filtre adiționale</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtre</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtru</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Date invalide</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Salvați schimbările?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Pagină home la www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Codul sursă pe GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Creează pachet de diagnostic</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Trimite informaţiile despre sistem</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Despre Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Creat de Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Alocă categorie</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Setează Categorii</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Adaugă Categorie</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Bifat - Alocă categorie\r\nNebifat - Șterge categorie\r\nNedeterminat - Nicio schimbare (când editezi jocuri multiple)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Nicio Categorie</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Nicio Platformă</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ooops! A apărut o problemă...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">A apărut o eroare nerecuperabilă.\r\n\r\nDacă doriţi să ne ajutaţi să rezolvăm această problemă, vă rugăm să descrieţi pe scurt acţiunile întreprinse înainte de eroare şi apoi să trimiteţi informaţiile de diagnosticare. Dacă sunteți online, acestea vor fi încărcat pe serverul Playnite pentru analiză.\r\n\r\nAlternativ, puteți face clic pe butonul &quot;Raportare eroare&quot; pentru a raporta eroarea manual pe GitHub.\r\n\r\nVă mulțumim pentru ajutor.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Extensia &quot;{0}&quot; a cauzat o eroare nerecuperabilă.\r\n\r\nRecomandăm salvarea fișierului jurnal și raportarea problemei la dezvoltatorul extensiei. Dacă problema continuă să reapară, dezactivați extensia.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Extensia &quot;{0}&quot; a cauzat o eroare nerecuperabilă.\r\n\r\nRecomandăm raportarea problemei la dezvoltatorul extensiei. Dacă problema continuă să reapară, dezactivați extensia.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Extensie necunoscută sau temă a cauzat o eroare nerecuperabilă.\r\n\r\nVă recomandăm să dezactivați extensiile de la terțe părți, să izolați extensia problematică și să raportați problema la dezvoltatorului extensiei.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">A apărut o eroare nerecuperabilă.\r\n\r\nDacă doriți să ne ajutați să rezolvăm această problemă, vă rugăm să trimiteți informații de diagnosticare. Vă mulțumim.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Oprire extensie</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Salvează fișierul jurnal...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Trimite informațiile de diagnosticare</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Raportează o eroare</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Restartează Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Repornire în Safe Mode</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Dezactivând toate extensiile 3rd party și folosind tema prestabilită</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Ieșire Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Acțiuni luate înaintea crash-ului (în engleză):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Managerul Librăriei</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Înlătură Joc(uri)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Nu se poate șterge - Un joc sau instalator rulează.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Nu se poate dezinstala - Un joc rulează.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Sunteți sigur că doriți să eliminați {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Sigur doriți să ștergeți {0} jocuri?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Sunteți sigur că doriți să eliminați {0}?\r\n\r\nSelectarea opțiunii „adaugă la lista de excludere” va împiedica jocul să fie importat din nou atunci când biblioteca este actualizată.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Sunteți sigur că doriți să eliminați {0} (de) jocuri?\r\n\r\nSelectarea opțiunii „adaugă la lista de excludere” va împiedica jocurile să fie importate din nou atunci când biblioteca este actualizată.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Sunteți sigur că doriți să eliminați {0} (de) intrări care nu sunt utilizate în prezent?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Nu s-au gasit câmpuri nefolosite</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Da (și adaugă la lista de excluderi)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Există modificări nesalvate în această secțiune</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Se actualizează formatul librăriei de jocuri...</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Update-ul la baza de date a eșuat.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Nu se poate face update la librăria de jocuri. {0} MB de spațiu liber este necesar.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Eroare de joc</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Nu se poate porni jocul. {0} nu a fost găsit în baza de date.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Nu poate fi pornită camera: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Nu se poate incepe actiunea: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Nu se poate deschide locatia jocului: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Nu s-a putut detecta dimensiunea de instalarea a jocului: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Eroarea la scanarea dimensiunii de instalare</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Au fost {0} erori în timpul scanării dimensiunii de instalare</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Nu se poate crea scurtătura: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Nu s-a putut deschide manualul: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Nu se poate instala jocul: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Nu se poate dezinstala jocul: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Nu s-au găsit acțiuni valide de pornire a jocului. Atunci când utilizați acțiuni de emulator, asigurați-vă că definițiile platformei se potrivesc între configurația jocului și emulatorului.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Implementarea instalației nu este disponibilă.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Plugin-ul de bibliotecă responsabil pentru acest joc este dezactivat sau nu este instalat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Download-ul oficial pentru informații metadata nu este disponibil.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Nu a fost selectat jocul.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Executarea scriptului jocului a eșuat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Executarea scriptului de aplicație a eșuat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Executarea scriptului global a eșuat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Executarea scriptului de emulator a eșuat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Executarea scriptului de acțiune de rulare a eșuat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 (sau mai nou) nu este instalat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Nu s-a putut determina cum se pornește jocul.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Activat</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Dezactivat</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Elimină</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Șterge titlul nefolosit</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Redenumire</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Copiază</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Adaugă</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Pictogramă Implicită</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Imagine Cover implicită</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Imagine implicită de fundal</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Finalizare</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Următorul</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Înapoi</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">EFECTUAT</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">ÎNAPOI</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">Eliberează</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Curăță</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Destituie</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Destituie Toate</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importaţi</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Nume</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Serie</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Versiune</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Ultimul rulat</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Cele mai jucate</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Total redat</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Dimensiunea instalării</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Dosar</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notițe</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Adăugat</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Data Adăugării</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Modificat</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Data Modificării</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Website</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Locație</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Salvează</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Închide</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Anulează</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Confirmare</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Restabilire</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Da</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Nu</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Bine ați venit</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Utilizator local</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">General</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Media</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Link-uri</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Instalare</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Acțiuni</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Se descarcă...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Se descarcă metadata...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Se încarcă...</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Tip</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profile</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Elimină</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Descarca</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Căutare</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Rezoluție:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Oricare</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Zoom</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Afișaj mod Listă</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Coperte</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Afișare mod Grilă</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Afișare mod Detaliu</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Personalizat</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Mulțumiri speciale</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licenţă</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Contribuitori</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Playnite se închide...</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Astăzi</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Ieri</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Luni</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Marţi</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Miercuri</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Joi</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Vineri</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Sâmbătă</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Duminică</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Săptămâna trecută</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Luna trecută</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Anul trecut</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Mai mult de un an</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 Mo la 100 Mo</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100 Mo la 1 GiO</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1 GiO la 5 GiO</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5 GiO la 10 GiO</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10 GiO la 20 GiO</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20 GiO la 40 GiO</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40 GiO la 100 GiO</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100 GiO sau mai mult</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Import realizat cu succes.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Toate jocurile</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Id de joc</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Id de baza de date</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Setări predefinite</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Coloană</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Coloane</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Rând</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Rânduri</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Nu s-a putut obține pictograma de la acțiunea de rulare. Nu este prezentă nicio acțiune de tip „ tip fișier”.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Descărcare doar metadatele lipsă</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Activarea acestei opțiuni va omite descărcarea metadatelor pentru câmpurile de date care conțin deja informații.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Selecția de jocuri</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Selectați ce jocuri ar trebui actualizate cu metadate noi:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Toate jocurile din baza de date</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Toate jocurile filtrare la moment</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Numai jocurile selectate</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Magazin Oficial</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Selectați câmpurile dorite pentru ca Playnite să le populeze automat și ce surse vreți să utilizați pentru a obține datele.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Te rog consideră să apeși sigla de mai sus și să contribui cu actualizări la data de baze igdb.com ca să îmbunătătim funcționalițatea Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Se descarcă metadata...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Se importă jocurile instalate...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Se importă {0} jocuri...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importare jocuri emulate din {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Se descarcă actualizările librăriilor...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Se scanează dimensiunea jocurilor din bibliotecă…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Se scanează dimensiunea jocurilor importate…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Actualizarea librăriei s-a finalizat</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Se eliberează resursele...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Configurare</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Setări…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platforme și Emulatoare</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Configurați Emulatoarele...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Managerul Librăriei...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Utilitare</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Descărcare Metadata...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Ustensile Software</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Configurare integrări...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Deschideți lansator terț</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Deschideți platformele terț</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Actualizare Librărie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Anulare actualizare bibliotecă</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Actualizare dosare emulate</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Adaugare Joc</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Adaugare Manuală...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Scanare Automată...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Joc Emulat...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Aplicație Microsoft Store…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Despre Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Exprimați-vă Părerea</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Schimbă în mod Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Link-uri</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Ajutor</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Ajutați-ne pe Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Susțineți-ne pe Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Manual de utilizare</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Documentaţie Trusă de Dezvoltare</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Repornire Sistem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Închidere Sistem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Suspendare Sistem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernează Sistemul</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Blocare sistem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Deconectare utilizator</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Alege un joc la întâmplare</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Câmpurile de jocu care vor fi afișate pe panoul de detalii:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Spațiere item</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Arată craiorajul fundalului articolului</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Lățimea marginii craiorajului articolului</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Sursa iconiței jocului este lipsă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Sursa coperții jocului este lipsă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Sursa fundalului jocului este lipsă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Spațiere verticală la detaliile jocului</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Poziția panoului de detalii în modul de vizualizare copertă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Poziția listei cu jocuri în modul de detalii</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Desenează separator între panouri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Înălțimea copertei de joc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Înălțimea pictogramei listei de jocuri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Fontul aplicației</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Font monospațiat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Poziția Panoului de Filtre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Poziția Panoului de Căutare</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Randează Coperta Jocului</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Corectați raportul de aspect</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Mod lărgit</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Cutie DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Pătrat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Banner Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Copertă vericală Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Repornirea este necesară pentru a aplica</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Setări</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">General</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Panoul de sus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Aspect vizual</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Detalii joc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Orientare</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Avansat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Ecran complet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Intrare</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Performanță</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Se actualizează</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Căutare</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Copie de rezervă</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Fă o copie de rezervă a bibliotecii</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Restaurare copie de rezervă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importați schimbările în librărie în mod automat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Locație către baza de date este invalidă, trebuie setată în mod corect.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Numele contului nu poate fi gol.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Descarcă metadata după ce imporți jocurile</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Lansează Playnite la bară</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Lansează Playnite la pornirea calculatorului</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Deschidere în bara de procese</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Nu s-a putut seta Playnite pentru pornirea deodată cu calculatorul.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Lansează în mod Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Încărcarea asincronă a imaginilor</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Îmbunătățește performanța în scroll-ul listelor de jocuri, dar imaginile se vor încărca mai incet.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Arată numele jocului dacă coperta lipsește</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Arata numele jocurile in modul &quot;Grid&quot; de redare</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Întunecați jocurile neinstalate</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Arata iconitele jocurilor in modul de redare &quot;Detalii&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Arata numarul de obiecte in descrierile grupurilor</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Arată doar câmpurile atribuite în panourile de filtru și explorare</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Dezactivează accelerarea hardware</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Foloseste daca intalneste sacadare sau alte probleme legate de interfata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Arată jocurile ascunse în liste lansare rapidă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Număr de obiecte lansare rapidă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Folosește imaginea de fundal a jocului ca fundal al ferestrei</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Blurare fundal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Calitate înaltă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Întunecare fundal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Arată în vizualizarea tip grilă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Temă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Profilul temei</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Tema pentru Fulscreen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Profilul Temei Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Locaţia bazei de date</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Stare de conectare:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Setari Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Goliţi cache-ul web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Ar putea rezolva probleme întâlnite la legarea conturilor.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Arata iconița în bara de sistem</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimizează Playnite în bara de sistem</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimizează Playnite în bara de sistem când aplicația este închisă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Când jocul pornește:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">După ce jocul se închide:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Formatează timpul jucat pentru a indica numărul de zile jucate</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Formatul datei:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Opțiunea aceasta vă v-a deloga de pe toate serviciile conectate. Repornirea aplicației este necesară, doriți să continuați?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Curățați Cache-ul?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Repornirea programului este necesară pentru aplicarea noii teme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Obțineți mai multe teme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Creează o temă nouă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Caută mai multe extensii</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Creați o extensie nouă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Ajută-ne să traducem programul PIaynite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite trebuie să fie repornit pentru a aplica noile setări. Reporniți acum?\r\n\r\nRepornirea va anula orice sarcini active (descărcări) în curs de desfășurare.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Reporniți Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite nu poate muta fișierele bibliotecii automat. Trebuie să mutați manual/să copiați fișierele înainte de a schimba locația. Dacă nu există nici o bibliotecă în locația țintă, va fi creată una nouă.\r\n\r\nNoua locație a bazei de date nu va fi utilizată până când Playnite nu va fi repornit. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Durata jocului nu va fi înregistrată dacă este setată acțiunea de &quot;Închidere&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Număr de rânduri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Număr de coloane</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Număr de rânduri în modul de vizualizare îndetaliat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Arată imaginea de fundal pe ecranul principal</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Nu se aplică retroactiv jocurilor existente fără re-descărcarea metadatelor.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importă timpul jucat al jocurilor în bibliotecă:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Configurează când trebuie ca Playnite să importe timpul jucat de plugin-urile bibliotecii pentru jocurile din baza de date Playnite. Pentru a putea utiliza această caracteristică, este nevoie de suportul plugin-urilor ce gestionează biblioteca de jocuri.\r\n\r\nÎntotdeauna: Importați timpul jucat pentru jocurile noi importate și existente în baza de date Playnite.\r\nDoar pentru jocurile nou importate: Importați timpul jucat doar pentru jocuri noi importate.\r\nNiciodată: Nu importa niciodată timpul jucat în nicio circumstanță.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Întotdeauna</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Doar pentru jocurile nou importate</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Niciodată</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Activare suport pentru manetă în modul desktop</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Butonul Guide al gamepad-ului deschide modul Fullscreen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Setări pentru descărcarea automată a Metadata pentru jocurile nou importate.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Ecran țintă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Utilizare întotdeauna ecranul principal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Afișează Titlurile Jocului</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Afișează starea bateriei</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Afișează procentajul bateriei</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Afişaţi ceasul</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Ascunde cursorul mouse-ului</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Instalat doar în filtre rapide</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Butoane Gamepad</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Orientare</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Derulare orizontală</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Selectați una dintre subsecțiuni</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Nici o setare valabilă</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Încărcarea setărilor eșuată</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Aceste scripturi sunt executate pentru fiecare joc din bibliotecă. Scripturile individuale pot fi atribuite pentru fiecare joc separat în timp ce editați detaliile jocului.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animează tranzițiile imaginii de fundal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Dimensiuni font</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Greyscale (tonuri de gri)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType (font)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Ecran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Mod formatare text</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Mod randare text</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Metodele de redare și formatare a textului nu sunt utilizate în prezent pentru descrierile jocurilor.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Preîncarcă imaginile de fundal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Dacă este activat, Playnite va descărca ilustrații de fundal în timp ce descarcă metadate, utilizând mai mult spațiu pe disc și făcând ilustrațiile disponibile atunci când sunteți offline.\r\n\r\nDacă este dezactivată, ilustrația de fundal este descărcată numai atunci când este nevoie prima dată, folosind mai puțin spațiu, dar poate duce la o întârziere înainte ca ilustrația să fie afișată și este posibil ca unele imagini să nu fie disponibile când sunteți offline.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Închide automat clientul terț după ieșirea din joc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Întârziere închidere client (în secunde)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Nu închide după o sesiune de joc mai scurtă decât (în secunde)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Inchiderea automată a următoarelor clienturi:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Închidere automată a platformelor terț</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importă lista de excluderi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Afișează avertisment atunci când se atribuie fișiere media prea mari pentru joc</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Comandă deschidere dosar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Organizația preferată de evaluare a vârstei</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Actualizați dimensiunea de instalare a jocurilor la actualizarea bibliotecii</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Scanează și actualizează dimensiunea de instalare a jocurilor, dacă este detectat că fișierele lor au fost modificate de la ultima scanare</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Nimic</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Umplere</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Uniform</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Stânga</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Dreapta</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Vârf</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Fund</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Eroare de import</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Autentificare necesară</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Autentificare eșuată</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Mod alternativ de redare web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Utilizați atunci când întâmpinați probleme cu vizualizările web, de exemplu casetele de dialog de autentificare pentru integrări.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Încărcare parțială a descrierilor mari de jocuri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Descrierile mari pot provoca o întârziere vizibilă la selectarea jocurilor.\r\n\r\nCând este activată, doar o parte din textul descrierii va fi inițial încărcată cu o opțiune pentru a încărca restul la cerere.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Import Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Descărcați metadate</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Setați configurația selectată pentru a fi utilizată pentru orice viitoare descărcări de metadate.\r\nPoate fi modificată, de asemenea, în setările aplicației.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Procedura Import Emulare</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Acest asistent vă va ghida prin procesul de descărcare și import de emulatoare de consolă și de import de jocuri emulate.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Rețineți că puteți adăuga oricând emulatoare și/sau jocuri suplimentare ulterior prin meniul principal (sub meniul „Bibliotecă” pentru setările emulatorului și meniul „Adăugați jocuri” pentru jocurile emulate).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Mai jos este o listă de emulatoare pe care Playnite îi poate recunoaște și configura automat. Puteți descărca programe de instalare a emulatoarelor de pe site-urile lor web. După ce aveți emulatoarele instalate (manual), le puteți importa în dialogul de configurare a emulatorului.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Puteți importa orice emulator care este instalat pe computer făcând clic pe butonul „Detectează automat din folder...”.  Playnite va căuta în folderul selectat orice emulator cunoscut și va oferi opțiunea de a le importa.  Puteți folosi acest buton de mai multe ori pentru a importa emulatoare din foldere diferite.  Emulatoarele vor fi adăugate în partea de jos a listei curente.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Scanează folder-ul ce conține Emulatorul</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Selectare fișiere</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Setări Emulatoare...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Se caută...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Setare pentru prima dată</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integrare Librărie</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Setare Finalizată</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Setări Platforme și Emulatoare</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Setări Emulatoare</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platforme</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platformă</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulatoare</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Adăugați Platformă</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Selectați Iconiță</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Selectați Copertă</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Selectați Imaginea</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Selectaţi Item</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Selectați Fundal</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Selectați Fișier</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Selectați URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Adăugați Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Platforme Suportate</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Doriţi să salvaţi modificările la platformă?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Doriţi să salvaţi modificările la emulator?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Executabil</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Parametrii</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Directorul de lucru</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Tipuri de fișiere suportate</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importă Emulatoare...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Descarcă Emulatoare...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Încarcă argumentele prestabilite de la profilul emulatorului cunoscut</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Ajutor Setări</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sortează după</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Sortare direcție</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Grupare după</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Ascendent</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Descendent</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Nu grupa</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Grupează după Librărie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Grupează după Categorie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Grupează după Platformă</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Tip de Vedere</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Vizualizare</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Panou Explorator</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Panou Filtre</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Iconiță</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Iconiță bibliotecă</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Imagine Copertă</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Imagine Fundal</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Sortează după Nume</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Librărie</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manualul Jocului</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Nume</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Nume Cont</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platformă</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Categorie</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Gen</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Data Lansării</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Anul Lansării</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Dezvoltator</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Etichetă</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Publicist</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Starea instalării</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Instalat</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Instalat</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Neinstalat</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Ascuns</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favorit</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Activare suport HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Ultima Dată Jucat</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Categorie</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Descriere</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Directorul de instalare</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Imagine Copertă</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Link-uri</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Calea către Imagine, ROM sau ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Gen</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Genuri</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Companie</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Companii</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Dezvoltator</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Dezvoltatori</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Publicare</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Producători</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Categorie</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Categorii</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Etichetă</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Etichete</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Caracteristică</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Caracteristici</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Rating Vârstă</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Rating Vârstă</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Regiune</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regiuni</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Sursă</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Surse</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Activitate recentă</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Eroare bază de date</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Nu s-a putut deschide baza de date a librăriei.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Baza de date nu a fost deschisă.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Nu puteți accesa baza de date a librăriei. Fișierul &quot;{0}&quot; este utilizat de un alt proces sau este într-o locație inaccesibilă.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Nu s-a reușit crearea arhiva de diagnosticare.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Nu s-a reușit trimiterea automată a arhivei de diagnosticare.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Nu s-a putut importa jocuri de la {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Link-ul nu a putut fi deschis, URL-ul nu are un format valid.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Aplicația nu s-a putut lansa.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Editare Detalii Joc</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Imagine URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Adaugă Link</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Salvează Modificările</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Adaugă Acţiune</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Șterge Acțiunea</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Ștergere buton de lansare</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Adăugare Jocuri</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Caută Folder-ul...</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Detectează instalările</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Navigare...</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Deschide Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Setări de Profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Nume jocului nu poate fi gol.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Nume jocului nu poate fi gol înainte de căutarea metadatei.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Data jocului invalidă</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Introduceți o adresă URL validă începând cu http:// sau https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Selectați URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Nu s-a putut descărca metadata: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Eroare la descărcare</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Curăță Filtrele</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Cont Privat</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Cont Public</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API Key</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Eroare la Pornire</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Eroare Temă</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Curăță Tot</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Se instalează</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Se dezinstalează</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Se lansează</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Rulează</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">URL invalid</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Repaus</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimizați</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Restaurați Fereastra</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Închideţi</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Schimbați</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Avansat</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Niciodată</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Stare de Finalizare</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Scorul Utilizatorului</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Scorul Criticilor</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Scorul Comunității</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Script-uri</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Plugin-uri</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Surse de metadata</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Extensii</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID-ul extensiei</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Reîncarcă Scripturile</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Toate script-urile au fost reîncărcate cu succes.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Niciun element găsit</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Revenire la modul Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Ieșire Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Librării</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Actualizează Tot</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Creat de:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Versiune:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Librărie</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistici</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Toate</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Nimic</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Notificări</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Lățime</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Înălţime</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Mărime</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Micșorat</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Mărit</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Mai mare</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Cel mai mare</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Prestabilit</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Selectare</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Selectează tot</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Primul</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Aleator</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Încărcați mai multe</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Transparent</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Restrângere</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Extinde</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Restrânge tot</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Extinde tot</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Altele</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Teme</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Argumente Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Argumente adiționale la Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Suprascriere Argumentele Emulatorului</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Selectați Jocurile pentru Importare</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Căutare metadata</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Versiune nouă disponibilă</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Schimbări de la ultima actualizare</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Descarcă şi actualizează programul</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Verificați dacă sunt disponibile Actualizări</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Eroare la actualizare</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Nu s-a putut căuta versiunea nouă.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Sunteți la curent cu cea mai nouă versiune.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Actualizarea nu a putut fi descărcată și instalată.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Reîncarcă lista de teme</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Aplicați tema selectată</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Urmărește schimbări în fișier</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Aplică automat tema pentru orice modificare la fișierului sursă</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Durata script-ului</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Execută script-ul global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrat</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Curent</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Nou</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Salvați ca setare implicită</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Adaugă la Favorite</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Șterge de la Favorite</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Ascunde acest joc</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Șterge din lista jocurilor ascunse</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\"></sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Editare...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Setează Categoria...</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Setează starea de finalizare</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Şterge</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Jucați</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Instalaţi</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Opțiuni de joc</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Detalii</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Dezinstalați</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Deschide Directorul de Instalare</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Creează scurtătură pe Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Deschide Manual</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Aflați mai multe</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Controlat de plugin-ul librăriei</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Sfat: Puteți folosi un proces mai avansat de descărcare a metadatelor în timpul editării unui joc prin opțiunea de &quot;Editare&quot; din meniu.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Nedisponibil când se execută o acțiune.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Textul descrierii trebuie să conțină o sintaxă HTML senzitivă</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Timpul jucat este înregistrat în secunde.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\"></sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Pentru a nu acorda un scor folosiți valori între 0 și 100 sau lăsați gol.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Cod, localizare și alți contribuabili în nici o ordine particulară:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Încetați monitorizarea jocului?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Timpul Jucat</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Ultimul Joc</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}oră {1}minut</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minute</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} secunde</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Nu a fost jucat</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Deschideți în modul Desktop...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Deschideți în modul Fullscreen...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Se încarcă librăria de jocuri...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Nu s-a putut instala fișierul script.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Script instalat cu succes.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Instalează Script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Eroare la script</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Nu s-a putut executa funcția extensiei.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Deschideți folderul de metadate</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">Programul {0} nu este instalat.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Se va deschide clientul {0}. Vă rugăm să vă logați și să închideți mesajul acesta.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Calea de instalare a jocului nu a fost gasită.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Setarea acțiunii jocului este invalidă.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Depanarea problemelor de sincronizare a contului</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Probleme de troubleshooting</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Redenumește articol</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Adauga articol nou</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Introduceţi numele</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Introduceţi numele nou</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">În mai puțin de o oră</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">Între 1 și 10 ore</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">Între 10 și 100 ore</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">Între 100 și 500 ore</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">Între 500 și 1000 ore</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">Mai mult de 1000 ore</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite trebuie repornit pentru a putea termina instalarea. Doriți să reporniți acum?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Instalare cu succes</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Instalați Extensia?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Generic</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Instalarea temei a eșuat.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Doriți să instalați o nouă temă?\r\n\r\n{0}\r\nDe {1}\r\nVersiunea {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Avertisment de performanță</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Nu mai afișa</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Temele integrate nu pot fi dezinstalate.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Extensiile integrate nu pot fi dezinstalate.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Această extensie nu suportă versiunea actuală de Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Directorul de instalare</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Importă fișireul...</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Ce-i asta?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Sunteți sigur?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Timpul total de joc</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Timpul mediu de joc</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Timpul maxim de joc</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Vedere de ansamblu</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Bara Laterală</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Realizari</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Ştiri</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Pagina magazinului</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Jucat Recent</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favorite</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Cel mai jucat</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Toate</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Sunt aplicate filtrele.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Rezultatele căutării pentru:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Alege altul</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpen\"></sys:String>\r\n    <sys:String x:Key=\"LOCActivate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAssign\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/ru_RU.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Русский</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Язык Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Выход</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Фильтр активен</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Фильтр отключен</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Доп. фильтры</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Фильтры</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Фильтр</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Неверные данные</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Сохранить изменения?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Домашняя страница: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Исходный код на GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Собрать файл для диагностики</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Отправить информацию для диагностики</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">О Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Создано Йозефом Немеком (Josef Němec)</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Задать категорию</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Выбрать категорию</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Добавить категорию</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Выбрано - Категория назначена\r\nНе выбрано - Категория не назначена\r\nНе определено - Без изменений (когда редактируется несколько игр)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Нет категории</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Нет платформы</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ой! Что-то пошло не так…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Произошла неисправимая ошибка.\r\n        \r\nЕсли вы хотите помочь нам исправить эту проблему, кратко опишите действия, предпринятые перед сбоем, а затем отправьте сведения для диагностики. Если вы подключены к Интернету, диагностический пакет будет сам загружен на сервер Playnite для анализа.\r\n\r\nКроме того, вы можете нажать на кнопку «Отчёт о сбое», чтобы самостоятельно указать на проблему в разделе «Issues» репозитория на GitHub, приложив туда этот отчёт.\r\n\r\nСпасибо вам за вашу помощь.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Расширение &quot;{0}&quot; вызвало неисправимую ошибку.\r\n\r\nМы рекомендуем сохранить лог-файл и сообщить о проблеме разработчику расширения. Если проблема снова возникнет, отключите расширение.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Расширение &quot;{0}&quot; вызвало неустранимую ошибку.\r\n\r\nРекомендуем сообщить о проблеме разработчику расширения. Если она повторится, отключите расширение.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Неизвестный компонент (расширение или тема) вызвал неустранимую ошибку.\r\n\r\nРекомендуем поочередно отключать сторонние дополнения, чтобы выявить проблемное и затем рассказать о проблеме его разработчику.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Произошла неустранимая ошибка.\r\n\r\nЧтобы помочь решить проблему, пожалуйста, вышлите нам данные для диагностики. Спасибо.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Отключить расширение</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Сохранить лог файл</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Выслать диагн. данные</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Сообщить о сбое</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Перезапустить Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Перейти в безопас. режим</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Отключает все сторонние расширение и применяет тему по умолчанию.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Выйти из Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Порядок действий перед сбоем (опишите на английском языке):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Менеджер библиотеки</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Убрать игру(ы) из списка?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Невозможно убрать - запущена игра или установщик.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Невозможно удалить - запущена игра.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Вы уверены, что хотите убрать из списка {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Вы уверены, что хотите убрать из списка эти игры ({0} шт.)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Вы уверены, что хотите убрать из списка {0}?\r\n\r\nОпция &quot;добавить в список исключений&quot; предотвратит автоматический импорт игры при следующем обновлении библиотеки.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Вы уверены, что хотите убрать игры ({0} шт.) из списка?\r\n\r\nОпция «добавить в исключения» предотвратит их повторное появление в списке при следующем обновлении библиотеки.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Вы уверены, что хотите удалить значения неиспользуемых полей ({0} шт.)?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Неиспользуемые поля не найдены.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Да (добавить в исключения)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">В этой вкладке есть несохраненные изменения</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Обновление формата базы данных…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Сбой обновления базы данных.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Не удалось обновить список игр. Требуется {0} МБ свободного места на диске.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Ошибка игры</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Не удалось запустить игру. '{0}' не найдена в базе данных.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Не удалось запустить игру: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Не удалось начать действие: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Не удалось открыть расположение игры: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Не удалось определить размер игры: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Ошибка сканирования размера игры</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Ошибок при сканировании размера игры: {0} </sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Не удалось создать ярлык: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Не удалось открыть руководство: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Не удалось установить игру: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Не удалось удалить игру: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Не найдено действительных действий запуска игры. При использовании действий эмулятора убедитесь, что определения платформы совпадают в конфигурации игры и эмулятора.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Проведение установки недоступно.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Плагин для клиента, отвечающий за эту игру, отключен или не установлен.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Получение официальных метаданных невозможно.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Ни одна игра не была выбрана.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Не удалось выполнить скрипт игры.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Не удалось выполнить скрипт приложения.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Не удалось выполнить глобальный скрипт.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Не удалось выполнить скрипт эмулятора</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Не удалось выполнить действие скрипта игры.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 или новее не установлен.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Не удалось определить, как запустить игру.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Включено</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Откл.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Убрать</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Удалить неиспользуемые</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Переименовать</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Копировать</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Добавить</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Иконка по умолчанию</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Обложка по умолчанию</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Фоновое изображение по умолчанию</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Завершить</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Далее</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Назад</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">ГОТОВО</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">НАЗАД</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">ОЧИСТИТЬ</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Снять выбор</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Скрыть</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Скрыть все</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Выбрать</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Название</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Автор</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Модуль</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Серия игр</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Версия</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Запускалась</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Самая запускаемая</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Запускалась раз(а)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Размер игры</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Папка</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Заметки</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Добавлено</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Дата добавления</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Изменено</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Дата изменения</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Сайт</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Путь</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">Окей</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Сохранить</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Закрыть</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Отменить</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Подтвердить</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Сбросить</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Да</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Нет</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Добро пожаловать</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Локальная учетка</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Основное</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Изображения</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Ссылки</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Место установки</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Действия</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Скачивание…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Загрузка картинок…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Загрузка…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Тип</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Профиль</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Профили</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Убрать</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Скачать</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Поиск</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Разрешение:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Любая</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Масштаб</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Отображение списком</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Обложка</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">В виде сетки</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Детали</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Свой</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">Ссылка</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Особая благодарность</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Лицензия</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Участники</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Выходим из Playnite...</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Сегодня</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Вчера</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Понедельник</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Вторник</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Среда</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Четверг</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Пятница</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Суббота</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Воскресенье</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">На прошлой неделе</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">В прошлом месяце</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">В прошлом году</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Больше года назад</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">от 0 до 100МБ</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">от 100 МБ до 1 ГБ</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">от 1 Гб до 5 Гб</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">от 5 ГБ до 10 ГБ</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">от 10 Гб до 20 Гб</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">от 20Гб до 40ГБ</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">от 40ГБ до 100ГБ</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">от 100 ГБ или больше</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Импорт успешно завершен.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Все игры</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ID игры</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">ID базы данных</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Шаблоны</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Столбец</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Столбцы</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Строка</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Строки</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Не удалось получить значок действия «Играть». К действию не привязано ни одного типа файла.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Докачать только недостающие метаданные</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Включение этой опции пропустит загрузку метаданных для полей данных, которые уже содержат информацию.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Выбор игр</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Выберите, к каким играм следует обновить метаданные:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Все игры из базы данных</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Все отфильтрованные игры</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Только выбранные</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Поля метаданных не выбраны</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Поля метаданных для загрузки не выбраны. Пожалуйста, выберите хотя бы одно и включите хотя бы один источник метаданных.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Офиц. магазин</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Выберите, какие поля должны быть автоматически заполнены Playnite и какие источники должны использоваться для получения данных.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Пожалуйста, нажмите на логотип выше и внесите изменения в базу данных IGDB.com, чтобы улучшить данные, используемые Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Загружаем метаданные...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Импортируем установленные игры…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Импортируем игры из {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Импортируем эмулированные игры из {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Загружаем обновления библиотеки…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Сканирование размера игр в библиотеке…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Сканирование размера импортируемых игр…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Обновление библиотеки завершено</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Освобождаем ресурсы…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Конфигурация</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Настройки…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Платформы и эмуляторы</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Настроить эмуляторы…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Менеджер библиотеки...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Инструменты</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Загрузить метаданные…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Программные средства...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Настроить интеграции…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Открыть сторонний клиент</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Сторонние клиенты</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Обновить список игр</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Отменить обновление библиотеки</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Обновить папку Эмуляторов</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Добавить игру</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Вручную…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Найти установленные...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Эмулированная игра...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Приложение из MS Store…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">О Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Отправить отзыв</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Перейти в полноэкранный режим</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Ссылки</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Справка</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Поддержать на Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Поддержать на Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Руководство пользователя</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Документация по SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Перезагрузка</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Завершение работы</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Спящий режим</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Гибернация</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Заблокировать систему</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Выйти из аккаунта</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Подобрать игру наугад</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Что показывать на панели подробностей:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Отступ между элементами</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Рисовать фон элемента сетки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Толщина рамки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Источник при отсутствии иконки игры</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Источник при отсутствии обложки игры</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Источник при отсутствии фона игры</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Расстояние по вертикали до описания игр</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Положение панели подробностей</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Положение списка игр</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Рисовать разделитель между панелями</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Высота обложки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Высота значка списка игр</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Шрифт программы</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Моноширинный шрифт</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Положение панели фильтра</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Положение панели проводника</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Отрисовка обложки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Желаемое соотношение сторон</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">След. параметры также влияют и на отрисовку макета в полноэкранном режиме!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Подогнать под соотношение</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD Box</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Квадратное</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Баннер Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Вертикальная обложка Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Требуется перезапуск для применения</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Настройки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Основные</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Верхняя панель</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Внешний вид</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Подробнее об игре</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Макет</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Расширенные</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Полноэкранный режим</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Ввод</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Производительность</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Метаданные</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Обновление</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Поиск</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Резервное копирование</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Резервное копирование данных библиотеки</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Восстановить резервную копию данных</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Автоматически импортировать изменения</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Не найдено расположение базы данных, должен быть указан верный путь.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Имя учетной записи не может быть пустым.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Загрузка метаданных после импорта игр</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Запускать Playnite свернутым</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Запускать Playnite вместе с системой</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Запускать спрятанным в обл. уведомлений</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Не удалось добавить Playnite в автозагрузку вместе с системой.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Запускать сразу в полноэкранном режиме</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Отложенная загрузка изображений</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Может улучшить плавность прокрутки списков игр за счет увеличения времени загрузки изображений.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Показывать название для игр без обложки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Показывать название игры внизу обложки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Затемнять неустановленные игры</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Показ. иконку игры на панели подробностей</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Показ. кол-во элементов в описании групп</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Отображать только указанные поля на панелях Фильтра и Проводника</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Отключить аппаратное ускорение</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Используйте в случае заиканий и других проблем с интерфейсом.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Отображать скрытые игры в контекстном меню</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Влияет на контекстное меню значка на панели задач и в трее.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Кол-во элементов контекстного меню</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Использовать фоновое изображение игры в качестве фона окна</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Размытие фона</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Высокое качество</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Затемнение фона</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Показать в виде сетки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Профиль темы</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Полноэкранная тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Цвет полноэкранной темы</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Путь к базе данных</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Статус:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Настройки Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Очистить кэш</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Может решить проблемы, возникающие при привязке учетных записей.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Показать значок в трее</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Сворачивать Playnite в трей</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Сворачивать Playnite в трей при закрытии окна приложения</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">При запуске игры:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">После закрытия игры:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Преобразовывать &quot;время в игре&quot; в количество сыгранных дней</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Формат дат:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">После этого вы выйдете из всех связанных служб. Требуется перезапуск программы, продолжить?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Очистить кэш?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Для применения новой темы требуется перезапуск Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Найти больше тем</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Создать свою</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Больше расширений</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Создать свое</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Помогите нам перевести Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Для применения новых настроек необходимо перезапустить Playnite. Перезапустить сейчас?\r\n\r\nВ случае перезапуска все активные задачи (загрузки), которые выполняются в данный момент, будут отменены.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Перезапустить Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite не может перемещать файлы вашей библиотеки автоматически. Перед изменением расположения необходимо будет вручную переместить/скопировать файлы. Если в указанном расположении нет библиотеки, в таком случае будет создана новая.\r\n\r\nНовое расположение базы данных будет использоваться только после перезапуска Playnite. \r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Время игры не будет засчитано, если выбрать действие «Закрыть».</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Кол-во строк</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Кол-во столбцов</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Кол-во строк в режиме подробностей</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Показ. фон игры на главном экране</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Playnite будет использовать доступные игровые скриншоты как фон, взамен фоновых изображений из магазина.\r\nНе применяется ретроспективно к существующим играм.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Импортировать время игры в библиотеку:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Определяет, когда Playnite должен импортировать время игры, указанное плагинами библиотек для игр в базе данных Playnite. Для использования этой функции необходима поддержка плагинов библиотеки, отвечающих за обработку одной или нескольких игр.\r\n\r\nВсегда: Импортирует время игры для недавно импортированных и уже имеющихся игр в базе данных Playnite.\r\nТолько для недавно импортированных игр: Импортирует время игры только для недавно импортированных игр.\r\nНикогда: Никогда не импортирует время игры ни при каких обстоятельствах.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Всегда</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Только для недавно импортированных игр</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Никогда</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Вкл. поддержку геймпада в режиме рабочего стола</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Кнопка Guide переводит в полноэкр. режим</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Автозагрузка метаданных для недавно импортированных игр.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Приоритетный экран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Всегда использовать основной дисплей</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Показ. заголовки игр</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Показ. состояние батареи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Показ. % заряда батареи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Показывать время</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Скрывать курсор мыши</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Во вкладках только установленные</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Подсказки кнопок геймпада</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Макет</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Горизонтальная прокрутка</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Выберите один из подразделов</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Нет доступных настроек</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Не удалось загрузить настройки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Эти скрипты выполняются к каждой игре в библиотеке. Скрипты для конкретной игры можно настроить при редактировании данных об игре.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Анимировать смену фонового изображения</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Размеры текста</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Авто</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Без сглаживания</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Градации серого</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Оптимальный</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Обычный</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Режим форматирования текста</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Режим отрисовки текста</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Настройки режимов отрисовки и форматирования текста не применяются к тексту описания игры.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Предзагрузка фоновых изображений</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Если включено, Playnite будет загружать фоновые изображения при загрузке метаданных. Используется больше дискового пространства, но обеспечивается доступность изображений в автономном режиме.\r\n \r\nЕсли выключено, фоновые изображения загружаются только при необходимости. Используется меньше дискового пространства, но может привести к задержке перед отображением изображения, а также некоторые изображения могут быть недоступны в автономном режиме.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Автоматически закрывать сторонний клиент после выхода из игры</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Время отключения клиента (в секундах)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Не закрывать после игровой сессии короче чем (в секундах)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Автоматически закрывать следующие клиенты:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Автовыход из клиентов</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Импорт списка исключений</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Предупреждать, если медиаданные игры много весят</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Команда открытия папки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Предпочт-я организация, определ. возрастные рамки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Обновить размер игр при обновлении библиотеки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Если было обнаружено, что с момента последнего сканирования файлы игр были изменены, то в таком случае запускается повторный процесс сканирования и обновления размера игр</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Нет</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Растянуть</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">По размеру</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Заполнение</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Слева</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Справа</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Сверху</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Снизу</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Ошибка при импортировании</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Требуется авторизация</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Не удалось авторизоваться</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Альтернативный режим отображения веб-просмотра</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Используйте при возникновении проблем с веб-просмотром, например, с диалогами авторизации интеграции.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Частичная загрузка длинных описаний игр</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Длинные описания игр могут вызывать заметные зависания при их выборе в интерфейсе.\r\n\r\nЕсли включено, вначале будет загружаться только часть описания, с возможностью загрузить продолжение по запросу.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Импорт метаданных</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Скачать метаданные</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Установите выбранную конфигурацию для загрузки метаданных в будущем.\r\nможет быть изменен в настройках приложения.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Мастер импорта эмуляторов и игр к ним</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Этот мастер проведет вас через процесс загрузки и импортирования эмулятор и игр к ним.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Имейте в виду, что вы всегда сможете добавить другие эмуляторы и/или игры позже через главное меню (в разделе «Библиотека» для настроек эмулятора и «Добавить игру» для эмулируемых игр).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Ниже приведен список эмуляторов, которые Playnite может распознавать и автоматически настраивать. Вы можете самостоятельно скачать и установить их с официальных сайтов. После установки эмуляторов (вручную), вы можете импортировать их в диалоге настройки эмуляторов.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Вы можете импортировать любые эмуляторы, установленные на вашем ПК, нажав кнопку &quot;Найти в папке…&quot;. Playnite поищет в выбранной папке любые известные эмуляторы и затем предложит их импортировать. Вы можете импортировать из разных папок, воспользовавшись кнопкой неограниченное количество раз. Эмуляторы будут добавлены в конец текущего списка.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Вы можете импортировать игры, нажав кнопку &quot;Сканировать папку эмулятором&quot;. Выбранный эмулятор сообщит Playnite, какие типы файлов следует просканировать и импортировать. Вы можете импортировать из разных папок, воспользовавшись кнопкой неограниченное количество раз. Игры будут добавлены в конец текущего списка.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Нет подходящих эмуляторов для импортирования. Вы не сможете автоматически импортировать какие-либо эмулированные игры, предварительно не настроив эмулятор. Вы действительно хотите продолжить и выйти из процесса импортирования?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">В Playnite нет настроенных эмуляторов. Вы не можете импортировать игры без предварительной настройки эмулятора и выбора соответствующих типов файлов. Вы хотите добавить эмуляторы сейчас?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Сканировать папку эмулятором</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Выбрать файлы</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Найти в папке…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Настроить эмуляторы…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Сканирование…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Сканирование {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Первая настройка</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Этот помощник поможет вам пройти через автоматический процесс импорта игр и настройку внешних игровых библиотек. Playnite может автоматически импортировать игры из множества игровых клиентов, таких как Steam или GOG, а также обновлять свою библиотеку, автоматически обновляя ее во время запуска приложения.\r\n\r\nНе забывайте, что вы всегда сможете добавить какую-либо игру для любой платформы вручную из главного меню, нажав кнопку &quot;Playnite&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Интеграция библиотеки</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Ниже приведен список некоторых интеграций с клиентами, официально поддерживаемых Playnite. Выберите те, которые хотели бы установить.\r\n\r\nДругие интеграции могут быть установлены позже из меню &quot;Дополнения&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Конфигурация завершена</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Начальная настройка завершена. Помните, что вы можете изменить все позже, в меню «Настройки».\r\n\r\nВы также можете добавить любую игру позже, щелкнув на логотип Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Не удалось скачать дополнение(я).\r\n\r\nМожете попробовать снова загрузить интеграции из меню аддонов по завершению начальной настройки.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Загрузка интеграции {0} …</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Загрузка списка рекомендованных интеграций…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Не удалось загрузить список рекомендованных интеграций. Вы можете попробовать снова загрузить интеграции позже через меню Дополнений.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Настройка платформы и эмулятора</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Настроить эмуляторы</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Платформы</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Платформа</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Эмуляторы</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Эмулятор</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Добавление платформы</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Выбрать иконку</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Выбрать обложку</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Выберите изображение</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Выберите элемент</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Выбрать фон</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Выберите файл</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Выбрать URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Добавление эмулятора</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Поддерживаемые платформы</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Вы хотите сохранить изменения платформы?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Вы хотите сохранить изменения эмулятора?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Исполняемый файл</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Аргументы</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Рабочая директория</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Поддерживаемые типы файлов</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Импортировать эмуляторы…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Скачать эмуляторы…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Загрузка шаблона с аргументами из профиля известного эмулятора</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Вы уверены, что хотите удалить эмулятор {0}?\r\nОн используется в играх ({1} шт.).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Вы уверены, что хотите удалить платформу {0}?\r\nОна используется в играх ({1} шт.) и эмуляторах ({2} шт.)</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Настройки справки</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Сортировать</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Порядок сортировки</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Группировать</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">По возрастанию</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">По убыванию</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Не группировать</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">По стороннему клиенту</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">По категории</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">По платформе</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Структура</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Вид</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Панель проводника</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Панель фильтров</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Иконка</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Значок библиотеки</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Обложка</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Фон</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Сортировка</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Руководство пользователя</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Название игры</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Путь установки</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Имя пользователя</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Платформа</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Категория</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Жанр</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Дата выхода</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Год выхода</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Разработчик</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Метки</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Издатель</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Состояние установки</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Соотв. всем фильтрам</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Если включено, то только игры, использующие все предметы во всех фильтрах, будут включены в просмотр.\r\nЕсли выключено, то игры, использующие любой предмет в любом фильтре, будут включены в просмотр.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Установлено</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Установлена</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Не установлено</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Скрыто</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">В избранном</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Включить поддержку HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Если включено, перед запуском игры HDR будет включаться на основном экране.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Обратите внимание, что HDR не поддерживается на вашем основном экране.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Последний запуск</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Категория</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Описание</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Путь установки</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Обложка</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Ссылки</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Путь к образу, ROM или ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Жанр</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Жанры</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Компания</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Компании</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Разработчик</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Разработчики</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Издатель</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Издатели</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Категория</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Категории</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Метка</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Метки</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Особенность</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Особенности</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Возрастной рейтинг</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Возрастной рейтинг</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Регион</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Регионы</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Источник</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Источники</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Недавняя активность</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Ошибка базы данных</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Не удалось открыть базу данных библиотеки.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">База данных не открыта.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Отсутствует доступ к базе данных библиотеки. Файл &quot;{0}&quot; используется другим процессом или находится в недоступном месте.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Не удалось создать файл с диагностикой.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Не удалось автоматически отправить пакет диагностики.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Диагностическая информация была успешно отправлена.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Файл с диагностикой был успешно создан и загружен.\r\nПожалуйста, приложите следующий ID к вашему отчету о проблеме:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Не удалось импортировать игры из {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Не удалось импортировать эмулированные игры из {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Невозможно выполнить поиск игр по выбранному профилю эмулятора. Профиль не содержит расширений или платформ.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Не удалось запустить Playnite. Закройте все остальные запущенные копии и повторите ещё раз.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Не удалось применить тему &quot;{0}&quot;, цветовой профиль &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Не удалось перейти по ссылке, проверьте правильность URL.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Не удалось запустить приложение.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Не удалось инициализировать компонент WebView. Playnite не может продолжить процесс запуска.\r\n\r\nПодробнее на сайте https://playnite.link/cefstartup.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Не получается импортировать эмуляторы из-за отсутствующего или поврежденного файла со скриптами.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Не удалсь выполнить действие меню.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Редактировать данные игры</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Ссылка на изображение</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Добавить ссылку</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Добавить ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Сохранить изменения</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Применить изменения в полях к редактируемым играм.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Добавить действие</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Удалить</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Убрать действие «Играть»</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Добавить</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Сканировать папку...</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Обнаружить установленные</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Обзор...</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Открыть Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Настройки профиля</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Имя игры не может быть пустым.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Папка для выполнения действия «Играть» не может быть пустой.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Имя игры не может быть пустым перед поиском метаданных.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Неверные игровые данные</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Введите действительный URL-адрес, начинающийся с http:// или https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Выбрать URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Не удалось скачать метаданные: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Ошибка загрузки</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Очистить фильтры</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Закрытый профиль</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Открытый профиль</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API-ключ</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Ошибка при запуске</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Ошибка темы</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Очистить всё</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Установка</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Удаление</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Запускается</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Запущена</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Неверный URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Ничего не делать</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Свернуть</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Развернуть окно</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Восстановить окно только при запуске из пользовательского интерфейса</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Закрыть</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Изменить</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Дополнительное</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Никогда</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Статус</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Статус завершения</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Оценка пользователей</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Оценка критиков</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Оценка сообщества</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Скрипты игры</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Скрипты приложений</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Скрипты</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Плагины</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Источники метаданных</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Расширения</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID расширения</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Перезагрузить скрипты</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Интерактивный SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Все скрипты успешно перезагружены.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Не найдено игр по заданным критериям поиска/фильтра</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Ничего не найдено</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Выйти из полноэкранного режима</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Закрыть Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Библиотеки</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Обновить всё</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Создано:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Версия:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Обновлено:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Модуль:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Статистика</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Все</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Нет</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Уведомления</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Ширина</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Высота</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Размер</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Маленький</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Средний</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Большой</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Оч. большой</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Огромный</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">По умолчанию</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Выбрать</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Выбрать все</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Снять выделения</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Первое</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Случайное</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Выбрать</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Загрузить ещё</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Прозрачность</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Свернуть</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Развернуть</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Свернуть всё</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Развернуть всё</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Другое</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Темы</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Параметры для эмулятора</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Предустан. аргументы</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Свои аргументы</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Дополн. аргументы для эмулятора</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Перезаписать аргументы для эмулятора</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Действие «Играть»</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Выберите объекты для импорта</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Выбрать игры для импорта</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Поиск метаданных</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Вышла новая версия</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Изменения с момента последнего обновления</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Скачать и обновить</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Проверить наличие обновлений</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Ошибка обновления</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Не удалось проверить наличие новой версии.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Обновления не найдены, у вас установлена актуальная версия.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Не удалось скачать и установить обновление.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">В данный момент выполняется какая-то фоновая задача. Вы хотите отменить ее и продолжить обновление?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">В данный момент выполняется какая-то фоновая задача. Вы хотите отменить ее и выйти из Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">В данный момент выполняется какая-то фоновая задача. Переключение режимов отменит эту задачу. Вы все равно хотите переключиться?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Доступно обновление для Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Перезагрузить список тем</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Применить выбранную тему</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Посмотреть изменения файла</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Автоприменение темы при изменениях исходного файла</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Тип скрипта</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Выполнить перед запуском игры</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Выполнить после выхода из игры</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Выполнить после запуска игры</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Выполнить при запуске приложения</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Выполнить при закрытии приложения</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Скрипт запуска игры</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Скрипт запущенной игры</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Скрипт при выходе из игры</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Выполнение глобальных скриптов</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Общее</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Отфильтровано</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Текущее</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Создать</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Проверить скрипт</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Показывать только выбранные элементы.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Сохранить по умолчанию</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Добавить в избранное</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Убрать из избранных</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Скрыть эту игру</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Убрать из скрытых</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Включить поддержку HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Отключить поддержку HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Изменить…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Вычислить размер игры</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Вычислить размер игры (Все)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Вычислить размер установки (Только недостающих)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Размер игры</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Выбрать категорию…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Статус игры</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Убрать из списка</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Играть</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Установить</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Настройки игры</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Подробная информация</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Удалить с устройства</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Открыть расположение игры</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Создать ярлык на рабочем столе</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Открыть руководство</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Другое</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Управляется плагином для клиента</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Процесс запуска игры будет осуществляться плагином для клиента, ответственным за эту игру.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Не найдено никакой информации об игре '{0}'.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Совет: Вы можете использовать более продвинутый процесс скачивания метаданных во время редактирования данных одной игры с помощью опцию меню &quot;Изменить&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Недоступно, когда выполняется какое-либо действие.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Текст описания опирается на синтаксис HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Время в игре записывается в секундах.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Размер игры указывается в байтах</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Дата выхода должна быть установлена в формате &quot;год-месяц-день&quot;. Значения месяца и дня могут быть пропущены.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Введите значение от 0 до 100, либо оставьте без оценки.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Разработка Playnite поддерживается этими патронами и подписчиками Ko-fi:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Люди, принимавшие участие в написании кода, \r\nпереводе на другие языки и прочем:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Отменить мониторинг игры?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">В настоящее время запущен мониторинг установки, вы хотите отменить процесс и вернуть игру в предыдущее состояние?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">В настоящее время ведется мониторинг запуска игры. Вы хотите отменить процесс и вернуть игру в предыдущее состояние?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Времени в игре</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Последний запуск</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0} д. {1} ч. {2} м.</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0} ч {1} мин</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} мин</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} сек</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Не запускалась</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Переход в обычный режим…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Переход в полноэкранный режим…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Загрузка библиотеки игр…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Вычисление размера игры…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Вычисление размера игры {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Не удалось установить файл скрипта.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Скрипт успешно установлен.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Установить скрипт</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Ошибка скрипта</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Не удалось выполнить функцию расширения.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Открыть папку метаданных</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Вычислить</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Автоматически вычисляет размер игры, используя диски, если игра была не установлена, или каталог установки, если он был задан.</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">Клиент {0} не установлен.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Клиент {0} сейчас будет открыт. Войдите в свою учетную запись и закройте это сообщение.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Ожидание входа в учетную запись, закройте сообщение, когда завершите процедуру…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Папка с установленной игрой не найдена.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Неправильная конфигурация для действия «Играть».</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Устранение неполадок синхронизации учетной записи</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Устранение неполадок</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Переименовать элемент</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Добавить новый</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Введите имя</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Введите новое имя</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Менее часа</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">От 1 до 10 часов</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">От 10 до 100 часов</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">От 100 до 500 часов</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">От 500 до 1000 часов</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite необходимо перезапустить, чтобы завершить установку. Перезапустить сейчас?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Расширение упаковано неправильно.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Тема не упакована должным образом.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Не удалось загрузить должным образом расширение &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Невозможно загрузить расширение &quot;{0}&quot;, текущая версия Playnite не поддерживается.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Не удалось загрузить должным образом тему &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Невозможно загрузить тему &quot;{0}&quot;, текущая версия Playnite не поддерживается.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Не удалось загрузить должным образом расширение.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Не удалось загрузить должным образом тему.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Тема/Расширение использует неподдерживаемую версию API.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Установка прошла успешно.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Установить дополнение?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Основные</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Не удалось установить дополнение &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Не удалось установить расширение\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Вы хотите установить новое расширение?\r\n\r\n{0}\r\nАвтор: {1}\r\nВерсия {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Вы хотите обновить расширение &quot;{0}&quot;?\r\n\r\nВаша версия: {1}\r\nНовая версия: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Не удалось установить тему.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Вы хотите установить новую тему?\r\n\r\n{0}\r\nАвтор: {1}\r\nВерсия {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Вы хотите обновить тему &quot;{0}&quot;?\r\n\r\nВаша версия: {1}\r\nНовая версия: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Вы собираетесь покинуть Playnite и перейти на следующую веб-страницу, используя свой веб-браузер по умолчанию. Вы хотите продолжить?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Выбранные изображения могут оказаться слишком большими для оптимальной производительности. Использование таких изображений может привести к ухудшению отзывчивости интерфейса и повышенному потреблению памяти.\r\n\r\nМаксимальное рекомендуемое разрешение:\r\nИконки: {0} МП\r\nОбложки: {1} МП\r\nФоны: {2} МП</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Предупреждение о падении производительности</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Больше не показывать</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Файл с расширением {0} не поддерживается.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Неподдерживаемое расширение файла</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Выбранный файл изображения может быть слишком большим для оптимальной производительности.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Вы уверены, что хотите удалить выбранную тему? Операция будет поставлена в очередь до следующего запуска приложения.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Встроенные темы нельзя удалять.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Выбранная тема не поддерживает эту версию Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Вы уверены, что хотите удалить выбранное расширение? Операция будет поставлена в очередь до следующего запуска приложения.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Встроенные расширения нельзя удалять.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Это расширение не поддерживает данную версию Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Путь установки</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Папка с данными</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Сбор сведений для диагностики…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Отправка сведений для диагностики…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Импорт файла…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Что это?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Вы уверены, что хотите это сделать?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Общее время</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Время в среднем</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Рекордное время</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Общий размер установки</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Обзор</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Боковая панель</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Показать на боковой панели</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Сбросить настройки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Все настройки приложения будут сброшены к значениям по умолчанию, исключая:\r\n- Расположение базы данных\r\n- Импорт списка исключений\r\n- Настройки расширения, включая интеграцию библиотек\r\n\r\nДля завершения процесса требуется перезапуск приложения. Вы хотите сбросить настройки?\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Для разработчиков</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Внешние расширения</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Введите полный путь к папке.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Достижения</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Форум</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Новости</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Страница в магазине</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Первичная настройка не завершена. Playnite будет запущен в обычном режиме, чтобы закончить процедуру.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Недавно сыгранные</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Избранные</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Частые</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Все</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Применена сортировка.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Применены другие фильтры.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Результаты поиска для:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Элемент с таким именем уже существует.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Ограничить подбор текущим фильтром</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Подобрать другую</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Дополнения...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Установленные</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Настройки расширений</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Обзор</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Обновления</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Обновления ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Управление установленными расширениями и темами, включая их настройки, перенесено в новое меню «Дополнения».</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Здесь можно настроить все установленные интеграции с клиентами.\r\n\r\nЕсли вы хотите установить или удалить другие интеграции, используйте опцию «Дополнения…» в главном меню.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Темы для стандартного режима</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Темы для полноэкранного режима</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Поиск…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Дополнение не поддерживается в этой версии Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Не удалось загрузить установочные файлы дополнения.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Не удалось получить ссылку для установки дополнения.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Требуется перезапуск приложения для применения изменений.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Это дополнение запланировано к установке.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Установить</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Переустановить</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Удалить</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Уже установлено</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Обновления для дополнений не найдены.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Обновить дополнения</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Список изменений недоступен</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Запланировано к установке</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Ошибка загрузки</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Лицензия отклонена</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Загрузка {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Проверка наличия новых версий дополнений…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Поиск обновлений программы…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Доступны новые версии дополнений.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Выберите элементы для обновления</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Экземпляр разработки расширения</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">Лицензионное соглашение {0}</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Принять</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Отклонить</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Включить действие «Играть» из плагина для клиента</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Выберите действие</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Режим поиска</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Путь отслеживания</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Задержка отслеживания</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Частота отслеживания</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Ссылка</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Файл</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Эмулятор</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Скрипт</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">По умолчанию</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Процесс</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Папка</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Исходный процесс</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Название процесса</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Сообщения о трассировке логов</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Последующие изменения перезаписывают данные для всех выбранных в данный момент игр!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Ничего</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">По размеру</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Только предметы</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Только начало и конец</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Чувствительность скроллинга</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Плавный скроллинг</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Скорость анимации</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Убрать объект?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Вы действительно хотите убрать этот объект?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Отображать кнопки на верхней панели:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Настройки отображения</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Настройки группы</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Настройка сортировки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Пресеты фильтров</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Положение элементов плагина</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Ширина разделителя секции</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Отображать кнопку главного меню на боковой панели</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Панель проводника</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Подбор случайной игры</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Выбрать случайную игру из списка</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Выбрать случайную игру из списка</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Сохранить настройки группировки и сортировки</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Показывать как быстрый фильтр в полноэкранном режиме</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">За последние 7 дней</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">За последний 31 день</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">За последние 365 дней</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Более 365 дней назад</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Настроить</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Сохр. шаблон</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Свернуть после запуска игры</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Сворачивать Playnite после запуска игры.\r\n\r\nОтключение этой опции может привести к проблемам, так как на игры не будет переводиться фокус системы при их запуске!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Размер текста</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Размер подсказок</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Поддержка игровых контроллеров</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Если этот параметр отключен, Playnite не будет принимать данные любых игровых контроллеров.\r\n        \r\nОтключите, если используете сторонние инструменты, которые преобразуют входные данные игровых контроллеров в нажатия клавиатуры/мыши, иначе столкнетесь с проблемой двойного срабатывания в Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Отображать иконки в основном меню:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Инвертировать привязку кнопок X/A на главном экране</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Меняет местами привязки кнопок для запуска игры и отображения страницы сведений об игре на главном экране.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Поменять местами кнопки подтверждения/отмены привязки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Инвертирует привязки кнопок A/B для подтверждения и отмены.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Только основной геймпад</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Когда опция включена, принимаются входные сигналы только от основного геймпада.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Кнопка Guide фокусирует Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Громкость в полноэк. режиме</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Громкость фоновой музыки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Заглушать звук при сворачивании</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Не удалось инициализировать аудио интерфейс.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API вывода</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API, используемый для вывода звука. Поменяйте на другое, если у вас возникли проблемы со звуком.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Основные</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Внешний вид</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Аудио</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Расположение</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Меню</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Ввод</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} запускается…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} запущена…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Caps</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Пробел</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Режим отрисовки изображений</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Альтернатива</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Баланс</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Качество</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Качество:\r\nЛучшее качество изображения, медленная скорость, высокая загрузка памяти.\r\n    \r\nБаланс:\r\nХорошее качество, быстрая скорость, низкая загрузка памяти.\r\n    \r\nАльтернатива:\r\nЛучшее качество, средняя скорость, низкая загрузка памяти.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Выбрать файл…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Выбрать папку…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Скрипт запуска</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Обратите внимание, что как расширения, так и темы могут сильно повлиять на производительность, стабильность и безопасность Playnite.\r\n    \r\nЕсли у вас возникли проблемы после установки темы или расширения, попробуйте сначала отключить/удалить их, чтобы убедиться, не являются ли они корнем проблемы.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Выбрать при запуске</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Выбрать при запуске</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Предустан. профили</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Предустан. профиль</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Свои профили</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Пользовательский профиль</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Управляется предустан. скриптом</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Уточнение эмулятора</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Уточнение платформы</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Уточнение региона</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Выполнить перед запуском эмулятора</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Выполнить после запуска эмулятора</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Выполнить после закрытия эмулятора</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Исполняемый файл эмулятора не найден.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Характеристика эмулятора не найдена.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Сценарий запуска эмулятора не найден.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Разделить на отдельные игры</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Объединить в одну игру</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Установить платформу</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Установить регион</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Сканировать папку</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Параметры сканирования</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Шаблон для исключения из сверки контрольной суммы</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Файлы, соответствующие указанным шаблонам, перестанут сверяться по контрольной сумме и будут сопоставляться по имени файла. См. страницу справки эмулятора для получения дополнительной информации.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Сканировать эмулятором</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Имя должно быть установлено при сохранении новой конфигурации.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Эмулятор или профиль эмулятора не задан.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Папка для сканирования не указана или не существует.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Конфигурация сканирования настроена неправильно.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Включить автоматическое сканирование при массовом сканировании</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Не удалось просканировать папку на наличие эмуляторов.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Не удалось просканировать папку(и) на наличие игр для эмулятора.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Скрыть импортированные</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Профили для импорта:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Параметры автосканирования</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Сохр. как параметры автосканирования</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Сохраняет конфигурацию для последующего использования во время обновления библиотеки. Сохраненными конфигурациями можно управлять через меню «Настройка эмуляторов».</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Импорт с использованием относительных путей</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">По возможности импортировать файлы игр, используя пути относительно папки установки Playnite или папки установки эмулятора.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Сканировать подпапки</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Сканировать внутри архивов</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Объединить связанные файлы</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Объедининить связанные игровые файлы, такие как, например, отдельные игровые диски, под одной записью.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Добавить ещё</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Добавить сохр. условия</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Начать сканирование</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Добавить конфигурацию сканирования с помощью эмулятора для сканирования определенных папок. Перед импортированием игр убедитесь, что эмуляторы правильно настроены (через меню «Библиотека» -&gt; «Настройка эмуляторов...»).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Статус по умолчанию, присваиваемый при добавлении новых игр</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Статус, присваиваемый играм, которые запущены впервые</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Не удалось инициализировать среду выполнения сценария PowerShell. Если вы являетесь пользователем Windows 7, попробуйте (пере)установить PowerShell 5.1, чтобы устранить проблему.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Шаблон фильтра с указанным именем уже существует. Обновить шаблон с новыми настройками?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Эти слова будут удалены из начала автоматически заполняемого значения &quot;Имя сортировки&quot;:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Используется для игнорирования слов в начале строки в целях сортировки. По умолчанию используются слова &quot;The&quot;, &quot;An&quot; и &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Заполнять &quot;Имя Сортировки&quot; в играх без него</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Сортировка</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Заполнение значений &quot;Имя Сортировки&quot;...</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Похоже, что в вашей системе запущена служба Nahimic. Она печально известна тем, что вызывает проблемы с отрисовкой в Playnite (и прочих приложениях).\r\n\r\nЕсли вы столкнулись с графическими глюками или другими проблемами с отрисовкой в Playnite, рекомендуем отключить или полностью удалить с устройства службу Nahimic.\r\n\r\nБольше информации на https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite запущен с повышенными привилегиями (от имени администратора). Делать это не рекомендуется, поскольку повышенные привилегии даются всем установленным расширениям и всем играм/приложениям, запускаемым из Playnite!\r\n\r\nПодробнее на https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Предупреждать о запуске Playnite с повышенными правами доступа</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Получать реальный размер на диске при вычислении размера игр</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Если этот параметр включен, сканирование будет выполняться медленнее и при этом будет отображаться реальный размер файлов на диске.\r\nЕсли отключен, сканирование будет выполняться быстрее и при этом будет использоваться собственный размер файлов.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Дополнение(я) из списка ниже помечены как потенциально проблемные либо из-за большой нагрузки на железо и нестабильной работы, либо из-за проблем с безопасностью. Мы настоятельно рекомендуем удалить их:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Исключать онлайн-файлы из сканирования</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Файлы из облачного хранилища не будут сканироваться и импортироваться, если недоступны локально.\r\nПоддерживается только для Google Диска, Dropbox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Упрощенное сканирование без учета содержимого файлов</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Файлы будут импортированы, но с использованием менее точного метода, который не требует загрузки содержимого файла и его локального представления.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Применить ко всем</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Переопределить состояние установки</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Если опция включена, Playnite будет игнорировать состояние установки (включая каталог установки), заданное плагином интеграции, который импортирует эту игру.\r\n        \r\nЭта опция может не полностью работать с плагинами, использующими специфический метод импорта игр, если они также не учитывают эту опцию переопределения.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Только вручную</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Раз в день</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Раз в неделю</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">При каждом запуске</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Проверить наличие обновлений</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Проверить наличие обновлений дополнений</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Обновить библиотеки</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Сканирование папок эмуляции</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Включая скрытые игры</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Редактировать поля</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Выделить / отменить все</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Открыть</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Активировать</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Назначить</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Начните вводить для поиска игры… [F1] для получения справки</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">При вводе символа # появляется список доступных команд.\r\nПри вводе символа / появляется список доступных поисковых поставщиков/плагинов.\r\nПри вводе ключевого слова поиска и завершении его пробелом происходит немедленный переход к этому поиску.\r\n\r\nTAB: переключение действия\r\nENTER: активировать выбранное действие\r\nSHIFT-ENTER: открыть меню элементов</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Включая удалённые игры</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Включая скрытые игры</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Удаленные игры включены</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Удаленные игры исключены</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Скрытые игры включены</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Скрытые игры исключены</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Играть или установить</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Сведения</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Меню игры</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Изменить игру</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Открыть поиск</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Поисковая строка</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Кнопка поиска</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Основное действие игры</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Дополнительное действие игры</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F открывает глобальный поиск вместо окна фокусировки поиска</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Сохранить настройки фильтра игр между поисковыми сессиями</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Провайдеры поиска</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Ключевое слово по умолчанию</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Пользовательское ключевое слово</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Общесистемный ярлык</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Поиск Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Настройки расширения</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Исключения</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Исключенные файлы относительно папки сканирования</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Исключенные папки относительно папки сканирования</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Добавить файл в список исключений</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Добавить папку в список исключений</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Исключения могут быть добавлены только в сохраненные конфигурации сканера.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Исключения были добавлены в сканер &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Переопределить платформу</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">При включении сканер привяжет эту платформу ко всем играм, заменив все автоматически определенные платформы.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Включить команды в поиск по умолчанию</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">При отключении команды не будут включены в поиск по умолчанию, пока не будет использован префикс #.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Использовать нечеткое сопоставление в фильтре по имени</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Если включено, фильтр по имени будет отбирать игры таким же образом, как и глобальный поиск.\r\nМожно включить строгое сопоставление для конкретного поиска, введя префикс &quot;!&quot; перед вашим запросом.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Отобр. поля в результатах поиска игры:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Скрытый статус</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Резервное копирование данных было отменено.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Ошибка резервного копирования.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Ошибка резервного копирования</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Выполняется резервное копирование данных...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Восстановление данных из резервной копии...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Не удалось восстановить данные из резервной копии.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Настройки</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Библиотека игр</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Материалы библиотеки игр</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Установленные расширения</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Данные расширений</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Установленные темы</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Выберите данные, которые будут восстановлены из указанного файла резервной копии.\r\n    \r\nPlaynite будет автоматически перезапущен для начала процесса восстановления резервной копии.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Выберите элементы, которые будут включены в резервную копию. Настройки приложения и данные игровой библиотеки включены по умолчанию.\r\n    \r\nPlaynite будет автоматически перезапущен для начала процесса резервного копирования.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Автоматическое резервное копирование данных</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Частота автоматического резервного копирования</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Папка резервного копирования</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Чередование резервных копий</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Включить дополнительные данные:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Если автоматическое резервное копирование включено, потребуется задать папку резервного копирования.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Уведомлять только о вышедших патчах</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Если включено, то в уведомлении придут только обновления для текущего установленного релиза.\r\nНовые крупные релизы будут проигнорированы.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Использовать условные даты для событий прошедшей недели</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Использовать условные даты в формате &quot;Сегодня&quot;, &quot;Вчера&quot; и т.д., если срок давности события меньше недели.\r\n    \r\nДля всех остальных дат будет использоваться указанный формат даты.\r\n</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Поиск по фото в интернете</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Иконка в строке поиска фото</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Строка поиска обложки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Строка поиска фонового изображения</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Получение информации о дополнении…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Нет доступного источника данных</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Настройки действия Играть</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Использовать настройки сканирования</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Выбрать профиль при запуске</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Выбрать эмулятор при запуске</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Автоматически</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Всегда вкл.</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Всегда выкл.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Поддержка спец. возможностей (чтения с экрана)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Меню приложения</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Меню игры</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Папка программы</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Папка пользовательских данных</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Обнаружен поврежденный файл библиотеки, Playnite вынужденно завершит работу.\r\n    \r\nОткройте новый тикет с проблемой (&quot;issue&quot;) на странице GitHub Playnite и запросите исправление поврежденных файлов.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Сохранить сделанные вами изменения?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Портативная установка</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Контроллеры не обнаружены</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/si_LK.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">සිංහල</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">ප්ලේනයිට් භාෂාව</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">පිටවන්න</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">පෙරහන ක්‍රියාත්මකයි</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">පෙරහන අබල කර ඇත</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">අතිරේක පෙරහන්</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">පෙරහන්</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">පෙරහන</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">වලංගු නොවන දත්තයකි</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">වෙනස්කම් සුරකින්නද?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">මුල් පිටුව www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">ප්ලේනයිට් පිළිබඳව</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">ප්‍රවර්ග සකසන්න</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">ප්‍රවර්ගය එකතු කරන්න</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">ප්‍රවර්ග නැත</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">ප්ලේනයිට් නැවතඅරඹන්න</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">ප්ලේනයිට් න් පිටවන්න</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">ක්‍රීඩා(ව) ඉවත් කරන්නද?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">අස්ථාපනය කළ නොහැකියි - ක්‍රීඩාව ධාවනය වෙමින්.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\"></sys:String>\r\n    <sys:String x:Key=\"LOCSteamFriendsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\"></sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\"></sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">ඉවත් කරන්න</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">නැවත නම් කරන්න</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">පිටපත්</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">එකතු</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">ආපසු</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">ආපසු</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">ආයාත කරන්න</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">නම</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">සටහන්</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">වියමන අඩවිය</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">මාර්ගය</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">හරි</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">සුරකින්න</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">වසන්න</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">අවලංගු කරන්න</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">ඔව්</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">නැහැ</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">සාදරයෙන් පිළිගනිමු</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">ස්ථානීය පරිශීලක</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">මාධ්‍යය</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">සබැඳි</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">ක්‍රියාමාර්ග</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">බාගත වෙමින්…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">මාධ්‍ය බාගත වෙමින්…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">පූරණය වෙමින්…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatronsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCToday\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\"></sys:String>\r\n    <sys:String x:Key=\"LOCMonday\"></sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCThursday\"></sys:String>\r\n    <sys:String x:Key=\"LOCFriday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">ඉරිදා</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">පසුගිය සතිය</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">පසුගිය මාසය</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">පසුගිය අවුරුද්ද</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\"></sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">සියලුම ක්‍රීඩා</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ක්‍රීඩාවේ හැඳු.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">දත්තසමුදායේ හැඳු.</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">තීරුව</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">තීරු</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">පේළිය</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">පේළි</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">නිල ගබඩාව</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\"></sys:String>\r\n    <!--Progess string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\"></sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">වින්‍යාසය</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">සැකසුම්…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">මෙවලම්</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">මෘදුකාංග මෙවලම්…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\"></sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">සැකසුම්</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdateLibStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdateEmulatedLibStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForceDownloadPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForceDownloadPlayniteTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCViewType\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\"></sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\"></sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCXInputInitErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseExeIcon\"></sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\"></sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\"></sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCChange\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCNever\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\"></sys:String>\r\n    <sys:String x:Key=\"LOCAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\"></sys:String>\r\n    <sys:String x:Key=\"LOCWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirst\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandom\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\"></sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpand\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOther\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\"></sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\"></sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\"></sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\"></sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewScrollAmountModifier\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/sk_SK.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Slovenčina</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Jazyk Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Ukončiť</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filter je aktívny</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filter je vypnutý</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Dodatočné filtre</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtre</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Neplatné údaje</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Uložiť zmeny?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Stránka aplikácie na www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Zdrojový kód na GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Vytvoriť diagnostický balíček</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Odoslať diagnostický balíček</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">O Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Vytvoril Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Priradiť kategóriu</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Nastaviť kategórie</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Pridať kategóriu</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Zaškrtnuté - priraďte kategóriu\r\nNezačiarknuté - Odobrať kategóriu\r\nNeurčité - Žiadne zmeny (pri úprave viacerých hier)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Bez kategórie</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Bez platformy</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Ojoj! Niečo sa pokazilo…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Stala sa závažná chyba.\r\n\r\nAk by ste nám chceli pomôcť chybu opraviť, opíšte prosím v skratke vaše akcie, ktoré viedli k pádu programu a následne odošlite diagnostický balíček. Ak ste pripojený na internet, tento balíček sa nahrá na servery Playnite a bude podrobený analýze.\r\n\r\nPrípadne môžete tiež použiť tlačítko 'Nahlásiť pád' a tým sa vytvorí nový záznam o chybe na GitHub kde budete môcť popísať problém sami.\r\n\r\nĎakujeme za pomoc.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Rozšírenie &quot;{0}&quot; spôsobilo neodstrániteľnú chybu.\r\n\r\nOdporúčame uložiť súbor so záznamami (log) a nahlásiť tento problém vývojárovi rozšírenia. Ak problém pretrváva, tak toto rozšírenie vypnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Rozšírenie &quot;{0}&quot; spôsobilo neodstrániteľnú chybu.\r\n\r\nOdporúčame to nahlásiť vývojárovi rozšírenia. Ak sa táto chyba opakuje, rozšírenie vypnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Neznáme rozšírenie alebo téma spôsobila neodstrániteľnú chybu.\r\n\r\nOdporúčame zakázať doplnky tretej strany, izolovanie problematického doplnku a nahlásenie chyby vývojárovi doplnku.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Vyskytla sa neopraviteľná chyba.\r\n\r\nAk nám chcete pomôcť tento problém opraviť, odošlite prosím diagnostický balíček. Ďakujeme.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Vypnúť rozšírenie</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Uložiť záznamy (log)</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Odoslať diagnostické informácie</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Nahlásiť chybu</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Reštartovať Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Reštartovať v bezpečnom režime</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Vypínajú sa všetky rozšírenia tretích strán a nastavuje sa predvolený motív vzhľadu.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Ukončiť Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Akcie uskutočnené pred pádom programu (v angličtine):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Správca knižnice</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Odstrániť Hru(y)?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Nedá sa odstrnáť - je spustená hra alebo inštalátor.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Nie je možné odinštalovať - hra je spustená.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Ste si istí, že chcete odstrániť {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Naozaj chcete odstrániť {0} hier?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Naozaj chcete odstrániť {0} hier?\r\n\r\nVýber možnosti „pridať do zoznamu vylúčených“ zabráni ďalšiemu importu hier pri nasledujúcej aktualizácii knižnice.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Naozaj chcete odstrániť {0} hier?\r\n\r\nVýber možnosti „pridať do zoznamu vylúčených“ zabráni ďalšiemu importu hier pri nasledujúcej aktualizácii knižnice.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Naozaj chcete odstrániť {0} záznamov, ktoré sa momentálne nepoužívajú?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Nenašli sa žiadne nepoužívané polia.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Áno (pridať do zoznamu vylúčených)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">V tejto časti sa nachádzajú neuložené zmeny</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Aktualizuje sa formát knižnice hier…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Aktualizácie databázy zlyhala.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Nie je možné aktualizovať knižnicu hier. Je potrebných {0} MB voľného priestoru na disku.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Chyba hry</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Hra sa nedá spustiť. '{0}' sa nenachádza v databáze.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Hra sa neda spustiť: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Akcia sa nedá spustiť: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Nie je možné otvoriť umiestnenie hry: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Nie je možné zistiť veľkosť inštalačného súboru hry: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Zisťovanie veľkosti hry sa nepodarilo</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">{0} Chýb bolo zistených počas zisťovania veľkosti súboru</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Nepodarilo sa vytvoriť odkaz: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Nepodarilo sa otvoriť manuál: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Hra sa nedá nainštalovať: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Hra sa nedá odinštalovať: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Žiadne nájdené platné akcie štartu hry. Keď používate akcie emulátora, uistite sa, že definície medzi konfiguráciou hry a konfiguráciou platformy sú totožné.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Implementácia inštalácie nie je dostupná.\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Doplnok knižnice zodpovedajúci k tejto hre je vypnutý alebo nenainštalovaný.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Prevzatie oficiálnych metadát nie je k dispozícii.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Nie je vybraná žiadna hra.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Nepodarilo sa spustiť herný skript.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Nepodarilo sa spustiť skript aplikácie.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Nepodarilo sa spustiť globálny skript.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Nepodarilo sa spustiť skript emulátora.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Spustenie skriptu zlyhalo.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">Nie je nainštalovaný PowerShell 3.0 alebo novší.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Nepodarilo sa určiť, ako začať hru.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Povolené</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Zakázané</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Odstrániť</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Odstrániť nepoužité</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Premenovať</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopírovať</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Pridať</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Predvolená ikona</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Predvolený obrázok obalu</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Predvolený obrázok pozadia</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Dokončiť</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Ďalej</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Späť</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">HOTOVO</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">SPÄŤ</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">VYČISTIŤ</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Vyčistiť</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Zamietnuť</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Odmietnuť všetko</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importovať</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Názov</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Autor</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Séria</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Verzia</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Naposledný hrané</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Najhranejšie</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Počet zahratí</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Veľkosť inštalácie</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Priečinok</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Poznámky</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Pridané</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Dátum pridania</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Zmenené</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Dátum zmeny</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Webové stránky</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Cesta</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Uložiť</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Zavrieť</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Zrušiť</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Potvrdiť</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Resetovať</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Áno</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Nie</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Vitajte</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Miestny použivateľ</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Všeobecné</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Médiá</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Odkazy</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Inštalácia</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Akcie</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Preberá sa…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Preberajú sa médiá…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Načítava sa…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Typ</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profily</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Odstrániť</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Prevziať</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Hľadať</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Rozlíšenie:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">akýkoľvek</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Priblíženie</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Zobrazenie zoznamu</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Obaly</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Zobrazenie mriežky</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Zobrazenie podrobností</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Vlastné</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Špeciálne poďakovanie</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licencia</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Prispievatelia</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Ukončuje sa Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Dnes</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Včera</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Pondelok</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Utorok</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Streda</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Štvrtok</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Piatok</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Sobota</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Nedeľa</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Minulý týždeň</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Minulý mesiac</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Minulý rok</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Pred viac než rokom</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 až 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB až 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB až 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB až 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB až 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB až 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB až 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB alebo viac</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Import bol úspešne dokončený.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Všetky hry</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ID hry</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">ID databázy</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Prednastavenia</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Stĺpec</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Stĺpce</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Riadok</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Riadky</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Nepodarilo sa získať ikonu z akcie Hrať</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Prevziať len chýbajúce metadáta</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Povolenie tejto možnosti spôsobí preskočenie preberania metadát pre polia, ktoré už obsahujú informácie.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Výber hier</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Vyberte, ktoré hry by sa mali aktualizovať pomocou nových metadát:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Všetky hry v databáze</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Všetky aktuálne zobrazené hry</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Iba vybrané hry</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Žiadne polia metadát nie sú vybrané</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Žiadne polia metadát nie sú vybrané na stiahnutie. Prosíme vyberte aspoň jedno a povoľte pre ne aspoň jedného poskytovateľa metadát.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Oficiálny bbchod</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Vyberte, ktoré polia by mali byť automaticky doplnené apkou Playnite a ktoré zdroje by sa mali použiť pre získanie údajov.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Zváže prosím ručnú aktualizáciu databázy igdb.com kliknutím na logo vyššie, čím pomôžete skvalitniť dáta, ktoré používa Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Preberajú sa metadáta…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importujú sa nainštalované hry…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importujú sa hry z platformy {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importujú sa emulované hry z {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Preberajú sa aktualizácie knižníc…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Skenovanie veľkosti hry v knižnici…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Skenovanie veľkosti importovaných hier…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Aktualizácia knižnice dokončená</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Uvoľnujú sa zdroje…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Konfigurácia</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Nastavenia…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platformy a emulátory</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Konfigurovať emulátory…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Správca knižnice…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Nástroje</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Prevziať metadáta…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Softvérové nástroje…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Konfigurovať integrácie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Otvoriť externého klienta</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Klienti tretích strán</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Aktualizovať hernú knižnicu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Zrušiť Aktualizáciu Knižnice</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Aktualizovať Emulované Priečinky</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Pridať hru</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Ručne…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Automaticky prehľadať…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emulovaná hra…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Apka Microsoft Store…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">O Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Odoslať spätnú väzbu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Prepnúť do režimu celej obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Odkazy</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Nápoveda</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Podporiť na Patreone</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Podporiť na Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Používateľský manuál</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Dokumentácia SDK</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Reštartovať systém</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Vypnúť systém</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Uspať systém</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Hibernovať systém</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Uzamknúť Systém</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Odhlásiť Používateľa</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Vybrať náhodnú hru</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Polia, ktoré budú viditeľné v zobrazení detailov:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Medzery medzi položkami</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Vykresľovať pozadie položiek v mriežke</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Šírka ohraničenia položky v mriežke</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Chýbajúci zdroj ikon hier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Chýbajúci zdroj obalov hier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Chýbajúci zdroj pozadí hier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Vertikálne odsadenie podrobností o hre</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Pozícia detailov v zobrazení mriežky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Pozícia zoznamu hier v zobrazení detailov</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Vykresľovať oddelovač medzi panelmi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Výška obrázku obalu hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Výška ikony v zozname hier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Písmo aplikácie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Monospaced font</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Pozícia panelu s filtrami</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Pozícia panelu prieskumníka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Vykresľovanie obrázkov obalov</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Cieľový pomer strán</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Nasledujúce možnosti tiež ovplyvnia vykreslenie dlaždíc v režime celej obrazovky.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Spôsob roztiahnutia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD krabička</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Štvorec</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam baner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Vertikálne obaly Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Toto nastavenie sa prejaví až po reštarte Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Nastavenia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Všeobecné</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Horný panel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Vzhľad</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Detaily hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Rozloženie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Pokročilé</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Celá obrazovka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Vstup</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Výkon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadáta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Aktualizovanie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Vyhľadať</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Záloha</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Zálohovanie Dát Knižnice</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Obnoviť Zálohované Dáta</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importovať zmeny v knižnici automaticky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Chybné umiestnenie súboru databázy, musíte zadať správne umiestnenie súboru.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Názov účtu nesmie byť prázdny.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Prevziať metadáta po importe hier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Spustiť Playnite minimalizovaný</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Spustiť Playnite po štarte systému</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Štart zatvorený do trayeu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Nepodarilo sa zaregistrovať Playnite pre štart pri spustení počítača.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Spustiť v režime celej obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asynchrónne načítanie obrázkov</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Vylepšuje plynulosť skrolovania zoznamu hier na úkor pomalšieho načítavania obrázkov.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Ak chýba obal hry, tak zobraziť názov hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">V zobrazení mriežky zobrazovať názvy hier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Stmaviť nenainštalované hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Zobraziť ikonku hry v režime zobrazenia podrobností</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">V popisoch skupín zobraziť počet položiek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Zobraziť len priradené polia vo filtri a paneloch prieskumníka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Vypnúť hardvérovú akceleráciu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Použite v prípade, že zaznamenávate problémy ako je zasekávanie, prípadne iné grafické artefakty</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Zobraziť skryté hry v zoznamoch rýchleho spustenia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Ovplyvňuje zoznam odkazov a zoznamy ponúk v systémovej lište.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Počet položiek pre rýchle spustenie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Použiť pozadie hry ako pozadie okna</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Rozostriť pozadie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Vysoká kvalita</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Stmaviť pozadie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Zobraziť v zobrazení mriežky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Motív vzhľadu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Profil motívu vzhľadu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Motív vzhľadu v režime celej obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Profil motívu vzhľadu v režime celej obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Umiestnenie databázy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Stav prihlásenia:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Nastavenia Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Vymazať vyrovnávaciu pamäť</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Môže vyriešiť problémy pri pripájaní účtov.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Zobraziť ikonu na systémovej lište</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimalizovať Playnite do systémovej lišty</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Po zatvorení okna aplikácie minimalizovať Playnite do systémovej lišty</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Pri spustení hry:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Po ukončení hry:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Formátovanie času stráveného v hre pre indikáciu nahraných dní</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Formát dátumu:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Táto akcia vás odhlási zo všetkých pripojených služieb (účtov). Vyžaduje sa reštart aplikácie. Chcete pokračovať?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Vymazať vyrovnávaciu pamäť?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Pre zmenu vzhľadu je potrebné reštartovať Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Získať viac motívov vzhľadu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Vytvoriť nový motív vzhľadu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Získať viac rozšírení</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Vytvoriť nové rozšírenie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Pomôžte nám s prekladom Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Ak chcete použiť nové nastavenia, je potrebné reštartovať Playnite. Reštartovať teraz?\r\n\r\nReštartovaním sa zrušia všetky aktívne úlohy (preberania), ktoré práve prebiehajú.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Reštartovať Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite nemôže automaticky presúvať vaše súbory z knižnice. Pred zmenou umiestnenia musíte súbory ručne presunúť / skopírovať. Ak v cieľovom umiestnení nie je žiadna knižnica, vytvorí sa nová.\r\n\r\nNové umiestnenie databázy sa použije až po reštartovaní Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Ak je nastavená akcia &quot;Zavrieť&quot;, nebude sa zaznamenávať čas hrania.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Počet riadkov</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Počet stĺpcov</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Počet riadkov v zobrazení podrobností</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Zobraziť obrázok pozadia na hlavnej obrazovke</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Nevzťahuje sa na hry, ktoré už existujú - pre tie je potrebné opätovne prebrať metadáta.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importovať čas strávený v hre do knižnice:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Vždy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Iba pre novo naimportované hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Nikdy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Povoliť podporu ovládača v režime plochy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Tlačidlo Sprievodca otvorí režim celej obrazovky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Nastavenia automatického preberania metadát pre novo importované hry.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Zobrazenie cieľu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Vždy použiť hlavný displej</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Zobraziť názvy hier</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Zobraziť stav batérie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Zobraziť stav batérie v percentách</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Zobraziť hodiny</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Skryť Kurzor Myši</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Len nainštalované v Rýchlych filtroch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Popisy tlačidiel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Rozloženie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Horizontálne skrolovanie</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Vyberte jednu z podkategórií</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Nie sú dostupné žiadne nastavenia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Nepodarilo sa načítať nastavenia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Tieto skripty sú spustené pre každú hru v knižnici. Jednotlivé skripty môžu byť priradené ku každej hre zvlášť v úpravách podrobností o hre.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animovať prechody medzi obrázkami na pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Veľkosti písma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automaticky</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Vyhladené</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Odtiene šedej</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideálne</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Obrazovka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Režim formátovania textu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Režim vykresľovania textu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Metódy pre renderovanie a formátovanie textu sa momentálne nepoužívaju pre popisy hier.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Predbežne načítať obrázky pozadí</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Ak je povolené, Playnite prevezme obrázky pozadia počas preberania metadát. Obrázky budú dostupné aj v režime offline, avšak použije sa viac miesta na disku.\r\n        \r\nAk nie je povolené, obrázky pozadia sa budú preberať len vtedy ak sú potrebné. Ušetrí sa tým miesto na disku, avšak ich zobrazenie môže byť oneskorené a niektoré obrázky nemusia byť k dispozícii v režime offline.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Po ukončení hry automaticky strany zatvárať klientov tretích strán</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Oneskorenie vypnutia klienta (v sekundách)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Nezatvárať ak sa hralo menej než (v sekundách)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Automaticky zatvoriť nasledovných klientov:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Automaticky zavrieť klientov</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importovať zoznam vylúčených</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Pri priradení príliš veľkých herných médií zobrazovať upozornenie</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Príkaz pre otvorenie adresára</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Preferovaná organizácia pre vekové obmedzenia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Aktualizovať veľkosť inštalácie v aktualizácií knižnice</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Žiadne</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Vyplniť</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Rovnomerne</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Rovnomerne vyplniť</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Vľavo</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Vpravo</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Hore</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Dole</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Chyba importu</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Vyžaduje sa overenie</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Overenie zlyhalo</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\"></sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Import metadát</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Prevziať metadáta</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Nastaviť vybratú konfiguráciu, ktorá sa použije pri ďalšom preberaní metadát.\r\nJe to tiež možné zmeniť v nastaveniach.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Sprievodca importom emulátorov</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Tento sprievodca vás prevedie procesom prevzatia a importovania konzolových emulátorov a importovaním emulovaných hier.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Nezabudnite, že ďalšie emulátory a/alebo hry, môžete kedykoľvek pridať prostredníctvom hlavnej ponuky (v ponuke &quot;Knižnica&quot; pre nastavenie emulátorov a &quot;Pridať hry&quot; pre emulované hry).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Kliknutím na 'Automaticky zistiť z priečinka…' môžete importovať akýkoľvek emulátor nainštalovaný vo vašom PC. Playnite prehľadá zvolený priečinok a skúsi importovať akýkoľvek známy emulátor. Toto tlačidlo na import emulátorov môžete napoužiť viacnásobne. Nové emulátory sa pridaju na spodok aktuálneho zoznamu.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Importovať hry môžete kliknutím na tlačidlo 'Prehľadať priečinok pomocou emulátora'. Vybraním príslušného emulátora bude Playnite vedieť, ktoré typy súborov by mali byť skenované a následne importované. Toto tlačidlo môžete použiť viacnásobne pre importovanie hier z rôznych priečinkov. Hry sa pridajú na spodok aktuálneho zoznamu.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Nie sú nastavené žiadne emulátory pre import. Bez konfigurácie emulátorov nebudete môcť importovať žiadne emulované hry. Naozaj chcete pokračovať a ukončiť import?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">V Playnite nie sú nakonfigurované žiadne emulátory. Hry nemôžete importovať bez toho, aby ste najskôr nakonfigurovali emulátor a vybrali príslušné typy súborov. Chcete pridať nejaké emulátory teraz?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Prehľadať priečinok pomocou emulátora</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Vybrať súbory</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Automaticky detegovať z priečinka…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Konfigurovať emulátory…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Prehľadáva sa…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Úvodné nastavenie</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Tento sprievodca vás prevedie procesom automatického importu a konfigurácie externých knižníc hier. Playnite môže automaticky importovať hry z viacerých herných služieb ako napr. Steam alebo GOG, a tiež udržovať knižnicu aktuálnu automatickou aktualizáciou pri každom spustení aplikácie.\r\n\r\nNezabudnite, že ľubovoľnú vlastnú hru pre ľubovoľnú platformu môžete pridať aj neskôr ručne kliknutím na tlačidlo 'Playnite' v hlavnej ponuke.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Integrácia knižnice</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Automaticky importovať hry zo služieb uvedených nižšie. Všetky neskoršie zmeny hry (stav inštalácie) sa aktualizujú automaticky pri spustení Playnite alebo pri manuálnom spustení. Vybraté nastavenia ovplyvnia počiatočný a všetky nasledujúce importy.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Konfigurácia dokončená</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Počiatočné nastavenie bolo dokončené. Nezabudnite, že všetky nastavenia môžete neskôr zmeniť v ponuke „Nastavenia“.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Nastaviť platformy a emulátory</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Konfigurovať emulátory</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platformy</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platforma</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulátory</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulátor</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Pridať platformu</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Vybrať ikonu</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Vybrať obal</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Vybrať obrázok</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Vybrať položku</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Vybrať pozadie</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Vybrať súbor</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Vybrať adresu URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Pridať emulátor</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Podporované platformy</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Chcete uložiť zmeny v platformách?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Chcete uložiť zmeny v emulátoroch?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Spustiteľný súbor</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Parametre</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Pracovný priečinok</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Podporované typy súborov</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importovať emulátory…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Prevziať emulátory…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Načítať nastavenie parametrov zo známych profilov emulátorov</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Naozaj chcete odstrániť emulátor {0}?        \r\nMomentálne ho používa {1} hier.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Naozaj chcete odstrániť platformu {0}?        \r\nMonetálne ju používa {1} hier a {2} emulátorov.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Nápoveda k nastaveniam</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Zoradiť podľa</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Smer zoradenia</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Zoskupiť podľa</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Vzostupne</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Zostupne</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Nezoskupovať</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Zoskupiť podľa knižnice</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Zoskupiť podľa kategórie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Zoskupiť podľa platformy</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Typ zobrazenia</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Zobrazenie</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Panel prieskumníka</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Panel filtrov</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ikona</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Ikona knižnice</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Obrázok obalu</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Obrázok pozadia</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Názov, podľa ktorého radiť</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Knižnica</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Manuál</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Meno</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Názov účtu</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platforma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategórie</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Žáner</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Dátum vydania</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Rok vydania</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Vývojár</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Štítok</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Vydavateľ</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Stav inštalácie</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Nainštalované</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Nainštalované</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Nenainštalované</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Skryté</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Obľúbené</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Povoliť podporu HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Ak povolené, HDR bude povolené na primárnom displeji pred spustením hry.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Naposledy hrané</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategória</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Popis</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Inštalačný priečinok</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Obrázok na obale</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Odkazy</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Cesta k obrazu, ROM alebo ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Žáner</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Žánre</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Spoločnosť</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Spoločnosti</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Vývojár</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Vývojári</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Vydavateľ</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Vydavatelia</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategória</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategórie</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Štítok</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Štítky</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Funkcia</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Funkcie</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Vekové obmedzenie</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Vekové obmedzenia</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Región</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regióny</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Zdroj</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Zdroje</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Nedávna aktivita</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Chyba databázy</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Nepodarilo sa otvoriť databázu knižnice.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Databáza nie je otvorená.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Nemožno získať prístup k databáze knižnice. Súbor &quot;{0}&quot; je používaný iným procesom alebo nie je k dispozícii.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Nepodarilo sa vytvoriť diagnostický balíček.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Nepodarilo sa automaticky nahrať diagnostický balíček.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Diganostické informácie sa úspešne odoslali.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Diagnostický balíček sa úspešne vytvoril a nahral.\r\nPri nahlasovaní problému pripojte nasledujúce ID:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Nepodarilo sa importovať hry z {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Nepodarilo sa importovať emulované hry z {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Nie je možné hľadať hry podľa vybratého profilu emulátora, pretože neobsahuje žiadne prípony súborov alebo platformy.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite sa nepodarilo spustiť. Zavrite prosím všetky inštancie aplikácie Playnite a skúste to znovu.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Nepodarilo sa použiť motív &quot;{0}&quot;, farebný profil &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Odkaz sa nedá otvoriť, adresa URL nie je v platnom formáte.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Aplikáciu sa nepodarilo spustiť.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Emulátory nie je možné importovať z dôvodu chýbajúceho alebo poškodeného definičného súboru.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Nepodarilo sa spustiť ponuku akcie.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Upraviť podrobnosti o hre</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL obrázka</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Pridať odkaz</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Pridať ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Uložiť zmeny</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Pridať akciu</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Vymazať akciu</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Odstrániť akciu Hrať</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Pridať hry</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Prehľadať priečinok…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Detegovať nainštalované</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Prechádzať…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Otvoriť Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Nastavenia profilu</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Názov hry nemôže byť prázdny.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Pred vyhľadávaním metadát musíte doplniť názov hry.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Neplatné údaje o hre</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Zadajte platnú webovú adresu URL začínajúcu reťazcom http:// alebo https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Vybrať webovú adresu</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Nepodarilo sa prevziať metadáta: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Chyba preberania</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Zrušiť filtre</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Súkromný účet</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Verejný účet</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">Kľúč API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Chyba pri spustení</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Chyba motívu vzhľadu</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Zmazať všetko</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Prebieha inštalácia</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Prebieha odinštalácia</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Spúšťa sa</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Spustené</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Neplatná adresa URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Nerobiť nič</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimalizovať</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Obnoviť okno</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Zavrieť</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Zmeniť</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Pokročilé</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Nikdy</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Stav dokončenia</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Hodnotenie používateľov</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Novinárske hodnotenie</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Komunitné hodnotenie</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Skripty</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Doplnky</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Zdroje metadát</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Rozšírenia</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID rozšírenia</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Znovu načítať skripty</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Všetky skripty sa úspešne znovu načítali.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Pre zadané kritériá vyhľadávania sa nenašli žiadne hry</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Nenašli sa žiadne položky</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Prepnúť na režim plochy</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Ukončiť Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Knižnice</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Aktualizovať všetko</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Vytvoril:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Verzia:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Knižnica</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Štatistiky</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Všetko</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Nič</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Oznámenia</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Šírka</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Výška</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Veľkosť</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Malé</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normálne</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Veľké</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Väčšie</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Najväčšie</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Predvolené</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Vybrať</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Vybrať všetko</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Prvé</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Náhodne</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Zadať používateľom</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Načítať viac</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Priehľadné</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Zbaliť</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Rozbaliť</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Zbaliť všetko</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Rozbaliť všetko</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Ostatné</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Motívy vzhľadu</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Parametre emulátora</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Dodatočné parametre emulátora</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Nahradiť parametre pre emulátor</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Vyberte metadáta pre import</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Vyberte hry pre import</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Vyhľadávanie metadát</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Dostupná aktualizácia</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Zmeny od poslednej aktualizácie</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Prevziať a nainštalovať aktualizáciu</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Skontrolovať aktualizácie</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Chyba aktualizácie</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Nepodarilo sa skontrolovať aktualizácie.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Nenašla sa žiadna nová verzia, Playnite je aktuálny.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Nepodarilo sa prevziať a nainštalovat aktualizáciu.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Je k dispozícii aktualizácia pre Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Obnoviť zoznam motívov vzhľadu</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Použiť vybratý motív vzhľadu</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Sledovať zmeny súboru</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Automaticky použiť motív vzhľadu pri zmenách súboru</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Runtime skriptov</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Skript, ktorý sa má vykonať pred spustením hry</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Skript, ktorý sa má vykonať po ukončení hry</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Skript, ktorý sa má vykonať po spustení hry</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Spustiť globálny skript</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Globálne</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Terajšie</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Nové</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Uložiť ako predvolené</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Pridať do obľúbených</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Odstrániť z obľúbenýchOdobrať z obľúbených</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Skryť túto hru</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Odstrániť zo skrytých</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Povoliť podporu HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Nepovoliť podporu HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Upraviť…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Veľkosť inštalácie</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Nastaviť kategóriu…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Nastaviť stav dokončenia</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Odstrániť</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Hrať</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Inštalovať</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Možnosti hry</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Podrobnosti</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Odinštalovať</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Otvoriť umiestnenie inštalácie</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Vytvoriť odkaz na ploche</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Otvoriť manuál</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Viac</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Spravované doplnkom knižnice</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Proces spustenia hry bude spravovaný doplnkom knižnice zodpovedným za túto hru.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Na uvedenej stránke neboli nájdené žiadne relevantné informácie o hre '{0}'.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Tip: Ak editujete hru pomocou položky &quot;Upraviť&quot;, môžete použiť pokročilé preberanie metadát.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Nie je dostupné keď práve prebiehajú iné akcie.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">V popise je možné použiť značky HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Odohraný čas sa zaznamenáva v sekundách.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Veľkosť inštalácie je uvedená v bajtoch.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Hodnoty od 0 do 100, prípadne prázdne ak skóre neexistuje.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Do slovenského jazyka preložil Michal Žila. Ďalší prispievatelia do kódu (bez poradia):</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Zrušiť monitorovanie hry?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Prebieha monitorovanie inštalácie, chcete ho ukončiť a vrátiť hru do predchádzajúceho stavu?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Prebieha monitorovanie behu hry, chcete ho ukončiť a vrátiť hru do predchádzajúceho stavu?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Odohraný čas</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Naposledy hrané</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0} d {1} h {2} m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minút</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} sekúnd</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Zatiaľ nehrané</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Spúšťanie režimu plochy…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Spúšťanie režimu celej obrazovky…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Načítanie hernej knižnice…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Inštalácia súboru skriptu zlyhala.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Skrypt bol úspešne nainštalovaný.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Nainštalovať skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Chyba skriptu</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Nepodarilo sa spustiť funkciu rozšírenia.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Otvoriť priečinok s metadátami</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Vypočítať</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">Klient {0} nie je nainštalovaný.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Klient {0} sa teraz otvorí, prihláste sa a potom túto správu zavrite.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Čaká sa na prihlásenie používateľa, keď sa tak stane, toto okno zavrite…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Priečinok s inštaláciou hry sa nenašiel.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Neplatná konfigurácia hry.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Riešenie problémov so synchronizáciou účtu</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Riešenie problémov</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Premenovať položku</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Pridať novú položku</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Zadajte názov</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Zadajte nový názov</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Menej než hodina</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 až 10 hodín</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 až 100 hodín</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 až 500 hodín</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 až 1000 hodín</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Na dokončenie inštalácie je potrebné Playnite reštartovať. Chcete teraz reštartovať?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Rozšírenie nie je správne zabalené.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Motív vzhľadu nie je správne zabalený.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Rozšírenie &quot;{0}&quot; sa nepodarilo správne načítať</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Motív vzhľadu &quot;{0}&quot; sa nepodarilo správne načítať.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Rozšítenie sa nepodarilo správne načítať</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Motív vzhľadu sa nepodarilo správne načítať.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Motív vzhľadu/rozširenie používa nepodporovanu verziu API.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Inštalácia bola úspešná.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Nainštalovať rozšírenie?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Obecné</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Inštalácia rozšírenia zlyhala.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Chcete nainštalovať nové rozšírenie?\r\n\r\n{0}\r\nVytvoril {1}\r\nVerzia {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Chcete aktualizovať rozšírenie &quot;{0}&quot;?\r\n\r\nAktuálna verzia: {1}\r\nNová verzia: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Inštalácia motívu zlyhala.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Chcete nainštalovať nový motív vzhľadu?\r\n\r\n{0}\r\nVytvoril {1}\r\nVerzia {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Chcete aktualizovať motív vzhľadu &quot;{0}&quot;?\r\n\r\nAktuálna verzia: {1}\r\nNová verzia: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Chystáte sa opustiť Playnite a otvoriť nasledujúcu web stránku vo vašom predvolenom webovom prehliadači.\r\nChcete pokračovať?\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Vybratý obrázok (obrázky) môže byť pre optimálny výkon príliš veľký. Použitie veľmi veľkých obrázkov môže mať za následok pomalšiu odozvu používateľského rozhrania a zvýšené využitie pamäte.\r\n\r\nMaximálne odporúčané rozlíšenia:\r\nIkony: {0} mega pixelov\r\nObaly: {1} mega pixelov\r\nPozadia: {2} mega pixelov</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Varovanie o výkone</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Nabudúce nezobrazovať</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Nekompatibilná koncovka súboru</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Vybratý súbor obrázka môže byť príliš veľký na dosiahnutie optimálneho výkonu.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Naozaj chcete odinštalovať vybraný motív vzhľadu? Odinštalácia bude sa vykoná pri ďalšom štarte aplikácie.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Vstavané motívy vzhľadu nemožno odinštalovať.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Tento motív vzhľadu nepodporuje túto verziu Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Naozaj chcete odinštalovať vybrané rozšírenie? Odinštalácia sa vykoná pri ďalšom štarte aplikácie.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Vstavané rozšírenia nemožno odinštalovať.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Toto rozšírenie nepodporuje túto verziu Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Inštalačný priečinok</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Adresár s dátami</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Vytvára sa diagnostický balíček…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Nahráva sa diagnostický balíček…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Importovať súbor…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Čo je toto?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Naozaj to chcete urobiť?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Celkový čas hrania</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Priemerný čas hrania</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Najväčší čas hrania</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Celková veľkosť inštalácie</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Prehľad</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Bočný panel</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Zobraziť na bočnom panely</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Resetovať nastavenia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Pre vývojárov</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Zadajte úplnú cestu k priečinku.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Úspechy</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Fórum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Novinky</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Stránka v obchode</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Prvotné nastavenie nie je dokončené. Playnite sa preto prepne do režimu plochy, aby sa toto nastavenie mohlo dokončiť.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Nedávno hrané</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Obľúbené</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Najviac hrané</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Všetko</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Sú použité nejaké filtre.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Výsledky vyhľadávania pre:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Položka s týmto názvom už existuje.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Obmedziť výber na aktuálny filter</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Vybrať dalšiu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Vyhľadáva sa…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Inštalovať</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Odinštalovať</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Zoznam zmien nie je dostupný</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Sťahovanie zlyhalo</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Prijať</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Odmietnuť</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Odkaz</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Súbor</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulátor</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Skript</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Priečinok</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Pôvodný proces</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Názov procesu</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Iba položky</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Iba začiatok a koniec</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Rýchlosť animácie</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Odstrániť položku?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Ste si istí, že chcete odstrániť túto položku?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Zobraziť tlačidlá na hornom panely:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Nastavenia všeobecného pohľadu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Nastavenia zoskupovania</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Nastavenia zoradenia</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Panel prieskumníka</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Vyberač náhodnej hry</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Vybrať náhodnú hru z pohľadu</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Za posledných 7 dní</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Za posledných 31 dní</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Za posledných 365 dní</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Pred viac než 365 dňami</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Nastaviť</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Uložiť predvoľbu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Minimalizovať po spustení hry</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Veľkosť písma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Malá veľkosť písma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Rozdeliť do rozličných hier</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Zlúčiť do jednej hry</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Nastaviť platformu</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Nastaviť región</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Skenovať priečinok</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Konfigurácie skenovania</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Vylúčiť vzorce z prehľadávania kontrolného súčtu</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Skryť importované</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Profily na importovanie:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Skenovať podpriečinky</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Skenovať vnútri archívov</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Pridať skener</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Pridať uložený skener</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Spustiť skenovanie</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpen\"></sys:String>\r\n    <sys:String x:Key=\"LOCActivate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAssign\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Nastavenia</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Knižnica hier</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Médiá knižnice hier</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Nainštalované rozšírenia</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Dáta rozšírení</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Nainštalované motívy</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Priečinok záloh</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Rotujúce zálohy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Zahrnúť ďalšie dáta:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Hľadanie obrázkov na webe</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Menu hry</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Priečinok programu</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Prenosná inštalácia</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Nenašli sa žiadne ovládače</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/sl_SI.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\"></sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\"></sys:String>\r\n    <sys:String x:Key=\"LOCSteamFriendsTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\"></sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\"></sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\"></sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatronsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCToday\"></sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\"></sys:String>\r\n    <sys:String x:Key=\"LOCMonday\"></sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\"></sys:String>\r\n    <sys:String x:Key=\"LOCThursday\"></sys:String>\r\n    <sys:String x:Key=\"LOCFriday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\"></sys:String>\r\n    <sys:String x:Key=\"LOCSunday\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\"></sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\"></sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameId\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\"></sys:String>\r\n    <sys:String x:Key=\"LOCPresets\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumn\"></sys:String>\r\n    <sys:String x:Key=\"LOCColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCRow\"></sys:String>\r\n    <sys:String x:Key=\"LOCRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\"></sys:String>\r\n    <!--Progess string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\"></sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\"></sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\"></sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsProvidersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdateLibStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdateEmulatedLibStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableDpiAwareness\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForceDownloadPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForceDownloadPlayniteTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\"></sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\"></sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\"></sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\"></sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCViewType\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\"></sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\"></sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\"></sys:String>\r\n    <sys:String x:Key=\"LOCXInputInitErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\"></sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUseExeIcon\"></sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\"></sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCOtherActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\"></sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\"></sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\"></sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\"></sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\"></sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\"></sys:String>\r\n    <sys:String x:Key=\"LOCClose\"></sys:String>\r\n    <sys:String x:Key=\"LOCChange\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCNever\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\"></sys:String>\r\n    <sys:String x:Key=\"LOCScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\"></sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\"></sys:String>\r\n    <sys:String x:Key=\"LOCAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\"></sys:String>\r\n    <sys:String x:Key=\"LOCWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCHeight\"></sys:String>\r\n    <sys:String x:Key=\"LOCSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\"></sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCFirst\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandom\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\"></sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\"></sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpand\"></sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOther\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\"></sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\"></sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\"></sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\"></sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\"></sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\"></sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\"></sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\"></sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\"></sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\"></sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\"></sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\"></sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\"></sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\"></sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\"></sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\"></sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\"></sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\"></sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\"></sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\"></sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\"></sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\"></sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCGridViewScrollAmountModifier\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\"></sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\"></sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\"></sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/sr_SP.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Српски</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite језик</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Излаз</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Филтер активан</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Филтер искључен</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Додатни филтери</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Филтери</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Филтер</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Неважећи подаци</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Сачувај промене?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Вебсајт: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Изворни код на GitHub-у</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Направи нови дијагностички пакет</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Пошаљи дијагностичке информације</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">О Playnite-у</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Направио Јозеф Њемец</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Додели категорију</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Постави категорије</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Додај категорију</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Чекирано - Додели категорију\r\nНечекирано - Обриши категорију\r\nНеодређено - Без промена (када се измењује више игара)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Нема категорије</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Нема платформе</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Упс! Нешто је пошло наопако…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Непоправљива грешка се догодила.\r\n\r\nАко желите да нам помогнете да поправимо овај проблем, молимо да кратко опишете све што сте радили пре грешке и онда пошаљете дијагностичке информације. Ако тренутно имате интернет конекцију, информације ће бити отпремљене на Playnite сервер за анализу.\r\n\r\nАлтернативно, можете користити &quot;Пријави проблем&quot; дугме да бисте пријавили нови проблем на GitHub-у и ручно пријавили проблем.\r\n\r\nХвала вам за помоћ.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Екстензија &quot;{0}&quot; је проузроковала непоправљиву грешку.\r\n\r\nПрепоручујемо вам да сачувате записни фајл и пријавите проблем девелоперу екстензије. Ако се проблем поново појављује, искључите екстензију.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Екстензија &quot;{0}&quot; је проузроковала непоправљиву грешку.\r\n\r\nПрепоручујемо вам да пријавите проблем девелоперу екстензије. Ако се проблем поново појављује, искључите екстензију.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Непозната екстензија или тема је изазвала непоправљиву грешку.\r\n\r\nПрепоручујемо да онемогућите додатке треће стране, изолујете проблематични и пријавите проблем програмеру додатка.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Непоправљива грешка се догодила.\r\n\r\nАко желите да нам помогнете да поправимо овај проблем, молимо да нам пошаљете дијагностичке информације. Хвала.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Искључи екстензију</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Сачувај записни фајл</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Пошаљи дијагностичке информације</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Пријави проблем</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Рестартуј Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Поново покрени у сигурном моду</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Искључује све екстензије треће стране и користи подразумевану тему.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Изађи из Playnite-а</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Шта сте радили пре грешке (на енглеском):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Менаџер библиотеке</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Обриши игре?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Не може да се обрише - Игра или инсталација је тренутно покренута. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Не може да се деинсталира - Игра је тренутно покренута.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Да ли сте сигурни да желите да уклоните {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Јесте ли сигурни да хоћете да обришете {0} игара?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Да ли сте сигурни да желите да уклоните {0}?\r\n\r\nИзаберите „додај на листу искључења“ да спречите поновни увоз игре следећи пут када се библиотека ажурира.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Јесте ли сигурни да хоћете да обришете {0} игара?\r\n\r\nСелектовање &quot;Додај на листу изузетака&quot; опције ће спречити да се исте игре поново уведу следећи пут када је библиотека ажурирана.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Јесте ли сигурни да хоћете да обришете {0} ставки које се тренутно не користе?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Ниједно некоришћено поље није нађено.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Да (Додај на листу изузетака)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Имате несачуване промене у овој секцији</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Ажурирање формата библиотеке игара…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Неуспешно ажурирање базе података.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Не може да се ажурира библиотека игара. {0} мегабајта простора је потребно за то.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">ГрешкаУИгри</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Не може да се покрене игра. &quot;{0}&quot; није пронађено у бази података.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Не може да се покрене игра: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Не може да се уради радња: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Не може да се отвори локација игре: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Није могуће открити величину инсталације игре: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Грешка при скенирању величине инсталације</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Било је {0} грешака током скенирања величине инсталације</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Неуспешно прављење пречице: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Неуспешно отварање упутсва за коришћење: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Не може да се инсталира игра: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Не може да се деинсталира игра: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Нису пронађене важеће радње покретања игре. Када користите радње емулатора, уверите се да дефиниције платформе одговарају конфигурацији игре и емулатора.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Имплементација за инсталацију није доступна.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Додатак за библиотеку одговоран за ову игру није инсталиран или није омогућен.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Преузимање званичних метаподатака није доступно.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Ниједна игра није изабрана.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Неуспешно извршење игрине скрипте.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Неуспешно извршење скрипте апликације.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Неуспешно извршење глобалне скрипте.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Неуспешно извршење скрипте емулатора.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Неуспешно извршење глобалне скрипте.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 или новији није инсталиран.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Неуспешно одређивање начина покретања игре</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Омогућено</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Онемогућено</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Обриши</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Обриши све некоришћено</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Преименуј</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Копирај</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Додај</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Подразумевана икона</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Подразумевана насловница</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Подразумевана позадина</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Заврши</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Следеће</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Назад</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">ГОТОВО</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">НАЗАД</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">ОЧИСТИ</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Очисти</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Одбаци</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Одбаци све</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Увези</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Назив</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Аутор</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Модул</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Серија</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Верзија</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Последњи пут играно</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Највише играно</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Време играња</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Величина инсталације</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Фолдер</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Напомене</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Додато</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Датум додавања</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Измењено</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Датум измене</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Вебсајт</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Путања</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">ОК</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Сачувај</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Затвори</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Откажи</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Потврди</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Ресетуј</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Да</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Не</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Добродошли</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Локални корисник</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Опште</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Медији</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Линкови</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Инсталација</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Радње</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Преузимање…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Преузимање медија…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Учитавање...</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Врста</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Профил</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Профили</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Обриши</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Преузми</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Претрага</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Резолуција:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Било који</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Зумирај</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Приказ листе</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Насловнице</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Приказ мреже</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Приказ детаља</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Прилагођено</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Специјална захвалност</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Лиценца</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Сарадници</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Излажење из Playnite-а…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Данас</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Јуче</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Понедељак</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Уторак</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Среда</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Четвртак</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Петак</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Субота</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Недеља</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Претходна недеља</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Претходни месец</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Претходна година</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Пре више од годину дана</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 до 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB до 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB до 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB до 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB до 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB до 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB до 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">Више од 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Увоз је успешно завршен.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Све игре</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ID игре</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">ID базе података</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Пресети</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Колона</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Колоне</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Ред</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Редови</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Није могуће преузети икону из Play радње. Нема присутне радње типа датотеке.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Само преузми недостале метаподатке</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Омогућавање ове опције ће прескочити преузимање метаподатака за поља података која већ садрже информације.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Одабир игара</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Молимо изаберите које игре хоћете да су ажурирају новим метаподацима:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Све игре из базе података</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Све тренутно филтиране игре</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Само изабране игре</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Званична продавница</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Молимо изаберите која поља ће се аутоматски попунити од стране Playnite-а и који извори ће се користити да се добију информације.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Молимо ако желите кликните на логотип горе и допринесите ажурирања сајту igdb.com да бисте побољшали податке које Playnite користи.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Преузимање метаподатака…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Увођење инсталираних игара…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Увођење {0} игара…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Увоз емулираних игара из {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Преузимање ажурирања библиотеке…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Скенирање величине игрица у библиотеци…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Скениранје величине увезених игара…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Завршено ажурирање библиотеке</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Ослобађање ресурса…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Конфигурација</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Подешавања…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Платформе и емулатори</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Конфигуриши емулаторе…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Менаџер библиотеке…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Алати</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Преузми метаподатке…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Софтверске алатке…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Конфигуриши интеграције…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Отвори клијент треће стране</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Клијенти треће стране</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Ажурирај библиотеку игара</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Поништи ажурирање библиотеке</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Ажурирај емулиране фолдере</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Додај игру</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Ручно…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Скенирај аутоматски…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Емулирана игра…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Апликација Microsoft продавнице…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">О Playnite-у</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Пошаљи повратне информације</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Промени у мод целог екрана</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Линкови</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Помоћ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Подржите на Patreon-у</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Подржите на Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Упутство за кориснике</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK документација</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Рестартуј систем</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Искључи систем</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Суспендуј систем</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Хибернирај систем</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Закључај Систем</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Одјави корисника</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Изабери игру насумице</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Поља игре која се приказују на панелу детаља:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Размак између ставки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Нацртај позадину ставке у мрежи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Ширина границе ставке у мрежи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Извор у случају да недостаје икона игре</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Извор у случају да недостаје насловница игре</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Извор у случају да недостаје позадина игре</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Вертикални размак између детаља игре</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Позиција детаља у приказу мреже</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Позиција листе игара у приказу детаља</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Нацртај сеператор између панела</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Висина насловнице</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Висина иконе на листи игара</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Апликацијски фонт</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Једнако размакнут фонт</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Позиција филтерског панела</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Позиција истраживачког панела</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Рендерирање насловнице</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Циљана пропорција</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Следеће опције такође утичу и на рендерирање слика у моду целог екрана!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Мод растезања</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD кутија</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Квадрат</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam банер</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam вертикална насловница</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Потребно рестартовање да би се применило</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Подешавања</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Опште</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Горњи панел</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Изглед</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Детаљи игре</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Распоред</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Напредно</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Цео екран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Унос</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Перформансе</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Метаподаци</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Ажурирање</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Претрага</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Резервна копија</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Направи резервну копију података</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Врати резервну копију података</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Уведи промене у библиотеку аутоматски</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Неважећа локација фајла базе података, правилна локација се мора поставити.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Назив налога не може бити празан.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Преузми метаподатке након увођења игара</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Покрени Playnite минимизиран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Покрени Playnite када се компјутер укључи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Покрени затворено у траци</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Неуспешно постављање Playnite-а да се покрене при покретању компјутера</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Покрени у моду целог екрана</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Асинхроно учитавање слика</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Побољшава глаткост скроловања листи игара у замену за спорије учитавање слика.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Прикажи назив игре ако насловница недостаје</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Прикажи називе игара у приказу мреже</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Потамни неисталиране игре</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Прикажи иконе игара на листи приказа детаља</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Прикажи број ставки у описима група</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Прикажи само додељена поља на филтерском и истраживачком панелу</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Искључи хардверско убрзање</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Користите ако доживљавате муцање или сличне проблеме с интерфејсом</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Прикажи скривене игре у листама за брзо покретање</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Утиче на скочну листу и листу на траци са алатима.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Број ставки за брзо покретање</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Користи позадину игре као позадину прозора</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Замагли позадину</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Високи квалитет</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Затамни позадину</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Прикажи у приказу мреже</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Профил теме</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Тема за цео екран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Профил теме за цео екран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Локација базе података</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Статус пријављивања:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite подешавања</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Обриши веб кеширане податке</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Можда поправи проблеме при повезивању налога.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Прикажи икону на траци са алатима</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Минимизирај Playnite на траку са алатима</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Минимизирај Playnite на траку са алатима када је апликацијски прозор затворен</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Када се игра покрене:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Након што се игра затвори:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Форматирај играно време да би означило број одиграних дана</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Формат датума:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Ово ће вас одјавити од свих повезаних сервиса. Рестартовање апликације је потребно за ово, хоћете ли да наставите?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Очисти кеширане податке?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Playnite треба да се рестартује да би се применила нова тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Преузми још тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Направи нову тему</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Преузми још екстензија</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Направи нову екстензију</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Помозите нам да преведемо Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite треба да се поново покрене да би се применила нова подешавања. Поново покрени сада?\r\n\r\nПоновно покретање ће прекинути све тренутно активне задатке (преузимања).</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Рестартуј Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite не премешта податке библиотеке аутоматски, ви морате да их преместите/копирате пре него што се локација промени. Ако се ниједна библиотека не налази у циљној локацији, нова ће се направити.\r\n\r\nНова локација базе података ће се користити само након што је апликација рестартована. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Време играња се неће пратити ако је &quot;Затвори&quot; радња подешена.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Број редова</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Број колона</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Број редова у приказу детаља</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Прикажи позадину на главном екрану</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Не примењује се ретроспективно већ постојећим играма без поновног преузимања метаподатака.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Увези играно време игара у библиотеци:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Конфигурише када би Playnite требао да увезе време играња пријављено од стране додатака библиотеке за игре у Playnite бази података. Потребна је подршка библиотечких додатака задужених за руковање игрицама да бисте могли да користите ову функцију.\r\n\r\nУвек: Увози време играња за нове увезене и постојеће игре у Playnite базу података.\r\nСамо за новоувезене игре: Увози време играња само за нове увезене игре.\r\nНикада: Никада не увози време играња ни под којим околностима.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Увек</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Само за ново увезене игре</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Никад</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Омогући подршку за контролер у десктоп моду</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Guide дугме отвара мод за цео екран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Подешавања аутоматског преузимања метаподатака за ново уведене игре.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Циљани екран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Увек користи главни екран</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Прикажи називе игара</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Прикажи статус батерије</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Прикажи проценат напуњености батерије</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Прикажи сат</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Сакриј курсор</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Инсталирано само у брзим филтерима</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Слике дугмића</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Распоред</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Хоризонтално скроловање</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Изабери једну од подсекција</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Нема доступних подешавања</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Неуспешно учитавање подешавања</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Ове скрипте важе за све игре у библиотеци. Индивидуалне скрипте могу се доделити свакој игри одвојено током измењивања игриних детаља.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Анимирај транзиције позадинских слика</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Величине фонтова</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Аутоматски</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Са другим именом</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Сиви тонови</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ОчистиВрсту</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Идеално</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Приказ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Мод форматирања текста</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Мод рендерирања текста</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Рендерирање текста и опције форматирања се тренутно не односе на описни текст игре.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Раније учитај позадинске слике</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Ако је омогућено, Playnite ће да преузима позадинске слике током преузимања метаподатака, самим тим користиће и више простора на диску и слике ће бити доступне и када сте офлајн.\r\n\r\nАко је укључено, позадинске слике преузимаће се само када су прво потребне, самим тим користиће се и мање простора, али то ће можда резултирати у кашњењу приказивања слика и неке слике можда не буду доступне офлајн.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Аутоматски затвори клијент треће стране након што се из игре изађе</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Период пре искључивања клијента (у секундама)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Не излази након сесија играња краћих од (у секундама)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Аутоматски затварај следеће клијенте:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Аутоматски затварај клијенте</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Уведи листу изузетака</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Прикажи упозорење када се додељују превелики фајлови за игру</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Команда за отварање директоријума</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Преферирана организација за старосна доба</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Ажурирај инсталацијску величину игара при ажурирању библиотеке</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Скенира и ажурира величину инсталације игара ако се открије да су њени фајлови промењени од прошлог скенирања</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Ништа</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Попуни</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Униформа</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Униформа која се попуњава</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Лево</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Десно</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Врх</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Дно</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Грешка приликом увоза</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Потребна је провера</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Неуспела провера</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Алтернативни режим исцртавања приказа са мреже</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Користите када имате проблема са веб приказима, на пример дијалозима за потврду идентитета интеграције.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Делимично учитавање великих описа игара</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Велики описи могу знатно успорити апликацију при избору игрица.\r\n\r\nКада је омогућено, само део текста описа ће се иницијално учитати са опцијом да се остатак учита на захтев.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Увоз метаподатака</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Преузми метаподатке</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Подеси одабрану конфигурацију да се користи за сва будућа преузимања метаподатака.\r\nМоже да се промени и у подешавањима апликације.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Чаробњак за увоз емулатора</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Овај чаробњак ће вас наводити кроз процес преузимања и увожења конзолашких емулатора као и увожења емулираних игара.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Увек можете да додате додатне емулаторе и/или игре касније користећи главни мени (испод &quot;Библиотека&quot; менија за емулаторска подешавања и &quot;Додај игре&quot; менија за емулиране игре).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Следи листа емулатора које Playnite може да препозна и аутоматски конфигурише. Можете да преузмете ове емулаторе и инсталирате са њихових вебсајтова. Када инсталирате емулаторе (ручно), можете их увести у дијалогу за конфигурацију емулатора.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Можете да уведете било који емулатор који је инсталиран на вашем компјутеру тако што кликнете на &quot;Аутоматски детектуј из фолдера…&quot; дугме. Playnite ће онда да претражи тај фолдер за било које познате емулаторе и даће вам опцију да их уведете. Можете увести више емулатора тако што користите исто то дугме више пута. Емулатори ће се додавати на дно тренутне листе.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Можете увести игре користећи &quot;Скенирај фолдер користећи емулатор&quot; дугме. Бирање прикладног емулатора ће рећи Playnite-у које врсте фајлова треба да скенира и уведе. Можете увести више фолдера тако што користите исто дугме више пута. Игре ће се додавати на дно тренутне листе.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Ниједан емулатор није изабран за увоз. Нећете моћи да аутоматски уведете било које емулиране игре без прво конфигурисања емулатора. Хоћете ли да наставите и изађете из процеса увода?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Ниједан емулатор није конфигурисан у Playnite-у. Не можете да уведете игре без прво конфигурисања емулатора и бирања прикладне врсте фајла. Хоћете ли да додате емулаторе сада?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Скенирај фолдер користећи емулатор</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Изаберите фајлове</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Аутоматски детектуј из фолдера…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Конфигуриши емулаторе…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Скенирање…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Скенирам {0}...</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Почетна конфигурација</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Овај чаробњак ће вас наводити кроз процес аутоматског увоза игара и конфигурације екстерних библиотека игара. Playnite може да аутоматски уведе игре са више сервиса за играње игара као што су Steam или GOG, и такође може и да одржава вашу библитеку игара ажурном тако што је ажурира при сваком покретању апликације.\r\n\r\nУвек можете да додате ручно било коју другу игру касније тако што кликнете на &quot;Playnite&quot; дугме.\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Интеграција библиотеке</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Аутоматски уведи игре са следећих сервиса. Било које касније промене (статус инсталације) ће се аутоматски ажурирати при покретању Playnite-а или када се исти процес покрене ручно. Изабрана подешавања утичу на почетне и све друге уводе.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Завршена конфигурација</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Почетна инсталација је завршена. Запамтите да увек можете да промените сва подешавања касније у &quot;Подешавања&quot; менију.\r\n\r\nТакође можете и да додате било коју другу игру касније тако што кликнете на логотип Playnite-а.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Преузимање једне или више екстензија није успело.\r\n\r\nМожете покушати да поново преузмете интеграције из менија додатака након што се чаробњак за прво покретање заврши.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Преузимам {0} интеграцију…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Преузимање листе препоручених интеграција…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Преузимање листе препоручених интеграција није успело. Можете пробати и поново преузети интеграције касније преко менија додатака</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Конфигуриши платформе и емулаторе</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Конфигуриши емулаторе</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Платформе</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Платформа</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Емулатори</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Емулатор</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Додај платформу</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Изабери икону</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Изабери насловницу</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Изабери слику</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Изабери ставку</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Изабери позадину</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Изабери фајл</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Изабери URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Додај емулатор</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Подржана(е) платформа(е)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Хоћете ли да сачувате измене платформе?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Хоћете ли да сачувате измене емулатора?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Покретни фајл</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Аргументи</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Радни директоријум</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Подржане врсте фајлова</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Уведи емулаторе…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Преузми емулаторе…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Учитај пресете аргумената из познатог емулаторског профила</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Јесте ли сигурни да хоћете да обришете {0} емулатор(а)?\r\nТренутно га(их) користи(е) {1} игра(е).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Јесте ли сигурни да хоћете да обришете {0} платформу(е)?\r\nТренутно је(их) користи(е) {1} игра(е) и {2} емулатор(а).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Помоћ око подешавања</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Сортирај по</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Смер сортирања</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Групиши по</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Растући редослед</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Опадајући редослед</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Не групиши</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Групиши по библиотеци</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Групиши по категорији</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Групиши по платформи</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Врста приказа</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Приказ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Истраживачки панел</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Филтерски панел</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Икона</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Иконица библиотеке</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Насловница</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Позадинска слика</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Сортирајуће име</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Упутство за коришћење</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Назив</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Драјв инсталације</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Назив налога</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Платформа</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Категорија</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Жанр</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Датум издавања</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Година издавања</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Девелопер</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Ознака</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Издавач</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Инсталациони статус</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Задовољи све критеријуме</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Ако је омогућено, у приказ ће бити укључене само игре које користе све ставке у свим филтерима.\r\nАко је онемогућено, игре које користе било коју ставку у било ком филтеру биће укључене у приказ.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Инсталирано</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Инсталирано</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Није инсталирано</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Сакривено</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Омиљено</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Укључи подршку HDR-а</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Ако укључено, HDR ће бити укључен на главном екрану пре покретања игре.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Ваш главни екран не подржава HDR.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Последњи пут играно</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Категорија</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Опис</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Инсталациони директоријум</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Насловница</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Линкови</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Путања за Image, ROM или ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Жанр</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Жанрови</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Компанија</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Компаније</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Девелопер</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Девелопери</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Издавач</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Издавачи</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Категорија</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Категорије</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Ознака</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Ознаке</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Својство</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Својства</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Старосно доба</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Старосна доба</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Регион</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Региони</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Извор</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Извори</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Скорашња активност</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Грешка у бази података</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Неуспешно отварање базе података библиотеке.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">База података није отворена.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Не можемо да приступимо бази података библиотеке. Фајл &quot;{0}&quot; већ користи неки други процес или је у неприступачној локацији.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Неуспешно прављење дијагностичког пакета.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Неуспешно аутоматско отпремљивање дијагностичког пакета.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Дијагностичке информације су успешно послате.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Дијагностички пакет је направљен и успешно је отпремљен.\r\nМолимо додајте следећи ID на вашу пријаву проблема:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Неуспешно увођење игара из {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Неуспешно увођење игара из {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Не може да се одради претрага игара са изабраним емулаторским профилом. Профил не садржи ниједну екстензију фајла или платформу.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite није успео да се покрене. Молимо затворите све програме и пробајте поново.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Неуспешна примена теме &quot;{0}&quot;, профил боје &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Не може да се отвори линк, URL није у валидном формату.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Неуспешно покретање апликације.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Иницијализација компоненте прегледа веба није успела. Playnite не може наставити са покретањем.\r\n\r\nВише информација на https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Не могу да се уведу емулатори због фајлова који недостају или су корумпирани.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Неуспешно покретање радње из менија.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Измени детаље игре</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL слике</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Додај линк</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Додај РОМ</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Сачувај промене</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Примени измене поља на игре које се мењају</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Додај радњу</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">&quot;Обриши&quot; радња</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Обриши &quot;Играј&quot; радњу</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Додај игре</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Скенирај фолдер…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Детектуј инсталиране игре</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Претражи…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Отвори Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Подешавања профила</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Назив игре не може да буде празан.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Фолдер за праћење акција игре не може бити празан.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Назив игре не може да буде празан пре претраге метаподатака.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Неважећи подаци о игри</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Унесите валидни URL који почиње са http:// или https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Изабери URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Неуспело преузимање метаподатака: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Грешка приликом преузимања</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Очисти филтере</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Приватни налог</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Јавни налог</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API кључ</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Грешка при покретању</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Грешка теме</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Очисти све</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Инсталирање</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Деинсталирање</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Покретање</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Покренуто</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Неважећи URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Не ради ништа</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Минимизирај</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Поврати прозор</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Врати прозор само кад је покренут са интерфејса</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Затвори</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Измени</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Напредно</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Никад</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Статус завршености</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Статуси завршености</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Корисникова оцена</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Оцена критичара</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Оцена других корисника</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Скрипте игара</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Скрипте апликација</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Скрипте</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Додаци</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Извори за метаподатке</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Екстензије</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID екстензије</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Поново учитај скрипте</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Интерактивни SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Све скрипте су успешно поново покренуте.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Ниједна игра није пронађена користећи критеријуме које сте навели током филтрирања/претраге</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Није пронађена ниједна ставка</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Промени у десктоп мод</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Изађи из Playnite-а</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Библиотеке</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Ажурирај све</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Направио:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Верзија:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Ажурирано:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Модул:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Библиотека</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Статистика</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Све</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Ништа</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Обавештења</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Ширина</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Висина</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Величина</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Мали</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Нормалан</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Велики</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Већи</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Највећи</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Подразумевано</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Изабери</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Изабери све</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Поништи селекцију</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Прво</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Насумице</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Корисников избор</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Учитај више</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Транспарентно</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Скупи</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Прошири</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Скупи све</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Прошири све</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Остало</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Теме</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Аргументи за емулатор</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Уграђени аргументи</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Посебни аргументи</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Додатни емулаторски аргументи</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Надгласај емулаторске аргументе</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Акција &quot;играј&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Изабери метаподатке за увоз</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Изабери игре за увоз</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Претрага метаподатака</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Доступно је ажурирање</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Промене од прошлог ажурирања</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Преузми и инсталирај ажурирање</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Провери да ли постоје ажурирања</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Грешка при ажурирању</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Неуспешна провера нових ажурирања.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Нема нових ажурирања, ажурни сте.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Неуспешно преузимање и инсталирање ажурирања.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Позадински задатак је тренутно у току. Прекинути и наставити са ажурирањем?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Позадински задатак је тренутно у току. Прекинути и напустити апликацију?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Позадински задатак је тренутно у току. Прекинути и променити начин рада?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Ажурирање за Playnite је доступно</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Поново учитај листу тема</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Примени изабрану тему</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\"> Посматрај промене фајла</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Аутоматски примени тему када се изворни фајл промени</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Време скрипте</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Скрипта за покренути пре покретања игре</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Скрипта за покренути после излажења из игре</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Скрипта за покренути након покретања игре</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Извршите при покретању апликације</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Извршите при гашењу апликације</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Скрипта када се игра покреће</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Скрипта када је игра покренута</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Скрипта када је игра стопирана</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Покрени глобалну скрипту</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Глобално</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Филтрирано</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Тренутно</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Ново</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Тестна скрипта</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Прикажи сам обележено</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Сачувај као подразумевано</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Додај у омиљене</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Уклони из омиљених</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Сакриј ову игру</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Уклони из скривених игара</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Укључи подршку HDR-а</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Искључи подршку HDR-а</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Измени…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Израчунај величину инсталације</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Израчунај величину инсталације (све игре)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Израчунај величину инсталације (само недостајући подаци)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Величина инсталације</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Подеси категорију…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Подеси статус завршености</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Обриши</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Играј</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Инсталирај</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Опције игре</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Детаљи</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Деинсталирај</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Отвори локацију инсталације</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Направи пречицу на десктопу</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Отвори упутства за коришћење</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Више</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Руковођено од стране додатка за библиотеку</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Процес покретања игре ће руководити додатак за библиотеку одговоран за ову игру.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Ниједна релевантна информација о игри &quot;{0}&quot; није пронађена на наведеној страници.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Савет: Можете користити напреднији процес за преузимање метаподатака ако измењујете игру користећи &quot;Измени&quot; опцију у менију.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Није доступно када је нека радња у току.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Описни текст је сензитиван на HTML синтаксе.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Време играња се бележи у секундама.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Величина инсталације је обележена у бајтовима.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Датум објаве мора бити у формату година-месец-дан. Месец и дан се могу изоставити.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Бројеви од 0 до 100 или празно да би остало без оцене.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Развој Playnite-а је подржан од стране следећих патрона и Ko-fi чланова:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Кодирање, преводи и други контрибутори у никаквом посебном редоследу:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Прекини праћење игара?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Праћење инсталације је тренутно у току. Хоћете ли да прекините процес и вратите игру у прошло стање?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Праћење покретања игре је тренутно у току. Хоћете ли да прекините процес и вратите игру у прошло стање?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Време играња</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Последњи пут играно</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}д {1}ч {2}м</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} минут(а)</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} секунд(и)</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Не играно</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Отварање десктоп мода…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Отварање мода целог екрана…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Учитавање библиотеке игара…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Израчунавање величине инсталације…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Израчунавање величине инсталације {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Неуспешно инсталирање фајла скрипте.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Скрипта успешно инсталирана.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Инсталирај скрипту</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Грешка у скрипти</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Неуспешно покретање функције екстензије.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Отвори фолдер метаподатака</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Израчунај</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Аутоматски израчунава величину инсталације користећи ROM-ове ако игра има било који или инсталациони директоријум ако је подешен</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} клијент није инсталиран.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} клијент ће се сада отворити. Молимо пријавите се и затворите ову поруку.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Чекање да се корисник пријави, молимо затворите ову поруку када сте готови…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Инсталациони директоријум игре није пронађен.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Неважећа конфигурација радње игре.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Решавање проблема са синхронизацијом налога</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Решавање проблема</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Преименуј ставку</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Додај нову ставку</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Унеси назив</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Унеси нов назив</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Мање од сата</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">Од 1 до 10 сати</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">Од 10 до 100 сати</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">Од 100 до 500 сати</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">Од 500 до 1000 сати</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite треба да се поново покрене да би се инсталација завршила. Хоћете ли да поново покренете сада?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Екстензија није правилно упакована.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Тема није правилно упакована.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Неуспешно учитавање екстензије &quot;{0}.&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Неуспешно учитавање &quot;{0}&quot; екстензије,  тренутна верзија апликације није подржана.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Неуспешно учитавање теме &quot;{0}.&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Неуспешно учитавање &quot;{0}&quot; теме,  тренутна верзија апликације није подржана.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Неуспешно учитавање екстензије.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Неуспешно учитавање теме.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Тема/екстензија користи неподржану API верзију.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Инсталација је успешна.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Инсталирај екстензију?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Опште</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Неуспешна инсталација &quot;{0}&quot; додатка.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Неуспешно инсталирање екстензије.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Хоћете ли да инсталирате нову екстензију?\r\n\r\n{0}\r\nОд {1}\r\nВерзија {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Хоћете ли да ажурирате &quot;{0}&quot; екстензију?\r\n\r\nТренутна верзија: {1}\r\nНова верзија: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Неуспешно инсталирање теме.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Хоћете ли да инсталирате нову тему?\r\n\r\n{0}\r\nОд {1}\r\nВерзија {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Хоћете ли да ажурирате &quot;{0}&quot; тему?\r\n\r\nТренутна верзија: {1}\r\nНова верзија: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Управо сада ће те да изађете из Playnite-а и да одете на следећи вебсајт користећи ваш подразумевани веб прегледач. Хоћете ли да наставите?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Изабрана(е) слика(е) је(су) можда превелика(е) за оптималне перформансе. Коришћење превеликих слика може да резултира у проблемима са интерфејсом и повећаном коришћењу меморије.\r\n\r\nМаксималне препоручене резолуције:\r\nИконе: {0} мегапиксела\r\nНасловнице: {1} мегапиксела\r\nПозадине: {2} мегапиксела</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Упозорење за перформансе</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Не приказуј поново</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Фајл са екстензијом {0} није компатибилан.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Неисправан тип датотеке</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Изабрана слика је можда превелика за оптималне перформансе.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Јесте ли сигурни да хоћете да обришете одабрану тему?</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Уграђене теме не могу да се обришу.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Ова тема није подржана од стране тренутне верзије Playnite-а.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Јесте ли сигурни да хоћете да обришете одабрану екстензију?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Уграђене екстензије не могу да се обришу.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Ова екстензија није подржана од стране тренутне верзије Playnite-а.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Инсталациони директоријум</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Директоријум података</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Генерисање дијагностичког пакета…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Отпремање дијагностичког пакета…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Уведи фајл…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Шта је ово?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Да ли сте сигурни да желите да урадите ово?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Укупно време играња</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Просечно време играња</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Најдуже време играња</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Укупна величина инсталације</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Преглед</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Мени са стране</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Прикажи у бочној траци</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Враћање подешавања</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Сва подешавања апликације ће бити враћена на подразумеване вредности, осим:\r\n- Локација базе података\r\n- Листа искључења увоза\r\n- Подешавања екстензија, укључујући интеграције библиотеке\r\n    \r\nЗа завршетак процеса потребно је поновно покретање апликације. Да ли желите да ресетујете подешавања?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">За програмере</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Екстерне екстензије</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Унесите путању до фолдера</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Достигнућа</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Форум</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Вести</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Страница у продавници</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Почетна инсталација није довршена. Playnite ће се сада рестартовати у десктоп мод да бисте завршили процедуру.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Недавно играно</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Омиљено</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Највише играно</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Све</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Неки филтери су примењени.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Примењени су додатни филтери.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Резултати претраге за:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Ставка са истим називом већ постоји.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Лимитирај селекцију на тренутни филтер</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Изабери другу</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Додаци...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Инсталирано</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Подешавања екстензија</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Претражи</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Ажурирања</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Ажурирања ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Управљање инсталираним екстензијама и темама, укључујући њихова подешавања, премештено је у нови мени „Додаци“.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Овде се могу конфигурисати све тренутно инсталиране екстензије за интеграцију библиотеке.\r\n\r\nАко желите да инсталирате или деинсталирате додатне интеграције, користите опцију „Додаци“ из главног менија.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Декстоп теме</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Теме приказа преко целог екрана</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Претражујем…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Додатак није компатибилан са овом верзијом апликације.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Неуспешно преузимање инсталационог пакета додатка.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Неуспешно преузимање инсталационог манифеста додатка.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Неопходно је поново покренутри апликацију да би измене биле примењене.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Овај додатак има заказано ажурирање</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Инсталирај</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Деинсталирај</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Већ инсталирано</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Нису пронађена нова ажурирања</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Ажурирај додатке</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Дневник измена није доступан</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Заказани за инсталацију</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Преузимање неуспешно</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Одбијена лиценца</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Преузимам {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Тражим ажурирања додатака...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Доступно једно или више ажурирања додатака.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Одаберите ствари за ажурирање:</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Развојна инстанца екстензије</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} уговор о лиценци</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Прихвати</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Одбиј</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Одабрати акцију</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Режим праћења</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Фреквенција праћења</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Линк</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Фајл</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Емулатор</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Скрипта</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Подразумевано</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Процес</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Фолдер</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Оригинални процес</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Забележи причвршћене поруке</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Следеће измене преписују податке за све тренутно одабране игре!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Ниједан</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Униформно</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Само између ставки</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Само почетно и завршно</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Осетљивост скроловања</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Глатко скроловање</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Брзина анимација</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Уклонити ставку?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Да ли сте сигурни да желите да уклоните ову ставку?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Прикажи дугмад у горњем панелу:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Општа подешавања</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Подешавања груписања</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Подешавања сортирања</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Унапред подешени филтери</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Позиција уметака</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Ширина размака између секција</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Помери дугме за главни мени у бочни мени.</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Претраживач панел</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Бирач насумичне игре</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Сачувеј подешавања за груписање и сортирање</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Прикажи као брзи филтер у приказу целог екрана</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Последњих 7 дана</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Последњих 31 дан</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Последњих 365 дана</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Пре више од 365 дана</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Конфигуриши</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Сачувај подешавање</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Смањи после покретања игре</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Умањи апликацију након покретања игре.\r\n\r\nОнемогућавање овог може изазвати проблеме да игре не буду у фокусу након покретања!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Величине фонта</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Мали фонт</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Прикажи ставке у главном менију:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Мења места дугмади за покретање игре и приказ странице детаља игре у главном приказу.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Гласност интерфејса</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Гласноћа позадине</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Мутирај кад је у позадини</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Неуспешно покретање Х-унос звучног интерфејса.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Излазни АПИ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">АПИ који се користи за репродукцију звука. Измените ако имате проблема са звуком.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Општи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Изгледи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Звук</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Распоред</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Менији</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Унос</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} се покреће…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} је у току…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Велика/мала слова</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Размак</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Алтернатива</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Уравнотежено</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Квалитет</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Квалитет:\r\nНајбољи квалитет слике, спор, највише користи меморију.\r\n\r\nИзбалансирано:\r\nДобар квалитет, брз, мало искоришћене меморије.\r\n\r\nАлтернативно:\r\nБољи квалитет, средња брзина, мало искоришћене меморије.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Изаберите фајл...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Изаберите фасциклу...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Скрипта за покретање</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Имајте на уму да и екстензије и теме могу у великој мери утицати на перформансе, стабилност и безбедност Playnite-а.\r\n    \r\nАко почнете да имате проблема након инсталирања теме или екстензије, покушајте прво да их онемогућите/деинсталирате да бисте видели да ли су оне узрок проблема.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Одабери при покретању</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Одабери при покретању</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Уграђени профил</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Уграђени профил</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Посебни профили</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Посебни профил</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Руковођен уграђеном скриптом</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Спецификација емулатора</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Спецификација платформе</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Спецификација регије</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Скрипта за покренути пре покретања игре</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Скрипта за покренути након покретања игре</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Покрени након излажења из игре</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Извршна датотека емулатора није пронађена</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Спецификација емулатора није пронађена</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Скрипта за покретање емулатора није пронађена</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Растави у одвојене игре</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Повежи у једну игру</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Постави платформу</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Постави регион</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Скенирај фолдер</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Скенирај конфигурације</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Искључи обрасце из скенирања контролног збира.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Контролни збир фајлова који одговарају наведеном обрасцу неће бити проверен и биће упоређен само по имену фајла. Погледати помоћну страницу емулатора за информације.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Скенирај са емулатором</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Име мора бити постављено када се чува нова конфигурација.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Емулатор или њехов профил нису подешени.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Путања за скенирање није подешена или је празна.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Конфигурација скенера није правилно постављена.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Укључи у групно скенирање аутоматског скенирања</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Неусешно скенирање емулатора унутар фолдера</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Неуспешно скенирање фолдера за игре емулатора.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Сакриј увезено</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Профили за увоз:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Аутоматски скенирај конфигурације</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Сачувај као ауто-скен конфигурацију</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Чува конфигурацију за коришћење приликом ажурирања библиотеке. Сачуване конфигурације се могу подешавати преко менија &quot;Конфигурација емулатора&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Увези користећи релативне путање</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Ако је могуће, увези датотеке игара користећи путање у односу на Playnite-ов инсталациони директоријум или инсталациони директоријум емулатора.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Скенирај подфолдере</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Скенирај у архивама</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Споји повезане фајлове</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Споји повезане фајлове игара, нпр. појединачних дискова игара, под једним уносом игре.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Додај скенер</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Додај сачуван скенер</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Почни скен</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Подразумеван статус додељен ново-додатим играма</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Статус додељен играма које се покрећу први пут</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Иницијализација PowerShell скрипте није успело. Ако користите Windows 7, пробајте да (ре)инсталирате PowerShell 5.1 да поправите грешку.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Унапред подешен филтер са задатим именом већ постоји. Ажурирати постојећи филтер са новим подешавањима?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Сортирање</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Апликација ради са повишеним привилегијама (администратор). Ово се не препоручује јер се тако дају повишене привилегије свим додацима и играма/апликацијама покренутим од стране апликације.\r\n\r\nВише информација на https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Прикажи упозорење ако апликација ради са повишеним привилегијама</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Следећи додаци су пријављени као можда проблематични, или због високог утицаја на стабилност/перформансе, или због сигурности. Топло препоручујемо да их уклоните:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Изузми онлајн фајлове из скена</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Фајлови смештени на серверу неће бити скенирани и увезерни ако нису доступни локално.\r\nПодржани су само: Гугл Диск, Дропбокс и Онедриве</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Скенирај користећи поједностављен метод без садржаја фајлова.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Фајлови ће бити увезени користећи мање прецизну методу која не гарантује преузимање садржаја</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Примени на све</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Само ручно</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Једном дневно</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Једном недељно</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Приликом сваког покретања</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Провери за ажурирања програма</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Провери за ажурирања додатака</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Ажурирај библиотеке</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Скенирај фолдере емулације</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Укључи скривене игре</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Уреди поља</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Изабери / Поништи све</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Отвори</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Активирај</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Додели</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Почните да куцате да бисте тражили игре… [F1] за помоћ.</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Почетак са # приказује листу доступних команди.\r\nПочетак са / приказује листу доступних добављача/додатака за претрагу.\r\nУношење кључне речи за претрагу и завршавање са РАЗМАКОМ, одмах вас пребацује на ту претрагу.\r\n\r\nТАБУЛАТОР: промени акцију\r\nЕНТЕР: активирај изабрану акцију\r\nШИФТ-ЕНТЕР: отвори мени ставки</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Укључи неинсталиране игре</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Укључи скривене игре</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Неисталиране игре су укључене</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Неисталиране игре су искључене</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Скривене игре су укључене</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Скривене игре су искључене</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Враћање података из резервне копије…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Враћање података из резервне копије није успело.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Подешавања</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Библиотека игара</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Медији игара библиотеке</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Инсталиране екстензије</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Подаци екстензије</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Инсталиране теме</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Изабери податке за враћање из изабране резервне копије.\r\n    \r\nPlaynite ће се аутоматски поновно покренути да покрене процес повратка резервне копије.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Изаберите ставке које ће бити укључене у резервну копију података. Подешавања апликације и подаци библиотеке игара су подразумевано укључени.\r\n    \r\nPlaynite ће се аутоматски поновно покренути да покрене процес резервне копије.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Аутоматска резервна копија података</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Фреквенција аутоматске резервне копије</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Фасцикла резеервних копија</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Ротирајуће резервне копије</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Укључи додатне податке:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Фасцикла резервних копија мора бити одређена ако су аутоматске резервне копије укључене.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Прикажи обавештења само за новости</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Када је омогућено, само ажурирања доступна за тренутно инсталирано главно издање ће резултирати обавештењем о ажурирању.\r\nНова велика издања неће резултирати обавештењем о ажурирању.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Користи релативне датуме за прошлу недељу</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Користи формат релативног датума нпр. &quot;Данас&quot;, &quot;Јуче&quot;... ако је датум стар мање од недељу дана.\r\n    \r\nНаведени формат датума ће се користити за све остале датуме.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Потражи слику на интернету</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Добијање информација о додатку…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Није доступан извор метаподатака</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Изабери профил при покретању</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Изабери емулатор при покретању</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Аутоматски</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Увек укључено</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Увек искључено</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Подршка за приступачност (читач екрана)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Мени апликација</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Мени игара</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Фасцикла програма</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Директоријум корисничких података</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Откривена је корупција библиотеке, Playnite ће се сада угасити.\r\n    \r\nОтворите ново питање (issue) на Playnite-овој GitHub страници са захтевом да поправите оштећење у вашим датотекама.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Да ли желите да сачувате промене које сте направили?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Преносива инсталација</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Ниједан контролер није препознат</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/sv_SE.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Svenska</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite språk</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Avsluta</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtret aktivt</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtret inaktiverat</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Ytterligare filter</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filter</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Ogiltiga data</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Spara ändring?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Hemsida: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Källkod: GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Skapa diag. paket</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Skicka felsökningsinformation</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Om Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Skapad av Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Tilldela Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Sätt Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Ny Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Bockad - Tilldela kategori\r\nAvbockad - Ta bort kategori\r\nObestämd - Inga ändringar (vid redigering av flera spel)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Ingen kategori</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Ingen plattform</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Hoppsan! Något gick fel.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Ett oåterkallelig fel har inträffat.\r\n\r\nOm du vill hjälpa oss att åtgärda problemet, beskriv kortfattat vad som hände före kraschen, och skicka sedan diagnosinformationen. Om du är uppkopplad laddas paketet upp till Playnite-servern för analys.\r\n\r\nAlternativt kan du klicka på knappen 'Rapportera krasch' för att skapa ett nytt GitHub issue och rapportera kraschen manuellt.\r\n\r\nTack för din hjälp.\r\n\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Tillägget &quot;{0}&quot; orsakade ett oåterkalleligt fel.\r\n\r\nVi rekommenderar att du sparar loggfilen och rapporterar problemet till tilläggets utvecklare. Om problemet fortsätter att återkomma, inaktivera tillägget.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Tillägget &quot;{0}&quot; orsakade ett oåterkalleligt fel.\r\n\r\nVi rekommenderar att du rapporterar problemet till tilläggets utvecklare. Om problemet fortsätter att återkomma, inaktivera tillägget.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Okänt tillägg eller tema orsakade ett fel som inte kan åtgärdas.\r\n\r\nVi rekommenderar att stänga av tredjeparts-tillägg, isolera den problematiska och rapportera problemet till tilläggets utvecklare.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Ett oåterkallelig fel har inträffat.\r\n\r\nOm du vill hjälpa oss att lösa problemet, skicka diagnostisk information. Tack.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Inaktivera tillägg</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Spara loggfil</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Send diag. info\r\nSkicka diagnosinfo</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Rapportera en krasch</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Starta om Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Starta om i felsäkert läge</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Inaktivera alla tillägg från tredje part och använda standardtema.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Avsluta Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Åtgärder som vidtagits före kraschen (på engelska):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Bibliotekshanterare</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Ta bort Spel?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Kan inte ta bort - Spelet eller installationsprogrammet körs.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Kan inte avinstallera - Spelet körs.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Är du säker på att du vill ta bort {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Är du säker på att du vill ta bort {0} spel?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Är du säker på att du vill ta bort {0}?\r\n\r\nOm du väljer inställningen &quot;lägg till på uteslutnings listan&quot; kommer spel inte kunna bli importerade igen för än nästa gång biblioteket blir uppdaterat.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Är du säker på att du vill ta bort {0} spel?\r\n\r\nOm du väljer alternativet &quot;lägg till i uteslutningslistan&quot; förhindras spel att importeras igen nästa gång biblioteket uppdateras.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Är du säker på att du vill ta bort {0} poster som för närvarande inte används?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Inga oanvända fält hittades.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Ja (lägg till i undantagslistan)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Det finns osparade ändringar i denna sektion</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Uppdaterar databasversionen…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Databasuppdatering misslyckades, kan inte öppna databasfilen.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Det går inte att uppdatera spelbiblioteket. {0} MB ledigt diskutrymme krävs.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">SpelFel</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Kan inte starta spelet. '{0}' hittades inte i databasen.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Kan inte starta spelet: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Kan inte starta åtgärd: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Kan inte öppna spelplats: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Kunde inte upptäcka spelets installationsstorlek: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Fel vid skanning av installationsstorlek</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">{0} fel uppstod vid skanning av installationsstorlek</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Misslyckades med att skapa genväg: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Det gick inte att öppna manualen: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Kan inte installera spel: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Kan inte avinstallera spel: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Inga giltiga startåtgärder för spelet hittades. När du använder emulatoråtgärder, se till att plattformsdefinitionerna matchar mellan spelet och emulatorkonfigurationen.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Installationsimplementering är inte tillgänglig.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Biblioteksplugin som ansvarar för detta spel är inaktiverat eller inte installerat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Officiell nedladdningskälla för metadata är inte tällgänglig.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Inget spel är markerat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Körning av spelskript misslyckades.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Körning av programskript misslyckades.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Global skriptkörning misslyckades.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Körning av emulatorskript misslyckades.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Körningen av uppspelningsskript misslyckades.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 eller senare är inte installerat.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Kunde inte avgöra hur spelet ska startas.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Aktiverad</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">AV</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Ta bort</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Ta bort oanvända</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Byt namn</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopiera</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Lägg till</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Standard Ikon</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Standard Omslag</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Standard bakgrundsbild</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Klart</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Nästa</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Tillbaka</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">KLART</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">TILLBAKA</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">RENSA</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Rensa</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Avfärda</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Avfärda alla</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Importera</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Namn</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Skapare</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modul</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Serie</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Version</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Senast spelad</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Mest spelade</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Antal speltillfällen</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Installerad storlek</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Mapp</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Noteringar</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Tillagd</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Tillagd datum</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Ändrad</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Ändrad datum</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Hemsida</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Sökväg</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">Ok</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Spara</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Stäng</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Avbryt</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Bekräfta</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Återställ</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Ja</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Nej</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Välkommen</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Lokal Användare</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Allmän</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Media</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Länkar</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Installation</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Handlingar</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Laddar ner…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Laddar ner media</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Laddar…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Typ</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profiler</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Ta bort</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Ladda ner</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Sök</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Upplösning:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Alla</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Zoom</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Listvy</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Omslag</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Rutnätsvy</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Detaljvy</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Manuell</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Tack till</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Licens</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Bidragsgivare</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Avslutar Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Idag</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Igår</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Måndag</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Tisdag</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Onsdag</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Torsdag</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Fredag</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Lördag</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Söndag</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Senaste veckan</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Senaste månaden</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Senaste året</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Mer än 1 år sedan</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 till 100 MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB till 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB till 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB till 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB till 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB till 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB till 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB eller mer</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Import slutfördes framgångsrikt.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Alla spel</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Spel-id</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Databas-id</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Förinställningar</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Kolumn</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Kolumner</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Rad</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Rader</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Det gick inte att hämta ikonen från spelåtgärden. Det finns ingen åtgärd av filtypen närvarande.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Ladda bara ner saknade metadata</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Om detta alternativ är aktiverat så kommer nedladdning av metadata skippas helt för fält som redan innehåller information.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Spelval</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Vänligen välj vilka spel som ska uppdateras med nya metadata:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Alla spel från databasen</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Alla filtrerade spel</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Endast utvalda spel</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Officiell Butiken</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Vänligen välj vilka fält som ska fyllas automatiskt av Playnite och vilka källor ska användas för att få data från.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Vänligen överväg att klicka på logotypen ovan för att bidra med uppdateringar till databasen på igdb.com för att förbättra den data som Playnite använder.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Hämtar metadata…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Importerar installerade spel…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Importerar {0} spel…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Importerar emulerade spel från {0}</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Hämtar biblioteksuppdateringar…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Skannar spelens storlek i biblioteket…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Skannar storleken på importerade spel…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Bibliotekets uppdatering slutförd</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Frigör resurser…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Konfiguration</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Inställningar…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Plattformar och Emulatorer</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Konfigurera emulatorer…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Bibliotekshanterare…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Verktyg</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Hämta Metadata…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Programvaruverktyg</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Konfigurera integrationer</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Öppna extern Plattform</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Tredjepartsklienter</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Uppdatera Bibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Avbryt biblioteksuppdatering</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Uppdatera emulerade mappar</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Lägg till Spel</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Manuellt…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Installerade Spel…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emulerade spel…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store applikation…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Om Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Skicka Feedback</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Ändra till Fullskärmsläge</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Länkar</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Hjälp</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Stöd Playnite på Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Stöd oss på Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Användarmanual</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK-dokumentation</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Starta om systemet</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Stäng ner systemet</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Sätt systemet i viloläge</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Viloläge </sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Låsningssystem</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Logga ut användare</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Välj ett Slumpmässigt Spel</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Infofält som visas på detaljpanelen:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Marginal mellan rutorna</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Rutmönstrad bakgrund</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Tjocklek på ram för rutnätet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Saknar källa för spelikoner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Saknar källa för spelomslagsbilder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Bakgrundskälla för spel saknas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Lodrätt mellanrum för speldetaljer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Plats för speldetaljer i rutnätsvy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Plats för spellistan i detaljvyn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Separator mellan paneler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Höjd för spelomslag</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Ikonhöjd på spellistan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Font</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Monospacetypsnitt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Plats för filterpanelen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Plats för utforskarpanelen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Visning spelomslagsbilder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Målbildförhållande</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Följande alternativ påverkar även brickors rendering i helskärmsläge!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Tänj</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD Låda</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Kvadrat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam Omslag</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Verrtikalt Steam-omslag</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Kräver omstart för att tillämpa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Inställningar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Allmänt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Övre panel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Utseende</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Speldetaljer</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Avancerat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Helskärm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Inmatning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Prestanda</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Uppdaterar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Sök</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Säkerhetskopiera</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Säkerhetskopiera biblioteksdata</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Återställ säkerhetskopia av data</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Importera ändringar i bibliotek automatiskt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Ogiltig databas sökväg, rätt filväg måste ställas in.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Kontonamnet får inte vara tomt.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Ladda ner metadata efter import av spel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Kör Playnite minimerat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Kör Playnite när du startar datorn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Starta minimerad till aktivitetsfältet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Misslyckades att registrera Playnite att starta automatiskt när datorn startar.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Kör i Fullskärmsläge</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Asynkron laddning av bilder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Förbättrar rullningsläge i spellistor i utbyte mot långsammare bildbelastningstider.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Visa spelnamn när spelomslag saknas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Visa spelnamn i rutnätsvyn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Gör avinstallerade spel mörkare</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Visa spelikoner i listvy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Visa räknare på titelfältet för gruppen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Visa endast valda fält på filter- och utforskarpaneler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Inaktivera hårdvaruacceleration</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Använd när du upplever hackande användargränssnitt eller liknande problem</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Visa gömda spel i snabbstartslistor</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Påverkar aktivitetsfältets och och skrivbordets snabbmenyer </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Antal snabbstartsobjekt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Använd spelets bakgrundsbild som bakgrund för fönstret</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Sudda bakgrundsbild</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Hög kvalitet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Förmörka bakgrundsbild</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Visa i rutnätsvyn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Tema Profiler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Fullskärms Teman</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Fullskärms Tema Profil</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Sökväg till databas</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Inloggningsstatus:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite Inställningar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Rensa webbcache</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Kan lösa problem som uppstått vid länkning av konton.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Visa systemfältsikon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Minimera Playnite till systemfältet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Minimera Playnite till systemfältet när programmet stängs ner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">När spel startar:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Efter att ett spel avslutas:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Visa tid spelad i dagar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Datumformat:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Det här loggar ut dig från alla länkade tjänster. Omstart av program krävs, vill du fortsätta?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Rensa Cache?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Playnite omstart krävs för att tillämpa nytt tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Skaffa fler teman</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Skapa nytt tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Skaffa fler tillägg</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Skapa nya tillägg</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Hjälp oss översätta Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite behöver startas om för att tillämpa nya inställningar. Starta om nu?\r\n\r\nOmstarten kommer avbryta alla aktiva processer (nedladdningar) som körs just nu.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Starta om Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite kan inte flytta dina filer automatiskt. Du måste manuellt flytta/kopiera över filerna innan du byter lagringsplatsen. Om det inte finns någon mapp vid den valda platsen, kommer en ny skapas.\r\n\r\nDen nya mappen kommer inte börja användas förens Playnite startas om.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Speltid kommer inte registreras om &quot;Stäng&quot; är valt.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Antal rader</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Antal kolumner</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Antalet rader i detaljvyn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Visa Bakgrundsbild på Hemskärmen</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Gäller ej retroaktivt för existerande spel i biblioteket utan att ladda ner metadata på nytt.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Importera speltid för spel i biblioteket:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Bestämmer när Playnite ska importera den speltid som rapporteras av bibliotekets tillägg för spel i Playnite-databasen. Stöd av bibliotekets tillägg, som ansvarar för hanteringen av spelet, behövs för att kunna använda denna funktion.\r\n\r\nAlltid: Importerar speltid för nya importerade och befintliga spel i Playnite-databasen.\r\nEndast för nyimporterade spel: Importerar endast speltid för nya importerade spel.\r\nAldrig: Importera aldrig speltid under några omständigheter.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Alltid</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Endast för nyimporterade spel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Aldrig</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Aktivera stöd för spelkontroller i Skrivbordsläge</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Guide-knappen öppnar Fullskärmsläget</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Inställningar för automatisk metadata-nedladdning för nyimporterade spel.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Målskärm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Använd alltid primärskärm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Visa speltitlar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Visa batteristatus</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Visa batteriprocent</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Visa klocka</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Dölj musmarkören</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Visa enbart installerade spel i snabbfilter</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Anpassade knapptexter</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Layout</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Skrolla vågrätt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Välj en av undermenyerna</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Inga inställningar tillgängliga</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Misslyckades att ladda inställningar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Dessa skript körs för varje spel i biblioteket. Individuella skript kan tilldelas varje spel separat medan du redigerar speldetaljer.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Animera bakgrundsbildsövergångar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Typsnittsstorlekar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Automatisk</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Utjämnad</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Gråskala</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Idealisk</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Skärm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Textformateringsläge</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Textrenderingsläge</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Textrendering och formateringsmetoder används för närvarande inte för spelbeskrivningar.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Förladda bakgrundsbilder</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Om aktiverad, kommer Playnite ladda ner bakgrundsbilder när du laddar ner metadata, detta kräver mer diskutrymme och gör bakgrunden tillgänglig offline.\r\n\r\nOm inaktiverad, laddas bakgrundsbilder endast ner när det behövs för första gången, detta kräver mindre utrymme, men kan resultera i en fördröjning innan bilder visas och vissa bilder kanske inte är tillgängliga offline.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Stäng automatiskt tredjepartsklient när spelet har avslutats</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Fördröjning för klientavstängning (i sekunder)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Stäng inte efter spelsessioner kortare än (i sekunder)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Stäng automatiskt följande klienter:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Stäng klienter automatiskt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Importera uteslutningslista</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Visa varning vid tilldelning av för stora spelmedia</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Kommando för mappöppning</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Föredragen åldersbedömningsorganisation</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Uppdatera installationsstorleken på spel vid uppdatering av bibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Skannar och uppdaterar installationsstorleken på spel om det upptäcks att deras filer har ändrats sedan den senaste skanningen</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Ingen</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Fyll ut</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Enhetlig</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Fyll likformigt</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Vänster</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Höger</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Toppen</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Botten</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Importerings fel</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Autentisering krävs</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Autentisering misslyckades</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Alternativt renderingsläge för webbvy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Använd när du upplever problem med webbvyer, till exempel integreringsautentiseringsdialoger.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Delvis laddning av långa spelbeskrivningar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Långa spelbeskrivningar kan orsaka märkbart lagg när man väljer spel.\r\n\r\nOm du sätter på inställningen kommer det bara laddas in en liten del av beskrivningstexten och ett alternativ för att ladda in mer.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Importera metadata</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Hämta Metadata</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Anger att den valda konfigurationen kommer att användas för alla framtida nedladdningar av metadata. Detta kan också konfigureras i applikationsinställningarna.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Emulerings Import Assistent</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Den här guiden kommer att guida dig genom processen att ladda ner och importera konsolemulatorer och importera emulerade spel.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Tänk på att du alltid kan lägga till ytterligare emulatorer och/eller spel senare via huvudmenyn (under &quot;Bibliotek&quot;-menyn för Emulatorinställningar och &quot;Lägg till spel&quot;-menyn för emulerade spel).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Nedan är en lista över emulatorer som Playnite kan känna igen och konfigurera automatiskt. Du kan ladda ner emulatorinstallatörer från deras webbplatser. När du har emulatorerna installerade (manuellt) kan du importera dem på emulatorkonfigurationsdialogrutan.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Du kan importera emulatorer som är installerade på din dator genom att klicka på knappen &quot;Autodetect From Folder…&quot;. Playnite kommer att söka i den valda mappen efter alla kända emulatorer och ge möjlighet att importera dem. Du kan använda denna knapp flera gånger för att importera emulatorer från olika mappar. Emulatorer kommer att läggas till i botten av den aktuella listan.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Du kan importera spel genom att klicka på knappen &quot;Skanna mapp med Emulator&quot;. Att välja lämplig emulator kommer att tala om för Playnite vilka filtyper som ska skannas och importeras. Du kan använda denna knapp flera gånger för att importera spel från olika mappar. Spel kommer att läggas till i botten av den aktuella listan.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Det finns inga emulatorer för import. Du kommer inte att kunna importera emulerade spel automatiskt utan att konfigurera emulatorer först. Är du säker på att du vill fortsätta och avsluta importprocessen?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Det finns inga emulatorer konfigurerade i Playnite. Du kan inte importera spel utan att först konfigurera emulatorn och välja lämpliga filtyper. Vill du lägga till några emulatorer nu?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Skanna katalog med Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Välj filer</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Identifiera automatiskt från mapp…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Konfigurera emulatorer…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Skannar…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Skannar {0}...</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Första Gången Konfiguration</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Denna process kommer att vägleda dig genom en automatisk import och konfiguration av externa spelbibliotek. Playnite kan automatiskt importera spel från flera speltjänster, som Steam eller GOG.\r\n\r\nTänk på att du också manuellt kan lägga till ett anpassat eller emulerat spel för någon plattform senare från huvudmenyn.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Bibliotek Integration</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Följande är listan över några kurerade bibliotek integrationer Playnite stöder. Välj de du vill installera.\r\n\r\nFler integrationer kan installeras senare från menyn &quot;Tillägg&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Konfiguration Avslutad</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Den första installationen har slutförts. Kom ihåg att du kan ändra alla inställningar senare samt lägga till ytterligare integreringar från huvudmenyn.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Det gick inte att ladda ner ett eller flera tillägg.\r\n\r\nDu kan försöka ladda om integrationer från tilläggsmenyn efter att guiden först körts.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Laddar ner {0} integration…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Laddar ner lista över rekommenderade integrationer…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Det gick inte att ladda ner listan över rekommenderade integrationer. Du kan försöka ladda ner integrationer igen senare via Addons menyn.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Konfigurera Plattformar och Emulatorer</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Konfigurera emulatorer</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Plattformar</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Plattform</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emulatorer</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Lägg till Plattform</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Välj Ikon</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Välj Omslag</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Välj bild</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Välj Objekt</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Välj Bakgrund</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Välj Fil</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Välj URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Lägg Till Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Platform(ar)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Vill du spara plattformsändringar?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Vill du spara emulatorändringar?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Kör fil</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Argument</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Katalog</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Filtyper</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Importera Emulatorer…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Hämta Emulatorer…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Ladda argumenter förinställda från känd emulatorprofil</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Är du säker på att du vill ta bort {0} emulator?\r\nDen används för tillfället av {1} spel.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Är du säker på att du vill ta bort {0} emulator?\r\nDen används för tillfället av {1} spel och {2} emulator(er).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Inställningar hjälp</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sortera efter</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Sorteringsordning</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Gruppera efter</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Stigande</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Fallande</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Gruppera inte</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Gruppera efter Distribuerare</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Gruppera efter Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Gruppera efter Plattform</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Typ av vy</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Vy</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Utforskar-panel</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Filter-panel</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Ikon</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Biblioteketsikon</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Omslagsbild</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Bakgrundsbild</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Sorteringsnamn</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Leverantör</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Handbok</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Titel</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Installationsenhet</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Kontonamn</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Plattform</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategori(er)</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Genre(r)</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Utgivningsdatum</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Släpptes år</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Utvecklare</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Tag(s)</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Utgivare</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Installationsstatus</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Matcha alla filter</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Om aktiverad, kommer endast spel som använder alla objekt i alla filter att inkluderas i vyn.\r\nOm inaktiverad kommer spel som använder något objekt i något filter att inkluderas i vyn.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Installerad</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Installerad</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Inte installerad</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Dold</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favorit</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Sätt på HDR stöd</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Tänk på att din primära skärm inte stödjer HDR.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Senast Aktivitet</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Beskrivning</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Installationskatalog</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Omslagsbild</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Länk</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Image/ISO Sökväg</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Genre(r)</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Genrer</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Företag</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Bolag</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Utvecklare</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Utvecklare</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Utgivare</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Utgivare</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategorier</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Etikett</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Etiketter</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Funktion</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Funktioner</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Åldersgränser</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Åldersgränser</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Region</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Regioner</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Källkod</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Källor</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Senaste aktivitet</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Databas fel</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Misslyckades med att öppna bibliotekets databas.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Databasen är inte öppen.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Kan inte komma åt biblioteksdatabasen. Fil &quot;{0}&quot; används av en annan process eller är otillgängligt.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Misslyckades med att skapa diagnostikpaket.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Misslyckades med att automatiskt ladda upp paket med felsökningsinformation.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Lyckades skicka felsökningsinformationen.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Diagnostikpaketet har skapats och skickats.\r\nVar vänlig bifoga följande ID i din felanmälan: </sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Misslyckades med att importera spel från {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Misslyckades med att importera spel från {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Kan inte söka efter spel med den valda emulatorns profil. Profilen innehåller inga filtillägg eller plattformar.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite kunde inte starta. Var vänlig stäng alla andra flikar och försök igen.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Kunde inte tillämpa temat &quot;{0}&quot;, färgprofil &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Kan inte öppna länk, URL är inte i giltigt format.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Kunde inte starta programmet.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Det gick inte att initiera webbvykomponent. Playnite kan inte fortsätta med startprocessen.\r\n\r\nMer information på https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Kan inte importera emulatorer på grund av borttappade eller korrupta definitionsfiler.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Kunde inte köra menyåtgärd.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Redigera Speluppgifter</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Bild URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Lägg till Länk</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Lägg till ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Spara Ändringar</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Tillämpa fältändringar på spel(en) som redigeras.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Lägg till Åtgärd</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Ta bort Åtgärd</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Ta bort Startalternativ</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Lägg till Spel</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Skanna katalog…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Uptäck installerade</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Bläddra…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Öpnna Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Profilinställningar</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Spelnamnet kan inte vara tomt.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Spårningskatalog för spel kan inte vara tom.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Spelnamnet kan inte vara tomt innan du söker metadata.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Ogiltig spelinformation</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Ange giltig webbadress http:// eller https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Välj URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Det gick inte att hämta metadata: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Hämtings fel</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Rensa Filter</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Privat konto</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Allmän användare</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API Nyckel</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Startfel</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Tema Fel</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Rensa allt</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Installation pågår...</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Avinstallerar</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Startar</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Körs</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Ogiltig URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Gör inget</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Minimera</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Återställ fönster</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Återställ fönstret endast när det startats från UI.</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Stäng</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Ändra</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Avancerat</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Aldrig</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Status för avklarande</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Status för slutförandet</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Användarbetyg</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Betyg från kritiker</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Övriga användares betyg</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Spelskript</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Applikationsskript</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Skript</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Plugins</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Källor för metadata</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Tillägg</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Tilläggs-ID</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Ladda om skript</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Interaktivt SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Alla skript blev omladdade.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Inga spel hittades för angivna sök-/filterkriterier</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Inga objekt hittades</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Växla till skrivbordsläge</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Avsluta Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Bibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Uppdatera alla</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Skapad av:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Version:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Uppdaterad:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modul:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Bibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Statistik</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Alla</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Ingen</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Aviseringar</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Bredd</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Höjd</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Storlek</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Liten</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Stor</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Större</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Störst</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Standard</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Välj</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Välj alla</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Avmarkera alla</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Första</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Slumpmässigt</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Välj användare</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Ladda mer</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Genomskinlig</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Stäng</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Expandera</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Stäng allt</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Öppna allt</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Annat</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Teman</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Argument till Emulatorn</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Inbyggda argument</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Anpassade argument</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Ytterligare Emulator Arguments</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Skriv över Emulator Arguments</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\"></sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Välj metadata att importera</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Välj Spel för Import</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Metadata sök</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Uppdatering tillgänglig</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Ändringar sedan senaste uppdateringen</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Installera uppdatering</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Sök efter uppdateringar</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Uppdateringsfel</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Misslyckades med att söka efter en ny version.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Ingen ny version hittat, du har den senaste.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Misslyckades med att ladda ner och installera uppdatering.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Någon bakgrundsprocess håller fortfarande på. Är du säker på att du vill avbryta den och fortsätta med uppdateringen?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Någon bakgrundsprocess håller fortfarande på. Är du säker på att du vill avbryta den och stänga av Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Någon bakgrundsprocess håller fortfarande på. Att byta läge kommer att avbryta den, vill du byta läge ändå?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">En uppdatering för Playnite finns tillgänglig</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Uppdatera temalista</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Tillämpa valt tema</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Titta på filändringar</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Använd automatiskt tema när källfilen ändras</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Körtid för skript</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Kör innan du startar ett spel</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Kör efter avslutat spel</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Kör efter ett spel har startats</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Kör vid programstart</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Kör vid programstängning</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Spelet startar skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Spelet startade skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Spelet stoppades skript</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Kör globalt skript</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Global</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrerad</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Nuvarande</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Ny </sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Testa skript</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Visa endast valda.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Spara som standard</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Lägg till i Favoriter</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Ta bort från Favoriter</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Dölj detta spel</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Ta bort från dolda</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Sätt på HDR stöd</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Stäng av HDR stöd</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Ändra…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Beräkna installationsstorlek</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Beräkna installationsstorlek (alla spel)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Beräkna installationsstorlek (endast saknade data)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Installerad storlek</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Ange Kategori…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Ange status för slutförandet</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Ta Bort</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Spela</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Installera</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Spelinställningar</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Detaljer</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Avinstallera</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Bläddra bland Lokalafiler</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Skapa genväg på Skrivbordet</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Öppna manuellt</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Mer</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Hanteras av biblioteketstillägget</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Spelets startprocess kommer att hanteras av det biblioteketstillägg som ansvarar för detta spel.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Ingen relevant information om spelet '{0}' har hittats på den angivna sidan.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Tips! Du kan använda mer avancerad metadatahämtningsprocess medan du redigerar ett spel via menyn &quot;Redigera&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Ej tillgänglig när annan process pågår.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Beskrivning text är HTML-syntax känslig</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Speltid registreras i sekunder.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Installationsstorleken är angiven i bytes.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Publiceringsdatum måste anges i &quot;år-månad-dag&quot; format. Månad och Dag värden kan utelämnas.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Värde mellan 0 till 100 eller tom för inget betyg.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Kod, lokalisering och andra bidragsgivare i ingen särskild ordning:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Avbryt övervakning av spel?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Installationsövervakning pågår för närvarande. Vill du avbryta processen och returnera spelet till föregående tillstånd?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Övervakningen av spelet körs för närvarande. Vill du avbryta processen och returnera spelet till föregående tillstånd?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Speltid</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Senast spelat</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}d {1}h {2}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}h {1}m</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} minuter</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} sekunder</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Aldrig spelat</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Öppnar skrivbordsläge…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Öppnar helskrärmsläge…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Laddar spelbibeliotek…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Beräknar installationsstorlek…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Beräknar installationsstorlek för {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Det gick inte att installera skriptfilen.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Skriptet har installerats.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Installera skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Fel i skript</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Kunde inte köra aktuell funktion i utökningen.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Öppna katalog för metadata</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Beräkna</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Beräknar automatiskt installationsstorleken med hjälp av ROMs om spelet har någon eller installationskatalogen om den har ställts in</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0}-klienten är inte installerad.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0}-klienten kommer nu att öppnas. Var vänlig logga in där och stäng sedan detta meddelande.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Väntar på inloggning, var vänlig stäng detta fönster när du är färdig…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Kunde inte hitta installationskatalogen för spelet.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Ogiltig konfiguration för spelhandlingar.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Felsökning gällande synkronisering av konto</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Felsökning av problem</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Ändra namn på post</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Lägg till en ny post</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Ange namn</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Ange nytt namn</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Mindre än en timme</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 till 10 timmar</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 till 100 timmar</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 till 500 timmar</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 till 1000 timmar</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite måste startas om för att slutföra installationen. Vill du starta om nu?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Tillägg är inte paketerat på rätt sätt.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Tema är inte paketerat på rätt sätt.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">{0} tillägget lyckades inte ladda in korrekt.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\"></sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\"></sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Installationen lyckades.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Installera tillägg?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Allmänt </sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Misslyckades med att installera tillägget.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Är du säker på att du vill installera ett nytt tillägg?\r\n\r\n{0}\r\nAv {1}\r\nVersion {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Är du säker på att du vill uppdatera &quot;{0}&quot; tillägget?\r\n\r\nNuvarande version: {1}\r\nNy version: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Misslyckades med att installera temat.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Är du säker på att du vill installera ett nytt tema?\r\n\r\n{0}\r\nAv {1}\r\nVersion {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Är du säker på att du vill uppdatera &quot;{0}&quot; temat?\r\n\r\nNuvarande version: {1}\r\nNy version: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Prestandavarning</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Visa Inte Igen</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Fil med tillägget {0} är inte kompatibel.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Inkompatibel filändelse</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Den valda bilden kan vara för stor för optimal prestanda </sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Standard tema kan inte avinstalleras.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Temat funkar inte med denna version av Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Installationsmapp</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Datamapp </sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\"></sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\"></sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Vad är det här?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Är du säker på att du vill göra detta?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Total speltid</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Genomsnittlig speltid</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Högsta speltid</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Total installations storlek.</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Överblick</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Sidofält</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Återställ inställningar </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\"></sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Prestationer</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Nyheter</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Butikssida</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Den inledande installationen är inte färdig. Playnite kommer nu starta om till Skrivbordsläge för att slutföra processen.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Senast spelade</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favoriter</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Mest spelade</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Alla</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Filter är aktiva.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Sökresultat för:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">En post med samma namn existerar redan.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\"></sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Välj en annan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\"></sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Installerad</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Tilläggsinställningar</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Bläddra</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Uppdateringar</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Uppdateringar ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Hantering av installerade tillägg och teman, inklusive deras inställningar, har flyttats till en ny &quot;tillägg&quot;-meny.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Alla nu installerade biblioteksintegrationstillägg kan konfigureras här.\r\n\r\nOm du vill installera eller avinstallera ytterligare integreringar, använd alternativet &quot;Tillägg&quot; från huvudmenyn.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Skrivbordsteman</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Helskärmsteman</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Söker…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Tillägg är inte kompatibelt med denna version av Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Det gick inte att ladda ner installationspaketet för tillägg.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Det gick inte att ladda ner installationsmanifestet för tillägg.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Omstart av programmet krävs för att tillämpa väntande ändringar.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Det här tillägget är schemalagt för installation.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Installera</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Ominstallera </sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Avinstallera</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Redan installerad</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Inga nya tilläggsuppdateringar hittades.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Uppdatera tillägg</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Ändringslogg är inte tillgänglig</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Schemalagd för installation</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Nedladdning misslyckad</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Licensen avvisades</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Hämtar {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Söker efter tilläggsuppdateringar…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Letar efter uppdateringar.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Ett eller flera tilläggsuppdateringar finns tillgängliga.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Välj objekt att uppdatera</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Expansion för tilläggsutveckling</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} licensavtal</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Godkänn</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Avböj</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Inkludera aktiviteter för biblioteksintegrering</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Välj åtgärd</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Spårningsläge</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\"></sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Länk</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Fil</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emulator</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Skript</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Förinställd</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Bearbeta</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Mapp</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Ursprunglig process</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Logga spårningsmeddelanden</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Efter ändringar skriver du över data för alla valda spel!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Ingen</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Enhetlig</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Endast objekt</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Endast start och slut</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Scrollkänslighet</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Mjuk rullning</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\"></sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\"></sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Flytta huvudmenyknappen till sidofältet</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Slumpmässig spelväljare</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\"></sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\"></sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\"></sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Utrymme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Bildrenderingsskalare</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternativ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Balanserad</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Kvalitet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Kvalitet:\r\nBästa bildkvalitet, långsam, hög minnesanvändning.\r\n    \r\nBalanserad:\r\nBra kvalitet, snabb, låg minnesanvändning.\r\n    \r\nAlternativ:\r\nBättre kvalitet, medelhög hastighet, låg minnesanvändning.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Välj fil…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Välj mapp…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Uppstartsskript</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Observera att både tillägg och teman i hög grad kan påverka Playnites prestanda, stabilitet och säkerhet.\r\n    \r\nOm du börjar uppleva några problem efter att du installerat ett tema eller ett tillägg, försök avaktivera/avinstallera dem först för att se om de är roten till problemet.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Välj vid uppstart</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Välj vid uppstart</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Inbyggda profiler</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Inbyggd profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Anpassade profiler</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Hanteras av inbyggt skript</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Specifikation för emulator</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\"> Specifikation för plattformen</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Specifikation för region</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Kör innan emulatorn startas</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Kör efter emulatorn startad</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Kör när emulatorn avslutats</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Emulator: körbar fil hittades inte.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Emulatorspecifikation hittades inte.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Emulatorns startskript hittades inte.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Dela som separata spel</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Slå ihop till ett spel</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Ange plattform</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Ange region</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Skanna mapp</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Skanna konfigurationer</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Uteslut mönster från checksummaskanning</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Filer som matchar angivna mönster kommer inte att skannas efter kontrollsumma och kommer att matchas med filnamn. Se emulatorns hjälpsida för mer information.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Skanna med emulator</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Du måste ange ett namn när du sparar ny konfiguration.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Emulator eller emulatorprofil är inte vald.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Katalog att skanna är inte angiven eller så finns den inte.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Skanning av konfigurationen är inte korrekt inställd.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Inkludera i massskanning automatisk skanning</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Det gick inte att söka efter emulatorer.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Det gick inte att skanna mapp(er) efter emulerade spel.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Dölj importerade</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Profiler att importera:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Autoskanna konfigurationer</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Spara som autoskannings-konfiguration</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Sparar konfiguration för senare användning under biblioteksuppdatering. Sparade konfigurationer kan hanteras via menyn &quot;Konfigurera emulatorer&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Importera med relativa sökvägar</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Om möjligt importera spelfiler med sökvägar i förhållande till Playnites installationsmapp eller emulatorns installationsmapp.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Skanna undermappar</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Skanna inuti arkiv</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Lägg till skanner</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\"></sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\"></sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\"></sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\"></sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\"></sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\"></sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\"></sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\"></sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\"></sys:String>\r\n    <sys:String x:Key=\"LOCOpen\"></sys:String>\r\n    <sys:String x:Key=\"LOCActivate\"></sys:String>\r\n    <sys:String x:Key=\"LOCAssign\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\"></sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Gå till detaljer</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Spelmeny</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Redigera spel</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Öppna sök</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Sökruta</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Sökknapp</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Primär spelåtgärd</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Sekundär spelåtgärd</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F öppnar global sökning istället för att fokusera sökruta</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Spara spelfilterinställningar mellan söksessioner</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Sökleverantörer</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Standard nyckelord</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Anpassat nyckelord</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Systemövergripande genväg</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite-sökning</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Tilläggsinställningar</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Undantag</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Exkluderade filer i förhållande till skanningsmappen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Uteslutna mappar i förhållande till skanningsmappen</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Lägg till fil i uteslutningslistan</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Lägg till mapp i uteslutningslistan</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Undantag kan endast läggas till i sparade skanner-konfigurationer.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Undantag har lagts till i &quot;{0}&quot; skanningar.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Åsidosätt plattform</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">När den är inställd, kommer skannern tilldela denna plattform till alla spel, skriva över alla automatiskt upptäckta plattformar.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Inkludera kommandon i standardsökningen</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">När inaktiverad kommer kommandon inte att inkluderas i standardsökningen förrän # prefix används.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\"></sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Fält som ska visas för spelresultat:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Dold status</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Säkerhetskopiering av data avbröts.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Säkerhetskopiering av data misslyckades.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Fel vid säkerhetskopiering</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Säkerhetskopiering av data pågår…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Återställer data från säkerhetskopia…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Det gick inte att återställa data från säkerhetskopian.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Inställningar</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Spelbibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Media för spelbibliotek</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Installerade tillägg</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Tilläggsdata</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Installerade teman</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Välj data som ska återställas från angiven säkerhetskopia.\r\n    \r\nPlaynite startar automatiskt om för att starta säkerhetskopieringsprocessen.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Välj objekt som ska inkluderas med säkerhetskopiering av data. Applikationsinställningar och spelbiblioteksdata ingår som standard.\r\n    \r\nPlaynite startar automatiskt om för att starta säkerhetskopieringsprocessen.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Automatisk säkerhetskopiering av data</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Automatisk säkerhetskopieringsfrekvens</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Säkerhetskopieringsmapp</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Roterande säkerhetskopior</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Inkludera ytterligare data:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\"></sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\"></sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\"></sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\"></sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\"></sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\"></sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\"></sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\"></sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\"></sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\"></sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\"></sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\"></sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\"></sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/tr_TR.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Türkçe</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite dili</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Çıkış</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Filtre Etkin</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Filtre Devre Dışı</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Ek filtreler</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Filtreler</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Filtrele</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Geçersiz Veri</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Değişiklikleri Kaydet?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Web Adresi: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">GitHub: Kaynak Kodu</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Tanılama paketi oluştur</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Tanılama bilgisini gönder</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Playnite Hakkında</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Josef Němec tarafından yapılmıştır</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Kategori Ata</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Kategorileri Ayarla</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Kategori Ekle</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">İşaretli - Kategoriye ata\r\nİşaretsiz - Kategoriyi kaldır\r\nBelirsiz - Değişiklik yok (birden fazla oyun düzenlenirken)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Kategori Yok</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Platform Yok</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Amanın! Bir şeyler ters gitti…</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Kurtarılamaz bir hata oluştu.\r\n \r\nBu sorunu çözmemize yardımcı olmak istiyorsanız, lütfen çökmeden önce gerçekleştirilen eylemleri kısaca açıklayın ve ardından bir tanı bilgisi gönderin. Çevrimiçiyseniz, paket, analiz için Playnite sunucusuna yüklenecektir.\r\n\r\nAlternatif olarak, GitHub'da yeni bir sorun oluşturmak ve çöküşü elle bildirmek için 'Çökme Bildir' düğmesini kullanabilirsiniz.\r\n\r\nYardımınız için teşekkürler.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">&quot;{0}&quot; uzantısı, kurtarılamaz bir hataya neden oldu.\r\n\r\nGünlük dosyasını kaydetmenizi ve sorunu uzantının geliştiricisine bildirmenizi öneririz. Sorun tekrarlanmaya devam ederse, uzantıyı devre dışı bırakın.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">&quot;{0}&quot; uzantısı, kurtarılamaz bir hataya neden oldu.\r\n\r\nSorunu uzantının geliştiricisine bildirmenizi öneririz. Sorun tekrarlanmaya devam ederse, uzantıyı devre dışı bırakın.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Bilinmeyen uzantı veya tema, kurtarılamaz bir hataya neden oldu.\r\n\r\n3. taraf eklentileri devre dışı bırakmanızı, sorunlu olanı ayırmanızı ve sorunu eklentinin geliştiricisine bildirmenizi öneririz.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Kurtarılamaz hata oluştu.\r\n        \r\nBu sorunu çözmemize yardımcı olmak için lütfen tanılama bilgilerini gönderin. Teşekkürler.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Uzantıyı devre dışı bırak</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Günlük dosyasını kaydet</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Tanılama bilgilerini gönder</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Çökmeyi Raporla</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Playnite'ı Yeniden Başlat</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Güvenli Modda Yeniden Başlat</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Tüm üçüncü parti uzantılarını devre dışı bırak ve varsayılan temayı kullan.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Playnite Çıkış</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Çökmeden önce yapılan eylemler (İngilizce olarak açıklayın):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Kütüphane Yöneticisi</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Oyun(lar) Kaldırılsın mı?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Kaldırılamıyor - Oyun veya kurulum çalışıyor. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Kaldırılamıyor - Oyun çalışıyor.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">{0} isimli oyunu kaldırmak istediğinize emin misiniz?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">{0} oyunu kaldırmak istediğinize emin misiniz?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">{0} adlı oyunu listeden çıkarmak istiyor musunuz?\r\n\r\n&quot;Hariç tutulanlar listesine ekle&quot; seçeneği, bir sonraki kütüphane güncellemesinde oyunun tekrar içeri aktarılmasını engelleyecektir.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">{0} oyunu kaldırmak istediğinizden emin misiniz?\r\n\r\n&quot;Hariç tutulanlar listesine ekle&quot; seçeneği, bir sonraki kütüphane güncellemesinde oyunun tekrar içeri aktarılmasını engelleyecektir.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Şu anda kullanımda olmayan {0} girdiyi kaldırmak istediğinizden emin misiniz?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Kullanılmayan alan bulunamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Evet (hariç tutulanlar listesine ekle)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Bu bölümde kaydedilmemiş değişiklikler var</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Oyun kütüphanesi biçimi güncelleniyor…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Veritabanı güncellemesi başarısız.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Oyun kütüphanesi güncellenemiyor. {0} MB boş alan gerekiyor.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">OyunHatası</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Oyun başlatılamıyor. '{0}' veritabanı üstünde bulunamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Oyun başlatılamıyor: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Eylem başlatılamıyor: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Oyun konumu açılamıyor: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">{0} isimli oyunun kurulum boyutu bulunamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">İndirme boyutu taraması başarısız</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">İndirme boyutu taranırken {0} hata bulundu</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Kısayol oluşturulamadı: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">El ile açılamadı: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Oyun kurulamıyor: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Oyun kaldırılamıyor: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Geçerli oyun başlatma eylemi bulunamadı. Emülatör eylemlerini kullanırken, platform tanımlarının oyun ve emülatör ayarları arasında uyuştuğuna emin olun.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Kurulum uygulaması mevcut değil.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Bu oyundan sorumlu kütüphane eklentisi devre dışı bırakılmış veya kurulmamış.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Resmi üst veri indirmesi mevcut değil.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Hiçbir oyun seçilmedi.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Oyun betiği çalıştırılamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Uygulama betik yürütme başarısız.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Genel betik eylemi çalıştırılırken hata.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Emülatör betik yürütme başarısız.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Oynatma betik eylemi çalıştırılırken hata.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 veya yeni sürüm kurulu değil.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Oyunun nasıl başlatılacağı belirlenemedi.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Etkin</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Devre dışı</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Kullanılmayanı kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Adlandır</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Kopyala</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Ekle</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Varsayılan Simge</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Varsayılan Kapak Resmi</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Varsayılan Arka Plan</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Bitir</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">İleri</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Geri</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">TAMAMLANDI</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">GERİ</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">TEMİZLE</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Temizle</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Yoksay</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Tümünü Yoksay</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">İçe aktar</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">İsim</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Yazar</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Modül</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Seriler</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Sürüm</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Son Oynanma</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Çok Oynanan</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Oynanma Sayısı</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Kurulu Boyut</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Klasör</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Notlar</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Eklenme</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Eklenme Tarihi</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Değiştirilme</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Değiştirilme Tarihi</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Web Sayfası</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Yol</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">TAMAM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Kaydet</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Kapat</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">İptal</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Onayla</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Sıfırla</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Evet</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Hayır</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Hoş geldiniz</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Yerel Kullanıcı</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Genel</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Medya</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Bağlantılar</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Kurulum</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Eylemler</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">İndiriliyor…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Medya indiriliyor…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Yükleniyor…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Tür</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Profil</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Profiller</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">İndir</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Ara</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Çözünürlük:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Herhangi</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Yakınlaştır</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Liste Görünümü</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Kapaklar</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Izgara Görünümü</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Ayrıntılı Görünüm</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Özel</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Özel teşekkürler</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Lisans</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Katkıda Bulunanlar</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Playnite'den Çıkılıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Bugün</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Dün</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Pazartesi</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Salı</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Çarşamba</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Perşembe</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Cuma</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Cumartesi</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Pazar</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Geçen Hafta</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Geçen Ay</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Geçen Yıl</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Bir yıldan fazla</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 ila 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB ila 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB ila 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB ila 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB ila 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB ila 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB ila 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB veya daha fazla</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Aktarma başarıyla tamamlandı.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Tüm Oyunlar</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Oyun Kimliği</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Veritabanı Kimliği</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Ön Ayarlar</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Sütun</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Sütunlar</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Satır</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Satırlar</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Oyna işleminden simge alınamadı. Mevcut Dosya türü eylemi yok.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Sadece eksik olan üst veriyi indir</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Bu seçeneğin etkinleştirilmesi, zaten bilgi içeren veri alanları için üst verileri indirmeyi atlar.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Oyun seçimi</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Lütfen hangi oyunların yeni üst verilerle güncellenmesi gerektiğini seç:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Veritabanı üstündeki tüm oyunlar</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Filtrelenmiş tüm oyunlar</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Sadece seçili oyunlar</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Hiçbir üst veri alanı seçilmedi</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">İndirme için hiçbir üst veri alanı seçilmedi. Lütfen en az birini seçin ve bunun için en az bir üst veri sağlayıcısını etkinleştirin.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Resmi Mağaza</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Lütfen Playnite tarafından hangi alanların otomatik olarak doldurulacağını ve verileri almak için hangi kaynakların kullanılması gerektiğini seçin.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Lütfen yukarıdaki logoya tıklayıp Playnite'ın kullandığı verileri geliştirmek için igdb.com veritabanı güncellemelerine katkıda bulun.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Üst veriler indiriliyor…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Kurulu oyunlar içeri aktarılıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">{0} oyunları içe aktarılıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">{0} kaynağından emülatör oyunları içe aktarılıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Kütüphane güncellemeleri indiriliyor…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Kütüphanedeki oyunların boyutu hesaplanıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">İçe aktarılan oyunların boyutu taranıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Kütüphane güncellemesi bitti</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Kaynaklar serbest bırakılıyor…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Yapılandırma</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Ayarlar…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Platform ve Emülatörler</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Emülatörleri Yapılandır…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Kütüphane Yöneticisi…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Araçlar</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Üst Verileri İndir…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Yazılım Araçları…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Bütünleşmeleri Yapılandır…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Üçüncü Parti İstemci Aç</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Üçüncü Parti İstemciler</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Oyun Kütüphanesini Güncelle</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Kütüphane Güncellemesini İptal Et</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Emülatör Klasörleri Güncelle</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Oyun Ekle</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">El İle…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Otomatik Tara…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Emülatör Oyunu…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Mağaza Uygulaması…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Playnite Hakkında</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Geri Bildirim Gönder</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Tam Ekran Kipine Geç</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Bağlantılar</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Yardım</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Patreon'da Destekle</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Ko-fi üzerinden destekle</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Kullanım kılavuzu</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK Belgelendirmesi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Sistemi Yeniden Başlat</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Sistemi Kapat</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Sistemi Askıya Al</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Sistemi Hazırda Beklet</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Sistemi Kilitle</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Oturumu Kapat</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Rastgele Bir Oyun Seç</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Ayrıntılar panelinde görüntülenecek oyun alanları:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Öğe aralığı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Izgara öğesi arka planını çiz</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Izgara öğesi sınır genişliği</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Eksik oyun simgesi kaynağı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Eksik oyun kapak kaynağı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Eksik oyun arka plan kaynağı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Oyun ayrıntılarına dikey boşluk</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Izgara görünümü ayrıntı konumu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Ayrıntılı görünüm oyun listesi konumu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Paneller arası ayraç koy</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Oyun kapak görseli yüksekliği</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Oyun listesi simge yüksekliği</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Uygulama yazı tipi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Eş aralıklı yazı tipi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Filtre paneli konumu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Gezgin paneli konumu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Kapak fotoğrafı işleme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Hedef en boy oranı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Aşağıdaki seçenekler tam ekran kipinde kare işlemeyi etkiler!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Uzatma kipi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD Kutusu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Mağazası</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Kare</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam Afişi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam dikey kapak</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Uygulanması için yeniden başlatılmalı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Ayarlar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Genel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Üst Panel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Görünüm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Oyun Ayrıntıları</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Düzen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Gelişmiş</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Tam Ekran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Girdi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Performans</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Üst Veri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Güncellemeler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Ara</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Yedekle</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Kütüphane Verisini Yedekle</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Veri Yedeğini Geri Yükle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Kütüphanedeki değişiklikleri otomatik içeri aktar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Geçersiz veritabanı dosyası konumu, uygun dosya yolu ayarlanmalıdır.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Hesap adı boş bırakılamaz.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Oyunları içeri aktardıktan sonra üst verilerini indir</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Simge durumunda başlat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Playnite bilgisayar açıldığında başlasın</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Sistem tepsisinde başlat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Bilgisayar başladığında başlatmak için Playnite kaydı yapılamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Tam ekran kipinde başlat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Görüntüleri arka planda yükle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Daha yavaş görüntü yükleme süreleri karşılığında oyun listelerinin kaydırma akıcılığını artırır.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Kapak resmi eksik olduğunda oyunun adını göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Izgara görünümünde oyun adlarını göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Kurulu olmayan oyunları koyulaştır</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Oyun simgelerini Liste görünümünde göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Grup açıklamalarında öğe sayısını göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Filtre ve gezgin panellerinde yalnızca atanmış alanları göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Donanım hızlandırmayı devre dışı bırak</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Takılma veya benzeri kullanıcı arayüzü sorunları yaşarken kullanın</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Hızlı başlatma listelerinde gizli oyunları göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Sağ tıklama menüsü listesini ve sistem tepsisi listesini etkiler.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Hızlı başlatma öğelerinin sayısı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Oyun arka planını pencere arka planı olarak kullan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Arka planı bulanıklaştır</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Yüksek Kalite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Arka planı karart</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Izgara görünümünde göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Tema Profili</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Tam Ekran Tema</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Tam Ekran Tema Profili</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Veritabanı Konumu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Oturum durumu:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite Ayarları</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Web önbelleğini temizle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Hesapları bağlarken karşılaşılan sorunları çözebilir.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Sistem tepsisi simgesini göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Sistem tepsisine küçült</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Uygulama penceresi kapatıldığında sistem tepsisine küçült</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Oyun başladığında:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Oyun kapandıktan sonra:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Oynama süresini ifade etmek için oynanan gün sayısını biçimlendir</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Tarih biçimleri:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Bu sizi bağlı tüm servislerden çıkarır. Uygulamanın yeniden başlatılması gerekiyor, devam etmek istiyor musunuz?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Önbelleği Temizle?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Yeni temayı uygulamak için playnite yeniden başlatılmalıdır</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Daha fazla tema edin</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Yeni tema oluştur</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Daha fazla uzantı al</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Yeni uzantı oluştur</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Playnite'ı çevirmemize yardımcı olun</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Yeni ayarların uygulanması için Playnite'ın yeniden başlatılması gerekiyor. Şimdi yeniden başlatılsın mı?\r\n\r\nYeniden başlatmak, halihazırda devam etmekte olan tüm etkin görevleri (indirmeleri) iptal edecektir.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Playnite yeniden başlatılsın mı?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite, kütüphane dosyalarınızı otomatik olarak taşıyamaz. Konumu değiştirmeden önce dosyaları el ile taşımanız/kopyalamanız gerekir. Hedef konumda kütüphane yoksa, yeni bir tane oluşturulacaktır.\r\n\r\nPlaynite yeniden başlatılıncaya kadar yeni veritabanı konumu kullanılmayacaktır. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">&quot;Kapat&quot; eylemi ayarlı ise, oynama zamanı kaydedilmeyecek.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Satır sayısı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Sütun sayısı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Ayrıntı görünümü satır sayısı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Arkaplan Resmini Ana Ekranda Göster</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Üst verileri yeniden indirmeden mevcut oyunlara geriye dönük olarak uygulanmaz.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Kütüphanedeki oyunların oynanış sürelerini aktar:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Playnite veritabanındaki oyunlar için kütüphane eklentileri tarafından raporlanan oynatma süresini Playnite tarafından ne zaman içe aktaracağını yapılandırır. Bu özelliğin kullanılabilmesi için oyunlardan sorumlu kütüphane eklentilerinin desteği gereklidir.\r\n\r\nHer Zaman: Playnite veritabanındaki yeni içe aktarılan ve mevcut oyunlar için oyun süresini içe aktarır.\r\nYalnızca yeni içe aktarılan oyunlar için: Oynatma süresini yalnızca yeni içe aktarılan oyunlar için içe aktarır.\r\nAsla: Hiçbir koşulda oyun süresini içe aktarmaz.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Her zaman</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Sadece yeni aktarılan oyunlar için</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Asla</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Masaüstü modunda oyun kolu desteğini etkinleştirin</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Rehber düğmesi Tam ekran kipi açar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Yeni içe aktarılan oyunlar için otomatik üst veri indirme ayarları.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Hedef ekran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Her zaman birincil ekranı kullan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Oyun Başlıklarını Göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Pil Durumunu Göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Pil Yüzdesini Göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Saati Göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">İmleci gizle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Hızlı Filtrelerde Sadece Kurulu Oyunlar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Düğme İstemleri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Düzen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Yatay Kaydırma</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Alt bölümlerden birini seçin</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Kullanılabilir ayar yok</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Ayarlar yüklenemedi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Bu betikler kütüphanedeki her oyun için çalıştırılır. Oyun ayrıntıları değiştirilerek, her oyuna ayrı bir betik ataması da yapılabilir.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Arka plan resim geçişini canlandır</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Yazı tipi boyutları</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Otomatik</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Takma Adlı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Gri tonlama</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">İdeal</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Ekran</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Metin biçimlendirme kipi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Yazı işleme kipi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Metin oluşturma ve biçimlendirme yöntemleri şu anda oyun açıklamaları için kullanılmamaktadır.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Arka plan resimlerini önceden yükle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Etkinleştirilirse, Playnite üst verileri indirirken arka plan resmini indirir. Bu şekilde daha fazla disk alanı kullanır ancak resmi çevrimdışı kullanılabilir.\r\n\r\nDevre dışı bırakılırsa, arka plan resmi yalnızca ilk ihtiyaç duyulduğunda indirilir. Daha az alan kullanır, ancak resim gösterilmeden önce bir gecikmeye neden olabilir ve bazı resimler çevrimdışı olunduğunda kullanılamayabilir.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Oyundan çıktıktan sonra üçüncü parti istemciyi otomatik kapat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">İstemci otomatik kapatma gecikmesi (saniye)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Oyun oturumu bu süreden kısa ise kapatılmasın (saniye)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Aşağıdaki istemcileri otomatik kapat:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">İstemcileri Otomatik Kapat</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Hariç Tutulanlar Listesi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Çok büyük oyun ortamı atandığında uyarı göster</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Klasör açma komutu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Tercih edilen yaş derecelendirme kuruluşu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Kütüphane güncellenirken oyunların kurulum boyutunu güncelle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Son taramadan bu yana değişen dosyalar tespit edildiğinde oyunların kurulum büyüklükleri tekrar hesaplanır</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Hiçbiri</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Doldur</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Üniforma</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Doldurmak için oranı koru</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Sol</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Sağ</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Üst</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Alt</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">İçe Aktarım Hatası</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Doğrulama gerekli</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Kimlik doğrulama başarısız oldu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Alternatif web görünümü oluşturma modu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Web görünümleriyle ilgili sorunlarla karşılaştığınızda kullanın, örneğin entegrasyon kimlik doğrulama iletişim kutuları.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Çok uzun oyun tanımlarını kısmen yükle</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Çok uzun açıklamalar, oyun seçimini değiştirirken fark edilir ölçüde gecikmelere yol açabilir.\r\n\r\nEtkinleştirildiğinde, ilk başta açıklama metninin bir kısmı yüklenecek, metnin geri kalanı istendiğinde ekrana getirilebilecektir.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Üst Veriyi İçe Aktar</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Üst Veri İndir</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Gelecekteki üst veri indirme işlemi için kullanılacak seçili yapılandırmayı ayarlayın.\r\nAynı zamanda uygulama ayarlarından da değiştirilebilir.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Emülatör İçe Aktarma Sihirbazı</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Bu sihirbaz, hem konsol emülatörlerini indirme ve içe aktarma hem de emülatör oyunlarını içe aktarma süreçlerinde size rehberlik edecektir.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Her zaman ek emülatör ve/veya oyunları ana menüden (Emülatör ayarları için &quot;Kütüphane&quot; menüsü altında ve emülatör oyunları için &quot;Oyun Ekle&quot; menüsü) ekleyebileceğinizi unutmayın.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Playnite tarafından otomatik olarak tanınan ve yapılandırılabilen emülatörlerin bir listesi bulunmaktadır. Kurulumları web sitelerinden indirebilirsiniz. Emülatörler kurulduktan sonra (el ile), emülatör yapılandırma menüsünden bunları içe aktarabilirsiniz.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">'Klasörden Otomatik Algıla…'  düğmesini tıklayarak PC'nizde kurulu olan tüm emülatörleri içe aktarabilirsiniz. Playnite, seçilen klasörde bilinen emülatörler için arama yapacak ve bunları içe aktarma seçeneği sunacaktır. Emülatörleri farklı klasörlerden içe aktarmak için bu düğmeyi birden çok kez kullanabilirsiniz. Emülatörler mevcut listenin altına eklenecektir.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">'Emülatörü Kullanarak Klasörü Tara' düğmesini tıklayarak oyunları içe aktarabilirsiniz. Uygun emülatörün seçilmesi, Playnite'a hangi dosya türlerinin taranması ve içe aktarılması gerektiğini söyleyecektir. Oyunları farklı klasörlerden içe aktarmak için bu düğmeyi birden çok kez kullanabilirsiniz. Oyunlar, mevcut listenin altına eklenecektir.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">İçe aktarma için seçilen emülatör yok. Emülatörü yapılandırmadan, oyunları otomatik olarak içe aktaramazsınız. İçe aktarma işlemini iptal ederek, devam etmek istediğinizden emin misiniz?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Playnite'da yapılandırılmış emülatör yok. Emülatörü yapılandırmadan ve uygun dosya türlerini seçmeden önce oyunları içe aktaramazsınız. Şimdi emülatör eklemek ister misiniz?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Emülatör kullanarak klasörü tara</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Dosyaları seç</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Klasörden Otomatik Algıla…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Emülatörleri Yapılandır…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Taranıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Taranıyor {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">İlk Kez Yapılandırma</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Bu sihirbaz, harici oyun kütüphanelerinin otomatik olarak içe aktarılması ve yapılandırılması sürecinde size yol gösterecektir. Playnite, Steam veya GOG gibi birden çok oyun hizmetinden oyunları otomatik olarak içe aktarabilir ve ayrıca uygulama başlatıldığında otomatik olarak güncelleyerek kütüphanenizi güncel tutabilir.\r\n\r\nDaha sonra ana menüdeki 'Playnite' düğmesine tıklayarak herhangi bir platform için herhangi bir özel oyunu el ile ekleyebileceğinizi unutmayın.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Kütüphane Entegrasyonu</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Aşağıda listelenen hizmetlerden oyunları otomatik olarak içe aktarın. Daha sonraki herhangi bir oyun değişikliği (Kurulum Durumu) Playnite başlangıcında veya manuel olarak tetiklendiğinde otomatik olarak güncellenecektir. Seçilen ayarlar ilk ve sonraki tüm içe aktarımları etkileyecektir.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Yapılandırma Tamamlandı</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">İlk kurulum tamamlandı. Tüm ayarları daha sonra 'Ayarlar' menüsünden değiştirebileceğinizi unutmayın.\r\n\r\nPlaynite logo menüsünü tıklayarak daha sonra başka bir oyun da ekleyebilirsiniz.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Bir veya daha fazla uzantı indirilemedi.\r\n\r\nİlk çalıştırma sihirbazı tamamlandıktan sonra eklentiler menüsünden uzantıları yeniden indirmeyi deneyebilirsiniz.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">{0} tümleştirmesi indiriliyor…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Önerilen tümleştirmelerin listesi indiriliyor…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Önerilen tümleştirmelerin listesi indirilemedi. Tümleştirmeleri daha sonra Eklentiler menüsü aracılığıyla deneyebilir ve yeniden indirebilirsiniz.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Platformları ve Emülatörleri Yapılandır</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Emülatörleri yapılandır</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Platformlar</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Emülatörler</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Emülatör</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Platform Ekle</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Simge Seç</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Kapak Seç</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Resim Seç</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Öğe Seç</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Arka Plan Seç</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Dosya Seç</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">URL Seç</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Emülatör Ekle</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Desteklenen Platform(lar)</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Platform değişikliklerini kaydetmek ister misiniz?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Emülatör değişikliklerini kaydetmek ister misiniz?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Uygulama</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Değişkenler</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Çalışma Dizini</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Desteklenen Dosya Türleri</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Emülatörleri İçe Aktar …</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Emülatörleri İndir…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Bilinen emülatör profilinden önceden belirlenmiş değişkenleri yükleyin</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">{0} emülatörünü kaldırmak istediğinizden emin misiniz?? \r\nŞu anda {1} oyun tarafından kullanılıyor.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">{0} platformunu kaldırmak istediğinize emin misiniz? \r\nŞu anda {1} oyun ve {2} emülatör tarafından kullanılıyor.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Ayarlar yardım</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sırala</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Sıralama Yönü</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Gruplandır</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Artan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Azalan</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Gruplama</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Kütüphaneye göre grupla</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Kategoriye göre grupla</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Platforma göre grupla</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Görünüm Türü</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Görünüm</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Keşif Paneli</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Filtre Paneli</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Simge</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Kütüphane Simgesi</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Kapak Resmi</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Arka Plan Resmi</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Sıralama İsmi</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Kütüphane</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Kılavuz</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">İsim</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Kurulum Sürücüsü</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Hesap Adı</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Platform</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Tür</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Çıkış Tarihi</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Çıkış Yılı</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Geliştirici</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Etiket(ler)</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Yayımcı</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Kurulum Durumu</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Tüm filtreleri eşleştir</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Etkinleştirilirse, yalnızca tüm filtrelerdeki tüm öğeleri kullanan oyunlar görünüme dahil edilir.\r\nDevre dışı bırakılırsa, herhangi bir filtredeki herhangi bir öğeyi kullanan oyunlar görünüme dahil edilir.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Kurulu</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Kurulu</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Kurulu değil</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Gizli</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Favori</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">HDR Desteğini Aç</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Aktif olduğunda, bir oyun başlatmadan önce ana ekranda HDR etkinleştirilecektir.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Ana ekranınızda HDR desteği mevcut değil.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Son Oynanma</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Açıklama</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Kurulum Klasörü</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Kapak Resmi</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Bağlantılar</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Kalıp, ROM veya ISO Dizini</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Tür</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Türler</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Şirket</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Şirketler</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Geliştirici</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Geliştiriciler</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Yayımcı</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Yayımcılar</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Kategori</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Kategoriler</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Etiket</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Etiketler</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Özellik</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Özellikler</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Yaş Sınırı</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Yaş Sınırı</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Bölge</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Bölgeler</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Kaynak</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Kaynaklar</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Son Etkinlik</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Veritabanı Hatası</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Kütüphane veritabanı açılamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Veritabanı açılmadı.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Kütüphane veritabanına erişilemiyor. &quot;{0}&quot; dosyası başka bir işlem tarafından kullanılıyor veya erişilemeyen bir konumda.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Tanılama paketi oluşturulamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Tanılama paketi otomatik olarak yüklenemedi.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Form bilgisi başarılı bir şekilde gönderildi.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Tanılama paketi başarıyla oluşturuldu ve gönderildi.\r\nLütfen sorun raporunuza aşağıdaki kimliği ekleyin:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">{0} konumundan oyun içe aktarılamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Emülatör oyunları {0}'den içe aktarılamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Seçilen emülatör profiline göre oyunlar aranamıyor. Profilde herhangi bir dosya uzantısı veya platform bulunmuyor.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite başlatılamadı. Lütfen diğer tüm örnekleri kapatın ve tekrar deneyin.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">&quot;{0}&quot; teması, renkli profil &quot;{1}&quot; uygulanamadı\r\n \r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Bağlantı açılamıyor, URL geçerli biçimde değil.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Uygulama başlatılamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Web görüntüleyici bileşeni başlatılamadı. Playnite, başlangıç sürecini devam ettiremiyor.\r\n\r\nBilgi için: https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Eksik veya bozuk tanım dosyası nedeniyle emülatörler içe aktarılamıyor.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Menü eylemi gerçekleştirilemedi.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Oyun Ayrıntılarını Düzenle</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Resim URL’si</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Bağlantı Ekle</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">ROM ekle</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Değişiklikleri Kaydet</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Alan değişikliklerini, düzenlenmekte olan oyun(lar)a uygulayın.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Eylem Ekle</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Oynatma Eylemini Kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Oyunları Ekle</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Klasörü Tara…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Kurulu Olanları Algıla</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Gözat…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Playnite Arayüzü</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Profil Ayarları</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Oyun adı boş bırakılamaz.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Oyun eylem takip dizini boş olamaz.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Üst verileri aramalarında oyun adı boş bırakılamaz.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Geçersiz oyun verileri</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">http:// veya https:// ile başlayan geçerli web URL'si girin</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">URL Seç</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Üst veriler indirilemedi: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">İndirme Hatası</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Filtreleri Temizle</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Özel Hesap</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Genel Hesap</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API Anahtarı</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Başlangıç Hatası</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Tema Hatası</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Tümünü Temizle</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Kuruluyor</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Kaldırılıyor</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Başlatılıyor</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Çalışıyor</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Geçersiz URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Hiçbir şey yapma</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Küçült</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Pencereyi geri yükle</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Pencereyi kullanıcı arayüzünden başlatıldığında geri yükle</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Kapat</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Değiştir</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Gelişmiş</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Asla</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Tamamlanma Durumu</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Tamamlanma Durumu</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Kullanıcı Puanı</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Eleştirmen Puanı</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Topluluk Puanı</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Oyun betikleri</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Uygulama betikleri</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Betikler</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Eklentiler</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Üst Veri Kaynakları</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Uzantılar</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">Uzantı kimliği</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Betikleri Yeniden Yükle</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">İnteraktif SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Tüm betikler başarıyla yeniden yüklendi.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Seçili arama/filtre kriterinde oyun bulunamadı</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Öğe bulunamadı</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Masaüstü Moduna Geç</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Playnite'ı Kapat</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Kütüphaneler</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Tümünü Güncelle</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Oluşturan:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Sürüm:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Güncellenme:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Modül:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Kütüphane</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">İstatistikler</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Tümü</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Hiçbiri</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Bildirimler</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Genişlik</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Yükseklik</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Boyut</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Küçük</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Normal</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Büyük</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Daha büyük</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">En büyük</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Varsayılan</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Seç</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Tümünü Seç</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Tüm Seçimleri Kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">İlk</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Rastgele</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Kullanıcı seçimi</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Daha fazla</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Şeffaf</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Daralt</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Genişlet</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Tümünü Daralt</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Tümünü Genişlet</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Diğer</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Temalar</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Emülatör Değişkenleri</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Dahili Bağımsız Değişkenler</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Özel Bağımsız Değişkenler</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Ek Emülatör Değişkenleri</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Emülatör Değişkenlerini Geçersiz Kıl</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Oyna Eylemi</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">İçe aktarılacak üst verileri seçin</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">İçe Aktarılacak Oyunları Seçin</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Üst veri ara</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Güncelleme Mevcut</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Son güncellemeden bu yana yapılan değişiklikler</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Güncellemeyi İndir ve Kur</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Güncelleştirmeleri Denetle</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Güncelleme Hatası</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Yeni sürüm kontrol edilemedi.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Şu anda son sürümü kullanıyorsunuz.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Güncelleme indirilemediği için kurulamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Birkaç arka plan görevi şu anda devam ediyor. İptal edip güncellemeye devam etmek istiyor musunuz?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Birkaç arka plan görevi şu anda devam ediyor. İptal edip Playnite'tan çıkmak istiyor musunuz?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Birkaç arka plan görevi şu anda devam ediyor. Modlar arasında geçiş yapmak görevi iptal edecek. Yine de geçiş yapmak istiyor musunuz?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Playnite için bir güncelleme mevcut</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Tema listesini yeniden yükle</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Seçilen temayı uygula</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Dosya değişikliklerini izle</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Kaynak dosya değiştiğinde temayı otomatik olarak uygula</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Betik çalışma zamanı</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Oyun başlatılmadan önce çalıştırılacak betik</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Oyundan çıkış yapıldıktan sonra çalıştırılacak betik</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Oyun başlatıldıktan sonra çalıştırılacak betik</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Uygulama başlangıcında çalıştır</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Uygulama kapanışında çalıştır</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Oyun betiği başlatıyor</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Oyun betiği başlatıldı</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Oyun betiği durduruldu</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Genel betiği çalıştır</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Genel</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Filtrelenmiş</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Mevcut</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Yeni</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Betiği test et</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Yalnızca seçili öğeleri göster.</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Varsayılan olarak kaydet</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Favorilere ekle</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Favorilerden kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Bu oyunu gizle</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Gizlenenlerden Kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">HDR Desteğini Aç</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">HDR Desteğini Kapat</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Düzenle…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Kurulum boyutunu hesapla</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Kurulum boyutunu hesapla (Tüm oyunlar)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Kurulum boyutunu hesapla (Sadece eksik veriler)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Kurulum boyutu</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Kategori Ayarla…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Tamamlanma Durumu Ayarla</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Listeden Kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Oyna</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Kur</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Oyun Seçenekleri</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Ayrıntılar</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Kurulumu Kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Kurulum Konumunu Aç</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Masaüstü Kısayolu Oluştur</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Kılavuzu Aç</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Diğer</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Kütüphane eklentisi tarafından yönetiliyor</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Oyunun başlama süreci, bu oyundan sorumlu kütüphane eklentisi tarafından yönetilecektir.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Belirtilen sayfada '{0}' oyunuyla ilgili hiçbir bilgi bulunamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">İpucu: &quot;Düzenle&quot; menü seçeneğiyle tekli oyun düzenlerken daha gelişmiş üst veri indirme işlemini kullanabilirsiniz.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Bazı işlem devam ederken kullanılamaz.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Açıklama metni HTML sözdizimine duyarlıdır</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Oyun süresi saniye cinsinden kaydedilir.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">İndirme boyutu byte olarak gösterilir.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Çıkış tarihi 'yıl-ay-gün' formatında ayarlanmalıdır. Ay ve Gün değerleri atlanabilir.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">0 ile 100 arası bir değer girin ya da boş bırakın.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Playnite gelişimi bu Patron'lar ve Ko-fi üyeleri tarafından desteklenmektedir:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Kod, yerelleştirme ve diğer katkıda bulunanlar özel bir düzende değildir:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Oyun izleme iptal edilsin mi?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Kurulum izleme şu anda çalışıyor. İşlemi iptal edip oyunu önceki durumuna döndürmek istiyor musunuz?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Oyun yürütme izleme şu anda çalışıyor. İşlemi iptal edip oyunu önceki durumuna döndürmek istiyor musunuz?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Oynama Süresi</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Son Oynanma</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}g {1}sa {2}dk</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}s {1}dk</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} dakika</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} saniye</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Oynanmadı</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Masaüstü modunu açıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Tam ekran kipi açılıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Oyun kütüphanesi yükleniyor…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">İndirme boyutu ölçülüyor…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">{0} isimli oyunun indirme boyutu ölçülüyor…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Betik dosyası kurulamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Betik dosyası başarıyla kuruldu.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Betik Dosyası Kur</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Betik hatası</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Uzantı işlevi yürütülemedi.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Üst veri klasörünü aç</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Hesapla</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Eğer oyuna ait bir ROM mevcutsa ya da kurulum dizini belirlenmişse, kurulum büyüklüğü otomatik hesaplanır</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} istemcisi kurulmamış.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} müşteri şimdi açılacak. Lütfen oturum açın ve ardından bu mesajı kapatın.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Kullanıcının oturum açmasını bekleyin, tamamladığınızda lütfen bunu kapatın…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Oyunun kurulum klasörü bulunamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Geçersiz oyun eylemi yapılandırması.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Hesap eşitleme sorunlarını gider</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Sorun gider</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Öğeyi yeniden adlandır</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Yeni öğe ekle</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">İsim gir</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Yeni isim gir</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Bir saatten az</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 ila 10 saat</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 ila 100 saat</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100-500 saat</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500-1000 saat</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000 saatten fazla</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Kurulumu tamamlamak için Playnite yeniden başlatılmalıdır. Şimdi yeniden başlatmak istiyor musunuz?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Uzantı düzgün paketlenmemiş.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Tema düzgün paketlenmemiş.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">&quot;{0}&quot; uzantısı düzgün yüklenemedi.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">&quot;{0}&quot; uzantısı yüklenemiyor, mevcut Playnite sürümü desteklenmiyor.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">&quot;{0}&quot; teması düzgün yüklenemedi.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">&quot;{0}&quot; teması yüklenemiyor, mevcut Playnite sürümü desteklenmiyor.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Uzantı düzgün yüklenemedi.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Tema düzgün yüklenemedi.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Tema/Uzantı, desteklenmeyen API sürümü kullanıyor.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Kurulum başarılı oldu.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Eklenti kur?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Genel</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">&quot;{0}&quot; eklentisi kurulamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Uzantı kurulumu başarısız.\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Yeni bir uzantı yüklemek istiyor musunuz?\r\n\r\n{0}\r\nGeliştirici: {1}\r\nSürüm: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">&quot;{0}&quot; uzantısını güncellemek istiyor musunuz?\r\n\r\nGeçerli sürüm: {1}\r\nYeni sürüm: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Tema yüklenemedi.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Yeni bir tema yüklemek istiyor musunuz?\r\n\r\n{0}\r\nGeliştirici: {1}\r\nSürüm: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">&quot;{0}&quot; temasını güncellemek istiyor musunuz?\r\n\r\nGeçerli sürüm: {1}\r\nYeni sürüm: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Playnite'ten ayrılmak ve varsayılan web tarayıcınızı kullanarak aşağıdaki web sayfasına gitmek üzeresiniz. Devam etmek istiyor musun?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Seçili görüntüler, orantılı performans için çok büyük olabilir. Çok büyük görüntülerin kullanılması, daha kötü UI (Kullanıcı Arayüzü) yanıt süresine ve artan bellek kullanımına neden olabilir. \r\n\r\nÖnerilen en fazla çözünürlükler:\r\nSimgeler: {0} mega piksel\r\nKapaklar: {1} mega piksel\r\nArka planlar: {2} mega piksel</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Performans Uyarısı</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Bir Daha Gösterme</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Dosya, {0} uzantısı ile uyumlu değil.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Uyumsuz dosya uzantısı</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Seçilen resim dosyası en iyi performans için çok büyük olabilir.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Seçili temayı kaldırmak istediğinizden emin misiniz? Kaldırma işlemi, bir sonraki uygulama başlangıcına kadar sıraya alınacaktır.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Yerleşik temalar kaldırılamaz.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Bu tema Playnite'ın bu sürümünü desteklemiyor.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Seçili uzantıyı kaldırmak istediğinizden emin misiniz? Kaldırma işlemi, bir sonraki uygulama başlangıcına kadar sıraya alınacaktır.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Yerleşik uzantılar kaldırılamaz.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Bu uzantı, Playnite'ın bu sürümünü desteklemiyor.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Kurulum klasörü</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Veri klasörü</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Tanılama paketi oluşturuluyor…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Tanılama paketi yükleniyor…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Dosyayı içe aktar…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Bu nedir?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Bunu yapmak istediğinize emin misiniz?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Toplam oynama süresi</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Ortalama oynama süresi</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">En uzun oynama süresi</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Toplam indirme boyutu</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Genel bakış</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Kenar Çubuğu</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Кenar Çubuğunda Göster</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Ayarları sıfırla</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Aşağıdakiler hariç tüm uygulama ayarları varsayılan değerlere sıfırlanacaktır:\r\n- Veritabanı konumu\r\n- Hariç tutulan içe aktarma listesi\r\n- Kütüphane entegrasyonları dahil olmak üzere uzantı ayarları\r\n    \r\nİşlemi bitirmek için uygulamanın yeniden başlatılması gerekir. Ayarları sıfırlamak istiyor musunuz?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Geliştiriciler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Harici uzantılar</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Tam klasör yolunu girin.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Başarımlar</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Forum</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Haberler</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Mağaza Sayfası</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">İlk kurulum tamamlanmadı. Playnite, prosedürü bitirmek için şimdi Masaüstü Moduna yeniden başlayacaktır.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">En Son Oynananlar</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Favoriler</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Çok Oynanan</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Tümü</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Uygulanan filtreler var.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Uygulanan ek filtreler var.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Arama Sonuçları:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Aynı ada sahip bir öğe zaten var.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Seçimi geçerli filtreyle kısıtla</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Başka seç</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Eklentiler…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Kurulu</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Uzantı Ayarları</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Gözat</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Güncellemeler</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Güncelleme ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Kurulu uzantıların ve temaların yönetimi, ayarları dahil, yeni olan &quot;Eklentiler&quot; menüsüne taşındı.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Şu anda kurulu olan tüm kütüphane bütünleşmesi uzantıları buradan yapılandırılabilir.\r\n\r\nEk bütünleştirmeler kurmak veya kaldırmak istiyorsanız ana menüden &quot;Eklentiler&quot; seçeneğini kullanın.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Masaüstü Temaları</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Tam Ekran Temaları</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Aranıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Eklenti, Playnite'ın bu sürümüyle uyumlu değil.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Eklenti yükleme paketi indirilemedi.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Eklenti yükleme paketi indirilemedi.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Yeni ayarları uygulamak için yeniden başlatma gerekiyor.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Bu eklenti kurulum için planlandı.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Kur</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Təzədən Quraşdırmaq</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Zaten kurulmuş</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Yeni eklenti güncellemesi bulunamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Eklentileri güncelle</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Değişiklikler mevcut değil</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Kurulum için planlandı</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">İndirme başarısız</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Lisans reddedildi</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">{0} indiriliyor…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Eklenti güncellemeleri kontrol ediliyor…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Program güncellemeleri kontrol ediliyor…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Bir veya daha fazla eklenti güncellemesi mevcut.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Güncellenecek öğeleri seçin</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Uzantı geliştirme örneği</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} lisans sözleşmesi</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Onayla</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Reddet</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Kütüphane bütünleşmesine oynatma eylemlerini dahil et</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Eylem seç</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Takip modu</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Takip Dizini</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">İlk izleme gecikmesi</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">İzleme sıklığı</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Bağlantı</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Dosya</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Emülatör</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Betik</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Varsayılan</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">İşlem</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Klasör</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Özgün işlem</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">İşlem adı</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">İzleme mesajlarını günlüğe kaydet</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Yapılacak olan değişiklikler seçili olan tüm oyunların verilerinin üzerine yazılacaktır!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Hiçbiri</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Tekdüze</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Sadece Öğeler</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Yalnızca başlangıç ve bitiş</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Kaydırma hassasiyeti</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Akıcı kaydırma</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Animasyon hızı</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Öğeyi kaldır?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Bu ögeyi kaldırmak istediğinize emin misiniz?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Düğmeleri üst panelde göster:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Genel görünüm ayarları</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Gruplandırma ayarları</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Sıralama ayarları</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Filtre ön ayarları</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Eklenti öğeleri konumu</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Bölüm ayırıcı genişliği</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Ana menü düğmesini kenar çubuğuna taşı</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Keşif Paneli</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Rastgele oyun seçici</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Rastgele oyun seçiciyi görüntüler</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Görünümden rastgele oyun seç</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Gruplandırma ve sıralama ayarlarını kaydet</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Tam ekran kipinde hızlı filtre olarak göster</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Son 7 gün içinde</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Son31 gün içinde</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Son 365 gün içinde</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">365 günden daha fazla</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Yapılandır</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Önayarı kaydet</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Oyuna başladıktan sonra simge durumuna küçült</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Oyun başladıktan sonra Playnite'ı simge durumuna küçültün.\r\n\r\nBunu devre dışı bırakmak, oyunların başlangıçta girdiye odaklanmamasıyla ilgili sorunlara yol açabilir!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Yazı Tipi Boyutu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Yazı Tipi Boyutu Küçük</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">Oyun kontrolcüsü API desteğini etkinleştir</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Oyun kolu desteği</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Devre dışı bırakılırsa Playnite hiçbir oyun kolu girişini kabul etmez.\r\n        \r\nOyun kolu girişlerini fare/klavye girişlerine çeviren araçlar kullanıyorsanız ve Playnite ile çift giriş alıyorsanız devre dışı bırakın.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Öğeleri ana menüde göster:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Ters X/A ana görünüm düğmesi bağlama</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Bir oyunu başlatmak ve ana görünüm sayfasında oyun ayrıntılarını göstermek için düğme bağlantılarını değiştirir.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Onay/iptal düğme eşlemelerini değiştir</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Onay ve iptal için A/B düğme eşlemelerini tersine çevirir.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Sadece ana oyun kolu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Aktif olduğunda, sadece ana oyun kolundan gelen girdiler dikkate alınır.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Rehber düğmesi Playnite'ı öne getirir</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Arayüz ses seviyesi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Arka plan ses seviyesi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Arka plandayken sessize al</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Ses arabirimi başlatılamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Çıkış API'sı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">Ses çıkışı için kullanılan API. Sesle ilgili sorunlar yaşıyorsanız değiştirin.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Genel</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Görseller</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Ses</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Düzen</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Menüler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Girdi</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} başlıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} çalışıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Büyük Harfler</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Boşluk</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Görüntü işleme ölçekleyicisi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Alternatif</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Dengeli</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Kalite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Kalite:\r\nEn iyi görüntü kalitesi, yavaş, yüksek bellek kullanımı.\r\n    \r\nDengeli:\r\nKaliteli, hızlı, düşük bellek kullanımı.\r\n    \r\nAlternatif:\r\nDaha iyi kalite, orta hız, düşük bellek kullanımı.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Dosya seç…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Klasör seç…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Başlangıç ​​betiği</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Lütfen hem uzantıların hem de temaların Playnite'ın performansını, kararlılığını ve güvenliğini büyük ölçüde etkileyebileceğini unutmayın.\r\n    \r\nBir tema veya uzantı yükledikten sonra bazı sorunlar yaşamaya başlarsanız, sorunun kaynağı olup olmadığını görmek için önce bunları devre dışı bırakmayı/kaldırmayı deneyin.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Başlangıçta seç</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Başlangıçta seç</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Gömülü modüller</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Gömülü profiller</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Özel profiller</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Özel profil</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Dahili betik tarafından işleniyor</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Emülatör özellikleri</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Platform özellikleri</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Bölge özellikleri</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Emülatörü başlatmadan önce çalıştır</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Emülatör başlatıldıktan sonra yürüt</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Emülatörden çıktıktan sonra yürüt</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Emülatör yürütülebilir dosyası bulunamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Emülatör özellikleri bulunamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Emülatör başlangıç betiği bulunamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Ayrı oyunlar olarak böl</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Tek bir oyunda birleştir</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Platformu ayarla</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Bölge ayarla</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Klasörleri tara</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Yapılandırmaları tara</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Kalıpları sağlama toplamı taramasından hariç tut</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Belirtilen desen(ler)le eşleşen dosyalar sağlama toplamı için taranmayacak ve dosya adıyla eşleştirilecektir. Daha fazla bilgi için öykünücü yardım sayfasına bakın.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Emülatörle tara</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Yeni yapılandırma kaydedilirken ad belirtilmeli.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Öykünücü veya öykünücü profili ayarlanmadı.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Taranacak dizin belirtilmemiş veya mevcut değil.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Tarama yapılandırması düzgün ayarlanmamış.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Toplu tarama içinde otomatik-tarama içerir</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Emülatörler için klasör taranamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Emülatör oyunları için klasör taranamadı.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">İçe aktarılanları gizle</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">İçe aktarılacak profiller:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Otomatik tarama ayarları</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Otomatik tarama ayarları olarak kaydet</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Daha sonra kütüphane güncellemesi sırasında kullanılmak üzere yapılandırmayı kaydeder. Kaydedilen yapılandırmalar &quot;Emülatörleri Yapılandır&quot; menüsünden yönetilebilir.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Göreceli dizinler kullanarak aktar</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Mümkün olduğunda oyun dosyaları, Playnite ya da emülatör kurulum klasörlerine bağıntılı dizinler altından içe aktarılır.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Alt klasörleri tara</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Arşivlerin içini tara</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">İlişkili dosyaları birleştir</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Tekil oyun diskleri gibi birbiriyle ilişkili dosyaları tek bir oyun kaydı altında birleştir.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Tarayıcı ekle</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Kaydedilmiş tarayıcı ekle</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Taramayı başlat</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Belirli klasörleri taramak için emülatörlerle tarama yapılandırmaları ekleyin. Oyunları içe aktarmadan önce emülatörlerin doğru şekilde yapılandırıldığından emin olun (Kütüphane -&gt; Emülatör Yapılandır menüsü aracılığıyla).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Yeni eklenen oyunlara atanan varsayılan durum</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">İlk kez oynanan oyunlara atanan statü</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">PowerShell betiği çalışma zamanı başlatılamadı. Windows 7 kullanıcısıysanız, çözüm için PowerShell 5.1 (yeniden) kurmayı deneyin.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Belirtilen ada sahip filtre ön ayarı zaten var. Ön ayar yeni ayarlarla güncellensin mi?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Toplu eklenen veya düzenlenen oyunlar için eksik sıralama adlarını otomatik olarak doldur</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">Bir oyunu düzenlediğinizde, kütüphane güncellemesi, emülatör klasörü taraması veya normal klasör taraması yoluyla oyun eklediğinizde, &quot;Sıralama Adı&quot; alanını oyunun adının daha iyi sıralanabilir bir temsilini otomatik olarak doldurun. Örneğin, &quot;The Witcher 3&quot; için Sıralama Adı &quot;Witcher 03&quot; olacaktır. Bu, oyun adından farklı olmayan bir sıralama adı belirlemez ve yalnızca boş olan sıralama adlarını otomatik olarak günceller.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Şu kelimeler, otomatik doldurulan Sıralama İsmi bilgisinin başlangıcından silinecektir:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Sıralama esnasında terimlerin başındaki kelimeleri göz ardı etmek için kullanın. Varsayılanlar, &quot;The&quot;, &quot;An&quot;, ve &quot;A&quot; kelimeleridir.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Sıralama İsmi boş olduğunda doldur</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Sıralama</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">İsim Sıralama Değerini Doldur…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Nahimic hizmetinin sisteminizde çalıştığı tespit edildi. Bu hizmetin Playnite'ta (ve diğer uygulamalarda) ciddi işleme sorunlarına neden olduğu bilinmektedir.        \r\n\r\nPlaynite'ta grafiksel bozulmalar veya başka işleme sorunları ile karşılaşırsanız, Nahimic servisini devre dışı bırakmanızı veya tamamen kaldırmanızı öneririz.\r\n\r\nhttps://playnite.link/nahimicsucks adresinden daha fazla bilgi edinin.</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite, yükseltilmiş ayrıcalıklarla (yönetici olarak) çalışıyor. Bu, Playnite'tan başlatılan tüm kurulu uzantılara ve tüm oyunlara/uygulamalara yükseltilmiş ayrıcalıklar sağladığı için önerilmez!\r\n\r\nhttps://playnite.link/adminfaq adresinde daha fazla bilgi alabilirsiniz.</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Playnite yükseltilmiş ayrıcalıklarla çalışıyorsa uyarı göster</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Oyunların boyutunu belirlerken disk üzerindeki gerçek boyutu hesapla</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Aktif olduğunda, tarama daha uzun sürer ve dosyaların disk üzerinde kapladığı gerçek kullanım alanı hesaplanır.\r\nPasif olduğunda, tarama daha hızlı tamamlanır ve dosyaların kendi boyutları hesaba dahil edilir.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Aşağıdaki eklentinin/eklentilerin, yüksek kararlılık/performans etkisi veya güvenlik sorunları nedeniyle potansiyel olarak sorunlu olduğu bildirildi. Bunları kaldırmanızı şiddetle öneririz:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Çevrimiçi dosyaları taramadan hariç tut</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Bulut depolamada depolanan dosyalar yerel olarak mevcut değilse taranmaz ve içe aktarılmaz.\r\nYalnızca şunlar için desteklenir: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Dosya içeriği olmadan basitleştirilmiş yöntemi kullanarak tara</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Dosyalar içe aktarılacak, ancak dosya içeriğinin indirilmesini ve yerel olarak sunulmasını gerektirmeyen daha az doğru bir yöntem kullanılacaktır.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Tümüne uygula</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Esas alınan kurulum durumu</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Tanımlı olduğunda Playnite, entegrasyon eklentisi tarafından belirlenen kurulum durumunu (kurulum dizini de dahil olmak üzere) göz ardı edecektir.\r\n\r\nBu seçenek, belirli oyun aktarım metodunu kullanan ve bu ayarı dikkate almayan eklentiler için tam çalışmayabilir.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Sadece el ile</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Günde bir</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Haftada bir</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Her açılışta</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Program güncellemelerini kontrol et</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Eklenti güncellemelerini kontrol et</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Kütüphaneleri güncelle</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Emülatör klasörlerini tara</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Gizli oyunları dahil et</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Alanları düzenle</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Tümünü seç / Seçimi kaldır</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Aç</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Etkinleştir</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Ata</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Oyun aramak için yazın… Yardım için [F1]</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"># karakteriyle başlayarak mevcut komutlar listelenir.\r\n/ karakteriyle başlayarak mevcut arama sağlayıcıları/eklentiler listelenir.\r\nAnahtar kelime yazdıktan sonra BOŞLUK karakteriyle bitirerek derhal ilgili aramaya geçilir.\r\n\r\nTAB: eylem değiştir\r\nENTER: seçili eylemi yürüt\r\nSHIFT-ENTER: işlem menüsünü görüntüle</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Kurulmamış oyunları dahil et</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Gizli oyunları dahil et</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Kurulmamış oyunları dahil et</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Kurulmamış oyunları hariç tut</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Gizli oyunlar dahil</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Gizli oyunlar hariç</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Oyna veya Kur</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Ayrıntıları görüntüle</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Oyun menüsü</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Oyunu düzenle</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Aramayı Aç</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Arama kutusu</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Arama düğmesi</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Birincil oyun eylemi</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">İkincil oyun eylemi</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F, arama kutucuğuna odaklanmak yerine genel arama ekranını açar</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Oyun filtreleme seçeneklerini her arama için hatırla</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Arama sağlayıcıları</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Varsayılan</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Özel anahtar kelime</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Sistem kısayolu</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite arama</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Uzantı Ayarları</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">İstisnalar</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Taranacak klasöre göre hariç tutulacak dosyalar</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Taranacak klasöre göre hariç tutulacak klasörler</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Dosyayı istisna listesine ekle</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Klasörü hariç tut</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">İstisnalar sadece kayıtlı tarayıcı yapılandırmalarına eklenebilir.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">İstisnalar &quot;{0}&quot; adlı tarayıcıya eklendi.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Esas alınan platform</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Tarayıcı, tüm yeni oyunlar için, otomatik tespit edilen platform bilgisi yerine bu platform bilgisini kullanacaktır.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Varsayılan arama sonuçlarında komutları da dahil et</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Devre dışı olduğunda, # öneki kullanılmadığı sürece komutlar, varsayılan arama sonuçlarına dahil edilmeyecektir.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">İsim filtresi için esnek eşleştirme kullan</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Etkin olduğunda, isim filtesi, oyun isimleriyle genel arama ile aynı biçimde karşılaştırılacaktır.\r\nTekil aramalarda katı karşılaştırma yapmak için arama terimlerinin başına ! karakterini ekleyebilirsiniz.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Oyun sonuçları için görüntülenecek alanlar:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Gizlilik Durumu</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Veri yedekleme iptal edildi.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Veri yedekleme başarısız oldu.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Veri yedekleme hatası</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Veri yedekleme devam ediyor…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Veriler yedekten geri yükleniyor…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Yedekten geri yükleme başarısız oldu.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Ayarlar</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Oyun kütüphanesi</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Oyun kütüphane medyası</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Kurulu uzantılar</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Uzantı verileri</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Kurulu temalar</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Seçili yedek dosyasından geri yüklenecek verileri seçin.\r\n\r\nPlaynite, otomatik olarak geri yükleme sürecini tekrar başlatacaktır.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Veri yedeğine dahil edilecek kalemleri seçin. Uygulama ayarları ve oyun kütüphane verilerinin dahil edileceği varsayılır.\r\n\r\nPlaynite, otomatik olarak yedekleme sürecini tekrar başlatacaktır.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Otomatik veri yedekleme</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Otomatik yedekleme sıklığı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Yedekleme klasörü</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Dönüşümlü yedekler</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">İlave verileri dahil et:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Otomatik yedekleme için yedek klasörü tanımlanmış olmalıdır.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Sadece yama sürümleri için bildirim görüntüle</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Aktif olduğunda, sadece kurulu olan ana sürüm için yayınlanan güncellemelere dair bildirim görüntülenecektir.\r\nYeni ana sürümler için bildirim görüntülenmeyecektir.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Geçen hafta için göreceli tarih kullan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Tarih bir haftadan daha eskiyse göreceli tarihleri ​​&quot;Bugün&quot;, &quot;Dün&quot; vb. biçiminde kullanın.\r\n    \r\nDiğer tüm tarihler için belirtilen tarih biçimi kullanılacaktır.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Web resim araması</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Simge arama terimleri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Kapak resmi arama terimleri</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Arka plan resmi arama terimleri</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Eklenti bilgisi alınıyor…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Üstveri kaynağı yok</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Oyna eylemi ayarları</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Tarayıcı ayarlarını kullan</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Başlangıçta profili seç</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Başlangıçta emülatör seç</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Otomatik</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Her zaman açık</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Her zaman kapalı</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Erişilebilirlik (ekran okuyucu) desteği</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Uygulama menüsü</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Oyun menüsü</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Program klasörü</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Kullanıcı veri dizini</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Kütüphane dosyasında arıza tespit edildi, Playnite şimdi sonlandırılacak.\r\n\r\nPlaynite GitHub sayfasında yeni bir hata kaydı oluşturarak arızalı dosyalarınızın tamir edilmesini talep edin.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Yaptığınız değişiklikleri kaydetmek istiyor musunuz?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Taşınabilir kurulum</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Hiçbir oyun kolu algılanmadı</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/uk_UA.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Українська</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Мова Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Вихід</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Фільтр Активний</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Фільтр Вимкнений</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Додаткові фільтри</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Фільтри</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Фільтр</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Неправильні дані</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Зберегти зміни?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Домашня сторінка: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Вихідний код на GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Створити пакунок для діагностики</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Надіслати інформацію для діагностики</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Про Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Розробник: Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Призначити категорію</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Обрати категорію</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Додати категорію</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Вибрано - Категорію призначено\r\nНе вибрано - Прибрати категорію\r\nНевизначено - Без змін (коли редагується кілька ігор)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Немає категорії</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Немає платформи</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Дідько! Щось пішло не так...</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Сталася невиправна помилка.\r\n\r\nЯкщо ви хочете допомогти нам виправити цю проблему, будь ласка коротко опишіть ваші дії до збою, після чого вишліть інформацію для діагностики. Якщо ви в мережі, пакунок буде надіслано на сервер Playnite для аналізу.\r\n\r\nЯк альтернатива, ви можете натиснути на кнопку &quot;Повідомити про Збій&quot; щоб створити нову проблему на GitHub і повідомити про збій вручну.\r\n\r\nДякуємо за вашу допомогу.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Розширення &quot;{0}&quot; призвело до невиправної помилки.\r\n\r\nМи рекомендуємо зберегти лог-файл і повідомити про проблему розробнику розширення. Якщо проблема повторюється знову і знову, вимкніть розширення.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Розширення &quot;{0}&quot; призвело до невиправної помилки.\r\n\r\nМи рекомендуємо повідомити про проблему розробнику розширення. Якщо проблема повторюється знову і знову, вимкніть розширення.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Невідоме розширення або тема спричинили непоправну помилку.\r\nМи рекомендуємо відключити доповнення сторонніх розробників, виділити проблемне та повідомити про проблему розробнику доповнення.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Сталася невиправна помилка.\r\n\r\nЯкщо ви хочете допомогти нам виправити цю проблему, будь ласка відправте інформацію для діагностики. Дякуємо.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Вимкнути розширення</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Зберегти лог-файл</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Вислати діаг. інформацію</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Повідомити про збій</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Перезапустити Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Перезапустити в безпечному режимі</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Вимкнення всіх сторонніх розширень та використання теми за замовчуванням.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Вийти з Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Дії вчинені перед збоєм (англійською мовою):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Менеджер Бібліотеки</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Прибрати ігри з Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Неможливо прибрати - гра запущена або встановлюється.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Неможливо видалити - гра запущена.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Ви дійсно бажаєте прибрати {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Ви впевнені, що хочете прибрати {0} ігор?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Ви дійсно бажаєте прибрати {0} з Playnite?\r\n\r\nЯкщо вибрати &quot;додати до списку виключень&quot;, тоді гру не буде додано знову наступного разу з оновленням бібліотеки.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Ви впевнені, що хочете прибрати {0} ігор?\r\n\r\nЯкщо вибрати &quot;додати до списку виключень&quot;, ці ігри не буде імпортовано знову з наступним оновленням бібліотеки.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Ви впевнені, що хочете прибрати {0} записів, що наразі не використовуються?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Не знайдено невикористаних полів.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Так (додати у список виключень)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">У цьому розділі є незбережені зміни</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Оновлення формату ігрової бібліотеки...</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Не вдалося оновити базу даних.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Неможливо оновити ігрову бібліотеку. Потрібно {0} МБ вільного простору.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Помилка гри</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Неможливо запустити гру. '{0}' не знайдено в базі даних.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Неможливо запустити гру: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Не вдалося розпочати дію: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Не вдалося відкрити розташування гри: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Не вдалося виявити розмір встановлення гри: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Помилка сканування розміру встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Під час сканування розміру встановлення сталося {0} помилок</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Не вдалося створити ярлик: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Не вдалося відкрити посібник: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Не вдається встановити гру: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Не вдається видалити гру: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Не знайдено дійсних дій при запуску гри. Використовуючи дії емулятора, переконайтеся, що визначення платформи збігаються між грою та конфігурацією емулятора.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Реалізація установки недоступна. </sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Плагін для бібліотеки відповідальний за запуск гри вимкнено або не встановлено.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Офіційне завантаження метаданих недоступне.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Не вибрано жодної гри.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Виконання призначеного грі сценарію не вдалося.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Не вдалося виконати сценарій застосунку. </sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Виконання призначеного глобально сценарію не вдалося.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Не вдалося виконати сценарій емулятора. </sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Виконання сценарію дії &quot;Грати&quot; не вдалося.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 або новіше не встановлено.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Не вдалося визначити, як розпочати гру.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Увімкнено</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Вимкнено</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Прибрати</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Прибрати невикористані</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Перейменувати</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Копіювати</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Додати</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Значок за замовчуванням</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Типова обкладинка</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Фонове зображення за замовчуванням</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Завершити</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Далі</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Назад</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">ГОТОВО</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">НАЗАД</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">ОЧИСТИТИ</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">Очистити</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Відхилити</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Відхилити Все</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Імпортувати</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Назва</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Автор</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Модуль</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Серія</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Версія</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Востаннє зіграно</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Найбільше зіграно</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Разів зіграно</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Розмір встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Тека</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Примітки</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Додано</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Додано</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Змінено</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Дата зміни</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Веб-сайт</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Шлях</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">ОК</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Зберегти</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Закрити</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Скасувати</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Підтвердити</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Скинути</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Так</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Ні</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Ласкаво просимо</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Локальний користувач</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Загальні</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Медіа</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Посилання</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Дії</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Завантаження...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Завантаження медіа...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Завантаження...</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Тип</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Профіль</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Профілі</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Прибрати</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Завантажити</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Пошук</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Роздільна здатність:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Будь-яка</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Масштабування</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Список</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Обкладинка</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Сітка</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Деталі</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Власні</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">URL-адреса</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Окремі подяки</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Ліцензія</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Автори</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Вихід з Playnite...</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Сьогодні</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Вчора</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Понеділок</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Вівторок</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Середа</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Четвер</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">П'ятниця</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Субота</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Неділя</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Минулий тиждень</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Минулий місяць</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Минулий рік</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Більше року тому</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 до 100 МБ</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100МБ до 1 ГБ</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1 ГБ до 5 ГБ</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5 ГБ до 10 ГБ</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10 ГБ до 20 ГБ</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20 ГБ до 40 ГБ</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40 ГБ до 100 ГБ</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100 ГБ або більше</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Імпортування успішно завершено.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Всі ігри</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">Ігровий Id</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">Id бази даних</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Шаблони</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Колонка</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Колонки</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Рядок</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Рядки</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Не вдалося отримати значок із дії &quot;Грати&quot;. До дії не прив'язано жодного типу файлу.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Завантажити лише відсутні метадані</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Включення цієї опції пропустить завантажування метаданих для вже заповнених полів.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Вибір ігор</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Будь ласка, оберіть які ігри потребують оновлення метаданих:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Всі ігри з бази даних</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Всі відфільтровані ігри</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Лише обрані ігри</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Не вибрано жодного поля метаданих</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Не обрано жодного поля метаданих для завантаження. Будь ласка, оберіть хоча б одне, та виберіть принаймні одне джерело метаданих.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Офіційний магазин</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Виберіть, які поля повинні бути автоматично заповнені Playnite і які джерела повинні використовуватися для отримання даних.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Будь ласка розгляньте можливість тощо, щоб клацнути на логотип вище і внести оновлення в базу igdb.com, дані з якої використовує Playnite.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Завантаження метаданих...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Імпортування встановлених ігор...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Імпортування ігор {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Імпортування емульованих ігор з {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Завантаження оновлень бібліотеки...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Сканування розміру ігор у бібліотеці…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Сканування розміру імпортованих ігор…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Оновлення бібліотеки завершено</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Звільнення ресурсів...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Конфігурація</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Налаштування...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Платформи та емулятори</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Налаштування емуляторів...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Менеджер Бібліотеки...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Інструменти</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Завантажити метадані...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Програмні інструменти...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Налаштування інтеграцій...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Відкрити сторонній клієнт</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Сторонні клієнти</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Оновити ігрову бібліотеку</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Скасувати оновлення бібліотеки</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Оновити емульовані теки</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Додати гру</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Вручну...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Сканувати автоматично...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Емульована Гра...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Застосунок Microsoft Store...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Про Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Надіслати відгук</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Запустити повноекранний режим</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Посилання</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Допомога</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Підтримати на Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Підтримка в Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Посібник користувача</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK Документація</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Перезавантажити систему</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Вимкнути систему</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Призупинити систему</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Режим глибокого сну</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Заблокувати систему</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Вийти з облікового запису</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Вибрати Випадкову Гру</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Ігрові поля, що будуть відображатися на панелі деталей:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">Відстань між елементами</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Малювати фон елемента Сітки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Ширина рамки елемента Сітки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Відсутнє джерело значка гри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Відсутнє джерело обкладинки гри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Відсутнє джерело фонового зображення гри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Вертикальний відступ до деталей гри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Розташування деталей у Сітці</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Розташування списку ігор в детальному перегляді</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Малювати розділювач між панелями</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Висота обкладинки гри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Висота значків в списку ігор</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Шрифт застосунку</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Моноширинний шрифт</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Позиція панелі фільтрів</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Позиція панелі провідника</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Відтворення обкладинок</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Бажане співвідношення сторін</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Наступні налаштування також впливають на відображення плитки в повноекранному режимі!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Режим розтягнення</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD Box</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Квадрат</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Банер Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Вертикальна обкладинка Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Необхідний перезапуск для застосування</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Налаштування</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Загальні</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Верхня панель</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Зовнішній вигляд</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Подробиці гри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Розташування</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Додатково</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Повноекранний режим</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Ввід</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Швидкодія</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Метадані</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Оновлення</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Пошук</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Резервна копія</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Створити резервну копію даних бібліотеки</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Відновити резервну копію даних</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Автоматично імпортувати зміни в бібліотеці</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Неправильне розташування бази даних, має бути вказано правильний шлях.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Ім'я облікового запису не може бути пустим.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Завантажити метадані після імпортування ігор</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Запускати Playnite згорнутим</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Запускати Playnite при вмиканні комп'ютера</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Запускати згорнутим в панель завдань</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Не вдалося зареєструвати Playnite для запуску при ввімкненні комп'ютера.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Запустити в повноекранному режимі</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Асинхронне завантаження зображень</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Покращує плавність прокручування списків ігор в обмін на повільніший час завантаження зображення.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Показувати назву гри, якщо відсутня обкладинка</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Відображати назви ігор у Сітці</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Затемнювати не встановлені ігри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Відображати значки ігор у списку детального перегляду</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Показувати кількість елементів в описі груп</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Показувати лише визначені поля на панелях фільтрів і провідника</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Вимкнути апаратне прискорення</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Використовуйте під час блимання або подібних проблем інтерфейсу користувача</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Показувати приховані ігри в списках швидкого запуску</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Впливає на перехідний список і список в меню області сповіщень.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Кількість елементів швидкого запуску</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Використовувати фонове зображення гри як фонове зображення вікна</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Розмити фон</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Висока якість</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Затемнити фон</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Показати у Сітці</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Тема профілю</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Повноекранна тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Повноекранна тема</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Розташування бази даних</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Статус входу:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Налаштування Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Очистити веб-кеш</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Може вирішити проблеми під час зв'язування облікових записів.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Показувати значок в області сповіщень</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Згорнути Playnite в область сповіщень</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Згорнути Playnite в область сповіщень, якщо закрити вікно застосунку</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Коли гра запускається:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Коли гра закривається:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Форматувати зіграний час, щоб показувати кількість зіграних днів</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Формати дат:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Ви вийдете з усіх пов'язаних сервісів. Потрібно перезапустити застосунок, хочете продовжити?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Очистити кеш?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Щоб застосувати нову тему, потрібно перезапустити Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Отримати більше тем</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Створити нову тему</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Отримати більше розширень</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">Створити нове розширення</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Допоможіть нам перекласти Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite потрібно перезапустити щоб застосувати нові налаштування. Перезапустити зараз?\r\n\r\nПерезапуск скасує всі поточні активні задачі (завантаження).</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Перезапустити Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite не може переносити файли вашої бібліотеки автоматично. Ви повинні вручну перемістити/скопіювати файли перед зміною розташування. У разі відсутності бібліотеки в новому місті розташування, буде створена нова бібліотека.\r\n\r\nНове розташування бази даних не буде використано до перезапуску Playnite. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Час гри не буде записано, якщо обрати параметр &quot;Закрити&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Кількість рядків</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Кількість стовпців</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Кількість рядків детального перегляду</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Показувати фонове зображення на головному екрані</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Не застосовується ретроспективно до ігор, що існують, без повторного завантаження метаданих.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Імпорт часу у грі до бібліотеки:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Налаштовує, коли Playnite має імпортувати час у грі, який надається плагінами бібліотек для ігор у базі даних Playnite. Для використання цієї функції необхідна підтримка плагінів бібліотек, відповідальних за обробку ігор.\r\n\r\nЗавжди: Імпортує час у грі для нових імпортованих і існуючих ігор у базі даних Playnite.\r\nТільки для нещодавно імпортованих ігор: Імпортує час відтворення лише для нових імпортованих ігор.\r\nНіколи: Ніколи й за жодних обставин не імпортувати час у грі.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Завжди</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Тільки для нещодавно імпортованих ігор</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Ніколи</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Увімкнути підтримку контролера в режимі робочого столу</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Кнопка Guide відкриває повноекранний режим</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Автоматичне завантаження метаданих для нещодавно імпортованих ігор.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Цільовий дисплей</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Завжди використовувати основний дисплей </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Показувати заголовки ігор</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Показувати стан батареї</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Показувати процент заряду батареї</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Показувати годинник</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Сховати курсор</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Лише встановлені у Швидких Фільтрах</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Підказки кнопок контролера</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Розташування</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Горизонтальна прокрутка</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Виберіть один з підрозділів</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Немає доступних налаштувань</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Не вдалося завантажити налаштування</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Ці сценарії застосовуються до кожної гри в бібліотеці. Індивідуальні сценарії можуть бути призначені кожній грі окремо під час редагування деталей гри.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Анімація зміни фонового зображення</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Розміри шрифту</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Авто</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Без згладжування</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Відтінки сірого</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Оптимальний</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Дисплей</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Режим форматування тексту</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Режим відтворення тексту</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Методи відтворення і формату тексту наразі не застосовуються до опису гри.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Попередньо завантажувати фонові зображення</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Якщо увімкнено, Playnite завантажуватиме фонові зображення під час завантаження метаданих. Це вимагає більше місця на диску і надає доступ до зображень в автономному режимі.\r\n\r\nЯкщо вимкнено, фонові зображення завантажуватимуться лише при першій необхідності. Це вимагає менше місця, але може викликати затримку перед відображенням зображення. Крім того деякі зображення можуть бути не доступні в автономному режимі.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Автоматично закривати сторонній клієнт після виходу з гри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Час завершення роботи клієнта (в секундах) </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Не закривати після ігрових сесій коротших ніж (в секундах)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Автоматично закривати наступні клієнти:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Автоматичне закриття клієнтів</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Список виключень при імпорті</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Відображати попередження при призначенні грі завеликих медіа ресурсів</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Команда відкриття теки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Бажана організація, що визначає віковий рейтинг</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Оновлювати розмір встановлення ігор при оновленні бібліотеки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Сканування та оновлення розміру встановлення ігор, якщо виявлено, що їх файли були змінені з часу останнього сканування</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Нічого</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Залити</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Вписати</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Вписати зберігаючи співвідношення сторін</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">Зліва</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">Справа</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">Зверху</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Внизу</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Помилка імпортування</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Необхідна автентифікація</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Автентифікація не виконана</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Альтернативний режим відображення веб-перегляду </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Використовуйте, коли виникають проблеми з веб-переглядами, наприклад, вбудованими діалоговими вікнами автентифікації. </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Часткове завантаження великих описів гри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Великі описи можуть викликати помітну затримку при виборі ігор.\r\n\r\nКоли увімкнено, лише частина тексту опису буде завантажена автоматично, решту можна буде завантажити за запитом.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Імпортування метаданих</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Завантажити метадані</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Задати вибрану конфігурацію для використання під час майбутніх завантажень метаданих.\r\nТакож можна змінити в налаштування застосунку.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Майстер імпортування емуляторів</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Цей майстер проведе вас через процес завантаження та імпорту консольних емуляторів та імпорту емульованих ігор.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Не забувайте, що ви можете завжди додати додаткові емулятори та/або ігри пізніше через головне меню (в меню &quot;Бібліотека&quot;  для налаштувань емулятора і меню &quot;Додати гру&quot; для емульованих ігор).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Нижче наведено список емуляторів які Playnite може розпізнавати і налаштовувати автоматично. Ви можете завантажити програми встановлення з їх веб-сайтів. Після встановлення емуляторів (вручну) ви можете імпортувати їх у діалоговому вікні налаштування емуляторів.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Ви можете імпортувати будь-які емулятори, встановлені на вашому комп'ютері, натиснувши кнопку &quot;Автовизначення з теки...&quot;. Playnite буде шукати відомі йому емулятори у заданій теці і дасть можливість імпортувати їх. Ви можете імпортувати з декількох тек, використовуючи цю кнопку кілька разів. Емулятори будуть додані в нижній частині поточного списку.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Ігри можна імпортувати, натиснувши кнопку &quot;Сканувати теку за допомогою емулятора&quot;. Вибір відповідного емулятора дасть Playnite знати які типи файлів слід сканувати та імпортувати. Ви можете імпортувати з декількох тек, використовуючи цю кнопку кілька разів, ігри будуть додані в нижній частині поточного списку.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Немає емуляторів, вибраних для імпорту. Ви не зможете автоматично імпортувати будь-які емульовані ігри без попереднього налаштування емуляторів. Дійсно продовжити та вийти з процесу імпорту?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">У Playnite немає налаштованих емуляторів. Не можна імпортувати ігри без попереднього налаштування емулятора та вибору відповідних типів файлів. Ви хочете додати якісь емулятори зараз?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Сканувати теку за допомогою емулятора</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Вибір файлів</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Автовизначення з теки...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Налаштування емуляторів...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Сканування…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Сканування {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Налаштування при першому запуску</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Цей майстер проведе вас через автоматичний процес імпортування і налаштування зовнішніх бібліотек. Playnite може автоматично імпортувати ігри з декількох ігрових сервісів таких як Steam чи GOG, а також тримати вашу бібліотеку в актуальному стані, автоматично оновлюючи її під час запуску програми.\r\n\r\nМайте на увазі, що ви можете додати будь-яку власну гру для будь-якої платформи пізніше, натиснувши кнопку &quot;Playnite&quot; в головному меню.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Інтеграція бібліотеки</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Нижче наведено список деяких відібраних бібліотечних інтеграцій, які підтримує Playnite. Виберіть ті, які потрібно встановити.\r\n\r\nІнші інтеграції можна встановити пізніше з меню &quot;Надбудови&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Конфігурацію завершено</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Першочергове налаштування завершено. Пам'ятайте, що ви можете змінити будь-які налаштування пізніше в меню &quot;Налаштування&quot;.\r\n\r\nТакож ви маєте можливість додати будь-яку іншу гру згодом натиснувши на меню у вигляді логотипа Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Не вдалося завантажити одне або кілька розширень.\r\n\r\nВи можете спробувати повторно завантажити інтеграції з меню надбудов після завершення майстра першого запуску. </sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Завантаження інтеграції {0}… </sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Завантаження списку рекомендованих інтеграцій…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Не вдалося завантажити список рекомендованих інтеграцій. Ви можете спробувати повторно завантажити інтеграції пізніше через меню Надбудови.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Налаштування платформ та емуляторів</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Налаштування емуляторів</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Платформи</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Платформа</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Емулятори</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Емулятор</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Додати платформу</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Обрати значок</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Обрати обкладинку</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Обрати зображення</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Вибрати елемент</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Обрати фон</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Обрати файл</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Обрати URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Додати емулятор</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Підтримувані платформи</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Ви хочете зберегти зміни платформи?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Ви хочете зберегти зміни емулятора?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Виконуваний файл</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Аргументи</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Робочий каталог</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Підтримувані типи файлів</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Імпортувати емулятори...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Завантажити емулятори...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Завантажити аргументи з відомого профілю емулятора</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Ви дійсно хочете видалити емулятор {0}?\r\nНаразі він використовується {1} грою(ами).</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Дійсно видалити платформу {0}?\r\nНаразі вона використовується {1} грою(ами) та {2} емулятором(ами).</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Довідка про налаштування</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Сортувати за</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Напрямок сортування</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Групування</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Зростанням</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Спаданням</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Не групувати</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Групувати за постачальником</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Групувати за категорією</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Групувати за платформою</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Тип перегляду</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Вигляд</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Панель провідника</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Панель фільтрів</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Значок</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Значок бібліотеки</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Обкладинка</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Фонове зображення</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Сортування</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Постачальник</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Посібник</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Назва</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Диск встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Ім'я облікового запису</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Платформа</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Категорія</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Жанр</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Дата випуску</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Рік випуску</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Розробник</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Теги</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Видавець</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Стан установки</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Відповідність всім фільтрам</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Якщо увімкнено, будуть показані тільки ігри що відповідають всім пунктам у всіх фільтрах.\r\nЯкщо вимкнено, будуть показані ігри що відповідають будь-яким пунктам у будь-яких фільтрах.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Встановлено</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Встановлено</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Не встановлено</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Приховано</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Обране</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Увімкнути підтримку HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Якщо увімкнено, HDR буде увімкнено на основному дисплеї перед запуском гри.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Зверніть увагу, що HDR не підтримується на вашому основному дисплеї.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Востаннє зіграно</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Категорія</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Опис</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Тека встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Обкладинка</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Посилання</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Образ/ISO шлях</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Жанр</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Жанри</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Компанія</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">Компанії</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Розробник</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Розробники</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Видавець</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Видавці</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Категорія</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Категорії</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Тег</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Теги</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Особливість</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Особливості</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Віковий рейтинг</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Віковий рейтинг</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Регіон</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Регіони</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Джерело</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Джерела</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Останні дії</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Помилка бази даних</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Не вдалося відкрити базу даних бібліотеки.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Базу даних не відкрито.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Не вдалося отримати доступ до бази даних бібліотек. Файл &quot;{0}&quot; використовується іншим процесом, або він недосяжний.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Не вдалося створити пакунок діагностики.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Не вдалося автоматично завантажити пакунок діагностики.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Інформацію для діагностики успішно відіслано.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Пакунок діагностики був створений та висланий успішно.\r\nБудь ласка, додайте наступний ID до звіту про проблему:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Не вдалося імпортувати ігри з {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Не вдалося імпортувати емульовані ігри з {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Неможливо виконати пошук ігор за обраним профілем емулятора. Профіль не містить розширень файлів або платформ.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Не вдалося запустити Playnite. Закрийте всі запущені екземпляри та повторіть спробу.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Не вдалося задіяти тему &quot;{0}&quot;, кольоровий профіль &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Не вдається відкрити посилання, URL-адреса має неприпустимий формат.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Не вдалося запустити застосунок.</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Не вдалося ініціалізувати компонент вебперегляду. Playnite не може продовжити процес запуску.\r\n\r\nБільше інформації на https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Неможливо імпортувати емулятори через відсутність або пошкодження файлу визначення.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Не вдалося виконати дію меню.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Змінити відомості про гру</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">Зображення URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Додати посилання</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Додати ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Зберегти зміни</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Застосувати зміни поля гри/ігор, що редагуються.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Додати дію</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Видалити дію</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Прибрати дію &quot;Грати&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Додати Ігри</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Сканувати теку...</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Виявити встановлені</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Огляд...</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Відкрити Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Налаштування профілю</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Назва гри не може бути порожньою.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Каталог відстеження дій гри не може бути порожнім.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Назва гри не може бути порожньою перед пошуком метаданих.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Неприпустимі ігрові дані</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Введіть припустимий URL що починається з http:// або https://</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Обрати URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Не вдалося завантажити метадані: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Помилка завантаження</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Очистити фільтри</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Приватний обліковий запис</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Загальнодоступний обліковий запис</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API ключ</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Помилка запуску</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Помилка теми</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Очистити все</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Видалення</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Запуск</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Запущено</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">Неприпустимий URL</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Нічого не робити</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Мінімізувати</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Відновити вікно</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Відновити вікно лише при запуску з інтерфейсу</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Закрити</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Змінити</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Розширені</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Ніколи</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Статус завершення</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Статуси завершення</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Моя оцінка</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Оцінка критиків</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Оцінка спільноти</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Сценарії гри</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Сценарії застосунку</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Сценарії</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Плагіни</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Джерела метаданих</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Розширення</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID розширення</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Перезавантажити сценарії</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Інтерактивна SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Всі сценарії перезавантажено успішно.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Не знайдено жодної гри за заданими критеріями пошуку/фільтру.</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">Нічого не знайдено</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Повернутися до режиму робочого столу</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Вийти з Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Бібліотеки</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Оновити все</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Створено:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Версія:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Оновлено:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Модуль:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Бібліотека</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Статистика</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Все</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Нічого</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Сповіщення</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Ширина</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Висота</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Розмір</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Малий</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Звичайний</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Великий</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Більший</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Найбільший</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Типово</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Вибрати</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Обрати все</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Скасувати вибір</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Перше</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Випадкове</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Вибір користувача</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Завантажити ще</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Прозорість</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Згорнути</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Розгорнути</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Згорнути все</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Розгорнути все</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Інше</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Теми</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Аргументи емулятора</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">Вбудовані параметри</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Користувацькі параметри</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Додаткові аргументи емулятора</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Перевизначити аргументи емулятора</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Дія &quot;Грати&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Виберіть метадані для імпорту</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Обрати ігри для імпортування</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Пошук метаданих</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Доступне оновлення</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Зміни після останнього оновлення</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Завантажити та встановити оновлення</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Перевірити наявність оновлень</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Помилка оновлення</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Не вдалося перевірити наявність нової версії.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Нову версію не знайдено, ви користуєтеся найновішою.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Не вдалося завантажити та інсталювати оновлення.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Наразі виконується фонове завдання. Скасувати його та продовжити з оновленням?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Наразі виконується фонове завдання. Скасувати його і вийти з Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Наразі виконується фонове завдання. Зміна режимів скасує завдання, хочете все одно змінити режим?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Доступне оновлення Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Перезавантажити список тем</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Застосувати вибрану тему</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Дивитися зміни файлу</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Автоматично застосовувати тему при зміні вихідного файлу</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Тип сценарію</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Сценарій для виконання перед початком гри</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Сценарій для виконання після виходу з гри</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Сценарій для виконання після запуску гри</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Виконати під час запуску застосунку</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Виконати під час закриття застосунку</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Гра запускає сценарій</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Гра запустила сценарій</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Гра зупинила сценарій</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Виконати глобальний сценарій</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Глобально</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Відфільтровано</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Поточні</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Нові</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Випробувати сценарій</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Показувати лише вибрані елементи</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Зберегти за замовчуванням</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Додати в Обране</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Прибрати з Обраного</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Приховати цю гру</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Прибрати з Прихованих</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Увімкнути підтримку HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Вимкнути підтримку HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">Змінити...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Обчислити розмір встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Обчислити розмір встановлення (всі ігри)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Обчислити розмір встановлення (лише відсутні дані)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Розмір встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Задати категорію...</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Задати статус завершення</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Прибрати</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Грати</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Встановити</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Налаштування гри</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Деталі</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Видалити</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Відкрити розташування гри</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Створити ярлик на робочому столі</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Відкрити посібник</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Більше</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Управляється плагіном бібліотеки</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Процес запуску гри буде керуватися бібліотечним плагіном, відповідальним за цю гру.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">На зазначеній сторінці не знайдено відповідної інформації про гру &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Порада: Ви можете використовувати більш просунутий процес завантаження метаданих під час редагування однієї гри за допомогою опції меню &quot;Редагувати&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Недоступно, коли виконується деяка дія.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Текст опису чутливий до синтаксису HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Час гри записується в секундах.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Розмір встановлення вказується в байтах.</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Дата випуску має бути встановлена у форматі &quot;рік-місяць-день&quot;. Значення місяця та дня можна опустити. </sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Значення від 0 до 100 або порожнє, якщо нема оцінки.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Розробка Playnite підтримується цими патронами та членами Ko-fi:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Ті, хто брали участь в написанні коду, локалізації і т.д.:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Скасувати моніторинг гри?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Працює моніторинг установки. Ви хочете скасувати процес і повернути гру в попередній стан?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Виконується моніторинг виконання гри. Ви хочете скасувати процес і повернути гру в попередній стан?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Часу зіграно</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Останній запуск</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}д {1}г {2}хв</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}г {1}хв</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} хв</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} сек</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Не запускалася</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Відкриття режиму робочого столу...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Відкриття повноекранного режиму...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">Завантаження бібліотеки ігор...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Обчислення розміру встановлення...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Обчислення розміру встановлення {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Не вдалося встановити файл сценарію.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Сценарій успішно встановлений.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Встановити сценарій</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">Помилка сценарію</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Не вдалося виконати функцію розширення.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Відкрити теку з метаданими</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Обчислити</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Автоматично розраховує або розмір встановлення за допомогою ромів, якщо гра їх має, або директорію установки, якщо її було задано</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} клієнт не встановлено.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Клієнт {0} зараз буде відкрито. Будь ласка авторизуйтеся після чого закрийте це повідомлення.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Очікування на вхід користувача, будь ласка закрийте це коли завершите...</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Теку встановлення гри не знайдено</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Невірна конфігурація дії &quot;Грати&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Вирішення проблем із синхронізацією облікового запису</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Вирішення проблем</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Перейменувати</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Додати елемент</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Введіть ім'я</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Введіть нове ім'я</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">Менше години</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">Від 1 до 10 годин</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">Від 10 до 100 годин</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">Від 100 до 500 годин</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">Від 500 до 1000 годин</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Щоб завершити встановлення, Playnite потрібно перезапустити. Хочете перезапустити зараз?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Розширення не упаковано належним чином.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Тема не упакована належним чином.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Розширення &quot;{0}&quot; не змогло завантажитися коректно.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Не вдається завантажити розширення &quot;{0}&quot;, поточна версія Playnite не підтримується.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Тема &quot;{0}&quot; не змогла завантажитися коректно.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Не вдається завантажити тему &quot;{0}&quot;, поточна версія Playnite не підтримується.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Розширення не змогло завантажитися коректно.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Тема не змогла завантажитися коректно.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Тема/Розширення використовує непідтримувану версію API.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Встановлення завершилося успішно.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Встановити надбудову?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Загальні</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Не вдалося встановити доповнення &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Не вдалося встановити розширення.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Ви хочете встановити нове розширення?\r\n\r\n{0}\r\nАвтор: {1}\r\nВерсія {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Ви хочете оновити розширення &quot;{0}&quot;?\r\n\r\nПоточна версія: {1}\r\nНова версія: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Не вдалося встановити тему.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Ви хочете встановити нову тему?\r\n\r\n{0}\r\nАвтор: {1}\r\nВерсія {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Ви хочете оновити тему &quot;{0}&quot;?\r\n\r\nПоточна версія: {1}\r\nНова версія: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Ви збираєтеся покинути Playnite і перейти на наступну веб-сторінку, використовуючи ваш основний веб-браузер. Хочете продовжити?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">Обрані зображення можуть бути завеликі для оптимальної роботи. Використання завеликих зображень може призвести до гіршої чутливості інтерфейсу та збільшення використання пам'яті.\r\n\r\nМаксимальна рекомендована роздільна здатність:\r\nЗначки: {0} мегапікселів\r\nОбкладинки: {1} мегапікселів\r\nФони: {2} мегапікселів</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Попередження щодо швидкодії</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Не показувати знову</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Файл із розширенням {0} несумісний.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Несумісне розширення файлу</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Обране зображення може бути завеликим для оптимальної швидкодії.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Ви впевнені що хочете видалити вибрану тему? Видалення буде заплановано при наступному запуску застосунку.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Вбудовані теми неможливо видалити.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Ця тема не підтримує цю версію Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Ви впевнені що хочете видалити вибране розширення? Видалення буде заплановано при наступному запуску застосунку.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Вбудовані розширення неможливо видалити.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Це розширення не підтримує цю версію Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Тека встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Тека даних</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Створення пакунку діагностики...</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Надсилання пакунку діагностики...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Завантажити з файлу</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Що це?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Ви впевнені, що ви хочете зробити це?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Загальний час у грі</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Середній час у грі</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Найдовший час у грі</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Загальний розмір встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Огляд</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Бічна панель</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Показати на бічній панелі</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Скинути налаштування</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Усі налаштування застосунку будуть скинуті до значень за замовчуванням, за винятком:\r\n- Розташування бази даних\r\n- Списку виключень імпорту\r\n- Налаштувань розширень, включаючи інтеграції з бібліотекою\r\n    \r\nЩоб завершити процес, потрібно перезавантажити застосунок. Скинути налаштування?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Для розробників</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Зовнішні розширення</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Введіть повний шлях до теки. </sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Досягнення</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Форум</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Новини</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Сторінка в крамниці</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Першочергове налаштування не завершено. Playnite перезапуститься в режимі робочого столу щоб завершити процедуру.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Нещодавно зіграні</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Обране</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Найбільше награні</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Всі</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Є використані фільтри.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Застосовуються додаткові фільтри. </sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Результати пошуку для:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Елемент з таким іменем вже існує.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Обмежити вибір поточним фільтром</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Обрати іншу</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Надбудови...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Встановлені</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Налаштування розширень </sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Огляд</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Оновлення</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Оновлення ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Управління встановленими розширеннями та темами, включаючи їх налаштування, було переміщено до нового меню &quot;Надбудови&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Усі встановлені розширення для інтеграції бібліотек можна налаштувати тут.\r\n\r\nЯкщо ви хочете встановити або видалити додаткові інтеграції, скористайтеся опцією &quot;Надбудови&quot; з головного меню.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Теми режиму робочого столу</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Теми повноекранного режиму</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Пошук..</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Надбудова не сумісна з цією версією Playnite. </sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Не вдалося завантажити інсталяційний пакет надбудови.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Не вдалося завантажити маніфест інсталяції надбудови.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Щоб застосувати очікувані зміни потрібно перезапустити застосунок. </sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Ця надбудова запланована для встановлення.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Встановити</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Перевстановити</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Видалити</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Вже встановлено</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Нових оновлень надбудов не знайдено.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Оновити надбудови</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Журнал змін не доступний</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Заплановано до встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Помилка завантаження</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Ліцензію відхилено</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Завантаження: {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Пошук оновлень надбудов… </sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Перевірка оновлень програми...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Доступно одне або кілька оновлень надбудов. </sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Виберіть елементи для оновлення</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Екземпляр розширення</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">Ліцензійна угода {0}</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Прийняти</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Відхилити</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Включити дії &quot;Грати&quot; інтеграції бібліотеки</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Виберіть дію</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Режим стеження</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Шлях відстеження</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Затримка відстеження</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Частота відстеження</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Посилання</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Файл</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Емулятор</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Сценарій</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Типово</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Процес</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Тека</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Оригінальний процес</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Ім'я процесу</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Журналювати повідомлення відстеження</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Наступні зміни перепишуть дані для всіх вибраних ігор!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Відсутня</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Вписати</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Лише елементи</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Тільки початок і кінець</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Чутливість прокручування</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Плавне прокручування</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Швидкість анімації</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Видалити елемент?</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Ви впевнені, що хочете видалити цей елемент?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Показати кнопки на верхній панелі:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Загальні налаштування перегляду</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Налаштування групування</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Параметри сортування</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Шаблони фільтрів</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Позиція елементів плагіну</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Ширина роздільника секцій</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Перемістити кнопку головного меню на бічну панель</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Панель провідника</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Вибір випадкових ігор</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Вибір випадкової гри зі списку</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Вибрати випадкову гру з поточного списку</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Зберегти налаштування групування та сортування</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Показувати як швидкий фільтр у повноекранному режимі</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">За минулі 7 днів</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">За минулий 31день</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">За минулі 365 днів</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Більше 365 днів тому</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Настроїти</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Зберегти шаблон</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Згорнути після початку гри</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Згорнути Playnite після початку гри.\r\n\r\nВимкнення цього може призвести до проблем, коли фокус не перемикається на ігри при запуску! </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Розмір шрифту</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Маленький розмір шрифту</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">Увімкнути API-підтримку контролера</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Підтримка ігрового контролера</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Якщо вимкнено, Playnite ігноруватиме контролер.\r\n        \r\nВимкніть, якщо ви використовуєте інструменти, які імітують мишу/клавіатуру з контролера і ви спостерігаєте подвійні натискання в Playnite.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Показати пункти в головному меню:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Поміняти місцями кнопки X/A на головному екрані</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Міняє прив’язки кнопок для початку гри та показу сторінки з детальною інформацією про гру на головному екрані.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Поміняти місцями кнопки підтвердження/скасування</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Міняє місцями прив’язку кнопок A/B для підтвердження та скасування.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Тільки основний контролер</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Приймати дані лише з основного контролера, коли увімкнено.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Кнопка Guide зміщує фокус на Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Гучність інтерфейсу</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Фонова гучність</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Вимкнути звук у фоновому режимі</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Не вдалося ініціалізувати аудіо інтерфейс.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">API виводу</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API, що використовується для виведення звуку. Змініть, якщо у вас виникли проблеми зі звуком.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Загальні</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Зображення</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Аудіо</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Розташування</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Меню</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Ввід</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} починається… </sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} працює…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Верхній регістр</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Пробіл</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Масштабувальник візуалізації зображень</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Альтернативний</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Збалансований</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Якість</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Якість:\r\nНайкраща якість зображення, повільний, велике використання пам’яті.\r\n    \r\nЗбалансований:\r\nЯкісний, швидкий, низьке використання пам’яті.\r\n    \r\nАльтернативний:\r\nКраща якість, середня швидкість, низьке використання пам’яті.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Обрати файл...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Обрати теку...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Сценарій при запуску</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Зверніть увагу, що розширення та теми можуть значно вплинути на продуктивність, стабільність та безпеку Playnite.\r\n    \r\nЯкщо після встановлення теми або розширення у вас виникають проблеми, спершу спробуйте вимкнути/видалити їх, щоб перевірити, чи вони є причиною проблеми. </sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Вибрати при запуску </sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Вибрати при запуску </sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Вбудовані профілі</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Вбудований профіль</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Користувацькі профілі</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Користувацький профіль</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Обробляється за допомогою вбудованого сценарію</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Специфікація емулятора</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Специфікація платформи</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Специфікація регіону</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Виконати перед запуском емулятора</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Виконати після запуску емулятора</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Виконати після виходу з емулятора</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Виконуваний файл емулятора не знайдено.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Специфікацію емулятора не знайдено.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Сценарій запуску емулятора не знайдено.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Розділити як окремі ігри</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Об’єднати в одну гру</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Встановити платформу </sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Встановити регіон</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Сканувати теку</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Конфігурації сканування</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Виключити шаблони зі сканування контрольної суми </sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Файли, що відповідають зазначеним шаблонам, не перевірятимуться на наявність контрольної суми, і будуть вибрані за назвою файлу. Додаткову інформацію див. на сторінці довідки емулятора.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Сканувати емулятором</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Під час збереження нової конфігурації потрібно встановити назву.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Емулятор або профіль емулятора не встановлено.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Каталог для сканування не вказано або він не існує.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Конфігурація сканування встановлена неправильно. </sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Включити в автоматичне сканування масове сканування </sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Не вдалося просканувати теку на наявність емуляторів.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Не вдалося просканувати теку(и) на наявність емульованих ігор.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Приховати імпортовані</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Профілі для імпорту:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Конфігурації автоматичного сканування</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Зберегти як конфігурацію автоматичного сканування </sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Зберігає конфігурацію для подальшого використання під час оновлення бібліотеки. Збереженими конфігураціями можна керувати за допомогою меню &quot;Налаштування емуляторів&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Імпортувати з використанням відносних шляхів</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">По можливості імпортувати файли гри, використовуючи відносні шляхи до теки встановлення Playnite або емулятора.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Сканувати підтеки</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Сканувати всередині архівів</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Об'єднати пов'язані файли</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Об'єднати пов'язані ігровими файли, наприклад окремі диски, під одним записом гри.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Додати сканер</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Додати збережений сканер</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Почати сканування</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Додати конфігурацію(ї) сканування з емуляторами щоб сканувати конкретні теки. Переконайтесь що емулятори правильно налаштовані до того, як імпортувати ігри (через меню Бібліотека -&gt; Налаштування емуляторів)</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Стан за замовчуванням, призначений для нещодавно доданих ігор</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Статус, призначений іграм, які граються вперше</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Не вдалося ініціалізувати середовище виконання сценарію PowerShell. Якщо ви користуєтесь Windows 7, спробуйте (повторно) встановити PowerShell 5.1, щоб вирішити проблему.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Шаблон фільтрів із зазначеною назвою вже існує. Оновити шаблон з новими налаштуваннями? </sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Автоматично заповнювати пусті поля &quot;Сортування&quot; для ігор, що додаються масово</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">Коли ви редагуєте гру, додайте ігри за допомогою оновлення бібліотеки, скануванням тек емуляторів або нормальним скануванням, автоматично заповнювати поле &quot;Сортування&quot; для кращого сортування ігор за назвами. Наприклад &quot;The Witcher 3&quot; отримає сортувальне ім'я &quot;Witcher 03&quot;. Сортувальне ім'я не буде присвоєно якщо воно не відрізняється від звичайної назви гри, і лише пусті поля сортування будуть автоматично заповнені.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Ці слова буде видалено з початку автоматично заповненого поля &quot;Сортування&quot;:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Використовуйте це для ігнорування слів на початку рядка з метою сортування. За замовчуванням це &quot;The&quot;, &quot;An&quot; і &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Заповнити поле &quot;Сортування&quot; для ігор з пустим полем</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Сортування</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Заповнення полів &quot;Сортування&quot;…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">344 / 5000\r\nРезультати перекладу\r\nБуло виявлено, що служба Nahimic запущена у вашій системі. Відомо, що ця служба викликає проблеми з рендерингом у Playnite (та інших програмах).\r\n\r\nЯкщо ви зіткнулися з будь-яким графічними проблемами в Playnite, ми рекомендуємо вимкнути або повністю видалити службу Nahimic.\r\n\r\nБільше інформації на https://playnite.link/nahimicsucks </sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite працює з правами адміністратора. Це не рекомендується, оскільки це дає підвищені привілеї всім встановленим розширенням і всім іграм/додаткам запущеним з Playnite!\r\n\r\nБільше інформації - https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Показувати попередження, якщо Playnite запущено з правами адміністратора</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Отримати реальний розмір на диску під час розрахунку розміру ігор</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Якщо ввімкнено, сканування відбуватиметься повільніше та отримуватиме реальний розмір файлів на диску.\r\nЯкщо вимкнено, сканування відбуватиметься швидше та використовуватиме розмір самих файлів.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">Повідомлялося, що наступні надбудови є потенційно проблемними або через високий вплив на стабільність/продуктивність або через проблеми з безпекою. Ми настійно рекомендуємо видалити їх:\r\n       \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Виключити онлайн-файли зі сканування</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Файли, що зберігаються в хмарному сховищі, не будуть скануватися та імпортуватися, якщо вони недоступні локально.\r\nПідтримується лише для: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Сканувати, але використовуючи спрощений метод без вмісту файлу</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Файли будуть імпортовані, але за допомогою менш точного методу, який не вимагає завантаження вмісту файлу та його присутності локально.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Застосувати до всіх</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Перевизначити стан встановлення</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Коли задано, Playnite ігноруватиме стан встановлення (включно з каталогом встановлення), встановлений плагіном, який імпортує цю гру.\r\n        \r\nЦей параметр може не повністю працювати з плагінами, які використовують специфічні методи імпорту, хіба що вони також беруть цей параметр до уваги.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Тільки вручну</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Раз на день</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Раз на тиждень</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">При кожному запуску</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Перевірка оновлень програми</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Перевірка оновлень надбудов</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Оновлення бібліотек</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Сканування теки емуляції</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Включати приховані ігри</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Редагувати поля</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Вибрати все / Зняти вибір з усього</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Відкрити</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Активувати</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Призначити</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Почніть вводити текст для пошуку ігор… [F1] для допомоги</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\"># на початку відкриває список доступних команд.\r\n/ на початку відкриває список доступних пошукових систем/плагінів.\r\nВведення ключового слова для пошуку із ПРОБІЛОМ в кінці негайно перемикає на цей пошук.\r\n\r\nTAB: змінити дію\r\nENTER: активувати вибрану дію\r\nSHIFT-ENTER: відкрити меню елементу</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Включити не встановлені ігри</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Включати приховані ігри</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Не встановлені ігри включені</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Не встановлені ігри виключені</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Приховані ігри включені</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Приховані ігри виключені</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Грати або Встановити</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">До подробиць</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Меню гри</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Редагувати гру</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Відкрити пошук</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Поле пошуку</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Кнопка пошуку</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Основна дія гри</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Вторинна дія гри</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F відкриває глобальний пошук замість фокусування на полі пошуку</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Зберігати налаштування фільтру ігор між пошуковими сеансами</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Пошукові системи</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Стандартне ключове слово</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Власне ключове слово</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Загальносистемний ярлик</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Пошук Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Параметри розширення</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Виключення</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Виключені файли під час сканування теки</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Виключені теки під час сканування теки</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Додати файл до списку виключень</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Додати теку до списку виключень</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Виключення можуть бути додані лише для збережених налаштувань сканера.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Винятки були додані до сканера &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Перевизначити платформу</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Коли задано, сканер призначить цю платформу всім іграм, перезаписуючи будь-які автоматично виявлені платформи.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Включити команди до стандартного пошуку</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Коли вимкнено, команди не будуть включені в пошук за умовчанням, доки не буде використано префікс #.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Використовувати нечітку відповідність у фільтрі назв</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Якщо ввімкнено, фільтр назв буде знаходити ігри за назвами так само як і глобальний пошук.\r\nПри необхідності можливо задати сувору відповідність додавши символ ! на початку.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Показувати поля для результатів пошуку гри:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Прихований статус</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Резервне копіювання даних скасовано.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Помилка резервного копіювання даних.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Помилка резервного копіювання даних</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Триває резервне копіювання даних…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Відновлення даних з резервної копії…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Не вдалося відновити дані з резервної копії.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Налаштування</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Бібліотека ігор</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Медіа бібліотеки ігор</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Встановлені розширення</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Дані розширень</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Встановлені теми</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Виберіть дані для відновлення з указаного файлу резервної копії.\r\n    \r\nPlaynite автоматично перезапуститься та почне процес відновлення з резервної копії.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Виберіть елементи, які будуть включені в резервну копію. Параметри застосунку та дані бібліотеки ігор включені за замовчуванням.\r\n    \r\nPlaynite автоматично перезапуститься та почне процес резервного копіювання.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Автоматичне резервне копіювання даних</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Частота автоматичного резервного копіювання</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Тека резервних копій</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Циклічні резервні копії</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Включити додаткові дані:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Якщо ввімкнено автоматичне резервне копіювання необхідно задати теку для його файлів.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Показувати сповіщення лише про нові патчі</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Якщо ввімкнено, лише оновлення, доступні для наразі встановленого основного випуску, призведуть до сповіщення про оновлення.\r\nНові основні випуски не призведуть до сповіщення про оновлення.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Використовувати відносні дати за минулий тиждень</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Використовувати відносні дати у форматі «сьогодні», «вчора» тощо, якщо дата менше ніж тиждень.\r\n    \r\nЗазначений формат дати буде використано для всіх інших дат.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Пошук зображення в Інтернеті</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Рядок пошуку зображення значка</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Рядок пошуку зображення обкладинки</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Рядок пошуку фонового зображення</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Отримання інформації про надбудову…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Немає доступних джерел метаданих</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Налаштування дії &quot;Грати&quot;</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Використовувати параметри сканера</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Вибирати профіль при запуску</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Вибирати емулятор при запуску</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Автоматично</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Завжди увімкнено</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Завжди вимкнено</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Підтримка спеціальних функцій (зчитування з екрана)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Меню застосунку</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Меню гри</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Тека програми</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Каталог даних користувача</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Виявлено пошкодження файлу бібліотеки, Playnite вимкнеться.\r\n    \r\nВідкрийте нову проблему на сторінці Playnite в GitHub із запитом на виправлення пошкодження у ваших файлах.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Бажаєте зберегти внесені зміни?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Портативна установка</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Контролерів не знайдено</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/vi_VN.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">Tiếng Việt</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Ngôn ngữ của Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">Thoát</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">Bộ lọc đang được sử dụng</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">Bộ lọc bị vô hiệu hóa</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">Bộ lọc bổ sung</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">Bộ lọc</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">Lọc</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">Dữ liệu không hợp lệ</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">Lưu các thay đổi?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">Trang chủ: www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">Mã nguồn ở GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">Tạo gói diag.</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">Gửi thông tin diag.</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">Thông tin về Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">Được làm bởi Josef Němec</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">Xếp danh mục</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">Đặt danh mục</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">Thêm danh mục</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">Đã chọn - Chỉ định danh mục \r\nBỏ chọn - Xóa danh mục \r\nKhông xác định - Không thay đổi (khi chỉnh sửa nhiều trò chơi) </sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">Không có danh mục</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">Không có nền tảng</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">Rất tiếc! Đã xảy ra lỗi.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">Đã xảy ra lỗi không thể khôi phục.\r\n\r\nNếu bạn muốn giúp chúng tôi khắc phục sự cố này, vui lòng mô tả ngắn gọn các hành động đã thực hiện trước khi xảy ra sự cố, sau đó gửi thông tin chẩn đoán cho chúng tôi. Nếu bạn đang trực tuyến, thông tin này sẽ được gửi lên máy chủ của Playnite để phân tích.\r\n\r\nNgoài ra, bạn có thể nhấp vào nút 'Báo cáo sự cố' để tạo sự cố mới trên GitHub và báo cáo sự cố theo cách thủ công.\r\n\r\nCám ơn sự giúp đỡ của bạn.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">Tiện ích mở rộng &quot;{0}&quot; đã gây ra lỗi không thể khôi phục.\r\n\r\nChúng tôi khuyên bạn nên lưu tệp nhật ký và báo cáo vấn đề cho nhà phát triển của tiện ích. Nếu sự cố vẫn tái diễn, hãy tắt tiện ích mở rộng.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">Tiện ích mở rộng &quot;{0}&quot; đã gây ra lỗi không thể khôi phục.\r\n\r\nChúng tôi khuyên bạn nên báo cáo vấn đề này cho nhà phát triển của tiện ích. Nếu sự cố vẫn tái diễn, hãy tắt tiện ích mở rộng.</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">Tiện ích mở rộng không xác định hoặc chủ đề gây ra lỗi không thể khôi phục.\r\n\r\nChúng tôi khuyên bạn nên tắt tiện ích bổ sung của bên thứ 3, cô lập tiện ích bổ sung có vấn đề và báo cáo vấn đề với nhà phát triển tiện ích bổ sung.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">Đã xảy ra lỗi không thể khôi phục.\r\n\r\nNếu bạn muốn giúp chúng tôi khắc phục sự cố này, xin vui lòng gửi thông tin chẩn đoán đến cho chúng tôi. Xin cám ơn.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">Tắt tiện ích mở rộng</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">Lưu tệp nhật ký</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">Gửi thông tin chuẩn đoán</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">Báo cáo lỗi</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">Khởi động lại Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">Khởi động lại ở Chế độ An toàn</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">Tắt tất cả các tiện ích mở rộng của bên thứ 3 và sử dụng chủ đề mặc định.</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">Thoát Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">Các hành động đã thực hiện trước khi xảy ra sự cố (viết bằng tiếng Anh):</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">Quản lý Thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">Xóa (các) trò chơi?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">Không thể xóa - Trò chơi hoặc trình cài đặt đang chạy.</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">Không thể gỡ cài đặt - Trò chơi đang chạy.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">Bạn có chắc rằng mình muốn xóa {0}?</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">Bạn có chắc chắn muốn xóa {0} trò chơi này không?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Bạn có chắc rằng muốn gỡ bỏ {0}?\r\n\r\nLựa chọn &quot;thêm vào danh sạch loại trừ&quot; sẽ ngăn việc trò chơi được thêm lại vào lần sau khi cập nhật thư viện.</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">Bạn có chắc chắn muốn xóa {0} trò chơi không?\r\n\r\nViệc chọn tùy chọn &quot;thêm vào danh sách loại trừ&quot; sẽ ngăn trò chơi được thêm lại vào lần sau khi cập nhật thư viện.</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">Bạn có chắc chắn muốn xóa {0} mục hiện không được sử dụng không?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">Không tìm thấy được các trường không sử dụng. </sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">Có (thêm vào danh sách loại trừ)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">Có những thay đổi chưa được lưu trong phần này</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">Đang cập nhật định dạng thư viện trò chơi…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">Cập nhật cơ sở dữ liệu không thành công.</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">Không thể cập nhật thư viện trò chơi. Cần có {0} MB dung lượng trống.</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">Lỗi Game</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">Không thể bắt đầu trò chơi. '{0}' không được tìm thấy trong cơ sở dữ liệu.</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">Không thể bắt đầu trò chơi: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">Không thể thực hiện hành động: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">Không thể mở vị trí trò chơi: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">Không thể xác định dung lượng bộ cài game: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">Lỗi khi truy quét dung lượng cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">Đã có {0} lỗi trong quá trình xác định dung lượng</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">Không tạo được lối tắt: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">Thất bại mở sách hướng dẫn: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">Không thể cài đặt trò chơi: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">Không thể gỡ cài đặt trò chơi: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">Không tìm thấy thao tác nào phù hợp khi khởi động game. Khi sử dụng thao tác giả lập, hãy chắc chắn rằng nền tảng được khớp giữa game và cài đặt của trình giả lập.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">Phần triển khai cài đặt chưa khả dụng. </sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">Plugin thư viện chịu trách nhiệm cho trò chơi này đã bị vô hiệu hóa hoặc chưa được cài đặt.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">Dữ liệu chính thức để tải xuống không tồn tại</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">Không có trò chơi nào được chọn.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">Thực hiện tập lệnh của trò chơi thất bại.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">Mã lệnh thực thi đã thất bại.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">Thực hiện tập lệnh toàn bộ thất bại</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">Thực hiện tập lệnh giả lập thất bại.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">Thực hiện phát tập lện hành động thất bại.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 hoặc mới hơn chưa được cài đặt.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">Không thể tìm cách bắt đầu trò chơi.</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">Đã kích hoạt</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">Đã tắt</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">Xóa bỏ</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">Tẩy bỏ phần không sử dụng.</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">Đổi Tên</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">Sao chép</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">Thêm</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">Biểu tượng mặc định</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">Ảnh bìa mặc định</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">Ảnh nền mặc định</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">Hoàn tất</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">Tiếp theo</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">Quay lại</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">XONG</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">MẶT SAU</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">TRỐNG</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">trống</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">Bỏ qua</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">Bỏ qua tất cả</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">Nhập</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">Tên</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">Tác giả</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">Mô-đun</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">Chuỗi</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">Phiên bản</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">Chơi gần đây nhất</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">Chơi nhiều nhất</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">Số lần chơi</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">Dung Lượng Cài Đặt</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">Thư mục</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">Ghi chú</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">Đã thêm vào.</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">Ngày được thêm vào</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">Đã chỉnh sửa</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">Ngày sửa đổi</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">Địa chỉ web</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">Đường dẫn</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">OK</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">Lưu</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">Đóng</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">Hủy bỏ</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">Xác nhận</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">Thiết lập lại</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">Có</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">Không</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">Chào mừng</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">Người dùng cục bộ</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">Tổng quan</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">Đa phương tiện</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">Liên kết</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">Thiết lập cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">Quản lý thao tác</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">Đang tải xuống…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">Đang tải xuống đa phương tiện…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">Đang tải…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">Loại hình</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">Hồ sơ</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">Các hồ sơ</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">Xóa bỏ</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">Tải xuống</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">Tìm kiếm</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">Độ phân giải:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">Bất kỳ</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">Phóng to</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">Chế độ hiển thị dạng danh sách</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">Bìa</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">Chế độ hiển thị dạng lưới</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">Chế độ hiển thị chi tiết</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">Tùy chỉnh</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">Đường dẫn (URL)</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">Lời cảm ơn sâu sắc</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">Giấy phép</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">Cộng tác viên</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">Thoát Playnite...</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">Hôm nay</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">Hôm qua</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">Thứ Hai</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">Thứ Ba</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">Thứ Tư</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">Thứ Năm</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">Thứ Sáu</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">Thứ Bảy</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">Chủ Nhật</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">Một tuần qua</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">Một tháng qua</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">Một năm qua</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">Cách đây nhiều hơn một năm trước</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 tới 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB tới 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB tới 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB tới 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB tới 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB tới 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB tới 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB hoặc nhiều hơn</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">Đã nhập thành công.</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">Tất cả Trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">ID Trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">ID Cơ sơ dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">Mẫu thiết lặp</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">Cột</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">Các Cột</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">Dòng</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">Các Hàng</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">Không thể tải biểu tượng từ Play action. Không có hành động nào của Loại tệp hiện tại.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">Chỉ tải các Siêu Dữ Liệu cò thiếu</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">Bật tùy chọn này sẽ bỏ qua quá trình tải xuống siêu dữ liệu cho các trường dữ liệu mà đã chứa thông tin. </sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">Lựa chọn trò chơi.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">Xin lựa chọn các trò chơi nào để cập nhật siêu thông tin mới.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">Mọi trò chơi từ cơ sở dữ liệu.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">Tất cả các trò chơi hiện đang được chọn lọc.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">Chỉ các trò chơi đã chọn.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">Chưa chọn trường thông tin phụ</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">Chưa chọn trường thông tin phụ để tải xuống. Vui long chọn ít nhất một, và kích hoạt ít nhất một nhà cung cấp cho nó.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">Cửa Hàng Chính thức.</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">Vui lòng chọn trường nào sẽ được Playnite tự động điền và nguồn nào nên được sử dụng để lấy dữ liệu từ đó. </sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">Vui lòng xem xét nhấp vào biểu trưng ở trên và đóng góp các bản cập nhật cho cơ sở dữ liệu igdb.com để cải thiện các dữ liệu Playnite sử dụng.</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">Đang tải xuống Siêu dữ liệu...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">Đang nhập các trò chơi cài đặt sẵn...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">Đang nhập {0} các trò chơi...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">Đang nhập các trò chơi giả lập từ {0}</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">Đang tải xuống các bản cập nhập thư viện...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">Đang quét dung lượng trò chơi trong thư viện...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">Đang xác định dung lượng những game đã nhập…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">Cập nhật thư viện thành công</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">Đang thả ra các tài nguyên</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">Cấu hình</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">Cài đặt...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">Nền tảng và Phần mềm giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">Cài đặt giả lập...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">Quản lý Thư viện...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">Công cụ</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">Đang tải xuống Siêu dữ liệu...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">Công cụ phần mềm...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">Cài đặt tích hợp...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">Mở Client bên thứ 3</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">Client bên thứ 3</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">Cập nhật Thư viện Game</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">Hủy Cập nhật Thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">Cập nhật các thư mục giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">Thêm Trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">Tự tay thêm...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">Tự động quét...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">Trò chơi giả lập...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Ứng dụng Microsoft Store...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">Về Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">Gửi phản hồi</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">Chuyển sang chế độ toàn màn hình</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">Liên kết</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">Trợ giúp</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">Hỗ trợ trên Patreon</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">Ủng hộ trên Ko-fi</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">Hướng dẫn sử dụng</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">Tài liệu về bộ công cụ phát triển phần mềm</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">Khởi động lại hệ thống</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">Tắt hệ thống</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">Ngưng hệ thống</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">Chế độ ngủ đông</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">Hệ thống Khoá</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">Đăng xuất Người dùng</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">Chọn một trò chơi ngẫu nhiên</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">Các lĩnh vực trò chơi được hiển thị trên bảng chi tiết:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">khoảng cách các mục</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">Vẽ nền mục lưới</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">Chiều rộng đường viền mục lưới</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">Thiếu nguồn biểu tượng trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">Thiếu nguồn bìa game</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">Thiếu nguồn nền trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">Khoảng cách dọc đến chi tiết trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">Vị trí chi tiết chế độ xem lưới</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">Chi tiết xem vị trí danh sách trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">Vẽ dấu phân cách giữa các bảng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">Chiều cao ảnh bìa trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">Chiều cao biểu tượng danh sách trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">Phông chữ ứng dụng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">Phông chữ liền mạch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">Vị trí bảng điều khiển bộ lọc</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">Vị trí bảng điều khiển Explorer \r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">Kết xuất ảnh bìa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">Tỷ lệ khung hình mục tiêu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">Các tùy chọn sau đây cũng ảnh hưởng đến kết xuất ô ở chế độ Toàn màn hình!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">Chế độ kéo dãn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">Hộp DVD</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">Quảng trường</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Biểu ngữ Steam</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam nắp dọc hơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* Cần khởi động lại để áp dụng cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">Cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">Cài đặt chung</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">Bảng điều khiển trên cùng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">Giao diện</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">Chi tiết trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">Bố cục</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">Nâng cao</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">Toàn màn hình</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">Đầu vào</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">Hiệu suất</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">Siêu dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">Đang cập nhật</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">Tìm kiếm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">Sao lưu</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">Sao lưu Dữ liệu Thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">Khôi phục Dữ liệu Sao lưu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">Tự động nhập các thay đổi trong thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">Vị trí tệp cơ sở dữ liệu không hợp lệ, cần đặt đường dẫn tệp thích hợp</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">Tên tài khoản không thể để trống</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">Tải xuống siêu dữ liệu ngay sau khi nhập trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">Chạy Playnite dưới dạng thu nhỏ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">Chạy Playnite cùng lúc với máy tính</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">Khởi động thu gọn ở system tray</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">Thất bại trong việc đưa Playnite vào khởi động cùng lúc với máy tính</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">Chạy ở chế độ toàn màn hình</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">Tải hình ảnh không đồng bộ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">Cải thiện độ mượt mà khi cuộn danh sách trò chơi và đổi lấy thời gian tải hình ảnh chậm hơn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">Hiển thị tên trò chơi nếu thiếu ảnh bìa</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">Hiển thị tên trò chơi ở chế độ xem dạng lưới</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">Làm tối màu các trò chơi chưa được cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">Hiển thị biểu tượng trò chơi ở chế độ xem chi tiết</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">Hiển thị số lượng mục trên mô tả nhóm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">Chỉ hiển thị các trường được chỉ định trên bảng bộ lọc và bảng khám phá</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">Tắt tăng tốc phần cứng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">Sử dụng khi gặp sự cố nói lắp hoặc các sự cố giao diện người dùng tương tự</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">Hiển thị các trò chơi ẩn trong danh sách khởi chạy nhanh</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">Ảnh hưởng đến Danh sách nhảy và danh sách menu khay.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">Số lượng vật phẩm khởi chạy nhanh</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">Sử dụng hình nền trò chơi làm nền cửa sổ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">Làm mở ảnh nền</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">Chất lượng cao</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">Làm tối ảnh nền</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">Hiển thị trên chế độ lưới</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">Chủ đề</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">Hồ sơ chủ đề</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">Chủ đề toàn màn hình</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">Cấu hình chủ đề toàn màn hình</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">Vị trí cơ sở dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">Trạng thái đăng nhập:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Cài đặt Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">Xóa bộ nhớ đệm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">Có thể giải quyết các vấn đề gặp phải khi liên kết tài khoản.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">Hiển thị biểu tượng khay hệ thống</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">Thu nhỏ Playnite vào khay hệ thống</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">Thu nhỏ Playnite vào khay hệ thống khi đóng cửa sổ ứng dụng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">Khi trò chơi bắt đầu:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">Sau khi trò chơi kết thúc:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">Cấu trúc thời gian để hiển thị số ngày đã chơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">Định dạng ngày tháng:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">Điều này sẽ đăng xuất bạn khỏi tất cả các dịch vụ được liên kết. Khởi động lại ứng dụng là bắt buộc, bạn có muốn tiếp tục không?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">Xóa bộ nhớ cache?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Bắt buộc phải khởi động lại Playnite để áp dụng chủ đề mới</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">Nhận thêm các chủ đề</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">Tạo chủ đề mới</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">Thêm tiện ích mở rộng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">tạo tiện ích mở rộng mới</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">Giúp chúng tôi dịch Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite cần được khởi động lại để áp dụng các cài đặt mới. Khởi động lại ngay bây giờ?\r\n\r\nKhởi động lại sẽ hủy mọi tác vụ đang hoạt động (tải xuống) hiện đang được thực hiện.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">Khởi động lại Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite không thể tự động di chuyển các tệp thư viện của bạn. Bạn phải di chuyển / sao chép các tệp theo cách thủ công trước khi thay đổi vị trí. Nếu không có thư viện ở vị trí đích, một thư viện mới sẽ được tạo.\r\n\r\nVị trí cơ sở dữ liệu mới sẽ không được sử dụng cho đến khi Playnite được khởi động lại.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">Thời gian chơi sẽ không được ghi nếu hành động &quot;Đóng&quot; được đặt.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">Số hàng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">Số cột</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">Số lượng hàng xem chi tiết</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">Hiển thị hình nền trên màn hình chính</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">Không áp dụng trở lại các trò chơi hiện có mà không cần tải xuống lại siêu dữ liệu.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">Nhập thời gian chơi của game vào thư viện:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">Thiết lập thời gian Playnite nhập thời gian chơi của game vào cơ sở dữ liệu. Để sử dụng tính năng này cần có sự hỗ trợ của plugin cho thư viện.\r\n\r\nLuôn luôn: Nhập thời gian chơi cho game mới nhập và game đã tồn tại trong cơ sở dữ liệu của Playnite database.\r\nChỉ khi có game mới nhập: Chỉ nhập thời gian chơi của những game vừa thêm vào cơ sở dữ liệu của Playnite.\r\nKhông bao giờ: Không bao giờ nhập thời gian chơi ở mọi hoàn cảnh.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">Luôn luôn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">Chỉ dành cho trò chơi mới được thêm vào</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">Không bao giờ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">Bật hỗ trợ bộ điều khiển trong Chế độ máy tính để bàn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">Nút hướng dẫn mở chế độ Toàn màn hình</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">Cài đặt tải xuống siêu dữ liệu tự động cho các trò chơi mới được nhập</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">Mục tiêu hiển thị</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">Luôn sử dụng màn hình chính</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">Hiện tiêu đề game</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">Hiển thị tình trạng pin</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">Hiển thị phần trăm pin</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">Hiển thị đồng hồ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">Ẩn con trỏ chuột</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">Chỉ được cài đặt trong Bộ lọc nhanh</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">Lời nhắc Nút</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">Bố cục</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">Cuộn ngang</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">Chọn một trong các lựa chọn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">Tùy chỉnh khả dụng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">Không tải được cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">Các tập lệnh này được thực thi cho mọi trò chơi trong thư viện. Các kịch bản riêng lẻ có thể được chỉ định cho từng trò chơi riêng biệt trong khi chỉnh sửa chi tiết trò chơi.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">Tạo hiệu ứng chuyển đổi ảnh nền</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">Cỡ chữ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">Tự động</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">Bí danh</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">Màu xám</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">Loại rõ ràng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Lý tưởng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Hiển thị</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">Chế độ định dạng văn bản</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">Chế độ kết xuất văn bản</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">Các phương pháp kết xuất và định dạng văn bản hiện không được sử dụng cho mô tả trò chơi.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">Tải trước hình nền</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">Nếu được bật, Playnite sẽ tải xuống tác phẩm nghệ thuật nền trong khi tải siêu dữ liệu xuống, sử dụng thêm dung lượng đĩa và cung cấp tác phẩm nghệ thuật khi ngoại tuyến.\r\n\r\nNếu bị tắt, tác phẩm nền chỉ được tải xuống khi cần thiết lần đầu tiên, sử dụng ít dung lượng hơn, nhưng có thể dẫn đến độ trễ trước khi tác phẩm nghệ thuật được hiển thị và một số hình ảnh có thể không khả dụng khi ngoại tuyến.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">Tự động đóng ứng dụng bên thứ ba sau khi trò chơi thoát</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">Độ trễ tắt máy khách (tính bằng giây)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">Không đóng sau các phiên trò chơi ngắn hơn (tính bằng giây)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">Tự động đóng các ứng dụng khách sau:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">Tự động đóng khách hàng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">Nhập danh sách loại trừ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">Hiển thị cảnh báo khi chỉ định phương tiện trò chơi quá lớn</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">Lệnh mở thư mục</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">Tổ chức xếp hạng độ tuổi ưa thích</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">Cập nhật dung lượng cài đặt của game khi cập nhật thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">Quét và cập nhật kích thước cài đặt của trò chơi nếu như phát hiện ra tập tin của chúng được chỉnh sửa từ lần quét gần nhất</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">Không có</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">Lấp đầy</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">Đồng phục</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">Đồng phục để lấp đầy</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">trái</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">phải</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">trên</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">Dưới</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">Lỗi nhập</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">Yêu cầu xác thực</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">Quá trình xác thực đã thất bại</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">Chế độ hiển thị chế độ xem web thay thế</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">Sử dụng khi gặp sự cố với chế độ xem web, ví dụ: hộp thoại xác thực tích hợp.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">Đang tải một phần mô tả game</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">Mô tả chi tiết có thể gây nên độ lag đáng kể khi lựa chọn game.\r\n\r\nKhi được kích hoạt, chỉ một phần của chữ trong mô tả sẽ được nạp ban đầu với lựa chọn nạp phần còn lại khi bạn cần.</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">Nhập siêu dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">Tải xuống siêu dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">Đặt cấu hình đã chọn sẽ được sử dụng cho mọi lần tải xuống siêu dữ liệu trong tương lai.\r\nCũng có thể được thay đổi trong cài đặt ứng dụng.</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">Trình hướng dẫn nhập mô phỏng</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">Trình hướng dẫn này sẽ hướng dẫn bạn quá trình tải xuống và nhập trình giả lập bảng điều khiển và nhập trò chơi được mô phỏng.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">Hãy nhớ rằng bạn luôn có thể thêm trình giả lập và / hoặc trò chơi bổ sung sau này thông qua menu chính (trong menu &quot;Thư viện&quot; cho cài đặt Trình giả lập và menu &quot;Thêm trò chơi&quot; cho các trò chơi được mô phỏng).</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">Dưới đây là danh sách các trình giả lập mà Playnite có thể nhận dạng và định cấu hình tự động. Bạn có thể tải xuống trình cài đặt giả lập từ trang web của họ. Sau khi bạn đã cài đặt trình giả lập (theo cách thủ công), bạn có thể nhập chúng vào hộp thoại cấu hình trình giả lập.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">Bạn có thể nhập bất kỳ trình giả lập nào được cài đặt trên PC của mình bằng cách nhấp vào nút 'Tự động phát hiện từ thư mục…'. Playnite sẽ tìm kiếm thư mục đã chọn cho bất kỳ trình giả lập nào đã biết và cung cấp tùy chọn để nhập chúng. Bạn có thể sử dụng nút này nhiều lần để nhập trình giả lập từ các thư mục khác nhau. Trình giả lập sẽ được thêm vào cuối danh sách hiện tại.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">Bạn có thể nhập trò chơi bằng cách nhấp vào nút 'Quét thư mục bằng trình giả lập'. Việc chọn trình giả lập thích hợp sẽ cho Playnite biết loại tệp nào nên được quét và nhập. Bạn có thể sử dụng nút này nhiều lần để nhập trò chơi từ các thư mục khác nhau. Trò chơi sẽ được thêm vào cuối danh sách hiện tại.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">Không có trình giả lập nào được chọn để nhập. Bạn sẽ không thể tự động nhập bất kỳ trò chơi giả lập nào nếu không định cấu hình trình giả lập trước. Bạn có chắc chắn muốn tiếp tục và thoát khỏi quá trình nhập không?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Không có trình giả lập nào được định cấu hình trong Playnite. Bạn không thể nhập trò chơi mà không định cấu hình trình giả lập trước và chọn loại tệp thích hợp. Bạn có muốn thêm một số trình giả lập bây giờ không?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">Quét thư mục bằng Trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">Chọn file</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">Tự động phát hiện từ thư mục…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">Định cấu hình Trình giả lập…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">Đang quét...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">Đang quét {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">Cấu hình lần đầu tiên</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">Quá trình này sẽ hướng dẫn bạn cách nhập tự động và cấu hình các thư viện trò chơi bên ngoài. Playnite có thể tự động nhập trò chơi từ nhiều dịch vụ trò chơi, chẳng hạn như Steam hoặc GOG.\r\n\r\nHãy nhớ rằng bạn cũng có thể thêm thủ công bất kỳ trò chơi tùy chỉnh hoặc giả lập nào cho bất kỳ nền tảng nào sau đó từ menu chính.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">Tích hợp Thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">Sau đây là danh sách một số tích hợp thư viện được quản lý mà Playnite hỗ trợ. Vui lòng chọn những cái bạn muốn cài đặt.\r\n\r\nCác tích hợp khác có thể được cài đặt sau từ menu &quot;Tiện ích bổ sung&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">Cấu hình đã hoàn thành</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">Thiết lập ban đầu đã được hoàn thành. Hãy nhớ rằng bạn có thể thay đổi tất cả cài đặt sau này cũng như thêm các tích hợp bổ sung từ menu chính.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">Không thể tải xuống một hoặc nhiều tiện ích mở rộng.\r\n\r\nBạn có thể thử tải xuống lại các tích hợp từ menu tiện ích bổ sung sau khi trình hướng dẫn chạy lần đầu tiên kết thúc.</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">Đang tải xuống tích hợp {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">Đang tải danh sách những tệp nhúng…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">Thất bại trong việc tải danh sách của những trình nhúng được đề xuất. Bạn có thể thử tải lại sau đó thông qua menu Addons.</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">Định cấu hình nền tảng và trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">Định cấu hình Trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">Các nền tảng</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">Nền tảng</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">Các trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">Trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">Thêm nền tảng</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">Chọn Biểu tượng</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">Chọn bìa</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">Chọn ảnh</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">Chọn vật phẩm</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">Lưa chọn nền</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">Chọn tập tin</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">Đặt URL</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">Thêm trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">Nền tảng được hỗ trợ</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">Bạn có muốn lưu các thay đổi nền tảng không?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">Bạn có muốn lưu các thay đổi của trình giả lập không?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">Thực hiện</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">Tham số</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">Thư mục làm việc</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">Các loại tập tin được hỗ trợ</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">Nhập trình giả lập…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">Tải trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">Tải đối số đặt trước từ cấu hình trình giả lập đã biết</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">Bạn có chắc chắn muốn xóa trình mô phỏng {0} không?\r\nNó hiện đang được sử dụng bởi {1} trò chơi.</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">Bạn có chắc chắn muốn xóa nền tảng {0} không?\r\nNó hiện đang được sử dụng bởi {1} (các) trò chơi và {2} trình mô phỏng.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">Trợ giúp cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">Sắp xếp theo</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">Hướng Sắp xếp</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">Nhóm theo</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">Theo tăng dần</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">Xếp giảm dần</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">Đừng nhóm danh sách</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">Nhóm theo Thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">Nhóm theo danh mục</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">Nhóm theo Thể loại</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">Kiểu hiển thị:</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">Hiển thị</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">Bảng điều khiển Explorer</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">Bảng điều khiển bộ lọc</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">Biểu tượng</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">Biểu tượng Thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">Ảnh bìa</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">Hình nền</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">Tên sắp xếp</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">Thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">Thủ công</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">Tên</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">Ổ cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">Tên tài khoản</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">Nền tảng</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">Danh mục</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">Thể Loại</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">Ngày phát hành</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">Năm phát hành</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">Nhà phát triển</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">Thẻ:</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">Những nhà phát triển</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">Trạng thái cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">Khớp tất cả các bộ lọc</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">Nếu được bật, chỉ những trò chơi sử dụng tất cả các mục trong tất cả các bộ lọc mới được đưa vào chế độ xem.\r\nNếu bị tắt, các trò chơi sử dụng bất kỳ mục nào trong bất kỳ bộ lọc nào sẽ được đưa vào chế độ xem.</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">Đã cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">Đã cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">Chưa cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">Ẩn</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">Sản phẩm yêu thích</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">Kích hoạt Hỗ trợ HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">Khi được bật, HDR sẽ được kích hoạt ở màn hình chính trước khi mở game.</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">Lưu ý rằng màn hình chính của bạn không hỗ trợ HDR.</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">Lần chơi cuối</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">Danh mục</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">Mô tả</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">Thư mục cài đặt cửa hàng</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">Ảnh bìa</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">Liên kết</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">Đường dẫn hình ảnh, ROM hoặc ISO</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">Thể loại</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">Các thể loại</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">Công ty</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">các công ty</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">Nhà phát triển</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">Các nhà phát triển</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">Nhà xuất bản</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">Những nhà phát triển</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">Danh mục</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">Các danh mục</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">Thẻ:</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">Các thẻ</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">Tính năng nổi bật</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">Các tính năng</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">Xếp hạng độ tuổi</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">Xếp hạng độ tuổi</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">Khu vực</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">Các khu vực</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">Mã nguồn</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">Các đoạn mã nguồn</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">Hoạt động gần đây</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">Lỗi cơ sở dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">Không mở được cơ sở dữ liệu thư viện.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">Cơ sở dữ liệu không thể mở được.</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">Không thể truy cập cơ sở dữ liệu thư viện. Tệp &quot;{0}&quot; đang được sử dụng bởi một quy trình khác hoặc tệp ở vị trí không thể truy cập được.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">Không tạo được gói chẩn đoán.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">Không thể tự động tải lên gói chẩn đoán.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">Thông tin trong mẫu đã được gửi thành công.</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">Gói chẩn đoán đã được tạo và gửi thành công.\r\nVui lòng đính kèm ID sau vào báo cáo sự cố của bạn:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">Không thể nhập trò chơi từ {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">Không thể nhập trò chơi mô phỏng từ {0}.</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">Không thể tìm kiếm trò chơi theo cấu hình trình giả lập đã chọn. Hồ sơ không chứa bất kỳ phần mở rộng hoặc nền tảng tệp nào.</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite không khởi động được. Vui lòng đóng tất cả các phiên bản khác và thử lại.</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">Không áp dụng được chủ đề &quot;{0}&quot;, cấu hình màu &quot;{1}&quot;\r\n\r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">Không thể mở liên kết, URL không có định dạng hợp lệ.</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">Không thể khởi động ứng dụng</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">Thất bại khi khởi tạo màn hình web. Playnite không thể tiếp tục khởi động.\r\n\r\nThông tin thêm tại https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">Không thể nhập trình mô phỏng do tệp định nghĩa bị thiếu hoặc bị hỏng.</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">Không thực hiện được hành động trên menu.</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">Sử Thông tin game</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">URL ảnh</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">Thêm liên kết</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">Thêm ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">Lưu thay đổi</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">Áp dụng các thay đổi trường cho trò chơi (đang) đang được chỉnh sửa.</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">Thêm Hành động</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">Xóa bỏ</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">Xóa bỏ hành động</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">Thêm Trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">Quét thư mục…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">Phát hiện đã cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">Duyệt qua...</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">Mở Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">Cài đặt cấu hình</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">Tên trò chơi không được để trống.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">Thư mục theo dõi hành động trò chơi không được để trống.</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">Không được để trống tên trò chơi trước khi tìm kiếm siêu dữ liệu.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">Dữ liệu không hợp lệ</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">Nhập URL web hợp lệ bắt đầu bằng http: // hoặc https: //</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">Đặt URL</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">Không tải xuống được siêu dữ liệu: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">Lỗi Tải Xuống</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">Xoá bộ lọc</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">Tài khoản cá nhân</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">Tài khoản công khai</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">Khoá API</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">Lỗi khởi động</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">Lỗi chủ đề</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">Xóa tất cả</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">Đang cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">Gỡ cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">Ra mắt</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">Đang hoạt động</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">URL không hợp lệ</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">Không làm gì cả</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">Thu nhỏ cửa sổ</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">Khôi phục cửa sổ</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">Khôi phục cửa sổ chỉ khi nào khởi động từ UI</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">Đóng cửa sổ</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">Thay đổi</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">Nâng cao</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">Không bao giờ</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">Trạng thái</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">Trạng thái hoàn thành</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">Thành tích của Game thủ</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">Điểm phê bình</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">Điểm cộng đồng</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">Mã lệnh game</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">Mã lệnh chương trình</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">Tập lệnh</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">Bổ sung</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">Nguồn siêu dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">Tiện ích mở rộng</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">ID tiện ích mở rộng</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">Tải lại Tập tin Script</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">Tương tác với PowerShell SDK</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">Tất cả các tập lệnh đã được tải lại thành công.</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">Không tìm thấy trò chơi nào cho tiêu chí tìm kiếm / bộ lọc được chỉ định</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">không tìm thấy vật nào</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">Chuyển sang Chế độ máy tính để bàn</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">Thoát Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">Các thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">Cập nhật tất cả</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">Tạo bởi:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">Phiên bản:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">Đã cập nhật:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">Mô-đun:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">Thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">Số liệu thống kê</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">Tất cả</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">Không có</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">Thông báo</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">Rộng</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">Cao</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">Kích cỡ</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">Nhỏ</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">Bình thường</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">Lớn</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">Lớn hơn</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">Lớn nhất</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">Mặc định</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">Chọn</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">Chọn tất cả</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">Bỏ chọn Tất cả</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">Đầu tiên</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">Ngẫu Nhiên</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">Người dùng lựa chọn</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">Tải thêm</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">Trong suốt</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">Thu nhỏ</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">Mở rộng</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">Thu gọn tất cả</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">Mở rộng tất cả</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">Khác</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">Chủ đề</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">Đối số của trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">đổi số tích hợp</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">Đối số của trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">Đối số giả lập bổ xung</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">Ghi đè các đối số của Trình mô phỏng</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">Chơi hành động</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">Chọn siêu dữ liệu để nhập</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">Chọn trò chơi để nhập</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">Tìm kiếm siêu dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">Bản cập nhật có sẵn</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">Những thay đổi kể từ lần cập nhật cuối cùng</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">Tải xuống và cài đặt bản cập nhật</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">Kiểm Tra Cập Nhật</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">Cập nhật bị lỗi</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">Không thể kiểm tra phiên bản mới.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">Không tìm thấy phiên bản mới, bạn đã cập nhật.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">Không thể tải xuống và cài đặt bản cập nhật.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">Một số tác vụ hiện đang chạy trong nền. Bạn có muốn hủy bỏ nó và tiếp tục cập nhật không?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">Một số tác vụ hiện đang chạy trong nền. Bạn có muốn hủy bỏ nó và thoát Playnite không?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">Một số tác vụ nền hiện đang được thực hiện. Chuyển đổi chế độ sẽ hủy tác vụ, bạn có muốn chuyển đổi không?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Đã có bản cập nhật cho Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">Tải lại danh sách chủ đề</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">Áp dụng các chủ đề đã chọn</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">Xem các thay đổi của tệp</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">Tự động áp dụng chủ đề khi tệp nguồn thay đổi</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">Thời gian chạy tập lệnh</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">Thực thi trước khi bắt đầu trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">Thực thi sau khi thoát khỏi trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">Thực thi sau khi trò chơi được bắt đầu</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">Thực thi khi ứng dụng được khởi động</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">Thực thi khi ứng dụng bị thoát</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">Trò chơi bắt đầu...</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">Trò chơi bắt đầu...</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">Lệnh trò chơi đã dừng</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">Thực thi tập lệnh toàn cầu</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">Toàn cầu</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">Bộ lọc</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">Đang tiến hành</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">Mới</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">Tập lệnh thử nghiệm</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">Chỉ hiện thị các mục đã được chọn</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">Lưu thành mặc định?</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">Thêm vào mục yêu thích</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">Loại bỏ khỏi mục ưa thích</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">Ẩn khỏi mục ưa thích</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">Xóa khỏi danh sách ẩn</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">Kích hoạt Hỗ trợ HDR</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">Tắt Hỗ trợ HDR</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">chỉnh sửa</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">Tính toán kích cỡ cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">Tính toán dung lượng cài đặt (Tất cả game)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">Tính toán dung lượng cài đặt (Chỉ đối với dữ liệu thiếu)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">Dung lượng cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">Đặt danh mục…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">Trạng thái hoàn thành</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">Xóa bỏ</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">Chơi</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">Cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">Cài đặt game</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">Thông tin chi tiết</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">Gỡ cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">Mở vị trí cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">Tạo lối tắt trên Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">Mở hướng dẫn sử dụng</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">Thêm</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">Được quản lý bởi đầu vào thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">Quá trình bắt đầu trò chơi sẽ được quản lý bởi plugin thư viện chịu trách nhiệm về trò chơi này.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">Không có thông tin liên quan nào về trò chơi '{0}' được tìm thấy trên trang được chỉ định.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">Mẹo: Bạn có thể sử dụng quy trình tải xuống siêu dữ liệu nâng cao hơn trong khi chỉnh sửa trò chơi đơn lẻ thông qua tùy chọn menu &quot;Chỉnh sửa&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">Không khả dụng khi một số hành động đang diễn ra.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">Văn bản mô tả nhạy cảm với cú pháp HTML</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">Thời gian trò chơi được tính bằng giây.</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">Dung lượng cài đặt được hiển thị dạng byte</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">Ngày phát hành phải được đặt ở định dạng 'năm-tháng-ngày'. Giá trị Tháng và Ngày có thể bị bỏ qua</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">Giá trị từ 0 đến 100 hoặc trống không có điểm.</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">\r\nSự phát triển của Playnite được hỗ trợ bởi những khách hàng quen thuộc và các thành viên của Ko-fi sau:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">Mã, bản địa hóa và những người đóng góp khác không theo thứ tự cụ thể:</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">Hủy theo dõi trò chơi?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">Giám sát cài đặt hiện đang chạy. Bạn có muốn hủy quá trình và đưa trò chơi về trạng thái trước đó không?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">Giám sát thực thi trò chơi hiện đang chạy. Bạn có muốn hủy quá trình và đưa trò chơi về trạng thái trước đó không?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">Thời gian chơi</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">Lần chơi cuối</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0} ngày {1} giờ {2} phút</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0} giờ {1} phút</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} phút</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} giây</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">Chưa chơi</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">Đang mở chế độ Máy tính để bàn…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">Đang mở chế độ Toàn màn hình…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\"> </sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">Đang tính toán dung lượng cài đặt của …</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">Đang tính toán dung lượng cài đặt của {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">Không cài đặt được tệp tập lệnh.</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">Tập lệnh đã được cài đặt thành công.</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">Cài đặt tập lệnh</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">tập lệnh lỗi</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">Không thực hiện được chức năng tiện ích mở rộng.</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">Mở thư mục siêu dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">Tính toán</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">Tự động tính toán kích thước cài đặt bằng Roms nếu trò chơi có hoặc tự động chọn nơi cài đặt game nếu như chưa được thiết lập</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">Ứng dụng khách {0} chưa được cài đặt.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">Ứng dụng khách {0} bây giờ sẽ mở. Vui lòng đăng nhập và sau đó đóng thông báo này.</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">Đang đợi người dùng đăng nhập, vui lòng đóng phần này khi bạn hoàn tất…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">Không tìm thấy thư mục cài đặt trò chơi.</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">Cấu hình hành động trò chơi không hợp lệ.</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">Khắc phục sự cố đồng bộ hóa tài khoản</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">Khắc phục sự cố</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">Đổi tên thư mục</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">Thêm mục mới</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">Nhập tên</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">Nhập tên mới</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">ít hơn một giờ</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 đến 10 giờ</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 đến 100 giờ</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 đến 500 giờ</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 đến 1000 giờ</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">Hơn 1000 giờ</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite phải được khởi động lại để hoàn tất quá trình cài đặt. Bạn có muốn khởi động lại bây giờ không?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">Tiện ích mở rộng không được đóng gói đúng cách.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">Chủ đề không được đóng gói đúng cách.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">Không thể tải đúng tiện ích &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">Không thể tải tiện ích mở rộng &quot;{0}&quot;, phiên bản Playnite hiện tại không được hỗ trợ.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">Không thể tải đúng tiện ích &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">Không thể tải giao diện mở rộng &quot;{0}&quot;, phiên bản Playnite hiện tại không được hỗ trợ.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">Không thể tải đúng tiện ích &quot;&quot;.</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">Không thể tải đúng tiện ích &quot;&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">Chủ đề / Tiện ích mở rộng đang sử dụng phiên bản API không được hỗ trợ.</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">Cài đặt thành công</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">Cài đặt tiện ích bổ sung</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">Cài đặt chung</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">Không cài đặt được tiện ích bổ sung &quot;{0}&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">Không cài đặt được tiện ích mở rộng.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">Bạn có muốn cài đặt một tiện ích mở rộng mới không?\r\n\r\n{0}\r\nBởi 1}\r\nPhiên bản {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">Bạn có muốn cập nhật tiện ích mở rộng &quot;{0}&quot; không?\r\n\r\nPhiên bản hiện tại: {1}\r\nPhiên bản mới: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">Không cài đặt được tiện ích mở rộng.\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">Bạn có muốn cài đặt một tiện ích mở rộng mới không?\r\n\r\n{0}\r\nBởi 1}\r\nPhiên bản {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">Bạn có muốn cập nhật tiện ích mở rộng &quot;{0}&quot; không?\r\n\r\nPhiên bản hiện tại: {1}\r\nPhiên bản mới: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">Bạn sắp rời Playnite và điều hướng đến trang web sau bằng trình duyệt web mặc định của mình. Bạn có muốn tiếp tục?\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">(Các) hình ảnh đã chọn có thể quá lớn để có hiệu suất tối ưu. Việc sử dụng hình ảnh rất lớn có thể dẫn đến khả năng phản hồi giao diện người dùng kém hơn và tăng mức sử dụng bộ nhớ.\r\n\r\nĐộ phân giải khuyến nghị tối đa:\r\nBiểu tượng: {0} mega pixel\r\nBìa: {1} mega pixel\r\nNền: {2} mega pixel</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">Cảnh báo Hiệu suất</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">Không hiện thị lại</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">Tệp có phần mở rộng {0} không tương thích.</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">Phần mở rộng tập tin không hợp lệ</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">Tệp hình ảnh đã chọn có thể quá lớn để có hiệu suất tối ưu.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">Bạn có chắc chắn muốn gỡ cài đặt chủ đề đã chọn không? Quá trình gỡ cài đặt sẽ được xếp hàng để bắt đầu ứng dụng tiếp theo.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">Không thể gỡ cài đặt các chủ đề cài sẵn.</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">Chủ đề này không hỗ trợ phiên bản Playnite này.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">Bạn có chắc chắn muốn gỡ cài đặt chủ đề đã chọn không? Quá trình gỡ cài đặt sẽ được xếp hàng để bắt đầu ứng dụng tiếp theo.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">Không thể gỡ cài đặt các tiện ích mở rộng tích hợp.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">Chủ đề này không hỗ trợ phiên bản Playnite này.</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">Thư mục cài đặt cửa hàng</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">Thư mục dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">Đang tạo gói chẩn đoán…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">Đang tải lên gói chẩn đoán…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">Nhập tập tin...</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">Đây là cái gì?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">Bạn có chắc bạn muốn thực hiện điều này?</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">Tổng thời gian chơi</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">Thời gian trung bình</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">Tổng thời gian chơi</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">Tổng dung lượng cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">Tổng quan</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">Thanh lệnh bên cạnh</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">Hiển thị thanh tiện ích bên trái</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">Đặt lại cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">Tất cả cài đặt ứng dụng sẽ được đặt lại về giá trị mặc định, ngoại trừ:\r\n- Vị trí cơ sở dữ liệu\r\n- Nhập danh sách loại trừ\r\n- Cài đặt tiện ích mở rộng, bao gồm cả tích hợp thư viện\r\n    \r\nYêu cầu khởi động lại ứng dụng để kết thúc quá trình. Bạn có muốn đặt lại cài đặt không?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">Cho các lập trình viên</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">Phần mở rộng bên ngoài</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">Nhập đường dẫn thư mục đầy đủ.</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">Thành tựu</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">Diễn đàn</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">Tin mới</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">Trang cửa hàng</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">Cài đặt lần đầu chưa hoàn tất. Playnite sẽ khởi động lại ở chế độ Desktop để hoàn tất thiết lập.</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">Được chơi gần đây</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">Ưa thích</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">Được chơi nhiều nhất</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">Toàn bộ</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">Một số bộ lọc được áp dụng.</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">Có các bộ lọc bổ sung được áp dụng</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">Hiển thị kết quả tìm kiếm cho:</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">Một mục có cùng tên đã tồn tại.</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">Giới hạn lựa chọn đối với bộ lọc hiện tại</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">Chọn cái khác</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">Tiện ích bổ sung...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">Đã cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">Cài đặt phần mở rộng</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">Duyệt</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">Cập nhật</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">Cập nhật ({0})</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">Việc quản lý các chủ đề và phần mở rộng đã cài đặt, bao gồm cả cài đặt trong đó, đã được chuyển sang menu &quot;Tiện ích bổ sung&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">Tất cả các phần mở rộng tích hợp thư viện hiện được cài đặt có thể được định cấu hình tại đây.\r\n\r\nNếu bạn muốn cài đặt hoặc gỡ cài đặt các tích hợp bổ sung, hãy sử dụng tùy chọn &quot;Tiện ích bổ sung&quot; từ menu chính.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">Chủ đề Desktop</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">Chủ đề Toàn màn hình</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">Đang tìm kiếm...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">Tiện ích bổ sung không tương thích với phiên bản Playnite này.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">Không thể tải xuống gói cài đặt tiện ích bổ sung.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">Không thể tải xuống tệp kê khai cài đặt tiện ích bổ sung.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">Khởi động lại ứng dụng là bắt buộc để áp dụng các thay đổi đang chờ xử lý.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">Tiện ích bổ sung này được lên lịch cài đặt.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">Cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">Cài đặt lại</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">Gỡ cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">Đã được cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">Không tìm thấy bản cập nhật tiện ích bổ sung mới nào.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">Cập nhật tiện ích bổ sung</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">Changelog không khả dụng</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">Đã lên lịch để cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">Tải xuống thất bại</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">Giấy phép bị từ chối</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">Đang tải xuống {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">Tìm kiếm bản cập nhật cho tiện ích bổ sung...</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">Đang tìm cập nhật của app</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">Một hoặc vài bản cập nhật cho tiện ích bổ sung đang khả dụng.</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">Chọn mục để cập nhật</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">Phiên bản phát triển tiện ích mở rộng</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} Điều khoản của thỏa thuận cấp phép</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">Đồng ý</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">Không đồng ý</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">Bao gồm các hành động chơi tích hợp thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">Chọn hành động</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">Trang Theo Dõi</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">Đường dẫn Đánh dấu</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">Độ trễ theo dõi ban đầu</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">Tần số theo dõi</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">Đường link</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">Tập tin</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">Các trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">Nội dung</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">Mặc định</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">Tiến trình</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">Thư mục</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">Tiến trình ban đầu</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">Tên tiến trình</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">Kênh tin nhắn</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">Các thay đổi sau sẽ ghi đè dữ liệu cho tất cả các trò chơi hiện được chọn!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">Không có</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">Đồng phục</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">Chỉ các mặt hàng</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">Thời gian bắt đầu và kết thúc</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">Độ nhạy thanh cuộn</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">Làm mượt thanh cuộn</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">Tốc độ hoạt ảnh</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">Loại bỏ mục</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">Bạn có chắc rằng bạn muốn xóa sản phẩm này?</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">Hiển thị các nút trên bảng điều khiển trên cùng:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">Thiết lập chung</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">Cài đặt nhóm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">Cài đặt sắp xếp</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">Lọc cài đặt trước</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">Vị trí các mục plugin</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">Chiều rộng phân cách phần</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">Di chuyển nút menu chính sang thanh bên</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">Bảng điều khiển Explorer</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">Bộ chọn trò chơi ngẫu nhiên</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">Chọn game ngẫu nhiên</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">Chọn game ngẫu nhiên trong danh sách</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">Lưu cài đặt nhóm và sắp xếp</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">Hiển thị dưới dạng bộ lọc nhanh ở chế độ Toàn màn hình</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">Trong 7 ngày qua</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">Trong 31 ngày gần đây</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">Trong 365 ngày qua</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">Hơn 365 ngày trước</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">Đặt lại cấu hình</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">Lưu cài đặt trước</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">Thu nhỏ sau khi bắt đầu trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">Thu nhỏ Playnite sau khi trò chơi được bắt đầu.\r\n\r\nViệc vô hiệu hóa tính năng này có thể dẫn đến sự cố game không nhận được đầu vào khi khởi động!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">Kích cỡ phông chữ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">Kích thước phông chữ nhỏ</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">Bật hỗ trợ cho API tay cầm trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">Hỗ trợ tay cầm</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">Nếu bị tắt, Playnite sẽ không chấp thuận bất kì đầu vào của thiết bị điều khiển nào.\r\n\r\nTắt đi nếu bạn sử dụng công cụ để chuyển tín hiệu đầu vào của tay cầm sang chuột/bàn phím và bạn đang nhận được hai đầu vào trong Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">Hiển thị các mục trên menu chính:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">Liên kết nút xem chính X / A đảo ngược</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">Hoán đổi các ràng buộc nút để bắt đầu trò chơi và hiển thị trang chi tiết trò chơi trên giao diện chính.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">Đảo vị trí nút xác nhận/hủy bỏ </sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">Đảo ngược vị trí các nút A/B cho việc xác nhận và hủy bỏ.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">Chỉ tay cầm chính</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">Chỉ cho phép nhập liệu từ tay cầm chính khi được bật.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">Nút Guide tập trung vào Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">Giao diện âm thanh</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">Âm lượng nền</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">Tắt âm thanh khi ở chế độ nền</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">Không thể khởi chạy giao diện âm thanh.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">Đầu ra API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">API được sử dụng cho đầu ra âm thanh. Thay đổi nếu bạn đang gặp sự cố với âm thanh.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">Tổng quan</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">Hình ảnh</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">Âm thanh</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">Bố cục</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">Bảng chọn</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">Đầu vào</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0} đang bắt đầu…</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0} đang chạy…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">Caps</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">Nút cách</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">Bộ chia tỷ lệ kết xuất hình ảnh</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">Thay thế</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">Cân bằng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">Chất lượng</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">Chất lượng:\r\nChất lượng hình ảnh tốt nhất, chậm, sử dụng nhiều bộ nhớ.\r\n    \r\nCân bằng:\r\nChất lượng tốt, nhanh, sử dụng ít bộ nhớ.\r\n    \r\nThay thế:\r\nChất lượng tốt hơn, tốc độ trung bình, sử dụng bộ nhớ thấp.</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">Chọn tập tin…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">Chọn thư mục…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">Tập lệnh khởi động</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">Xin lưu ý rằng cả phần mở rộng và chủ đề đều có thể ảnh hưởng lớn đến hiệu suất, sự ổn định và bảo mật của Playnite.\r\n    \r\nNếu bạn bắt đầu gặp một số sự cố sau khi cài đặt chủ đề hoặc phần mở rộng, trước tiên hãy thử tắt/gỡ cài đặt chúng để xem chúng có phải là gốc của sự cố hay không.</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">Chọn khi khởi động</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">Chọn khi khởi động</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">Cấu hình tích hợp</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">Hồ sơ cài sẵn</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">Hồ sơ tùy chỉnh</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">Hỗ sơ tùy chỉnh</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">Được xử lý bởi một tập lệnh cài sẵn</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">Đặc điểm giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">Đặc điểm kỹ thuật nền tảng</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">Đặc điểm kỹ thuật khu vực</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">Thực thi trước khi bắt đầu trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">Thực thi sau khi trình giả lập được khởi động</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">Thực thi sau khi thoát trình giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">Không tìm thấy tệp thực thi giả lập.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">Không tìm thấy thông số kỹ thuật giả lập.</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">Không tìm thấy tập lệnh khởi động trình giả lập.</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">Chia thành các trò chơi riêng biệt</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">Hợp nhất thành một trò chơi</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">Đặt nền tảng</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">Đặt khu vực</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">Quét thư mục</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">Quét cấu hình</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">Loại trừ các mẫu khỏi quá trình quét tổng kiểm tra</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">Các tệp khớp với (các) mẫu đã chỉ định sẽ không được quét để kiểm tra tổng và sẽ được khớp theo tên tệp. Xem trang trợ giúp của trình giả lập để biết thêm thông tin.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">Quét bằng trình giả lập</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">Tên phải được đặt khi lưu cấu hình mới.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">Trình giả lập hoặc hồ sơ trình giả lập chưa được đặt.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">Thư mục để quét không được chỉ định hoặc nó không tồn tại.</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">Cấu hình quét không được đặt đúng cách.</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">Bao gồm tự động quét quét hàng loạt</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">Không quét được thư mục cho trình giả lập.</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">Không quét được (các) thư mục cho các trò chơi được mô phỏng.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">Ẩn đã nhập</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">Hồ sơ cần nhập:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">Cấu hình tự động quét</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">Lưu dưới dạng cấu hình tự động quét</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">Lưu cấu hình để sử dụng sau này trong quá trình cập nhật thư viện. Các cấu hình đã lưu có thể được quản lý thông qua menu &quot;Định cấu hình trình giả lập&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">Nhập liệu sử dụng đường dẫn tương đồng</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">Nếu có thể, nhập file game cho thư mục cài đặt của Playnite (hoặc thư mục cài đặt của trình giả lập) bằng cách sử dụng đường dẫn tương đồng.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">Quét thư mục con</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">Quét trong file nén</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">Gộp những file liên quan</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">Gộp các file tương đồng của game (như các đĩa rời) thành dạng một đầu vào.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">Thêm máy quét</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">Thêm máy quét đã lưu</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">Bắt đầu quét</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">Thêm (các) cấu hình quét bằng trình giả lập để quét các thư mục cụ thể. Đảm bảo rằng trình giả lập được định cấu hình đúng cách trước khi nhập trò chơi (thông qua menu Thư viện -&gt; Định cấu hình trình giả lập).</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">Trạng thái mặc định được chỉ định cho các trò chơi mới được thêm vào</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">Trạng thái được chỉ định cho các trò chơi được chơi lần đầu tiên</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">Không thể khởi chạy thời gian chạy tập lệnh PowerShell. Nếu bạn là người dùng Windows 7, hãy thử cài đặt (lại) PowerShell 5.1 để khắc phục sự cố.</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">Bộ lọc đặt trước với tên được chỉ định đã tồn tại. Cập nhật cài đặt trước với cài đặt mới?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">Tự động điền những tên bị thiếu cho game đã sửa thông tin hoặc thêm cả loạt</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">Khi bạn sửa thông tin game, thêm game mới qua cập nhật của kho game, quét thư mục trình giả lập, hoặc quét thư mục thông thường, tự động điền trường 'Tên Sắp xếp' với tên dễ sắp xếp hơn của tên các game. Ví dụ, &quot;The Witcher 3&quot; sẽ có tên để xếp là &quot;Witcher 03&quot;. Như thế sẽ không đặt tên để xếp mà khác với tên game, và app sẽ chỉ tự động cập nhật tên để xếp mà còn trống.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">Những từ sau sẽ bị gỡ bỏ khi khởi động tiến trình tự đặt Tên Sắp xếp:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">Sử dụng tính năng này để bỏ qua những từ nằm ở đầu chuỗi ký tự để phục vụ việc sắp xếp. Mặc định là &quot;The&quot;, &quot;An&quot; và &quot;A&quot;.</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">Điền Tên Sắp xếp cho những game chưa có</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">Sắp xếp</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">Đang điền Tên Sắp xếp…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">Dịch vụ Nahimic đã được phát hiện đang chạy trên hệ thống của bạn. Dịch vụ này được biết là gây ra sự cố hiển thị cho Playnite (và các ứng dụng khác).\r\n\r\nNếu bạn gặp phải bất kỳ lỗi đồ họa nào hoặc các sự cố hiển thị khác trong Playnite, chúng tôi khuyên bạn nên tắt hoặc gỡ cài đặt hoàn toàn dịch vụ Nahimic.\r\n\r\nThông tin thêm tại https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite đang chạy với các đặc quyền nâng cao (với tư cách là quản trị viên). Điều này không được khuyến nghị vì nó cung cấp các đặc quyền nâng cao cho tất cả các phần mở rộng đã cài đặt và tất cả các trò chơi/ứng dụng bắt đầu từ Playnite!\r\n\r\nThêm thông tin tại https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">Hiển thị cảnh báo nếu Playnite đang chạy với các đặc quyền nâng cao</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">Lấy dung lượng thực tế trên ổ đĩa khi tính toán dung lượng của game</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">Khi được bật, trình quét sẽ chậm hơn và tính toán dung lượng thực tế của các file trên ổ đĩa.\r\nKhi bị tắt, trình quét sẽ nhanh hơn và sử dụng dung lượng của file game.</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">(Các) tiện ích bổ sung sau đây đã được báo cáo là có khả năng có vấn đề, do tác động đến độ ổn định/hiệu suất cao hoặc các vấn đề bảo mật. Chúng tôi thực sự khuyên bạn nên gỡ cài đặt chúng:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">Loại trừ các tệp trực tuyến khỏi quá trình quét</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">Các tệp được lưu trữ trên bộ nhớ đám mây sẽ không được quét và nhập nếu không có sẵn cục bộ.\r\nChỉ hỗ trợ cho: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">Quét nhưng sử dụng phương pháp đơn giản hóa mà không có nội dung tệp</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">Các tệp sẽ được nhập nhưng sử dụng phương pháp kém chính xác hơn, không yêu cầu nội dung tệp được tải xuống và hiển thị cục bộ.</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">Áp dụng cho tất cả</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">Ghi đè trạng thái cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">Khi được gán, Playnite sẽ bỏ qua trạng thái cài đặt (bao gồm thư mục cài đặt) được cấu hình bởi plugin nhúng phụ trách nhập game này.\r\n        \r\nLựa chọn này có thể không hoạt động tốt đối với những plugin sử dụng phương thức nhập game một cách cụ thể, trừ khi chúng có thể áp dụng lựa chọn ghi đè.</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">Chỉ chạy thủ công</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">Mỗi ngày một lần</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">Mỗi tuần một lần</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">Vào mỗi lần khởi động</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">Kiểm tra cập nhật cho chương trình</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">Kiểm tra cập nhật cho add-on</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">Cập nhật thư viện</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">Quét các thư mục giả lập</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">Bao gồm cả game đã ẩn</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">Sửa trường</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">Chọn / Bỏ chọn tất cả</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">Mở</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">Kích hoạt</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">Gán</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">Bắt đầu gõ để tìm game… [F1] để được trợ giúp</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">Bắt đầu với # sẽ hiện danh sách những mã lệnh có sẵn.\r\nBắt đầu với / sẽ hiện danh sách những dịch vụ tìm kiếm/plugins.\r\nGõ từ khóa tìm kiếm kết thúc bằng phím cách sẽ chuyển tới kết quả tìm kiếm ngay lập tức.\r\n\r\nTAB: chuyển hành động\r\nENTER: kích hoạt hành động đang chọn\r\nSHIFT-ENTER: mở menu ngữ cảnh</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">Bao gồm cả game đã gỡ cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">Bao gồm cả game đã ẩn</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">Bao gồm cả những game đã gỡ bỏ</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">Loại trừ những game đỡ bỏ</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">Bao gồm cả game đã ẩn</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">Loại trừ game đã ẩn.</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">Chơi hay Cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">Tới mục chi tiết</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">Menu game</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">Chỉnh sửa game</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">Mở tìm kiếm</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">Hộp tìm kiếm</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">Nút tìm kiếm</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">Hành động chính</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">Hành động thứ cấp</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F mở hộp thoại tìm tổng thể thay vì hộp tìm kiếm </sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">Lưu thiết lập của bộ lọc game giữa các tiến trình tìm kiếm</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">Tìm nhà cung cấp</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">Từ khóa mặc định</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">Tùy chỉnh từ khóa</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">Phím tắt toàn hệ thống</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Tìm kiếm Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">Cài đặt Phần mở rộng</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">Loại trừ</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">Bỏ qua thư mục tương tự khi quét </sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">Bỏ qua thư mục tương tự khi quét </sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">Thêm file vào danh sách loại trừ</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">Thêm thư mục vào dach sách loại trừ</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">Chỉ có thể thêm loại trừ vào những cài đặt đã lưu của trình quét.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">Những loại trừ đã được thêm vào &quot;{0}&quot; trình quét.</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">Ghi đè nền tảng</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">Khi được chọn, trình quét sẽ gán nền tảng này tới tất cả game, ghi đè lên mọi nền tảng nhận biết tự động.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">Bao gồm cả mã lệnh trong tìm kiếm mặc định</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">Khi bị tắt, câu lệnh sẽ không hiển thị ở mục tìm kiếm mặc định cho đến khi # được sử dụng.</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">Sử dụng tìm kiếm xấp xỉ khi lọc tên</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">Khi được bật, bộ lọc tên sẽ khớp với tên của game giống như phương thức tìm kiếm toàn bộ.\r\nBộ lọc chặt chẽ có thể được bật đối với những trường hợp riêng bằng cách dùng tiền tố ! khi lọc.</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">Trường hiển thị với kết quả game</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">Trạng thái Ẩn</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">Sao lưu dữ liệu bị hủy.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">Sao lưu dữ liệu thất bại.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">Lỗi sao lưu dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">Đang sao lưu dữ liệu…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">Khôi phục dữ liệu từ bản sao lưu...</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">Không thể khôi phục dữ liệu từ bản sao lưu.</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">Cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">Thư viện game</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">Phương tiện thư viện game</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">Các phần mở rộng đã cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">Dữ liệu Tiện ích mở rộng</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">Các chủ đề đã cài đặt</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">Lựa chọn dữ liệu để khôi phục từ tập tin sao lưu.    \r\n\r\nPlaynite sẽ tự động khởi động lại để bắt đầu quá trình khôi phục sao lưu </sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">Lựa chọn các mục được đi kèm với sao lưu dữ liệu. Các cài đặt của ứng dụng và dữ liệu thư viện game được bao gồm như mặc định.\r\n\r\nPlaynite sẽ tự động khởi động lại để bắt đầu quá trình sao lưu dữ liệu.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">Tự động sao lưu dữ liệu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">Tần suất tự động sao lưu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">Thư mục sao lưu</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">Sao lưu xoay chiều</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">Bao gồm những dữ liệu bổ sung:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">Thư mục sao lưu cần được chỉ định khi bật tự động sao lưu.</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">Chỉ hiện thông báo cập nhật đối với các bản vá</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">Khi được bật, chỉ những cập nhật sẵn có cho những bản vá đã cài đặt được hiển thị.\r\nNhững bản vá mới sẽ không hiển thị ở thông báo cập nhật.</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">Sử dụng ngày tương đồng đối với tuần trước</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">Sử dụng ngày tương đồng ở định dạng &quot;Hôm nay&quot;, &quot;Ngày hôm qua&quot;,...v.... nếu như mốc thời gian ngắn hơn một tuần.\r\n    \r\nĐịnh dạng ngày cụ thể sẽ được sử dụng đối với những ngày còn lại.</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">Tìm kiếm hình ảnh trên web</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">Chuỗi tìm kiếm ảnh icon</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">Chuỗi tìm kiếm ảnh cover</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">Chuỗi tìm kiếm ảnh nền </sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">Đang tải thông tin add-on…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">Không có nguồn dữ liệu khả dụng</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">Khởi chạy cài đặt của hành động</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">Sử dụng thiết lập của trình quét</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">Chọn hồ sơ lúc khởi động</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">Chọn trình giả lập lúc khởi động</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">Tự động</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">Luôn bật</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">Luôn tắt</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">Hỗ trợ Trợ năng (đọc màn hình)</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">Menu ứng dụng</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">Menu game</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">Thư mục chương trình</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">Thư mục dữ liệu người dùng</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">Đã phát hiện file thư viện bị hư hại, sẽ thoát Playnite.\r\n    \r\nMở issue mới trên trang GitHub của Playnite để đề xuất sửa file bị hư hại của bạn.</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">Bạn có muốn lưu các thay đổi không?</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">Trình cài đặt di động</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">Không phát hiện được thiết bị điều khiển nào</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/zh_CN.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">中文（简体）</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">Playnite语言</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">退出</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">筛选器激活</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">筛选器停用</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">额外筛选器</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">筛选</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">筛选</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">无效数据</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">保存更改？</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">主页位于 www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">源代码位于 GitHub</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">创建诊断数据包</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">发送诊断信息</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">关于 Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">由 Josef Němec 制作</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">指定分类</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">设置分类</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">添加分类</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">已勾选 - 指定分类\r\n不勾选 - 移除分类\r\n不决定 - 不做更改（编辑多个游戏时）</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">没有分类</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">没有平台</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">糟糕，出错了！</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">发生了一个无法恢复的错误。\r\n\r\n如果您想要协助我们修复这个问题，请简要描述在发生这个错误之前您做过的行为，并发送诊断信息。如果您现在有连接网络，诊断数据包将被上传至 Playnite 服务器以供分析。\r\n\r\n或者，您可以点击“报告崩溃”按钮在 Github 上手动创建一个问题（issue）来反馈这次崩溃。\r\n\r\n感谢您的帮助。</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">扩展“{0}”导致了一个无法恢复的错误。\r\n\r\n我们建议保存日志文件并向扩展开发者报告该问题。若问题仍然发生，请禁用该扩展。</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">扩展“{0}”导致了一个无法恢复的错误。\r\n\r\n我们建议向扩展开发者报告该问题。若问题仍然发生，请禁用该扩展。</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">未知的扩展或主题导致了一个无法恢复的错误。\r\n\r\n我们建议禁用第三方附加组件，隔离其中导致问题的附加组件并向其开发者报告该问题。</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">发生了不可恢复的错误。\r\n\r\n如果您想帮助我们解决此问题，请向我们发送诊断信息。 谢谢！</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">停用扩展</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">保存记录文件</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">发送诊断信息</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">报告崩溃</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">重开 Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">以安全模式重开</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">停用所有第三方扩展并使用默认主题。</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">退出Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">崩溃前做过的行为（请用英语）：</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">库管理器</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">删除游戏？</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">无法移除 - 游戏或安装程序正在运行。 </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">无法卸载 - 游戏正在运行。</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">您确定要删除 {0} 吗？</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">您确定要移除这 {0} 个游戏吗？</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">您确定要移除 {0} 吗？\r\n\r\n选择“加入排除列表”选项可防止本游戏在下次更新库时被再次导入。</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">您确定要移除 {0} 个游戏吗？\r\n\r\n选择“加入排除列表”选项可防止这些游戏在下次更新库时被再次导入。</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">您确定要移除这 {0} 个目前未被使用的条目吗？</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">没有找到未使用的字段。</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">是（加入排除列表）</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">此部分上有未保存的更改</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">正在更新游戏库格式…</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">数据库更新失败。</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">无法更新游戏库。需要{0}MB空余空间。</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">游戏错误</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">无法启动游戏，在数据库中找不到&quot;{0}&quot;。</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">无法启动游戏：{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">无法启动指令：{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">无法打开游戏位置：{0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">无法检测游戏占用空间： {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">占用空间扫描错误</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">占用空间扫描时有 {0} 个错误</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">创建快捷方式失败：{0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">打开手册失败：{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">无法安装游戏：{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">无法卸载游戏：{0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">未找到有效的游戏启动指令。在使用模拟器指令时，请确保平台定义同时匹配游戏和模拟器的配置。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">安装流程不可用。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">未安装或启用负责此游戏的库插件。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">官方资料数据下载不可用。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">没有选择游戏。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">游戏脚本执行失败。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">应用程序脚本执行失败。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">全局脚本执行失败。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">模拟器脚本执行失败。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">游玩脚本指令执行失败。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">PowerShell 3.0 或更新版本未安装。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">无法确定如何启动游戏。</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">启用</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">已停用</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">移除</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">移除未使用</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">重命名</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">复制</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">添加</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">默认图标</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">默认封面图像</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">默认背景图像</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">完成</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">下一步</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">上一步</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">完 成</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">返 回</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">清 除</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">清除</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">忽略</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">忽略全部</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">导入</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">名称</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">作者</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">组件</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">系列</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">版本</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">上次游玩</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">最常游玩</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">游玩次数</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">占用空间</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">文件夹</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">备注</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">添加日期</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">添加日期</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">修改日期</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">修改日期</sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">网站</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">路径</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">好的</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">保存</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">关闭</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">取消</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">确认</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">重置</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">是</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">否</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">欢迎</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">本地用户</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">通用</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">媒体</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">链接</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">安装</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">指令</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">正在下载…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">正在下载媒体…</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">正在加载…</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">类型</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">配置文件</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">配置文件</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">移除</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">下载</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">搜索</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">分辨率：</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">任何</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">缩放</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">列表视图</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">封面</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">网格视图</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">详情视图</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">自定义</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">网址</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">特别致谢</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">许可协议</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">贡献者</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">正在退出 Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">今天</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">昨天</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">星期一</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">星期二</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">星期三</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">星期四</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">星期五</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">星期六</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">星期日</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">过去一周</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">过去一个月</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">过去一年</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">超过一年以前</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 到 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB 到 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB 到 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB 到 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB 到 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB 到 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB 到 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB 或以上</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">导入已成功完成。</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">所有游戏</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">游戏 ID</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">数据库 ID</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">预设</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">列</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">列</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">行</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">行</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">无法通过游玩指令获取图标。不存在类型为文件的指令。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">仅下载缺失的资料数据</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">启用该选项会跳过已经含有信息的数据字段的资料数据下载。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">游戏选择</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">请选择要使用新资料数据更新资料的游戏：</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">数据库中的所有游戏</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">所有当前筛选出的游戏</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">仅所选游戏</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">未选择任何元数据字段</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">未选择任何元数据字段进行下载。请至少选择一个，并为其启用至少一个元数据提供程序。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">官方商店</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">请指定通过 Playnite 自动填充的字段，以及用于获取数据的源。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">请您考虑点击上面的徽标，访问 igdb.com 数据库并协助更新信息，以帮助 Playnite 使用更完善的数据。</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">正在下载资料数据…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">正在导入已安装的游戏…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">正在导入 {0} 的游戏…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">正在从 {0} 导入模拟端游戏…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">正在下载库的更新…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">正在扫描库中的游戏大小…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">正在扫描导入的游戏的大小……</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">库更新完成</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">正在释放资源…</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">配置</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">设置…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">平台和模拟器</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">配置模拟器…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">库管理器…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">工具</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">下载资料数据…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">软件工具…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">配置集成…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">打开第三方客户端</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">第三方客户端</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">更新游戏库</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">取消库更新</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">更新模拟端游戏文件夹</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">添加游戏</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">手动…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">自动扫描…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">模拟端游戏…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store 应用程序…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">关于 Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">发送反馈</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">切换至全屏模式</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">链接</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">帮助</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">在 Patreon 上支持我们</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">在 Ko-Fi 上支持我们</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">用户手册</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK文档</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">重启系统</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">关闭系统</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">挂起系统</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">休眠系统</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">锁定系统</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">登出用户</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">挑选一个随机游戏</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">要在详情面板上显示的游戏字段：</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">项目间隔</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">绘制网格项目背景</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">网格项目边框宽度</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">缺少游戏图标源</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">缺少游戏封面源</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">缺少游戏背景源</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">到游戏详情的竖直间距</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">网格视图详情位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">详情视图游戏列表位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">在面板之间绘制分隔线</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">游戏封面图像高度</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">游戏列表图标高度</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">应用程序字体</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">等宽字体</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">筛选器面板位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">导航面板位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">封面艺术渲染</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">目标长宽比</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">以下选项也会影响全屏模式的图块渲染！</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">拉伸模式</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD 盒</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic 游戏商城</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">矩形</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam 横幅</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam 纵向封面</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* 需要重开以应用</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">设置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">通用</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">顶部面板</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">外观</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">游戏详情</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">布局</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">高级</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">全屏</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">输入</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">性能</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">资料数据</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">更新</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">搜索</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">备份</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">备份库数据</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">恢复数据备份</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">自动导入游戏库中的更改</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">无效的数据库文件位置，必须设置正确的文件路径。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">账户名称不能为空。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">导入游戏后下载资料数据</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">启动 Playnite 时最小化</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">随电脑开机启动 Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">启动时关闭至系统托盘</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">无法注册 Playnite 为开机启动项。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">以全屏模式启动</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">异步图像正在加载</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">以较慢的图像加载时间换取较好的游戏列表滚动流畅度。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">封面艺术缺失时显示游戏名</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">在网格视图中显示游戏名称</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">暗色显示未安装的游戏</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">在详情视图的列表上显示游戏图标</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">在分组描述中显示项目数量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">在筛选器面板和导航面板上仅显示指定的字段</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">禁用硬件加速</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">可用于出现卡顿等界面问题的情形</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">在快速启动列表中显示隐藏游戏</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">影响任务栏图标的快捷菜单和托盘图标的菜单。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">快速启动列表中项目数量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">使用游戏背景图像作为窗口背景</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">模糊背景</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">高品质</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">暗背景</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">在网格视图中显示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">主题</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">主题简介</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">全屏主题</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">全屏主题简介</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">数据库位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">登录状态：</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite 设置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">清除网页缓存</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">可能解决链接账户时遇到的问题。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">显示系统托盘图标</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">最小化 Playnite 到系统托盘</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">当 Playnite 窗口被关闭时最小化到系统托盘</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">游戏启动时：</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">游戏结束后：</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">按游玩天数显示游玩时间</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">日期格式：</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">这将使您从所有已链接的服务中登出。应用程序需要重开，您想继续吗？</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">清除缓存？</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Playnite 需要重开以应用新主题</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">获取更多主题</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">创建新的主题</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">获取更多扩展</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">创建新扩展</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">帮助我们翻译 Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite 需要重开来应用新的设置。现在重开吗？\r\n\r\n重开将取消当前所有进行中的任务（例如下载）。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">重新启动Playnite？</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite 不能自动移动您的库文件。您必须在更改位置之前手动移动/复制这些文件。 若目标位置中没有库，则将创建一个新库。\r\n\r\n新的数据库位置会在 Playnite 重开时启用。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">若设置了“关闭”指令，游玩时间将不会被记录。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">行数</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">列数</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">详情视图行数</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">在主界面显示背景图像</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">不重新下载资料数据，就不会追溯应用于已有游戏。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">导入库中游戏的游玩时间：</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">配置 Playnite 应何时向 Playnite 数据库导入由库插件报告的游玩时间。需要库插件支持接管对游戏的处理，才能使用该特性。\r\n\r\n总是：同时为 Playnite 数据库中新导入与已存在的游戏导入游玩时间。\r\n仅新导入：仅为新导入的游戏导入游玩时间。\r\n从不：无论何种情形都不导入游玩时间。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">总是</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">仅新导入</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">从未</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">在桌面模式下启用控制器支持</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">导航按钮打开全屏模式</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">为新导入的游戏自动下载资料数据。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">目标显示器</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">总是使用主显示器</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">显示游戏标题</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">显示电池状态</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">显示电量百分比</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">显示时钟</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">隐藏鼠标光标</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">快速筛选器中仅显示已安装</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">按钮提示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">布局</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">水平滚动</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">选择其中一个子选项：</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">没有可用的设置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">加载设置失败</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">对库中的每个游戏，这些脚本都会被执行。可在编辑游戏详情时为每个游戏指定单独的脚本。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">切换背景图像时使用动效</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">字体大小</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">自动</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">锯齿化</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">灰度</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">Ideal（理想化）</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Display - GDI 兼容</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">文本格式化模式</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">文本渲染模式</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">文字渲染和格式化方法当前不会应用于游戏描述。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">预加载背景图像</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">如果启用该选项，Playnite会在下载资料数据时下载背景图像，这会使用较多磁盘空间，背景图像在离线时可以显示。\r\n\r\n如果停用该选项，背景图像仅在首次需要时下载，这会使用较少磁盘空间，但是可能导致背景图像显示延迟，并且某些背景图像在离线时不可以显示。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">退出游戏后自动关闭第三方客户端</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">客户端延迟关闭时间（秒）</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">游玩时间短于该时间时不关闭（单位：秒）</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">自动关闭以下客户端：</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">自动关闭客户端</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">导入排除列表</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">当游戏媒体数据过大的时候显示警告</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">目录打开命令</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">首选游戏年龄评级机构</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">在更新库时更新游戏的占用空间</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">扫描并更新游戏的占用空间，如果检测到自上次扫描以来他们的文件已被修改</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">无</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">填充</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">均匀</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">均匀填充</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">左</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">右</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">顶</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">底</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">导入错误</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">需要身份验证</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">身份验证失败</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">备选 WebView 渲染模式</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">可用于 WebView （如集成的身份验证对话框）遇到问题的情形。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">部分加载过大的游戏描述</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">过大的描述可能会在选择游戏时造成明显的延迟。\r\n\r\n启用时，最初只会加载部分描述文本，并可选择按需加载其余部分。</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">资料数据导入</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">下载资料数据</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">设置选中的配置用于任何未来的资料数据下载。\r\n也可以在应用程序设置中修改。</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">模拟器导入向导</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">这个向导会引导您下载并导入游戏机模拟器，以及导入模拟端游戏。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">记住您随时可以在主菜单添加另外的模拟器或游戏（在“库”菜单找到“配置模拟器…”，在“添加游戏”菜单添加模拟端游戏）。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">以下是 Playnite 可识别和自动配置的模拟器列表。您可以前往他们的网站下载模拟器安装程序并手动安装。完成后，您可以在模拟器\r\n配置对话框中导入它们。 </sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">您可以通过点击“从文件夹自动检测…”按钮来导入您的 PC 上已安装的任何模拟器。Playnite 将在所选文件夹中搜索任何已知的模拟器，并提供选项来导入它们。您可以多次使用该按钮从多个文件夹导入。模拟器将被添加到当前列表的底部。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">您可以通过点击“扫描模拟器文件夹”按钮导入游戏。选择适当的模拟器将告诉 Playnite 哪些文件类型应该被扫描和导入。您可以多次使用该按钮从多个文件夹导入。游戏将被添加到当前列表的底部。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">未选择要导入的模拟器。若不先配置模拟器，则无法自动导入任何模拟端游戏。您确定要继续并退出导入流程吗？</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">Playnite 中没有已配置的模拟器。若不先配置模拟器并选择适当的文件类型，则无法导入游戏。您想现在添加一些模拟器吗？</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">扫描模拟器文件夹</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">选择文件</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">从文件夹自动检测…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">配置模拟器…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">正在扫描…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">正在扫描 {0}…</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">首次配置</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">该向导将引导您完成自动导入和配置外部游戏库的流程。Playnite 可以自动从 Steam 或 GOG 等多种游戏服务导入游戏。\r\n \r\n注意，您也可以通过主菜单手动添加任一平台的自定义或模拟端的游戏。</sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">库集成</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">以下是一些Playnite支持集成库的列表。 请选择要安装的。\r\n\r\n稍后可以从“插件”菜单中安装更多的集成。</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">配置完成</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">初始设置已经完成。请记住您稍后可从主菜单更改所有设置以及新增另外的集成。</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">一个或多个扩展下载失败。\r\n\r\n您可以尝试先等运行向导完成，之后再从附加组件菜单中重新下载集成。</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">正在下载 {0} 集成…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">正在下载推荐集成列表…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">无法下载推荐集成列表。您可以稍后通过附加组件菜单尝试重新下载集成。</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">配置平台和模拟器</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">配置模拟器</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">平台</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">设备平台</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">模拟器</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">模拟器</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">添加平台</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">选择图标</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">选择封面</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">选择图像</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">选择项目</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">选择背景</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">选择文件</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">选择网址</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">添加模拟器</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">支持的平台</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">你想保存平台设置吗？</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">您想保存模拟器设置吗？</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">可执行文件</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">参数</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">工作目录</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">支持的文件类型</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">导入模拟器…</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">下载模拟器…</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">从已知的模拟器配置文件加载参数预设</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">您确定要移除模拟器“{0}”吗？\r\n它目前正在被 {1} 个游戏使用。</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">您确定要移除平台“{0}”吗？ \r\n它目前正在被 {1} 个游戏和 {2} 个模拟器使用。</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">设置帮助</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">排序方式</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">排序方向</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">分组方式</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">升序</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">降序</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">不分组</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">按库分组</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">按分类分组</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">按平台分组</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">查看类型</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">查看</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">导航面板</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">筛选器面板</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">图标</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">游戏库图标</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">封面图像</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">背景图像</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">排序名称</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">库</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">手册</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">名称</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">安装盘</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">账户名称</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">平台</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">分类</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">流派</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">发行日期</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">发行年份</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">开发者</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">标签</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">发行机构</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">安装状态</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">匹配所有筛选器</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">若启用，仅将满足所有筛选项的游戏包含在视图中。\r\n若禁用，将满足任一筛选项的游戏都包含在视图中。</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">已安装</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">已安装</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">未安装</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">隐藏</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">收藏</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">启用 HDR 支持</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">如果启用，HDR 将在开始游戏前在主显示器上启用。</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">请注意，您的主显示器不支持 HDR。</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">上次游玩</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">分类</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">描述</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">安装目录</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">封面图像</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">链接</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">图像、ROM 或 ISO 路径</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">流派</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">流派</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">公司</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">公司</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">开发者</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">开发者</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">发行商</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">发行机构</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">分类</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">分类</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">标签</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">标签</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">功能特色</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">功能特色</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">年龄分级</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">年龄分级</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">地区</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">国家</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">来源</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">来源</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">最近动态</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">数据库错误</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">无法打开库的数据库。</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">数据库未打开</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">无法访问库的数据库。文件“{0}”正在被另一个进程使用，或者它位于不可访问的位置。</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">创建诊断数据包失败。</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">无法自动上传诊断数据包。</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">诊断信息发送成功。</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">诊断数据包创建并提交成功。\r\n请在您的问题（issue）报告中附上以下 ID：</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">从 {0} 导入游戏失败。</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">从 {0} 导入模拟端游戏失败。</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">无法通过选定的模拟器配置文件搜索游戏。 配置文件不包含任何文件扩展名或平台</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite 未能启动。请关闭其他所有运行实例再重试。</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">无法应用主题“{0}”，颜色配置文件“{1}”\r\n \r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">无法打开链接，网址格式无效。</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">无法启动该应用程序。</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">无法初始化 web view 组件。Playnite 无法继续启动。\r\n\r\n更多信息参见 https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">未能导入模拟器，因为定义文件缺失或损坏。</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">执行菜单动作失败。</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">编辑游戏详情</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">图像网址</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">添加链接</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">添加 ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">保存更改</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">将字段更改应用于正在编辑的游戏。</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">添加指令</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">移除</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">移除游玩指令</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">添加游戏</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">扫描文件夹…</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">探测已安装</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">浏览…</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">打开 Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">配置文件设置</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">游戏名称不能为空。</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">游戏指令追踪目录不能为空。</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">搜索资料数据时，游戏名称不能为空。</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">游戏数据无效</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">输入以 http:// 或 https:// 开头的有效网址</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">选择网址</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">下载资料数据失败：{0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">下载错误</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">清除筛选器</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">私密账户</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">公开账户</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API 密匙</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">启动错误</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">主题错误</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">全部清除</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">正在安装</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">正在卸载</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">正在启动</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">正在运行</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">无效的网址</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">什么也不做</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">最小化</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">恢复窗口</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">仅当从界面启动时还原窗口</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">关闭</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">更改</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">高级</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">从未</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">完成状态</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">完成状态</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">用户评分</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">媒体评分</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">社区评分</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">游戏脚本</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">应用程序脚本</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">脚本</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">插件</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">资料数据来源</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">扩展</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">扩展 ID</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">重载脚本</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">交互式 SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">已成功重载所有脚本</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">未找到符合指定搜索/筛选条件的游戏</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">未找到项目</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">切换至桌面模式</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">退出 Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">库</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">全部更新</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">作者：</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">版本：</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">已更新：</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">模块：</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">库</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">统计</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">全部</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">无</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">通知</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">宽度</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">高度</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">大小</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">小</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">标准</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">大</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">更大</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">最大</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">默认</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">选择</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">全选</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">取消全选</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">首项</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">随机</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">由用户选择</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">加载更多</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">透明</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">折叠</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">展开</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">全部折叠</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">全部展开</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">其他</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">主题</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">模拟器参数</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">内置参数</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">自定义参数</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">额外模拟器参数</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">覆盖模拟器参数</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">作为游玩指令，而非菜单指令</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">选择要导入的资料数据</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">选择要导入的游戏</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">资料数据搜索</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">有可用的更新</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">上次更新以来的变化</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">下载并安装更新</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">检查更新</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">更新错误</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">检查新版本失败。</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">未发现新版本，您已在最新版。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">下载并安装更新失败。</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">有后台任务正在运行。您想要取消它并继续更新吗？</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">有后台任务正在运行。您想要取消它并退出 Playnite 吗？</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">有后台任务正在运行。切换模式将取消该任务，您仍然要切换吗？</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Playnite 有一个可用的更新</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">重载主题列表</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">应用所选主题</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">监视文件更改</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">源文件更改时自动应用主题</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">脚本运行时阶段</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">启动游戏前执行</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">退出游戏后执行</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">启动游戏后执行</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">应用程序启动时执行</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">应用程序关闭时执行</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">游戏启动前脚本</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">游戏启动后脚本</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">游戏停止后脚本</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">执行全局脚本</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">全局</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">已筛选</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">当前</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">新的</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">测试脚本</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">仅显示所选项目。</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">保存为默认</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">添加至收藏</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">从收藏中删除</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">隐藏此游戏</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">从隐藏中移除</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">启用 HDR 支持</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">禁用 HDR 支持</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">编辑…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">计算占用空间</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">计算占用空间 (所有游戏)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">计算占用空间 (仅缺少的数据)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">占用空间</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">设置分类…</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">设置完成状态</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">移除</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">游玩</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">安装</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">游戏选项</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">详情</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">卸载</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">打开安装位置</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">创建桌面快捷方式</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">打开手册</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">更多</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">由库插件管理</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">游戏的启动过程将由负责此游戏的库插件管理。</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">在指定页面找不到游戏“{0}”的相关信息。</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">提示：你可以在编辑单个游戏时通过“编辑”菜单选项使用更多高级资料数据下载过程。</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">某些行动正在进行时不可用。</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">描述文本支持 HTML 语法</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">游玩时间按秒记录。</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">占用空间以字节表示。</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">发布日期必须以“年-月-日”格式设置。月和日的值可以省略。</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">分值范围为 0 至 100，留空为不评分。</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Playnite 的开发得到了这些 Patreon 和 Ko-fi 赞助者的支持：</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">代码、本地化和其他贡献者（排名不分先后）：</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">取消游戏监控？</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">正在监测安装状态。您是否要取消监测，并将游戏返回到之前的状态？</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">正在监测运行状态。您是否要取消监测，并将游戏返回到之前的状态？</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">游玩时间</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">最后游玩时间</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}天{1}小时{2}分</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0} 小时  {1} 分钟</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} 分钟</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} 秒</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">没有玩过</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">正在打开桌面模式…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">正在打开全屏模式…</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">正在加载游戏库…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">正在计算占用空间…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">正在计算 {0} 的占用空间…</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">无法安装脚本文件。</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">脚本安装成功。</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">安装脚本</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">脚本错误</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">无法执行扩展功能。</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">打开资料数据文件夹</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">计算</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">如果游戏有 ROM ，则使用 ROM 自动计算占用空间，否则使用设置的安装目录自动计算占用空间</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} 客户端未安装。</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} 客户端即将打开。请在登录后关闭此消息。</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">正在等待用户登录，请您在完成后关闭此消息…</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">未找到游戏的安装目录</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">无效的游戏指令配置。</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">账户同步疑难解答</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">疑难解答</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">重命名项目</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">添加新项目</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">输入名称</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">输入新名称</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">少于 1 小时</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1 至 10 小时</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10 至 100 小时</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100 至 500 小时</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500 至 1000 小时</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">超过 1000 小时</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">Playnite 必须重开以完成安装。您想要现在重开吗？</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">扩展未被正确打包。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">主题未被正确打包。</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">扩展“{0}”载入失败。</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">无法加载扩展“{0}”，当前版本的 Playnite 不支持。</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">主题“{0}”载入失败。</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">无法加载主题“{0}”，当前版本的 Playnite 不支持。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">扩展无法正确载入。</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">主题载入失败。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">主题或扩展使用了不受支持的 API 版本。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">安装成功。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">安装附加组件？</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">通用</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">“{0}”附加组件安装失败。</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">安装扩展失败。\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">您想安装这个新扩展吗？\r\n\r\n{0}\r\n来自 {1}\r\n版本 {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">您想更新扩展“{0}”吗？\r\n\r\n当前版本：{1}\r\n新版本：{2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">安装主题失败。\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">您想安装这个新主题吗？\r\n\r\n{0}\r\n来自 {1}\r\n版本 {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">您想要更新主题“{0}”吗？\r\n\r\n当前版本：{1}\r\n新版本：{2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">您即将离开 Playnite 并使用您的默认网页浏览器来浏览以下网页。您想要继续吗？\r\n    \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">所选图像可能过大并导致无法达到最佳性能。使用非常大的图像可能导致界面卡顿并增加内存占用。\r\n\r\n建议的最大分辨率：\r\n图标: {0} 百万像素\r\n封面: {1} 百万像素\r\n背景: {2} 百万像素</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">性能警告</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">不再显示</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">不兼容扩展名为 {0} 的文件。</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">文件扩展名不兼容</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">所选图像文件过大，可能会影响最佳性能。</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">您确定要卸载选中的主题吗？卸载将被安排至下次程序启动时。</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">内置主题不能被卸载。</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">这个主题不支持当前版本的 Playnite。</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">您确定要卸载选中的扩展吗？卸载将被安排至下次程序启动时。</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">内置扩展不能被卸载。</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">这个扩展不支持当前版本的 Playnite。</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">安装目录</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">数据目录</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">正在生成诊断数据包…</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">正在上传诊断数据包…</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">导入文件…</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">这是什么？</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">您确定要这样做吗？</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">总游玩时间</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">平均游玩时间</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">最多游玩时间</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">总占用空间</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">总览</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">侧边栏</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">在侧边栏显示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">重置设置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">所有应用程序设置将重置为默认值，除了：\r\n-数据库位置\r\n-导入排除列表\r\n-扩展设置，包括库集成\r\n    \r\n完成此流程需要重开应用程序。您想重置设置吗？</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">面向开发者</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">外部扩展</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">输入完整的文件夹路径。</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">成就</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">论坛</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">新闻</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">商店页面</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">初始化设置未完成。Playnite 将重开到桌面模式以完成相关步骤。</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">最近玩过</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">收藏</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">最常游玩</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">所有</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">已应用筛选器。</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">已应用额外筛选器。</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">搜索结果：</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">已存在同名项目。</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">以当前筛选器限制选择范围</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">选择另一个</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">附加组件…</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">已安装</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">扩展设置</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">浏览</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">更新</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">更新（{0}）</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">对已安装的扩展和主题的管理，包括它们的设置，已被移到一个新的“附加组件”菜单。</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">可以在此处配置所有当前安装的库集成扩展。\r\n若您想安装或卸载另外的集成，请使用主菜单中的“附加组件”选项。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">桌面模式主题</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">全屏模式主题</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">正在搜索…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">附加组件与此版本 Playnite 不兼容。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">无法下载附加组件安装包。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">无法下载附加组件的 manifest 文件。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">更改将在应用程序重开后生效。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">该附加组件已被计划安装。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">安装</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\">重新安装</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">卸载</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">已安裝</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">未发现新的附加组件更新。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">更新附加组件</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">更新日志不可用</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">已计划安装</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">下载失败</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">许可证被拒绝</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">正在下载 {0}…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">寻找附加组件更新</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\">正在查找程序更新…</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">有一个或多个附加组件更新可用。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">选择项目以更新</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">扩展开发实例</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0} 许可协议</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">接受</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">拒绝</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">启用库集成的游玩指令</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">选择指令</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">追踪模式</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">追踪路径</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">初始追踪延迟</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">追踪频率</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">链接</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">文件</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">模拟器</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">脚本</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">默认</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">进程</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">文件夹</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">原进程</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\">进程名称</sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">记录追踪消息</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">以下变更将覆盖所有当前所选游戏的数据！</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">无</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">均匀</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">仅项目</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">仅开始和结束</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">滚动灵敏度</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">平滑滚动</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">动效速度</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">移除项目？</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">您确定要移除这个项目吗？</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">在顶部面板上显示按钮：</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">通用视图设置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">分组设置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">排序设置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">筛选器预设</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">插件项目位置</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">分区间隔宽度</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">将主菜单按钮置于侧边栏</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">导航面板</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">随机游戏选择器</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">查看随机游戏选择器</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">从当前视图中选择随机游戏</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">保存分组和排序设置</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">在全屏模式下显示为快速筛选器</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">过去 7 天</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">过去 31 天</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">过去 365 天</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">超过365天前</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">配置</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">保存预设​​​​​​​</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">启动游戏后最小化</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">在游戏开始后最小化 Playnite。\r\n\r\n禁用此项可能会导致游戏在启动时无法获得输入焦点！</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">字体大小</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">小字体</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\">启用游戏控制器API支持</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">游戏控制器支持</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">如果禁用，Playnite 将不接受任何游戏控制器输入。\r\n        \r\n如果您使用了将游戏控制器输入转换为鼠标/键盘输入的工具，且在 Playnite 中出现了重复输入的情况，禁用此选项。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">在主菜单上显示项目：</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">反转 X/A 主视图按钮绑定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">互换这两个按钮的绑定功能：“启动游戏”与“在主视图上显示游戏详情页面”。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">交换确认/取消按钮绑定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">反转 A/B 按钮绑定的确认和取消。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">仅主控制器</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">启用时，仅接受主控制器的输入。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">向导按钮聚焦 Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">界面音量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">背景音量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">在后台时静音</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">未能初始化音频接口。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">输出API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">用于音频输出的 API。若您遇到音频问题，请更改。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">通用</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">画面</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">音频</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">布局</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">菜单</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">输入</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">{0}正在启动…\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">{0}正在运行…</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">大写</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">空格</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">图像渲染缩放器</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">备选</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">均衡</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">质量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">质量：\r\n最佳图像质量，慢速，高内存占用。\r\n    \r\n均衡：\r\n良好图像质量，快速，低内存占用。\r\n    \r\n备选：\r\n更优图像质量，中速，低内存占用。</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">选择文件…</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">选择文件夹…</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">启动脚本</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">请注意，扩展和主题可能极大地影响 Playnite 的性能、稳定性和安全性。\r\n\r\n若您在安装一个主题或扩展后开始遇到某些问题，请尝试先禁用或卸载它们，以观察它们是否是该问题的根源。</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">启动时选择</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">启动时选择</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">内置配置文件</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">内置配置文件</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">自定义配置文件</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">自定义配置文件</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">由内置脚本控制</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">模拟器规格</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">平台格式</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">地区格式</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">启动模拟器前执行</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">启动模拟器后执行</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">退出模拟器后执行</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">找不到模拟器可执行文件。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">找不到模拟器规格。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">找不到模拟器启动脚本。</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">拆分游戏</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">合并为一个游戏\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">设置平台</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">设置地区</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">扫描文件夹</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">扫描配置</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">不对特定模型校验扫描</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">匹配特定模型的文件不会被扫描校验，而是通过文件名进行匹配。更多信息请参见模拟器帮助页面。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">通过模拟器扫描</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">在保存新配置时必须设置名称。</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">未设置模拟器或模拟器配置文件。</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">要扫描的目录未指定或不存在。</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">扫描配置未正确设置。</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">包含在批量扫描自动扫描中</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">无法扫描模拟器文件夹。</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">无法扫描模拟端游戏文件夹。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">隐藏已导入内容</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">要导入的配置文件：</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">自动扫描配置</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">保存为自动扫描配置</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">保存配置以用于之后的库更新。保存的配置可以通过“配置模拟器”菜单管理。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">使用相对路径导入</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">若可能，使用相对于 Playnite 安装文件夹或模拟器安装文件夹的路径导入游戏文件。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">扫描子文件夹</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">扫描压缩包内部</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">合并相关文件</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">将相关的游戏文件（例如单独的游戏光盘）合并在一个游戏条目下。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">添加扫描器</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">添加已保存的扫描器</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">开始扫描</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">添加模拟器的扫描配置以扫描特定文件夹。请将正确配置模拟器（通过库 -&gt; 配置模拟器菜单）作为导入游戏的前提。</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">为新添加游戏指定的默认状态</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">已指定首次游玩的游戏状态</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">无法初始化 PowerShell 脚本运行时。如果您是 Windows 7 用户，尝试安装或重装 PowerShell 5.1 以解决这个问题。</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">已存在指定名称的筛选器预设。使用新的设置更新预设吗？</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\">自动填写批量添加或者修改后游戏缺失的排序名称</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\">当您编辑游戏时，通过库更新,模拟器筛选器扫描或一般筛选器扫描添加游戏，自动填写“排序名称”字段以便更好进行游戏名的排序。 例如，“The Witcher 3”将得到“Witcher 03”的排序名称。 这不会设置一个与游戏名称没有不同的排序名称，而且只会自动更新空的排序名称。</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">将在自动填充的排序名称的开头删除这些词：</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">就排序目的，利用它忽略掉字符串开头的一些字词。默认值为“The”、“An”和“A”。</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">填充游戏的为空的排序名称字段</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">排序</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">填写排序名称值…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">已检测到 Nahimic 服务正在您的系统上运行。已知此服务会导致 Playnite（和其它应用程序）出现渲染问题。\r\n\r\n若您在Playnite中遇到任何图形损坏或其它渲染问题，我们建议禁用或完全卸载 Nahimic 服务。\r\n\r\n更多信息请访问 https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite 正在以高权限（作为管理员）运行。不推荐这样做，因为这将为所有安装的扩展与所有从 Playnite 启动的游戏/应用程序（如客户端等）赋予高权限！\r\n更多信息参见 https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">当 Playnite 以高权限运行时显示警告</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">计算游戏大小时获取在驱动器上实际占用的空间</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">如果启用，扫描速度较慢，将获取文件在驱动器上实际占用的空间。\r\n如果禁用，扫描速度较快，将使用文件本身的大小。</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">以下附加组件已因潜在问题被报告，例如严重影响稳定性/性能或安全问题。我们强烈建议您卸载它们：\r\n\r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">扫描时排除在线文件</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">云端存储且本地不可用的文件不会被扫描和导入。\r\n仅支持：Google Drive、DropBox、OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">使用忽略文件内容的简单方法扫描</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">使用不严格的方法导入文件，无须下载文件内容到本地。</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">应用到全部</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">覆盖安装状态</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">设置时，Playnite 将忽略导入此游戏的集成插件设置的安装状态(包括安装目录)。\r\n\r\n此选项可能无法完全适用于使用特定游戏导入方法的插件，除非它们也考虑到此覆盖选项。</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">仅手动</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">每天一次</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">每周一次</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">每次启动时</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">检查程序更新</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">检查附加组件更新</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">更新库</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">扫描模拟器文件夹</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">包含隐藏游戏</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">编辑字段</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">全选/全不选</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">打开</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">激活</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">指定</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">开始输入以搜索游戏… [F1] 获取帮助</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">以 # 开头展示可用命令列表。\r\n以 / 开头展示可用搜索提供者/插件。\r\n输入搜索关键字并以空格作结，将立即切换到该搜索。\r\n\r\nTAB：切换指令\r\nENTER：激活所选指令\r\nSHIFT-ENTER：打开项目菜单</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">包含未安装游戏</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">包含隐藏游戏</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">已包含未安装游戏</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">已排除未安装游戏</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">已包含隐藏游戏</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">已排除隐藏游戏</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">游玩或安装</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">转至详情</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">游戏菜单</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">编辑游戏</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">打开搜索</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">搜索框</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">搜索按钮</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">主指令</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">次指令</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">CTRL-F 打开全局搜索，而不是聚焦搜索框</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">在搜索会话之间保存游戏筛选设置</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">搜索供应者</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">默认关键字</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">自定义关键字</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">系统级快捷键</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite 搜索</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">扩展设置</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">排除项</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">已排除扫描文件夹的相关文件</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">已排除扫描文件夹的相关文件夹</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">添加文件到排除列表</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">添加文件夹到排除列表</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">排除项只能添加到已保存的扫描器配置中。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">已添加排除项到扫描器&quot;{0}&quot;中。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">覆盖平台</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">设置时，扫描器将为所有游戏指定此平台，覆盖任何自动检测到的平台。</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">在默认搜索中包含命令</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">禁用时，除非使用 # 前缀，否则在默认搜索中不包含命令。</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">在名称过滤器中使用模糊匹配</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">启用时，名称过滤器将以与全局搜索相同的方式匹配游戏名称。\r\n可以通过在过滤器前加上 ! 字符来对个别情况强制执行严格匹配。</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">游戏搜索结果中显示的字段：</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">隐藏状态</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">数据备份已取消。</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">数据备份已失败。</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">数据备份错误</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">正在进行数据备份…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">正在从备份恢复数据…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">未能从备份恢复数据。</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">设置</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">游戏库</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">游戏库媒体</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">已安装扩展</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">扩展数据</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">已安装主题</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">从指定的备份文件中选择要还原的数据。\r\n    \r\nPlaynite 将自动重启以开始备份还原过程。</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">选择数据备份要包含的项目。默认情况下包含应用程序设置和游戏库数据。\r\n    \r\nPlaynite 将自动重启以开始备份过程。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">自动数据备份</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">自动备份频率</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">备份文件夹</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">轮换备份</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">包含额外数据：</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">若要启用自动备份，须设置备份文件夹。</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">仅显示补丁发布通知</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">启用时，只有当前安装的大版本可用的更新将发出更新通知。\r\n新的大版本不会发出更新通知。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">为最近一周使用相对日期</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">为最近一周使用“今天”、“昨天”等格式的相对日期。\r\n    \r\n指定的日期格式将用于所有其他日期。</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">网页图像搜索</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">图标搜索字符串</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">封面图像搜索字符串</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">背景图像搜索字符串</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">正在获取附加组件信息…</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">没有可用的资料数据来源</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">游玩指令设置</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">使用扫描器设置</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">启动时选择配置文件</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">启动时选择模拟器</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">自动</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">总是开启</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">总是关闭</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">辅助功能 (屏幕阅读器) 支持</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">应用程序菜单</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">游戏菜单</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">程序文件夹</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">用户数据目录</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">已检测到库文件损坏，Playnite 现在将关闭。\r\n    \r\n在 Playnite 的 GitHub 页面创建新的问题（issue），请求修复您文件中的损坏问题。</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">您想要保存您所作的更改吗？</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">便携式安装</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">未检测到控制器</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization/zh_TW.xaml",
    "content": "﻿<?xml version=\"1.0\"?>\r\n<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    <sys:String x:Key=\"LanguageName\">中文（繁體）</sys:String>\r\n    <sys:String x:Key=\"LOCLanguageSettingsLabel\">變更語言</sys:String>\r\n    <sys:String x:Key=\"LOCExitAppLabel\">結束</sys:String>\r\n    <sys:String x:Key=\"LOCFilterActiveLabel\">過濾器已啟用</sys:String>\r\n    <sys:String x:Key=\"LOCFilterInactiveLabel\">過濾器已停用</sys:String>\r\n    <sys:String x:Key=\"LOCAditionalFilters\">更多過濾條件</sys:String>\r\n    <sys:String x:Key=\"LOCFilters\">過濾器</sys:String>\r\n    <sys:String x:Key=\"LOCFilter\">過濾器</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidDataTitle\">資料無效</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChangesAskTitle\">儲存變更?</sys:String>\r\n    <sys:String x:Key=\"LOCAboutHomePageLink\">官方網站 www.playnite.link</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSourceLink\">在GitHub上檢視原始碼</sys:String>\r\n    <sys:String x:Key=\"LOCAboutCreateDiagButton\">建立診斷資料包</sys:String>\r\n    <sys:String x:Key=\"LOCAboutSendDiagButton\">發送診斷資料</sys:String>\r\n    <sys:String x:Key=\"LOCAboutWindowTitle\">關於Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCAboutAuthor\">由Josef Němec製作</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryWindowTitle\">指定分類</sys:String>\r\n    <sys:String x:Key=\"LOCCategorySetButton\">設定分類</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryAddCatButton\">新增分類</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryTooltip\" xml:space=\"preserve\">勾選 - 指定分類\r\n未勾選 - 移除分類\r\n不確定 - 不更改(當編輯多個遊戲時)</sys:String>\r\n    <sys:String x:Key=\"LOCNoCategory\">沒有分類</sys:String>\r\n    <sys:String x:Key=\"LOCNoPlatform\">沒有平台</sys:String>\r\n    <sys:String x:Key=\"LOCCrashWindowTitle\">哎喲! 出錯了。</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescription\" xml:space=\"preserve\">發生無法復原的錯誤。\r\n\r\n若您願意協助我們修復此問題，請簡短地描述當機前您所進行的動作並創建診斷包。若您有連網則診斷包將被上傳至Playnite伺服器進行分析。\r\n\r\n除此之外，您也可使用&quot;回報當機&quot;按鈕，在Github上回報本次錯誤。\r\n\r\n感謝您的協助。</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescription\" xml:space=\"preserve\">擴充功能 &quot;{0}&quot; 導致無法復原的錯誤\r\n\r\n建議您保存記錄檔並向該功能的開發者回報。如果本錯誤持續發生，請關閉該功能。</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionFS\" xml:space=\"preserve\">擴充功能 &quot;{0}&quot; 導致無法復原的錯誤\r\n\r\n建議您保存記錄檔並向該功能的開發者回報。如果本錯誤持續發生，請關閉該功能。</sys:String>\r\n    <sys:String x:Key=\"LOCExtCrashDescriptionUknown\" xml:space=\"preserve\">有未知的擴充功能或佈景主題造成了無法回復的錯誤。\r\n\r\n我們建議先停用所有第三方附加元件，移除造成問題的元件後向該元件開發者回報此錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDescriptionFullscreen\" xml:space=\"preserve\">發生無法復原的錯誤。\r\n\r\n如果您願意協助我們解決此問題，請傳送診斷資料報告給我們，謝謝。</sys:String>\r\n    <sys:String x:Key=\"LOCCrashDisableExtension\">停用擴充功能</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSaveLog\">保存記錄檔</sys:String>\r\n    <sys:String x:Key=\"LOCCrashSendDiag\">傳送診斷報告</sys:String>\r\n    <sys:String x:Key=\"LOCCrashReportIssue\">問題回報</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartPlaynite\">重新啟動Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafe\">在安全模式下重新啟動</sys:String>\r\n    <sys:String x:Key=\"LOCCrashRestartSafeTooltip\">停用所有非官方擴充功能並使用預設佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCCrashClosePlaynite\">結束Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCCrashUserActionsDescription\">當機之前進行的行為(以英文描述)</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryManager\">資料庫管理員</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskTitle\">移除遊戲()?</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveRunningError\">無法移除 - 遊戲或安裝程式正在執行. </sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallRunningError\">無法移除 - 遊戲正在執行.</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessage\" xml:space=\"preserve\">你確定要移除{0}嗎？</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessage\" xml:space=\"preserve\">您確定要移除{0}嗎？</sys:String>\r\n    <sys:String x:Key=\"LOCGameRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">您確定要移除{0}嗎?\r\n\r\n點選&quot;加入除外清單&quot;可防止下次遊戲資料庫更新時再度匯入本遊戲。</sys:String>\r\n    <sys:String x:Key=\"LOCGamesRemoveAskMessageIgnoreOption\" xml:space=\"preserve\">您確定要移除{0}嗎?\r\n\r\n點選&quot;加入除外清單&quot;可防止下次遊戲資料庫更新時再度匯入本遊戲。</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsAskMessage\">你確定要刪除目前非使用中的 {0} 項目?</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedFieldsNoUnusedMessage\">無未使用的欄位</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveAskAddToExlusionListYesResponse\">是(加入除外清單)</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeNotif\">這個頁面上有些變更尚未儲存</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeProgress\">正在更新遊戲資料庫格式...</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeFail\">數據庫更新失敗</sys:String>\r\n    <sys:String x:Key=\"LOCDBUpgradeEmptySpaceFail\">無法更新遊戲資料庫，需要 {0} MBs 的可用空間。</sys:String>\r\n    <sys:String x:Key=\"LOCGameError\">遊戲錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartErrorNoGame\">無法開始遊戲。數據庫中找不到'{0}' 。</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartError\">無法啟動遊戲: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartActionError\">無法進行操作: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameOpenLocationError\">無法開啟遊戲路徑: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeError\">無法偵測遊戲佔用儲存容量: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGameSizeErrorCaption\">佔用儲存容量掃描錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesSizeErrorMessage\">掃描佔用儲存容量期間出現 {0} 個錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCGameShortcutError\">無法創建捷徑: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCManualOpenError\">無法開啟說明: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallError\">無法安裝遊戲: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameUninstallError\">無法移除遊戲: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoPlayAction\">找不到有效的遊戲啟動指令。當你使用模擬器指令的時候，請確認遊戲以及模擬器設定檔之間的平台定義是相互符合的。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoInstallAction\">無法進行安裝</sys:String>\r\n    <sys:String x:Key=\"LOCErrorLibraryPluginNotFound\">本遊戲的資料庫外掛程式已被停用或尚未安裝</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoMetadataDownloader\">無法下載官方元資料</sys:String>\r\n    <sys:String x:Key=\"LOCErrorNoGameSelected\">未選擇任何項目。</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGameScriptAction\">遊戲腳本執行失敗</sys:String>\r\n    <sys:String x:Key=\"LOCErrorApplicationScript\">應用程式腳本執行失敗</sys:String>\r\n    <sys:String x:Key=\"LOCErrorGlobalScriptAction\">全域腳本執行失敗</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorScriptAction\">模擬器腳本執行失敗</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPlayScriptAction\">遊戲腳本執行失敗</sys:String>\r\n    <sys:String x:Key=\"LOCErrorPowerShellNotInstalled\">尚未安裝PowerShell 3.0 或更新版本</sys:String>\r\n    <sys:String x:Key=\"LOCErrorStartupNoController\">無法確定遊戲啟動方式</sys:String>\r\n    <!--General-->\r\n    <sys:String x:Key=\"LOCEnabledTitle\">啟用</sys:String>\r\n    <sys:String x:Key=\"LOCDisabledTitle\">停用</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveTitle\">移除</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveUnusedTitle\">清除未用的</sys:String>\r\n    <sys:String x:Key=\"LOCRenameTitle\">重新命名</sys:String>\r\n    <sys:String x:Key=\"LOCCopyTitle\">複製</sys:String>\r\n    <sys:String x:Key=\"LOCAddTitle\">新增</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultIconTitle\">預設圖示</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultCoverTitle\">預設封面圖片</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultBackgroundTitle\">預設背景圖片</sys:String>\r\n    <sys:String x:Key=\"LOCFinishLabel\">完成</sys:String>\r\n    <sys:String x:Key=\"LOCNextLabel\">繼續</sys:String>\r\n    <sys:String x:Key=\"LOCBackLabel\">返回</sys:String>\r\n    <sys:String x:Key=\"LOCDoneCapLabel\">完成</sys:String>\r\n    <sys:String x:Key=\"LOCBackCapLabel\">返回</sys:String>\r\n    <sys:String x:Key=\"LOCClearCapLabel\">清除</sys:String>\r\n    <sys:String x:Key=\"LOCClearLabel\">清除</sys:String>\r\n    <sys:String x:Key=\"LOCDismiss\">關閉</sys:String>\r\n    <sys:String x:Key=\"LOCDismissAll\">全部關閉</sys:String>\r\n    <sys:String x:Key=\"LOCImportLabel\">匯入</sys:String>\r\n    <sys:String x:Key=\"LOCNameLabel\">名稱</sys:String>\r\n    <sys:String x:Key=\"LOCAuthorLabel\">作者</sys:String>\r\n    <sys:String x:Key=\"LOCModuleLabel\">模組</sys:String>\r\n    <sys:String x:Key=\"LOCSeriesLabel\">系列</sys:String>\r\n    <sys:String x:Key=\"LOCVersionLabel\">版本</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayedLabel\">最後遊玩</sys:String>\r\n    <sys:String x:Key=\"LOCMostPlayedLabel\">最常遊玩</sys:String>\r\n    <sys:String x:Key=\"LOCPlayCountLabel\">遊玩次數</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeLabel\">安裝大小</sys:String>\r\n    <sys:String x:Key=\"LOCFolderLabel\">資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCNotesLabel\">備註</sys:String>\r\n    <sys:String x:Key=\"LOCAddedLabel\">已新增</sys:String>\r\n    <sys:String x:Key=\"LOCDateAddedLabel\">新增日期</sys:String>\r\n    <sys:String x:Key=\"LOCModifiedLabel\">已修改</sys:String>\r\n    <sys:String x:Key=\"LOCDateModifiedLabel\">修改日期 </sys:String>\r\n    <sys:String x:Key=\"LOCWebsiteLabel\">網站</sys:String>\r\n    <sys:String x:Key=\"LOCPathLabel\">路徑</sys:String>\r\n    <sys:String x:Key=\"LOCOKLabel\">確定</sys:String>\r\n    <sys:String x:Key=\"LOCSaveLabel\">儲存</sys:String>\r\n    <sys:String x:Key=\"LOCCloseLabel\">關閉</sys:String>\r\n    <sys:String x:Key=\"LOCCancelLabel\">取消</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmLabel\">確認</sys:String>\r\n    <sys:String x:Key=\"LOCResetLabel\">重置</sys:String>\r\n    <sys:String x:Key=\"LOCYesLabel\">是</sys:String>\r\n    <sys:String x:Key=\"LOCNoLabel\">否</sys:String>\r\n    <sys:String x:Key=\"LOCWelcomeLabel\">歡迎</sys:String>\r\n    <sys:String x:Key=\"LOCLocalUserLabel\">本地使用者</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralLabel\">一般</sys:String>\r\n    <sys:String x:Key=\"LOCMediaLabel\">媒體</sys:String>\r\n    <sys:String x:Key=\"LOCLinksLabel\">連結</sys:String>\r\n    <sys:String x:Key=\"LOCInstallationLabel\">安裝</sys:String>\r\n    <sys:String x:Key=\"LOCActionsLabel\">動作</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingLabel\">下載中....</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadingMediaLabel\">下載資料中...</sys:String>\r\n    <sys:String x:Key=\"LOCLoadingLabel\">載入中...</sys:String>\r\n    <sys:String x:Key=\"LOCTypeLabel\">類型</sys:String>\r\n    <sys:String x:Key=\"LOCProfileLabel\">基本資料</sys:String>\r\n    <sys:String x:Key=\"LOCProfilesLabel\">基本資料</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveLabel\">移除</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadLabel\">下載</sys:String>\r\n    <sys:String x:Key=\"LOCSearchLabel\">搜尋</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionLabel\">解析度:</sys:String>\r\n    <sys:String x:Key=\"LOCSearchResolutionAnyLabel\">任意</sys:String>\r\n    <sys:String x:Key=\"LOCZoomLabel\">放大</sys:String>\r\n    <sys:String x:Key=\"LOCListViewLabel\">列表檢視</sys:String>\r\n    <sys:String x:Key=\"LOCCoversLabel\">封面</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewLabel\">網格檢視</sys:String>\r\n    <sys:String x:Key=\"LOCDetailsViewLabel\">詳細檢視</sys:String>\r\n    <sys:String x:Key=\"LOCCustomLabel\">自訂</sys:String>\r\n    <sys:String x:Key=\"LOCURLLabel\">網址</sys:String>\r\n    <sys:String x:Key=\"LOCSpecialThanks\">特別感謝</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseLabel\">授權</sys:String>\r\n    <sys:String x:Key=\"LOCContributorsLabel\">貢獻者</sys:String>\r\n    <sys:String x:Key=\"LOCClosingPlaynite\">正在退出 Playnite…</sys:String>\r\n    <sys:String x:Key=\"LOCToday\">今天</sys:String>\r\n    <sys:String x:Key=\"LOCYesterday\">昨天</sys:String>\r\n    <sys:String x:Key=\"LOCMonday\">星期一</sys:String>\r\n    <sys:String x:Key=\"LOCTuesday\">星期二</sys:String>\r\n    <sys:String x:Key=\"LOCWednesday\">星期三</sys:String>\r\n    <sys:String x:Key=\"LOCThursday\">星期四</sys:String>\r\n    <sys:String x:Key=\"LOCFriday\">星期五</sys:String>\r\n    <sys:String x:Key=\"LOCSaturday\">星期六</sys:String>\r\n    <sys:String x:Key=\"LOCSunday\">星期日</sys:String>\r\n    <sys:String x:Key=\"LOCPastWeek\">上週</sys:String>\r\n    <sys:String x:Key=\"LOCPastMonth\">上個月</sys:String>\r\n    <sys:String x:Key=\"LOCPastYear\">去年</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThenYear\">超過一年</sys:String>\r\n    <sys:String x:Key=\"LOCSizeZeroTo100Mb\">0 到 100MB</sys:String>\r\n    <sys:String x:Key=\"LOCSize100MbTo1Gb\">100MB 到 1GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize1GbTo5Gb\">1GB 到 5GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize5GbTo10Gb\">5GB 到 10GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize10GbTo20Gb\">10GB 到 20GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize20GbTo40Gb\">20GB 到 40GB</sys:String>\r\n    <sys:String x:Key=\"LOCSize40GbTo100Gb\">40GB 到 100GB</sys:String>\r\n    <sys:String x:Key=\"LOCSizeMoreThan100Gb\">100GB 以上</sys:String>\r\n    <sys:String x:Key=\"LOCImportCompleted\">匯入成功</sys:String>\r\n    <sys:String x:Key=\"LOCAllGames\">所有遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCGameId\">遊戲 Id</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseId\">數據庫ID</sys:String>\r\n    <sys:String x:Key=\"LOCPresets\">預設</sys:String>\r\n    <sys:String x:Key=\"LOCColumn\">欄</sys:String>\r\n    <sys:String x:Key=\"LOCColumns\">欄</sys:String>\r\n    <sys:String x:Key=\"LOCRow\">列</sys:String>\r\n    <sys:String x:Key=\"LOCRows\">列</sys:String>\r\n    <sys:String x:Key=\"LOCExecIconMissingPlayAction\">無法從開始遊玩動作取得圖示。找不到對應的檔案類型。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmpty\">只下載缺少的元資料</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSkipNonEmptyTooltip\" xml:space=\"preserve\">啟用此選項則已有資料的欄位不會從元資料更新數據。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceIntro\">遊戲選擇</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGamesSourceDescription\">請選擇需要從元資料更新訊息的遊戲:</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceAll\">數據庫中的所有遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceFiltered\">所有目前過濾出的遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCMetaGameSourceSelected\">僅選中的遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorCaption\">未選取任何元資料欄位</sys:String>\r\n    <sys:String x:Key=\"LOCMetaNoFieldsSelectedErrorMessage\">未選取任何需進行下載的元資料欄位。請至少選擇一個欄位並啟用至少一個元資料提供者以使用本功能。</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceStore\">官方商店</sys:String>\r\n    <sys:String x:Key=\"LOCMetaSourceIGDB\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCMetaDescriptionFields\">請選擇透過Playnite自動輸入的資料範圍以及資料來源</sys:String>\r\n    <sys:String x:Key=\"LOCMetaIgdbContribNotif\">請點擊上方圖示並協助更新Igdb.com數據庫幫助Playnite提供用戶更詳盡的資訊。</sys:String>\r\n    <!--Progress string-->\r\n    <sys:String x:Key=\"LOCProgressMetadata\">正在下載元資料...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressInstalledGames\">正在匯入已安裝遊戲...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinGames\">正在匯入 {0} 遊戲中...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressImportinEmulatedGames\">正在從{0}...匯入模擬遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibraryGames\">正在下載資料庫更新...</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningGamesInstallSize\">正在掃描庫中的遊戲大小…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressScanningImportedGamesInstallSize\">正在掃描已匯入的遊戲大小…</sys:String>\r\n    <sys:String x:Key=\"LOCProgressLibImportFinish\">資料庫更新完成</sys:String>\r\n    <sys:String x:Key=\"LOCProgressReleasingResources\">正在釋放資源...</sys:String>\r\n    <!--Menu-->\r\n    <sys:String x:Key=\"LOCMenuConfigurationTitle\">設定</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlayniteSettingsTitle\">設定...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPlatformEmulatorSettingsTitle\">平台與模擬器</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureEmulatorsMenuTitle\">設定模擬器...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLibraryManagerTitle\">資料庫管理員...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuTools\">工具</sys:String>\r\n    <sys:String x:Key=\"LOCMenuDownloadMetadata\">下載元資料...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSoftwareTools\">軟體工具...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuConfigureIntegrations\">設定整合功能...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenClient\">開啟第三方軟體</sys:String>\r\n    <sys:String x:Key=\"LOCMenuClients\">第三方登入器</sys:String>\r\n    <sys:String x:Key=\"LOCMenuReloadLibrary\">更新遊戲資料庫</sys:String>\r\n    <sys:String x:Key=\"LOCMenuCancelLibraryUpdate\">取消資料庫更新</sys:String>\r\n    <sys:String x:Key=\"LOCMenuUpdateEmulatedDirs\">更新模擬器資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGame\">新增遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameManual\">手動...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameInstalled\">自動掃描...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddGameEmulated\">模擬器遊戲...</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddWindowsStore\">Microsoft Store 應用程式…</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAbout\">關於Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCMenuIssues\">意見回饋</sys:String>\r\n    <sys:String x:Key=\"LOCMenuOpenFullscreen\">進入全螢幕模式</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLinksTitle\">連結</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHelpTitle\">說明</sys:String>\r\n    <sys:String x:Key=\"LOCMenuPatreonSupport\">在Patreon上支持我們</sys:String>\r\n    <sys:String x:Key=\"LOCMenuKofiSupport\">在 Ko-fi 上支持我們</sys:String>\r\n    <sys:String x:Key=\"LOCUserManual\">使用說明</sys:String>\r\n    <sys:String x:Key=\"LOCSDKDocumentation\">SDK文件</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestartSystem\">系統重啟</sys:String>\r\n    <sys:String x:Key=\"LOCMenuShutdownSystem\">關閉系統</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSuspendSystem\">系統睡眠</sys:String>\r\n    <sys:String x:Key=\"LOCMenuHibernateSystem\">系統休眠</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLockSystem\">鎖定系統</sys:String>\r\n    <sys:String x:Key=\"LOCMenuLogoutUser\">登出使用者</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSelectRandomGame\">選擇隨機遊戲</sys:String>\r\n    <!--Settings Window-->\r\n    <sys:String x:Key=\"LOCSettingsDetailsPanelItems\">會顯示在詳細面板上的遊戲資訊:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemSpacing\">物件間隔</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemDrawBackground\">繪製網格化物件背景</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridItemCoverMargin\">網格化物件邊界寬度</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulIconSource\">缺少遊戲圖示時從此處抓取</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulCoverSource\">找不到遊戲封面時從此處抓取</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaulBackgroundSource\">找不到遊戲背景圖片時從此處抓取</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsIndentGameDetails\">到遊戲詳細資訊的垂直間距</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridViewDetailsPosition\">網格檢視詳細資訊位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDetailsGameListPosition\">列表檢視遊戲列表位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDrawPanelSeparators\">在面板間繪製分隔線</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsCoverHeight\">遊戲封面圖片高度</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsListIconSize\">遊戲列表圖示高度</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceFont\">程式字體</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceMonoFont\">等寬字體</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFilterPanelPosition\">過濾器面板位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExplorerPanelPosition\">瀏覽面板位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCoverArtRenderingLabel\">封面圖片渲染</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetAspectRatioLabel\">目標長寬比</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGridTileLayoutFSNote\">以下選項也會影響全螢幕模式下的渲染!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStrechModeLabel\">延展模式</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectDVD\">DVD 盒</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectEpicGamesStore\">Epic Games Store</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectGogGalaxy2\">GOG Galaxy 2.0</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectIgdb\">IGDB</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSquare\">方形</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteam\">Steam 標題</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectSteamVertical\">Steam直式封面</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCovertAspectTwitch\">Twitch</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartNotification\">* 需要重新啟動以套用變更</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLabel\">設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGeneralLabel\">一般</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelLabel\">頂部面板</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAppearanceLabel\">外觀</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGameDetailsLabel\">遊戲詳細資訊</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLayoutLabel\">版面配置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAdvancedLabel\">進階設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLabel\">全螢幕</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInputLabel\">輸入</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPerformanceLabel\">性能</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMetadataLabel\">元資料</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUpdating\">更新</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSearch\">搜尋</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackup\">備份</sys:String>\r\n    <sys:String x:Key=\"LOCMenuBackupData\">備份資料庫檔案</sys:String>\r\n    <sys:String x:Key=\"LOCMenuRestoreBackup\">還原備份</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportLabel\">自動匯入資料庫的改動</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidDBLocation\">無效的數據庫位置，必須設定正確的文件路徑</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInvalidAccountName\">帳號名稱不能為空白</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDownloadMetadataOnImport\">匯入遊戲後下載元資料</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartMinimized\">以最小化狀態啟動Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBoot\">開機時自動啟動Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootClosedToTray\">啟動後縮小至工具列</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartOnBootRegistrationError\">無法設定Playnite於開機後自動啟動</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsStartInFullscreen\">以全螢幕模式啟動</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoading\">不即時載入縮圖</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAsyncImageLoadingTooltip\">提升瀏覽遊戲列表時的滑鼠滾動順暢度，但圖片讀取速度相對較慢</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNameEmptyCover\">如無封面圖片則顯示遊戲名稱</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowNamesUnderCover\">在網格檢視中顯示遊戲名稱</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenUninstalledGridCovers\">以暗色顯示未安裝遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowIconList\">在詳細檢視中顯示遊戲圖示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowGroupCount\">在分組說明中顯示遊戲數量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsUsedFieldsOnlyOnFilterLists\">在過濾器跟瀏覽面板中只顯示指定欄位</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAcceleration\">停用硬體加速</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDisableAccelerationTooltip\">可用於改善畫面停頓等界面問題</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunch\">在快速啟動列表中顯示隱藏遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHiddenInQuickLaunchTooltip\">影響工作列捷徑清單與系統列選單</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsQuicLaunchItems\">快速啟動列表中項目數量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackgroundWindowImage\">使用遊戲背景圖片作為視窗背景</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurWindowBackgrounImage\">模糊背景</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBlurHighQuality\">高畫質</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDarkenWindowBackghrounImage\">背景加黑</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBackImageOnGridView\">在網格檢視中顯示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkin\">佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColor\">佈景主題簡介</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinFullscreen\">全螢幕佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinColorFullscreen\">全螢幕佈景主題簡介</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBLocation\">數據庫位置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsLoginStatus\">登入狀態:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWindowTitle\">Playnite設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCache\">清除快取</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearWebCacheTooltip\">可改善帳號連結問題</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowTray\">顯示系統列圖示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeToTray\">最小化時縮小至系統列</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCloseToTray\">關閉Playnite時將視窗縮小至系統列</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameStart\">當遊戲啟動時:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAfterGameClose\">當遊戲關閉時:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeUseDaysFormatLabel\">將遊玩時間改以天數顯示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDatesFormatsLabel\">日期格式:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheWarn\">即將登出所有已連結服務並重啟程式，是否繼續?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClearCacheTitle\">清除快取？</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSkinChangeRestart\">Playnite需要重新啟動以套用新的佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetThemes\">取得更多佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateThemes\">建立新的佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsGetExtensions\">取得更多擴充功能</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateExtensions\">添增新的附加元件</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsCreateLocalization\">協助我們翻譯Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartAskMessage\" xml:space=\"preserve\">Playnite需要重新啟動以套用變更，是否重啟?\r\n\r\n重新啟動將取消目前所有進行中的任務(例如下載)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRestartTitle\">重新啟動Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDBPathNotification\" xml:space=\"preserve\">Playnite不會自動搬移資料庫文件。您必須在更改位置前移動/複製這些資料。如果移動後的位置不存在資料庫，Playnite將會自動創建一個新的資料庫。\r\n\r\n新的資料庫位置將會在下次重新啟動程式之後被套用。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsClosePlaytimeNotif\">如果設定了&quot;關閉&quot;指令，則遊玩時間將不會被記錄</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRows\">列數</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenColumns\">欄數</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenRowDetails\">列表檢視列數</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenBackgroundOnMainScreen\">在主螢幕顯示背景圖片</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundImageScreenOptionTooltip\" xml:space=\"preserve\">未重新下載元資料時現有遊戲不會被覆蓋</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportMode\">匯入資料庫當中的遊玩時間:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeTooltip\" xml:space=\"preserve\">設定 Playnite 應該在何時匯入由管理Playnite資料庫外掛所回報的遊玩時間。\r\n負責管理遊戲資料庫的外掛必須要有支援才能使用這個功能。\r\n\r\n總是: 將會對新匯入以及已存在於Playnite資料庫的遊戲匯入遊玩時間。\r\n只針對新匯入的遊戲: 只會對新匯入的遊戲匯入遊玩時間。\r\n永不: 在任何情況下都不匯入遊玩時間。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeAlways\">總是</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNewImportsOnly\">只針對新匯入的遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPlaytimeImportModeNever\">從未</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputInDesktopMode\">在桌面模式中啟用手把</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputGuideOpensFullscreen\">導航按鍵開啟全螢幕模式</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultMetadataDescription\">設定新匯入的遊戲應該下載哪些資料</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTargetDisplay\">目標顯示器</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAlwaysUsePrimaryDisplay\">總是使用主顯示器</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenShowGameTitles\">顯示遊戲標題</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryStatus\">顯示電池狀態</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowBatteryPercentage\">顯示剩餘電量百分比</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowClock\">顯示時鐘</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsHideMouseCursor\">隱藏滑鼠游標</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenQuickFilterInstalled\">在快速過濾器中只顯示已安裝遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenButtonPrompts\">按鈕提示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenLayout\">配置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFullscreenHorizontalScrolling\">水平捲軸</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSelectChildSection\">選擇一個子選項</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoSettingsAvailable\">無可用的設定值</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsErrorLoadingSettings\">讀取設定失敗</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScriptingNotice\">這些腳本將供媒體庫中的所有遊戲運行。編輯遊戲詳細資訊時可針對不同遊戲各自分配獨立的腳本。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackgroundImageAnimation\">增加背景圖片動態轉場效果</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizes\">字型大小</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAuto\">自動</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionAliased\">鋸齒化</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionGrayscale\">灰階</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingModeOptionClearType\">ClearType</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionIdeal\">最佳化</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingModeOptionDisplay\">Display - GDI 兼容</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextFormattingMode\">文字格式化模式</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingMode\">文字渲染模式</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTextRenderingNotice\">文字渲染以及格式化選項目前不會對遊戲敘述造成影響</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownload\">預先讀取背景圖片</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImmediateBackgroundDownloadTooltip\" xml:space=\"preserve\">若啟用本功能則Playnite會於下載元資料時一併下載背景圖片。會佔用額外的硬碟空間且可於離線時瀏覽圖片。\r\n \r\n若禁用本功能則Playnite僅會在首次訪問時才下載背景圖片。會節省硬碟空間但可能造成圖片讀取速度緩慢, 且離線時將無法觀看部分圖片。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseLauncherOption\">退出遊戲時自動關閉遊戲啟動器</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseGracePeriod\">延緩用戶端關閉時間(秒)</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseMinimalSessionTime\">當遊戲時間低於(秒) 則不關閉</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSpecificClients\">自動關閉以下登入器:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoCloseSection\">自動關閉啟動器</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImportExclusionList\">匯入例外清單</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowMediaSizeWarning\">當遊戲媒體容量過大時顯示警告</sys:String>\r\n    <sys:String x:Key=\"LOCOpenDirectoryCommand\">資料夾開啟指令</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPreferredAgeRatingOrg\">預設年齡分級組織</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdate\">更新資料庫時同步更新遊戲安裝容量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsScanLibInstallSizeOnLibUpdateTooltip\">若系統偵測到上次掃描後檔案已被修改過，則掃瞄並更新遊戲安裝容量</sys:String>\r\n    <sys:String x:Key=\"LOCStrechNone\">無</sys:String>\r\n    <sys:String x:Key=\"LOCStrechFill\">填滿視窗</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniform\">保留原長寬比縮放以符合視窗</sys:String>\r\n    <sys:String x:Key=\"LOCStrechUniformToFill\">保留原長寬比縮放以符合視窗並自動裁切超出視窗內容</sys:String>\r\n    <sys:String x:Key=\"LOCDockLeft\">左</sys:String>\r\n    <sys:String x:Key=\"LOCDockRight\">右</sys:String>\r\n    <sys:String x:Key=\"LOCDockTop\">上</sys:String>\r\n    <sys:String x:Key=\"LOCDockBottom\">下</sys:String>\r\n    <sys:String x:Key=\"LOCImportError\">匯入錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCLoginRequired\">需要驗證</sys:String>\r\n    <sys:String x:Key=\"LOCLoginFailed\">驗證失敗</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRendering\">其他WebView渲染模式</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAltWebViewRenderingTooltip\">在WebView中遇到問題(例如集成驗證對話框時)使用。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoading\" xml:space=\"preserve\">遇到較長的遊戲敘述時僅先讀取部分敘述</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPartialDescriptionLoadingTooltip\">在選擇遊戲時，較長的遊戲敘述會導致明顯的延遲。\r\n\r\n啟用本選項後系統只會先讀取部分敘述，之後用戶可以自己再手動操作讀取剩餘敘述。</sys:String>\r\n    <!--Meta Import-->\r\n    <sys:String x:Key=\"LOCMetaImportWindowTitle\">匯入元資料</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadMetaButton\">下載元資料</sys:String>\r\n    <sys:String x:Key=\"LOCSaveDefaultTooltip\" xml:space=\"preserve\">選擇未來元資料下載的設定。\r\n之後可在設定中更改。</sys:String>\r\n    <!--Emulator Import-->\r\n    <sys:String x:Key=\"LOCEmuWizardWindowTitle\">模擬器匯入精靈</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardIntro\">這個精靈將帶領你完成下載以及匯入主機模擬器，模擬遊戲的流程。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNotice\">請留意，您可隨時透過主選單新增模擬器及/或遊戲(在&quot;媒體庫&quot;選單中可找到模擬器設定，&quot;新增遊戲&quot;選單中可新增模擬器遊戲)</sys:String>\r\n    <sys:String x:Key=\"LOCEmuDownloadDescription\">以下是Playnite可自動辨認及設定的模擬器清單。你可以到模擬器的網站下載安裝。當你完成安裝(手動)之後，你可以在模擬器設定畫面匯入模擬器。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardEmuImportIntro\">您可以按下&quot;從資料夾自動檢查...&quot; 來匯入任何已安裝在您PC上的模擬器。Playnite會在點選的資料夾中搜尋任何已知的模擬器並提供匯入選項。您可以多次使用該按鈕從多個文件夾匯入，模擬器將會被新增在目前列表的底部</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardGameImportIntro\">按下 &quot;掃描模擬器資料夾&quot; 按鈕，可自動匯入遊戲。如果選擇了適當的模擬器，Playnite將能自動辨識並匯入正確的檔案類型。您可以多次使用該按鈕從多個資料夾匯入，遊戲會被新增在目前清單的底部</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorWarning\">未選擇要匯入的模擬器。如未設定模擬器則將無法自動匯入任何模擬器遊戲。是否確定要繼續並離開匯入程序?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardNoEmulatorForGamesWarning\">尚未設定任何模擬器。如果未設定模擬器並選擇適當的檔案類型則無法匯入遊戲。是否新增模擬器?</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanGames\">掃描模擬器資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonSelectFiles\">選擇檔案</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonScanEmulator\">從資料夾自動檢查...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardButtonConfigureEmulator\">設定模擬器...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanning\">掃描中...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuWizardScanningSpecific\">掃描中 {0}...</sys:String>\r\n    <!--FirstTime Wizard-->\r\n    <sys:String x:Key=\"LOCFirstWindowTitle\">首次設定</sys:String>\r\n    <sys:String x:Key=\"LOCFirstIntro\" xml:space=\"preserve\">本精靈將帶領您完成遊戲匯入以及外部遊戲資料庫的設定。Playnite可以自動從遊戲服務商如Steam或GOG匯入遊戲，並於啟動時自動更新保持遊戲狀態同步。\r\n\r\n請留意，您可隨時點選&quot;Playnite&quot;按鈕，透過主選單手動新增任何平台上的自訂遊戲。    </sys:String>\r\n    <sys:String x:Key=\"LOCFirstExternalTitle\">資料庫整合</sys:String>\r\n    <sys:String x:Key=\"LOCFirstImportIntroduction\" xml:space=\"preserve\">自動從以下的服務匯入遊戲。以後Playnite啟動時將會自動更新遊戲狀態(安裝狀態) 或您可手動進行更新。此設定將會影響初次以及所有後續的匯入過程。</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedTitle\">完成設定</sys:String>\r\n    <sys:String x:Key=\"LOCFirstConfigFinishedText\" xml:space=\"preserve\">已完成初始設定。請留意您可隨時於設定中更改配置。\r\n\r\n您亦可隨時點選Playnite圖標來新增任何整合功能。</sys:String>\r\n    <sys:String x:Key=\"LOCFirstPluginDownloadError\" xml:space=\"preserve\">一個或以上的擴充功能下載失敗\r\n\r\n你可以在首次執行精靈結束後嘗試從附加元件選單中重新下載整合功能</sys:String>\r\n    <sys:String x:Key=\"LOCFirstDownloadingAddon\">下載{0}整合功能中...</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownload\">正在下載推薦整合功能清單…</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultAddonListDownloadError\">無法下載整合功能清單。你可以稍後在附加元件選單中重新嘗試下載。</sys:String>\r\n    <!--Platforms Settings-->\r\n    <sys:String x:Key=\"LOCPlatformsWindowTitle\">設定平台以及模擬器</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsWindowTitle\">設定模擬器</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformsTitle\">平台</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformTitle\">平台</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorsTitle\">模擬器</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorTitle\">模擬器</sys:String>\r\n    <sys:String x:Key=\"LOCAddPlatformTitle\">新增平台</sys:String>\r\n    <sys:String x:Key=\"LOCSelectIconTitle\">選擇圖示</sys:String>\r\n    <sys:String x:Key=\"LOCSelectCoverTitle\">選擇封面</sys:String>\r\n    <sys:String x:Key=\"LOCSelectImageTitle\">選擇圖片</sys:String>\r\n    <sys:String x:Key=\"LOCSelectItemTitle\">選擇項目</sys:String>\r\n    <sys:String x:Key=\"LOCSelectBackgroundTitle\">選擇背景</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTitle\">選擇檔案</sys:String>\r\n    <sys:String x:Key=\"LOCSelectUrlTitle\">選擇網址</sys:String>\r\n    <sys:String x:Key=\"LOCAddEmulatorTitle\">新增模擬器</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedPlatformsTitle\">支持的平台</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedPlatformsTitle\">是否儲存平台設定?</sys:String>\r\n    <sys:String x:Key=\"LOCConfirmUnsavedEmulatorsTitle\">是否儲存模擬器設定?</sys:String>\r\n    <sys:String x:Key=\"LOCExecutableTitle\">執行檔</sys:String>\r\n    <sys:String x:Key=\"LOCArgumentsTitle\">引數</sys:String>\r\n    <sys:String x:Key=\"LOCWorkingDirTitle\">工作目錄</sys:String>\r\n    <sys:String x:Key=\"LOCSupportedFilesTitle\">支援的檔案類型</sys:String>\r\n    <sys:String x:Key=\"LOCImportEmulatorsButton\">匯入模擬器...</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadEmulatorsButton\">下載模擬器...</sys:String>\r\n    <sys:String x:Key=\"LOCEmuLoadArgsPresetTooltip\">從已知的模擬器描述檔加載預設引數</sys:String>\r\n    <sys:String x:Key=\"LOCEmuRemovalConfirmation\" xml:space=\"preserve\">是否確定要移除 {0} 模擬器? \r\n檔案目前正被 {1} 個遊戲使用</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformRemovalConfirmation\" xml:space=\"preserve\">是否確定移除 {0} 平台? \r\n目前該平台正被 {1} 個遊戲以及 {2} 個模擬器使用</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSettingsHelp\">設置指引</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByTitle\">按... 排序</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortByDirection\">排序方式</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupByTitle\">按... 分組</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortAscending\">由少至多</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSortDescending\">由多至少</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupDont\">不分組</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupProvider\">按資料庫分組</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupCategory\">按分類分組</sys:String>\r\n    <sys:String x:Key=\"LOCMenuGroupPlatform\">按平台分組</sys:String>\r\n    <sys:String x:Key=\"LOCViewType\">檢視類型</sys:String>\r\n    <sys:String x:Key=\"LOCMenuView\">檢視</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewExplorerPanel\">瀏覽面板</sys:String>\r\n    <sys:String x:Key=\"LOCMenuViewFilterPanel\">過濾面板</sys:String>\r\n    <!--Game fields-->\r\n    <sys:String x:Key=\"LOCGameIconTitle\">圖示</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryIconTitle\">遊戲庫圖示</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverImageTitle\">封面圖片</sys:String>\r\n    <sys:String x:Key=\"LOCGameBackgroundTitle\">背景圖片</sys:String>\r\n    <sys:String x:Key=\"LOCGameSortingNameTitle\">排序用名稱</sys:String>\r\n    <sys:String x:Key=\"LOCGameProviderTitle\">資料庫</sys:String>\r\n    <sys:String x:Key=\"LOCGameManualTitle\">說明書</sys:String>\r\n    <sys:String x:Key=\"LOCGameNameTitle\">名稱</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDriveTitle\">安裝硬碟</sys:String>\r\n    <sys:String x:Key=\"LOCGameAccountNameTitle\">帳號名稱</sys:String>\r\n    <sys:String x:Key=\"LOCGamePlatformTitle\">平台</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoriesTitle\">分類</sys:String>\r\n    <sys:String x:Key=\"LOCGameGenresTitle\">類型</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseDateTitle\">發行日期</sys:String>\r\n    <sys:String x:Key=\"LOCGameReleaseYearTitle\">發行年份</sys:String>\r\n    <sys:String x:Key=\"LOCGameDevelopersTitle\">開發團隊</sys:String>\r\n    <sys:String x:Key=\"LOCGameTagsTitle\">標籤</sys:String>\r\n    <sys:String x:Key=\"LOCGamePublishersTitle\">發行商</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallationStatus\">安裝狀態</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTitle\">符合所有篩選條件</sys:String>\r\n    <sys:String x:Key=\"LOCUseFilterStyleAndTooltip\" xml:space=\"preserve\">勾選時，只有符合所有篩選條件的遊戲才會顯示\r\n取消時，只要符合任意一項篩選條件的遊戲都會顯示</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsInstalledTitle\">已安裝</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsGameInstalledTitle\">已安裝</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsUnInstalledTitle\">未安裝</sys:String>\r\n    <sys:String x:Key=\"LOCGameHiddenTitle\">隱藏</sys:String>\r\n    <sys:String x:Key=\"LOCGameFavoriteTitle\">我的最愛</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTitle\">啟用 HDR 支援</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrTooltip\">啟用本選項後，HDR會在遊戲開始前在主顯示器上啟用。</sys:String>\r\n    <sys:String x:Key=\"LOCGameHdrNotSupportedTooltip\">注意，你的主顯示器不支援HDR</sys:String>\r\n    <sys:String x:Key=\"LOCGameLastActivityTitle\">最後遊玩</sys:String>\r\n    <sys:String x:Key=\"LOCGameCategoryTitle\">分類</sys:String>\r\n    <sys:String x:Key=\"LOCGameDescriptionTitle\">描述</sys:String>\r\n    <sys:String x:Key=\"LOCGameInstallDirTitle\">安裝目錄</sys:String>\r\n    <sys:String x:Key=\"LOCGameCoverTitle\">封面圖片</sys:String>\r\n    <sys:String x:Key=\"LOCGameLinksTitle\">連結</sys:String>\r\n    <sys:String x:Key=\"LOCGameROMTitle\">圖片，ROM或ISO路徑</sys:String>\r\n    <sys:String x:Key=\"LOCGenreLabel\">類型</sys:String>\r\n    <sys:String x:Key=\"LOCGenresLabel\">類型</sys:String>\r\n    <sys:String x:Key=\"LOCCompanyLabel\">公司</sys:String>\r\n    <sys:String x:Key=\"LOCCompaniesLabel\">公司</sys:String>\r\n    <sys:String x:Key=\"LOCDeveloperLabel\">開發團隊</sys:String>\r\n    <sys:String x:Key=\"LOCDevelopersLabel\">開發團隊</sys:String>\r\n    <sys:String x:Key=\"LOCPublisherLabel\">發行商</sys:String>\r\n    <sys:String x:Key=\"LOCPublishersLabel\">發行商</sys:String>\r\n    <sys:String x:Key=\"LOCCategoryLabel\">分類</sys:String>\r\n    <sys:String x:Key=\"LOCCategoriesLabel\">分類</sys:String>\r\n    <sys:String x:Key=\"LOCTagLabel\">標籤</sys:String>\r\n    <sys:String x:Key=\"LOCTagsLabel\">標籤</sys:String>\r\n    <sys:String x:Key=\"LOCFeatureLabel\">特色</sys:String>\r\n    <sys:String x:Key=\"LOCFeaturesLabel\">特色</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingLabel\">年齡分級</sys:String>\r\n    <sys:String x:Key=\"LOCAgeRatingsLabel\">年齡分級</sys:String>\r\n    <sys:String x:Key=\"LOCRegionLabel\">地區</sys:String>\r\n    <sys:String x:Key=\"LOCRegionsLabel\">區域</sys:String>\r\n    <sys:String x:Key=\"LOCSourceLabel\">來源</sys:String>\r\n    <sys:String x:Key=\"LOCSourcesLabel\">來源</sys:String>\r\n    <sys:String x:Key=\"LOCRecentActivityLabel\">近期活動</sys:String>\r\n    <!--Errors-->\r\n    <sys:String x:Key=\"LOCDatabaseErroTitle\">數據庫錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenError\">無法開啟資料庫數據</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseNotOpenedError\">未開啟數據庫</sys:String>\r\n    <sys:String x:Key=\"LOCDatabaseOpenAccessError\">無法連接資料庫數據。檔案&quot;{0}&quot;正在被其他程式使用或位於無法連接的位置</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationError\">創建診斷報告失敗</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageUploadError\">自動上傳診斷報告失敗</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageSentSuccess\">診斷訊息成功送出</sys:String>\r\n    <sys:String x:Key=\"LOCDiagPackageCreationSuccess\" xml:space=\"preserve\">診斷報告已成功創建並回報。\r\n請在回報內容中附上以下ID:</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCLibraryImportError\">從 {0} 匯入遊戲失敗。</sys:String>\r\n    <sys:String x:Key=\"LOCLibraryImportEmulatedError\">無法從{0}匯入模擬器遊戲。</sys:String>\r\n    <sys:String x:Key=\"LOCScanEmulatorGamesEmptyProfileError\">無法透過指定的模擬器描述檔搜尋遊戲。描述檔未包含任何副檔名或平台。</sys:String>\r\n    <sys:String x:Key=\"LOCStartGenericError\">Playnite無法啟動。請關閉所有正在執行的程式並重試</sys:String>\r\n    <sys:String x:Key=\"LOCSkinApplyError\" xml:space=\"preserve\">無法套用佈景主題 &quot;{0}&quot;, 色彩描述檔 &quot;{1}&quot;\r\n \r\n{2}</sys:String>\r\n    <sys:String x:Key=\"LOCURLFormatError\">無法開啟連結，網址格式不符。</sys:String>\r\n    <sys:String x:Key=\"LOCAppStartupError\">無法開啟應用程式</sys:String>\r\n    <sys:String x:Key=\"LOCCefSharpInitError\" xml:space=\"preserve\">初始化網頁檢視內容失敗。Playnite無法繼續啟動程序。\r\n\r\n更多資訊請參考  https://playnite.link/cefstartup</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorImportNoDefinitionsError\">無法匯入模擬器，因為定義檔已損壞或丟失。</sys:String>\r\n    <sys:String x:Key=\"LOCMenuActionExecError\">無法執行選單動作</sys:String>\r\n    <!--GameEdit-->\r\n    <sys:String x:Key=\"LOCGameEditWindowTitle\">編輯遊戲詳細資訊</sys:String>\r\n    <sys:String x:Key=\"LOCImageURL\">圖片網址</sys:String>\r\n    <sys:String x:Key=\"LOCAddLinkButton\">新增連結</sys:String>\r\n    <sys:String x:Key=\"LOCAddRom\">新增ROM</sys:String>\r\n    <sys:String x:Key=\"LOCSaveChanges\">儲存變更</sys:String>\r\n    <sys:String x:Key=\"LOCGameEditChangeSaveTooltip\">套用已編輯的遊戲資訊欄位</sys:String>\r\n    <sys:String x:Key=\"LOCAddAction\">新增動作</sys:String>\r\n    <sys:String x:Key=\"LOCDeleteAction\">刪除動作</sys:String>\r\n    <sys:String x:Key=\"LOCRemovePlayAction\">移除啟動動作</sys:String>\r\n    <sys:String x:Key=\"LOCAddGames\">新增遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCScanFolder\">掃描資料夾...</sys:String>\r\n    <sys:String x:Key=\"LOCDetectInstalled\">找到已安裝</sys:String>\r\n    <sys:String x:Key=\"LOCBrowse\">瀏覽...</sys:String>\r\n    <sys:String x:Key=\"LOCOpenPlaynite\">打開Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCProfileSettings\">個人檔案設定</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameError\">遊戲名不能為空白</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyTrackingFolderError\">遊戲指令追蹤資料夾不可為空白</sys:String>\r\n    <sys:String x:Key=\"LOCEmptyGameNameMetaSearchError\">搜尋元資料時遊戲名稱不能為空白</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameData\">無效的遊戲資料</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfo\">請使用包含 http:// 或 https:// 的有效網址格式</sys:String>\r\n    <sys:String x:Key=\"LOCURLInputInfoTitile\">選擇網址</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDownloadError\">下載元資料失敗: {0}</sys:String>\r\n    <sys:String x:Key=\"LOCDownloadError\">下載錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCClearFilters\">清除過濾條件</sys:String>\r\n    <sys:String x:Key=\"LOCPrivateAccount\">私人帳號</sys:String>\r\n    <sys:String x:Key=\"LOCPublicAccount\">公開帳號</sys:String>\r\n    <sys:String x:Key=\"LOCAPIKey\">API 密鑰</sys:String>\r\n    <sys:String x:Key=\"LOCStartupError\">啟動錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCSkinError\">佈景主題錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCClearAll\">全部清除</sys:String>\r\n    <sys:String x:Key=\"LOCSetupRunning\">安裝中</sys:String>\r\n    <sys:String x:Key=\"LOCUninstalling\">移除中</sys:String>\r\n    <sys:String x:Key=\"LOCGameLaunching\">啟動中</sys:String>\r\n    <sys:String x:Key=\"LOCGameRunning\">執行中</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidURL\">無效的網址</sys:String>\r\n    <sys:String x:Key=\"LOCDoNothing\">不做任何事</sys:String>\r\n    <sys:String x:Key=\"LOCMinimize\">最小化</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindow\">還原視窗</sys:String>\r\n    <sys:String x:Key=\"LOCRestoreWindowOnlyFromUI\">僅在從介面啟動時還原視窗</sys:String>\r\n    <sys:String x:Key=\"LOCClose\">關閉</sys:String>\r\n    <sys:String x:Key=\"LOCChange\">變更</sys:String>\r\n    <sys:String x:Key=\"LOCAdvanced\">進階</sys:String>\r\n    <sys:String x:Key=\"LOCNever\">從未\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatus\">完成狀態</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatuses\">完成狀態</sys:String>\r\n    <sys:String x:Key=\"LOCUserScore\">使用者評分</sys:String>\r\n    <sys:String x:Key=\"LOCCriticScore\">專家評分</sys:String>\r\n    <sys:String x:Key=\"LOCCommunityScore\">社群評分</sys:String>\r\n    <sys:String x:Key=\"LOCGameScripts\">遊戲腳本</sys:String>\r\n    <sys:String x:Key=\"LOCApplicationScripts\">應用程式腳本</sys:String>\r\n    <sys:String x:Key=\"LOCScripts\">腳本</sys:String>\r\n    <sys:String x:Key=\"LOCPlugins\">外部插件</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataProviders\">元資料來源</sys:String>\r\n    <sys:String x:Key=\"LOCExtensions\">擴充功能</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionID\">擴充功能ID</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScripts\">重新載入腳本</sys:String>\r\n    <sys:String x:Key=\"LOCStartInteractivePowerShell\">互動式 SDK PowerShell</sys:String>\r\n    <sys:String x:Key=\"LOCReloadScriptsSuccess\">已成功加載所有腳本</sys:String>\r\n    <sys:String x:Key=\"LOCNoGamesFound\">找不到指定搜尋/過濾器條件的遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCNoItemsFound\">找不到任何項目</sys:String>\r\n    <sys:String x:Key=\"LOCBackToDesktopMode\">回到桌面模式</sys:String>\r\n    <sys:String x:Key=\"LOCExitPlaynite\">離開Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCLibraries\">資料庫</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateAll\">全部更新</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionCreatedBy\">建立者:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionVersion\">版本:</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdated\">已更新</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionModule\">模組:</sys:String>\r\n    <sys:String x:Key=\"LOCLibrary\">資料庫</sys:String>\r\n    <sys:String x:Key=\"LOCStatistics\">統計</sys:String>\r\n    <sys:String x:Key=\"LOCAll\">全部</sys:String>\r\n    <sys:String x:Key=\"LOCNone\">無</sys:String>\r\n    <sys:String x:Key=\"LOCNotifications\">通知</sys:String>\r\n    <sys:String x:Key=\"LOCWidth\">寬</sys:String>\r\n    <sys:String x:Key=\"LOCHeight\">高</sys:String>\r\n    <sys:String x:Key=\"LOCSize\">大小</sys:String>\r\n    <sys:String x:Key=\"LOCFontSmall\">小</sys:String>\r\n    <sys:String x:Key=\"LOCFontNormal\">普通</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarge\">大</sys:String>\r\n    <sys:String x:Key=\"LOCFontLarger\">較大</sys:String>\r\n    <sys:String x:Key=\"LOCFontLargest\">最大</sys:String>\r\n    <sys:String x:Key=\"LOCDefault\">預設</sys:String>\r\n    <sys:String x:Key=\"LOCSelect\">選擇</sys:String>\r\n    <sys:String x:Key=\"LOCSelectAll\">全選</sys:String>\r\n    <sys:String x:Key=\"LOCDeselectAll\">全部取消選取</sys:String>\r\n    <sys:String x:Key=\"LOCFirst\">首項</sys:String>\r\n    <sys:String x:Key=\"LOCRandom\">隨機</sys:String>\r\n    <sys:String x:Key=\"LOCUserSelect\">使用者選擇</sys:String>\r\n    <sys:String x:Key=\"LOCLoadMore\">加載更多</sys:String>\r\n    <sys:String x:Key=\"LOCTransparent\">透明</sys:String>\r\n    <sys:String x:Key=\"LOCCollapse\">摺疊</sys:String>\r\n    <sys:String x:Key=\"LOCExpand\">展開</sys:String>\r\n    <sys:String x:Key=\"LOCCollapseAll\">全部折疊</sys:String>\r\n    <sys:String x:Key=\"LOCExpandAll\">全部展開</sys:String>\r\n    <sys:String x:Key=\"LOCOther\">其他</sys:String>\r\n    <sys:String x:Key=\"LOCThemes\">佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorArguments\">模擬器引數</sys:String>\r\n    <sys:String x:Key=\"LOCBuiltinArguments\">預設引數</sys:String>\r\n    <sys:String x:Key=\"LOCCustomArguments\">自訂引數</sys:String>\r\n    <sys:String x:Key=\"LOCAdditionalEmulatorArguments\">其他模擬器引數</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideEmulatorArguments\">覆寫模擬器引數</sys:String>\r\n    <sys:String x:Key=\"LOCIsPlayAction\">啟動動作</sys:String>\r\n    <sys:String x:Key=\"LOCMedataDiffWindowTitle\">選擇要匯入的內容</sys:String>\r\n    <sys:String x:Key=\"LOCGameImportWindowTitle\">選擇要匯入的遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCMetaLookupWindowTitle\">搜尋元資料</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterWindowTitle\">有可用的更新</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterChangesInfo\">最後更新至今的變更</sys:String>\r\n    <sys:String x:Key=\"LOCUpdaterInstallUpdate\">下載並安裝更新</sys:String>\r\n    <sys:String x:Key=\"LOCCheckForUpdates\">檢查更新</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateError\">更新錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateCheckFailMessage\">無法檢查新版本</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNoNewUpdateMessage\">找不到新版本，您已是最新版本</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralUpdateFailMessage\">無法下載並安裝更新</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateProgressCancelAsk\">目前有背景程式正在執行。是否要取消並進行更新?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskExit\">目前有背景程式正在執行，是否要取消並關閉Playnite?</sys:String>\r\n    <sys:String x:Key=\"LOCBackgroundProgressCancelAskSwitchMode\">目前有背景程式正在執行，更換模式會取消該程式執行，是否要取消並更換模式?</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateIsAvailableNotificationBody\">Playnite有一個可用的更新</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestReloadList\">重新載入佈景主題清單</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestApplySkin\">套用選擇的佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChanges\">閱讀檔案更動</sys:String>\r\n    <sys:String x:Key=\"LOCThemeTestWatchChangesTooltip\">當來源檔案更改時自動套用佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCScriptRuntime\">腳本執行階段</sys:String>\r\n    <sys:String x:Key=\"LOCPreScriptDescription\">啟動遊戲前執行的腳本</sys:String>\r\n    <sys:String x:Key=\"LOCPostScriptDescription\">離開遊戲後執行的腳本</sys:String>\r\n    <sys:String x:Key=\"LOCGameStartedScriptDescription\">啟動遊戲後執行的腳本</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptStartupDescription\">在程式開始時執行</sys:String>\r\n    <sys:String x:Key=\"LOCAppScriptShutdownDescription\">在程式結束時執行</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarting\">遊戲啟動時腳本</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeStarted\">遊戲啟動後腳本</sys:String>\r\n    <sys:String x:Key=\"LOCScriptTypeExit\">遊戲停止後腳本</sys:String>\r\n    <sys:String x:Key=\"LOCExecuteGlobalScript\">執行全域腳本</sys:String>\r\n    <sys:String x:Key=\"LOCStatsGlobal\">全域</sys:String>\r\n    <sys:String x:Key=\"LOCStatsFiltered\">已過濾</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffCurrent\">目前</sys:String>\r\n    <sys:String x:Key=\"LOCMetadataDiffNew\">新的</sys:String>\r\n    <sys:String x:Key=\"LOCTestScript\">測試腳本</sys:String>\r\n    <sys:String x:Key=\"LOCOnlyItemsSelectedTooltip\">只顯示選取的項目</sys:String>\r\n    <!--Game actions-->\r\n    <sys:String x:Key=\"LOCSaveAsDefault\">儲存為預設值</sys:String>\r\n    <sys:String x:Key=\"LOCFavoriteGame\">新增至我的最愛</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveFavoriteGame\">從「我的最愛」中移除</sys:String>\r\n    <sys:String x:Key=\"LOCHideGame\">隱藏此遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCUnHideGame\">從隱藏列表中移除</sys:String>\r\n    <sys:String x:Key=\"LOCEnableHdr\">啟用 HDR 支援</sys:String>\r\n    <sys:String x:Key=\"LOCDisableHdr\">停用 HDR  支援</sys:String>\r\n    <sys:String x:Key=\"LOCEditGame\">編輯...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateInstallSize\">計算佔用儲存容量</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesAllInstallSize\">計算佔用儲存容量 (所有遊戲)</sys:String>\r\n    <sys:String x:Key=\"LOCCalculateGamesMissingInstallSize\">計算佔用儲存容量(只針對缺少的資料)</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeMenuLabel\">儲存空間佔用</sys:String>\r\n    <sys:String x:Key=\"LOCSetGameCategory\">設定分類...</sys:String>\r\n    <sys:String x:Key=\"LOCSetCompletionStatus\">設定完成狀態</sys:String>\r\n    <sys:String x:Key=\"LOCRemoveGame\">移除</sys:String>\r\n    <sys:String x:Key=\"LOCPlayGame\">啟動</sys:String>\r\n    <sys:String x:Key=\"LOCInstallGame\">安裝</sys:String>\r\n    <sys:String x:Key=\"LOCGameOptions\">遊戲選項</sys:String>\r\n    <sys:String x:Key=\"LOCGameDetails\">詳細資訊</sys:String>\r\n    <sys:String x:Key=\"LOCUninstallGame\">移除</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameLocation\">打開安裝位置</sys:String>\r\n    <sys:String x:Key=\"LOCCreateDesktopShortcut\">建立桌面捷徑</sys:String>\r\n    <sys:String x:Key=\"LOCOpenGameManual\">開啟說明書</sys:String>\r\n    <sys:String x:Key=\"LOCMoreAction\">更多</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePlugin\">由資料庫外掛管理</sys:String>\r\n    <sys:String x:Key=\"LOCPlayActionUsePluginTooltip\">遊戲的啟動過程將由相對應的資料庫外掛管理</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadNoResultsMessage\">在指定頁面找不到 '{0}' 的相關訊息</sys:String>\r\n    <sys:String x:Key=\"LOCMetadownloadSingleGameTip\">提示: 您可以透過&quot;編輯&quot;選單編輯遊戲並執行更進階的元資料下載程序</sys:String>\r\n    <sys:String x:Key=\"LOCProgreessAvailabilityMessage\">某些程式正在進行時無法使用</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionHTMLSupportTooltip\">描述文本支持HTML語法</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionPlaytimeSeconds\">遊戲時間按秒紀錄</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionSizeBytes\">儲存空間佔用以 bytes 表示。</sys:String>\r\n    <sys:String x:Key=\"LOCReleaseDateTooltip\">發布日期必須以&quot;年-月-日&quot;格式設定。月和日的值可以省略。</sys:String>\r\n    <sys:String x:Key=\"LOCDescriptionScoreValues\">輸入0到100的值或者留白以表示無分數</sys:String>\r\n    <sys:String x:Key=\"LOCPatreonDevelopMessage\">Playnite的開發得到了這些贊助者以及Ko-fi用戶們的支持:</sys:String>\r\n    <sys:String x:Key=\"LOCAboutContributorsMessage\">代碼，本地化以及其他貢獻者(無特定順序):</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringAskTitle\">取消遊戲監控?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringSetupAsk\">安裝監控正在執行，是否要取消並將遊戲復原到之前的狀態?</sys:String>\r\n    <sys:String x:Key=\"LOCCancelMonitoringExecutionAsk\">遊戲運行監控正在執行，是否要取消並將遊戲復原至之前的狀態?</sys:String>\r\n    <sys:String x:Key=\"LOCTimePlayed\">遊玩時數</sys:String>\r\n    <sys:String x:Key=\"LOCLastPlayed\">最後遊玩</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedDays\">{0}日 {1}小時 {2}分</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedHours\">{0}小時 {1}分鐘</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedMinutes\">{0} 分鐘</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedSeconds\">{0} 秒</sys:String>\r\n    <sys:String x:Key=\"LOCPlayedNone\">尚未遊玩</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDesktopModeMessage\">正在開啟桌面模式...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningFullscreenModeMessage\">正在開啟全螢幕模式...</sys:String>\r\n    <sys:String x:Key=\"LOCOpeningDatabase\">讀取遊戲資料庫中...</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeMessage\">計算佔用儲存容量中…</sys:String>\r\n    <sys:String x:Key=\"LOCCalculatingInstallSizeOfGameMessage\">正在計算{0}…的佔用儲存容量</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallFail\">無法安裝腳本</sys:String>\r\n    <sys:String x:Key=\"LOCScriptInstallSuccess\">成功安裝腳本</sys:String>\r\n    <sys:String x:Key=\"LOCInstallScript\">安裝腳本</sys:String>\r\n    <sys:String x:Key=\"LOCScriptError\">脚本錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCScriptExecutionError\">無法執行附加元件</sys:String>\r\n    <sys:String x:Key=\"LOCOpenMetadataFolder\">開啟元資料目錄夾</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculate\">計算</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeCalculateEditButtonTooltip\">自動以ROM計算佔用儲存容量，如果沒有ROM則以設定的遊戲安裝資料夾計算佔用儲存容量</sys:String>\r\n    <sys:String x:Key=\"LOCClientNotInstalledError\">{0} 未安裝客戶端程式</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalNotif\">{0} 客戶端程式即將啟動，請登入並關閉此訊息。</sys:String>\r\n    <sys:String x:Key=\"LOCSignInExternalWaitMessage\">正在等候用戶登入，完成後請關閉此訊息...</sys:String>\r\n    <sys:String x:Key=\"LOCInstallDirNotFoundError\">找不到遊戲安裝資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCInvalidGameActionSettings\">無效的遊戲指令設定</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingAccountLink\">解決帳號同步問題</sys:String>\r\n    <sys:String x:Key=\"LOCTroubleShootingIssues\">疑難排解</sys:String>\r\n    <sys:String x:Key=\"LOCRenameItem\">重新命名物件</sys:String>\r\n    <sys:String x:Key=\"LOCAddNewItem\">新增物件</sys:String>\r\n    <sys:String x:Key=\"LOCEnterName\">輸入名稱</sys:String>\r\n    <sys:String x:Key=\"LOCEnterNewName\">輸入新的名稱</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytimeLessThenAnHour\">少於1小時</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1to10\">1到10小時</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime10to100\">10到100小時</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime100to500\">100到500小時</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime500to1000\">500到1000小時</sys:String>\r\n    <sys:String x:Key=\"LOCPLaytime1000plus\">1000+</sys:String>\r\n    <sys:String x:Key=\"LOCExtInstallationRestartNotif\">必須重啟Playnite來完成安裝。是否立即重啟?</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionPackageError\">擴充功能未被正確封裝</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralThemePackageError\">佈景主題未被正確封裝</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadError\">擴充功能 &quot;{0}&quot; 載入失敗</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificExtensionLoadSDKError\">無法載入&quot;{0}&quot;擴充功能，目前版本的Playnite不支援此功能。</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadError\">佈景主題 &quot;{0}&quot; 載入失敗</sys:String>\r\n    <sys:String x:Key=\"LOCSpecificThemeLoadSDKError\">無法載入&quot;{0}&quot;佈景主題，目前版本的Playnite不支援此功能。</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionLoadError\">載入擴充功能失敗</sys:String>    \r\n    <sys:String x:Key=\"LOCGeneralThemeLoadError\">佈景主題載入失敗</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallApiVersionFails\">佈景主題/附加元件使用了未支援的API版本</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallSuccess\">安裝成功</sys:String>\r\n    <sys:String x:Key=\"LOCGeneralExtensionInstallTitle\">安裝附加元件?</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionGeneric\">通用</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstallFaild\">安裝&quot;{0}&quot;附加元件失敗</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallFail\" xml:space=\"preserve\">安裝附加元件失敗。\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallPrompt\" xml:space=\"preserve\">是否安裝新的擴充功能?\r\n\r\n{0}\r\n由 {1}\r\n版本 {2}</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUpdatePrompt\" xml:space=\"preserve\">是否升級擴充功能 &quot;{0}&quot; ?\r\n\r\n目前版本: {1}\r\n新版本: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallFail\" xml:space=\"preserve\">安裝佈景主題失敗。\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeInstallPrompt\" xml:space=\"preserve\">是否安裝新的佈景主題?\r\n\r\n{0}\r\n由 {1}\r\n版本 {2}</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUpdatePrompt\" xml:space=\"preserve\">是否升級佈景主題 &quot;{0}&quot; ?\r\n\r\n目前版本: {1}\r\n新版本: {2}</sys:String>\r\n    <sys:String x:Key=\"LOCUrlNavigationMessage\" xml:space=\"preserve\">即將離開Playnite並透過預設瀏覽器前往以下的網頁。是否繼續?\r\n \r\n{0}</sys:String>\r\n    <sys:String x:Key=\"LOCGameImageSizeWarning\" xml:space=\"preserve\">您選擇的圖片過大，可能導致效能無法最佳化。使用過大的圖片可能會造成介面嚴重卡頓並增加記憶體使用率。\r\n\r\n建議最大尺寸:\r\n圖標:  {0} px\r\n封面:  {1} px\r\n背景:  {2} px\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCPerformanceWarningTitle\">效能警告</sys:String>\r\n    <sys:String x:Key=\"LOCDontShowAgainTitle\">不再顯示</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionError\">擴充功能{0}的檔案不相容</sys:String>\r\n    <sys:String x:Key=\"LOCIncompatibleDragAndDropExtensionErrorTitle\">不相容的副檔名</sys:String>\r\n    <sys:String x:Key=\"LOCLargeMediaWarningTooltip\">已選擇的圖片過大，可能會影響效能。</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUninstallQuestion\">是否移除選定的佈景主題? 移除將會於下次程式啟動後進行</sys:String>\r\n    <sys:String x:Key=\"LOCThemeBuiltInUninstallHint\">無法移除內建佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCThemeUnsupported\">這個佈景主題不支援目前版本的Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUninstallQuestion\">是否移除選定的擴充功能? 移除將會於下次程式啟動後進行</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionBuiltInUninstallHint\">無法移除內建擴充功能</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionUnsupported\">此擴充功能不支援目前版本的Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionInstallDir\">安裝目錄</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionDataDir\">資料目錄</sys:String>\r\n    <sys:String x:Key=\"LOCDiagGenerating\">產生診斷報告中...</sys:String>\r\n    <sys:String x:Key=\"LOCDiagUploading\">上傳診斷報告中...</sys:String>\r\n    <sys:String x:Key=\"LOCAddFromExe\">匯入檔案...</sys:String>\r\n    <sys:String x:Key=\"LOCWhatIsThis\">這是什麼？</sys:String>\r\n    <sys:String x:Key=\"LOCConfirumationAskGeneric\">您確定要這麼做嗎？</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalPlayTime\">總遊玩時間</sys:String>\r\n    <sys:String x:Key=\"LOCStatsAvaragePlayTime\">平均遊玩時間</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTopPlayTime\">最高遊玩時間</sys:String>\r\n    <sys:String x:Key=\"LOCStatsTotalInstallSize\">總計安裝大小</sys:String>\r\n    <sys:String x:Key=\"LOCOverviewLabel\">總覽</sys:String>\r\n    <sys:String x:Key=\"LOCSidebar\">側邊欄</sys:String>\r\n    <sys:String x:Key=\"LOCToolsShowOnSidebar\">在側邊欄顯示</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsReset\">重設設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsDefaultResetDesc\" xml:space=\"preserve\">所有程式設定將恢復為預設值，不包括:\r\n- 資料庫位置\r\n- 匯入例外清單\r\n- 擴充功能設定，包含資料庫整合功能\r\n    \r\n需要重新啟動程式以套用設定。要重置設定嗎?\r\n</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsForDevelopers\">開發人員工具</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsExternalExtensions\">外部擴充功能</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNewExternalExtensionBox\">輸入完整資料夾路徑</sys:String>    \r\n    <!--Common Library-->\r\n    <sys:String x:Key=\"LOCCommonLinksAchievements\">成就</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksForum\">論壇</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksNews\">最新消息</sys:String>\r\n    <sys:String x:Key=\"LOCCommonLinksStorePage\">商店頁面</sys:String>\r\n    <sys:String x:Key=\"LOCFullscreenFirstTimeError\">首次安裝尚未完成，Playnite將會以桌面模式重新啟動來完成安裝步驟。</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterRecentlyPlayed\">最近玩過</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterFavorites\">我的最愛</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterMostPlayed\">最常遊玩</sys:String>\r\n    <sys:String x:Key=\"LOCQuickFilterAllGames\">全部</sys:String>\r\n    <sys:String x:Key=\"LOCGameListFiltered\">已套用過濾條件</sys:String>\r\n    <sys:String x:Key=\"LOCGameListExtraFiltered\">已套用額外過濾器</sys:String>\r\n    <sys:String x:Key=\"LOCGameListSearchResults\">搜尋結果：</sys:String>\r\n    <sys:String x:Key=\"LOCItemAlreadyExists\">已存在相同名稱的物件</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGameLimistToFilter\">將選擇限於目前過濾結果</sys:String>\r\n    <sys:String x:Key=\"LOCRandomGamePickAnother\">選擇另一個</sys:String>\r\n    <sys:String x:Key=\"LOCMenuAddons\">附加元件...</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsInstalled\">已安裝</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsSettings\">擴充功能設定</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsBrowse\">瀏覽</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdates\">更新</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionsUpdatesCount\">更新 {0}</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsConfigMoveInfo\">對已安裝的擴充功能及佈景主題的管理, 以及設定選項, 已被移到新增加的&quot;附加元件&quot;選單中。</sys:String>\r\n    <sys:String x:Key=\"LOCLibrariesConfigWindowDescription\" xml:space=\"preserve\">可以在此處設定所有目前已安裝的資料庫整合附加元件。\r\n\r\n如果要安裝或移除額外的整合功能，請使用主選單當中的&quot;附加元件&quot;選項。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesDesktop\">桌面模式佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsThemesFullscren\">全螢幕佈景主題</sys:String>\r\n    <sys:String x:Key=\"LOCAddonsSearching\">搜尋中...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorNotCompatible\">附加元件與此版本Playnite不相容</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorDownloadFailed\">無法下載附加元件安裝包</sys:String>\r\n    <sys:String x:Key=\"LOCAddonErrorManifestDownloadError\">無法下載附加元件安裝清單文件</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangesRestart\">需要重新啟動程式以套用更改。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonQueuedForInstall\">本附加元件已被排入安裝排程</sys:String>\r\n    <sys:String x:Key=\"LOCAddonInstall\">安裝</sys:String>\r\n    <sys:String x:Key=\"LOCAddonReinstall\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUninstall\">移除</sys:String>\r\n    <sys:String x:Key=\"LOCAddonAlreadyInstalled\">已安裝</sys:String>\r\n    <sys:String x:Key=\"LOCAddonNoAddonsAvailable\">未發現新的附加元件更新檔</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateAddons\">更新附加元件</sys:String>\r\n    <sys:String x:Key=\"LOCAddonChangelogNotAvailavble\">沒有可用的更新日誌</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusDownloaded\">已排程安裝</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusFailed\">下載失敗</sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdateStatusLicenseRejected\">授權被拒</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDownloadingAddon\">正在下載 {0}...</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLookingForUpdates\">正在檢查附加元件更新…</sys:String>\r\n    <sys:String x:Key=\"LOCAppLookingForUpdates\"></sys:String>\r\n    <sys:String x:Key=\"LOCAddonUpdatesAvailable\">有一個以上的附加元件更新可用。</sys:String>\r\n    <sys:String x:Key=\"LOCAddonSelectToUpdate\">選擇更新項目</sys:String>\r\n    <sys:String x:Key=\"LOCAddonDevReferenceLoaded\">擴充功能開發用服務</sys:String>\r\n    <sys:String x:Key=\"LOCAddonLicenseWindowTitle\">{0}授權協議</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseAccept\">接受</sys:String>\r\n    <sys:String x:Key=\"LOCLicenseDecline\">拒絕</sys:String>\r\n    <sys:String x:Key=\"LOCIncludePluginGameActions\">包含資料庫整合執行動作</sys:String>\r\n    <sys:String x:Key=\"LOCSelectActionTitle\">選擇動作</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingMode\">追蹤模式</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingPath\">追蹤路徑</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingTrackingDelay\">初始追蹤延遲</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingFrequency\">追蹤頻率</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeLink\">連結</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeFile\">檔案</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeEmulator\">模擬器</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionTypeScript\">腳本</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDefault\">預設</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeProcess\">處理程序</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingModeDirectory\">資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingOriginalProcess\">原始程序</sys:String>\r\n    <sys:String x:Key=\"LOCActionTrackingProcessName\"></sys:String>\r\n    <sys:String x:Key=\"LOCDevelTraceLogEnable\">紀錄追蹤訊息</sys:String>\r\n    <sys:String x:Key=\"LOCMultiEditOverwriteWarning\">以下更改將覆寫所有已選遊戲的資料!</sys:String>    \r\n    <sys:String x:Key=\"LOCGridViewSpacingModeNone\">無</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeUniform\">統一</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeBetweenItemsOnly\">只顯示項目</sys:String>\r\n    <sys:String x:Key=\"LOCGridViewSpacingModeStartAndEndOnly\">僅開始與結束</sys:String>\r\n    <sys:String x:Key=\"LOCScrollingSensitivity\">捲動靈敏度</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrolling\">滑順捲動</sys:String>\r\n    <sys:String x:Key=\"LOCSmoothScrollingSpeed\">動畫速度</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemTitle\">移除項目？</sys:String>\r\n    <sys:String x:Key=\"LOCAskRemoveItemMessage\">你是否確定要移除此項目？</sys:String>    \r\n    <sys:String x:Key=\"LOCSettingsTopPanelItems\">在頂欄顯示按鈕</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGeneralViewItem\">一般檢視設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelGroupingItem\">群組設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelSortingItem\">排序設定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsTopPanelFilterPresetsItem\">過濾器預設</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelPluginPanelPosition\">外掛程式項目位置</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSeparatorWidth\">區塊間隔寬度</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelMainButtonMove\">將主選單按鈕移至側邊欄</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelExplorerSwitch\">瀏覽面板</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSelectRandomGameButton\">隨機選取遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButton\">從目前結果隨機選擇遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelViewSelectRandomGameButtonTooltip\">從目前檢視中隨機選取遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSaveViewOptions\">儲存群組及排序設定</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetShowOnFSTopPanel\">在全螢幕模式中顯示為快速過濾器</sys:String>\r\n    <sys:String x:Key=\"LOCInPast7Days\">過去 7 天</sys:String>\r\n    <sys:String x:Key=\"LOCInPast31Days\">過去 31 天</sys:String>\r\n    <sys:String x:Key=\"LOCInPast365Days\">過去 365 天</sys:String>\r\n    <sys:String x:Key=\"LOCMoreThan365DaysAgo\">超過365天以前</sys:String>\r\n    <sys:String x:Key=\"LOCConfigure\">設定</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetSave\">儲存預設</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGame\">啟動遊戲後最小化</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMinimizeAfterStartingGameDescription\" xml:space=\"preserve\">遊戲開始後將Playnite最小化。\r\n\r\n如將此功能關閉可能會造成遊戲無法在啟動時取得輸入焦點而導致問題發生!</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSize\">字型大小</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFontSizeSmall\">字體小</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsControllerApi\"></sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessing\">遊戲控制器支援</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsXInputProcessingDescription\" xml:space=\"preserve\">若停用此選項，則Playnite不會接受任何遊戲控制器輸入的訊號。\r\n        \r\n如果你有使用其他工具程式來將手把訊號轉譯為滑鼠/鍵盤訊號，而造成在Playnite中有重複輸入的現象，請停用此選項。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsShowItemsMainMenuHeader\">在主選單中顯示項目:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtons\">反轉X/A主要視圖按鈕綁定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapMainViewXAButtonsDescriptions\">交換按鈕綁定與開始遊戲並且在主要視圖當中顯示遊戲詳細資料頁面</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtons\">交換確認/取消按鈕綁定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSwapConfirmCancelButtonsDescriptions\">交換A/B按鈕與確認/取消的綁定</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnly\">只有主控制器</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPrimaryControllerOnlyDescription\">啟動時，只接收主控制器的指令。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRefocusOnGuidButton\">導覽按鈕焦點定位於Playnite</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsInterfaceVolume\">介面音量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMusiVolume\">背景音量</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsMuteBackground\">處於背景時靜音</sys:String>\r\n    <sys:String x:Key=\"LOCErrorAudioInterfaceInit\">初始化音頻介面失敗</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApi\">輸出API</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAudioOutputApiDescription\">這是用於音源輸出的API。如果你遇到音源問題請更換。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionGeneral\">一般</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionVisuals\">視覺</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionAudio\">聲音</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionLayout\">版面配置</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSectionMenus\">選單</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsFSSection\">輸入</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsStarting\">正在開始{0}...</sys:String>\r\n    <sys:String x:Key=\"LOCGameIsRunning\">正在執行{0}...</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputCapitalize\">大寫字母</sys:String>\r\n    <sys:String x:Key=\"LOCTextInputSpace\">空白鍵</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerMode\">影像渲染縮放</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingAlternative\">其他</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingBalanced\">平衡</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalingQuality\">畫質</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsImageScalerModeTooltip\" xml:space=\"preserve\">高效能:\r\n最高畫質，速度慢，記憶體用量高。\r\n    \r\n平衡:\r\n中等畫質，速度快，記憶體用量低。\r\n    \r\n其他:\r\n中高畫質，速度中等，記憶體用量中。</sys:String>\r\n    <sys:String x:Key=\"LOCSelectFileTooltip\">選擇檔案...</sys:String>\r\n    <sys:String x:Key=\"LOCSelectDirectoryTooltip\">選擇資料夾...</sys:String>\r\n    <sys:String x:Key=\"LOCStartupScript\">啟動腳本</sys:String>\r\n    <sys:String x:Key=\"LOCAddonPerfNotice\" xml:space=\"preserve\">請注意，擴充功能及佈景主題兩者都會大幅度影響Playnite的運作效能，穩定性以及安全性。\r\n\r\n如果你在安裝主題或擴充功能後遇到問題，請嘗試先禁用/移除它們，以確定它們是否是問題的根源。</sys:String>\r\n    <sys:String x:Key=\"LOCGameActionSelectOnStart\">啟動時選擇</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSelectOnStart\">啟動時選擇</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfiles\">內建配置檔</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorBuiltInProfile\">內建配置檔</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfiles\">自訂檔案</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorCustomProfile\">自訂設定檔</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorFunctionHandledByScript\">由內建腳本控制</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorSpec\">模擬器格式</sys:String>\r\n    <sys:String x:Key=\"LOCPlatformSpec\">平台格式</sys:String>\r\n    <sys:String x:Key=\"LOCRegionSpec\">地區格式</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPreScriptDescription\">啟動模擬器之前執行</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorPostScriptDescription\">啟動模擬器之後執行</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatorStartedScriptDescription\">關閉模擬器之後執行</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorExecutableNotFound\">找不到可執行的模擬器檔案</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorSpecificationNotFound\">找不到模擬器格式檔</sys:String>\r\n    <sys:String x:Key=\"LOCErrorEmulatorStartupScriptNotFound\">找不到模擬器啟動膠本</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportSplitGames\">分割成不同遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCSplitEmuImportMergeGames\">合併成相同遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignPlatform\">設定平台</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAssignRegion\">設定地區</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanDirectory\">掃描資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanConfigurations\">掃描設定</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypes\">從校驗掃描中排除模式</sys:String>\r\n    <sys:String x:Key=\"LOCEmuCrcExcludeFileTypesTooltip\">符合特定模式的檔案不會被掃描校驗，而會使用檔案名稱配對。更多訊息請參考模擬器幫助頁面</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanEmulator\">用模擬器掃描</sys:String>    \r\n    <sys:String x:Key=\"LOCScanConfigNameError\">儲存新設定時必須輸入名稱</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigNoEmulatorError\">未配置模擬器或模擬器設定檔</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigDirectoryError\">未指定要掃描的資料夾或資料夾不存在</sys:String>\r\n    <sys:String x:Key=\"LOCScanConfigError\">未正確配置掃描設定</sys:String>    \r\n    <sys:String x:Key=\"LOCEmuScanIncludeGlobalUpdate\">包括大量掃描以及自動掃描</sys:String>    \r\n    <sys:String x:Key=\"LOCEmulatorScanFailed\">掃描模擬器資料夾失敗</sys:String>\r\n    <sys:String x:Key=\"LOCEmulatedGameScanFailed\">掃描模擬器遊戲資料夾失敗</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScanHideImported\">隱藏已匯入</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportProfilesToImportHeader\">匯入檔案:</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAutoScanConfigurations\">自動掃描設定</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfig\">儲存為自動掃描設定</sys:String>\r\n    <sys:String x:Key=\"LOCEmuSaveScanConfigTooltip\">將儲存設定以用於未來的資料庫更新。可透過&quot;設定模擬器&quot;選單來管理已儲存的設定。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePaths\">使用相對路徑匯入</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportWithRelativePathsTooltip\">可能的話匯入遊戲檔案時使用與Playnite安裝資料夾或者模擬器安裝資料夾相關聯的路徑。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanSubfolders\">掃描子資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportScanInsideArchives\">掃描壓縮檔裡的檔案</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFiles\">合併相關檔案</sys:String>\r\n    <sys:String x:Key=\"LOCEmuMergeRelatedFilesTooltip\">合併相關遊戲檔案，例如個別的遊戲光碟等，到同一個遊戲資料中。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddScanner\">新增掃描器</sys:String>\r\n    <sys:String x:Key=\"LOCEmuAddSavedScanner\">新增已存檔的掃描器</sys:String>\r\n    <sys:String x:Key=\"LOCStartScan\">開始掃描</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportDirectoryConfigDesc\">新增模擬器的掃描設定以掃描特定資料夾。匯入遊戲之前請確保模擬器已正確設定(可透過 資料庫 -&gt; 設定模擬器 選單確認)</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusDefaultStatusDesc\">已將新加入的遊戲調整為預設狀態</sys:String>\r\n    <sys:String x:Key=\"LOCCompletionStatusPlayedStatusDesc\">已調整首次遊玩的遊戲狀態</sys:String>\r\n    <sys:String x:Key=\"LOCPowerShellCreationError\">無法啟動PowerShell腳本執行環境。如果你是Windows7的使用者，請嘗試(重新)安裝PowerShell5.1。</sys:String>\r\n    <sys:String x:Key=\"LOCFilterPresetNameConflict\">已存在指定名稱的過濾器預設，是否使用新設定更新預設?</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofill\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillTooltip\"></sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticles\">將從自動填入的遊戲排序名稱的開頭刪除以下的字詞:</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameRemovedArticlesTooltip\">使用這個功能以忽略用來排序的名稱開頭的字詞。預設是&quot;The&quot;，&quot;An&quot;，&quot;A&quot;。</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillButton\">幫沒有排序名稱的遊戲填入排序名稱</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsSortingLabel\">排序</sys:String>\r\n    <sys:String x:Key=\"LOCSortingNameAutofillProgress\">填入排序名稱…</sys:String>\r\n    <sys:String x:Key=\"LOCNahimicServiceWarning\" xml:space=\"preserve\">偵測到您的系統正在執行Nahimic服務。這個服務已被認為會造成Playnite(以及其他應用程式)在渲染上出現嚴重錯誤。        \r\n\r\n如果你遇到圖形破損或其他渲染問題，建議你停用或者完全移除該Nahimic服務。\r\n\r\n更多訊息請查看 https://playnite.link/nahimicsucks</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarning\" xml:space=\"preserve\">Playnite目前正以高級權限(系統管理員身分)執行中。我們不建議你使用此方式執行，因為這將會授與所有透過Playnite執行的遊戲/應用程式以及已安裝的擴充功能過高等級的權限!\r\n\r\n查看此處以了解詳情 https://playnite.link/adminfaq</sys:String>\r\n    <sys:String x:Key=\"LOCElevatedProcessWarningShowOption\">如果Playnite正以系統管理員身分執行的話則跳出警告</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOption\">計算遊戲占用容量時取得在硬碟上的實際容量</sys:String>\r\n    <sys:String x:Key=\"LOCInstallSizeScanUseSizeOnDiskOptionTooltip\" xml:space=\"preserve\">如果啟用，掃描速度會較慢且會取得該檔案在硬碟中實際占用的空間\r\n如果停用，掃描速度會較快且會使用檔案本身的大小</sys:String>\r\n    <sys:String x:Key=\"LOCWarningBlacklistedExtensions\" xml:space=\"preserve\">以下的附加元件已經被回報含有潛在問題，有可能造成穩定性/效能降低或資訊安全疑慮。我們強烈建議你移除這些附加元件:\r\n        \r\n{0}\r\n    </sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFiles\">不要掃描線上檔案</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExcludeOnlineFilesTooltip\" xml:space=\"preserve\">儲存在雲端且無法直接在本地電腦存取的檔案不會被掃描匯入。\r\n僅支援: Google Drive, DropBox, OneDrive</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScan\">使用簡易方式掃描，不下載檔案內容</sys:String>\r\n    <sys:String x:Key=\"LOCEmuUseSimplifiedOnlineFileScanTooltip\">使用較低準確度的方法，不需要下載檔案內容到本地裝置即可匯入檔案。</sys:String>\r\n    <sys:String x:Key=\"LOCMetadatSetAllFieldsToValue\">套用到全部</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallState\">覆載安裝狀態</sys:String>\r\n    <sys:String x:Key=\"LOCOverrideInstallStateTooltip\" xml:space=\"preserve\">開啟時，Playnite會忽略在匯入此遊戲時被外掛程式設定的安裝狀態(包含安裝資料夾)\r\n        \r\n這個選項對於某些使用特定遊戲匯入方法的插件可能不會正常運作，除非該外掛也有考慮到這個覆載功能。</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnlyManually\">僅手動</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceADay\">每天一次</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnceAWeek\">每週一次</sys:String>\r\n    <sys:String x:Key=\"LOCOptionOnEveryStartup\">每次啟動時</sys:String>\r\n    <sys:String x:Key=\"LOCCheckProgramUpdates\">確認程式更新狀態</sys:String>\r\n    <sys:String x:Key=\"LOCCheckAddonUpdates\">確認附加元件更新狀態</sys:String>\r\n    <sys:String x:Key=\"LOCCheckLibraryUpdates\">更新資料庫</sys:String>\r\n    <sys:String x:Key=\"LOCCheckEmulatedLibraryUpdates\">掃描模擬器資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCStatsIncludeHidden\">包含已隱藏遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCMenuSetFields\">編輯欄位</sys:String>\r\n    <sys:String x:Key=\"LOCItemSelectionSelectDeselectAll\">全選 / 取消全選</sys:String>\r\n    <sys:String x:Key=\"LOCOpen\">開啟</sys:String>\r\n    <sys:String x:Key=\"LOCActivate\">啟動</sys:String>\r\n    <sys:String x:Key=\"LOCAssign\">指定</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchDescription\">開始輸入文字以搜尋遊戲…按下[F1]取得協助</sys:String>\r\n    <sys:String x:Key=\"LOCDefaultSearchHint\" xml:space=\"preserve\">開頭加上 # 會帶入可用的指令清單。\r\n開頭加上 / 會帶入可用的搜尋提供者/外掛清單。\r\n輸入搜尋關鍵字並且在最後加入空白鍵會馬上轉換到該搜尋。\r\n\r\nTAB: 轉換動作\r\nENTER: 啟動選中的動作\r\nSHIFT-ENTER: 開啟項目列表</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalled\">包含未安裝的遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHidden\">包含已隱藏遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledIncluded\">包含未安裝的遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterUninstalledExcluded\">不包含未安裝的遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenIncluded\">已包含已隱藏的遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCSearchFilterHiddenalledExcluded\">未包含已隱藏的遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionPlay\">遊玩或安裝</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionSwitchTo\">檢視詳細資料</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionOpenMenu\">遊戲選單</sys:String>\r\n    <sys:String x:Key=\"LOCGameSearchItemActionEdit\">編輯遊戲</sys:String>\r\n    <sys:String x:Key=\"LOCOpenSearch\">開啟搜尋</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchBox\">搜尋欄位</sys:String>\r\n    <sys:String x:Key=\"LOCTopPanelSearchButton\">搜尋鍵</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSearchSettingsPrimaryAction\">主要遊戲指令</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSecondaryAction\">次要遊戲指令</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsKeyboardOpenSearch\">按下CTRL-F 時開啟全域搜尋而非單一搜尋欄位</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSaveFilter\">每次搜尋後記錄遊戲過濾器設定</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSearchProviders\">搜尋提供來源</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsDefaultKeyword\">預設關鍵字</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsCustomKeyword\">自訂關鍵字</sys:String>\r\n    <sys:String x:Key=\"LOCSearchSettingsSystemWideShortcut\">系統級快捷鍵</sys:String>\r\n    <sys:String x:Key=\"LOCSearchTitle\">Playnite搜尋</sys:String>\r\n    <sys:String x:Key=\"LOCExtensionSettingsMenu\">擴充功能設定</sys:String>\r\n    <sys:String x:Key=\"LOCExclusions\">排除</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFiles\">不包含掃描資料夾相關的檔案</sys:String>\r\n    <sys:String x:Key=\"LOCEmuScannerExcludedFolders\">不包含與掃描資料夾相關的資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddROMExclusionList\">將檔案加入排除清單</sys:String>\r\n    <sys:String x:Key=\"LOCEmuImportAddFolderExclusionList\">將資料夾加入排除清單</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionNoConfigError\">排除設定只能新增在已保存的掃描器設定檔當中</sys:String>\r\n    <sys:String x:Key=\"LOCEmuExclusionAddedMessage\">排除設定已新增於&quot;{0}&quot; 掃描器當中。</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatform\">覆載平台</sys:String>\r\n    <sys:String x:Key=\"LOCEmuOverridePlatformTooltip\">打開此選項時掃描器會把這個平台資訊指定到所有遊戲，並覆載所有已經偵測到的平台資訊。</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefault\">在預設搜尋中包含指令內容</sys:String>\r\n    <sys:String x:Key=\"LOCSearchIncludeCommandsInDefaultTooltip\">當這個選項被停用時，未使用#前綴的話，預設搜尋將不會包含指令內容。</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatching\">在遊戲名稱過濾器中使用模糊比對</sys:String>\r\n    <sys:String x:Key=\"NameFilterUseFuzzyMatchingTooltip\" xml:space=\"preserve\">啟用時，名稱過濾器會使用等同於全域搜尋的方式來比對遊戲名稱\r\n你可以透過添加首字元 ! 來強制對個別關鍵字執行精確比對</sys:String>\r\n    <sys:String x:Key=\"LOCSearchViewGameFieldOptions\">在遊戲結果中顯示的欄位:</sys:String>\r\n    <sys:String x:Key=\"LOCHiddenStatus\">隱藏狀態</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCBackupCancelled\">已取消資料備份。</sys:String>\r\n    <sys:String x:Key=\"LOCBackupFailed\">資料備份失敗。</sys:String>\r\n    <sys:String x:Key=\"LOCBackupErrorTitle\">資料備份錯誤</sys:String>\r\n    <sys:String x:Key=\"LOCBackupProgress\">資料備份中…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreProgress\">正在從備份資料中還原檔案…</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreFailed\">從備份檔案還原資料失敗。</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionSettings\">設定</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionLibrary\">遊戲資料庫</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionGameMedia\">遊戲資料庫媒體</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensions\">已安裝的擴充功能</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionExtensionsData\">擴充功能資料</sys:String>\r\n    <sys:String x:Key=\"LOCBackupOptionThemes\">已安裝的主題</sys:String>\r\n    <sys:String x:Key=\"LOCBackupRestoreMessage\" xml:space=\"preserve\">選擇要從特定備份檔案還原的資料\r\n    \r\nPlaynite會自動重新啟動並開始還原資料</sys:String>\r\n    <sys:String x:Key=\"LOCBackupDataBackupMessage\" xml:space=\"preserve\">選擇要包含在備份檔案中的項目。預設包含應用程式設定以及遊戲資料庫。\r\n    \r\nPlaynite將會重新啟動並開始備份資料</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsEnableAutomaticBackup\">自動備份檔案</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupFrequency\">自動備份頻度</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsBackupFolder\">備份資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsRotatingBackups\">輪替式備份</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAutoBackupIncludeItems\">包含額外資料:</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsNoBackupDirSpecifiedError\">如果要開啟自動備份，必須設定備份資料夾。</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatches\">僅顯示小型更新通知</sys:String>\r\n    <sys:String x:Key=\"LOCUpdateNotifyOnlyPatchesToolip\" xml:space=\"preserve\">啟用時，只有目前已安裝的主要版本出現可用更新時會發出更新通知。\r\n出現新的主要版本時將不會發出更新通知。</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormat\">為最近一周使用相對日期</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsPastWeekRelativeFormatTooltip\" xml:space=\"preserve\">如果日期在一周內，則在&quot;今天&quot;,&quot;昨天&quot;等格式上使用相對日期。\r\n    \r\n指定的日期格式將被用在所有其他日期上。</sys:String>\r\n\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearch\">網頁圖片搜索</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchIconTerm\">縮圖搜尋字串</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchCoverTerm\">封面圖片搜尋字串</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsWebImageSearchBackground\">背景圖片搜尋字串</sys:String>\r\n    <sys:String x:Key=\"LOCGettingsAddonInformation\">正在獲取插件資訊。</sys:String>\r\n    <sys:String x:Key=\"LOCNoMetadataSource\">沒有可用的元資料來源</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettings\">遊玩指令設定</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsScanner\">使用掃描器設定</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectProfile\">啟動時選擇個人檔案</sys:String>\r\n    <sys:String x:Key=\"LOCScannerConfigPlayActionSettingsSelectEmulator\">啟動時選擇模擬器</sys:String>\r\n    <sys:String x:Key=\"LOCAutomatic\">自動</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOn\">保持開啟</sys:String>\r\n    <sys:String x:Key=\"LOCAlwaysOff\">始終關閉</sys:String>\r\n    <sys:String x:Key=\"LOCSettingsAccessibilityInterface\">輔助功能 (螢幕閱讀器) </sys:String>\r\n    <sys:String x:Key=\"LOCApplicationMenu\">應用程式選單</sys:String>\r\n    <sys:String x:Key=\"LOCGameMenu\">遊戲目錄</sys:String>\r\n    <sys:String x:Key=\"LOCProgramFolder\">程式資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCUserDataFolder\">使用者資料夾</sys:String>\r\n    <sys:String x:Key=\"LOCDBCorruptionCrashMessage\" xml:space=\"preserve\">偵測到資料庫檔案毀損，Playnite即將自動關閉。\r\n    \r\n你可以在Playnite的GitHub頁面新增回報並請求修復你的毀損檔案。</sys:String>\r\n    <sys:String x:Key=\"LOCUnsavedChangesAskMessage\">是否要儲存所做的更改？</sys:String>\r\n    <sys:String x:Key=\"LOCPortableInstallation\">可攜式安裝</sys:String>\r\n    <sys:String x:Key=\"LOCNoControllersDetected\">未偵測到搖桿</sys:String>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite/Localization.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Globalization;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite\r\n{\r\n    public class PlayniteLanguage\r\n    {\r\n        public int TranslatedPercentage\r\n        {\r\n            get; set;\r\n        } = -1;\r\n\r\n        public string LocaleString\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public string Id\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public string DisplayString\r\n        {\r\n            get => ToString();\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            if (TranslatedPercentage == -1 || TranslatedPercentage == 100)\r\n            {\r\n                return LocaleString;\r\n            }\r\n            else\r\n            {\r\n                return $\"{LocaleString}   ({Id}, {TranslatedPercentage}%)\";\r\n            }\r\n        }\r\n    }\r\n\r\n    public static class Localization\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        public const string SourceLanguageId = \"english\";\r\n\r\n        public static List<PlayniteLanguage> AvailableLanguages\r\n        {\r\n            get\r\n            {\r\n                return GetLanguagesFromFolder(PlaynitePaths.LocalizationsPath);\r\n            }\r\n        }\r\n\r\n        public static string CurrentLanguage\r\n        {\r\n            get; private set;\r\n        } = SourceLanguageId;\r\n\r\n        public static CultureInfo ApplicationLanguageCultureInfo\r\n        {\r\n            get; private set;\r\n        } = CultureInfo.CurrentCulture;\r\n\r\n        public static bool IsRightToLeft\r\n        {\r\n            get\r\n            {\r\n                return ApplicationLanguageCultureInfo.TextInfo.IsRightToLeft;\r\n            }\r\n        }\r\n\r\n        public static List<PlayniteLanguage> GetLanguagesFromFolder(string path)\r\n        {\r\n            var coverage = Serialization.FromJsonFile<Dictionary<string, int>>(PlaynitePaths.LocalizationsStatusPath);\r\n            var langs = new List<PlayniteLanguage>() {\r\n                new PlayniteLanguage()\r\n                {\r\n                    Id = SourceLanguageId,\r\n                    LocaleString = \"English\"\r\n                }\r\n            };\r\n\r\n            if (!Directory.Exists(path))\r\n            {\r\n                return langs;\r\n            }\r\n\r\n            foreach (var file in Directory.GetFiles(path, \"*.xaml\"))\r\n            {\r\n                if (!Regex.IsMatch(file, \"[a-zA-Z]+_[a-zA-Z]+\"))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                var fileCode = Path.GetFileNameWithoutExtension(file);\r\n                if (!coverage.TryGetValue(fileCode.Replace('_', '-'), out var lngCov))\r\n                {\r\n                    coverage.TryGetValue(fileCode.Split('_')[0], out lngCov);\r\n                }\r\n\r\n                var langPath = Path.Combine(path, file);\r\n                var localeString = \"\";\r\n                try\r\n                {\r\n                    foreach (var line in File.ReadLines(langPath, Encoding.UTF8))\r\n                    {\r\n                        var match = Regex.Match(line, @\"LanguageName\"\"\\>(.+)\\<\");\r\n                        if (match.Success)\r\n                        {\r\n                            localeString = match.Groups[1].Value;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to parse localization file {file}\");\r\n                    continue;\r\n                }\r\n\r\n                langs.Add(new PlayniteLanguage()\r\n                {\r\n                    Id = Path.GetFileNameWithoutExtension(langPath),\r\n                    LocaleString = localeString,\r\n                    TranslatedPercentage = lngCov\r\n                });\r\n            }\r\n\r\n            return langs.OrderBy(a => a.LocaleString).ToList();\r\n        }\r\n\r\n        public static void SetLanguage(string language)\r\n        {\r\n            var dictionaries = Application.Current.Resources.MergedDictionaries;\r\n            if (CurrentLanguage != SourceLanguageId)\r\n            {\r\n                var currentLang = dictionaries.FirstOrDefault(a => a[\"LanguageName\"] != null && a.Source == null);\r\n                if (currentLang != null)\r\n                {\r\n                    dictionaries.Remove(currentLang);\r\n                }\r\n            }\r\n\r\n            var langFile = Path.Combine(PlaynitePaths.LocalizationsPath, language + \".xaml\");\r\n            if (File.Exists(langFile) && language != SourceLanguageId)\r\n            {\r\n                ResourceDictionary res = null;\r\n                try\r\n                {\r\n                    res = Xaml.FromFile<ResourceDictionary>(langFile);\r\n                    res.Source = new Uri(langFile, UriKind.Absolute);\r\n                    // Unstranslated strings are imported as empty entries by Crowdin.\r\n                    // We need to remove them to make sure that origina English text will be displayed instead.\r\n                    foreach (var key in res.Keys)\r\n                    {\r\n                        if (res[key] is string locString && locString.IsNullOrEmpty())\r\n                        {\r\n                            res.Remove(key);\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to parse localization file {langFile}\");\r\n                    return;\r\n                }\r\n\r\n                dictionaries.Add(res);\r\n\r\n                ApplicationLanguageCultureInfo = new CultureInfo(language.Replace(\"_\", \"-\"), false);\r\n            }\r\n            else\r\n            {\r\n                ApplicationLanguageCultureInfo = new CultureInfo(\"en-US\", false); // english is the default language\r\n            }\r\n\r\n            CurrentLanguage = language;\r\n        }\r\n\r\n        public static void LoadAddonLocalization(string addonDir)\r\n        {\r\n            var dictionaries = Application.Current.Resources.MergedDictionaries;\r\n            void loadString(string xamlPath)\r\n            {\r\n                ResourceDictionary res = null;\r\n                try\r\n                {\r\n                    res = Xaml.FromFile<ResourceDictionary>(xamlPath);\r\n                    res.Source = new Uri(xamlPath, UriKind.Absolute);\r\n                    foreach (var key in res.Keys)\r\n                    {\r\n                        if (res[key] is string locString)\r\n                        {\r\n                            if (locString.IsNullOrEmpty())\r\n                            {\r\n                                res.Remove(key);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            res.Remove(key);\r\n                        }\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to parse localization file {xamlPath}\");\r\n                    return;\r\n                }\r\n\r\n                dictionaries.Add(res);\r\n            }\r\n\r\n            var localDir = Path.Combine(addonDir, PlaynitePaths.LocalizationsDirName);\r\n            if (!Directory.Exists(localDir))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var enXaml = Path.Combine(localDir, \"en_US.xaml\");\r\n            if (!File.Exists(enXaml))\r\n            {\r\n                return;\r\n            }\r\n\r\n            loadString(enXaml);\r\n            if (CurrentLanguage != \"english\" && CurrentLanguage != \"en_US\")\r\n            {\r\n                var langXaml = Path.Combine(localDir, $\"{CurrentLanguage}.xaml\");\r\n                if (File.Exists(langXaml))\r\n                {\r\n                    loadString(langXaml);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Manifests/AddonManifestBase.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public enum AddonType\r\n    {\r\n        GameLibrary,\r\n        MetadataProvider,\r\n        Generic,\r\n        ThemeDesktop,\r\n        ThemeFullscreen\r\n    }\r\n\r\n    public class AddonManifestBase : ObservableObject\r\n    {\r\n        public class AddonUserAgreement\r\n        {\r\n            public DateTime Updated { get; set; }\r\n            public string AgreementUrl { get; set; }\r\n        }\r\n\r\n        public class AddonScreenshot\r\n        {\r\n            public string Thumbnail { get; set; }\r\n            public string Image { get; set; }\r\n        }\r\n\r\n        public string IconUrl { get; set; }\r\n        public List<AddonScreenshot> Screenshots { get; set; }\r\n        public AddonType Type { get; set; }\r\n        public string InstallerManifestUrl { get; set; }\r\n        public string ShortDescription { get; set; }\r\n        public string Description { get; set; }\r\n        public string Name { get; set; }\r\n        public string AddonId { get; set; }\r\n        public string Author { get; set; }\r\n        public Dictionary<string, string> Links { get; set; }\r\n        public List<string> Tags { get; set; }\r\n        public AddonUserAgreement UserAgreement { get; set; }\r\n        public string SourceUrl { get; set; }\r\n    }\r\n\r\n    public class AddonInstallerPackage\r\n    {\r\n        public Version Version { get; set; }\r\n        public string PackageUrl { get; set; }\r\n        public Version RequiredApiVersion { get; set; }\r\n        public DateTime ReleaseDate { get; set; }\r\n        public List<string> Changelog { get; set; }\r\n    }\r\n\r\n    public class AddonInstallerManifestBase\r\n    {\r\n        public string AddonId { get; set; }\r\n        public List<AddonInstallerPackage> Packages { get; set; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Manifests/AddonManifests.cs",
    "content": "﻿using Newtonsoft.Json;\r\nusing Playnite.Common;\r\nusing Playnite.Common.Web;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing YamlDotNet.Serialization;\r\n\r\nnamespace Playnite\r\n{\r\n    public class AddonInstallerManifest : AddonInstallerManifestBase\r\n    {\r\n        public AddonType AddonType { get; set; }\r\n\r\n        public AddonInstallerPackage GetLatestCompatiblePackage()\r\n        {\r\n            if (!Packages.HasItems())\r\n            {\r\n                return null;\r\n            }\r\n\r\n            var apiVersion = GetApiVersion(AddonType);\r\n            return GetCompatiblePackages(apiVersion).FirstOrDefault();\r\n        }\r\n\r\n        public List<AddonInstallerPackage> GetCompatiblePackages()\r\n        {\r\n            return GetCompatiblePackages(GetApiVersion(AddonType));\r\n        }\r\n\r\n        public List<AddonInstallerPackage> GetCompatiblePackages(Version apiVersion)\r\n        {\r\n            if (!Packages.HasItems())\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return Packages.\r\n                Where(a => a.RequiredApiVersion != null && a.RequiredApiVersion.Major == apiVersion.Major && a.RequiredApiVersion <= apiVersion).\r\n                OrderByDescending(a => a.Version).ToList();\r\n        }\r\n\r\n        private static Version GetApiVersion(AddonType type)\r\n        {\r\n            switch (type)\r\n            {\r\n                case AddonType.GameLibrary:\r\n                case AddonType.MetadataProvider:\r\n                case AddonType.Generic:\r\n                    return SdkVersions.SDKVersion;\r\n                case AddonType.ThemeDesktop:\r\n                    return ThemeManager.DesktopApiVersion;\r\n                case AddonType.ThemeFullscreen:\r\n                    return ThemeManager.FullscreenApiVersion;\r\n            }\r\n\r\n            return new Version(999, 0);\r\n        }\r\n    }\r\n\r\n    public class AddonManifest : AddonManifestBase\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        private AddonInstallerManifest installerManifest;\r\n        [YamlIgnore]\r\n        [JsonIgnore]\r\n        public AddonInstallerManifest InstallerManifest\r\n        {\r\n            get\r\n            {\r\n                if (installerManifest == null)\r\n                {\r\n                    DownloadInstallerManifest();\r\n                }\r\n\r\n                return installerManifest;\r\n            }\r\n        }\r\n\r\n        [YamlIgnore]\r\n        [JsonIgnore]\r\n        public AddonInstallerPackage LatestPackage\r\n        {\r\n            get\r\n            {\r\n                var manifest = InstallerManifest;\r\n                if (!manifest.Packages.HasItems())\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                return manifest.Packages.OrderByDescending(a => a.Version).FirstOrDefault();\r\n            }\r\n        }\r\n\r\n        [YamlIgnore]\r\n        [JsonIgnore]\r\n        public bool IsQueuedForInstall\r\n        {\r\n            get\r\n            {\r\n                var fileName = Path.GetFileName(GetTargetDownloadPath());\r\n                return ExtensionInstaller.GetQueuedItems().Any(a => Path.GetFileName(a.Path) == fileName);\r\n            }\r\n        }\r\n\r\n        [YamlIgnore]\r\n        [JsonIgnore]\r\n        public bool IsInstalled\r\n        {\r\n            get\r\n            {\r\n                if (IsTheme)\r\n                {\r\n                    if (Type == AddonType.ThemeDesktop)\r\n                    {\r\n                        return ThemeManager.GetAvailableThemes(ApplicationMode.Desktop).Any(a => a.Id == AddonId);\r\n                    }\r\n                    else\r\n                    {\r\n                        return ThemeManager.GetAvailableThemes(ApplicationMode.Fullscreen).Any(a => a.Id == AddonId);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return ExtensionFactory.GetInstalledManifests().Any(a => a.Id == AddonId);\r\n                }\r\n            }\r\n        }\r\n\r\n        [YamlIgnore]\r\n        [JsonIgnore]\r\n        public bool IsTheme => Type == AddonType.ThemeDesktop || Type == AddonType.ThemeFullscreen;\r\n\r\n        [YamlIgnore]\r\n        [JsonIgnore]\r\n        public bool IsExtension => Type == AddonType.Generic || Type == AddonType.GameLibrary || Type == AddonType.MetadataProvider;\r\n\r\n        public string GetTargetDownloadPath()\r\n        {\r\n            return Path.Combine(PlaynitePaths.TempPath, Paths.GetSafePathName(AddonId) + GetAddonPackageExtension(Type));\r\n        }\r\n\r\n        public static string GetAddonPackageExtension(AddonType type)\r\n        {\r\n            switch (type)\r\n            {\r\n                case AddonType.GameLibrary:\r\n                case AddonType.MetadataProvider:\r\n                case AddonType.Generic:\r\n                    return PlaynitePaths.PackedExtensionFileExtention;\r\n                case AddonType.ThemeDesktop:\r\n                case AddonType.ThemeFullscreen:\r\n                    return PlaynitePaths.PackedThemeFileExtention;\r\n                default:\r\n                    throw new Exception($\"Uknown addon type {type}\");\r\n            }\r\n        }\r\n\r\n        public bool? CheckAddonLicense()\r\n        {\r\n            try\r\n            {\r\n                if (UserAgreement != null)\r\n                {\r\n                    var acceptState = ExtensionInstaller.GetAddonLicenseAgreed(AddonId);\r\n                    if (acceptState == null || acceptState < UserAgreement.Updated)\r\n                    {\r\n                        var license = HttpDownloader.DownloadString(UserAgreement.AgreementUrl);\r\n                        var licenseAgree = new LicenseAgreementViewModel(\r\n                            new LicenseAgreementWindowFactory(),\r\n                            license,\r\n                            Name);\r\n\r\n                        if (licenseAgree.OpenView() == true)\r\n                        {\r\n                            ExtensionInstaller.AgreeAddonLicense(AddonId);\r\n                            return true;\r\n                        }\r\n                        else\r\n                        {\r\n                            ExtensionInstaller.RemoveAddonLicenseAgreement(AddonId);\r\n                            return false;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        return true;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return true;\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to process addon license.\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n\r\n        public void DownloadInstallerManifest()\r\n        {\r\n            DownloadInstallerManifest(new CancellationToken());\r\n        }\r\n\r\n        public void DownloadInstallerManifest(CancellationToken cancelToken)\r\n        {\r\n            try\r\n            {\r\n                if (InstallerManifestUrl.IsNullOrEmpty())\r\n                {\r\n                    throw new Exception(\"No addon manifest installer url.\");\r\n                }\r\n\r\n                if (InstallerManifestUrl.StartsWith(\"http\", StringComparison.OrdinalIgnoreCase))\r\n                {\r\n                    installerManifest = PlayniteApplication.Current.ServicesClient.GetAddonInstaller(AddonId);\r\n                }\r\n                else if (File.Exists(InstallerManifestUrl))\r\n                {\r\n                    installerManifest = Serialization.FromYamlFile<AddonInstallerManifest>(InstallerManifestUrl);\r\n                }\r\n                else\r\n                {\r\n                    throw new Exception($\"Uknown installer manifest url format {InstallerManifestUrl}.\");\r\n                }\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, \"Failed to get addon installer manifest data.\");\r\n                installerManifest = new AddonInstallerManifest();\r\n            }\r\n\r\n            installerManifest.AddonType = Type;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Manifests/ExtensionManifest.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing YamlDotNet.Serialization;\r\n\r\nnamespace Playnite\r\n{\r\n    public enum ExtensionType\r\n    {\r\n        GenericPlugin,\r\n        GameLibrary,\r\n        Script,\r\n        MetadataProvider\r\n    }\r\n\r\n    public class BaseExtensionManifest\r\n    {\r\n        public string Id { get; set; }\r\n\r\n        public string Name { get; set; }\r\n\r\n        public string Author { get; set; }\r\n\r\n        public string Version { get; set; }\r\n\r\n        public List<Link> Links { get; set; }\r\n\r\n        [YamlIgnore]\r\n        public string DirectoryPath { get; set; }\r\n\r\n        [YamlIgnore]\r\n        public string DirectoryName { get; set; }\r\n\r\n        [YamlIgnore]\r\n        public string DescriptionPath { get; set; }\r\n\r\n        public void VerifyManifest()\r\n        {\r\n            if (!System.Version.TryParse(Version, out var extver))\r\n            {\r\n                throw new Exception(\"Extension version string must be a real version!\");\r\n            }\r\n        }\r\n    }\r\n\r\n    public class ExtensionManifest : BaseExtensionManifest\r\n    {\r\n        [YamlIgnore]\r\n        public bool IsExternalDev { get; set; }\r\n\r\n        //[YamlIgnore]\r\n        //public bool IsCompatible { get; } = false;\r\n\r\n        public string Module { get; set; }\r\n\r\n        public string Icon { get; set; }\r\n\r\n        public ExtensionType Type { get; set; }\r\n\r\n        public ExtensionManifest()\r\n        {\r\n        }\r\n\r\n        public static ExtensionManifest FromFile(string descriptorPath)\r\n        {\r\n            var deserializer = new DeserializerBuilder().IgnoreUnmatchedProperties().Build();\r\n            var description = deserializer.Deserialize<ExtensionManifest>(File.ReadAllText(descriptorPath));\r\n            description.DescriptionPath = descriptorPath;\r\n            description.DirectoryPath = Path.GetDirectoryName(descriptorPath);\r\n            description.DirectoryName = Path.GetFileName(description.DirectoryPath);\r\n            return description;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/Manifests/ThemeManifest.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing YamlDotNet.Serialization;\r\n\r\nnamespace Playnite\r\n{\r\n    public class ThemeManifest : BaseExtensionManifest\r\n    {\r\n        public string ThemeApiVersion { get; set; }\r\n\r\n        public ApplicationMode Mode { get; set; }\r\n\r\n        [YamlIgnore]\r\n        public bool IsBuiltInTheme { get; }\r\n\r\n        [YamlIgnore]\r\n        public bool IsCustomTheme => !IsBuiltInTheme;\r\n\r\n        [YamlIgnore]\r\n        public bool IsCompatible { get; } = false;\r\n\r\n        public ThemeManifest()\r\n        {\r\n        }\r\n\r\n        public ThemeManifest(string manifestPath)\r\n        {\r\n            var thm = Serialization.FromYaml<ThemeManifest>(File.ReadAllText(manifestPath));\r\n            thm.CopyProperties(this, false);\r\n            DescriptionPath = manifestPath;\r\n            DirectoryPath = Path.GetDirectoryName(manifestPath);\r\n            DirectoryName = Path.GetFileName(DirectoryPath);\r\n            if (Mode == ApplicationMode.Desktop)\r\n            {\r\n                IsBuiltInTheme = BuiltinExtensions.BuiltinThemeIds.Contains(thm.Id);\r\n            }\r\n            else\r\n            {\r\n                IsBuiltInTheme = BuiltinExtensions.BuiltinThemeIds.Contains(thm.Id);\r\n            }\r\n\r\n            var apiVesion = Mode == ApplicationMode.Desktop ? ThemeManager.DesktopApiVersion : ThemeManager.FullscreenApiVersion;\r\n            if (!ThemeApiVersion.IsNullOrEmpty())\r\n            {\r\n                var themeVersion = new Version(ThemeApiVersion);\r\n                if (themeVersion.Major == apiVesion.Major && themeVersion <= apiVesion)\r\n                {\r\n                    IsCompatible = true;\r\n                }\r\n            }\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/MenuHelpers.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.Extensions.Markup;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite\r\n{\r\n    public class MenuHelpers\r\n    {\r\n        public static object GetIcon(string iconName, double imageHeight = 16, double imageWidth = 16)\r\n        {\r\n            if (iconName.IsNullOrEmpty())\r\n            {\r\n                return null;\r\n            }\r\n\r\n            var resource = ResourceProvider.GetResource(iconName);\r\n            if (resource != null)\r\n            {\r\n                if (resource is string stringIcon)\r\n                {\r\n                    return Images.GetImageFromFile(ThemeFile.GetFilePath(stringIcon), BitmapScalingMode.Fant, imageHeight, imageWidth);\r\n                }\r\n                else if (resource is BitmapImage bitmap)\r\n                {\r\n                    var image = new System.Windows.Controls.Image() { Source = bitmap };\r\n                    RenderOptions.SetBitmapScalingMode(image, RenderOptions.GetBitmapScalingMode(bitmap));\r\n                    return image;\r\n                }\r\n                else if (resource is TextBlock textIcon)\r\n                {\r\n                    var text = new TextBlock\r\n                    {\r\n                        Text = textIcon.Text,\r\n                        FontFamily = textIcon.FontFamily,\r\n                        FontStyle = textIcon.FontStyle\r\n                    };\r\n\r\n                    if (textIcon.ReadLocalValue(TextBlock.ForegroundProperty) != DependencyProperty.UnsetValue)\r\n                    {\r\n                        text.Foreground = textIcon.Foreground;\r\n                    }\r\n\r\n                    return text;\r\n                }\r\n            }\r\n            else if (System.IO.File.Exists(iconName))\r\n            {\r\n                return BitmapExtensions.BitmapFromFile(iconName)?.ToImage();\r\n            }\r\n            else\r\n            {\r\n                var themeFile = ThemeFile.GetFilePath(iconName);\r\n                if (themeFile != null)\r\n                {\r\n                    return Images.GetImageFromFile(themeFile, BitmapScalingMode.Fant, imageHeight, imageWidth);\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static MenuItem GenerateMenuParents(Dictionary<string, MenuItem> existingItems, string menuSection, ItemCollection root, int startIndex = -1)\r\n        {\r\n            var sections = menuSection.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(a => a.Trim()).ToArray();\r\n            var current = \"\";\r\n            MenuItem prev = null;\r\n            for (int i = 0; i < sections.Length; i++)\r\n            {\r\n                var sec = sections[i];\r\n                current += sec;\r\n                if (existingItems.TryGetValue(current, out var menuItem))\r\n                {\r\n                }\r\n                else\r\n                {\r\n                    menuItem = new MenuItem { Header = sec };\r\n                    existingItems.Add(current, menuItem);\r\n                    if (i == 0)\r\n                    {\r\n                        if (startIndex >= 0)\r\n                        {\r\n                            root.Insert(startIndex, menuItem);\r\n                        }\r\n                        else\r\n                        {\r\n                            root.Add(menuItem);\r\n                        }\r\n                    }\r\n\r\n                    if (prev != null)\r\n                    {\r\n                        prev.Items.Add(menuItem);\r\n                    }\r\n                }\r\n\r\n                prev = menuItem;\r\n                if (i == sections.Length - 1)\r\n                {\r\n                    return menuItem;\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public static void SetEnumBinding(\r\n            MenuItem target,\r\n            string bindingPath,\r\n            object bindingSource,\r\n            object bindingEnum)\r\n        {\r\n            BindingOperations.SetBinding(target, MenuItem.IsCheckedProperty,\r\n                new Binding\r\n                {\r\n                    Source = bindingSource,\r\n                    Path = new PropertyPath(bindingPath),\r\n                    Converter = new EnumToBooleanConverter(),\r\n                    ConverterParameter = bindingEnum\r\n                });\r\n        }\r\n\r\n        public static void PopulateEnumOptions<T>(\r\n            ItemCollection parent,\r\n            string bindingPath,\r\n            object bindingSource,\r\n            bool sorted = false,\r\n            List<T> ignoreValues = null) where T : Enum\r\n        {\r\n            var values = Enum.GetValues(typeof(T)).Cast<T>();\r\n            if (sorted)\r\n            {\r\n                values = values.OrderBy(a => a.GetDescription());\r\n            }\r\n\r\n            foreach (T value in values)\r\n            {\r\n                if (ignoreValues?.Contains(value) == true)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                var headerText = value.GetDescription();\r\n                if (value is Dock dock)\r\n                {\r\n                    headerText = DockToStringConverter.GetString(dock);\r\n                }\r\n\r\n                var item = new MenuItem\r\n                {\r\n                    Header = headerText,\r\n                    IsCheckable = true\r\n                };\r\n\r\n                SetEnumBinding(item, bindingPath, bindingSource, value);\r\n                parent.Add(item);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/MenuItems.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class MenuItems\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        private static object startIcon;\r\n        private static object removeIcon;\r\n        private static object linksIcon;\r\n        private static object favoriteIcon;\r\n        private static object unFavoriteIcon;\r\n        private static object hideIcon;\r\n        private static object unHideIcon;\r\n        private static object browseIcon;\r\n        private static object shortcutIcon;\r\n        private static object installIcon;\r\n        private static object editIcon;\r\n        private static object manualIcon;\r\n        private static bool iconsCached = false;\r\n\r\n        private static void CacheIcons()\r\n        {\r\n            if (!iconsCached)\r\n            {\r\n                PlayniteApplication.CurrentNative.Dispatcher.Invoke(() =>\r\n                {\r\n                    startIcon = MenuHelpers.GetIcon(\"PlayIcon\");\r\n                    removeIcon = MenuHelpers.GetIcon(\"RemoveGameIcon\");\r\n                    linksIcon = MenuHelpers.GetIcon(\"LinksIcon\");\r\n                    favoriteIcon = MenuHelpers.GetIcon(\"AddFavoritesIcon\");\r\n                    unFavoriteIcon = MenuHelpers.GetIcon(\"RemoveFavoritesIcon\");\r\n                    hideIcon = MenuHelpers.GetIcon(\"HideIcon\");\r\n                    unHideIcon = MenuHelpers.GetIcon(\"UnHideIcon\");\r\n                    browseIcon = MenuHelpers.GetIcon(\"OpenFolderIcon\");\r\n                    shortcutIcon = MenuHelpers.GetIcon(\"DesktopShortcutIcon\");\r\n                    installIcon = MenuHelpers.GetIcon(\"InstallIcon\");\r\n                    editIcon = MenuHelpers.GetIcon(\"EditGameIcon\");\r\n                    manualIcon = MenuHelpers.GetIcon(\"ManualIcon\");\r\n                    iconsCached = true;\r\n                });\r\n            }\r\n        }\r\n\r\n        public static List<SearchItem> GetGlobalPluginCommands(MainViewModelBase model)\r\n        {\r\n            var items = new List<SearchItem>();\r\n            var args = new GetMainMenuItemsArgs()\r\n            {\r\n                IsGlobalSearchRequest = true\r\n            };\r\n\r\n            foreach (var plugin in model.Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    var plugItems = plugin.Plugin.GetSearchGlobalCommands()?.ToList();\r\n                    if (plugItems.HasItems())\r\n                    {\r\n                        items.AddRange(plugItems);\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get menu items from plugin {plugin.Description.Name}\");\r\n                }\r\n            }\r\n\r\n            return items;\r\n        }\r\n\r\n        public static List<SearchItem> GetSearchExtensionsMainMenuItem(MainViewModelBase model)\r\n        {\r\n            var items = new List<SearchItem>();\r\n            var args = new GetMainMenuItemsArgs()\r\n            {\r\n                IsGlobalSearchRequest = true\r\n            };\r\n\r\n            foreach (var plugin in model.Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    var plugItems = plugin.Plugin.GetMainMenuItems(args);\r\n                    foreach (var item in plugItems ?? new List<MainMenuItem>())\r\n                    {\r\n                        if (item.Description == \"-\")\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        item.MenuSection = item.MenuSection?.TrimStart('@');\r\n                        var description = item.MenuSection.IsNullOrEmpty() ? item.Description : $\"{item.MenuSection.Replace(\"|\", \" > \")} > {item.Description}\";\r\n                        items.Add(new SearchItem(description, LOC.Activate, () => item.Action(new MainMenuItemActionArgs\r\n                        {\r\n                            SourceItem = item\r\n                        }), item.Icon));\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get menu items from plugin {plugin.Description.Name}\");\r\n                }\r\n            }\r\n\r\n            foreach (var script in model.Extensions.Scripts)\r\n            {\r\n                if (script.SupportedMenus.Contains(Scripting.SupportedMenuMethods.MainMenu))\r\n                {\r\n                    try\r\n                    {\r\n                        var plugItems = script.GetMainMenuItems(args);\r\n                        foreach (var item in plugItems ?? new List<ScriptMainMenuItem>())\r\n                        {\r\n                            if (item.Description == \"-\")\r\n                            {\r\n                                continue;\r\n                            }\r\n\r\n                            item.MenuSection = item.MenuSection?.TrimStart('@');\r\n                            var newItem = MainMenuItem.FromScriptMainMenuItem(item);\r\n                            newItem.Action = (a) =>\r\n                            {\r\n                                script.InvokeFunction(item.FunctionName, new List<object>\r\n                                {\r\n                                    new ScriptMainMenuItemActionArgs()\r\n                                });\r\n                            };\r\n\r\n                            var description = item.MenuSection.IsNullOrEmpty() ? item.Description : $\"{item.MenuSection.Replace(\"|\", \" > \")} > {item.Description}\";\r\n                            items.Add(new SearchItem(description, LOC.Activate, () =>\r\n                            {\r\n                                script.InvokeFunction(item.FunctionName, new List<object>\r\n                                {\r\n                                    new ScriptMainMenuItemActionArgs\r\n                                    {\r\n                                        SourceItem = item\r\n                                    }\r\n                                });\r\n                            }, item.Icon));\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to get menu items from script {script.Name}\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            return items;\r\n        }\r\n\r\n        public static List<SearchItem> GetSearchGameMenuItems(Game game, MainViewModelBase model)\r\n        {\r\n            CacheIcons();\r\n            var items = new List<SearchItem>();\r\n\r\n            // Play/Install\r\n            if (game.IsInstalled)\r\n            {\r\n                items.Add(new SearchItem(LOC.PlayGame, LOC.Activate, () => model.StartGame(game, true), startIcon));\r\n            }\r\n            else if (!game.IsCustomGame)\r\n            {\r\n                items.Add(new SearchItem(LOC.InstallGame, LOC.Activate, () => model.InstallGame(game), installIcon));\r\n            }\r\n\r\n            // Custom Actions\r\n            foreach (var task in game.GameActions?.Where(a => !a.IsPlayAction) ?? Enumerable.Empty<GameAction>())\r\n            {\r\n                items.Add(new SearchItem(task.Name, LOC.Activate, () => model.App.GamesEditor.ActivateAction(game, task)));\r\n            }\r\n\r\n            // Links\r\n            if (game.Links.HasItems())\r\n            {\r\n                var links = new List<SearchItem>();\r\n                foreach (var link in game.Links.Where(a => a != null))\r\n                {\r\n                    links.Add(new SearchItem(link.Name, LOC.Activate, () =>\r\n                    {\r\n                        try\r\n                        {\r\n                            GlobalCommands.NavigateUrl(game.ExpandVariables(link.Url));\r\n                        }\r\n                        catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            logger.Error(e, \"Failed to open url.\");\r\n                        }\r\n                    })\r\n                    {\r\n                        Description = link.Url\r\n                    });\r\n                }\r\n\r\n                items.Add(new SearchItem(LOC.LinksLabel, new ContextSwitchSearchItemAction(LOC.Activate, new GenericListSearchContext(links, LOC.LinksLabel)), linksIcon));\r\n            }\r\n\r\n            // Open Game Location\r\n            if (game.IsInstalled)\r\n            {\r\n                items.Add(new SearchItem(LOC.OpenGameLocation, LOC.Activate, () => model.App.GamesEditor.OpenGameLocation(game), browseIcon));\r\n            }\r\n\r\n            // Create Desktop Shortcut\r\n            items.Add(new SearchItem(LOC.CreateDesktopShortcut, LOC.Activate, () => model.App.GamesEditor.CreateDesktopShortcut(game), shortcutIcon));\r\n\r\n            // Manual\r\n            if (!game.Manual.IsNullOrEmpty())\r\n            {\r\n                items.Add(new SearchItem(LOC.OpenGameManual, LOC.Activate, () => model.App.GamesEditor.OpenManual(game), manualIcon));\r\n            }\r\n\r\n            // Toggle Favorites\r\n            items.Add(new SearchItem(\r\n                game.Favorite ? LOC.RemoveFavoriteGame : LOC.FavoriteGame,\r\n                LOC.Activate,\r\n                () => model.App.GamesEditor.ToggleFavoriteGame(game))\r\n                { Icon = game.Favorite ? unFavoriteIcon : favoriteIcon });\r\n\r\n            // Toggle Hide\r\n            items.Add(new SearchItem(\r\n                game.Hidden ? LOC.UnHideGame : LOC.HideGame,\r\n                LOC.Activate,\r\n                () => model.App.GamesEditor.ToggleHideGame(game))\r\n                { Icon = game.Hidden ? unHideIcon : hideIcon });\r\n\r\n            // Edit\r\n            items.Add(new SearchItem(LOC.EditGame, LOC.Activate, () => model.EditGame(game), editIcon));\r\n\r\n            // Set Category\r\n            items.Add(new SearchItem(LOC.SetGameCategory, LOC.Activate, () => model.AssignCategories(game)));\r\n\r\n            // Set Completion Status\r\n            var complStats = new List<SearchItem>();\r\n            foreach (var status in model.Database.CompletionStatuses)\r\n            {\r\n                complStats.Add(new SearchItem(status.Name, LOC.Assign, () => model.App.GamesEditor.SetCompletionStatus(game, status)));\r\n            }\r\n\r\n            if (complStats.HasItems())\r\n            {\r\n                items.Add(new SearchItem(LOC.SetCompletionStatus, new ContextSwitchSearchItemAction(LOC.Activate, new GenericListSearchContext(complStats, LOC.CompletionStatus))));\r\n            }\r\n\r\n            // Extensions items\r\n            var args = new GetGameMenuItemsArgs()\r\n            {\r\n                Games = new List<Game>(1) { game },\r\n                IsGlobalSearchRequest = true\r\n            };\r\n\r\n            foreach (var plugin in model.Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    var plugItems = plugin.Plugin.GetGameMenuItems(args);\r\n                    foreach (var item in plugItems ?? new List<GameMenuItem>())\r\n                    {\r\n                        if (item.Description == \"-\")\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        var description = item.MenuSection.IsNullOrEmpty() ? item.Description : $\"{item.MenuSection.Replace(\"|\", \" > \")} > {item.Description}\";\r\n                        items.Add(new SearchItem(description, LOC.Activate, () => item.Action(new GameMenuItemActionArgs\r\n                        {\r\n                            Games = args.Games,\r\n                            SourceItem = item\r\n                        }), item.Icon));\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get menu items from plugin {plugin.Description.Name}\");\r\n                }\r\n            }\r\n\r\n            foreach (var script in model.Extensions.Scripts)\r\n            {\r\n                if (script.SupportedMenus.Contains(Scripting.SupportedMenuMethods.GameMenu))\r\n                {\r\n                    try\r\n                    {\r\n                        var plugItems = script.GetGameMenuItems(args);\r\n                        foreach (var item in plugItems ?? new List<ScriptGameMenuItem>())\r\n                        {\r\n                            if (item.Description == \"-\")\r\n                            {\r\n                                continue;\r\n                            }\r\n\r\n                            var description = item.MenuSection.IsNullOrEmpty() ? item.Description : $\"{item.MenuSection.Replace(\"|\", \" > \")} > {item.Description}\";\r\n                            items.Add(new SearchItem(description, LOC.Activate, () =>\r\n                            {\r\n                                script.InvokeFunction(item.FunctionName, new List<object>\r\n                                {\r\n                                    new ScriptGameMenuItemActionArgs\r\n                                    {\r\n                                        Games = args.Games,\r\n                                        SourceItem = item\r\n                                    }\r\n                                });\r\n                            }, item.Icon));\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to get menu items from script {script.Name}\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Remove\r\n            items.Add(new SearchItem(LOC.RemoveGame, LOC.Activate, () => model.App.GamesEditor.RemoveGame(game), removeIcon));\r\n\r\n            // Uninstall\r\n            if (!game.IsCustomGame && game.IsInstalled)\r\n            {\r\n                items.Add(new SearchItem(LOC.UninstallGame, LOC.Activate, () => model.App.GamesEditor.UnInstallGame(game)));\r\n            }\r\n\r\n            return items;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Metadata/MetadataDownloader.cs",
    "content": "﻿using Playnite.Database;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing System.Collections.Concurrent;\r\n\r\nnamespace Playnite.Metadata\r\n{\r\n    public class MetadataDownloader : IDisposable\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        private IGameDatabaseMain database;\r\n        private readonly List<MetadataPlugin> metadataDownloaders;\r\n        private Dictionary<Guid, LibraryMetadataProvider> libraryDownloaders = new Dictionary<Guid, LibraryMetadataProvider>();\r\n\r\n        public MetadataDownloader(IGameDatabaseMain database, List<MetadataPlugin> metadataDownloaders, List<LibraryPlugin> libraryPlugins)\r\n        {\r\n            this.database = database;\r\n            this.metadataDownloaders = metadataDownloaders;\r\n            foreach (var plugin in libraryPlugins)\r\n            {\r\n                LibraryMetadataProvider downloader = null;\r\n                try\r\n                {\r\n                    downloader = plugin.GetMetadataDownloader();\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get metadata downloader from {plugin.Name} library plugin.\");\r\n                }\r\n\r\n                libraryDownloaders.Add(plugin.Id, downloader);\r\n            }\r\n        }\r\n\r\n        public MetadataDownloader(IGameDatabaseMain database, List<MetadataPlugin> metadataDownloaders, Dictionary<Guid, LibraryMetadataProvider> libraryDownloaders)\r\n        {\r\n            this.database = database;\r\n            this.metadataDownloaders = metadataDownloaders;\r\n            this.libraryDownloaders = libraryDownloaders;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            foreach (var downloader in libraryDownloaders.Values)\r\n            {\r\n                // Null check because downloader might be from library without official metadata provider\r\n                downloader?.Dispose();\r\n            }\r\n        }\r\n\r\n        private LibraryMetadataProvider GetLibraryMetadataDownloader(Guid pluginId)\r\n        {\r\n            if (libraryDownloaders.ContainsKey(pluginId))\r\n            {\r\n                return libraryDownloaders[pluginId];\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        private GameMetadata ProcessStoreDownload(Game game)\r\n        {\r\n            var downloader = GetLibraryMetadataDownloader(game.PluginId);\r\n            try\r\n            {\r\n                return downloader?.GetMetadata(game);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to download metadat from library plugin downloader {game.PluginId}.\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        internal bool FieldHasValidData(MetadataField field, GameMetadata metadata)\r\n        {\r\n            if (metadata == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            switch (field)\r\n            {\r\n                case MetadataField.Name:\r\n                    return !metadata.Name.IsNullOrWhiteSpace();\r\n                case MetadataField.Genres:\r\n                    return metadata.Genres.HasItems();\r\n                case MetadataField.ReleaseDate:\r\n                    return metadata.ReleaseDate != null;\r\n                case MetadataField.Developers:\r\n                    return metadata.Developers.HasItems();\r\n                case MetadataField.Publishers:\r\n                    return metadata.Publishers.HasItems();\r\n                case MetadataField.Tags:\r\n                    return metadata.Tags.HasItems();\r\n                case MetadataField.Description:\r\n                    return !metadata.Description.IsNullOrWhiteSpace();\r\n                case MetadataField.Links:\r\n                    return metadata.Links.HasItems();\r\n                case MetadataField.CriticScore:\r\n                    return metadata.CriticScore != null;\r\n                case MetadataField.CommunityScore:\r\n                    return metadata.CommunityScore != null;\r\n                case MetadataField.Icon:\r\n                    return metadata.Icon != null;\r\n                case MetadataField.CoverImage:\r\n                    return metadata.CoverImage != null;\r\n                case MetadataField.BackgroundImage:\r\n                    return metadata.BackgroundImage != null;\r\n                case MetadataField.Features:\r\n                    return metadata.Features.HasItems();\r\n                case MetadataField.AgeRating:\r\n                    return metadata.AgeRatings.HasItems();\r\n                case MetadataField.Series:\r\n                    return metadata.Series.HasItems();\r\n                case MetadataField.Region:\r\n                    return metadata.Regions.HasItems();\r\n                case MetadataField.Platform:\r\n                    return metadata.Platforms.HasItems();\r\n                case MetadataField.InstallSize:\r\n                    return metadata.InstallSize != null;\r\n                default:\r\n                    throw new NotSupportedException($\"Uknown metadata field {field}\");\r\n            }\r\n        }\r\n\r\n        internal GameMetadata ProcessField(\r\n            Game game,\r\n            MetadataFieldSettings fieldSettings,\r\n            MetadataField gameField,\r\n            Dictionary<Guid, GameMetadata> existingStoreData,\r\n            Dictionary<Guid, OnDemandMetadataProvider> existingPluginData,\r\n            CancellationToken cancelToken)\r\n        {\r\n            if (fieldSettings.Sources.Any() == false)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            var getFieldArgs = new GetMetadataFieldArgs { CancelToken = cancelToken };\r\n            foreach (var source in fieldSettings.Sources)\r\n            {\r\n                if (cancelToken.IsCancellationRequested)\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                try\r\n                {\r\n                    // Skip Store source for manually added games.\r\n                    if (source == Guid.Empty && game.PluginId == Guid.Empty)\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    // Check if metadata from this source are already downloaded.\r\n                    if (existingStoreData.ContainsKey(source))\r\n                    {\r\n                        if (FieldHasValidData(gameField, existingStoreData[source]))\r\n                        {\r\n                            return existingStoreData[source];\r\n                        }\r\n                        else\r\n                        {\r\n                            continue;\r\n                        }\r\n                    }\r\n\r\n                    // Check if downloader supports this game field.\r\n                    if (source != Guid.Empty)\r\n                    {\r\n                        var downloader = metadataDownloaders.FirstOrDefault(a => a.Id == source);\r\n                        if (downloader == null)\r\n                        {\r\n                            continue;\r\n                        }\r\n                        else if (downloader.SupportedFields?.Contains(gameField) != true)\r\n                        {\r\n                            continue;\r\n                        }\r\n                    }\r\n\r\n                    // Download metadata.\r\n                    GameMetadata metadata = null;\r\n                    if (source == Guid.Empty)\r\n                    {\r\n                        metadata = ProcessStoreDownload(game);\r\n                        existingStoreData.Add(source, metadata);\r\n                    }\r\n                    else\r\n                    {\r\n                        var downloader = metadataDownloaders.FirstOrDefault(a => a.Id == source);\r\n                        if (downloader == null)\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        OnDemandMetadataProvider provider = null;\r\n                        if (existingPluginData.ContainsKey(source))\r\n                        {\r\n                            provider = existingPluginData[source];\r\n                        }\r\n                        else\r\n                        {\r\n                            provider = downloader.GetMetadataProvider(new MetadataRequestOptions(game, true));\r\n                            existingPluginData.Add(source, provider);\r\n                        }\r\n\r\n                        if (provider == null)\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        if (!provider.AvailableFields.Contains(gameField))\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        metadata = new GameMetadata();\r\n                        switch (gameField)\r\n                        {\r\n                            case MetadataField.Name:\r\n                                metadata.Name = provider.GetName(getFieldArgs);\r\n                                break;\r\n                            case MetadataField.Genres:\r\n                                metadata.Genres = provider.GetGenres(getFieldArgs)?.Where(a => a != null).ToHashSet();\r\n                                break;\r\n                            case MetadataField.ReleaseDate:\r\n                                metadata.ReleaseDate = provider.GetReleaseDate(getFieldArgs);\r\n                                break;\r\n                            case MetadataField.Developers:\r\n                                metadata.Developers = provider.GetDevelopers(getFieldArgs)?.Where(a => a != null).ToHashSet();\r\n                                break;\r\n                            case MetadataField.Publishers:\r\n                                metadata.Publishers = provider.GetPublishers(getFieldArgs)?.Where(a => a != null).ToHashSet();\r\n                                break;\r\n                            case MetadataField.Tags:\r\n                                metadata.Tags = provider.GetTags(getFieldArgs)?.Where(a => a != null).ToHashSet();\r\n                                break;\r\n                            case MetadataField.Description:\r\n                                metadata.Description = provider.GetDescription(getFieldArgs);\r\n                                break;\r\n                            case MetadataField.Links:\r\n                                metadata.Links = provider.GetLinks(getFieldArgs)?.Where(a => a != null).ToList();\r\n                                break;\r\n                            case MetadataField.CriticScore:\r\n                                metadata.CriticScore = provider.GetCriticScore(getFieldArgs);\r\n                                break;\r\n                            case MetadataField.CommunityScore:\r\n                                metadata.CommunityScore = provider.GetCommunityScore(getFieldArgs);\r\n                                break;\r\n                            case MetadataField.Icon:\r\n                                metadata.Icon = provider.GetIcon(getFieldArgs);\r\n                                break;\r\n                            case MetadataField.CoverImage:\r\n                                metadata.CoverImage = provider.GetCoverImage(getFieldArgs);\r\n                                break;\r\n                            case MetadataField.BackgroundImage:\r\n                                metadata.BackgroundImage = provider.GetBackgroundImage(getFieldArgs);\r\n                                break;\r\n                            case MetadataField.Features:\r\n                                metadata.Features = provider.GetFeatures(getFieldArgs)?.Where(a => a != null).ToHashSet();\r\n                                break;\r\n                            case MetadataField.AgeRating:\r\n                                metadata.AgeRatings = provider.GetAgeRatings(getFieldArgs)?.Where(a => a != null).ToHashSet();\r\n                                break;\r\n                            case MetadataField.Region:\r\n                                metadata.Regions = provider.GetRegions(getFieldArgs)?.Where(a => a != null).ToHashSet();\r\n                                break;\r\n                            case MetadataField.Series:\r\n                                metadata.Series = provider.GetSeries(getFieldArgs)?.Where(a => a != null).ToHashSet();\r\n                                break;\r\n                            case MetadataField.Platform:\r\n                                metadata.Platforms = provider.GetPlatforms(getFieldArgs)?.Where(a => a != null).ToHashSet();\r\n                                break;\r\n                            case MetadataField.InstallSize:\r\n                                metadata.InstallSize = provider.GetInstallSize(getFieldArgs);\r\n                                break;\r\n                            default:\r\n                                throw new NotImplementedException();\r\n                        }\r\n                    }\r\n\r\n                    if (metadata != null && FieldHasValidData(gameField, metadata))\r\n                    {\r\n                        return metadata;\r\n                    }\r\n                    else\r\n                    {\r\n                        continue;\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to process metadata download: {gameField}, {source}\");\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public Task DownloadMetadataAsync(\r\n            List<Game> games,\r\n            MetadataDownloaderSettings settings,\r\n            PlayniteSettings playniteSettings,\r\n            Action<Game, int, int> progressCallback,\r\n            CancellationToken cancelToken)\r\n        {\r\n            return Task.Run(() =>\r\n            {\r\n                if (games == null || games.Count == 0)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                for (int i = 0; i < games.Count; i++)\r\n                {\r\n                    Game game = null;\r\n                    var existingStoreData = new Dictionary<Guid, GameMetadata>();\r\n                    var existingPluginData = new Dictionary<Guid, OnDemandMetadataProvider>();\r\n\r\n                    try\r\n                    {\r\n                        if (cancelToken.IsCancellationRequested == true)\r\n                        {\r\n                            return;\r\n                        }\r\n\r\n                        GameMetadata gameData = null;\r\n\r\n                        // We need to get new instance from DB in case game got edited or deleted.\r\n                        // We don't want to block game editing while metadata is downloading for other games.\r\n                        game = database.Games[games[i].Id]?.GetClone();\r\n                        if (game == null)\r\n                        {\r\n                            logger.Warn($\"Game {game.Id} no longer in DB, skipping metadata download.\");\r\n                            progressCallback?.Invoke(null, i, games.Count);\r\n                            continue;\r\n                        }\r\n\r\n                        var dataModified = false;\r\n                        game.PropertyChanged += (_, __) => dataModified = true;\r\n\r\n                        if (game != null)\r\n                        {\r\n                            progressCallback?.Invoke(game, i, games.Count);\r\n                        }\r\n\r\n                        logger.Debug($\"Downloading metadata for {game.Name}, {game.GameId}, {game.PluginId}\");\r\n\r\n                        // Name\r\n                        if (settings.Name.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && string.IsNullOrEmpty(game.Name)))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Name, MetadataField.Name, existingStoreData, existingPluginData, cancelToken);\r\n                                if (!string.IsNullOrEmpty(gameData?.Name))\r\n                                {\r\n                                    game.Name = StringExtensions.RemoveTrademarks(gameData.Name);\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Genre\r\n                        if (settings.Genre.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && !game.GenreIds.HasItems()))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Genre, MetadataField.Genres, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.Genres.HasItems() == true)\r\n                                {\r\n                                    game.GenreIds = database.Genres.Add(gameData.Genres).Select(a => a.Id).ToList();\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Release Date\r\n                        if (settings.ReleaseDate.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && game.ReleaseDate == null))\r\n                            {\r\n                                gameData = ProcessField(game, settings.ReleaseDate, MetadataField.ReleaseDate, existingStoreData, existingPluginData, cancelToken);\r\n                                game.ReleaseDate = gameData?.ReleaseDate ?? game.ReleaseDate;\r\n                            }\r\n                        }\r\n\r\n                        // Developer\r\n                        if (settings.Developer.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && !game.DeveloperIds.HasItems()))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Developer, MetadataField.Developers, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.Developers.HasItems() == true)\r\n                                {\r\n                                    game.DeveloperIds = database.Companies.Add(gameData.Developers).Select(a => a.Id).ToList();\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Publisher\r\n                        if (settings.Publisher.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && !game.PublisherIds.HasItems()))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Publisher, MetadataField.Publishers, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.Publishers.HasItems() == true)\r\n                                {\r\n                                    game.PublisherIds = database.Companies.Add(gameData.Publishers).Select(a => a.Id).ToList();\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Tags\r\n                        if (settings.Tag.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && !game.TagIds.HasItems()))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Tag, MetadataField.Tags, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.Tags.HasItems() == true)\r\n                                {\r\n                                    game.TagIds = database.Tags.Add(gameData.Tags).Select(a => a.Id).ToList();\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Features\r\n                        if (settings.Feature.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && !game.FeatureIds.HasItems()))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Feature, MetadataField.Features, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.Features.HasItems() == true)\r\n                                {\r\n                                    game.FeatureIds = database.Features.Add(gameData.Features).Select(a => a.Id).ToList();\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Description\r\n                        if (settings.Description.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && string.IsNullOrEmpty(game.Description)))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Description, MetadataField.Description, existingStoreData, existingPluginData, cancelToken);\r\n                                game.Description = string.IsNullOrEmpty(gameData?.Description) == true ? game.Description : gameData.Description;\r\n                            }\r\n                        }\r\n\r\n                        // Links\r\n                        if (settings.Links.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && !game.Links.HasItems()))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Links, MetadataField.Links, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.Links.HasItems() == true)\r\n                                {\r\n                                    game.Links = gameData.Links.ToObservable();\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Age rating\r\n                        if (settings.AgeRating.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && !game.AgeRatingIds.HasItems()))\r\n                            {\r\n                                gameData = ProcessField(game, settings.AgeRating, MetadataField.AgeRating, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.AgeRatings.HasItems() == true)\r\n                                {\r\n                                    game.AgeRatingIds = database.AgeRatings.Add(gameData.AgeRatings).Select(a => a.Id).ToList();\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Region\r\n                        if (settings.Region.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && !game.RegionIds.HasItems()))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Region, MetadataField.Region, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.Regions.HasItems() == true)\r\n                                {\r\n                                    game.RegionIds = database.Regions.Add(gameData.Regions).Select(a => a.Id).ToList();\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Series\r\n                        if (settings.Series.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && !game.SeriesIds.HasItems()))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Series, MetadataField.Series, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.Series.HasItems() == true)\r\n                                {\r\n                                    game.SeriesIds = database.Series.Add(gameData.Series).Select(a => a.Id).ToList();\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Platform\r\n                        if (settings.Platform.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && !game.PlatformIds.HasItems()))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Platform, MetadataField.Platform, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.Platforms.HasItems() == true)\r\n                                {\r\n                                    game.PlatformIds = database.Platforms.Add(gameData.Platforms).Select(a => a.Id).ToList();\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Critic Score\r\n                        if (settings.CriticScore.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && game.CriticScore == null))\r\n                            {\r\n                                gameData = ProcessField(game, settings.CriticScore, MetadataField.CriticScore, existingStoreData, existingPluginData, cancelToken);\r\n                                game.CriticScore = gameData?.CriticScore == null ? game.CriticScore : gameData.CriticScore;\r\n                            }\r\n                        }\r\n\r\n                        // Community Score\r\n                        if (settings.CommunityScore.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && game.CommunityScore == null))\r\n                            {\r\n                                gameData = ProcessField(game, settings.CommunityScore, MetadataField.CommunityScore, existingStoreData, existingPluginData, cancelToken);\r\n                                game.CommunityScore = gameData?.CommunityScore == null ? game.CommunityScore : gameData.CommunityScore;\r\n                            }\r\n                        }\r\n\r\n                        // BackgroundImage\r\n                        if (settings.BackgroundImage.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && string.IsNullOrEmpty(game.BackgroundImage)))\r\n                            {\r\n                                gameData = ProcessField(game, settings.BackgroundImage, MetadataField.BackgroundImage, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.BackgroundImage != null)\r\n                                {\r\n                                    if (playniteSettings.DownloadBackgroundsImmediately && gameData.BackgroundImage.HasImageData)\r\n                                    {\r\n                                        game.BackgroundImage = database.AddFile(gameData.BackgroundImage, game.Id, true, cancelToken);\r\n                                    }\r\n                                    else if (!playniteSettings.DownloadBackgroundsImmediately &&\r\n                                             !gameData.BackgroundImage.Path.IsNullOrEmpty())\r\n                                    {\r\n                                        game.BackgroundImage = gameData.BackgroundImage.Path;\r\n                                    }\r\n                                    else if (gameData.BackgroundImage.HasImageData)\r\n                                    {\r\n                                        game.BackgroundImage = database.AddFile(gameData.BackgroundImage, game.Id, true, cancelToken);\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Cover\r\n                        if (settings.CoverImage.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && string.IsNullOrEmpty(game.CoverImage)))\r\n                            {\r\n                                gameData = ProcessField(game, settings.CoverImage, MetadataField.CoverImage, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.CoverImage != null)\r\n                                {\r\n                                    game.CoverImage = database.AddFile(gameData.CoverImage, game.Id, true, cancelToken);\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Icon\r\n                        if (settings.Icon.Import)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && string.IsNullOrEmpty(game.Icon)))\r\n                            {\r\n                                gameData = ProcessField(game, settings.Icon, MetadataField.Icon, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.Icon != null)\r\n                                {\r\n                                    game.Icon = database.AddFile(gameData.Icon, game.Id, true, cancelToken);\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // InstallSize\r\n                        // Installed games with assigned value are skipped since their scanned size\r\n                        // using local files will be more accurate than the ones provided via metadata\r\n                        var isInstalledAndHasValue = game.IsInstalled && game.InstallSize != null;\r\n                        if (settings.InstallSize.Import && !isInstalledAndHasValue)\r\n                        {\r\n                            if (!settings.SkipExistingValues || (settings.SkipExistingValues && game.InstallSize == null))\r\n                            {\r\n                                gameData = ProcessField(game, settings.InstallSize, MetadataField.InstallSize, existingStoreData, existingPluginData, cancelToken);\r\n                                if (gameData?.InstallSize != null)\r\n                                {\r\n                                    game.InstallSize = gameData.InstallSize;\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        // Just to be sure check if somebody didn't remove game while downloading data\r\n                        if (database.Games.FirstOrDefault(a => a.Id == games[i].Id) != null && dataModified)\r\n                        {\r\n                            game.Modified = DateTime.Now;\r\n                            database.Games.Update(game);\r\n                        }\r\n                        else\r\n                        {\r\n                            logger.Warn($\"Game {game.Id} no longer in DB, skipping metadata update in DB.\");\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to download metadata for game {game?.Name}, {game?.Id}\");\r\n                    }\r\n                    finally\r\n                    {\r\n                        foreach (var plugin in existingPluginData.Values)\r\n                        {\r\n                            // This will be null in case a plugin provider says it can provide metadata for a field,\r\n                            // but then actually doesn't return any metadata provider implementation.\r\n                            plugin?.Dispose();\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Metadata/MetadataDownloaderSettings.cs",
    "content": "﻿using Newtonsoft.Json;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Concurrent;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Metadata\r\n{\r\n    public enum MetadataGamesSource\r\n    {\r\n        AllFromDB,\r\n        Selected,\r\n        Filtered\r\n    }\r\n\r\n    public class MetadataFieldSettings : ObservableObject\r\n    {\r\n        private bool import = true;\r\n        public bool Import\r\n        {\r\n            get => import;\r\n            set\r\n            {\r\n                import = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> sources = new List<Guid>();\r\n        public List<Guid> Sources\r\n        {\r\n            get => sources;\r\n            set\r\n            {\r\n                sources = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public MetadataFieldSettings()\r\n        {\r\n        }\r\n\r\n        public MetadataFieldSettings(bool import, List<Guid> sources)\r\n        {\r\n            Import = import;\r\n            if (sources.HasItems())\r\n            {\r\n                Sources = sources.ToList();\r\n            }\r\n        }\r\n    }\r\n\r\n    public class MetadataDownloaderSettings : ObservableObject\r\n    {\r\n        private MetadataGamesSource gamesSource = MetadataGamesSource.AllFromDB;\r\n        [JsonIgnore]\r\n        public MetadataGamesSource GamesSource\r\n        {\r\n            get\r\n            {\r\n                return gamesSource;\r\n            }\r\n\r\n            set\r\n            {\r\n                gamesSource = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool skipExistingValues = true;\r\n        [JsonIgnore]\r\n        public bool SkipExistingValues\r\n        {\r\n            get\r\n            {\r\n                return skipExistingValues;\r\n            }\r\n\r\n            set\r\n            {\r\n                skipExistingValues = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings name = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Name\r\n        {\r\n            get => name;\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings genre = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Genre\r\n        {\r\n            get => genre;\r\n            set\r\n            {\r\n                genre = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings releaseDate = new MetadataFieldSettings();\r\n        public MetadataFieldSettings ReleaseDate\r\n        {\r\n            get => releaseDate;\r\n            set\r\n            {\r\n                releaseDate = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings developer = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Developer\r\n        {\r\n            get => developer;\r\n            set\r\n            {\r\n                developer = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings publisher = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Publisher\r\n        {\r\n            get => publisher;\r\n            set\r\n            {\r\n                publisher = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings tag = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Tag\r\n        {\r\n            get => tag;\r\n            set\r\n            {\r\n                tag = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings feature = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Feature\r\n        {\r\n            get => feature;\r\n            set\r\n            {\r\n                feature = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings description = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Description\r\n        {\r\n            get => description;\r\n            set\r\n            {\r\n                description = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings coverImage = new MetadataFieldSettings();\r\n        public MetadataFieldSettings CoverImage\r\n        {\r\n            get => coverImage;\r\n            set\r\n            {\r\n                coverImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings backgroundImage = new MetadataFieldSettings();\r\n        public MetadataFieldSettings BackgroundImage\r\n        {\r\n            get => backgroundImage;\r\n            set\r\n            {\r\n                backgroundImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings icon = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Icon\r\n        {\r\n            get => icon;\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings links = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Links\r\n        {\r\n            get => links;\r\n            set\r\n            {\r\n                links = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings criticScore = new MetadataFieldSettings();\r\n        public MetadataFieldSettings CriticScore\r\n        {\r\n            get => criticScore;\r\n            set\r\n            {\r\n                criticScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings communityScore = new MetadataFieldSettings();\r\n        public MetadataFieldSettings CommunityScore\r\n        {\r\n            get => communityScore;\r\n            set\r\n            {\r\n                communityScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings ageRating = new MetadataFieldSettings();\r\n        public MetadataFieldSettings AgeRating\r\n        {\r\n            get => ageRating;\r\n            set\r\n            {\r\n                ageRating = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings series = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Series\r\n        {\r\n            get => series;\r\n            set\r\n            {\r\n                series = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings region = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Region\r\n        {\r\n            get => region;\r\n            set\r\n            {\r\n                region = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings platform = new MetadataFieldSettings();\r\n        public MetadataFieldSettings Platform\r\n        {\r\n            get => platform;\r\n            set\r\n            {\r\n                platform = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataFieldSettings installSize = new MetadataFieldSettings();\r\n        public MetadataFieldSettings InstallSize\r\n        {\r\n            get => installSize;\r\n            set\r\n            {\r\n                installSize = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public MetadataDownloaderSettings()\r\n        {\r\n        }\r\n\r\n        public static MetadataDownloaderSettings GetDefaultSettings()\r\n        {\r\n            var igdbPluginId = BuiltinExtensions.GetIdFromExtension(BuiltinExtension.IgdbMetadata);\r\n            var settings = new MetadataDownloaderSettings();\r\n            settings.ConfigureFields(new List<Guid> { igdbPluginId }, true);\r\n            settings.Description.Sources = new List<Guid> { Guid.Empty, igdbPluginId };\r\n            settings.Icon.Sources = new List<Guid> { Guid.Empty, igdbPluginId };\r\n            settings.BackgroundImage.Sources = new List<Guid> { Guid.Empty, igdbPluginId };\r\n            settings.CoverImage.Sources = new List<Guid> { igdbPluginId, Guid.Empty };\r\n            settings.Name.Import = false;\r\n            return settings;\r\n        }\r\n\r\n        public void ConfigureFields(List<Guid> sources, bool import)\r\n        {\r\n            Name = new MetadataFieldSettings(import, sources);\r\n            Genre = new MetadataFieldSettings(import, sources);\r\n            Description = new MetadataFieldSettings(import, sources);\r\n            Developer = new MetadataFieldSettings(import, sources);\r\n            Publisher = new MetadataFieldSettings(import, sources);\r\n            Tag = new MetadataFieldSettings(import, sources);\r\n            Links = new MetadataFieldSettings(import, sources);\r\n            CoverImage = new MetadataFieldSettings(import, sources);\r\n            BackgroundImage = new MetadataFieldSettings(import, sources);\r\n            Icon = new MetadataFieldSettings(import, sources);\r\n            ReleaseDate = new MetadataFieldSettings(import, sources);\r\n            CommunityScore = new MetadataFieldSettings(import, sources);\r\n            CriticScore = new MetadataFieldSettings(import, sources);\r\n            Feature = new MetadataFieldSettings(import, sources);\r\n            AgeRating = new MetadataFieldSettings(import, sources);\r\n            Platform = new MetadataFieldSettings(import, sources);\r\n            Series = new MetadataFieldSettings(import, sources);\r\n            Region = new MetadataFieldSettings(import, sources);\r\n            InstallSize = new MetadataFieldSettings(import, sources);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Metadata/MetadataFileExtensions.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Common.Web;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public static class MetadataFileExtensions\r\n    {\r\n        /// <summary>\r\n        /// Returns local file path of file. If link, downloads file to Playnite temp. If raw content, saves file to Playnite temp.\r\n        /// </summary>\r\n        /// <param name=\"file\"></param>\r\n        /// <param name=\"cancelToken\"></param>\r\n        /// <returns></returns>\r\n        public static string GetLocalFile(this MetadataFile file, CancellationToken cancelToken)\r\n        {\r\n            if (!file.HasImageData)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            if (file.HasContent)\r\n            {\r\n                var resultPath = Path.Combine(PlaynitePaths.TempPath, Guid.NewGuid() + Path.GetExtension(file.FileName));\r\n                FileSystem.PrepareSaveFile(resultPath);\r\n                File.WriteAllBytes(resultPath, file.Content);\r\n                return resultPath;\r\n            }\r\n            else\r\n            {\r\n                if (file.Path.IsHttpUrl())\r\n                {\r\n                    var extension = Path.GetExtension(new Uri(file.Path).AbsolutePath);\r\n                    var resultPath = Path.Combine(PlaynitePaths.TempPath, Guid.NewGuid() + extension);\r\n                    FileSystem.PrepareSaveFile(resultPath);\r\n                    HttpDownloader.DownloadFile(file.Path, resultPath, cancelToken);\r\n                    if (cancelToken.IsCancellationRequested)\r\n                    {\r\n                        if (File.Exists(resultPath))\r\n                        {\r\n                            File.Delete(resultPath);\r\n                        }\r\n\r\n                        return null;\r\n                    }\r\n                    else\r\n                    {\r\n                        return resultPath;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return file.Path;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Fileapi.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n\tpublic class Fileapi\r\n\t{\r\n\t\tpublic const uint FILE_FLAG_BACKUP_SEMANTICS = 0x2000000;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Gdi32.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    public class Gdi32\r\n    {\r\n        private const string dllName = \"Gdi32.dll\";\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        public static extern bool DeleteObject(IntPtr hObject);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Kernel32.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    public class Kernel32\r\n    {\r\n        private const string dllName = \"Kernel32.dll\";\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Auto)]\r\n        public extern static uint GetFinalPathNameByHandle(IntPtr hFile, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpszFilePath, uint cchFilePath, uint dwFlags);\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        [return: MarshalAs(UnmanagedType.Bool)]\r\n        public extern static bool CloseHandle(IntPtr hObject);\r\n\r\n        [DllImport(dllName, CharSet = CharSet.Auto, SetLastError = true)]\r\n        public static extern IntPtr CreateFile(\r\n            [MarshalAs(UnmanagedType.LPTStr)] string filename,\r\n            [MarshalAs(UnmanagedType.U4)] uint access,\r\n            [MarshalAs(UnmanagedType.U4)] FileShare share,\r\n            IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero\r\n            [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,\r\n            [MarshalAs(UnmanagedType.U4)] uint flagsAndAttributes,\r\n            IntPtr templateFile);\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Auto)]\r\n        public static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        public static extern IntPtr LoadResource(IntPtr hModule, IntPtr hResInfo);\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        public static extern IntPtr FindResource(IntPtr hModule, string lpName, string lpType);\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        public static extern uint SizeofResource(IntPtr hModule, IntPtr hResInfo);\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        public static extern bool FreeLibrary(IntPtr hModule);\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Unicode)]\r\n        public static extern bool EnumResourceNames(IntPtr hModule, IntPtr lpszType, ENUMRESNAMEPROC lpEnumFunc, IntPtr lParam);\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Unicode)]\r\n        public static extern IntPtr FindResource(IntPtr hModule, IntPtr lpName, IntPtr lpType);\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        public static extern IntPtr LockResource(IntPtr hResData);\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        public static extern IntPtr GetCurrentProcess();\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Unicode)]\r\n        public static extern int QueryDosDevice(string lpDeviceName, StringBuilder lpTargetPath, int ucchMax);\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Auto)]\r\n        public static extern bool CreateProcess(\r\n           string lpApplicationName,\r\n           string lpCommandLine,\r\n           ref SECURITY_ATTRIBUTES lpProcessAttributes,\r\n           ref SECURITY_ATTRIBUTES lpThreadAttributes,\r\n           bool bInheritHandles,\r\n           uint dwCreationFlags,\r\n           IntPtr lpEnvironment,\r\n           string lpCurrentDirectory,\r\n           [In] ref STARTUPINFO lpStartupInfo,\r\n           out PROCESS_INFORMATION lpProcessInformation);\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        public static extern IntPtr OpenProcess(ProcessAccessFlags processAccess, bool bInheritHandle, int processId);\r\n\r\n        [DllImport(dllName, CharSet = CharSet.Auto)]\r\n        public static extern bool QueryFullProcessImageName([In] IntPtr hProcess, [In] uint dwFlags, [Out] StringBuilder lpExeName, [In, Out] ref uint lpdwSize);\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Unicode)]\r\n        [return: MarshalAs(UnmanagedType.U4)]\r\n        public static extern uint GetFileAttributesW(string lpFileName);\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Unicode)]\r\n        public static extern uint GetCompressedFileSizeW(\r\n            [In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,\r\n            [Out, MarshalAs(UnmanagedType.U4)] out uint lpFileSizeHigh);\r\n\r\n        [DllImport(dllName, SetLastError = true, PreserveSig = true, CharSet = CharSet.Unicode)]\r\n        public static extern int GetDiskFreeSpaceW(\r\n            [In, MarshalAs(UnmanagedType.LPWStr)] string lpRootPathName,\r\n            out uint lpSectorsPerCluster,\r\n            out uint lpBytesPerSector,\r\n            out uint lpNumberOfFreeClusters,\r\n            out uint lpTotalNumberOfClusters);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Ntdll.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    [Flags]\r\n    public enum ProcessAccessFlags : uint\r\n    {\r\n        All = 0x001F0FFF,\r\n        Terminate = 0x00000001,\r\n        CreateThread = 0x00000002,\r\n        VirtualMemoryOperation = 0x00000008,\r\n        VirtualMemoryRead = 0x00000010,\r\n        VirtualMemoryWrite = 0x00000020,\r\n        DuplicateHandle = 0x00000040,\r\n        CreateProcess = 0x000000080,\r\n        SetQuota = 0x00000100,\r\n        SetInformation = 0x00000200,\r\n        QueryInformation = 0x00000400,\r\n        QueryLimitedInformation = 0x00001000,\r\n        Synchronize = 0x00100000\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential, Pack = 1)]\r\n    public struct PROCESS_BASIC_INFORMATION\r\n    {\r\n        public IntPtr ExitStatus;\r\n        public IntPtr PebBaseAddress;\r\n        public IntPtr AffinityMask;\r\n        public IntPtr BasePriority;\r\n        public UIntPtr UniqueProcessId;\r\n        public IntPtr InheritedFromUniqueProcessId;\r\n\r\n        public int Size\r\n        {\r\n            get { return (int)Marshal.SizeOf(typeof(PROCESS_BASIC_INFORMATION)); }\r\n        }\r\n    }\r\n\r\n    public enum PROCESSINFOCLASS : int\r\n    {\r\n        ProcessBasicInformation = 0, // 0, q: PROCESS_BASIC_INFORMATION, PROCESS_EXTENDED_BASIC_INFORMATION\r\n        ProcessQuotaLimits, // qs: QUOTA_LIMITS, QUOTA_LIMITS_EX\r\n        ProcessIoCounters, // q: IO_COUNTERS\r\n        ProcessVmCounters, // q: VM_COUNTERS, VM_COUNTERS_EX\r\n        ProcessTimes, // q: KERNEL_USER_TIMES\r\n        ProcessBasePriority, // s: KPRIORITY\r\n        ProcessRaisePriority, // s: ULONG\r\n        ProcessDebugPort, // q: HANDLE\r\n        ProcessExceptionPort, // s: HANDLE\r\n        ProcessAccessToken, // s: PROCESS_ACCESS_TOKEN\r\n        ProcessLdtInformation, // 10\r\n        ProcessLdtSize,\r\n        ProcessDefaultHardErrorMode, // qs: ULONG\r\n        ProcessIoPortHandlers, // (kernel-mode only)\r\n        ProcessPooledUsageAndLimits, // q: POOLED_USAGE_AND_LIMITS\r\n        ProcessWorkingSetWatch, // q: PROCESS_WS_WATCH_INFORMATION[]; s: void\r\n        ProcessUserModeIOPL,\r\n        ProcessEnableAlignmentFaultFixup, // s: BOOLEAN\r\n        ProcessPriorityClass, // qs: PROCESS_PRIORITY_CLASS\r\n        ProcessWx86Information,\r\n        ProcessHandleCount, // 20, q: ULONG, PROCESS_HANDLE_INFORMATION\r\n        ProcessAffinityMask, // s: KAFFINITY\r\n        ProcessPriorityBoost, // qs: ULONG\r\n        ProcessDeviceMap, // qs: PROCESS_DEVICEMAP_INFORMATION, PROCESS_DEVICEMAP_INFORMATION_EX\r\n        ProcessSessionInformation, // q: PROCESS_SESSION_INFORMATION\r\n        ProcessForegroundInformation, // s: PROCESS_FOREGROUND_BACKGROUND\r\n        ProcessWow64Information, // q: ULONG_PTR\r\n        ProcessImageFileName, // q: UNICODE_STRING\r\n        ProcessLUIDDeviceMapsEnabled, // q: ULONG\r\n        ProcessBreakOnTermination, // qs: ULONG\r\n        ProcessDebugObjectHandle, // 30, q: HANDLE\r\n        ProcessDebugFlags, // qs: ULONG\r\n        ProcessHandleTracing, // q: PROCESS_HANDLE_TRACING_QUERY; s: size 0 disables, otherwise enables\r\n        ProcessIoPriority, // qs: ULONG\r\n        ProcessExecuteFlags, // qs: ULONG\r\n        ProcessResourceManagement,\r\n        ProcessCookie, // q: ULONG\r\n        ProcessImageInformation, // q: SECTION_IMAGE_INFORMATION\r\n        ProcessCycleTime, // q: PROCESS_CYCLE_TIME_INFORMATION\r\n        ProcessPagePriority, // q: ULONG\r\n        ProcessInstrumentationCallback, // 40\r\n        ProcessThreadStackAllocation, // s: PROCESS_STACK_ALLOCATION_INFORMATION, PROCESS_STACK_ALLOCATION_INFORMATION_EX\r\n        ProcessWorkingSetWatchEx, // q: PROCESS_WS_WATCH_INFORMATION_EX[]\r\n        ProcessImageFileNameWin32, // q: UNICODE_STRING\r\n        ProcessImageFileMapping, // q: HANDLE (input)\r\n        ProcessAffinityUpdateMode, // qs: PROCESS_AFFINITY_UPDATE_MODE\r\n        ProcessMemoryAllocationMode, // qs: PROCESS_MEMORY_ALLOCATION_MODE\r\n        ProcessGroupInformation, // q: USHORT[]\r\n        ProcessTokenVirtualizationEnabled, // s: ULONG\r\n        ProcessConsoleHostProcess, // q: ULONG_PTR\r\n        ProcessWindowInformation, // 50, q: PROCESS_WINDOW_INFORMATION\r\n        ProcessHandleInformation, // q: PROCESS_HANDLE_SNAPSHOT_INFORMATION // since WIN8\r\n        ProcessMitigationPolicy, // s: PROCESS_MITIGATION_POLICY_INFORMATION\r\n        ProcessDynamicFunctionTableInformation,\r\n        ProcessHandleCheckingMode,\r\n        ProcessKeepAliveCount, // q: PROCESS_KEEPALIVE_COUNT_INFORMATION\r\n        ProcessRevokeFileHandles, // s: PROCESS_REVOKE_FILE_HANDLES_INFORMATION\r\n        MaxProcessInfoClass\r\n    };\r\n\r\n    public class Ntdll\r\n    {\r\n        private const string dllName = \"Ntdll.dll\";\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        public static extern int NtQueryInformationProcess(IntPtr hProcess, PROCESSINFOCLASS pic, ref PROCESS_BASIC_INFORMATION pbi, int cb, out int pSize);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Powrprof.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    public class Powrprof\r\n    {\r\n        private const string dllName = \"Powrprof.dll\";\r\n\r\n        [DllImport(dllName, CharSet = CharSet.Auto, ExactSpelling = true)]\r\n        public static extern bool SetSuspendState(bool hiberate, bool forceCritical, bool disableWakeEvent);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Processthreadsapi.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]\r\n    public struct STARTUPINFO\r\n    {\r\n        public Int32 cb;\r\n        public IntPtr lpReserved;\r\n        public IntPtr lpDesktop;\r\n        public IntPtr lpTitle;\r\n        public Int32 dwX;\r\n        public Int32 dwY;\r\n        public Int32 dwXSize;\r\n        public Int32 dwYSize;\r\n        public Int32 dwXCountChars;\r\n        public Int32 dwYCountChars;\r\n        public Int32 dwFillAttribute;\r\n        public Int32 dwFlags;\r\n        public Int16 wShowWindow;\r\n        public Int16 cbReserved2;\r\n        public IntPtr lpReserved2;\r\n        public IntPtr hStdInput;\r\n        public IntPtr hStdOutput;\r\n        public IntPtr hStdError;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct PROCESS_INFORMATION\r\n    {\r\n        public IntPtr hProcess;\r\n        public IntPtr hThread;\r\n        public int dwProcessId;\r\n        public int dwThreadId;\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Psapi.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    public class Psapi\r\n    {\r\n        private const string dllName = \"Psapi.dll\";\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Unicode)]\r\n        public static extern int GetMappedFileName(IntPtr hProcess, IntPtr lpv, StringBuilder lpFilename, int nSize);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Shell32.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    public class Shell32\r\n    {\r\n        private const string dllName = \"Shell32.dll\";\r\n\r\n        [DllImport(dllName)]\r\n        public extern static int ExtractIconEx(string libName, int iconIndex, IntPtr[] largeIcon, IntPtr[] smallIcon, uint nIcons);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Shlwapi.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    [Flags]\r\n    public enum MatchPatternFlags : uint\r\n    {\r\n        Normal = 0x00000000,            // PMSF_NORMAL\r\n        Multiple = 0x00000001,          // PMSF_MULTIPLE\r\n        DontStripSpaces = 0x00010000    // PMSF_DONT_STRIP_SPACES\r\n    }\r\n\r\n    public class Shlwapi\r\n    {\r\n        private const string dllName = \"Shlwapi.dll\";\r\n\r\n        [DllImport(dllName, BestFitMapping = false, CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = false, ThrowOnUnmappableChar = true)]\r\n        public static extern int SHLoadIndirectString(string pszSource, StringBuilder pszOutBuf, int cchOutBuf, IntPtr ppvReserved);\r\n\r\n        [DllImport(dllName, SetLastError = false)]\r\n        public static extern int PathMatchSpecExW([MarshalAs(UnmanagedType.LPWStr)] string file, [MarshalAs(UnmanagedType.LPWStr)] string spec, MatchPatternFlags flags);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/User32.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Security;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    public class User32\r\n    {\r\n        private const string dllName = \"User32.dll\";\r\n\r\n        [DllImport(dllName)]\r\n        public static extern int GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS flags, out uint numPathArrayElements, out uint numModeInfoArrayElements);\r\n\r\n        [DllImport(dllName)]\r\n        public static extern int QueryDisplayConfig(\r\n            QUERY_DEVICE_CONFIG_FLAGS flags,\r\n            ref uint numPathArrayElements, [Out] DISPLAYCONFIG_PATH_INFO[] PathInfoArray,\r\n            ref uint numModeInfoArrayElements, [Out] DISPLAYCONFIG_MODE_INFO[] ModeInfoArray,\r\n            IntPtr currentTopologyId);\r\n\r\n        [DllImport(dllName)]\r\n        public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName);\r\n\r\n        [DllImport(dllName)]\r\n        public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO requestPacket);\r\n\r\n        [DllImport(dllName)]\r\n        public static extern int DisplayConfigSetDeviceInfo(ref DISPLAYCONFIG_DEVICE_INFO_HEADER setPacket);\r\n\r\n        [DllImport(dllName)]\r\n        public static extern IntPtr GetForegroundWindow();\r\n\r\n        [DllImport(dllName)]\r\n        public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);\r\n\r\n        [DllImport(dllName)]\r\n        public static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);\r\n\r\n        [DllImport(dllName)]\r\n        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);\r\n\r\n        [DllImport(dllName)]\r\n        public static extern int ShowCursor(bool bShow);\r\n\r\n        [DllImport(dllName, EntryPoint = \"SetWindowPos\", SetLastError = true)]\r\n        [return: MarshalAs(UnmanagedType.Bool)]\r\n        private static extern bool _SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, SWP uFlags);\r\n\r\n        public static void SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, SWP uFlags)\r\n        {\r\n            if (!_SetWindowPos(hWnd, hWndInsertAfter, x, y, cx, cy, uFlags))\r\n            {\r\n                throw new Win32Exception();\r\n            }\r\n        }\r\n\r\n        [DllImport(\"user32\", CallingConvention = CallingConvention.Winapi)]\r\n        public static extern IntPtr DefWindowProc([In] IntPtr hwnd, [In] int msg, [In] IntPtr wParam, [In] IntPtr lParam);\r\n\r\n        [DllImport(dllName, CharSet = CharSet.Auto)]\r\n        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, StringBuilder lParam);\r\n\r\n        [DllImport(dllName, CharSet = CharSet.Auto)]\r\n        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);\r\n\r\n        [DllImport(dllName, CharSet = CharSet.Auto)]\r\n        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam);\r\n\r\n        [DllImport(dllName, CharSet = CharSet.Auto)]\r\n        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, ref IntPtr lParam);\r\n\r\n        [DllImport(dllName, CharSet = CharSet.Auto)]\r\n        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, IntPtr lParam);\r\n\r\n        [DllImport(dllName, CharSet = CharSet.Auto)]\r\n        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, IntPtr lParam);\r\n\r\n        [DllImport(\"Wintrust.dll\", PreserveSig = true, SetLastError = false)]\r\n        public static extern uint WinVerifyTrust(IntPtr hWnd, IntPtr pgActionID, IntPtr pWinTrustData);\r\n\r\n        [DllImport(dllName, CharSet = CharSet.Auto)]\r\n        public static extern IntPtr FindWindow(string strClassName, string strWindowName);\r\n\r\n        [DllImport(dllName)]\r\n        public static extern IntPtr MonitorFromWindow(IntPtr hwnd, MonitorOptions dwFlags);\r\n\r\n        [DllImport(dllName, EntryPoint = \"GetMonitorInfo\", SetLastError = true)]\r\n        [return: MarshalAs(UnmanagedType.Bool)]\r\n        private static extern bool _GetMonitorInfo(IntPtr hMonitor, [In, Out] MONITORINFO lpmi);\r\n\r\n        [DllImport(dllName, EntryPoint = \"DestroyIcon\", SetLastError = true)]\r\n        public static extern int DestroyIcon(IntPtr hIcon);\r\n\r\n        public static MONITORINFO GetMonitorInfo(IntPtr hMonitor)\r\n        {\r\n            var mi = new MONITORINFO();\r\n            if (!_GetMonitorInfo(hMonitor, mi))\r\n            {\r\n                throw new Win32Exception();\r\n            }\r\n            return mi;\r\n        }\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Auto)]\r\n        public static extern int GetWindowLong(IntPtr hWnd, int nIndex);\r\n\r\n        [DllImport(dllName, CharSet = CharSet.Auto)]\r\n        public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Auto)]\r\n        public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);\r\n\r\n        [DllImport(dllName, SetLastError = true, CharSet = CharSet.Auto)]\r\n        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        [return: MarshalAs(UnmanagedType.Bool)]\r\n        static extern bool GetCursorPos(out POINT lpPoint);\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        public static extern bool LockWorkStation();\r\n\r\n        [Flags]\r\n        public enum ExitWindowsFlags\r\n        {\r\n            EWX_LOGOFF = 0x00000000,\r\n            EWX_SHUTDOWN = 0x00000001,\r\n            EWX_REBOOT = 0x00000002,\r\n            EWX_FORCE = 0x00000004,\r\n            EWX_POWEROFF = 0x00000008,\r\n            EWX_FORCEIFHUNG = 0x00000010,\r\n            EWX_QUICKRESOLVE = 0x00000020,\r\n            EWX_RESTARTAPPS = 0x00000040,\r\n            EWX_HYBRID_SHUTDOWN = 0x00400000,\r\n            EWX_BOOTOPTIONS = 0x01000000,\r\n            EWX_ARSO = 0x04000000 // Undocumented https://stackoverflow.com/a/72069512/1107424\r\n        }\r\n\r\n        [DllImport(dllName, SetLastError = true)]\r\n        public static extern bool ExitWindowsEx(ExitWindowsFlags uFlags, uint dwReason);\r\n\r\n        [StructLayout(LayoutKind.Sequential)]\r\n        internal struct TOKEN_PRIVILEGES\r\n        {\r\n            internal int PrivilegeCount;\r\n            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]\r\n            internal int[] Privileges;\r\n        }\r\n\r\n        [DllImport(\"advapi32.dll\", CharSet = CharSet.Auto, SetLastError = true)]\r\n        private static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, ref LUID lpLuid);\r\n\r\n        [DllImport(\"advapi32\", SetLastError = true), SuppressUnmanagedCodeSecurity]\r\n        private static extern int OpenProcessToken(IntPtr ProcessHandle, int DesiredAccess, ref IntPtr TokenHandle);\r\n\r\n        [DllImport(\"advapi32.dll\", CharSet = CharSet.Auto, SetLastError = true)]\r\n        private static extern int AdjustTokenPrivileges(IntPtr TokenHandle, int DisableAllPrivileges, IntPtr NewState, int BufferLength, IntPtr PreviousState, ref int ReturnLength);\r\n\r\n        private const int SE_PRIVILEGE_ENABLED = 0x00000002;\r\n        private const int TOKEN_ADJUST_PRIVILEGES = 0X00000020;\r\n        private const int TOKEN_QUERY = 0X00000008;\r\n        private const int TOKEN_ALL_ACCESS = 0X001f01ff;\r\n        private const int PROCESS_QUERY_INFORMATION = 0X00000400;\r\n\r\n        public static bool EnablePrivilege(string lpszPrivilege, bool bEnablePrivilege)\r\n        {\r\n            bool retval = false;\r\n            int ltkpOld = 0;\r\n            IntPtr hToken = IntPtr.Zero;\r\n            TOKEN_PRIVILEGES tkp = new TOKEN_PRIVILEGES();\r\n            tkp.Privileges = new int[3];\r\n            TOKEN_PRIVILEGES tkpOld = new TOKEN_PRIVILEGES();\r\n            tkpOld.Privileges = new int[3];\r\n            LUID tLUID = new LUID();\r\n            tkp.PrivilegeCount = 1;\r\n            if (bEnablePrivilege)\r\n                tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;\r\n            else\r\n                tkp.Privileges[2] = 0;\r\n            if (LookupPrivilegeValue(null, lpszPrivilege, ref tLUID))\r\n            {\r\n                var proc = Process.GetCurrentProcess();\r\n                if (proc.Handle != IntPtr.Zero)\r\n                {\r\n                    if (OpenProcessToken(proc.Handle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,\r\n                        ref hToken) != 0)\r\n                    {\r\n                        tkp.PrivilegeCount = 1;\r\n                        tkp.Privileges[2] = SE_PRIVILEGE_ENABLED;\r\n                        tkp.Privileges[1] = tLUID.HighPart;\r\n                        tkp.Privileges[0] = tLUID.LowPart;\r\n                        const int bufLength = 256;\r\n                        IntPtr tu = Marshal.AllocHGlobal(bufLength);\r\n                        Marshal.StructureToPtr(tkp, tu, true);\r\n                        if (AdjustTokenPrivileges(hToken, 0, tu, bufLength, IntPtr.Zero, ref ltkpOld) != 0)\r\n                        {\r\n                            // successful AdjustTokenPrivileges doesn't mean privilege could be changed\r\n                            if (Marshal.GetLastWin32Error() == 0)\r\n                            {\r\n                                retval = true; // Token changed\r\n                            }\r\n                        }\r\n                        TOKEN_PRIVILEGES tokp = (TOKEN_PRIVILEGES)Marshal.PtrToStructure(tu, typeof(TOKEN_PRIVILEGES));\r\n                        Marshal.FreeHGlobal(tu);\r\n                    }\r\n                }\r\n            }\r\n            if (hToken != IntPtr.Zero)\r\n            {\r\n                Kernel32.CloseHandle(hToken);\r\n            }\r\n            return retval;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/WinError.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    public class WinError\r\n    {\r\n        public const int ERROR_SUCCESS = 0;\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Winbase.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    [UnmanagedFunctionPointer(CallingConvention.Winapi, SetLastError = true, CharSet = CharSet.Unicode)]\r\n    public delegate bool ENUMRESNAMEPROC(IntPtr hModule, IntPtr lpszType, IntPtr lpszName, IntPtr lParam);\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct SECURITY_ATTRIBUTES\r\n    {\r\n        public int nLength;\r\n        public IntPtr lpSecurityDescriptor;\r\n        public int bInheritHandle;\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Windef.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics.CodeAnalysis;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    public static class Windef\r\n    {\r\n        internal static int LOWORD(int i)\r\n        {\r\n            return (short)(i & 0xFFFF);\r\n        }\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct POINTL\r\n    {\r\n        public int x;\r\n        public int y;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct SIZE\r\n    {\r\n        public int cx;\r\n        public int cy;\r\n    }\r\n\r\n    [Serializable]\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct POINT\r\n    {\r\n        private int _x;\r\n        private int _y;\r\n\r\n        public POINT(int x, int y)\r\n        {\r\n            _x = x;\r\n            _y = y;\r\n        }\r\n\r\n        public int X\r\n        {\r\n            get { return _x; }\r\n            set { _x = value; }\r\n        }\r\n\r\n        public int Y\r\n        {\r\n            get { return _y; }\r\n            set { _y = value; }\r\n        }\r\n\r\n        public override bool Equals(object obj)\r\n        {\r\n            if (obj is POINT)\r\n            {\r\n                var point = (POINT)obj;\r\n\r\n                return point._x == _x && point._y == _y;\r\n            }\r\n            return base.Equals(obj);\r\n        }\r\n        public override int GetHashCode()\r\n        {\r\n            return _x.GetHashCode() ^ _y.GetHashCode();\r\n        }\r\n\r\n        public static bool operator ==(POINT a, POINT b)\r\n        {\r\n            return a._x == b._x && a._y == b._y;\r\n        }\r\n\r\n        public static bool operator !=(POINT a, POINT b)\r\n        {\r\n            return !(a == b);\r\n        }\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential, Pack = 0)]\r\n    public struct RECT\r\n    {\r\n        private int _left;\r\n        private int _top;\r\n        private int _right;\r\n        private int _bottom;\r\n\r\n        public static readonly RECT Empty = new RECT();\r\n\r\n        public RECT(int left, int top, int right, int bottom)\r\n        {\r\n            this._left = left;\r\n            this._top = top;\r\n            this._right = right;\r\n            this._bottom = bottom;\r\n        }\r\n\r\n        public RECT(RECT rcSrc)\r\n        {\r\n            _left = rcSrc.Left;\r\n            _top = rcSrc.Top;\r\n            _right = rcSrc.Right;\r\n            _bottom = rcSrc.Bottom;\r\n        }\r\n\r\n        [SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        public void Offset(int dx, int dy)\r\n        {\r\n            _left += dx;\r\n            _top += dy;\r\n            _right += dx;\r\n            _bottom += dy;\r\n        }\r\n\r\n        [SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        public int Left\r\n        {\r\n            get { return _left; }\r\n            set { _left = value; }\r\n        }\r\n\r\n        [SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        public int Right\r\n        {\r\n            get { return _right; }\r\n            set { _right = value; }\r\n        }\r\n\r\n        [SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        public int Top\r\n        {\r\n            get { return _top; }\r\n            set { _top = value; }\r\n        }\r\n\r\n        [SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        public int Bottom\r\n        {\r\n            get { return _bottom; }\r\n            set { _bottom = value; }\r\n        }\r\n\r\n        [SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        public int Width\r\n        {\r\n            get { return _right - _left; }\r\n        }\r\n\r\n        [SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        public int Height\r\n        {\r\n            get { return _bottom - _top; }\r\n        }\r\n\r\n        [SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        public POINT Position\r\n        {\r\n            get { return new POINT { X = _left, Y = _top }; }\r\n        }\r\n\r\n        [SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        public SIZE Size\r\n        {\r\n            get { return new SIZE { cx = Width, cy = Height }; }\r\n        }\r\n\r\n        [SuppressMessage(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        public static RECT Union(RECT rect1, RECT rect2)\r\n        {\r\n            return new RECT\r\n            {\r\n                Left = Math.Min(rect1.Left, rect2.Left),\r\n                Top = Math.Min(rect1.Top, rect2.Top),\r\n                Right = Math.Max(rect1.Right, rect2.Right),\r\n                Bottom = Math.Max(rect1.Bottom, rect2.Bottom),\r\n            };\r\n        }\r\n\r\n        public override bool Equals(object obj)\r\n        {\r\n            try\r\n            {\r\n                var rc = (RECT)obj;\r\n                return rc._bottom == _bottom\r\n                    && rc._left == _left\r\n                    && rc._right == _right\r\n                    && rc._top == _top;\r\n            }\r\n            catch (InvalidCastException)\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public bool IsEmpty\r\n        {\r\n            get\r\n            {\r\n                // BUGBUG : On Bidi OS (hebrew arabic) left > right\r\n                return Left >= Right || Top >= Bottom;\r\n            }\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            if (this == Empty)\r\n                return \"RECT {Empty}\";\r\n            return \"RECT { left : \" + Left + \" / top : \" + Top + \" / right : \" + Right + \" / bottom : \" + Bottom + \" }\";\r\n        }\r\n\r\n        public override int GetHashCode()\r\n        {\r\n            return (_left << 16 | Windef.LOWORD(_right)) ^ (_top << 16 | Windef.LOWORD(_bottom));\r\n        }\r\n\r\n        public static bool operator ==(RECT rect1, RECT rect2)\r\n        {\r\n            return (rect1.Left == rect2.Left && rect1.Top == rect2.Top && rect1.Right == rect2.Right && rect1.Bottom == rect2.Bottom);\r\n        }\r\n\r\n        public static bool operator !=(RECT rect1, RECT rect2)\r\n        {\r\n            return !(rect1 == rect2);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Wingdi.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_PATH_INFO\r\n    {\r\n        public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;\r\n        public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;\r\n        public uint flags;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Explicit)]\r\n    public struct DISPLAYCONFIG_MODE_INFO_UNION\r\n    {\r\n        [FieldOffset(0)]\r\n        public DISPLAYCONFIG_TARGET_MODE targetMode;\r\n\r\n        [FieldOffset(0)]\r\n        public DISPLAYCONFIG_SOURCE_MODE sourceMode;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_MODE_INFO\r\n    {\r\n        public DISPLAYCONFIG_MODE_INFO_TYPE infoType;\r\n        public uint id;\r\n        public LUID adapterId;\r\n        public DISPLAYCONFIG_MODE_INFO_UNION modeInfo;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_PATH_SOURCE_INFO\r\n    {\r\n        public LUID adapterId;\r\n        public uint id;\r\n        public uint modeInfoIdx;\r\n        public uint statusFlags;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_PATH_TARGET_INFO\r\n    {\r\n        public LUID adapterId;\r\n        public uint id;\r\n        public uint modeInfoIdx;\r\n        private DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;\r\n        private DISPLAYCONFIG_ROTATION rotation;\r\n        private DISPLAYCONFIG_SCALING scaling;\r\n        private DISPLAYCONFIG_RATIONAL refreshRate;\r\n        private DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;\r\n        public bool targetAvailable;\r\n        public uint statusFlags;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_TARGET_MODE\r\n    {\r\n        public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_SOURCE_MODE\r\n    {\r\n        public uint width;\r\n        public uint height;\r\n        public DISPLAYCONFIG_PIXELFORMAT pixelFormat;\r\n        public POINTL position;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS\r\n    {\r\n        public uint value;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_RATIONAL\r\n    {\r\n        public uint Numerator;\r\n        public uint Denominator;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO\r\n    {\r\n        public ulong pixelRate;\r\n        public DISPLAYCONFIG_RATIONAL hSyncFreq;\r\n        public DISPLAYCONFIG_RATIONAL vSyncFreq;\r\n        public DISPLAYCONFIG_2DREGION activeSize;\r\n        public DISPLAYCONFIG_2DREGION totalSize;\r\n        public uint videoStandard;\r\n        public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_2DREGION\r\n    {\r\n        public uint cx;\r\n        public uint cy;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_DEVICE_INFO_HEADER\r\n    {\r\n        public DISPLAYCONFIG_DEVICE_INFO_TYPE type;\r\n        public uint size;\r\n        public LUID adapterId;\r\n        public uint id;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]\r\n    public struct DISPLAYCONFIG_TARGET_DEVICE_NAME\r\n    {\r\n        public DISPLAYCONFIG_DEVICE_INFO_HEADER header;\r\n        public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags;\r\n        public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;\r\n        public ushort edidManufactureId;\r\n        public ushort edidProductCodeId;\r\n        public uint connectorInstance;\r\n\r\n        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]\r\n        public string monitorFriendlyDeviceName;\r\n\r\n        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]\r\n        public string monitorDevicePath;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_GET_ADVANCED_COLOR_INFO\r\n    {\r\n        public DISPLAYCONFIG_DEVICE_INFO_HEADER header;\r\n        public uint value;\r\n        public DISPLAYCONFIG_COLOR_ENCODING colorEncoding;\r\n        public uint bitsPerColorChannel;\r\n\r\n        public bool advancedColorSupported => (value & 0x1) == 0x1;\r\n        public bool advancedColorEnabled => (value & 0x2) == 0x2;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE\r\n    {\r\n        public DISPLAYCONFIG_DEVICE_INFO_HEADER header;\r\n        public uint value;\r\n\r\n        public bool enableAdvancedColor\r\n        {\r\n            get => (value & 0x1) == 1;\r\n            set\r\n            {\r\n                uint mask = 0x1;\r\n                if (value)\r\n                {\r\n                    this.value |= mask;\r\n                }\r\n                else\r\n                {\r\n                    this.value &= ~mask;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint\r\n    {\r\n        DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,\r\n        DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,\r\n        DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF\r\n    }\r\n\r\n    public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint\r\n    {\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 0xFFFFFFFF,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000,\r\n        DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF\r\n    }\r\n\r\n    public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint\r\n    {\r\n        DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,\r\n        DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,\r\n        DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,\r\n        DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,\r\n        DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,\r\n        DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF\r\n    }\r\n\r\n    public enum DISPLAYCONFIG_ROTATION : uint\r\n    {\r\n        DISPLAYCONFIG_ROTATION_IDENTITY = 1,\r\n        DISPLAYCONFIG_ROTATION_ROTATE90 = 2,\r\n        DISPLAYCONFIG_ROTATION_ROTATE180 = 3,\r\n        DISPLAYCONFIG_ROTATION_ROTATE270 = 4,\r\n        DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF\r\n    }\r\n\r\n    public enum DISPLAYCONFIG_SCALING : uint\r\n    {\r\n        DISPLAYCONFIG_SCALING_IDENTITY = 1,\r\n        DISPLAYCONFIG_SCALING_CENTERED = 2,\r\n        DISPLAYCONFIG_SCALING_STRETCHED = 3,\r\n        DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,\r\n        DISPLAYCONFIG_SCALING_CUSTOM = 5,\r\n        DISPLAYCONFIG_SCALING_PREFERRED = 128,\r\n        DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF\r\n    }\r\n\r\n    public enum DISPLAYCONFIG_PIXELFORMAT : uint\r\n    {\r\n        DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,\r\n        DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,\r\n        DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,\r\n        DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,\r\n        DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,\r\n        DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff\r\n    }\r\n\r\n    public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint\r\n    {\r\n        DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,\r\n        DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,\r\n        DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,\r\n        DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,\r\n        DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,\r\n        DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6,\r\n        DISPLAYCONFIG_DEVICE_INFO_GET_SUPPORT_VIRTUAL_RESOLUTION = 7,\r\n        DISPLAYCONFIG_DEVICE_INFO_SET_SUPPORT_VIRTUAL_RESOLUTION = 8,\r\n        DISPLAYCONFIG_DEVICE_INFO_GET_ADVANCED_COLOR_INFO = 9,\r\n        DISPLAYCONFIG_DEVICE_INFO_SET_ADVANCED_COLOR_STATE = 10,\r\n        DISPLAYCONFIG_DEVICE_INFO_GET_SDR_WHITE_LEVEL = 11,\r\n        DISPLAYCONFIG_DEVICE_INFO_GET_MONITOR_SPECIALIZATION = 12,\r\n        DISPLAYCONFIG_DEVICE_INFO_SET_MONITOR_SPECIALIZATION = 13,\r\n        DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF\r\n    }\r\n\r\n    public enum DISPLAYCONFIG_COLOR_ENCODING : uint\r\n    {\r\n        DISPLAYCONFIG_COLOR_ENCODING_RGB = 0,\r\n        DISPLAYCONFIG_COLOR_ENCODING_YCBCR444 = 1,\r\n        DISPLAYCONFIG_COLOR_ENCODING_YCBCR422 = 2,\r\n        DISPLAYCONFIG_COLOR_ENCODING_YCBCR420 = 3,\r\n        DISPLAYCONFIG_COLOR_ENCODING_INTENSITY = 4,\r\n        DISPLAYCONFIG_COLOR_ENCODING_FORCE_UINT32 = 0xFFFFFFFF\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Winnt.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    public static class Winnt\r\n    {\r\n        public const uint FILE_READ_EA = 0x0008;\r\n\r\n        public const uint FILE_ATTRIBUTE_READONLY = 0x00000001;\r\n        public const uint FILE_ATTRIBUTE_HIDDEN = 0x00000002;\r\n        public const uint FILE_ATTRIBUTE_SYSTEM = 0x00000004;\r\n        public const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010;\r\n        public const uint FILE_ATTRIBUTE_ARCHIVE = 0x00000020;\r\n        public const uint FILE_ATTRIBUTE_DEVICE = 0x00000040;\r\n        public const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;\r\n        public const uint FILE_ATTRIBUTE_TEMPORARY = 0x00000100;\r\n        public const uint FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200;\r\n        public const uint FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400;\r\n        public const uint FILE_ATTRIBUTE_COMPRESSED = 0x00000800;\r\n        public const uint FILE_ATTRIBUTE_OFFLINE = 0x00001000;\r\n        public const uint FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000;\r\n        public const uint FILE_ATTRIBUTE_ENCRYPTED = 0x00004000;\r\n        public const uint FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS = 0x400000;\r\n        public const uint FILE_ATTRIBUTE_RECALL_ON_OPEN = 0x40000;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct LUID\r\n    {\r\n        public int LowPart;\r\n        public int HighPart;\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/Wintrust.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    public class Wintrust\r\n    {\r\n        internal sealed class UnmanagedPointer : IDisposable\r\n        {\r\n            private IntPtr m_ptr;\r\n            private WINTRUST_DATA.AllocMethod m_meth;\r\n\r\n            internal UnmanagedPointer(IntPtr ptr, WINTRUST_DATA.AllocMethod method)\r\n            {\r\n                m_meth = method;\r\n                m_ptr = ptr;\r\n            }\r\n\r\n            ~UnmanagedPointer()\r\n            {\r\n                Dispose(false);\r\n            }\r\n\r\n            private void Dispose(bool disposing)\r\n            {\r\n                if (m_ptr != IntPtr.Zero)\r\n                {\r\n                    if (m_meth == WINTRUST_DATA.AllocMethod.HGlobal)\r\n                    {\r\n                        Marshal.FreeHGlobal(m_ptr);\r\n                    }\r\n                    else if (m_meth == WINTRUST_DATA.AllocMethod.CoTaskMem)\r\n                    {\r\n                        Marshal.FreeCoTaskMem(m_ptr);\r\n                    }\r\n\r\n                    m_ptr = IntPtr.Zero;\r\n                }\r\n\r\n                if (disposing)\r\n                {\r\n                    GC.SuppressFinalize(this);\r\n                }\r\n            }\r\n\r\n            public void Dispose()\r\n            {\r\n                Dispose(true);\r\n            }\r\n\r\n            public static implicit operator IntPtr(UnmanagedPointer ptr)\r\n            {\r\n                return ptr.m_ptr;\r\n            }\r\n        }\r\n    }\r\n\r\n    internal struct WINTRUST_FILE_INFO : IDisposable\r\n    {\r\n        public uint cbStruct;\r\n        [MarshalAs(UnmanagedType.LPTStr)]\r\n        public string pcwszFilePath;\r\n        public IntPtr hFile;\r\n        public IntPtr pgKnownSubject;\r\n\r\n        public WINTRUST_FILE_INFO(string fileName, Guid subject)\r\n        {\r\n            cbStruct = (uint)Marshal.SizeOf(typeof(WINTRUST_FILE_INFO));\r\n            pcwszFilePath = fileName;\r\n            if (subject != Guid.Empty)\r\n            {\r\n                pgKnownSubject = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Guid)));\r\n                Marshal.StructureToPtr(subject, pgKnownSubject, true);\r\n            }\r\n            else\r\n            {\r\n                pgKnownSubject = IntPtr.Zero;\r\n            }\r\n\r\n            hFile = IntPtr.Zero;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            Dispose(true);\r\n        }\r\n\r\n        private void Dispose(bool disposing)\r\n        {\r\n            if (pgKnownSubject != IntPtr.Zero)\r\n            {\r\n                Marshal.DestroyStructure(pgKnownSubject, typeof(Guid));\r\n                Marshal.FreeHGlobal(pgKnownSubject);\r\n            }\r\n        }\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    internal struct WINTRUST_DATA : IDisposable\r\n    {\r\n        public enum AllocMethod\r\n        {\r\n            HGlobal,\r\n            CoTaskMem\r\n        };\r\n\r\n        public enum UnionChoice\r\n        {\r\n            File = 1,\r\n            Catalog,\r\n            Blob,\r\n            Signer,\r\n            Cert\r\n        };\r\n\r\n        public enum UiChoice\r\n        {\r\n            All = 1,\r\n            NoUI,\r\n            NoBad,\r\n            NoGood\r\n        };\r\n\r\n        public enum RevocationCheckFlags\r\n        {\r\n            None = 0,\r\n            WholeChain\r\n        };\r\n\r\n        public enum StateAction\r\n        {\r\n            Ignore = 0,\r\n            Verify,\r\n            Close,\r\n            AutoCache,\r\n            AutoCacheFlush\r\n        };\r\n\r\n        public enum TrustProviderFlags\r\n        {\r\n            UseIE4Trust = 1,\r\n            NoIE4Chain = 2,\r\n            NoPolicyUsage = 4,\r\n            RevocationCheckNone = 16,\r\n            RevocationCheckEndCert = 32,\r\n            RevocationCheckChain = 64,\r\n            RecovationCheckChainExcludeRoot = 128,\r\n            Safer = 256,\r\n            HashOnly = 512,\r\n            UseDefaultOSVerCheck = 1024,\r\n            LifetimeSigning = 2048\r\n        };\r\n\r\n        public enum UIContext\r\n        {\r\n            Execute = 0,\r\n            Install\r\n        };\r\n\r\n        public WINTRUST_DATA(WINTRUST_FILE_INFO fileInfo)\r\n        {\r\n            cbStruct = (uint)Marshal.SizeOf(typeof(WINTRUST_DATA));\r\n            pInfoStruct = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(WINTRUST_FILE_INFO)));\r\n            Marshal.StructureToPtr(fileInfo, pInfoStruct, false);\r\n            dwUnionChoice = UnionChoice.File;\r\n            pPolicyCallbackData = IntPtr.Zero;\r\n            pSIPCallbackData = IntPtr.Zero;\r\n            dwUIChoice = UiChoice.NoUI;\r\n            fdwRevocationChecks = RevocationCheckFlags.None;\r\n            dwStateAction = StateAction.Ignore;\r\n            hWVTStateData = IntPtr.Zero;\r\n            pwszURLReference = IntPtr.Zero;\r\n            dwProvFlags = TrustProviderFlags.Safer;\r\n            dwUIContext = UIContext.Execute;\r\n        }\r\n\r\n        public uint cbStruct;\r\n        public IntPtr pPolicyCallbackData;\r\n        public IntPtr pSIPCallbackData;\r\n        public UiChoice dwUIChoice;\r\n        public RevocationCheckFlags fdwRevocationChecks;\r\n        public UnionChoice dwUnionChoice;\r\n        public IntPtr pInfoStruct;\r\n        public StateAction dwStateAction;\r\n        public IntPtr hWVTStateData;\r\n        private IntPtr pwszURLReference;\r\n        public TrustProviderFlags dwProvFlags;\r\n        public UIContext dwUIContext;\r\n\r\n        public void Dispose()\r\n        {\r\n            Dispose(true);\r\n        }\r\n\r\n        private void Dispose(bool disposing)\r\n        {\r\n            if (dwUnionChoice == UnionChoice.File)\r\n            {\r\n                WINTRUST_FILE_INFO info = new WINTRUST_FILE_INFO();\r\n                Marshal.PtrToStructure(pInfoStruct, info);\r\n                info.Dispose();\r\n                Marshal.DestroyStructure(pInfoStruct, typeof(WINTRUST_FILE_INFO));\r\n            }\r\n\r\n            Marshal.FreeHGlobal(pInfoStruct);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Native/winuser.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Native\r\n{\r\n    public static class Winuser\r\n    {\r\n        public const int GWL_STYLE = -16;\r\n        public const int WS_SYSMENU = 0x80000;\r\n        public const int WM_HOTKEY = 0x0312;\r\n\r\n        public static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);\r\n        public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);\r\n        public static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);\r\n        public static readonly IntPtr HWND_TOP = new IntPtr(0);\r\n        public static readonly IntPtr HWND_BOTTOM = new IntPtr(1);\r\n        public const uint WM_QUERYENDSESSION = 0x11;\r\n        public const uint WM_ENDSESSION = 0x16;\r\n        public const uint ENDSESSION_CLOSEAPP = 0x1;\r\n\r\n        // http://msdn.microsoft.com/en-us/library/windows/desktop/ms646244(v=vs.85).aspx\r\n        public const uint WM_MOUSEACTIVATE = 0x0021;\r\n        public const uint WM_MOUSEMOVE = 0x0200;\r\n        public const uint WM_LBUTTONDOWN = 0x0201;\r\n        public const uint WM_LBUTTONUP = 0x0202;\r\n        public const uint WM_LBUTTONDBLCLK = 0x0203;\r\n        public const uint WM_RBUTTONDOWN = 0x0204;\r\n        public const uint WM_RBUTTONUP = 0x0205;\r\n        public const uint WM_RBUTTONDBLCLK = 0x0206;\r\n        public const uint WM_MBUTTONDOWN = 0x0207;\r\n        public const uint WM_MBUTTONUP = 0x0208;\r\n        public const uint WM_MBUTTONDBLCLK = 0x0209;\r\n\r\n        public const uint MK_CONTROL = 0x0008;    // The CTRL key is down.\r\n        public const uint MK_LBUTTON = 0x0001;    // The left mouse button is down.\r\n        public const uint MK_MBUTTON = 0x0010;    // The middle mouse button is down.\r\n        public const uint MK_RBUTTON = 0x0002;    // The right mouse button is down.\r\n        public const uint MK_SHIFT = 0x0004;    // The SHIFT key is down.\r\n\r\n        public const uint MOD_NONE = 0x0000;    //(none)\r\n        public const uint MOD_ALT = 0x0001;     //ALT\r\n        public const uint MOD_CONTROL = 0x0002; //CTRL\r\n        public const uint MOD_SHIFT = 0x0004;   //SHIFT\r\n        public const uint MOD_WIN = 0x0008;     //WINDOWS\r\n\r\n        public const uint WM_KEYDOWN = 0x0100;\r\n        public const uint WM_KEYUP = 0x0101;\r\n        public const uint WM_SYSKEYDOWN = 0x0104;\r\n        public const uint WM_SYSKEYUP = 0x0105;\r\n\r\n        // http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx\r\n        public const uint VK_LBUTTON = 0x01; // Left mouse button\r\n        public const uint VK_RBUTTON = 0x02; // Right mouse button\r\n        public const uint VK_CANCEL = 0x03; // Control-break processing\r\n        public const uint VK_MBUTTON = 0x04; // Middle mouse button (three-button mouse)\r\n        public const uint VK_XBUTTON1 = 0x05; // X1 mouse button\r\n        public const uint VK_XBUTTON2 = 0x06; // X2 mouse button\r\n        public const uint VK_0x07 = 0x07; // Undefined\r\n        public const uint VK_BACK = 0x08; // BACKSPACE key\r\n        public const uint VK_TAB = 0x09; // TAB key\r\n        public const uint VK_0x0A = 0x0A; // Reserved\r\n        public const uint VK_0x0B = 0x0B; // Reserved\r\n        public const uint VK_CLEAR = 0x0C; // CLEAR key\r\n        public const uint VK_RETURN = 0x0D; // ENTER key\r\n        public const uint VK_0x0E = 0x0E; // Undefined\r\n        public const uint VK_0x0F = 0x0F; // Undefined\r\n        public const uint VK_SHIFT = 0x10; // SHIFT key\r\n        public const uint VK_CONTROL = 0x11; // CTRL key\r\n        public const uint VK_MENU = 0x12; // ALT key\r\n        public const uint VK_PAUSE = 0x13; // PAUSE key\r\n        public const uint VK_CAPITAL = 0x14; // CAPS LOCK key\r\n        public const uint VK_KANA = 0x15; // IME Kana mode\r\n        public const uint VK_HANGUEL = 0x15; // IME Hanguel mode (maintained for compatibility; use VK_HANGUL)\r\n        public const uint VK_HANGUL = 0x15; // IME Hangul mode\r\n        public const uint VK_0x16 = 0x16; // Undefined\r\n        public const uint VK_JUNJA = 0x17; // IME Junja mode\r\n        public const uint VK_FINAL = 0x18; // IME final mode\r\n        public const uint VK_HANJA = 0x19; // IME Hanja mode\r\n        public const uint VK_KANJI = 0x19; // IME Kanji mode\r\n        public const uint VK_0x1A = 0x1A; // Undefined\r\n        public const uint VK_ESCAPE = 0x1B; // ESC key\r\n        public const uint VK_CONVERT = 0x1C; // IME convert\r\n        public const uint VK_NONCONVERT = 0x1D; // IME nonconvert\r\n        public const uint VK_ACCEPT = 0x1E; // IME accept\r\n        public const uint VK_MODECHANGE = 0x1F; // IME mode change request\r\n        public const uint VK_SPACE = 0x20; // SPACEBAR\r\n        public const uint VK_PRIOR = 0x21; // PAGE UP key\r\n        public const uint VK_NEXT = 0x22; // PAGE DOWN key\r\n        public const uint VK_END = 0x23; // END key\r\n        public const uint VK_HOME = 0x24; // HOME key\r\n        public const uint VK_LEFT = 0x25; // LEFT ARROW key\r\n        public const uint VK_UP = 0x26; // UP ARROW key\r\n        public const uint VK_RIGHT = 0x27; // RIGHT ARROW key\r\n        public const uint VK_DOWN = 0x28; // DOWN ARROW key\r\n        public const uint VK_SELECT = 0x29; // SELECT key\r\n        public const uint VK_PRINT = 0x2A; // PRINT key\r\n        public const uint VK_EXECUTE = 0x2B; // EXECUTE key\r\n        public const uint VK_SNAPSHOT = 0x2C; // PRINT SCREEN key\r\n        public const uint VK_INSERT = 0x2D; // INS key\r\n        public const uint VK_DELETE = 0x2E; // DEL key\r\n        public const uint VK_HELP = 0x2F; // HELP key\r\n        public const uint VK_0x30 = 0x30; // 0 key\r\n        public const uint VK_0x31 = 0x31; // 1 key\r\n        public const uint VK_0x32 = 0x32; // 2 key\r\n        public const uint VK_0x33 = 0x33; // 3 key\r\n        public const uint VK_0x34 = 0x34; // 4 key\r\n        public const uint VK_0x35 = 0x35; // 5 key\r\n        public const uint VK_0x36 = 0x36; // 6 key\r\n        public const uint VK_0x37 = 0x37; // 7 key\r\n        public const uint VK_0x38 = 0x38; // 8 key\r\n        public const uint VK_0x39 = 0x39; // 9 key\r\n        public const uint VK_0x3A = 0x3A; // Undefined\r\n        public const uint VK_0x3B = 0x3B; // Undefined\r\n        public const uint VK_0x3C = 0x3C; // Undefined\r\n        public const uint VK_0x3D = 0x3D; // Undefined\r\n        public const uint VK_0x3E = 0x3E; // Undefined\r\n        public const uint VK_0x3F = 0x3F; // Undefined\r\n        public const uint VK_0x40 = 0x40; // Undefined\r\n        public const uint VK_0x41 = 0x41; // A key\r\n        public const uint VK_0x42 = 0x42; // B key\r\n        public const uint VK_0x43 = 0x43; // C key\r\n        public const uint VK_0x44 = 0x44; // D key\r\n        public const uint VK_0x45 = 0x45; // E key\r\n        public const uint VK_0x46 = 0x46; // F key\r\n        public const uint VK_0x47 = 0x47; // G key\r\n        public const uint VK_0x48 = 0x48; // H key\r\n        public const uint VK_0x49 = 0x49; // I key\r\n        public const uint VK_0x4A = 0x4A; // J key\r\n        public const uint VK_0x4B = 0x4B; // K key\r\n        public const uint VK_0x4C = 0x4C; // L key\r\n        public const uint VK_0x4D = 0x4D; // M key\r\n        public const uint VK_0x4E = 0x4E; // N key\r\n        public const uint VK_0x4F = 0x4F; // O key\r\n        public const uint VK_0x50 = 0x50; // P key\r\n        public const uint VK_0x51 = 0x51; // Q key\r\n        public const uint VK_0x52 = 0x52; // R key\r\n        public const uint VK_0x53 = 0x53; // S key\r\n        public const uint VK_0x54 = 0x54; // T key\r\n        public const uint VK_0x55 = 0x55; // U key\r\n        public const uint VK_0x56 = 0x56; // V key\r\n        public const uint VK_0x57 = 0x57; // W key\r\n        public const uint VK_0x58 = 0x58; // X key\r\n        public const uint VK_0x59 = 0x59; // Y key\r\n        public const uint VK_0x5A = 0x5A; // Z key\r\n        public const uint VK_LWIN = 0x5B; // Left Windows key (Natural keyboard)\r\n        public const uint VK_RWIN = 0x5C; // Right Windows key (Natural keyboard)\r\n        public const uint VK_APPS = 0x5D; // Applications key (Natural keyboard)\r\n        public const uint VK_0x5E = 0x5E; // Reserved\r\n        public const uint VK_SLEEP = 0x5F; // Computer Sleep key\r\n        public const uint VK_NUMPAD0 = 0x60; // Numeric keypad 0 key\r\n        public const uint VK_NUMPAD1 = 0x61; // Numeric keypad 1 key\r\n        public const uint VK_NUMPAD2 = 0x62; // Numeric keypad 2 key\r\n        public const uint VK_NUMPAD3 = 0x63; // Numeric keypad 3 key\r\n        public const uint VK_NUMPAD4 = 0x64; // Numeric keypad 4 key\r\n        public const uint VK_NUMPAD5 = 0x65; // Numeric keypad 5 key\r\n        public const uint VK_NUMPAD6 = 0x66; // Numeric keypad 6 key\r\n        public const uint VK_NUMPAD7 = 0x67; // Numeric keypad 7 key\r\n        public const uint VK_NUMPAD8 = 0x68; // Numeric keypad 8 key\r\n        public const uint VK_NUMPAD9 = 0x69; // Numeric keypad 9 key\r\n        public const uint VK_MULTIPLY = 0x6A; // Multiply key\r\n        public const uint VK_ADD = 0x6B; // Add key\r\n        public const uint VK_SEPARATOR = 0x6C; // Separator key\r\n        public const uint VK_SUBTRACT = 0x6D; // Subtract key\r\n        public const uint VK_DECIMAL = 0x6E; // Decimal key\r\n        public const uint VK_DIVIDE = 0x6F; // Divide key\r\n        public const uint VK_F1 = 0x70; // F1 key\r\n        public const uint VK_F2 = 0x71; // F2 key\r\n        public const uint VK_F3 = 0x72; // F3 key\r\n        public const uint VK_F4 = 0x73; // F4 key\r\n        public const uint VK_F5 = 0x74; // F5 key\r\n        public const uint VK_F6 = 0x75; // F6 key\r\n        public const uint VK_F7 = 0x76; // F7 key\r\n        public const uint VK_F8 = 0x77; // F8 key\r\n        public const uint VK_F9 = 0x78; // F9 key\r\n        public const uint VK_F10 = 0x79; // F10 key\r\n        public const uint VK_F11 = 0x7A; // F11 key\r\n        public const uint VK_F12 = 0x7B; // F12 key\r\n        public const uint VK_F13 = 0x7C; // F13 key\r\n        public const uint VK_F14 = 0x7D; // F14 key\r\n        public const uint VK_F15 = 0x7E; // F15 key\r\n        public const uint VK_F16 = 0x7F; // F16 key\r\n        public const uint VK_F17 = 0x80; // F17 key\r\n        public const uint VK_F18 = 0x81; // F18 key\r\n        public const uint VK_F19 = 0x82; // F19 key\r\n        public const uint VK_F20 = 0x83; // F20 key\r\n        public const uint VK_F21 = 0x84; // F21 key\r\n        public const uint VK_F22 = 0x85; // F22 key\r\n        public const uint VK_F23 = 0x86; // F23 key\r\n        public const uint VK_F24 = 0x87; // F24 key\r\n        public const uint VK_0x88 = 0x88; // Unassigned\r\n        public const uint VK_0x89 = 0x89; // Unassigned\r\n        public const uint VK_0x8A = 0x8A; // Unassigned\r\n        public const uint VK_0x8B = 0x8B; // Unassigned\r\n        public const uint VK_0x8C = 0x8C; // Unassigned\r\n        public const uint VK_0x8D = 0x8D; // Unassigned\r\n        public const uint VK_0x8E = 0x8E; // Unassigned\r\n        public const uint VK_0x8F = 0x8F; // Unassigned\r\n        public const uint VK_NUMLOCK = 0x90; // NUM LOCK key\r\n        public const uint VK_SCROLL = 0x91; // SCROLL LOCK key\r\n        public const uint VK_0x92 = 0x92; // OEM specific\r\n        public const uint VK_0x93 = 0x93; // OEM specific\r\n        public const uint VK_0x94 = 0x94; // OEM specific\r\n        public const uint VK_0x95 = 0x95; // OEM specific\r\n        public const uint VK_0x96 = 0x96; // OEM specific\r\n        public const uint VK_0x97 = 0x97; // Unassigned\r\n        public const uint VK_0x98 = 0x98; // Unassigned\r\n        public const uint VK_0x99 = 0x99; // Unassigned\r\n        public const uint VK_0x9A = 0x9A; // Unassigned\r\n        public const uint VK_0x9B = 0x9B; // Unassigned\r\n        public const uint VK_0x9C = 0x9C; // Unassigned\r\n        public const uint VK_0x9D = 0x9D; // Unassigned\r\n        public const uint VK_0x9E = 0x9E; // Unassigned\r\n        public const uint VK_0x9F = 0x9F; // Unassigned\r\n        public const uint VK_LSHIFT = 0xA0; // Left SHIFT key\r\n        public const uint VK_RSHIFT = 0xA1; // Right SHIFT key\r\n        public const uint VK_LCONTROL = 0xA2; // Left CONTROL key\r\n        public const uint VK_RCONTROL = 0xA3; // Right CONTROL key\r\n        public const uint VK_LMENU = 0xA4; // Left MENU key\r\n        public const uint VK_RMENU = 0xA5; // Right MENU key\r\n        public const uint VK_BROWSER_BACK = 0xA6; // Browser Back key\r\n        public const uint VK_BROWSER_FORWARD = 0xA7; // Browser Forward key\r\n        public const uint VK_BROWSER_REFRESH = 0xA8; // Browser Refresh key\r\n        public const uint VK_BROWSER_STOP = 0xA9; // Browser Stop key\r\n        public const uint VK_BROWSER_SEARCH = 0xAA; // Browser Search key\r\n        public const uint VK_BROWSER_FAVORITES = 0xAB; // Browser Favorites key\r\n        public const uint VK_BROWSER_HOME = 0xAC; // Browser Start and Home key\r\n        public const uint VK_VOLUME_MUTE = 0xAD; // Volume Mute key\r\n        public const uint VK_VOLUME_DOWN = 0xAE; // Volume Down key\r\n        public const uint VK_VOLUME_UP = 0xAF; // Volume Up key\r\n        public const uint VK_MEDIA_NEXT_TRACK = 0xB0; // Next Track key\r\n        public const uint VK_MEDIA_PREV_TRACK = 0xB1; // Previous Track key\r\n        public const uint VK_MEDIA_STOP = 0xB2; // Stop Media key\r\n        public const uint VK_MEDIA_PLAY_PAUSE = 0xB3; // Play/Pause Media key\r\n        public const uint VK_LAUNCH_MAIL = 0xB4; // Start Mail key\r\n        public const uint VK_LAUNCH_MEDIA_SELECT = 0xB5; // Select Media key\r\n        public const uint VK_LAUNCH_APP1 = 0xB6; // Start Application 1 key\r\n        public const uint VK_LAUNCH_APP2 = 0xB7; // Start Application 2 key\r\n        public const uint VK_0xB8 = 0xB8; // Reserved\r\n        public const uint VK_0xB9 = 0xB9; // Reserved\r\n        public const uint VK_OEM_1 = 0xBA; // Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ';:' key\r\n        public const uint VK_OEM_PLUS = 0xBB; // For any country/region, the '+' key\r\n        public const uint VK_OEM_COMMA = 0xBC; // For any country/region, the ',' key\r\n        public const uint VK_OEM_MINUS = 0xBD; // For any country/region, the '-' key\r\n        public const uint VK_OEM_PERIOD = 0xBE; // For any country/region, the '.' key\r\n        public const uint VK_OEM_2 = 0xBF; // Used for miscellaneous characters; it can vary by keyboard.\r\n        public const uint VK_OEM_3 = 0xC0; // Used for miscellaneous characters; it can vary by keyboard.\r\n        public const uint VK_0xC1 = 0xC1; // Reserved\r\n        public const uint VK_0xC2 = 0xC2; // Reserved\r\n        public const uint VK_0xC3 = 0xC3; // Reserved\r\n        public const uint VK_0xC4 = 0xC4; // Reserved\r\n        public const uint VK_0xC5 = 0xC5; // Reserved\r\n        public const uint VK_0xC6 = 0xC6; // Reserved\r\n        public const uint VK_0xC7 = 0xC7; // Reserved\r\n        public const uint VK_0xC8 = 0xC8; // Reserved\r\n        public const uint VK_0xC9 = 0xC9; // Reserved\r\n        public const uint VK_0xCA = 0xCA; // Reserved\r\n        public const uint VK_0xCB = 0xCB; // Reserved\r\n        public const uint VK_0xCC = 0xCC; // Reserved\r\n        public const uint VK_0xCD = 0xCD; // Reserved\r\n        public const uint VK_0xCE = 0xCE; // Reserved\r\n        public const uint VK_0xCF = 0xCF; // Reserved\r\n        public const uint VK_0xD0 = 0xD0; // Reserved\r\n        public const uint VK_0xD1 = 0xD1; // Reserved\r\n        public const uint VK_0xD2 = 0xD2; // Reserved\r\n        public const uint VK_0xD3 = 0xD3; // Reserved\r\n        public const uint VK_0xD4 = 0xD4; // Reserved\r\n        public const uint VK_0xD5 = 0xD5; // Reserved\r\n        public const uint VK_0xD6 = 0xD6; // Reserved\r\n        public const uint VK_0xD7 = 0xD7; // Reserved\r\n        public const uint VK_0xD8 = 0xD8; // Unassigned\r\n        public const uint VK_0xD9 = 0xD9; // Unassigned\r\n        public const uint VK_0xDA = 0xDA; // Unassigned\r\n        public const uint VK_OEM_4 = 0xDB; // Used for miscellaneous characters; it can vary by keyboard.\r\n        public const uint VK_OEM_5 = 0xDC; // Used for miscellaneous characters; it can vary by keyboard.\r\n        public const uint VK_OEM_6 = 0xDD; // Used for miscellaneous characters; it can vary by keyboard.\r\n        public const uint VK_OEM_7 = 0xDE; // Used for miscellaneous characters; it can vary by keyboard.\r\n        public const uint VK_OEM_8 = 0xDF; // Used for miscellaneous characters; it can vary by keyboard.\r\n        public const uint VK_0xE0 = 0xE0; // Reserved\r\n        public const uint VK_0xE1 = 0xE1; // OEM specific\r\n        public const uint VK_OEM_102 = 0xE2; // Either the angle bracket key or the backslash key on the RT 102-key keyboard\r\n        public const uint VK_0xE3 = 0xE3; // OEM specific\r\n        public const uint VK_0xE4 = 0xE4; // OEM specific\r\n        public const uint VK_PROCESSKEY = 0xE5; // IME PROCESS key\r\n        public const uint VK_0xE6 = 0xE6; // OEM specific\r\n        public const uint VK_PACKET = 0xE7; // Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT,SendInput, WM_KEYDOWN, and WM_KEYUP\r\n        public const uint VK_0xE8 = 0xE8; // Unassigned\r\n        public const uint VK_0xE9 = 0xE9; // OEM specific\r\n        public const uint VK_0xEA = 0xEA; // OEM specific\r\n        public const uint VK_0xEB = 0xEB; // OEM specific\r\n        public const uint VK_0xEC = 0xEC; // OEM specific\r\n        public const uint VK_0xED = 0xED; // OEM specific\r\n        public const uint VK_0xEE = 0xEE; // OEM specific\r\n        public const uint VK_0xEF = 0xEF; // OEM specific\r\n        public const uint VK_0xF0 = 0xF0; // OEM specific\r\n        public const uint VK_0xF1 = 0xF1; // OEM specific\r\n        public const uint VK_0xF2 = 0xF2; // OEM specific\r\n        public const uint VK_0xF3 = 0xF3; // OEM specific\r\n        public const uint VK_0xF4 = 0xF4; // OEM specific\r\n        public const uint VK_0xF5 = 0xF5; // OEM specific\r\n        public const uint VK_ATTN = 0xF6; // Attn key\r\n        public const uint VK_CRSEL = 0xF7; // CrSel key\r\n        public const uint VK_EXSEL = 0xF8; // ExSel key\r\n        public const uint VK_EREOF = 0xF9; // Erase EOF key\r\n        public const uint VK_PLAY = 0xFA; // Play key\r\n        public const uint VK_ZOOM = 0xFB; // Zoom key\r\n        public const uint VK_NONAME = 0xFC; // Reserved\r\n        public const uint VK_PA1 = 0xFD; // PA1 key\r\n        public const uint VK_OEM_CLEAR = 0xFE; // Clear key\r\n    }\r\n\r\n    public enum QUERY_DEVICE_CONFIG_FLAGS : uint\r\n    {\r\n        QDC_ALL_PATHS = 0x00000001,\r\n        QDC_ONLY_ACTIVE_PATHS = 0x00000002,\r\n        QDC_DATABASE_CURRENT = 0x00000004\r\n    }\r\n\r\n    [Flags]\r\n    public enum SWP\r\n    {\r\n        ASYNCWINDOWPOS = 0x4000,\r\n        DEFERERASE = 0x2000,\r\n        DRAWFRAME = 0x0020,\r\n        FRAMECHANGED = 0x0020,\r\n        HIDEWINDOW = 0x0080,\r\n        NOACTIVATE = 0x0010,\r\n        NOCOPYBITS = 0x0100,\r\n        NOMOVE = 0x0002,\r\n        NOOWNERZORDER = 0x0200,\r\n        NOREDRAW = 0x0008,\r\n        NOREPOSITION = 0x0200,\r\n        NOSENDCHANGING = 0x0400,\r\n        NOSIZE = 0x0001,\r\n        NOZORDER = 0x0004,\r\n        SHOWWINDOW = 0x0040,\r\n        TOPMOST = NOACTIVATE | NOOWNERZORDER | NOSIZE | NOMOVE | NOREDRAW | NOSENDCHANGING\r\n    }\r\n\r\n    public enum MonitorOptions : uint\r\n    {\r\n        MONITOR_DEFAULTTONULL = 0x00000000,\r\n        MONITOR_DEFAULTTOPRIMARY = 0x00000001,\r\n        MONITOR_DEFAULTTONEAREST = 0x00000002\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]\r\n    public class MONITORINFO\r\n    {\r\n        public int cbSize = Marshal.SizeOf(typeof(MONITORINFO));\r\n        public RECT rcMonitor = new RECT();\r\n        public RECT rcWork = new RECT();\r\n        public int dwFlags = 0;\r\n    }\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    public struct MINMAXINFO\r\n    {\r\n        public POINT ptReserved;\r\n        public POINT ptMaxSize;\r\n        public POINT ptMaxPosition;\r\n        public POINT ptMinTrackSize;\r\n        public POINT ptMaxTrackSize;\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ObservablePowerStatus.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Threading;\r\nusing System.Windows.Forms;\r\nusing Playnite.Common;\r\nusing System.Windows;\r\n\r\nnamespace Playnite\r\n{\r\n    public enum BatteryChargeLevel\r\n    {\r\n        Critical,\r\n        Low,\r\n        Medium,\r\n        High\r\n    }\r\n\r\n    public class ObservablePowerStatus : ObservableObject, IDisposable\r\n    {\r\n        private SynchronizationContext context;\r\n        private CancellationTokenSource watcherToken;\r\n        private Task currentTask;\r\n\r\n        public int PercentCharge\r\n        {\r\n            get => (int)(SystemInformation.PowerStatus.BatteryLifePercent * 100);\r\n        }\r\n\r\n        public BatteryChargeLevel Charge\r\n        {\r\n            get\r\n            {\r\n                var charge = PercentCharge;\r\n                if (charge > 85)\r\n                {\r\n                    return BatteryChargeLevel.High;\r\n                }\r\n                else if (charge > 40)\r\n                {\r\n                    return BatteryChargeLevel.Medium;\r\n                }\r\n                else if (charge > 10)\r\n                {\r\n                    return BatteryChargeLevel.Low;\r\n                }\r\n                else\r\n                {\r\n                    return BatteryChargeLevel.Critical;\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool IsCharging\r\n        {\r\n            get => SystemInformation.PowerStatus.BatteryChargeStatus.HasFlag(BatteryChargeStatus.Charging);\r\n        }\r\n\r\n        public bool IsBatteryAvailable\r\n        {\r\n            get => !SystemInformation.PowerStatus.BatteryChargeStatus.HasFlag(BatteryChargeStatus.NoSystemBattery);\r\n        }\r\n\r\n        public ObservablePowerStatus()\r\n        {\r\n            context = SynchronizationContext.Current;\r\n            if (!DesignerTools.IsInDesignMode && IsBatteryAvailable)\r\n            {\r\n                StartWatcher();\r\n            }\r\n        }\r\n\r\n        public async void StartWatcher()\r\n        {\r\n            watcherToken?.Cancel();\r\n            if (currentTask != null)\r\n            {\r\n                await currentTask;\r\n            }\r\n\r\n            watcherToken = new CancellationTokenSource();\r\n            currentTask = Task.Run(async () =>\r\n            {\r\n                while (true)\r\n                {\r\n                    if (watcherToken.IsCancellationRequested)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    context.Post((a) => OnPropertyChanged(nameof(PercentCharge)), null);\r\n                    context.Post((a) => OnPropertyChanged(nameof(Charge)), null);\r\n                    context.Post((a) => OnPropertyChanged(nameof(IsCharging)), null);\r\n                    await Task.Delay(10000);\r\n                }\r\n            }, watcherToken.Token);\r\n        }\r\n\r\n        public async void StopWatcher()\r\n        {\r\n            watcherToken?.Cancel();\r\n            if (currentTask != null)\r\n            {\r\n                await currentTask;\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            StopWatcher();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ObservableTime.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Threading;\r\nusing Playnite.Common;\r\nusing System.Windows;\r\n\r\nnamespace Playnite\r\n{\r\n    public class ObservableTime : ObservableObject\r\n    {\r\n        private SynchronizationContext context;\r\n        private CancellationTokenSource watcherToken;\r\n        private Task currentTask;\r\n\r\n        public string Time\r\n        {\r\n            get => DateTime.Now.ToString(Common.Constants.TimeUiFormat);\r\n        }\r\n\r\n        public ObservableTime()\r\n        {\r\n            context = SynchronizationContext.Current;\r\n            if (!DesignerTools.IsInDesignMode)\r\n            {\r\n                StartWatcher();\r\n            }\r\n        }\r\n\r\n        public async void StartWatcher()\r\n        {\r\n            watcherToken?.Cancel();\r\n            if (currentTask != null)\r\n            {\r\n                await currentTask;\r\n            }\r\n\r\n            watcherToken = new CancellationTokenSource();\r\n            currentTask = Task.Run(async () =>\r\n            {\r\n                while (true)\r\n                {\r\n                    if (watcherToken.IsCancellationRequested)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    context.Post((a) => OnPropertyChanged(nameof(Time)), null);\r\n                    await Task.Delay(10000);\r\n                }\r\n            }, watcherToken.Token);\r\n        }\r\n\r\n        public async void StopWatcher()\r\n        {\r\n            watcherToken?.Cancel();\r\n            if (currentTask != null)\r\n            {\r\n                await currentTask;\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            StopWatcher();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/PipeServer.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.IO.Pipes;\r\nusing System.Linq;\r\nusing System.ServiceModel;\r\nusing System.ServiceModel.Description;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public delegate void CommandExecutedEventHandler(object sender, CommandExecutedEventArgs args);\r\n\r\n    public class CommandExecutedEventArgs : EventArgs\r\n    {\r\n        public CmdlineCommand Command\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public string Args\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public CommandExecutedEventArgs()\r\n        {\r\n        }\r\n\r\n        public CommandExecutedEventArgs(CmdlineCommand command, string args)\r\n        {\r\n            Command = command;\r\n            Args = args;\r\n        }\r\n    }\r\n\r\n    [ServiceContract]\r\n    public interface IPipeService\r\n    {\r\n        [OperationContract(IsOneWay = true)]\r\n        void InvokeCommand(CmdlineCommand command, string args);\r\n    }\r\n\r\n    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]\r\n    public class PipeService : IPipeService\r\n    {\r\n        private readonly SynchronizationContext syncContext;\r\n        public event CommandExecutedEventHandler CommandExecuted;\r\n\r\n        public PipeService()\r\n        {\r\n            syncContext = SynchronizationContext.Current;\r\n        }\r\n\r\n        public void InvokeCommand(CmdlineCommand command, string args)\r\n        {\r\n            // We don't want to block this call because it causes issues if some sync operation that shuts down server is also called.\r\n            // For example, mode switch or instance shutdown calls are stopping server,\r\n            // which results in serviceHost.Close() timeout, since server would be still waiting for InvokeCommand to finish.\r\n            Task.Run(async () =>\r\n            {\r\n                await Task.Delay(100);\r\n                syncContext.Post(_ => CommandExecuted?.Invoke(this, new CommandExecutedEventArgs(command, args)), null);\r\n            });\r\n        }\r\n    }\r\n\r\n    public class PipeServer\r\n    {\r\n        private string endpoint;\r\n        private ServiceHost serviceHost;\r\n\r\n        public PipeServer(string endpoint)\r\n        {\r\n            this.endpoint = endpoint;\r\n        }\r\n\r\n        public void StartServer(IPipeService service)\r\n        {\r\n            serviceHost = new ServiceHost(service, new Uri[] { new Uri(endpoint) });\r\n            serviceHost.AddServiceEndpoint(typeof(IPipeService), new NetNamedPipeBinding(), \"PlayniteService\");\r\n            serviceHost.Open();\r\n        }\r\n\r\n        public void StopServer()\r\n        {\r\n            serviceHost.Close();\r\n        }\r\n    }\r\n\r\n    public class PipeClient : ClientBase<IPipeService>\r\n    {\r\n        public PipeClient(string endpoint)\r\n            : base(new ServiceEndpoint(ContractDescription.GetContract(typeof(IPipeService)), new NetNamedPipeBinding(), new EndpointAddress(endpoint.TrimEnd('/') + @\"/PlayniteService\")))\r\n        {\r\n        }\r\n\r\n        public void InvokeCommand(CmdlineCommand command, string args)\r\n        {\r\n            Channel.InvokeCommand(command, args);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Playnite.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"..\\packages\\CefSharp.Common.144.0.120\\build\\CefSharp.Common.props\" Condition=\"Exists('..\\packages\\CefSharp.Common.144.0.120\\build\\CefSharp.Common.props')\" />\r\n  <Import Project=\"..\\packages\\chromiumembeddedframework.runtime.win-x86.144.0.12\\build\\chromiumembeddedframework.runtime.win-x86.props\" Condition=\"Exists('..\\packages\\chromiumembeddedframework.runtime.win-x86.144.0.12\\build\\chromiumembeddedframework.runtime.win-x86.props')\" />\r\n  <Import Project=\"..\\packages\\chromiumembeddedframework.runtime.win-x64.144.0.12\\build\\chromiumembeddedframework.runtime.win-x64.props\" Condition=\"Exists('..\\packages\\chromiumembeddedframework.runtime.win-x64.144.0.12\\build\\chromiumembeddedframework.runtime.win-x64.props')\" />\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{AD271E73-8A13-4C4E-BFDC-3076646B59E3}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>Playnite</RootNamespace>\r\n    <AssemblyName>Playnite</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <NuGetPackageImportStamp>\r\n    </NuGetPackageImportStamp>\r\n    <TargetFrameworkProfile />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <DebugType>pdbonly</DebugType>\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\r\n    <Optimize>true</Optimize>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\AngleSharp.0.9.9\\lib\\net45\\AngleSharp.dll</HintPath>\r\n      <Private>True</Private>\r\n    </Reference>\r\n    <Reference Include=\"CefSharp, Version=144.0.120.0, Culture=neutral, PublicKeyToken=40c4b6fc221f4138, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\CefSharp.Common.144.0.120\\lib\\net462\\CefSharp.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"CefSharp.Core, Version=144.0.120.0, Culture=neutral, PublicKeyToken=40c4b6fc221f4138, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\CefSharp.Common.144.0.120\\lib\\net462\\CefSharp.Core.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"CefSharp.OffScreen, Version=144.0.120.0, Culture=neutral, PublicKeyToken=40c4b6fc221f4138, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\CefSharp.OffScreen.144.0.120\\lib\\net462\\CefSharp.OffScreen.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"CefSharp.Wpf, Version=144.0.120.0, Culture=neutral, PublicKeyToken=40c4b6fc221f4138, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\CefSharp.Wpf.144.0.120\\lib\\net462\\CefSharp.Wpf.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"CommandLine, Version=2.8.0.0, Culture=neutral, PublicKeyToken=5a870481e358d379, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\CommandLineParser.2.8.0\\lib\\net461\\CommandLine.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Crc32.NET, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dc0b95cf99bf4e99, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Crc32.NET.1.2.0\\lib\\net20\\Crc32.NET.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"DiscordRPC\">\r\n      <HintPath>..\\..\\references\\DiscordRPC.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Flurl, Version=2.7.1.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Flurl.2.7.1\\lib\\net40\\Flurl.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"HtmlRenderer\">\r\n      <HintPath>..\\..\\references\\HtmlRenderer.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"HtmlRenderer.WPF\">\r\n      <HintPath>..\\..\\references\\HtmlRenderer.WPF.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"LiteDB, Version=4.1.4.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\LiteDB.4.1.4\\lib\\net40\\LiteDB.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Magick.NET-Q8-x86, Version=14.10.0.0, Culture=neutral, PublicKeyToken=2004825badfa91ec, processorArchitecture=X86\">\r\n      <HintPath>..\\packages\\Magick.NET-Q8-x86.14.10.2\\lib\\netstandard20\\Magick.NET-Q8-x86.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Magick.NET.Core, Version=14.10.0.0, Culture=neutral, PublicKeyToken=2004825badfa91ec, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Magick.NET.Core.14.10.2\\lib\\netstandard20\\Magick.NET.Core.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Magick.NET.SystemWindowsMedia, Version=8.0.0.0, Culture=neutral, PublicKeyToken=2004825badfa91ec, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Magick.NET.SystemWindowsMedia.8.0.15\\lib\\net462\\Magick.NET.SystemWindowsMedia.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Markdig, Version=0.18.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Markdig.0.18.0\\lib\\net40\\Markdig.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.Dynamic, Version=1.2.0.0, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\DynamicLanguageRuntime.1.2.1\\lib\\net45\\Microsoft.Dynamic.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\CommonServiceLocator.1.3\\lib\\portable-net4+sl5+netcore45+wpa81+wp8\\Microsoft.Practices.ServiceLocation.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.Scripting, Version=1.2.0.0, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\DynamicLanguageRuntime.1.2.1\\lib\\net45\\Microsoft.Scripting.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.Scripting.Metadata, Version=1.2.0.0, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\DynamicLanguageRuntime.1.2.1\\lib\\net45\\Microsoft.Scripting.Metadata.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.VisualStudio.CodeCoverage.Shim, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\DynamicLanguageRuntime.1.2.1\\lib\\net45\\Microsoft.VisualStudio.CodeCoverage.Shim.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.WindowsAPICodePack, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\WindowsAPICodePack.1.1.0\\lib\\Microsoft.WindowsAPICodePack.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.WindowsAPICodePack.ExtendedLinguisticServices, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\WindowsAPICodePack.1.1.0\\lib\\Microsoft.WindowsAPICodePack.ExtendedLinguisticServices.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.WindowsAPICodePack.Sensors, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\WindowsAPICodePack.1.1.0\\lib\\Microsoft.WindowsAPICodePack.Sensors.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.WindowsAPICodePack.Shell, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\WindowsAPICodePack.1.1.0\\lib\\Microsoft.WindowsAPICodePack.Shell.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.WindowsAPICodePack.ShellExtensions, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\WindowsAPICodePack.1.1.0\\lib\\Microsoft.WindowsAPICodePack.ShellExtensions.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.Xaml.Behaviors, Version=1.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Microsoft.Xaml.Behaviors.Wpf.1.1.39\\lib\\net45\\Microsoft.Xaml.Behaviors.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Nett, Version=0.10.0.0, Culture=neutral, PublicKeyToken=605dcfe7a1d3365b, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Nett.0.10.1\\lib\\Net40\\Nett.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Newtonsoft.Json.10.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\NLog.4.7.6\\lib\\net45\\NLog.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PhotoSauce.MagicScaler, Version=0.11.2.0, Culture=neutral, PublicKeyToken=fc6b9b7b06809481, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\PhotoSauce.MagicScaler.0.11.2\\lib\\net461\\PhotoSauce.MagicScaler.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Polly, Version=5.1.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Polly.5.1.0\\lib\\net45\\Polly.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"Prism, Version=6.3.0.0, Culture=neutral, PublicKeyToken=40ee6c3a2184dc59, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Prism.Core.6.3.0\\lib\\net45\\Prism.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Prism.Wpf, Version=6.3.0.0, Culture=neutral, PublicKeyToken=40ee6c3a2184dc59, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Prism.Wpf.6.3.0\\lib\\net45\\Prism.Wpf.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"protobuf-net, Version=2.0.0.668, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\protobuf-net.2.0.0.668\\lib\\net40\\protobuf-net.dll</HintPath>\r\n      <Private>True</Private>\r\n    </Reference>\r\n    <Reference Include=\"SharpCompress, Version=0.26.0.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\references\\SharpCompress.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"SQLNado\">\r\n      <HintPath>..\\..\\references\\SQLNado.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\System.Buffers.4.5.1\\lib\\net461\\System.Buffers.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\r\n    <Reference Include=\"System.configuration\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Drawing\" />\r\n    <Reference Include=\"System.IO.Abstractions, Version=2.1.0.227, Culture=neutral, PublicKeyToken=96bf224d23c43e59, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\System.IO.Abstractions.2.1.0.227\\lib\\net40\\System.IO.Abstractions.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.IO.Compression\" />\r\n    <Reference Include=\"System.IO.Compression.FileSystem\" />\r\n    <Reference Include=\"System.Management\" />\r\n    <Reference Include=\"System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\System.Memory.4.5.4\\lib\\net461\\System.Memory.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Numerics\" />\r\n    <Reference Include=\"System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\System.Numerics.Vectors.4.5.0\\lib\\net46\\System.Numerics.Vectors.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\System.Runtime.CompilerServices.Unsafe.4.5.3\\lib\\net461\\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\System.Runtime.InteropServices.RuntimeInformation.4.3.0\\lib\\net45\\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Runtime.Serialization\" />\r\n    <Reference Include=\"System.ServiceModel\" />\r\n    <Reference Include=\"System.ServiceProcess\" />\r\n    <Reference Include=\"System.Transactions\" />\r\n    <Reference Include=\"System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\System.ValueTuple.4.5.0\\lib\\net461\\System.ValueTuple.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Web\" />\r\n    <Reference Include=\"System.Windows.Forms\" />\r\n    <Reference Include=\"System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Prism.Wpf.6.3.0\\lib\\net45\\System.Windows.Interactivity.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Xaml\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"System.Management.Automation\" />\r\n    <Reference Include=\"Windows\">\r\n      <HintPath>..\\..\\references\\Windows.winmd</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"WindowsBase\" />\r\n    <Reference Include=\"YamlDotNet, Version=5.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\YamlDotNet.5.4.0\\lib\\net45\\YamlDotNet.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Addons\\Addons.cs\" />\r\n    <Compile Include=\"API\\AddonsAPI.cs\" />\r\n    <Compile Include=\"API\\DatabaseAPI.cs\" />\r\n    <Compile Include=\"API\\DesignData\\DesignNotificationsAPI.cs\" />\r\n    <Compile Include=\"API\\DesignData\\DesignPlayniteAPI.cs\" />\r\n    <Compile Include=\"API\\NotificationsAPI.cs\" />\r\n    <Compile Include=\"API\\PlayniteSettingsAPI.cs\" />\r\n    <Compile Include=\"API\\PlayniteAPI.cs\" />\r\n    <Compile Include=\"API\\PlayniteInfoAPI.cs\" />\r\n    <Compile Include=\"API\\PlaynitePathsAPI.cs\" />\r\n    <Compile Include=\"Archive.cs\" />\r\n    <Compile Include=\"Audio.cs\" />\r\n    <Compile Include=\"Backup.cs\" />\r\n    <Compile Include=\"Behaviors\\ScrollViewerBehaviours.cs\" />\r\n    <Compile Include=\"Behaviors\\SelectorBehaviors.cs\" />\r\n    <Compile Include=\"Common\\CueSheet.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\Dictionary.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\KeyExtensions.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\NetExtensions.cs\" />\r\n    <Compile Include=\"Common\\GdiFile.cs\" />\r\n    <Compile Include=\"Common\\M3U.cs\" />\r\n    <Compile Include=\"Common\\Network.cs\" />\r\n    <Compile Include=\"Controls\\HotKeyBox.cs\" />\r\n    <Compile Include=\"Converters\\NullableUlongBytesSizeToStringConverter.cs\" />\r\n    <Compile Include=\"Converters\\TicksToTimeSpanConverter.cs\" />\r\n    <Compile Include=\"Database\\GameDatabase_Filters.cs\" />\r\n    <Compile Include=\"DateTimes.cs\" />\r\n    <Compile Include=\"Extensions\\Markup\\PluginConverter.cs\" />\r\n    <Compile Include=\"HdrUtilities.cs\" />\r\n    <Compile Include=\"ItemSelector.cs\" />\r\n    <Compile Include=\"MenuItems.cs\" />\r\n    <Compile Include=\"HotKey.cs\" />\r\n    <Compile Include=\"MenuHelpers.cs\" />\r\n    <Compile Include=\"SDL2.cs\" />\r\n    <Compile Include=\"SDL2_mixer.cs\" />\r\n    <Compile Include=\"Settings\\SearchWindowVisibilitySettings.cs\" />\r\n    <Compile Include=\"SortableNameConverter.cs\" />\r\n    <Compile Include=\"Common\\FileSystem_Checksum.cs\" />\r\n    <Compile Include=\"Controls\\ExtendedDataGrid.cs\" />\r\n    <Compile Include=\"ControlTemplateTools.cs\" />\r\n    <Compile Include=\"Converters\\GenericTypeConverter.cs\" />\r\n    <Compile Include=\"Converters\\ObjectEqualityToBoolConverter.cs\" />\r\n    <Compile Include=\"Converters\\NumericConverters.cs\" />\r\n    <Compile Include=\"Database\\Collections\\GameScannersCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\ImportExclusionsCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\FilterPresetsCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\CompletionStatusesCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\LiteDBFileReaderV7.cs\" />\r\n    <Compile Include=\"Database\\OldModels\\Ver2.cs\" />\r\n    <Compile Include=\"Emulators\\DatModels.cs\" />\r\n    <Compile Include=\"Emulators\\Emulation.cs\" />\r\n    <Compile Include=\"Emulators\\EmulationDatabase.cs\" />\r\n    <Compile Include=\"Emulators\\Scanner.cs\" />\r\n    <Compile Include=\"Extensions\\ControlExtensions.cs\" />\r\n    <Compile Include=\"Extensions\\Markup\\PluginSettings.cs\" />\r\n    <Compile Include=\"Extensions\\Markup\\PluginStatus.cs\" />\r\n    <Compile Include=\"Extensions\\Markup\\ThemeFileBinding.cs\" />\r\n    <Compile Include=\"Manifests\\AddonManifestBase.cs\" />\r\n    <Compile Include=\"Manifests\\ExtensionManifest.cs\" />\r\n    <Compile Include=\"App\\CmdLineOptions.cs\" />\r\n    <Compile Include=\"Behaviors\\AnimatedVisibility.cs\" />\r\n    <Compile Include=\"Behaviors\\MediaElementBehaviors.cs\" />\r\n    <Compile Include=\"CefTools.cs\" />\r\n    <Compile Include=\"App\\PlayniteApplication.cs\" />\r\n    <Compile Include=\"App\\UpdateManifest.cs\" />\r\n    <Compile Include=\"Behaviors\\ExpanderBehaviors.cs\" />\r\n    <Compile Include=\"Behaviors\\FocusBahaviors.cs\" />\r\n    <Compile Include=\"Behaviors\\LeftClickContextMenuBehavior.cs\" />\r\n    <Compile Include=\"Behaviors\\ScrollToSelectedBehavior.cs\" />\r\n    <Compile Include=\"BindingProxy.cs\" />\r\n    <Compile Include=\"CmdlineCommands.cs\" />\r\n    <Compile Include=\"Commands\\GlobalCommands.cs\" />\r\n    <Compile Include=\"Commands\\GenericCommands.cs\" />\r\n    <Compile Include=\"Common\\BindingTools.cs\" />\r\n    <Compile Include=\"Common\\Computer.cs\" />\r\n    <Compile Include=\"Common\\Constants.cs\" />\r\n    <Compile Include=\"Common\\DesignerTools.cs\" />\r\n    <Compile Include=\"Common\\Exceptions.cs\" />\r\n    <Compile Include=\"Common\\Explorer.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\BitmapExtensions.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\BitmapIconExtensions.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\CloneObject.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\Enums.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\IconExtension.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\ItemsControlExtensions.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\LongExtensions.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\ObjectExtensions.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\ProcessExtensions.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\StringExtensions.cs\" />\r\n    <Compile Include=\"Common\\Extensions\\WindowExtensions.cs\" />\r\n    <Compile Include=\"Common\\FileSystem.cs\" />\r\n    <Compile Include=\"Common\\GlobalRandom.cs\" />\r\n    <Compile Include=\"Common\\Images.cs\" />\r\n    <Compile Include=\"Common\\IniParser.cs\" />\r\n    <Compile Include=\"Metadata\\MetadataFileExtensions.cs\" />\r\n    <Compile Include=\"Native\\Gdi32.cs\" />\r\n    <Compile Include=\"Common\\ItemsSource.cs\" />\r\n    <Compile Include=\"Common\\MarkupConverter.cs\" />\r\n    <Compile Include=\"Common\\Media\\Icons\\IconExtractor.cs\" />\r\n    <Compile Include=\"Common\\Media\\Icons\\IconUtil.cs\" />\r\n    <Compile Include=\"Common\\MemoryCache.cs\" />\r\n    <Compile Include=\"Common\\NLogLogProvider.cs\" />\r\n    <Compile Include=\"Common\\Paths.cs\" />\r\n    <Compile Include=\"Common\\ProcessMonitor.cs\" />\r\n    <Compile Include=\"Common\\ProcessStarter.cs\" />\r\n    <Compile Include=\"Common\\Programs.cs\" />\r\n    <Compile Include=\"Common\\Programs2.cs\" />\r\n    <Compile Include=\"Common\\Resources.cs\" />\r\n    <Compile Include=\"Common\\Roman.cs\" />\r\n    <Compile Include=\"Common\\SafeFileEnumerator.cs\" />\r\n    <Compile Include=\"Common\\Serialization.cs\" />\r\n    <Compile Include=\"Common\\SigningTools.cs\" />\r\n    <Compile Include=\"Common\\Sizes.cs\" />\r\n    <Compile Include=\"Common\\Sqlite.cs\" />\r\n    <Compile Include=\"Common\\SystemDialogs.cs\" />\r\n    <Compile Include=\"Common\\TempDirectory.cs\" />\r\n    <Compile Include=\"Common\\TGASharpLib.cs\" />\r\n    <Compile Include=\"Common\\Timer.cs\" />\r\n    <Compile Include=\"Common\\Units.cs\" />\r\n    <Compile Include=\"Common\\Web\\Downloader.cs\" />\r\n    <Compile Include=\"Common\\Web\\HttpDownloader.cs\" />\r\n    <Compile Include=\"Common\\Xaml.cs\" />\r\n    <Compile Include=\"Common\\Xml.cs\" />\r\n    <Compile Include=\"Controls\\ExtendedListBox.cs\" />\r\n    <Compile Include=\"Controls\\ExtendedListView.cs\" />\r\n    <Compile Include=\"Controls\\FadeImage.xaml.cs\">\r\n      <DependentUpon>FadeImage.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\GridEx.cs\" />\r\n    <Compile Include=\"Controls\\HtmlTextView.cs\" />\r\n    <Compile Include=\"Controls\\WindowBase.cs\" />\r\n    <Compile Include=\"Converters\\DockToStringConverter.cs\" />\r\n    <Compile Include=\"Converters\\InvertedBoolenConverter.cs\" />\r\n    <Compile Include=\"Converters\\ObjectToStringConverter.cs\" />\r\n    <Compile Include=\"Converters\\StrechToStringConverter.cs\" />\r\n    <Compile Include=\"Converters\\BidirectionalEnumAndNumberConverter.cs\" />\r\n    <Compile Include=\"Converters\\BooleanToHiddenConverter.cs\" />\r\n    <Compile Include=\"Converters\\BooleanToVisibilityConverter.cs\" />\r\n    <Compile Include=\"Converters\\BoolToAutoWidthConverter.cs\" />\r\n    <Compile Include=\"Converters\\BoolToYesNoConverter.cs\" />\r\n    <Compile Include=\"Converters\\CoversZoomToPercentageConverter.cs\" />\r\n    <Compile Include=\"Converters\\ImageStringToImageConverter.cs\" />\r\n    <Compile Include=\"Converters\\DateTimeToLastPlayedConverter.cs\" />\r\n    <Compile Include=\"Converters\\EnumToVisibilityConverter.cs\" />\r\n    <Compile Include=\"Converters\\EnumToBooleanConverter.cs\" />\r\n    <Compile Include=\"Converters\\ICollectionNullOrEmptyToVisibilityConverter.cs\" />\r\n    <Compile Include=\"Converters\\IconToImageSourceConverter.cs\" />\r\n    <Compile Include=\"Converters\\InvertableBooleanToVisibilityConverter.cs\" />\r\n    <Compile Include=\"Converters\\ListToStringConverter.cs\" />\r\n    <Compile Include=\"Converters\\PlayTimeToStringConverter.cs\" />\r\n    <Compile Include=\"Converters\\NegateConverter.cs\" />\r\n    <Compile Include=\"Converters\\NotificationIconConverter.cs\" />\r\n    <Compile Include=\"Converters\\NullableDateToStringConverter.cs\" />\r\n    <Compile Include=\"Converters\\NullToBoolConverter.cs\" />\r\n    <Compile Include=\"Converters\\NullToDependencyPropertyUnsetConverter.cs\" />\r\n    <Compile Include=\"Converters\\NullToVisibilityConverter.cs\" />\r\n    <Compile Include=\"Converters\\OpacityBoolConverter.cs\" />\r\n    <Compile Include=\"Converters\\SortingOrderToStringConverter.cs\" />\r\n    <Compile Include=\"Converters\\StringNullOrEmptyToBoolConverter.cs\" />\r\n    <Compile Include=\"Converters\\IntToVisibilityConverter.cs\" />\r\n    <Compile Include=\"Converters\\StringNullOrEmptyToVisibilityConverter.cs\" />\r\n    <Compile Include=\"Converters\\StringToUpperCaseConverter.cs\" />\r\n    <Compile Include=\"Converters\\ValueConverterGroup.cs\" />\r\n    <Compile Include=\"Converters\\WidthToFontSizeConverter.cs\" />\r\n    <Compile Include=\"Database\\Collections\\EmulatorsCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\GamesSourcesCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\AppSoftwareCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\RegionsCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\AgeRatingsCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\SeriesCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\CategoriesCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\FeaturesCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\TagsCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\GenresCollection.cs\" />\r\n    <Compile Include=\"Database\\DatabaseExplorer.cs\" />\r\n    <Compile Include=\"Database\\DatabaseFileEvent.cs\" />\r\n    <Compile Include=\"Database\\DatabaseFilter.cs\" />\r\n    <Compile Include=\"Database\\DatabaseSettings.cs\" />\r\n    <Compile Include=\"Database\\EventBufferHandler.cs\" />\r\n    <Compile Include=\"Database\\GameDatabase.cs\" />\r\n    <Compile Include=\"Database\\Collections\\GamesCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\ItemCollection.cs\" />\r\n    <Compile Include=\"Database\\GameDatabaseMigration.cs\" />\r\n    <Compile Include=\"Database\\GameFieldComparer.cs\" />\r\n    <Compile Include=\"Database\\InMemoryGameDatabase.cs\" />\r\n    <Compile Include=\"Database\\OldModels\\NewVer1\\OldCompletionStatus.cs\" />\r\n    <Compile Include=\"Database\\OldModels\\NewVer1\\OldDatabaseObject.cs\" />\r\n    <Compile Include=\"Database\\OldModels\\NewVer1\\OldGame.cs\" />\r\n    <Compile Include=\"Database\\OldModels\\NewVer1\\OldGameAction.cs\" />\r\n    <Compile Include=\"Database\\OldModels\\NewVer1\\OldLink.cs\" />\r\n    <Compile Include=\"Database\\Collections\\CompaniesCollection.cs\" />\r\n    <Compile Include=\"Database\\Collections\\PlatformsCollection.cs\" />\r\n    <Compile Include=\"DiagnosticPackageInfo.cs\" />\r\n    <Compile Include=\"DialogsFactory.cs\" />\r\n    <Compile Include=\"DiscordManager.cs\" />\r\n    <Compile Include=\"EasyAntiCheat.cs\" />\r\n    <Compile Include=\"ElementTreeHelper.cs\" />\r\n    <Compile Include=\"Exceptions.cs\" />\r\n    <Compile Include=\"Extensions\\GameExtensions.cs\" />\r\n    <Compile Include=\"Extensions\\IProvideValueTarget.cs\" />\r\n    <Compile Include=\"Extensions\\Markup\\Api.cs\" />\r\n    <Compile Include=\"Extensions\\Markup\\BindingExtension.cs\" />\r\n    <Compile Include=\"Extensions\\Markup\\MainViewModel.cs\" />\r\n    <Compile Include=\"Extensions\\Markup\\Settings.cs\" />\r\n    <Compile Include=\"Extensions\\Markup\\ThemeFile.cs\" />\r\n    <Compile Include=\"Extensions\\ServiceProvider.cs\" />\r\n    <Compile Include=\"FakePlayniteLibraryPlugin.cs\" />\r\n    <Compile Include=\"GamesCollectionView.cs\" />\r\n    <Compile Include=\"GamesCollectionViewEntry.cs\" />\r\n    <Compile Include=\"GamesEditor.cs\" />\r\n    <Compile Include=\"GlobalTaskHandler.cs\" />\r\n    <Compile Include=\"GoogleImageDownloader.cs\" />\r\n    <Compile Include=\"HttpFileCache.cs\" />\r\n    <Compile Include=\"ImageSourceManager.cs\" />\r\n    <Compile Include=\"Input\\MouseWheelGesture.cs\" />\r\n    <Compile Include=\"Localization.cs\" />\r\n    <Compile Include=\"Localization\\LocalizationKeys.cs\" />\r\n    <Compile Include=\"Manifests\\AddonManifests.cs\" />\r\n    <Compile Include=\"Manifests\\ThemeManifest.cs\" />\r\n    <Compile Include=\"Metadata\\MetadataDownloaderSettings.cs\" />\r\n    <Compile Include=\"Native\\Kernel32.cs\" />\r\n    <Compile Include=\"Native\\Ntdll.cs\" />\r\n    <Compile Include=\"Native\\Powrprof.cs\" />\r\n    <Compile Include=\"Native\\Processthreadsapi.cs\" />\r\n    <Compile Include=\"Native\\Psapi.cs\" />\r\n    <Compile Include=\"Native\\Shell32.cs\" />\r\n    <Compile Include=\"Native\\Shlwapi.cs\" />\r\n    <Compile Include=\"Native\\User32.cs\" />\r\n    <Compile Include=\"Native\\Winbase.cs\" />\r\n    <Compile Include=\"Native\\Windef.cs\" />\r\n    <Compile Include=\"Native\\WinError.cs\" />\r\n    <Compile Include=\"Native\\Wingdi.cs\" />\r\n    <Compile Include=\"Native\\Winnt.cs\" />\r\n    <Compile Include=\"Native\\Wintrust.cs\" />\r\n    <Compile Include=\"Native\\Winuser.cs\" />\r\n    <Compile Include=\"ObservablePowerStatus.cs\" />\r\n    <Compile Include=\"PlayniteProcess.cs\" />\r\n    <Compile Include=\"PlayniteUriHandler.cs\" />\r\n    <Compile Include=\"Plugins\\ExtensionFactory.cs\" />\r\n    <Compile Include=\"Plugins\\ExtensionInstaller.cs\" />\r\n    <Compile Include=\"Scripting\\PlayniteScript.cs\" />\r\n    <Compile Include=\"Scripting\\PowerShell\\PowerShell.cs\" />\r\n    <Compile Include=\"Scripting\\PowerShell\\PowerShellScript.cs\" />\r\n    <Compile Include=\"SdkHelpers.cs\" />\r\n    <Compile Include=\"SelectableItem.cs\" />\r\n    <Compile Include=\"Services\\BaseServicesClient.cs\" />\r\n    <Compile Include=\"Services\\GenericResponse.cs\" />\r\n    <Compile Include=\"GameTools.cs\" />\r\n    <Compile Include=\"Database\\DatabaseStats.cs\" />\r\n    <Compile Include=\"Controllers\\GameControllerFactory.cs\" />\r\n    <Compile Include=\"App\\IPlayniteApplication.cs\" />\r\n    <Compile Include=\"Metadata\\MetadataDownloader.cs\" />\r\n    <Compile Include=\"Settings\\AutoClientShutdownSettings.cs\" />\r\n    <Compile Include=\"Settings\\DetailsVisibilitySettings.cs\" />\r\n    <Compile Include=\"Settings\\FullscreenSettings.cs\" />\r\n    <Compile Include=\"Settings\\OldSettings\\Plugins.cs\" />\r\n    <Compile Include=\"Settings\\PlaynitePaths.cs\" />\r\n    <Compile Include=\"PipeServer.cs\" />\r\n    <Compile Include=\"PlayniteEnvironment.cs\" />\r\n    <Compile Include=\"Diagnostic.cs\" />\r\n    <Compile Include=\"Settings\\FilterSettings.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Controllers\\GenericGameController.cs\" />\r\n    <Compile Include=\"Services\\ServicesClient.cs\" />\r\n    <Compile Include=\"Settings\\PlayniteSettings.cs\" />\r\n    <Compile Include=\"App\\Updater.cs\" />\r\n    <Compile Include=\"Settings\\SettingsAttributes.cs\" />\r\n    <Compile Include=\"Settings\\ViewProperties.cs\" />\r\n    <Compile Include=\"Settings\\WindowPositions.cs\" />\r\n    <Compile Include=\"SystemIntegration.cs\" />\r\n    <Compile Include=\"Themes.cs\" />\r\n    <Compile Include=\"ThirdPartyClients\\ThirdPartyToolsList.cs\" />\r\n    <Compile Include=\"ObservableTime.cs\" />\r\n    <Compile Include=\"UrlConstants.cs\" />\r\n    <Compile Include=\"ViewModels\\AddonsViewModelBase_Online.cs\" />\r\n    <Compile Include=\"ViewModels\\CrashHandlerViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\ItemSelectionViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\MainViewModelBase.cs\" />\r\n    <Compile Include=\"ViewModels\\ProgressViewViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\RandomGameSelectViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\LicenseAgreementViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\SearchViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\UpdateViewModel.cs\" />\r\n    <Compile Include=\"WebView\\CookieDestroyer.cs\" />\r\n    <Compile Include=\"WebView\\OffscreenWebView.cs\" />\r\n    <Compile Include=\"WebView\\WebView.cs\" />\r\n    <Compile Include=\"WebView\\WebViewBase.cs\" />\r\n    <Compile Include=\"WebView\\WebViewFactory.cs\" />\r\n    <Compile Include=\"WindowsNotifyIconManager.cs\" />\r\n    <Compile Include=\"Windows\\LicenseAgreementWindowFactory.cs\" />\r\n    <Compile Include=\"Windows\\ExtensionCrashHandlerWindowFactory.cs\" />\r\n    <Compile Include=\"Windows\\CrashHandlerWindowFactory.cs\" />\r\n    <Compile Include=\"Windows\\ItemSelectorWindowFactory.cs\" />\r\n    <Compile Include=\"Windows\\WebViewWindow.xaml.cs\">\r\n      <DependentUpon>WebViewWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\ProgressWindowFactory.cs\" />\r\n    <Compile Include=\"Windows\\UpdateWindowFactory.cs\" />\r\n    <Compile Include=\"Windows\\WindowManager.cs\" />\r\n    <Compile Include=\"Input\\GameController.cs\" />\r\n    <Compile Include=\"Windows\\WindowFactory.cs\" />\r\n    <Compile Include=\"Windows\\WindowPositionHandler.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"App.config\" />\r\n    <None Include=\"Common.config\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n      <SubType>Designer</SubType>\r\n    </None>\r\n    <None Include=\"crash_reporter.cfg\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Emulation\\**\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\locstatus.json\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Compile Include=\"Native\\Fileapi.cs\" />\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <COMReference Include=\"IWshRuntimeLibrary\">\r\n      <Guid>{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}</Guid>\r\n      <VersionMajor>1</VersionMajor>\r\n      <VersionMinor>0</VersionMinor>\r\n      <Lcid>0</Lcid>\r\n      <WrapperTool>tlbimp</WrapperTool>\r\n      <Isolated>False</Isolated>\r\n      <EmbedInteropTypes>True</EmbedInteropTypes>\r\n    </COMReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\PlayniteSDK\\Playnite.SDK.csproj\">\r\n      <Project>{19bc9097-5705-4352-90e2-99f0c63230d0}</Project>\r\n      <Name>Playnite.SDK</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Page Include=\"Controls\\FadeImage.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <None Include=\"Localization\\de_DE.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\el_GR.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\es_ES.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\fr_FR.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\hu_HU.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\id_ID.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\it_IT.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\ca_ES.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\cs_CZ.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\ja_JP.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\fi_FI.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\ko_KR.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\he_IL.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\ar_SA.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\fa_IR.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\hr_HR.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Page Include=\"Localization\\LocSource.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <None Include=\"Localization\\lt_LT.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\nl_NL.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\pl_PL.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\pt_BR.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\ru_RU.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\sk_SK.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\sv_SE.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\tr_TR.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\uk_UA.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\zh_CN.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\ro_RO.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\zh_TW.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\no_NO.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\pt_PT.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\sr_SP.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\vi_VN.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\bg_BG.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Localization\\gl_ES.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Page Include=\"Windows\\WebViewWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\references\\CefSharpRedist\\*.*\">\r\n      <TargetPath>%(Filename)%(Extension)</TargetPath>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <ContentWithTargetPath Include=\"..\\..\\references\\sqlite3.x86.dll\">\r\n      <Link>Dependencies\\sqlite3.x86.dll</Link>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n      <TargetPath>sqlite3.x86.dll</TargetPath>\r\n    </ContentWithTargetPath>\r\n    <ContentWithTargetPath Include=\"..\\..\\references\\SDL2.dll\">\r\n      <Link>Dependencies\\SDL2.dll</Link>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n      <TargetPath>SDL2.dll</TargetPath>\r\n    </ContentWithTargetPath>\r\n      <ContentWithTargetPath Include=\"..\\..\\references\\SDL3.dll\">\r\n          <Link>Dependencies\\SDL3.dll</Link>\r\n          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n          <TargetPath>SDL3.dll</TargetPath>\r\n      </ContentWithTargetPath>\r\n    <ContentWithTargetPath Include=\"..\\..\\references\\SDL2_mixer.dll\">\r\n      <Link>Dependencies\\SDL2_mixer.dll</Link>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n      <TargetPath>SDL2_mixer.dll</TargetPath>\r\n    </ContentWithTargetPath>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Safe Mode.bat\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\playnite_extension.ico\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Resource Include=\"Resources\\Images\\DesignBackground.jpg\" />\r\n    <Resource Include=\"Resources\\Images\\DesignCover.jpg\" />\r\n    <Resource Include=\"Resources\\Images\\DesignIcon.png\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"gamecontrollerdb.txt\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>\r\n    </PostBuildEvent>\r\n  </PropertyGroup>\r\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\r\n    <PropertyGroup>\r\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\r\n    </PropertyGroup>\r\n    <Error Condition=\"!Exists('..\\packages\\chromiumembeddedframework.runtime.win-x64.144.0.12\\build\\chromiumembeddedframework.runtime.win-x64.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\chromiumembeddedframework.runtime.win-x64.144.0.12\\build\\chromiumembeddedframework.runtime.win-x64.props'))\" />\r\n    <Error Condition=\"!Exists('..\\packages\\chromiumembeddedframework.runtime.win-x86.144.0.12\\build\\chromiumembeddedframework.runtime.win-x86.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\chromiumembeddedframework.runtime.win-x86.144.0.12\\build\\chromiumembeddedframework.runtime.win-x86.props'))\" />\r\n    <Error Condition=\"!Exists('..\\packages\\CefSharp.Common.144.0.120\\build\\CefSharp.Common.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\CefSharp.Common.144.0.120\\build\\CefSharp.Common.props'))\" />\r\n    <Error Condition=\"!Exists('..\\packages\\CefSharp.Common.144.0.120\\build\\CefSharp.Common.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\CefSharp.Common.144.0.120\\build\\CefSharp.Common.targets'))\" />\r\n    <Error Condition=\"!Exists('..\\packages\\Magick.NET-Q8-x86.14.10.2\\build\\netstandard20\\Magick.NET-Q8-x86.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Magick.NET-Q8-x86.14.10.2\\build\\netstandard20\\Magick.NET-Q8-x86.targets'))\" />\r\n  </Target>\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n  <Import Project=\"..\\packages\\CefSharp.Common.144.0.120\\build\\CefSharp.Common.targets\" Condition=\"Exists('..\\packages\\CefSharp.Common.144.0.120\\build\\CefSharp.Common.targets')\" />\r\n  <Import Project=\"..\\packages\\Magick.NET-Q8-x86.14.10.2\\build\\netstandard20\\Magick.NET-Q8-x86.targets\" Condition=\"Exists('..\\packages\\Magick.NET-Q8-x86.14.10.2\\build\\netstandard20\\Magick.NET-Q8-x86.targets')\" />\r\n</Project>"
  },
  {
    "path": "source/Playnite/PlayniteEnvironment.cs",
    "content": "﻿using Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Configuration;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Security.Principal;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public enum ReleaseChannel\r\n    {\r\n        Stable,\r\n        Beta,\r\n        Patreon\r\n    }\r\n\r\n    public static class PlayniteEnvironment\r\n    {\r\n        public static ReleaseChannel ReleaseChannel\r\n        {\r\n            get\r\n            {\r\n                switch (PlayniteSettings.GetAppConfigValue(\"UpdateBranch\"))\r\n                {\r\n                    case \"stable\":\r\n                        return ReleaseChannel.Stable;\r\n                    case \"patreon\":\r\n                        return ReleaseChannel.Patreon;\r\n                    case \"beta\":\r\n                        return ReleaseChannel.Beta;\r\n                    default:\r\n                        return ReleaseChannel.Stable;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static string DocsRootUrl => PlayniteSettings.GetAppConfigValue(\"DocsRootUrl\");\r\n\r\n        public static string AppBranch => PlayniteSettings.GetAppConfigValue(\"AppBranch\");\r\n\r\n        public static bool ThrowAllErrors => PlayniteSettings.GetAppConfigBoolValue(\"ThrowAllErrors\") && Debugger.IsAttached;\r\n\r\n        public static bool InOfflineMode => PlayniteSettings.GetAppConfigBoolValue(\"OfflineMode\");\r\n\r\n        public static bool IsDebuggerAttached => Debugger.IsAttached;\r\n\r\n        public static bool IsDebugBuild\r\n        {\r\n            get\r\n            {\r\n#if DEBUG\r\n                return true;\r\n#else\r\n                return false;\r\n#endif\r\n            }\r\n        }\r\n\r\n        public static bool IsElevated\r\n        {\r\n            get\r\n            {\r\n                using (var identity = WindowsIdentity.GetCurrent())\r\n                {\r\n                    var principal = new WindowsPrincipal(identity);\r\n                    return principal.IsInRole(WindowsBuiltInRole.Administrator);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/PlayniteProcess.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class PlayniteProcess\r\n    {\r\n        public static long WorkingSetMemory\r\n        {\r\n            get => Process.GetCurrentProcess().WorkingSet64;\r\n        }\r\n\r\n        public static string Path\r\n        {\r\n            get => Process.GetCurrentProcess().MainModule.FileName;\r\n        }\r\n\r\n        public static string Cmdline\r\n        {\r\n            get => Process.GetCurrentProcess().GetCommandLine();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/PlayniteUriHandler.cs",
    "content": "﻿using Flurl;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Events;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Web;\r\n\r\nnamespace Playnite\r\n{\r\n    public class UriCommands\r\n    {\r\n        public const string StartGame = \"start\";\r\n        public const string CreateDiag = \"creatediag\";\r\n        public const string ShowGame = \"showgame\";\r\n        public const string InstallAddon = \"installaddon\";\r\n        public const string Search = \"search\";\r\n        public const string Restore = \"restore\";\r\n    }\r\n\r\n    public class PlayniteUriHandler : IUriHandlerAPI\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private static readonly char[] uriSplitter = new char[] { '/' };\r\n\r\n        internal readonly Dictionary<string, Action<PlayniteUriEventArgs>> Handlers =\r\n            new Dictionary<string, Action<PlayniteUriEventArgs>>();\r\n\r\n        public void RegisterSource(string source, Action<PlayniteUriEventArgs> handler)\r\n        {\r\n            if (source.IsNullOrEmpty())\r\n            {\r\n                throw new ArgumentNullException(\"Source cannot be null\");\r\n            }\r\n\r\n            if (source.Equals(\"playnite\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                throw new Exception($\"\\\"playnite\\\" source is reserved source.\");\r\n            }\r\n\r\n            if (Handlers.Keys.FirstOrDefault(a => a.Equals(source, StringComparison.OrdinalIgnoreCase)) != null)\r\n            {\r\n                throw new Exception($\"Handler {source} is already registered.\");\r\n            }\r\n\r\n            Handlers.Add(source, handler);\r\n        }\r\n\r\n        public void RemoveSource(string source)\r\n        {\r\n            var handler = Handlers.FirstOrDefault(a => a.Key.Equals(source, StringComparison.OrdinalIgnoreCase));\r\n            if (handler.Value != null)\r\n            {\r\n                Handlers.Remove(handler.Key);\r\n            }\r\n        }\r\n\r\n        public static (string source, string[] arguments) ParseUri(string uri)\r\n        {\r\n            var split = uri.Split(uriSplitter, StringSplitOptions.RemoveEmptyEntries);\r\n            if (split.Length < 2)\r\n            {\r\n                throw new Exception(\"playnite:// uri missing parameters.\");\r\n            }\r\n\r\n            var source = split[1];\r\n            var arguments = new string[0];\r\n            if (split.Length > 2)\r\n            {\r\n                arguments = split.Skip(2).Select(a => HttpUtility.UrlDecode(a)).ToArray();\r\n            }\r\n\r\n            return (source, arguments);\r\n        }\r\n\r\n        internal void ProcessUri(string uri)\r\n        {\r\n            logger.Info($\"Processing Playnite URI {uri}\");\r\n            try\r\n            {\r\n                var (source, arguments) = ParseUri(uri);\r\n                var handler = Handlers.FirstOrDefault(a => a.Key.Equals(source, StringComparison.OrdinalIgnoreCase));\r\n                if (handler.Value == null)\r\n                {\r\n                    logger.Error($\"URI handler {source} is not registered.\");\r\n                    return;\r\n                }\r\n\r\n                handler.Value.Invoke(new PlayniteUriEventArgs { Arguments = arguments });\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"URI handler failed.\");\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Plugins/ExtensionFactory.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Database;\r\nusing Playnite.Controllers;\r\nusing Playnite.Scripting;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.Common;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Events;\r\n\r\nnamespace Playnite.Plugins\r\n{\r\n    public class ExtensionsStatusBinder\r\n    {\r\n        public class Status : ObservableObject\r\n        {\r\n            private bool isInstalled;\r\n            public bool IsInstalled { get => isInstalled; set => SetValue(ref isInstalled, value); }\r\n        }\r\n\r\n        public Status this[string pluginId]\r\n        {\r\n            get\r\n            {\r\n                var plugin = PlayniteApplication.Current.Extensions?.Plugins.FirstOrDefault(a => a.Value.Description.Id == pluginId).Value;\r\n                return new Status { IsInstalled = plugin != null };\r\n            }\r\n\r\n            set { throw new NotSupportedException(); }\r\n        }\r\n    }\r\n\r\n    public class LoadedPlugin\r\n    {\r\n        public Plugin Plugin { get; }\r\n        public ExtensionManifest Description { get; }\r\n        public string PluginIcon { get; }\r\n\r\n        public LoadedPlugin(Plugin plugin, ExtensionManifest description)\r\n        {\r\n            Plugin = plugin;\r\n            Description = description;\r\n            if (!string.IsNullOrEmpty(description.Icon))\r\n            {\r\n                PluginIcon = Path.Combine(Path.GetDirectoryName(description.DescriptionPath), description.Icon);\r\n            }\r\n        }\r\n    }\r\n\r\n    public enum AddonLoadError\r\n    {\r\n        None,\r\n        Uknown,\r\n        SDKVersion\r\n    }\r\n\r\n    public class ExtensionFactory : ObservableObject, IDisposable\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private readonly IGameDatabase database;\r\n        private readonly GameControllerFactory controllers;\r\n        private readonly Func<ExtensionManifest, IPlayniteAPI> apiGenerator;\r\n\r\n        public List<(ExtensionManifest manifest, AddonLoadError error)> FailedExtensions { get; } = new List<(ExtensionManifest manifest, AddonLoadError error)>();\r\n\r\n        public Dictionary<Guid, LoadedPlugin> Plugins\r\n        {\r\n            get; private set;\r\n        } = new Dictionary<Guid, LoadedPlugin>();\r\n\r\n        public List<LibraryPlugin> LibraryPlugins\r\n        {\r\n            get => Plugins.Where(a => a.Value.Description.Type == ExtensionType.GameLibrary).Select(a => (LibraryPlugin)a.Value.Plugin).ToList();\r\n        }\r\n\r\n        public List<MetadataPlugin> MetadataPlugins\r\n        {\r\n            get => Plugins.Where(a => a.Value.Description.Type == ExtensionType.MetadataProvider).Select(a => (MetadataPlugin)a.Value.Plugin).ToList();\r\n        }\r\n\r\n        public List<GenericPlugin> GenericPlugins\r\n        {\r\n            get => Plugins.Where(a => a.Value.Description.Type == ExtensionType.GenericPlugin).Select(a => (GenericPlugin)a.Value.Plugin).ToList();\r\n        }\r\n\r\n        public  List<PlayniteScript> Scripts\r\n        {\r\n            get; private set;\r\n        } =  new List<PlayniteScript>();\r\n\r\n        public ExtensionFactory(IGameDatabase database, GameControllerFactory controllers, Func<ExtensionManifest, IPlayniteAPI> apiGenerator)\r\n        {\r\n            this.database = database;\r\n            this.controllers = controllers;\r\n            this.apiGenerator = apiGenerator;\r\n            controllers.Installed += Controllers_Installed;\r\n            controllers.InstallationCancelled += Controllers_InstallationCancelled;\r\n            controllers.Starting += Controllers_Starting;\r\n            controllers.Started += Controllers_Started;\r\n            controllers.Stopped += Controllers_Stopped;\r\n            controllers.Uninstalled += Controllers_Uninstalled;\r\n            controllers.StartupCancelled += Controllers_StartupCancelled;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            DisposePlugins();\r\n            DisposeScripts();\r\n            controllers.Installed -= Controllers_Installed;\r\n            controllers.InstallationCancelled -= Controllers_InstallationCancelled;\r\n            controllers.Starting -= Controllers_Starting;\r\n            controllers.Started -= Controllers_Started;\r\n            controllers.Stopped -= Controllers_Stopped;\r\n            controllers.Uninstalled -= Controllers_Uninstalled;\r\n            controllers.StartupCancelled -= Controllers_StartupCancelled;\r\n        }\r\n\r\n        private void DisposeScripts()\r\n        {\r\n            if (Scripts?.Any() == true)\r\n            {\r\n                foreach (var script in Scripts)\r\n                {\r\n                    try\r\n                    {\r\n                        script.Dispose();\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to dispose script {script.Name}\");\r\n                    }\r\n            }\r\n            }\r\n\r\n            Scripts = new List<PlayniteScript>();\r\n        }\r\n\r\n        private void DisposePlugins()\r\n        {\r\n            if (Plugins?.Any() == true)\r\n            {\r\n                foreach (var provider in Plugins.Keys)\r\n                {\r\n                    try\r\n                    {\r\n                        Plugins[provider].Plugin.Dispose();\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to dispose plugin {provider}\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            Plugins = new Dictionary<Guid, LoadedPlugin>();\r\n        }\r\n\r\n        public static void CreatePluginFolders()\r\n        {\r\n            FileSystem.CreateDirectory(PlaynitePaths.ExtensionsDataPath);\r\n            FileSystem.CreateDirectory(PlaynitePaths.ExtensionsProgramPath);\r\n            FileSystem.CreateDirectory(PlaynitePaths.ExtensionsUserDataPath);\r\n        }\r\n\r\n        private static IEnumerable<ExtensionManifest> GetManifestsFromPath(string path)\r\n        {\r\n            if (Directory.Exists(path))\r\n            {\r\n                var man = GetManifestFromFile(Path.Combine(path, PlaynitePaths.ExtensionManifestFileName));\r\n                if (man != null)\r\n                {\r\n                    yield return man;\r\n                }\r\n            }\r\n            else if (File.Exists(path))\r\n            {\r\n                foreach (var dirPath in File.ReadAllLines(path).Where(a => !a.IsNullOrWhiteSpace() && !a.StartsWith(\"#\")))\r\n                {\r\n                    ExtensionManifest man = null;\r\n                    try\r\n                    {\r\n                        if (Directory.Exists(dirPath))\r\n                        {\r\n                            man = GetManifestFromFile(Path.Combine(dirPath.Trim(), PlaynitePaths.ExtensionManifestFileName));\r\n                        }\r\n                    }\r\n                    catch (Exception e)\r\n                    {\r\n                        logger.Error(e, \"Failed to read extension dev file.\");\r\n                    }\r\n\r\n                    if (man != null)\r\n                    {\r\n                        yield return man;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private static ExtensionManifest GetManifestFromFile(string file)\r\n        {\r\n            if (File.Exists(file))\r\n            {\r\n                try\r\n                {\r\n                    return ExtensionManifest.FromFile(file);\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to parse plugin description: {file}\");\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        internal static IEnumerable<BaseExtensionManifest> DeduplicateExtList(List<BaseExtensionManifest> list)\r\n        {\r\n            return list.GroupBy(a => a.Id).Select(g => g.OrderByDescending(x => x.Version).First());\r\n        }\r\n\r\n        public static List<ExtensionManifest> GetInstalledManifests(List<string> externalPaths = null)\r\n        {\r\n            var externals = new List<BaseExtensionManifest>();\r\n            var user = new List<BaseExtensionManifest>();\r\n            var install = new List<BaseExtensionManifest>();\r\n            if (externalPaths.HasItems())\r\n            {\r\n                foreach (var ext in externalPaths)\r\n                {\r\n                    foreach (var man in GetManifestsFromPath(ext))\r\n                    {\r\n                        externals.Add(man);\r\n                        man.IsExternalDev = true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (Directory.Exists(PlaynitePaths.ExtensionsUserDataPath))\r\n            {\r\n                var enumerator = new SafeFileEnumerator(PlaynitePaths.ExtensionsUserDataPath, PlaynitePaths.ExtensionManifestFileName, SearchOption.AllDirectories);\r\n                foreach (var desc in enumerator)\r\n                {\r\n                    var man = GetManifestFromFile(desc.FullName);\r\n                    if (man?.Id.IsNullOrEmpty() == false)\r\n                    {\r\n                        if (externals.Any(a => a.Id == man.Id))\r\n                        {\r\n                            continue;\r\n                        }\r\n                        else\r\n                        {\r\n                            user.Add(man);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (Directory.Exists(PlaynitePaths.ExtensionsProgramPath))\r\n            {\r\n                var enumerator = new SafeFileEnumerator(PlaynitePaths.ExtensionsProgramPath, PlaynitePaths.ExtensionManifestFileName, SearchOption.AllDirectories);\r\n                foreach (var desc in enumerator)\r\n                {\r\n                    var man = GetManifestFromFile(desc.FullName);\r\n                    if (man?.Id.IsNullOrEmpty() == false)\r\n                    {\r\n                        if (externals.Any(a => a.Id == man.Id) || user.Any(a => a.Id == man.Id))\r\n                        {\r\n                            continue;\r\n                        }\r\n                        else\r\n                        {\r\n                            install.Add(man);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            var result = new List<ExtensionManifest>();\r\n            result.AddRange(DeduplicateExtList(externals).Cast<ExtensionManifest>());\r\n            result.AddRange(DeduplicateExtList(user).Cast<ExtensionManifest>());\r\n            result.AddRange(DeduplicateExtList(install).Cast<ExtensionManifest>());\r\n            return result;\r\n        }\r\n\r\n        private bool VerifyAssemblyReferences(Assembly asm, ExtensionManifest manifest)\r\n        {\r\n            var references = asm.GetReferencedAssemblies();\r\n            if (references.Any(a => a.Name == \"Playnite\" || a.Name == \"Playnite.Common\") &&\r\n                !BuiltinExtensions.BuiltinExtensionIds.Contains(manifest.Id))\r\n            {\r\n                logger.Error($\"Unsupported Playnite assemblies are referenced by {manifest.Name} plugin.\");\r\n                return false;\r\n            }\r\n\r\n            var sdkReference = references.FirstOrDefault(a => a.Name == \"Playnite.SDK\");\r\n            if (sdkReference == null)\r\n            {\r\n                logger.Error($\"Assembly doesn't reference Playnite SDK.\");\r\n                return false;\r\n            }\r\n\r\n            if (sdkReference.Version.Major != SDK.SdkVersions.SDKVersion.Major ||\r\n                sdkReference.Version > SDK.SdkVersions.SDKVersion)\r\n            {\r\n                logger.Error($\"Plugin doesn't support current version of Playnite SDK, supports {sdkReference.Version}\");\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        public bool LoadScripts(List<string> ignoreList, bool builtInOnly, List<string> externals)\r\n        {\r\n            var allSuccess = true;\r\n            DisposeScripts();\r\n            var manifests = GetInstalledManifests(externals).Where(a => a.Type == ExtensionType.Script && !ignoreList.Contains(a.Id)).ToList();\r\n            foreach (var desc in manifests)\r\n            {\r\n                if (desc.Id.IsNullOrWhiteSpace())\r\n                {\r\n                    logger.Error($\"Extension {desc.Name}, doesn't have ID.\");\r\n                    continue;\r\n                }\r\n\r\n                if (desc.Module.IsNullOrWhiteSpace())\r\n                {\r\n                    logger.Error($\"Extension {desc.Name}, doesn't have module specified.\");\r\n                    continue;\r\n                }\r\n\r\n                if (builtInOnly && !BuiltinExtensions.BuiltinExtensionIds.Contains(desc.Id))\r\n                {\r\n                    logger.Warn($\"Skipping load of {desc.Name}, builtInOnly is enabled.\");\r\n                    continue;\r\n                }\r\n\r\n                PlayniteScript script = null;\r\n                var scriptPath = Path.Combine(Path.GetDirectoryName(desc.DescriptionPath), desc.Module);\r\n                if (!File.Exists(scriptPath))\r\n                {\r\n                    logger.Error($\"Cannot load script extension, {scriptPath} not found.\");\r\n                    FailedExtensions.Add((desc, AddonLoadError.Uknown));\r\n                    continue;\r\n                }\r\n\r\n                try\r\n                {\r\n                    script = PlayniteScript.FromFile(scriptPath, $\"{desc.DirectoryName}#PS\");\r\n                    if (script == null)\r\n                    {\r\n                        FailedExtensions.Add((desc, AddonLoadError.Uknown));\r\n                        continue;\r\n                    }\r\n\r\n                    Localization.LoadAddonLocalization(desc.DirectoryPath);\r\n                    script.SetVariable(\"PlayniteApi\", apiGenerator(desc));\r\n                    script.SetVariable(\"CurrentExtensionInstallPath\", desc.DirectoryPath);\r\n                    if (!desc.Id.IsNullOrEmpty())\r\n                    {\r\n                        var extDir = Path.Combine(PlaynitePaths.ExtensionsDataPath, Paths.GetSafePathName(desc.Id));\r\n                        FileSystem.CreateDirectory(extDir);\r\n                        script.SetVariable(\"CurrentExtensionDataPath\", extDir);\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    allSuccess = false;\r\n                    logger.Error(e, $\"Failed to load script file {scriptPath}\");\r\n                    FailedExtensions.Add((desc, AddonLoadError.Uknown));\r\n                    continue;\r\n                }\r\n\r\n                Scripts.Add(script);\r\n                logger.Info($\"Loaded script extension: {scriptPath}, version {desc.Version}\");\r\n            }\r\n\r\n            return allSuccess;\r\n        }\r\n\r\n        public void LoadPlugins(List<string> ignoreList, bool builtInOnly, List<string> externals)\r\n        {\r\n            if (Plugins.HasItems())\r\n            {\r\n                throw new Exception(\"Plugin can be loaded only once!\");\r\n            }\r\n\r\n            var manifests = GetInstalledManifests(externals).Where(a => a.Type != ExtensionType.Script && ignoreList?.Contains(a.Id) != true).ToList();\r\n            foreach (var desc in manifests)\r\n            {\r\n                if (desc.Id.IsNullOrEmpty())\r\n                {\r\n                    logger.Error($\"Extension {desc.Name}, doesn't have ID.\");\r\n                    continue;\r\n                }\r\n\r\n                if (desc.Module.IsNullOrWhiteSpace())\r\n                {\r\n                    logger.Error($\"Extension {desc.Name}, doesn't have module specified.\");\r\n                    continue;\r\n                }\r\n\r\n                if (builtInOnly && !BuiltinExtensions.BuiltinExtensionIds.Contains(desc.Id))\r\n                {\r\n                    logger.Warn($\"Skipping load of {desc.Name}, builtInOnly is enabled.\");\r\n                    continue;\r\n                }\r\n\r\n                try\r\n                {\r\n                    Localization.LoadAddonLocalization(desc.DirectoryPath);\r\n                    var plugins = LoadPlugins(desc, apiGenerator);\r\n                    foreach (var plugin in plugins)\r\n                    {\r\n                        if (plugin.Id == default)\r\n                        {\r\n                            logger.Error($\"Plugin {plugin.GetType()} doesn't have plugin ID specified.\");\r\n                            continue;\r\n                        }\r\n\r\n                        if (Plugins.ContainsKey(plugin.Id))\r\n                        {\r\n                            logger.Warn($\"Plugin {plugin.Id} is already loaded.\");\r\n                            continue;\r\n                        }\r\n\r\n                        Plugins.Add(plugin.Id, new LoadedPlugin(plugin, desc));\r\n                        logger.Info($\"Loaded plugin: {desc.Name}, version {desc.Version}\");\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e.InnerException, $\"Failed to load plugin: {desc.Name}\");\r\n                    if (e.InnerException == null)\r\n                    {\r\n                        logger.Error(e, string.Empty);\r\n                    }\r\n\r\n                    if (e is ReflectionTypeLoadException reflectionTypeLoadException)\r\n                    {\r\n                        foreach (var loaderException in reflectionTypeLoadException.LoaderExceptions)\r\n                        {\r\n                            logger.Error(loaderException, string.Empty);\r\n                        }\r\n                    }\r\n\r\n                    FailedExtensions.Add((desc, AddonLoadError.Uknown));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IEnumerable<Plugin> LoadPlugins(ExtensionManifest descriptor, Func<ExtensionManifest, IPlayniteAPI> apiGenerator)\r\n        {\r\n            var asmPath = Path.Combine(Path.GetDirectoryName(descriptor.DescriptionPath), descriptor.Module);\r\n            var asmName = AssemblyName.GetAssemblyName(asmPath);\r\n            var assembly = Assembly.Load(asmName);\r\n            if (VerifyAssemblyReferences(assembly, descriptor))\r\n            {\r\n                foreach (Type type in assembly.GetTypes())\r\n                {\r\n                    if (type.IsInterface || type.IsAbstract)\r\n                    {\r\n                        continue;\r\n                    }\r\n                    else\r\n                    {\r\n                        if (typeof(GenericPlugin).IsAssignableFrom(type) || typeof(LibraryPlugin).IsAssignableFrom(type) || typeof(MetadataPlugin).IsAssignableFrom(type))\r\n                        {\r\n                            var ignore = Attribute.IsDefined(type, typeof(IgnorePluginAttribute));\r\n                            var load = Attribute.IsDefined(type, typeof(LoadPluginAttribute));\r\n                            if ((ignore && load) || !ignore)\r\n                            {\r\n                                yield return (Plugin)Activator.CreateInstance(type, new object[] { apiGenerator(descriptor) });\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                logger.Error($\"Plugin dependencices are not compatible: {descriptor.Name}\");\r\n                FailedExtensions.Add((descriptor, AddonLoadError.SDKVersion));\r\n                // TODO: Unload assembly once Playnite switches to .NET Core\r\n            }\r\n        }\r\n\r\n        public bool InvokeExtension(ExtensionFunction function, out Exception error)\r\n        {\r\n            try\r\n            {\r\n                logger.Debug($\"Invoking extension function {function}\");\r\n                function.Invoke();\r\n                error = null;\r\n                return true;\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to execute extension function.\");\r\n                error = e;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        private void Controllers_Uninstalled(object sender, GameUninstalledEventArgs args)\r\n        {\r\n            if (args.Source?.Game == null)\r\n            {\r\n                logger.Error(\"No game controller information found!\");\r\n                return;\r\n            }\r\n\r\n            var callbackArgs = new SDK.Events.OnGameUninstalledEventArgs { Game = args.Source.Game };\r\n            foreach (var script in Scripts)\r\n            {\r\n                try\r\n                {\r\n                    script.OnGameUninstalled(callbackArgs);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameUninstalled method from {script.Name} script.\");\r\n                }\r\n            }\r\n\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnGameUninstalled(callbackArgs);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameUninstalled method from {plugin.Description.Name} plugin.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Controllers_Stopped(object sender, GameStoppedEventArgs args)\r\n        {\r\n            if (args.Source?.Game?.Id == null)\r\n            {\r\n                logger.Error(\"No game controller information found!\");\r\n                return;\r\n            }\r\n        }\r\n\r\n        public void InvokeOnGameStopped(Game game, ulong ellapsedTime, bool manuallyStopped)\r\n        {\r\n            var callbackArgs = new SDK.Events.OnGameStoppedEventArgs\r\n            {\r\n                Game = database.Games[game.Id],\r\n                ElapsedSeconds = ellapsedTime,\r\n                ManuallyStopped = manuallyStopped\r\n            };\r\n\r\n            foreach (var script in Scripts)\r\n            {\r\n                try\r\n                {\r\n                    script.OnGameStopped(callbackArgs);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameStopped method from {script.Name} script.\");\r\n                }\r\n            }\r\n\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnGameStopped(callbackArgs);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameStopped method from {plugin.Description.Name} plugin.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Controllers_StartupCancelled(object sender, OnGameStartupCancelledEventArgs args)\r\n        {\r\n            foreach (var script in Scripts)\r\n            {\r\n                try\r\n                {\r\n                    script.OnGameStartupCancelled(args);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameStartupCancelled method from {script.Name} script.\");\r\n                }\r\n            }\r\n\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnGameStartupCancelled(args);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameStartupCancelled method from {plugin.Description.Name} plugin.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Controllers_Starting(object sender, OnGameStartingEventArgs args)\r\n        {\r\n            foreach (var script in Scripts)\r\n            {\r\n                try\r\n                {\r\n                    script.OnGameStarting(args);\r\n                    if (args.CancelStartup)\r\n                    {\r\n                        return;\r\n                    }\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameStarting method from {script.Name} script.\");\r\n                }\r\n            }\r\n\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnGameStarting(args);\r\n                    if (args.CancelStartup)\r\n                    {\r\n                        return;\r\n                    }\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameStarting method from {plugin.Description.Name} plugin.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Controllers_Started(object sender, GameStartedEventArgs args)\r\n        {\r\n            if (args.Source?.Game?.Id == null)\r\n            {\r\n                logger.Error(\"No game controller information found!\");\r\n                return;\r\n            }\r\n\r\n            var callbackArgs = new OnGameStartedEventArgs\r\n            {\r\n                Game = database.Games[args.Source.Game.Id],\r\n                SourceAction = (args.Source as GenericPlayController)?.StartingArgs?.SourceAction?.GetClone(),\r\n                SelectedRomFile = (args.Source as GenericPlayController)?.StartingArgs.SelectedRomFile,\r\n                StartedProcessId = args.StartedProcessId\r\n            };\r\n\r\n            foreach (var script in Scripts)\r\n            {\r\n                try\r\n                {\r\n                    script.OnGameStarted(callbackArgs);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameStarted method from {script.Name} script.\");\r\n                }\r\n            }\r\n\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnGameStarted(callbackArgs);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameStarted method from {plugin.Description.Name} plugin.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Controllers_Installed(object sender, GameInstalledEventArgs args)\r\n        {\r\n            if (args.Source?.Game?.Id == null)\r\n            {\r\n                logger.Error(\"No game controller information found!\");\r\n                return;\r\n            }\r\n\r\n            var callbackArgs = new SDK.Events.OnGameInstalledEventArgs { Game = database.Games[args.Source.Game.Id] };\r\n            foreach (var script in Scripts)\r\n            {\r\n                try\r\n                {\r\n                    script.OnGameInstalled(callbackArgs);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameInstalled method from {script.Name} script.\");\r\n                }\r\n            }\r\n\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnGameInstalled(callbackArgs);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameInstalled method from {plugin.Description.Name} plugin.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Controllers_InstallationCancelled(object sender, GameInstallationCancelledEventArgs args)\r\n        {\r\n            if (args.Source?.Game?.Id == null)\r\n            {\r\n                logger.Error(\"No game controller information found!\");\r\n                return;\r\n            }\r\n\r\n            var callbackArgs = new SDK.Events.OnGameInstallationCancelledEventArgs { Game = database.Games[args.Source.Game.Id] };\r\n            foreach (var script in Scripts)\r\n            {\r\n                try\r\n                {\r\n                    script.OnGameInstallationCancelled(callbackArgs);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameInstallationCancelled method from {script.Name} script.\");\r\n                }\r\n            }\r\n\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnGameInstallationCancelled(callbackArgs);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameInstallationCancelled method from {plugin.Description.Name} plugin.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void InvokeOnGameSelected(List<Game> oldValue, List<Game> newValue)\r\n        {\r\n            var args = new SDK.Events.OnGameSelectedEventArgs(oldValue, newValue);\r\n            foreach (var script in Scripts)\r\n            {\r\n                try\r\n                {\r\n                    script.OnGameSelected(args);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameSelected method from {script.Name} script.\");\r\n                }\r\n            }\r\n\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnGameSelected(args);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnGameSelected method from {plugin.Description.Name} plugin.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void NotifiyOnApplicationStarted()\r\n        {\r\n            foreach (var script in Scripts)\r\n            {\r\n                try\r\n                {\r\n                    script.OnApplicationStarted();\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnApplicationStarted method from {script.Name} script.\");\r\n                }\r\n            }\r\n\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnApplicationStarted(new SDK.Events.OnApplicationStartedEventArgs());\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnApplicationStarted method from {plugin.Description.Name} plugin.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void NotifiyOnApplicationStopped()\r\n        {\r\n            foreach (var script in Scripts)\r\n            {\r\n                try\r\n                {\r\n                    script.OnApplicationStopped();\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnApplicationStopped method from {script.Name} script.\");\r\n                }\r\n            }\r\n\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnApplicationStopped(new SDK.Events.OnApplicationStoppedEventArgs());\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnApplicationStopped method from {plugin.Description.Name} plugin.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void NotifiyOnLibraryUpdated()\r\n        {\r\n            foreach (var script in Scripts)\r\n            {\r\n                try\r\n                {\r\n                    script.OnLibraryUpdated();\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnLibraryUpdated method from {script.Name} script.\");\r\n                }\r\n            }\r\n\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnLibraryUpdated(new SDK.Events.OnLibraryUpdatedEventArgs());\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to execute OnLibraryUpdated method from {plugin.Description.Name} plugin.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public LibraryPlugin GetLibraryPlugin(Guid pluginId)\r\n        {\r\n            if (pluginId == Guid.Empty)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return LibraryPlugins.FirstOrDefault(a => a.Id == pluginId);\r\n        }\r\n\r\n        public List<PluginUiElementSupport> CustomElementList = new List<PluginUiElementSupport>();\r\n        public void AddCustomElementSupport(Plugin source, AddCustomElementSupportArgs args)\r\n        {\r\n            if (CustomElementList.Any(a => a.Source == source))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var elemSupport = args.GetClone<AddCustomElementSupportArgs, PluginUiElementSupport>();\r\n            elemSupport.Source = source;\r\n            CustomElementList.Add(elemSupport);\r\n        }\r\n\r\n        public List<PluginSettingsSupport> SettingsSupportList = new List<PluginSettingsSupport>();\r\n        public void AddSettingsSupport(Plugin source, AddSettingsSupportArgs args)\r\n        {\r\n            if (SettingsSupportList.Any(a => a.Source == source))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var elemSupport = args.GetClone<AddSettingsSupportArgs, PluginSettingsSupport>();\r\n            elemSupport.Source = source;\r\n            SettingsSupportList.Add(elemSupport);\r\n        }\r\n\r\n        public List<PluginConvertersSupport> ConvertersSupportList = new List<PluginConvertersSupport>();\r\n        public void AddConvertersSupport(Plugin source, AddConvertersSupportArgs args)\r\n        {\r\n            if (ConvertersSupportList.Any(a => a.Source == source))\r\n            {\r\n                return;\r\n            }\r\n\r\n            ConvertersSupportList.Add(new PluginConvertersSupport\r\n            {\r\n                Source = source,\r\n                Converters = args.Converters,\r\n                SourceName = args.SourceName\r\n            });\r\n        }\r\n\r\n        public List<TopPanelItem> GetTopPanelPluginItems()\r\n        {\r\n            var res = new List<TopPanelItem>();\r\n            foreach (var plugin in Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    var items = plugin.Plugin.GetTopPanelItems().ToList();\r\n                    if (items.HasItems())\r\n                    {\r\n                        res.AddRange(items);\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get top panel itesm from {plugin.Description.Id}\");\r\n                }\r\n            }\r\n\r\n            return res;\r\n        }\r\n    }\r\n\r\n    public class PluginUiElementSupport : AddCustomElementSupportArgs\r\n    {\r\n        public Plugin Source { get; set; }\r\n    }\r\n\r\n    public class PluginSettingsSupport : AddSettingsSupportArgs\r\n    {\r\n        public Plugin Source { get; set; }\r\n    }\r\n\r\n    public class PluginConvertersSupport : AddConvertersSupportArgs\r\n    {\r\n        public Plugin Source { get; set; }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/Plugins/ExtensionInstaller.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.IO.Compression;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Plugins\r\n{\r\n    public enum ExtInstallType\r\n    {\r\n        Install,\r\n        Uninstall\r\n    }\r\n\r\n    public class ExtensionInstallQueueItem\r\n    {\r\n        public ExtInstallType InstallType { get; set; }\r\n\r\n        public string Path { get; set; }\r\n\r\n        public ExtensionInstallQueueItem()\r\n        {\r\n        }\r\n\r\n        public ExtensionInstallQueueItem(string path, ExtInstallType type)\r\n        {\r\n            Path = path;\r\n            InstallType = type;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Path;\r\n        }\r\n    }\r\n\r\n    public class ExtensionInstallResult\r\n    {\r\n        public bool Updated { get; set; }\r\n        public Exception InstallError { get; set; }\r\n        public BaseExtensionManifest InstalledManifest { get; set; }\r\n        public string PackagePath { get; set; }\r\n\r\n        public ExtensionInstallResult(bool updated, BaseExtensionManifest installedManifest, string packagePath)\r\n        {\r\n            Updated = updated;\r\n            InstalledManifest = installedManifest;\r\n            PackagePath = packagePath;\r\n        }\r\n\r\n        public ExtensionInstallResult(Exception installError,  string packagePath)\r\n        {\r\n            InstallError = installError;\r\n            PackagePath = packagePath;\r\n        }\r\n    }\r\n\r\n    public class ExtensionInstaller\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private static List<ExtensionInstallQueueItem> currentQueue = new List<ExtensionInstallQueueItem>();\r\n        private static Dictionary<string, DateTime> agreedLicenses;\r\n\r\n        static ExtensionInstaller()\r\n        {\r\n            if (File.Exists(PlaynitePaths.AddonLicenseAgreementsFilePath))\r\n            {\r\n                agreedLicenses = Serialization.FromJsonFile<Dictionary<string, DateTime>>(PlaynitePaths.AddonLicenseAgreementsFilePath);\r\n            }\r\n            else\r\n            {\r\n                agreedLicenses = new Dictionary<string, DateTime>();\r\n            }\r\n        }\r\n\r\n        public static void AgreeAddonLicense(string addonId)\r\n        {\r\n            agreedLicenses[addonId] = DateTime.Today;\r\n            File.WriteAllText(PlaynitePaths.AddonLicenseAgreementsFilePath, Serialization.ToJson(agreedLicenses, true));\r\n        }\r\n\r\n        public static void RemoveAddonLicenseAgreement(string addonId)\r\n        {\r\n            if (agreedLicenses.ContainsKey(addonId))\r\n            {\r\n                agreedLicenses.Remove(addonId);\r\n                File.WriteAllText(PlaynitePaths.AddonLicenseAgreementsFilePath, Serialization.ToJson(agreedLicenses, true));\r\n            }\r\n        }\r\n\r\n        public static DateTime? GetAddonLicenseAgreed(string addonId)\r\n        {\r\n            if (agreedLicenses.ContainsKey(addonId))\r\n            {\r\n                return agreedLicenses[addonId];\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static List<ExtensionInstallQueueItem> GetQueuedItems()\r\n        {\r\n            if (!File.Exists(PlaynitePaths.ExtensionQueueFilePath))\r\n            {\r\n                return new List<ExtensionInstallQueueItem>();\r\n            }\r\n\r\n            return Serialization.FromJsonFile<List<ExtensionInstallQueueItem>>(PlaynitePaths.ExtensionQueueFilePath);\r\n        }\r\n\r\n        public static List<ExtensionInstallResult> InstallExtensionQueue()\r\n        {\r\n            var installedExts = new List<ExtensionInstallResult>();\r\n\r\n            foreach (var queueItem in GetQueuedItems())\r\n            {\r\n                if (queueItem.InstallType == ExtInstallType.Install)\r\n                {\r\n                    if (queueItem.Path.EndsWith(PlaynitePaths.PackedThemeFileExtention, StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        try\r\n                        {\r\n                            installedExts.Add(InstallPackedTheme(queueItem.Path));\r\n                            logger.Info($\"Installed theme {queueItem}\");\r\n                        }\r\n                        catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            installedExts.Add(new ExtensionInstallResult(e, queueItem.Path));\r\n                            logger.Error(e, $\"Failed to install theme {queueItem}\");\r\n                        }\r\n                    }\r\n                    else if (queueItem.Path.EndsWith(PlaynitePaths.PackedExtensionFileExtention, StringComparison.OrdinalIgnoreCase))\r\n                    {\r\n                        try\r\n                        {\r\n                            installedExts.Add(InstallPackedExtension(queueItem.Path));\r\n                            logger.Info($\"Installed extension {queueItem}\");\r\n                        }\r\n                        catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            installedExts.Add(new ExtensionInstallResult(e, queueItem.Path));\r\n                            logger.Error(e, $\"Failed to install extension {queueItem}\");\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        logger.Warn($\"Uknown extension file format {queueItem}\");\r\n                    }\r\n                }\r\n                else if (queueItem.InstallType == ExtInstallType.Uninstall)\r\n                {\r\n                    if (Directory.Exists(queueItem.Path))\r\n                    {\r\n                        try\r\n                        {\r\n                            Directory.Delete(queueItem.Path, true);\r\n                            logger.Info($\"Uninstalled theme or extension {queueItem}\");\r\n                        }\r\n                        catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            logger.Error(e, $\"Failed to uninstall extension {queueItem}\");\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        logger.Warn($\"Can't uninstall extension, directory doesn't exists anymore {queueItem}\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            File.Delete(PlaynitePaths.ExtensionQueueFilePath);\r\n            currentQueue = new List<ExtensionInstallQueueItem>();\r\n            return installedExts;\r\n        }\r\n\r\n        public static ExtensionInstallResult InstallPackedFile<T>(string packagePath, string nanifestFileName, string rootDir, Func<string, T> newMan) where T : BaseExtensionManifest\r\n        {\r\n            logger.Info($\"Installing extenstion/theme {packagePath}\");\r\n            var manifest = GetPackedManifest<T>(packagePath, nanifestFileName);\r\n            if (manifest == null)\r\n            {\r\n                throw new FileNotFoundException(\"Extenstion/theme manifest not found.\");\r\n            }\r\n\r\n            var entries = Archive.GetArchiveFiles(packagePath);\r\n            if (entries.Any(a => a.EndsWith(\".sln\", StringComparison.OrdinalIgnoreCase)))\r\n            {\r\n                // Check for themes that are not packaged via Toolbox.\r\n                throw new Exception(\"Package content invalid.\");\r\n            }\r\n\r\n            if (manifest is ThemeManifest themeMan)\r\n            {\r\n                rootDir = Path.Combine(rootDir, themeMan.Mode.ToString());\r\n            }\r\n\r\n            var wasUpdated = false;\r\n            var installDir = Path.Combine(rootDir, Paths.GetSafePathName(manifest.Id));\r\n            if (Directory.Exists(installDir))\r\n            {\r\n                wasUpdated = true;\r\n                logger.Debug($\"Replacing existing extenstion/theme installation: {installDir}.\");\r\n            }\r\n\r\n            FileSystem.CreateDirectory(installDir, true);\r\n            ZipFile.ExtractToDirectory(packagePath, installDir);\r\n            if (Paths.AreEqual(PlaynitePaths.TempPath, Path.GetDirectoryName(packagePath)))\r\n            {\r\n                File.Delete(packagePath);\r\n            }\r\n\r\n            return new ExtensionInstallResult(wasUpdated, newMan(Path.Combine(installDir, nanifestFileName)), packagePath);\r\n        }\r\n\r\n        public static ExtensionInstallResult InstallPackedExtension(string path)\r\n        {\r\n            return InstallPackedFile<ExtensionManifest>(\r\n                path,\r\n                PlaynitePaths.ExtensionManifestFileName,\r\n                PlaynitePaths.ExtensionsUserDataPath,\r\n                (a) => ExtensionManifest.FromFile(a));\r\n        }\r\n\r\n        public static ExtensionInstallResult InstallPackedTheme(string path)\r\n        {\r\n            return InstallPackedFile<ThemeManifest>(\r\n               path,\r\n               PlaynitePaths.ThemeManifestFileName,\r\n               PlaynitePaths.ThemesUserDataPath,\r\n               (a) => new ThemeManifest(a));\r\n        }\r\n\r\n        private static T GetPackedManifest<T>(string packagePath, string nanifestFileName) where T : class\r\n        {\r\n            using (var zip = ZipFile.OpenRead(packagePath))\r\n            {\r\n                var manifest = zip.GetEntry(nanifestFileName);\r\n                if (manifest == null)\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                using (var logStream = manifest.Open())\r\n                {\r\n                    using (TextReader tr = new StreamReader(logStream))\r\n                    {\r\n                        return Serialization.FromYaml<T>(tr.ReadToEnd());\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private static BaseExtensionManifest GetManifestFromDir(string extDir)\r\n        {\r\n            if (!Directory.Exists(extDir))\r\n            {\r\n                return null;\r\n            }\r\n\r\n            var extMan = Path.Combine(extDir, PlaynitePaths.ExtensionManifestFileName);\r\n            if (File.Exists(extMan))\r\n            {\r\n                return GetExtensionManifest(extMan);\r\n            }\r\n\r\n            var themeMan = Path.Combine(extDir, PlaynitePaths.ThemeManifestFileName);\r\n            if (File.Exists(themeMan))\r\n            {\r\n                return GetThemeManifest(themeMan);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        private static T GetManifestFile<T>(string manifestPath) where T : class\r\n        {\r\n            return Serialization.FromYaml<T>(File.ReadAllText(manifestPath));\r\n        }\r\n\r\n        public static ThemeManifest GetPackedThemeManifest(string packagePath)\r\n        {\r\n            return GetPackedManifest<ThemeManifest>(packagePath, PlaynitePaths.ThemeManifestFileName);\r\n        }\r\n\r\n        public static ThemeManifest GetThemeManifest(string manifestPath)\r\n        {\r\n            return GetManifestFile<ThemeManifest>(manifestPath);\r\n        }\r\n\r\n        public static ExtensionManifest GetPackedExtensionManifest(string packagePath)\r\n        {\r\n            return GetPackedManifest<ExtensionManifest>(packagePath, PlaynitePaths.ExtensionManifestFileName);\r\n        }\r\n\r\n        public static ExtensionManifest GetExtensionManifest(string manifestPath)\r\n        {\r\n            return GetManifestFile<ExtensionManifest>(manifestPath);\r\n        }\r\n\r\n        public static void QueuePackageInstall(string packagePath)\r\n        {\r\n            QueueExtensionOperation(packagePath, ExtInstallType.Install);\r\n        }\r\n\r\n        public static void QueueExtensionUninstall(string extensionDirectory)\r\n        {\r\n            QueueExtensionOperation(extensionDirectory, ExtInstallType.Uninstall);\r\n        }\r\n\r\n        private static void QueueExtensionOperation(string extensionPath, ExtInstallType installationType)\r\n        {\r\n            if (currentQueue.FirstOrDefault(a => a.Path == extensionPath) == null)\r\n            {\r\n                currentQueue.Add(new ExtensionInstallQueueItem(extensionPath, installationType));\r\n            }\r\n\r\n            FileSystem.WriteStringToFile(PlaynitePaths.ExtensionQueueFilePath, Serialization.ToJson(currentQueue));\r\n        }\r\n\r\n        public static void VerifyExtensionPackage(string packagePath)\r\n        {\r\n            using (var zip = ZipFile.OpenRead(packagePath))\r\n            {\r\n                var manifestEntry = zip.GetEntry(PlaynitePaths.ExtensionManifestFileName);\r\n                if (manifestEntry == null)\r\n                {\r\n                    logger.Error(\"Extension package is invalid, no manifest found.\");\r\n                    throw new LocalizedException(LOC.GeneralExtensionPackageError);\r\n                }\r\n\r\n                using (var logStream = manifestEntry.Open())\r\n                {\r\n                    using (TextReader tr = new StreamReader(logStream))\r\n                    {\r\n                        var manifest = Serialization.FromYaml<ExtensionManifest>(tr.ReadToEnd());\r\n                        if (manifest.Id.IsNullOrEmpty())\r\n                        {\r\n                            logger.Error(\"Extension package is invalid, no extension ID found.\");\r\n                            throw new LocalizedException(LOC.GeneralExtensionPackageError);\r\n                        }\r\n\r\n                        if (!Version.TryParse(manifest.Version, out var _))\r\n                        {\r\n                            logger.Error($\"Extension package is invalid, version is not in correct format {manifest.Version}.\");\r\n                            throw new LocalizedException(LOC.GeneralExtensionPackageError);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (zip.Entries.Any(a => a.Name == \"Playnite.dll\" || a.Name == \"Playnite.Common.dll\" || a.Name == \"Playnite.SDK.dll\"))\r\n                {\r\n                    logger.Error($\"Extension package is invalid, includes not allowed Playnite dependencies.\");\r\n                    throw new LocalizedException(LOC.GeneralExtensionPackageError);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void VerifyThemePackage(string packagePath)\r\n        {\r\n            using (var zip = ZipFile.OpenRead(packagePath))\r\n            {\r\n                var manifestEntry = zip.GetEntry(PlaynitePaths.ThemeManifestFileName);\r\n                if (manifestEntry == null)\r\n                {\r\n                    logger.Error(\"Theme package is invalid, no manifest found.\");\r\n                    throw new LocalizedException(LOC.GeneralThemePackageError);\r\n                }\r\n\r\n                using (var logStream = manifestEntry.Open())\r\n                {\r\n                    using (TextReader tr = new StreamReader(logStream))\r\n                    {\r\n                        var manifest = Serialization.FromYaml<ThemeManifest>(tr.ReadToEnd());\r\n                        if (manifest.Id.IsNullOrEmpty())\r\n                        {\r\n                            logger.Error(\"Theme package is invalid, no extension ID found.\");\r\n                            throw new LocalizedException(LOC.GeneralThemePackageError);\r\n                        }\r\n\r\n                        if (!Version.TryParse(manifest.Version, out var _))\r\n                        {\r\n                            logger.Error($\"Theme package is invalid, version is not in correct format {manifest.Version}.\");\r\n                            throw new LocalizedException(LOC.GeneralThemePackageError);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (zip.Entries.Any(a =>\r\n                    a.Name == PlaynitePaths.ThemeSlnFileName ||\r\n                    a.Name == PlaynitePaths.ThemeProjFileName ||\r\n                    a.Name == PlaynitePaths.AppXamlFileName))\r\n                {\r\n                    logger.Error($\"Theme package is invalid, includes not allowed theme project files.\");\r\n                    throw new LocalizedException(LOC.GeneralThemePackageError);\r\n                }\r\n\r\n                if (zip.Entries.Any(a => a.Name == \"Playnite.dll\" || a.Name == \"Playnite.Common.dll\" || a.Name == \"Playnite.SDK.dll\"))\r\n                {\r\n                    logger.Error($\"Theme package is invalid, includes not allowed Playnite dependencies.\");\r\n                    throw new LocalizedException(LOC.GeneralThemePackageError);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\nusing System.Windows.Markup;\r\n\r\n[assembly: System.Windows.ThemeInfo(System.Windows.ResourceDictionaryLocation.None, System.Windows.ResourceDictionaryLocation.SourceAssembly)]\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"Playnite\")]\r\n[assembly: AssemblyDescription(\"Playnite Support Library\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"Josef Nemec\")]\r\n[assembly: AssemblyProduct(\"Playnite\")]\r\n[assembly: AssemblyCopyright(\"Copyright © Josef Nemec 2018\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"ad271e73-8a13-4c4e-bfdc-3076646b59e3\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"10.51.0.*\")]\r\n[assembly: InternalsVisibleTo(\"Playnite.Tests\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.Controls\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.Commands\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.Behaviors\")]\r\n"
  },
  {
    "path": "source/Playnite/SDL2.cs",
    "content": "#region License\n/* SDL2# - C# Wrapper for SDL2\n *\n * Copyright (c) 2013-2021 Ethan Lee.\n *\n * This software is provided 'as-is', without any express or implied warranty.\n * In no event will the authors be held liable for any damages arising from\n * the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software in a\n * product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n *\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n *\n * 3. This notice may not be removed or altered from any source distribution.\n *\n * Ethan \"flibitijibibo\" Lee <flibitijibibo@flibitijibibo.com>\n *\n */\n#endregion\n\n#region Using Statements\nusing System;\nusing System.Diagnostics;\n#if NET6_0_OR_GREATER\nusing System.Diagnostics.CodeAnalysis;\n#endif\nusing System.Runtime.InteropServices;\nusing System.Text;\n#endregion\n\nnamespace SDL2\n{\n\tpublic static class SDL\n\t{\n\t\t#region SDL2# Variables\n\n\t\tprivate const string nativeLibName = \"SDL2\";\n\n\t\t#endregion\n\n\t\t#region Marshaling\n\n#if NET6_0_OR_GREATER\n\t\tinternal static T PtrToStructure<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] T>(IntPtr ptr)\n\t\t{\n\t\t\treturn Marshal.PtrToStructure<T>(ptr);\n\t\t}\n\n\t\tinternal static T GetDelegateForFunctionPointer<T>(IntPtr ptr) where T : Delegate\n\t\t{\n\t\t\treturn Marshal.GetDelegateForFunctionPointer<T>(ptr);\n\t\t}\n#else\n\t\tinternal static T PtrToStructure<T>(IntPtr ptr)\n\t\t{\n\t\t\treturn (T) Marshal.PtrToStructure(ptr, typeof(T));\n\t\t}\n\n\t\tinternal static Delegate GetDelegateForFunctionPointer<T>(IntPtr ptr)\n\t\t{\n\t\t\treturn Marshal.GetDelegateForFunctionPointer(ptr, typeof(T));\n\t\t}\n#endif\n\n\t\tinternal static int SizeOf<T>()\n\t\t{\n#if NETSTANDARD2_0_OR_GREATER || NET6_0_OR_GREATER\n\t\t\treturn Marshal.SizeOf<T>();\n#else\n\t\t\treturn Marshal.SizeOf(typeof(T));\n#endif\n\t\t}\n\n\t\t#endregion\n\n\t\t#region UTF8 Marshaling\n\n\t\t/* Used for stack allocated string marshaling. */\n\t\tinternal static int Utf8Size(string str)\n\t\t{\n\t\t\tif (str == null)\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn (str.Length * 4) + 1;\n\t\t}\n\t\tinternal static unsafe byte* Utf8Encode(string str, byte* buffer, int bufferSize)\n\t\t{\n\t\t\tif (str == null)\n\t\t\t{\n\t\t\t\treturn (byte*) 0;\n\t\t\t}\n\t\t\tfixed (char* strPtr = str)\n\t\t\t{\n\t\t\t\tEncoding.UTF8.GetBytes(strPtr, str.Length + 1, buffer, bufferSize);\n\t\t\t}\n\t\t\treturn buffer;\n\t\t}\n\n\t\t/* Used for heap allocated string marshaling.\n\t\t * Returned byte* must be free'd with FreeHGlobal.\n\t\t */\n\t\tinternal static unsafe byte* Utf8EncodeHeap(string str)\n\t\t{\n\t\t\tif (str == null)\n\t\t\t{\n\t\t\t\treturn (byte*) 0;\n\t\t\t}\n\n\t\t\tint bufferSize = Utf8Size(str);\n\t\t\tbyte* buffer = (byte*) Marshal.AllocHGlobal(bufferSize);\n\t\t\tfixed (char* strPtr = str)\n\t\t\t{\n\t\t\t\tEncoding.UTF8.GetBytes(strPtr, str.Length + 1, buffer, bufferSize);\n\t\t\t}\n\t\t\treturn buffer;\n\t\t}\n\n\t\t/* This is public because SDL_DropEvent needs it! */\n\t\tpublic static unsafe string UTF8_ToManaged(IntPtr s, bool freePtr = false)\n\t\t{\n\t\t\tif (s == IntPtr.Zero)\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t/* We get to do strlen ourselves! */\n\t\t\tbyte* ptr = (byte*) s;\n\t\t\twhile (*ptr != 0)\n\t\t\t{\n\t\t\t\tptr++;\n\t\t\t}\n\n\t\t\t/* TODO: This #ifdef is only here because the equivalent\n\t\t\t * .NET 2.0 constructor appears to be less efficient?\n\t\t\t * Here's the pretty version, maybe steal this instead:\n\t\t\t *\n\t\t\tstring result = new string(\n\t\t\t\t(sbyte*) s, // Also, why sbyte???\n\t\t\t\t0,\n\t\t\t\t(int) (ptr - (byte*) s),\n\t\t\t\tSystem.Text.Encoding.UTF8\n\t\t\t);\n\t\t\t * See the CoreCLR source for more info.\n\t\t\t * -flibit\n\t\t\t */\n#if NETSTANDARD2_0\n\t\t\t/* Modern C# lets you just send the byte*, nice! */\n\t\t\tstring result = System.Text.Encoding.UTF8.GetString(\n\t\t\t\t(byte*) s,\n\t\t\t\t(int) (ptr - (byte*) s)\n\t\t\t);\n#else\n\t\t\t/* Old C# requires an extra memcpy, bleh! */\n\t\t\tint len = (int) (ptr - (byte*) s);\n\t\t\tif (len == 0)\n\t\t\t{\n\t\t\t\treturn string.Empty;\n\t\t\t}\n\t\t\tchar* chars = stackalloc char[len];\n\t\t\tint strLen = System.Text.Encoding.UTF8.GetChars((byte*) s, len, chars, len);\n\t\t\tstring result = new string(chars, 0, strLen);\n#endif\n\n\t\t\t/* Some SDL functions will malloc, we have to free! */\n\t\t\tif (freePtr)\n\t\t\t{\n\t\t\t\tSDL_free(s);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\t#endregion\n\n\t\t#region SDL_stdinc.h\n\n\t\tpublic static uint SDL_FOURCC(byte A, byte B, byte C, byte D)\n\t\t{\n\t\t\treturn (uint) (A | (B << 8) | (C << 16) | (D << 24));\n\t\t}\n\n\t\tpublic enum SDL_bool\n\t\t{\n\t\t\tSDL_FALSE = 0,\n\t\t\tSDL_TRUE = 1\n\t\t}\n\n\t\t/* malloc/free are used by the marshaler! -flibit */\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tinternal static extern IntPtr SDL_malloc(IntPtr size);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tinternal static extern void SDL_free(IntPtr memblock);\n\n\t\t/* Buffer.BlockCopy is not available in every runtime yet. Also,\n\t\t * using memcpy directly can be a compatibility issue in other\n\t\t * strange ways. So, we expose this to get around all that.\n\t\t * -flibit\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_memcpy(IntPtr dst, IntPtr src, IntPtr len);\n\n\t\t#endregion\n\n\t\t#region SDL_rwops.h\n\n\t\tpublic const int RW_SEEK_SET = 0;\n\t\tpublic const int RW_SEEK_CUR = 1;\n\t\tpublic const int RW_SEEK_END = 2;\n\n\t\tpublic const UInt32 SDL_RWOPS_UNKNOWN\t= 0; /* Unknown stream type */\n\t\tpublic const UInt32 SDL_RWOPS_WINFILE\t= 1; /* Win32 file */\n\t\tpublic const UInt32 SDL_RWOPS_STDFILE\t= 2; /* Stdio file */\n\t\tpublic const UInt32 SDL_RWOPS_JNIFILE\t= 3; /* Android asset */\n\t\tpublic const UInt32 SDL_RWOPS_MEMORY\t= 4; /* Memory stream */\n\t\tpublic const UInt32 SDL_RWOPS_MEMORY_RO = 5; /* Read-Only memory stream */\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate long SDLRWopsSizeCallback(IntPtr context);\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate long SDLRWopsSeekCallback(\n\t\t\tIntPtr context,\n\t\t\tlong offset,\n\t\t\tint whence\n\t\t);\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate IntPtr SDLRWopsReadCallback(\n\t\t\tIntPtr context,\n\t\t\tIntPtr ptr,\n\t\t\tIntPtr size,\n\t\t\tIntPtr maxnum\n\t\t);\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate IntPtr SDLRWopsWriteCallback(\n\t\t\tIntPtr context,\n\t\t\tIntPtr ptr,\n\t\t\tIntPtr size,\n\t\t\tIntPtr num\n\t\t);\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate int SDLRWopsCloseCallback(\n\t\t\tIntPtr context\n\t\t);\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_RWops\n\t\t{\n\t\t\tpublic IntPtr size;\n\t\t\tpublic IntPtr seek;\n\t\t\tpublic IntPtr read;\n\t\t\tpublic IntPtr write;\n\t\t\tpublic IntPtr close;\n\n\t\t\tpublic UInt32 type;\n\n\t\t\t/* NOTE: This isn't the full structure since\n\t\t\t * the native SDL_RWops contains a hidden union full of\n\t\t\t * internal information and platform-specific stuff depending\n\t\t\t * on what conditions the native library was built with\n\t\t\t */\n\t\t}\n\n\t\t/* IntPtr refers to an SDL_RWops* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_RWFromFile\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe IntPtr INTERNAL_SDL_RWFromFile(\n\t\t\tbyte* file,\n\t\t\tbyte* mode\n\t\t);\n\t\tpublic static unsafe IntPtr SDL_RWFromFile(\n\t\t\tstring file,\n\t\t\tstring mode\n\t\t) {\n\t\t\tbyte* utf8File = Utf8EncodeHeap(file);\n\t\t\tbyte* utf8Mode = Utf8EncodeHeap(mode);\n\t\t\tIntPtr rwOps = INTERNAL_SDL_RWFromFile(\n\t\t\t\tutf8File,\n\t\t\t\tutf8Mode\n\t\t\t);\n\t\t\tMarshal.FreeHGlobal((IntPtr) utf8Mode);\n\t\t\tMarshal.FreeHGlobal((IntPtr) utf8File);\n\t\t\treturn rwOps;\n\t\t}\n\n\t\t/* IntPtr refers to an SDL_RWops* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_AllocRW();\n\n\t\t/* area refers to an SDL_RWops* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_FreeRW(IntPtr area);\n\n\t\t/* fp refers to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_RWFromFP(IntPtr fp, SDL_bool autoclose);\n\n\t\t/* mem refers to a void*, IntPtr to an SDL_RWops* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_RWFromMem(IntPtr mem, int size);\n\n\t\t/* mem refers to a const void*, IntPtr to an SDL_RWops* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_RWFromConstMem(IntPtr mem, int size);\n\n\t\t/* context refers to an SDL_RWops*.\n\t\t * Only available in SDL 2.0.10 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern long SDL_RWsize(IntPtr context);\n\n\t\t/* context refers to an SDL_RWops*.\n\t\t * Only available in SDL 2.0.10 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern long SDL_RWseek(\n\t\t\tIntPtr context,\n\t\t\tlong offset,\n\t\t\tint whence\n\t\t);\n\n\t\t/* context refers to an SDL_RWops*.\n\t\t * Only available in SDL 2.0.10 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern long SDL_RWtell(IntPtr context);\n\n\t\t/* context refers to an SDL_RWops*, ptr refers to a void*.\n\t\t * Only available in SDL 2.0.10 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern long SDL_RWread(\n\t\t\tIntPtr context,\n\t\t\tIntPtr ptr,\n\t\t\tIntPtr size,\n\t\t\tIntPtr maxnum\n\t\t);\n\n\t\t/* context refers to an SDL_RWops*, ptr refers to a const void*.\n\t\t * Only available in SDL 2.0.10 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern long SDL_RWwrite(\n\t\t\tIntPtr context,\n\t\t\tIntPtr ptr,\n\t\t\tIntPtr size,\n\t\t\tIntPtr maxnum\n\t\t);\n\n\t\t/* Read endian functions */\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern byte SDL_ReadU8(IntPtr src);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt16 SDL_ReadLE16(IntPtr src);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt16 SDL_ReadBE16(IntPtr src);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_ReadLE32(IntPtr src);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_ReadBE32(IntPtr src);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt64 SDL_ReadLE64(IntPtr src);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt64 SDL_ReadBE64(IntPtr src);\n\n\t\t/* Write endian functions */\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_WriteU8(IntPtr dst, byte value);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_WriteLE16(IntPtr dst, UInt16 value);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_WriteBE16(IntPtr dst, UInt16 value);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_WriteLE32(IntPtr dst, UInt32 value);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_WriteBE32(IntPtr dst, UInt32 value);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_WriteLE64(IntPtr dst, UInt64 value);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_WriteBE64(IntPtr dst, UInt64 value);\n\n\t\t/* context refers to an SDL_RWops*\n\t\t * Only available in SDL 2.0.10 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern long SDL_RWclose(IntPtr context);\n\n\t\t/* datasize refers to a size_t*\n\t\t * IntPtr refers to a void*\n\t\t * Only available in SDL 2.0.10 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_LoadFile\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe IntPtr INTERNAL_SDL_LoadFile(byte* file, out IntPtr datasize);\n\t\tpublic static unsafe IntPtr SDL_LoadFile(string file, out IntPtr datasize)\n\t\t{\n\t\t\tbyte* utf8File = Utf8EncodeHeap(file);\n\t\t\tIntPtr result = INTERNAL_SDL_LoadFile(utf8File, out datasize);\n\t\t\tMarshal.FreeHGlobal((IntPtr) utf8File);\n\t\t\treturn result;\n\t\t}\n\n\t\t#endregion\n\n\t\t#region SDL_main.h\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetMainReady();\n\n\t\t/* This is used as a function pointer to a C main() function */\n\t\tpublic delegate int SDL_main_func(int argc, IntPtr argv);\n\n\t\t/* Use this function with UWP to call your C# Main() function! */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_WinRTRunApp(\n\t\t\tSDL_main_func mainFunction,\n\t\t\tIntPtr reserved\n\t\t);\n\n\t\t/* Use this function with GDK/GDKX to call your C# Main() function!\n\t\t * Only available in SDL 2.24.0 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GDKRunApp(\n\t\t\tSDL_main_func mainFunction,\n\t\t\tIntPtr reserved\n\t\t);\n\n\t\t/* Use this function with iOS to call your C# Main() function!\n\t\t * Only available in SDL 2.0.10 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_UIKitRunApp(\n\t\t\tint argc,\n\t\t\tIntPtr argv,\n\t\t\tSDL_main_func mainFunction\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL.h\n\n\t\tpublic const uint SDL_INIT_TIMER =\t\t0x00000001;\n\t\tpublic const uint SDL_INIT_AUDIO =\t\t0x00000010;\n\t\tpublic const uint SDL_INIT_VIDEO =\t\t0x00000020;\n\t\tpublic const uint SDL_INIT_JOYSTICK =\t\t0x00000200;\n\t\tpublic const uint SDL_INIT_HAPTIC =\t\t0x00001000;\n\t\tpublic const uint SDL_INIT_GAMECONTROLLER =\t0x00002000;\n\t\tpublic const uint SDL_INIT_EVENTS =\t\t0x00004000;\n\t\tpublic const uint SDL_INIT_SENSOR =\t\t0x00008000;\n\t\tpublic const uint SDL_INIT_NOPARACHUTE =\t0x00100000;\n\t\tpublic const uint SDL_INIT_EVERYTHING = (\n\t\t\tSDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO |\n\t\t\tSDL_INIT_EVENTS | SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC |\n\t\t\tSDL_INIT_GAMECONTROLLER | SDL_INIT_SENSOR\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_Init(uint flags);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_InitSubSystem(uint flags);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_Quit();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_QuitSubSystem(uint flags);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_WasInit(uint flags);\n\n\t\t#endregion\n\n\t\t#region SDL_platform.h\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetPlatform\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetPlatform();\n\t\tpublic static string SDL_GetPlatform()\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_GetPlatform());\n\t\t}\n\n\t\t#endregion\n\n\t\t#region SDL_hints.h\n\n\t\tpublic const string SDL_HINT_FRAMEBUFFER_ACCELERATION =\n\t\t\t\"SDL_FRAMEBUFFER_ACCELERATION\";\n\t\tpublic const string SDL_HINT_RENDER_DRIVER =\n\t\t\t\"SDL_RENDER_DRIVER\";\n\t\tpublic const string SDL_HINT_RENDER_OPENGL_SHADERS =\n\t\t\t\"SDL_RENDER_OPENGL_SHADERS\";\n\t\tpublic const string SDL_HINT_RENDER_DIRECT3D_THREADSAFE =\n\t\t\t\"SDL_RENDER_DIRECT3D_THREADSAFE\";\n\t\tpublic const string SDL_HINT_RENDER_VSYNC =\n\t\t\t\"SDL_RENDER_VSYNC\";\n\t\tpublic const string SDL_HINT_VIDEO_X11_XVIDMODE =\n\t\t\t\"SDL_VIDEO_X11_XVIDMODE\";\n\t\tpublic const string SDL_HINT_VIDEO_X11_XINERAMA =\n\t\t\t\"SDL_VIDEO_X11_XINERAMA\";\n\t\tpublic const string SDL_HINT_VIDEO_X11_XRANDR =\n\t\t\t\"SDL_VIDEO_X11_XRANDR\";\n\t\tpublic const string SDL_HINT_GRAB_KEYBOARD =\n\t\t\t\"SDL_GRAB_KEYBOARD\";\n\t\tpublic const string SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS =\n\t\t\t\"SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS\";\n\t\tpublic const string SDL_HINT_IDLE_TIMER_DISABLED =\n\t\t\t\"SDL_IOS_IDLE_TIMER_DISABLED\";\n\t\tpublic const string SDL_HINT_ORIENTATIONS =\n\t\t\t\"SDL_IOS_ORIENTATIONS\";\n\t\tpublic const string SDL_HINT_XINPUT_ENABLED =\n\t\t\t\"SDL_XINPUT_ENABLED\";\n\t\tpublic const string SDL_HINT_GAMECONTROLLERCONFIG =\n\t\t\t\"SDL_GAMECONTROLLERCONFIG\";\n\t\tpublic const string SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS =\n\t\t\t\"SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS\";\n\t\tpublic const string SDL_HINT_ALLOW_TOPMOST =\n\t\t\t\"SDL_ALLOW_TOPMOST\";\n\t\tpublic const string SDL_HINT_TIMER_RESOLUTION =\n\t\t\t\"SDL_TIMER_RESOLUTION\";\n\t\tpublic const string SDL_HINT_RENDER_SCALE_QUALITY =\n\t\t\t\"SDL_RENDER_SCALE_QUALITY\";\n\n\t\t/* Only available in SDL 2.0.1 or higher. */\n\t\tpublic const string SDL_HINT_VIDEO_HIGHDPI_DISABLED =\n\t\t\t\"SDL_VIDEO_HIGHDPI_DISABLED\";\n\n\t\t/* Only available in SDL 2.0.2 or higher. */\n\t\tpublic const string SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK =\n\t\t\t\"SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK\";\n\t\tpublic const string SDL_HINT_VIDEO_WIN_D3DCOMPILER =\n\t\t\t\"SDL_VIDEO_WIN_D3DCOMPILER\";\n\t\tpublic const string SDL_HINT_MOUSE_RELATIVE_MODE_WARP =\n\t\t\t\"SDL_MOUSE_RELATIVE_MODE_WARP\";\n\t\tpublic const string SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT =\n\t\t\t\"SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT\";\n\t\tpublic const string SDL_HINT_VIDEO_ALLOW_SCREENSAVER =\n\t\t\t\"SDL_VIDEO_ALLOW_SCREENSAVER\";\n\t\tpublic const string SDL_HINT_ACCELEROMETER_AS_JOYSTICK =\n\t\t\t\"SDL_ACCELEROMETER_AS_JOYSTICK\";\n\t\tpublic const string SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES =\n\t\t\t\"SDL_VIDEO_MAC_FULLSCREEN_SPACES\";\n\n\t\t/* Only available in SDL 2.0.3 or higher. */\n\t\tpublic const string SDL_HINT_WINRT_PRIVACY_POLICY_URL =\n\t\t\t\"SDL_WINRT_PRIVACY_POLICY_URL\";\n\t\tpublic const string SDL_HINT_WINRT_PRIVACY_POLICY_LABEL =\n\t\t\t\"SDL_WINRT_PRIVACY_POLICY_LABEL\";\n\t\tpublic const string SDL_HINT_WINRT_HANDLE_BACK_BUTTON =\n\t\t\t\"SDL_WINRT_HANDLE_BACK_BUTTON\";\n\n\t\t/* Only available in SDL 2.0.4 or higher. */\n\t\tpublic const string SDL_HINT_NO_SIGNAL_HANDLERS =\n\t\t\t\"SDL_NO_SIGNAL_HANDLERS\";\n\t\tpublic const string SDL_HINT_IME_INTERNAL_EDITING =\n\t\t\t\"SDL_IME_INTERNAL_EDITING\";\n\t\tpublic const string SDL_HINT_ANDROID_SEPARATE_MOUSE_AND_TOUCH =\n\t\t\t\"SDL_ANDROID_SEPARATE_MOUSE_AND_TOUCH\";\n\t\tpublic const string SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT =\n\t\t\t\"SDL_EMSCRIPTEN_KEYBOARD_ELEMENT\";\n\t\tpublic const string SDL_HINT_THREAD_STACK_SIZE =\n\t\t\t\"SDL_THREAD_STACK_SIZE\";\n\t\tpublic const string SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN =\n\t\t\t\"SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN\";\n\t\tpublic const string SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP =\n\t\t\t\"SDL_WINDOWS_ENABLE_MESSAGELOOP\";\n\t\tpublic const string SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 =\n\t\t\t\"SDL_WINDOWS_NO_CLOSE_ON_ALT_F4\";\n\t\tpublic const string SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING =\n\t\t\t\"SDL_XINPUT_USE_OLD_JOYSTICK_MAPPING\";\n\t\tpublic const string SDL_HINT_MAC_BACKGROUND_APP =\n\t\t\t\"SDL_MAC_BACKGROUND_APP\";\n\t\tpublic const string SDL_HINT_VIDEO_X11_NET_WM_PING =\n\t\t\t\"SDL_VIDEO_X11_NET_WM_PING\";\n\t\tpublic const string SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION =\n\t\t\t\"SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION\";\n\t\tpublic const string SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION =\n\t\t\t\"SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION\";\n\n\t\t/* Only available in 2.0.5 or higher. */\n\t\tpublic const string SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH =\n\t\t\t\"SDL_MOUSE_FOCUS_CLICKTHROUGH\";\n\t\tpublic const string SDL_HINT_BMP_SAVE_LEGACY_FORMAT =\n\t\t\t\"SDL_BMP_SAVE_LEGACY_FORMAT\";\n\t\tpublic const string SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING =\n\t\t\t\"SDL_WINDOWS_DISABLE_THREAD_NAMING\";\n\t\tpublic const string SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION =\n\t\t\t\"SDL_APPLE_TV_REMOTE_ALLOW_ROTATION\";\n\n\t\t/* Only available in 2.0.6 or higher. */\n\t\tpublic const string SDL_HINT_AUDIO_RESAMPLING_MODE =\n\t\t\t\"SDL_AUDIO_RESAMPLING_MODE\";\n\t\tpublic const string SDL_HINT_RENDER_LOGICAL_SIZE_MODE =\n\t\t\t\"SDL_RENDER_LOGICAL_SIZE_MODE\";\n\t\tpublic const string SDL_HINT_MOUSE_NORMAL_SPEED_SCALE =\n\t\t\t\"SDL_MOUSE_NORMAL_SPEED_SCALE\";\n\t\tpublic const string SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE =\n\t\t\t\"SDL_MOUSE_RELATIVE_SPEED_SCALE\";\n\t\tpublic const string SDL_HINT_TOUCH_MOUSE_EVENTS =\n\t\t\t\"SDL_TOUCH_MOUSE_EVENTS\";\n\t\tpublic const string SDL_HINT_WINDOWS_INTRESOURCE_ICON =\n\t\t\t\"SDL_WINDOWS_INTRESOURCE_ICON\";\n\t\tpublic const string SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL =\n\t\t\t\"SDL_WINDOWS_INTRESOURCE_ICON_SMALL\";\n\n\t\t/* Only available in 2.0.8 or higher. */\n\t\tpublic const string SDL_HINT_IOS_HIDE_HOME_INDICATOR =\n\t\t\t\"SDL_IOS_HIDE_HOME_INDICATOR\";\n\t\tpublic const string SDL_HINT_TV_REMOTE_AS_JOYSTICK =\n\t\t\t\"SDL_TV_REMOTE_AS_JOYSTICK\";\n\t\tpublic const string SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR =\n\t\t\t\"SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR\";\n\n\t\t/* Only available in 2.0.9 or higher. */\n\t\tpublic const string SDL_HINT_MOUSE_DOUBLE_CLICK_TIME =\n\t\t\t\"SDL_MOUSE_DOUBLE_CLICK_TIME\";\n\t\tpublic const string SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS =\n\t\t\t\"SDL_MOUSE_DOUBLE_CLICK_RADIUS\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI =\n\t\t\t\"SDL_JOYSTICK_HIDAPI\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_PS4 =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_PS4\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_PS4_RUMBLE\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_STEAM =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_STEAM\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_SWITCH =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_SWITCH\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_XBOX =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_XBOX\";\n\t\tpublic const string SDL_HINT_ENABLE_STEAM_CONTROLLERS =\n\t\t\t\"SDL_ENABLE_STEAM_CONTROLLERS\";\n\t\tpublic const string SDL_HINT_ANDROID_TRAP_BACK_BUTTON =\n\t\t\t\"SDL_ANDROID_TRAP_BACK_BUTTON\";\n\n\t\t/* Only available in 2.0.10 or higher. */\n\t\tpublic const string SDL_HINT_MOUSE_TOUCH_EVENTS =\n\t\t\t\"SDL_MOUSE_TOUCH_EVENTS\";\n\t\tpublic const string SDL_HINT_GAMECONTROLLERCONFIG_FILE =\n\t\t\t\"SDL_GAMECONTROLLERCONFIG_FILE\";\n\t\tpublic const string SDL_HINT_ANDROID_BLOCK_ON_PAUSE =\n\t\t\t\"SDL_ANDROID_BLOCK_ON_PAUSE\";\n\t\tpublic const string SDL_HINT_RENDER_BATCHING =\n\t\t\t\"SDL_RENDER_BATCHING\";\n\t\tpublic const string SDL_HINT_EVENT_LOGGING =\n\t\t\t\"SDL_EVENT_LOGGING\";\n\t\tpublic const string SDL_HINT_WAVE_RIFF_CHUNK_SIZE =\n\t\t\t\"SDL_WAVE_RIFF_CHUNK_SIZE\";\n\t\tpublic const string SDL_HINT_WAVE_TRUNCATION =\n\t\t\t\"SDL_WAVE_TRUNCATION\";\n\t\tpublic const string SDL_HINT_WAVE_FACT_CHUNK =\n\t\t\t\"SDL_WAVE_FACT_CHUNK\";\n\n\t\t/* Only available in 2.0.11 or higher. */\n\t\tpublic const string SDL_HINT_VIDO_X11_WINDOW_VISUALID =\n\t\t\t\"SDL_VIDEO_X11_WINDOW_VISUALID\";\n\t\tpublic const string SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS =\n\t\t\t\"SDL_GAMECONTROLLER_USE_BUTTON_LABELS\";\n\t\tpublic const string SDL_HINT_VIDEO_EXTERNAL_CONTEXT =\n\t\t\t\"SDL_VIDEO_EXTERNAL_CONTEXT\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_GAMECUBE\";\n\t\tpublic const string SDL_HINT_DISPLAY_USABLE_BOUNDS =\n\t\t\t\"SDL_DISPLAY_USABLE_BOUNDS\";\n\t\tpublic const string SDL_HINT_VIDEO_X11_FORCE_EGL =\n\t\t\t\"SDL_VIDEO_X11_FORCE_EGL\";\n\t\tpublic const string SDL_HINT_GAMECONTROLLERTYPE =\n\t\t\t\"SDL_GAMECONTROLLERTYPE\";\n\n\t\t/* Only available in 2.0.14 or higher. */\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_CORRELATE_XINPUT =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_CORRELATE_XINPUT\"; /* NOTE: This was removed in 2.0.16. */\n\t\tpublic const string SDL_HINT_JOYSTICK_RAWINPUT =\n\t\t\t\"SDL_JOYSTICK_RAWINPUT\";\n\t\tpublic const string SDL_HINT_AUDIO_DEVICE_APP_NAME =\n\t\t\t\"SDL_AUDIO_DEVICE_APP_NAME\";\n\t\tpublic const string SDL_HINT_AUDIO_DEVICE_STREAM_NAME =\n\t\t\t\"SDL_AUDIO_DEVICE_STREAM_NAME\";\n\t\tpublic const string SDL_HINT_PREFERRED_LOCALES =\n\t\t\t\"SDL_PREFERRED_LOCALES\";\n\t\tpublic const string SDL_HINT_THREAD_PRIORITY_POLICY =\n\t\t\t\"SDL_THREAD_PRIORITY_POLICY\";\n\t\tpublic const string SDL_HINT_EMSCRIPTEN_ASYNCIFY =\n\t\t\t\"SDL_EMSCRIPTEN_ASYNCIFY\";\n\t\tpublic const string SDL_HINT_LINUX_JOYSTICK_DEADZONES =\n\t\t\t\"SDL_LINUX_JOYSTICK_DEADZONES\";\n\t\tpublic const string SDL_HINT_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO =\n\t\t\t\"SDL_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_PS5 =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_PS5\";\n\t\tpublic const string SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL =\n\t\t\t\"SDL_THREAD_FORCE_REALTIME_TIME_CRITICAL\";\n\t\tpublic const string SDL_HINT_JOYSTICK_THREAD =\n\t\t\t\"SDL_JOYSTICK_THREAD\";\n\t\tpublic const string SDL_HINT_AUTO_UPDATE_JOYSTICKS =\n\t\t\t\"SDL_AUTO_UPDATE_JOYSTICKS\";\n\t\tpublic const string SDL_HINT_AUTO_UPDATE_SENSORS =\n\t\t\t\"SDL_AUTO_UPDATE_SENSORS\";\n\t\tpublic const string SDL_HINT_MOUSE_RELATIVE_SCALING =\n\t\t\t\"SDL_MOUSE_RELATIVE_SCALING\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_PS5_RUMBLE\";\n\n\t\t/* Only available in 2.0.16 or higher. */\n\t\tpublic const string SDL_HINT_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS =\n\t\t\t\"SDL_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS\";\n\t\tpublic const string SDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL =\n\t\t\t\"SDL_WINDOWS_FORCE_SEMAPHORE_KERNEL\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_PS5_PLAYER_LED\";\n\t\tpublic const string SDL_HINT_WINDOWS_USE_D3D9EX =\n\t\t\t\"SDL_WINDOWS_USE_D3D9EX\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_JOY_CONS\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_STADIA =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_STADIA\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_SWITCH_HOME_LED\";\n\t\tpublic const string SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED =\n\t\t\t\"SDL_ALLOW_ALT_TAB_WHILE_GRABBED\";\n\t\tpublic const string SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER =\n\t\t\t\"SDL_KMSDRM_REQUIRE_DRM_MASTER\";\n\t\tpublic const string SDL_HINT_AUDIO_DEVICE_STREAM_ROLE =\n\t\t\t\"SDL_AUDIO_DEVICE_STREAM_ROLE\";\n\t\tpublic const string SDL_HINT_X11_FORCE_OVERRIDE_REDIRECT =\n\t\t\t\"SDL_X11_FORCE_OVERRIDE_REDIRECT\";\n\t\tpublic const string SDL_HINT_JOYSTICK_HIDAPI_LUNA =\n\t\t\t\"SDL_JOYSTICK_HIDAPI_LUNA\";\n\t\tpublic const string SDL_HINT_JOYSTICK_RAWINPUT_CORRELATE_XINPUT =\n\t\t\t\"SDL_JOYSTICK_RAWINPUT_CORRELATE_XINPUT\";\n\t\tpublic const string SDL_HINT_AUDIO_INCLUDE_MONITORS =\n\t\t\t\"SDL_AUDIO_INCLUDE_MONITORS\";\n\t\tpublic const string SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR =\n\t\t\t\"SDL_VIDEO_WAYLAND_ALLOW_LIBDECOR\";\n\n\t\t/* Only available in 2.0.18 or higher. */\n\t\tpublic const string SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY =\n\t\t\t\"SDL_VIDEO_EGL_ALLOW_TRANSPARENCY\";\n\t\tpublic const string SDL_HINT_APP_NAME =\n\t\t\t\"SDL_APP_NAME\";\n\t\tpublic const string SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME =\n\t\t\t\"SDL_SCREENSAVER_INHIBIT_ACTIVITY_NAME\";\n\t\tpublic const string SDL_HINT_IME_SHOW_UI =\n\t\t\t\"SDL_IME_SHOW_UI\";\n\t\tpublic const string SDL_HINT_WINDOW_NO_ACTIVATION_WHEN_SHOWN =\n\t\t\t\"SDL_WINDOW_NO_ACTIVATION_WHEN_SHOWN\";\n\t\tpublic const string SDL_HINT_POLL_SENTINEL =\n\t\t\t\"SDL_POLL_SENTINEL\";\n\t\tpublic const string SDL_HINT_JOYSTICK_DEVICE =\n\t\t\t\"SDL_JOYSTICK_DEVICE\";\n\t\tpublic const string SDL_HINT_LINUX_JOYSTICK_CLASSIC =\n\t\t\t\"SDL_LINUX_JOYSTICK_CLASSIC\";\n\n\t\t/* Only available in 2.0.20 or higher. */\n\t\tpublic const string SDL_HINT_RENDER_LINE_METHOD =\n\t\t\t\"SDL_RENDER_LINE_METHOD\";\n\n\t\t/* Only available in 2.0.22 or higher. */\n\t\tpublic const string SDL_HINT_FORCE_RAISEWINDOW =\n\t\t\t\"SDL_HINT_FORCE_RAISEWINDOW\";\n\t\tpublic const string SDL_HINT_IME_SUPPORT_EXTENDED_TEXT =\n\t\t\t\"SDL_IME_SUPPORT_EXTENDED_TEXT\";\n\t\tpublic const string SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE =\n\t\t\t\"SDL_JOYSTICK_GAMECUBE_RUMBLE_BRAKE\";\n\t\tpublic const string SDL_HINT_JOYSTICK_ROG_CHAKRAM =\n\t\t\t\"SDL_JOYSTICK_ROG_CHAKRAM\";\n\t\tpublic const string SDL_HINT_MOUSE_RELATIVE_MODE_CENTER =\n\t\t\t\"SDL_MOUSE_RELATIVE_MODE_CENTER\";\n\t\tpublic const string SDL_HINT_MOUSE_AUTO_CAPTURE =\n\t\t\t\"SDL_MOUSE_AUTO_CAPTURE\";\n\t\tpublic const string SDL_HINT_VITA_TOUCH_MOUSE_DEVICE =\n\t\t\t\"SDL_HINT_VITA_TOUCH_MOUSE_DEVICE\";\n\t\tpublic const string SDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR =\n\t\t\t\"SDL_VIDEO_WAYLAND_PREFER_LIBDECOR\";\n\t\tpublic const string SDL_HINT_VIDEO_FOREIGN_WINDOW_OPENGL =\n\t\t\t\"SDL_VIDEO_FOREIGN_WINDOW_OPENGL\";\n\t\tpublic const string SDL_HINT_VIDEO_FOREIGN_WINDOW_VULKAN =\n\t\t\t\"SDL_VIDEO_FOREIGN_WINDOW_VULKAN\";\n\t\tpublic const string SDL_HINT_X11_WINDOW_TYPE =\n\t\t\t\"SDL_X11_WINDOW_TYPE\";\n\t\tpublic const string SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE =\n\t\t\t\"SDL_QUIT_ON_LAST_WINDOW_CLOSE\";\n\n\t\tpublic enum SDL_HintPriority\n\t\t{\n\t\t\tSDL_HINT_DEFAULT,\n\t\t\tSDL_HINT_NORMAL,\n\t\t\tSDL_HINT_OVERRIDE\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_ClearHints();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetHint\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe IntPtr INTERNAL_SDL_GetHint(byte* name);\n\t\tpublic static unsafe string SDL_GetHint(string name)\n\t\t{\n\t\t\tint utf8NameBufSize = Utf8Size(name);\n\t\t\tbyte* utf8Name = stackalloc byte[utf8NameBufSize];\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GetHint(\n\t\t\t\t\tUtf8Encode(name, utf8Name, utf8NameBufSize)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_SetHint\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe SDL_bool INTERNAL_SDL_SetHint(\n\t\t\tbyte* name,\n\t\t\tbyte* value\n\t\t);\n\t\tpublic static unsafe SDL_bool SDL_SetHint(string name, string value)\n\t\t{\n\t\t\tint utf8NameBufSize = Utf8Size(name);\n\t\t\tbyte* utf8Name = stackalloc byte[utf8NameBufSize];\n\n\t\t\tint utf8ValueBufSize = Utf8Size(value);\n\t\t\tbyte* utf8Value = stackalloc byte[utf8ValueBufSize];\n\n\t\t\treturn INTERNAL_SDL_SetHint(\n\t\t\t\tUtf8Encode(name, utf8Name, utf8NameBufSize),\n\t\t\t\tUtf8Encode(value, utf8Value, utf8ValueBufSize)\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_SetHintWithPriority\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe SDL_bool INTERNAL_SDL_SetHintWithPriority(\n\t\t\tbyte* name,\n\t\t\tbyte* value,\n\t\t\tSDL_HintPriority priority\n\t\t);\n\t\tpublic static unsafe SDL_bool SDL_SetHintWithPriority(\n\t\t\tstring name,\n\t\t\tstring value,\n\t\t\tSDL_HintPriority priority\n\t\t) {\n\t\t\tint utf8NameBufSize = Utf8Size(name);\n\t\t\tbyte* utf8Name = stackalloc byte[utf8NameBufSize];\n\n\t\t\tint utf8ValueBufSize = Utf8Size(value);\n\t\t\tbyte* utf8Value = stackalloc byte[utf8ValueBufSize];\n\n\t\t\treturn INTERNAL_SDL_SetHintWithPriority(\n\t\t\t\tUtf8Encode(name, utf8Name, utf8NameBufSize),\n\t\t\t\tUtf8Encode(value, utf8Value, utf8ValueBufSize),\n\t\t\t\tpriority\n\t\t\t);\n\t\t}\n\n\t\t/* Only available in 2.0.5 or higher. */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetHintBoolean\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe SDL_bool INTERNAL_SDL_GetHintBoolean(\n\t\t\tbyte* name,\n\t\t\tSDL_bool default_value\n\t\t);\n\t\tpublic static unsafe SDL_bool SDL_GetHintBoolean(\n\t\t\tstring name,\n\t\t\tSDL_bool default_value\n\t\t) {\n\t\t\tint utf8NameBufSize = Utf8Size(name);\n\t\t\tbyte* utf8Name = stackalloc byte[utf8NameBufSize];\n\t\t\treturn INTERNAL_SDL_GetHintBoolean(\n\t\t\t\tUtf8Encode(name, utf8Name, utf8NameBufSize),\n\t\t\t\tdefault_value\n\t\t\t);\n\t\t}\n\n\t\t#endregion\n\n\t\t#region SDL_error.h\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_ClearError();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetError\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetError();\n\t\tpublic static string SDL_GetError()\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_GetError());\n\t\t}\n\n\t\t/* Use string.Format for arglists */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_SetError\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe void INTERNAL_SDL_SetError(byte* fmtAndArglist);\n\t\tpublic static unsafe void SDL_SetError(string fmtAndArglist)\n\t\t{\n\t\t\tint utf8FmtAndArglistBufSize = Utf8Size(fmtAndArglist);\n\t\t\tbyte* utf8FmtAndArglist = stackalloc byte[utf8FmtAndArglistBufSize];\n\t\t\tINTERNAL_SDL_SetError(\n\t\t\t\tUtf8Encode(fmtAndArglist, utf8FmtAndArglist, utf8FmtAndArglistBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* IntPtr refers to a char*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetErrorMsg(IntPtr errstr, int maxlength);\n\n\t\t#endregion\n\n\t\t#region SDL_log.h\n\n\t\tpublic enum SDL_LogCategory\n\t\t{\n\t\t\tSDL_LOG_CATEGORY_APPLICATION,\n\t\t\tSDL_LOG_CATEGORY_ERROR,\n\t\t\tSDL_LOG_CATEGORY_ASSERT,\n\t\t\tSDL_LOG_CATEGORY_SYSTEM,\n\t\t\tSDL_LOG_CATEGORY_AUDIO,\n\t\t\tSDL_LOG_CATEGORY_VIDEO,\n\t\t\tSDL_LOG_CATEGORY_RENDER,\n\t\t\tSDL_LOG_CATEGORY_INPUT,\n\t\t\tSDL_LOG_CATEGORY_TEST,\n\n\t\t\t/* Reserved for future SDL library use */\n\t\t\tSDL_LOG_CATEGORY_RESERVED1,\n\t\t\tSDL_LOG_CATEGORY_RESERVED2,\n\t\t\tSDL_LOG_CATEGORY_RESERVED3,\n\t\t\tSDL_LOG_CATEGORY_RESERVED4,\n\t\t\tSDL_LOG_CATEGORY_RESERVED5,\n\t\t\tSDL_LOG_CATEGORY_RESERVED6,\n\t\t\tSDL_LOG_CATEGORY_RESERVED7,\n\t\t\tSDL_LOG_CATEGORY_RESERVED8,\n\t\t\tSDL_LOG_CATEGORY_RESERVED9,\n\t\t\tSDL_LOG_CATEGORY_RESERVED10,\n\n\t\t\t/* Beyond this point is reserved for application use, e.g.\n\t\t\tenum {\n\t\t\t\tMYAPP_CATEGORY_AWESOME1 = SDL_LOG_CATEGORY_CUSTOM,\n\t\t\t\tMYAPP_CATEGORY_AWESOME2,\n\t\t\t\tMYAPP_CATEGORY_AWESOME3,\n\t\t\t\t...\n\t\t\t};\n\t\t\t*/\n\t\t\tSDL_LOG_CATEGORY_CUSTOM\n\t\t}\n\n\t\tpublic enum SDL_LogPriority\n\t\t{\n\t\t\tSDL_LOG_PRIORITY_VERBOSE = 1,\n\t\t\tSDL_LOG_PRIORITY_DEBUG,\n\t\t\tSDL_LOG_PRIORITY_INFO,\n\t\t\tSDL_LOG_PRIORITY_WARN,\n\t\t\tSDL_LOG_PRIORITY_ERROR,\n\t\t\tSDL_LOG_PRIORITY_CRITICAL,\n\t\t\tSDL_NUM_LOG_PRIORITIES\n\t\t}\n\n\t\t/* userdata refers to a void*, message to a const char* */\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate void SDL_LogOutputFunction(\n\t\t\tIntPtr userdata,\n\t\t\tint category,\n\t\t\tSDL_LogPriority priority,\n\t\t\tIntPtr message\n\t\t);\n\n\t\t/* Use string.Format for arglists */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_Log\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe void INTERNAL_SDL_Log(byte* fmtAndArglist);\n\t\tpublic static unsafe void SDL_Log(string fmtAndArglist)\n\t\t{\n\t\t\tint utf8FmtAndArglistBufSize = Utf8Size(fmtAndArglist);\n\t\t\tbyte* utf8FmtAndArglist = stackalloc byte[utf8FmtAndArglistBufSize];\n\t\t\tINTERNAL_SDL_Log(\n\t\t\t\tUtf8Encode(fmtAndArglist, utf8FmtAndArglist, utf8FmtAndArglistBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Use string.Format for arglists */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_LogVerbose\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe void INTERNAL_SDL_LogVerbose(\n\t\t\tint category,\n\t\t\tbyte* fmtAndArglist\n\t\t);\n\t\tpublic static unsafe void SDL_LogVerbose(\n\t\t\tint category,\n\t\t\tstring fmtAndArglist\n\t\t) {\n\t\t\tint utf8FmtAndArglistBufSize = Utf8Size(fmtAndArglist);\n\t\t\tbyte* utf8FmtAndArglist = stackalloc byte[utf8FmtAndArglistBufSize];\n\t\t\tINTERNAL_SDL_LogVerbose(\n\t\t\t\tcategory,\n\t\t\t\tUtf8Encode(fmtAndArglist, utf8FmtAndArglist, utf8FmtAndArglistBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Use string.Format for arglists */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_LogDebug\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe void INTERNAL_SDL_LogDebug(\n\t\t\tint category,\n\t\t\tbyte* fmtAndArglist\n\t\t);\n\t\tpublic static unsafe void SDL_LogDebug(\n\t\t\tint category,\n\t\t\tstring fmtAndArglist\n\t\t) {\n\t\t\tint utf8FmtAndArglistBufSize = Utf8Size(fmtAndArglist);\n\t\t\tbyte* utf8FmtAndArglist = stackalloc byte[utf8FmtAndArglistBufSize];\n\t\t\tINTERNAL_SDL_LogDebug(\n\t\t\t\tcategory,\n\t\t\t\tUtf8Encode(fmtAndArglist, utf8FmtAndArglist, utf8FmtAndArglistBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Use string.Format for arglists */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_LogInfo\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe void INTERNAL_SDL_LogInfo(\n\t\t\tint category,\n\t\t\tbyte* fmtAndArglist\n\t\t);\n\t\tpublic static unsafe void SDL_LogInfo(\n\t\t\tint category,\n\t\t\tstring fmtAndArglist\n\t\t) {\n\t\t\tint utf8FmtAndArglistBufSize = Utf8Size(fmtAndArglist);\n\t\t\tbyte* utf8FmtAndArglist = stackalloc byte[utf8FmtAndArglistBufSize];\n\t\t\tINTERNAL_SDL_LogInfo(\n\t\t\t\tcategory,\n\t\t\t\tUtf8Encode(fmtAndArglist, utf8FmtAndArglist, utf8FmtAndArglistBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Use string.Format for arglists */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_LogWarn\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe void INTERNAL_SDL_LogWarn(\n\t\t\tint category,\n\t\t\tbyte* fmtAndArglist\n\t\t);\n\t\tpublic static unsafe void SDL_LogWarn(\n\t\t\tint category,\n\t\t\tstring fmtAndArglist\n\t\t) {\n\t\t\tint utf8FmtAndArglistBufSize = Utf8Size(fmtAndArglist);\n\t\t\tbyte* utf8FmtAndArglist = stackalloc byte[utf8FmtAndArglistBufSize];\n\t\t\tINTERNAL_SDL_LogWarn(\n\t\t\t\tcategory,\n\t\t\t\tUtf8Encode(fmtAndArglist, utf8FmtAndArglist, utf8FmtAndArglistBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Use string.Format for arglists */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_LogError\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe void INTERNAL_SDL_LogError(\n\t\t\tint category,\n\t\t\tbyte* fmtAndArglist\n\t\t);\n\t\tpublic static unsafe void SDL_LogError(\n\t\t\tint category,\n\t\t\tstring fmtAndArglist\n\t\t) {\n\t\t\tint utf8FmtAndArglistBufSize = Utf8Size(fmtAndArglist);\n\t\t\tbyte* utf8FmtAndArglist = stackalloc byte[utf8FmtAndArglistBufSize];\n\t\t\tINTERNAL_SDL_LogError(\n\t\t\t\tcategory,\n\t\t\t\tUtf8Encode(fmtAndArglist, utf8FmtAndArglist, utf8FmtAndArglistBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Use string.Format for arglists */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_LogCritical\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe void INTERNAL_SDL_LogCritical(\n\t\t\tint category,\n\t\t\tbyte* fmtAndArglist\n\t\t);\n\t\tpublic static unsafe void SDL_LogCritical(\n\t\t\tint category,\n\t\t\tstring fmtAndArglist\n\t\t) {\n\t\t\tint utf8FmtAndArglistBufSize = Utf8Size(fmtAndArglist);\n\t\t\tbyte* utf8FmtAndArglist = stackalloc byte[utf8FmtAndArglistBufSize];\n\t\t\tINTERNAL_SDL_LogCritical(\n\t\t\t\tcategory,\n\t\t\t\tUtf8Encode(fmtAndArglist, utf8FmtAndArglist, utf8FmtAndArglistBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Use string.Format for arglists */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_LogMessage\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe void INTERNAL_SDL_LogMessage(\n\t\t\tint category,\n\t\t\tSDL_LogPriority priority,\n\t\t\tbyte* fmtAndArglist\n\t\t);\n\t\tpublic static unsafe void SDL_LogMessage(\n\t\t\tint category,\n\t\t\tSDL_LogPriority priority,\n\t\t\tstring fmtAndArglist\n\t\t) {\n\t\t\tint utf8FmtAndArglistBufSize = Utf8Size(fmtAndArglist);\n\t\t\tbyte* utf8FmtAndArglist = stackalloc byte[utf8FmtAndArglistBufSize];\n\t\t\tINTERNAL_SDL_LogMessage(\n\t\t\t\tcategory,\n\t\t\t\tpriority,\n\t\t\t\tUtf8Encode(fmtAndArglist, utf8FmtAndArglist, utf8FmtAndArglistBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Use string.Format for arglists */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_LogMessageV\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe void INTERNAL_SDL_LogMessageV(\n\t\t\tint category,\n\t\t\tSDL_LogPriority priority,\n\t\t\tbyte* fmtAndArglist\n\t\t);\n\t\tpublic static unsafe void SDL_LogMessageV(\n\t\t\tint category,\n\t\t\tSDL_LogPriority priority,\n\t\t\tstring fmtAndArglist\n\t\t) {\n\t\t\tint utf8FmtAndArglistBufSize = Utf8Size(fmtAndArglist);\n\t\t\tbyte* utf8FmtAndArglist = stackalloc byte[utf8FmtAndArglistBufSize];\n\t\t\tINTERNAL_SDL_LogMessageV(\n\t\t\t\tcategory,\n\t\t\t\tpriority,\n\t\t\t\tUtf8Encode(fmtAndArglist, utf8FmtAndArglist, utf8FmtAndArglistBufSize)\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_LogPriority SDL_LogGetPriority(\n\t\t\tint category\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_LogSetPriority(\n\t\t\tint category,\n\t\t\tSDL_LogPriority priority\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_LogSetAllPriority(\n\t\t\tSDL_LogPriority priority\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_LogResetPriorities();\n\n\t\t/* userdata refers to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern void SDL_LogGetOutputFunction(\n\t\t\tout IntPtr callback,\n\t\t\tout IntPtr userdata\n\t\t);\n\t\tpublic static void SDL_LogGetOutputFunction(\n\t\t\tout SDL_LogOutputFunction callback,\n\t\t\tout IntPtr userdata\n\t\t) {\n\t\t\tIntPtr result = IntPtr.Zero;\n\t\t\tSDL_LogGetOutputFunction(\n\t\t\t\tout result,\n\t\t\t\tout userdata\n\t\t\t);\n\t\t\tif (result != IntPtr.Zero)\n\t\t\t{\n\t\t\t\tcallback = (SDL_LogOutputFunction) GetDelegateForFunctionPointer<SDL_LogOutputFunction>(\n\t\t\t\t\tresult\n\t\t\t\t);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcallback = null;\n\t\t\t}\n\t\t}\n\n\t\t/* userdata refers to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_LogSetOutputFunction(\n\t\t\tSDL_LogOutputFunction callback,\n\t\t\tIntPtr userdata\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_messagebox.h\n\n\t\t[Flags]\n\t\tpublic enum SDL_MessageBoxFlags : uint\n\t\t{\n\t\t\tSDL_MESSAGEBOX_ERROR =\t\t0x00000010,\n\t\t\tSDL_MESSAGEBOX_WARNING =\t0x00000020,\n\t\t\tSDL_MESSAGEBOX_INFORMATION =\t0x00000040\n\t\t}\n\n\t\t[Flags]\n\t\tpublic enum SDL_MessageBoxButtonFlags : uint\n\t\t{\n\t\t\tSDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT = 0x00000001,\n\t\t\tSDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT = 0x00000002\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tprivate struct INTERNAL_SDL_MessageBoxButtonData\n\t\t{\n\t\t\tpublic SDL_MessageBoxButtonFlags flags;\n\t\t\tpublic int buttonid;\n\t\t\tpublic IntPtr text; /* The UTF-8 button text */\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_MessageBoxButtonData\n\t\t{\n\t\t\tpublic SDL_MessageBoxButtonFlags flags;\n\t\t\tpublic int buttonid;\n\t\t\tpublic string text; /* The UTF-8 button text */\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_MessageBoxColor\n\t\t{\n\t\t\tpublic byte r, g, b;\n\t\t}\n\n\t\tpublic enum SDL_MessageBoxColorType\n\t\t{\n\t\t\tSDL_MESSAGEBOX_COLOR_BACKGROUND,\n\t\t\tSDL_MESSAGEBOX_COLOR_TEXT,\n\t\t\tSDL_MESSAGEBOX_COLOR_BUTTON_BORDER,\n\t\t\tSDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND,\n\t\t\tSDL_MESSAGEBOX_COLOR_BUTTON_SELECTED,\n\t\t\tSDL_MESSAGEBOX_COLOR_MAX\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_MessageBoxColorScheme\n\t\t{\n\t\t\t[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = (int)SDL_MessageBoxColorType.SDL_MESSAGEBOX_COLOR_MAX)]\n\t\t\t\tpublic SDL_MessageBoxColor[] colors;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tprivate struct INTERNAL_SDL_MessageBoxData\n\t\t{\n\t\t\tpublic SDL_MessageBoxFlags flags;\n\t\t\tpublic IntPtr window;\t\t\t\t/* Parent window, can be NULL */\n\t\t\tpublic IntPtr title;\t\t\t\t/* UTF-8 title */\n\t\t\tpublic IntPtr message;\t\t\t\t/* UTF-8 message text */\n\t\t\tpublic int numbuttons;\n\t\t\tpublic IntPtr buttons;\n\t\t\tpublic IntPtr colorScheme;\t\t\t/* Can be NULL to use system settings */\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_MessageBoxData\n\t\t{\n\t\t\tpublic SDL_MessageBoxFlags flags;\n\t\t\tpublic IntPtr window;\t\t\t\t/* Parent window, can be NULL */\n\t\t\tpublic string title;\t\t\t\t/* UTF-8 title */\n\t\t\tpublic string message;\t\t\t\t/* UTF-8 message text */\n\t\t\tpublic int numbuttons;\n\t\t\tpublic SDL_MessageBoxButtonData[] buttons;\n\t\t\tpublic SDL_MessageBoxColorScheme? colorScheme;\t/* Can be NULL to use system settings */\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_ShowMessageBox\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern int INTERNAL_SDL_ShowMessageBox([In()] ref INTERNAL_SDL_MessageBoxData messageboxdata, out int buttonid);\n\n\t\t/* Ripped from Jameson's LpUtf8StrMarshaler */\n\t\tprivate static IntPtr INTERNAL_AllocUTF8(string str)\n\t\t{\n\t\t\tif (string.IsNullOrEmpty(str))\n\t\t\t{\n\t\t\t\treturn IntPtr.Zero;\n\t\t\t}\n\t\t\tbyte[] bytes = System.Text.Encoding.UTF8.GetBytes(str + '\\0');\n\t\t\tIntPtr mem = SDL.SDL_malloc((IntPtr) bytes.Length);\n\t\t\tMarshal.Copy(bytes, 0, mem, bytes.Length);\n\t\t\treturn mem;\n\t\t}\n\n\t\tpublic static unsafe int SDL_ShowMessageBox([In()] ref SDL_MessageBoxData messageboxdata, out int buttonid)\n\t\t{\n\t\t\tvar data = new INTERNAL_SDL_MessageBoxData()\n\t\t\t{\n\t\t\t\tflags = messageboxdata.flags,\n\t\t\t\twindow = messageboxdata.window,\n\t\t\t\ttitle = INTERNAL_AllocUTF8(messageboxdata.title),\n\t\t\t\tmessage = INTERNAL_AllocUTF8(messageboxdata.message),\n\t\t\t\tnumbuttons = messageboxdata.numbuttons,\n\t\t\t};\n\n\t\t\tvar buttons = new INTERNAL_SDL_MessageBoxButtonData[messageboxdata.numbuttons];\n\t\t\tfor (int i = 0; i < messageboxdata.numbuttons; i++)\n\t\t\t{\n\t\t\t\tbuttons[i] = new INTERNAL_SDL_MessageBoxButtonData()\n\t\t\t\t{\n\t\t\t\t\tflags = messageboxdata.buttons[i].flags,\n\t\t\t\t\tbuttonid = messageboxdata.buttons[i].buttonid,\n\t\t\t\t\ttext = INTERNAL_AllocUTF8(messageboxdata.buttons[i].text),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (messageboxdata.colorScheme != null)\n\t\t\t{\n\t\t\t\tdata.colorScheme = Marshal.AllocHGlobal(SizeOf<SDL_MessageBoxColorScheme>());\n\t\t\t\tMarshal.StructureToPtr(messageboxdata.colorScheme.Value, data.colorScheme, false);\n\t\t\t}\n\n\t\t\tint result;\n\t\t\tfixed (INTERNAL_SDL_MessageBoxButtonData* buttonsPtr = &buttons[0])\n\t\t\t{\n\t\t\t\tdata.buttons = (IntPtr)buttonsPtr;\n\t\t\t\tresult = INTERNAL_SDL_ShowMessageBox(ref data, out buttonid);\n\t\t\t}\n\n\t\t\tMarshal.FreeHGlobal(data.colorScheme);\n\t\t\tfor (int i = 0; i < messageboxdata.numbuttons; i++)\n\t\t\t{\n\t\t\t\tSDL_free(buttons[i].text);\n\t\t\t}\n\t\t\tSDL_free(data.message);\n\t\t\tSDL_free(data.title);\n\n\t\t\treturn result;\n\t\t}\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_ShowSimpleMessageBox\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe int INTERNAL_SDL_ShowSimpleMessageBox(\n\t\t\tSDL_MessageBoxFlags flags,\n\t\t\tbyte* title,\n\t\t\tbyte* message,\n\t\t\tIntPtr window\n\t\t);\n\t\tpublic static unsafe int SDL_ShowSimpleMessageBox(\n\t\t\tSDL_MessageBoxFlags flags,\n\t\t\tstring title,\n\t\t\tstring message,\n\t\t\tIntPtr window\n\t\t) {\n\t\t\tint utf8TitleBufSize = Utf8Size(title);\n\t\t\tbyte* utf8Title = stackalloc byte[utf8TitleBufSize];\n\n\t\t\tint utf8MessageBufSize = Utf8Size(message);\n\t\t\tbyte* utf8Message = stackalloc byte[utf8MessageBufSize];\n\n\t\t\treturn INTERNAL_SDL_ShowSimpleMessageBox(\n\t\t\t\tflags,\n\t\t\t\tUtf8Encode(title, utf8Title, utf8TitleBufSize),\n\t\t\t\tUtf8Encode(message, utf8Message, utf8MessageBufSize),\n\t\t\t\twindow\n\t\t\t);\n\t\t}\n\n\t\t#endregion\n\n\t\t#region SDL_version.h, SDL_revision.h\n\n\t\t/* Similar to the headers, this is the version we're expecting to be\n\t\t * running with. You will likely want to check this somewhere in your\n\t\t * program!\n\t\t */\n\t\tpublic const int SDL_MAJOR_VERSION =\t2;\n\t\tpublic const int SDL_MINOR_VERSION =\t0;\n\t\tpublic const int SDL_PATCHLEVEL =\t22;\n\n\t\tpublic static readonly int SDL_COMPILEDVERSION = SDL_VERSIONNUM(\n\t\t\tSDL_MAJOR_VERSION,\n\t\t\tSDL_MINOR_VERSION,\n\t\t\tSDL_PATCHLEVEL\n\t\t);\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_version\n\t\t{\n\t\t\tpublic byte major;\n\t\t\tpublic byte minor;\n\t\t\tpublic byte patch;\n\t\t}\n\n\t\tpublic static void SDL_VERSION(out SDL_version x)\n\t\t{\n\t\t\tx.major = SDL_MAJOR_VERSION;\n\t\t\tx.minor = SDL_MINOR_VERSION;\n\t\t\tx.patch = SDL_PATCHLEVEL;\n\t\t}\n\n\t\tpublic static int SDL_VERSIONNUM(int X, int Y, int Z)\n\t\t{\n\t\t\treturn (X * 1000) + (Y * 100) + Z;\n\t\t}\n\n\t\tpublic static bool SDL_VERSION_ATLEAST(int X, int Y, int Z)\n\t\t{\n\t\t\treturn (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z));\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GetVersion(out SDL_version ver);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetRevision\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetRevision();\n\t\tpublic static string SDL_GetRevision()\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_GetRevision());\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetRevisionNumber();\n\n\t\t#endregion\n\n\t\t#region SDL_video.h\n\n\t\tpublic enum SDL_GLattr\n\t\t{\n\t\t\tSDL_GL_RED_SIZE,\n\t\t\tSDL_GL_GREEN_SIZE,\n\t\t\tSDL_GL_BLUE_SIZE,\n\t\t\tSDL_GL_ALPHA_SIZE,\n\t\t\tSDL_GL_BUFFER_SIZE,\n\t\t\tSDL_GL_DOUBLEBUFFER,\n\t\t\tSDL_GL_DEPTH_SIZE,\n\t\t\tSDL_GL_STENCIL_SIZE,\n\t\t\tSDL_GL_ACCUM_RED_SIZE,\n\t\t\tSDL_GL_ACCUM_GREEN_SIZE,\n\t\t\tSDL_GL_ACCUM_BLUE_SIZE,\n\t\t\tSDL_GL_ACCUM_ALPHA_SIZE,\n\t\t\tSDL_GL_STEREO,\n\t\t\tSDL_GL_MULTISAMPLEBUFFERS,\n\t\t\tSDL_GL_MULTISAMPLESAMPLES,\n\t\t\tSDL_GL_ACCELERATED_VISUAL,\n\t\t\tSDL_GL_RETAINED_BACKING,\n\t\t\tSDL_GL_CONTEXT_MAJOR_VERSION,\n\t\t\tSDL_GL_CONTEXT_MINOR_VERSION,\n\t\t\tSDL_GL_CONTEXT_EGL,\n\t\t\tSDL_GL_CONTEXT_FLAGS,\n\t\t\tSDL_GL_CONTEXT_PROFILE_MASK,\n\t\t\tSDL_GL_SHARE_WITH_CURRENT_CONTEXT,\n\t\t\tSDL_GL_FRAMEBUFFER_SRGB_CAPABLE,\n\t\t\tSDL_GL_CONTEXT_RELEASE_BEHAVIOR,\n\t\t\tSDL_GL_CONTEXT_RESET_NOTIFICATION,\t/* Requires >= 2.0.6 */\n\t\t\tSDL_GL_CONTEXT_NO_ERROR,\t\t/* Requires >= 2.0.6 */\n\t\t}\n\n\t\t[Flags]\n\t\tpublic enum SDL_GLprofile\n\t\t{\n\t\t\tSDL_GL_CONTEXT_PROFILE_CORE\t\t\t\t= 0x0001,\n\t\t\tSDL_GL_CONTEXT_PROFILE_COMPATIBILITY\t= 0x0002,\n\t\t\tSDL_GL_CONTEXT_PROFILE_ES\t\t\t\t= 0x0004\n\t\t}\n\n\t\t[Flags]\n\t\tpublic enum SDL_GLcontext\n\t\t{\n\t\t\tSDL_GL_CONTEXT_DEBUG_FLAG\t\t\t\t= 0x0001,\n\t\t\tSDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG\t= 0x0002,\n\t\t\tSDL_GL_CONTEXT_ROBUST_ACCESS_FLAG\t\t= 0x0004,\n\t\t\tSDL_GL_CONTEXT_RESET_ISOLATION_FLAG\t\t= 0x0008\n\t\t}\n\n\t\tpublic enum SDL_WindowEventID : byte\n\t\t{\n\t\t\tSDL_WINDOWEVENT_NONE,\n\t\t\tSDL_WINDOWEVENT_SHOWN,\n\t\t\tSDL_WINDOWEVENT_HIDDEN,\n\t\t\tSDL_WINDOWEVENT_EXPOSED,\n\t\t\tSDL_WINDOWEVENT_MOVED,\n\t\t\tSDL_WINDOWEVENT_RESIZED,\n\t\t\tSDL_WINDOWEVENT_SIZE_CHANGED,\n\t\t\tSDL_WINDOWEVENT_MINIMIZED,\n\t\t\tSDL_WINDOWEVENT_MAXIMIZED,\n\t\t\tSDL_WINDOWEVENT_RESTORED,\n\t\t\tSDL_WINDOWEVENT_ENTER,\n\t\t\tSDL_WINDOWEVENT_LEAVE,\n\t\t\tSDL_WINDOWEVENT_FOCUS_GAINED,\n\t\t\tSDL_WINDOWEVENT_FOCUS_LOST,\n\t\t\tSDL_WINDOWEVENT_CLOSE,\n\t\t\t/* Only available in 2.0.5 or higher. */\n\t\t\tSDL_WINDOWEVENT_TAKE_FOCUS,\n\t\t\tSDL_WINDOWEVENT_HIT_TEST,\n\t\t\t/* Only available in 2.0.18 or higher. */\n\t\t\tSDL_WINDOWEVENT_ICCPROF_CHANGED,\n\t\t\tSDL_WINDOWEVENT_DISPLAY_CHANGED\n\t\t}\n\n\t\tpublic enum SDL_DisplayEventID : byte\n\t\t{\n\t\t\tSDL_DISPLAYEVENT_NONE,\n\t\t\tSDL_DISPLAYEVENT_ORIENTATION,\n\t\t\tSDL_DISPLAYEVENT_CONNECTED,\t/* Requires >= 2.0.14 */\n\t\t\tSDL_DISPLAYEVENT_DISCONNECTED\t/* Requires >= 2.0.14 */\n\t\t}\n\n\t\tpublic enum SDL_DisplayOrientation\n\t\t{\n\t\t\tSDL_ORIENTATION_UNKNOWN,\n\t\t\tSDL_ORIENTATION_LANDSCAPE,\n\t\t\tSDL_ORIENTATION_LANDSCAPE_FLIPPED,\n\t\t\tSDL_ORIENTATION_PORTRAIT,\n\t\t\tSDL_ORIENTATION_PORTRAIT_FLIPPED\n\t\t}\n\n\t\t/* Only available in 2.0.16 or higher. */\n\t\tpublic enum SDL_FlashOperation\n\t\t{\n\t\t\tSDL_FLASH_CANCEL,\n\t\t\tSDL_FLASH_BRIEFLY,\n\t\t\tSDL_FLASH_UNTIL_FOCUSED\n\t\t}\n\n\t\t[Flags]\n\t\tpublic enum SDL_WindowFlags : uint\n\t\t{\n\t\t\tSDL_WINDOW_FULLSCREEN =\t\t0x00000001,\n\t\t\tSDL_WINDOW_OPENGL =\t\t0x00000002,\n\t\t\tSDL_WINDOW_SHOWN =\t\t0x00000004,\n\t\t\tSDL_WINDOW_HIDDEN =\t\t0x00000008,\n\t\t\tSDL_WINDOW_BORDERLESS =\t\t0x00000010,\n\t\t\tSDL_WINDOW_RESIZABLE =\t\t0x00000020,\n\t\t\tSDL_WINDOW_MINIMIZED =\t\t0x00000040,\n\t\t\tSDL_WINDOW_MAXIMIZED =\t\t0x00000080,\n\t\t\tSDL_WINDOW_MOUSE_GRABBED =\t0x00000100,\n\t\t\tSDL_WINDOW_INPUT_FOCUS =\t0x00000200,\n\t\t\tSDL_WINDOW_MOUSE_FOCUS =\t0x00000400,\n\t\t\tSDL_WINDOW_FULLSCREEN_DESKTOP =\n\t\t\t\t(SDL_WINDOW_FULLSCREEN | 0x00001000),\n\t\t\tSDL_WINDOW_FOREIGN =\t\t0x00000800,\n\t\t\tSDL_WINDOW_ALLOW_HIGHDPI =\t0x00002000,\t/* Requires >= 2.0.1 */\n\t\t\tSDL_WINDOW_MOUSE_CAPTURE =\t0x00004000,\t/* Requires >= 2.0.4 */\n\t\t\tSDL_WINDOW_ALWAYS_ON_TOP =\t0x00008000,\t/* Requires >= 2.0.5 */\n\t\t\tSDL_WINDOW_SKIP_TASKBAR =\t0x00010000,\t/* Requires >= 2.0.5 */\n\t\t\tSDL_WINDOW_UTILITY =\t\t0x00020000,\t/* Requires >= 2.0.5 */\n\t\t\tSDL_WINDOW_TOOLTIP =\t\t0x00040000,\t/* Requires >= 2.0.5 */\n\t\t\tSDL_WINDOW_POPUP_MENU =\t\t0x00080000,\t/* Requires >= 2.0.5 */\n\t\t\tSDL_WINDOW_KEYBOARD_GRABBED =\t0x00100000,\t/* Requires >= 2.0.16 */\n\t\t\tSDL_WINDOW_VULKAN =\t\t0x10000000,\t/* Requires >= 2.0.6 */\n\t\t\tSDL_WINDOW_METAL =\t\t0x2000000,\t/* Requires >= 2.0.14 */\n\n\t\t\tSDL_WINDOW_INPUT_GRABBED =\n\t\t\t\tSDL_WINDOW_MOUSE_GRABBED,\n\t\t}\n\n\t\t/* Only available in 2.0.4 or higher. */\n\t\tpublic enum SDL_HitTestResult\n\t\t{\n\t\t\tSDL_HITTEST_NORMAL,\t\t/* Region is normal. No special properties. */\n\t\t\tSDL_HITTEST_DRAGGABLE,\t\t/* Region can drag entire window. */\n\t\t\tSDL_HITTEST_RESIZE_TOPLEFT,\n\t\t\tSDL_HITTEST_RESIZE_TOP,\n\t\t\tSDL_HITTEST_RESIZE_TOPRIGHT,\n\t\t\tSDL_HITTEST_RESIZE_RIGHT,\n\t\t\tSDL_HITTEST_RESIZE_BOTTOMRIGHT,\n\t\t\tSDL_HITTEST_RESIZE_BOTTOM,\n\t\t\tSDL_HITTEST_RESIZE_BOTTOMLEFT,\n\t\t\tSDL_HITTEST_RESIZE_LEFT\n\t\t}\n\n\t\tpublic const int SDL_WINDOWPOS_UNDEFINED_MASK =\t0x1FFF0000;\n\t\tpublic const int SDL_WINDOWPOS_CENTERED_MASK =\t0x2FFF0000;\n\t\tpublic const int SDL_WINDOWPOS_UNDEFINED =\t0x1FFF0000;\n\t\tpublic const int SDL_WINDOWPOS_CENTERED =\t0x2FFF0000;\n\n\t\tpublic static int SDL_WINDOWPOS_UNDEFINED_DISPLAY(int X)\n\t\t{\n\t\t\treturn (SDL_WINDOWPOS_UNDEFINED_MASK | X);\n\t\t}\n\n\t\tpublic static bool SDL_WINDOWPOS_ISUNDEFINED(int X)\n\t\t{\n\t\t\treturn (X & 0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK;\n\t\t}\n\n\t\tpublic static int SDL_WINDOWPOS_CENTERED_DISPLAY(int X)\n\t\t{\n\t\t\treturn (SDL_WINDOWPOS_CENTERED_MASK | X);\n\t\t}\n\n\t\tpublic static bool SDL_WINDOWPOS_ISCENTERED(int X)\n\t\t{\n\t\t\treturn (X & 0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_DisplayMode\n\t\t{\n\t\t\tpublic uint format;\n\t\t\tpublic int w;\n\t\t\tpublic int h;\n\t\t\tpublic int refresh_rate;\n\t\t\tpublic IntPtr driverdata; // void*\n\t\t}\n\n\t\t/* win refers to an SDL_Window*, area to a const SDL_Point*, data to a void*.\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate SDL_HitTestResult SDL_HitTest(IntPtr win, IntPtr area, IntPtr data);\n\n\t\t/* IntPtr refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_CreateWindow\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe IntPtr INTERNAL_SDL_CreateWindow(\n\t\t\tbyte* title,\n\t\t\tint x,\n\t\t\tint y,\n\t\t\tint w,\n\t\t\tint h,\n\t\t\tSDL_WindowFlags flags\n\t\t);\n\t\tpublic static unsafe IntPtr SDL_CreateWindow(\n\t\t\tstring title,\n\t\t\tint x,\n\t\t\tint y,\n\t\t\tint w,\n\t\t\tint h,\n\t\t\tSDL_WindowFlags flags\n\t\t) {\n\t\t\tint utf8TitleBufSize = Utf8Size(title);\n\t\t\tbyte* utf8Title = stackalloc byte[utf8TitleBufSize];\n\t\t\treturn INTERNAL_SDL_CreateWindow(\n\t\t\t\tUtf8Encode(title, utf8Title, utf8TitleBufSize),\n\t\t\t\tx, y, w, h,\n\t\t\t\tflags\n\t\t\t);\n\t\t}\n\n\t\t/* window refers to an SDL_Window*, renderer to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_CreateWindowAndRenderer(\n\t\t\tint width,\n\t\t\tint height,\n\t\t\tSDL_WindowFlags window_flags,\n\t\t\tout IntPtr window,\n\t\t\tout IntPtr renderer\n\t\t);\n\n\t\t/* data refers to some native window type, IntPtr to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateWindowFrom(IntPtr data);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_DestroyWindow(IntPtr window);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_DisableScreenSaver();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_EnableScreenSaver();\n\n\t\t/* IntPtr refers to an SDL_DisplayMode. Just use closest. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetClosestDisplayMode(\n\t\t\tint displayIndex,\n\t\t\tref SDL_DisplayMode mode,\n\t\t\tout SDL_DisplayMode closest\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetCurrentDisplayMode(\n\t\t\tint displayIndex,\n\t\t\tout SDL_DisplayMode mode\n\t\t);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetCurrentVideoDriver\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetCurrentVideoDriver();\n\t\tpublic static string SDL_GetCurrentVideoDriver()\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_GetCurrentVideoDriver());\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetDesktopDisplayMode(\n\t\t\tint displayIndex,\n\t\t\tout SDL_DisplayMode mode\n\t\t);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetDisplayName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetDisplayName(int index);\n\t\tpublic static string SDL_GetDisplayName(int index)\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_GetDisplayName(index));\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetDisplayBounds(\n\t\t\tint displayIndex,\n\t\t\tout SDL_Rect rect\n\t\t);\n\n\t\t/* Only available in 2.0.4 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetDisplayDPI(\n\t\t\tint displayIndex,\n\t\t\tout float ddpi,\n\t\t\tout float hdpi,\n\t\t\tout float vdpi\n\t\t);\n\n\t\t/* Only available in 2.0.9 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_DisplayOrientation SDL_GetDisplayOrientation(\n\t\t\tint displayIndex\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetDisplayMode(\n\t\t\tint displayIndex,\n\t\t\tint modeIndex,\n\t\t\tout SDL_DisplayMode mode\n\t\t);\n\n\t\t/* Only available in 2.0.5 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetDisplayUsableBounds(\n\t\t\tint displayIndex,\n\t\t\tout SDL_Rect rect\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetNumDisplayModes(\n\t\t\tint displayIndex\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetNumVideoDisplays();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetNumVideoDrivers();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetVideoDriver\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetVideoDriver(\n\t\t\tint index\n\t\t);\n\t\tpublic static string SDL_GetVideoDriver(int index)\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_GetVideoDriver(index));\n\t\t}\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern float SDL_GetWindowBrightness(\n\t\t\tIntPtr window\n\t\t);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowOpacity(\n\t\t\tIntPtr window,\n\t\t\tfloat opacity\n\t\t);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetWindowOpacity(\n\t\t\tIntPtr window,\n\t\t\tout float out_opacity\n\t\t);\n\n\t\t/* modal_window and parent_window refer to an SDL_Window*s\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowModalFor(\n\t\t\tIntPtr modal_window,\n\t\t\tIntPtr parent_window\n\t\t);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowInputFocus(IntPtr window);\n\n\t\t/* window refers to an SDL_Window*, IntPtr to a void* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetWindowData\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe IntPtr INTERNAL_SDL_GetWindowData(\n\t\t\tIntPtr window,\n\t\t\tbyte* name\n\t\t);\n\t\tpublic static unsafe IntPtr SDL_GetWindowData(\n\t\t\tIntPtr window,\n\t\t\tstring name\n\t\t) {\n\t\t\tint utf8NameBufSize = Utf8Size(name);\n\t\t\tbyte* utf8Name = stackalloc byte[utf8NameBufSize];\n\t\t\treturn INTERNAL_SDL_GetWindowData(\n\t\t\t\twindow,\n\t\t\t\tUtf8Encode(name, utf8Name, utf8NameBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetWindowDisplayIndex(\n\t\t\tIntPtr window\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetWindowDisplayMode(\n\t\t\tIntPtr window,\n\t\t\tout SDL_DisplayMode mode\n\t\t);\n\n\t\t/* IntPtr refers to a void*\n\t\t * window refers to an SDL_Window*\n\t\t * mode refers to a size_t*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetWindowICCProfile(\n\t\t\tIntPtr window,\n\t\t\tout IntPtr mode\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_GetWindowFlags(IntPtr window);\n\n\t\t/* IntPtr refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetWindowFromID(uint id);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetWindowGammaRamp(\n\t\t\tIntPtr window,\n\t\t\t[Out()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U2, SizeConst = 256)]\n\t\t\t\tushort[] red,\n\t\t\t[Out()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U2, SizeConst = 256)]\n\t\t\t\tushort[] green,\n\t\t\t[Out()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U2, SizeConst = 256)]\n\t\t\t\tushort[] blue\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GetWindowGrab(IntPtr window);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GetWindowKeyboardGrab(IntPtr window);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GetWindowMouseGrab(IntPtr window);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_GetWindowID(IntPtr window);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_GetWindowPixelFormat(\n\t\t\tIntPtr window\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GetWindowMaximumSize(\n\t\t\tIntPtr window,\n\t\t\tout int max_w,\n\t\t\tout int max_h\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GetWindowMinimumSize(\n\t\t\tIntPtr window,\n\t\t\tout int min_w,\n\t\t\tout int min_h\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GetWindowPosition(\n\t\t\tIntPtr window,\n\t\t\tout int x,\n\t\t\tout int y\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GetWindowSize(\n\t\t\tIntPtr window,\n\t\t\tout int w,\n\t\t\tout int h\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Surface*, window to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetWindowSurface(IntPtr window);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetWindowTitle\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetWindowTitle(\n\t\t\tIntPtr window\n\t\t);\n\t\tpublic static string SDL_GetWindowTitle(IntPtr window)\n\t\t{\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GetWindowTitle(window)\n\t\t\t);\n\t\t}\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GL_BindTexture(\n\t\t\tIntPtr texture,\n\t\t\tout float texw,\n\t\t\tout float texh\n\t\t);\n\n\t\t/* IntPtr and window refer to an SDL_GLContext and SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GL_CreateContext(IntPtr window);\n\n\t\t/* context refers to an SDL_GLContext */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GL_DeleteContext(IntPtr context);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GL_LoadLibrary\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe int INTERNAL_SDL_GL_LoadLibrary(byte* path);\n\t\tpublic static unsafe int SDL_GL_LoadLibrary(string path)\n\t\t{\n\t\t\tbyte* utf8Path = Utf8EncodeHeap(path);\n\t\t\tint result = INTERNAL_SDL_GL_LoadLibrary(\n\t\t\t\tutf8Path\n\t\t\t);\n\t\t\tMarshal.FreeHGlobal((IntPtr) utf8Path);\n\t\t\treturn result;\n\t\t}\n\n\t\t/* IntPtr refers to a function pointer, proc to a const char* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GL_GetProcAddress(IntPtr proc);\n\n\t\t/* IntPtr refers to a function pointer */\n\t\tpublic static unsafe IntPtr SDL_GL_GetProcAddress(string proc)\n\t\t{\n\t\t\tint utf8ProcBufSize = Utf8Size(proc);\n\t\t\tbyte* utf8Proc = stackalloc byte[utf8ProcBufSize];\n\t\t\treturn SDL_GL_GetProcAddress(\n\t\t\t\t(IntPtr) Utf8Encode(proc, utf8Proc, utf8ProcBufSize)\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GL_UnloadLibrary();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GL_ExtensionSupported\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe SDL_bool INTERNAL_SDL_GL_ExtensionSupported(\n\t\t\tbyte* extension\n\t\t);\n\t\tpublic static unsafe SDL_bool SDL_GL_ExtensionSupported(string extension)\n\t\t{\n\t\t\tint utf8ExtensionBufSize = Utf8Size(extension);\n\t\t\tbyte* utf8Extension = stackalloc byte[utf8ExtensionBufSize];\n\t\t\treturn INTERNAL_SDL_GL_ExtensionSupported(\n\t\t\t\tUtf8Encode(extension, utf8Extension, utf8ExtensionBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Only available in SDL 2.0.2 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GL_ResetAttributes();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GL_GetAttribute(\n\t\t\tSDL_GLattr attr,\n\t\t\tout int value\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GL_GetSwapInterval();\n\n\t\t/* window and context refer to an SDL_Window* and SDL_GLContext */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GL_MakeCurrent(\n\t\t\tIntPtr window,\n\t\t\tIntPtr context\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GL_GetCurrentWindow();\n\n\t\t/* IntPtr refers to an SDL_Context */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GL_GetCurrentContext();\n\n\t\t/* window refers to an SDL_Window*.\n\t\t * Only available in SDL 2.0.1 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GL_GetDrawableSize(\n\t\t\tIntPtr window,\n\t\t\tout int w,\n\t\t\tout int h\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GL_SetAttribute(\n\t\t\tSDL_GLattr attr,\n\t\t\tint value\n\t\t);\n\n\t\tpublic static int SDL_GL_SetAttribute(\n\t\t\tSDL_GLattr attr,\n\t\t\tSDL_GLprofile profile\n\t\t) {\n\t\t\treturn SDL_GL_SetAttribute(attr, (int)profile);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GL_SetSwapInterval(int interval);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GL_SwapWindow(IntPtr window);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GL_UnbindTexture(IntPtr texture);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_HideWindow(IntPtr window);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IsScreenSaverEnabled();\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_MaximizeWindow(IntPtr window);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_MinimizeWindow(IntPtr window);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_RaiseWindow(IntPtr window);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_RestoreWindow(IntPtr window);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowBrightness(\n\t\t\tIntPtr window,\n\t\t\tfloat brightness\n\t\t);\n\n\t\t/* IntPtr and userdata are void*, window is an SDL_Window* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_SetWindowData\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe IntPtr INTERNAL_SDL_SetWindowData(\n\t\t\tIntPtr window,\n\t\t\tbyte* name,\n\t\t\tIntPtr userdata\n\t\t);\n\t\tpublic static unsafe IntPtr SDL_SetWindowData(\n\t\t\tIntPtr window,\n\t\t\tstring name,\n\t\t\tIntPtr userdata\n\t\t) {\n\t\t\tint utf8NameBufSize = Utf8Size(name);\n\t\t\tbyte* utf8Name = stackalloc byte[utf8NameBufSize];\n\t\t\treturn INTERNAL_SDL_SetWindowData(\n\t\t\t\twindow,\n\t\t\t\tUtf8Encode(name, utf8Name, utf8NameBufSize),\n\t\t\t\tuserdata\n\t\t\t);\n\t\t}\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowDisplayMode(\n\t\t\tIntPtr window,\n\t\t\tref SDL_DisplayMode mode\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t/* NULL overload - use the window's dimensions and the desktop's format and refresh rate */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowDisplayMode(\n\t\t\tIntPtr window,\n\t\t\tIntPtr mode\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowFullscreen(\n\t\t\tIntPtr window,\n\t\t\tuint flags\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowGammaRamp(\n\t\t\tIntPtr window,\n\t\t\t[In()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U2, SizeConst = 256)]\n\t\t\t\tushort[] red,\n\t\t\t[In()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U2, SizeConst = 256)]\n\t\t\t\tushort[] green,\n\t\t\t[In()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U2, SizeConst = 256)]\n\t\t\t\tushort[] blue\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowGrab(\n\t\t\tIntPtr window,\n\t\t\tSDL_bool grabbed\n\t\t);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowKeyboardGrab(\n\t\t\tIntPtr window,\n\t\t\tSDL_bool grabbed\n\t\t);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowMouseGrab(\n\t\t\tIntPtr window,\n\t\t\tSDL_bool grabbed\n\t\t);\r\n\r\n\t\t/* window refers to an SDL_Window*, icon to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowIcon(\n\t\t\tIntPtr window,\n\t\t\tIntPtr icon\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowMaximumSize(\n\t\t\tIntPtr window,\n\t\t\tint max_w,\n\t\t\tint max_h\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowMinimumSize(\n\t\t\tIntPtr window,\n\t\t\tint min_w,\n\t\t\tint min_h\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowPosition(\n\t\t\tIntPtr window,\n\t\t\tint x,\n\t\t\tint y\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowSize(\n\t\t\tIntPtr window,\n\t\t\tint w,\n\t\t\tint h\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowBordered(\n\t\t\tIntPtr window,\n\t\t\tSDL_bool bordered\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetWindowBordersSize(\n\t\t\tIntPtr window,\n\t\t\tout int top,\n\t\t\tout int left,\n\t\t\tout int bottom,\n\t\t\tout int right\n\t\t);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowResizable(\n\t\t\tIntPtr window,\n\t\t\tSDL_bool resizable\n\t\t);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowAlwaysOnTop(\n\t\t\tIntPtr window,\n\t\t\tSDL_bool on_top\n\t\t);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_SetWindowTitle\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe void INTERNAL_SDL_SetWindowTitle(\n\t\t\tIntPtr window,\n\t\t\tbyte* title\n\t\t);\n\t\tpublic static unsafe void SDL_SetWindowTitle(\n\t\t\tIntPtr window,\n\t\t\tstring title\n\t\t) {\n\t\t\tint utf8TitleBufSize = Utf8Size(title);\n\t\t\tbyte* utf8Title = stackalloc byte[utf8TitleBufSize];\n\t\t\tINTERNAL_SDL_SetWindowTitle(\n\t\t\t\twindow,\n\t\t\t\tUtf8Encode(title, utf8Title, utf8TitleBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_ShowWindow(IntPtr window);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_UpdateWindowSurface(IntPtr window);\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_UpdateWindowSurfaceRects(\n\t\t\tIntPtr window,\n\t\t\t[In] SDL_Rect[] rects,\n\t\t\tint numrects\n\t\t);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_VideoInit\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe int INTERNAL_SDL_VideoInit(\n\t\t\tbyte* driver_name\n\t\t);\n\t\tpublic static unsafe int SDL_VideoInit(string driver_name)\n\t\t{\n\t\t\tint utf8DriverNameBufSize = Utf8Size(driver_name);\n\t\t\tbyte* utf8DriverName = stackalloc byte[utf8DriverNameBufSize];\n\t\t\treturn INTERNAL_SDL_VideoInit(\n\t\t\t\tUtf8Encode(driver_name, utf8DriverName, utf8DriverNameBufSize)\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_VideoQuit();\n\n\t\t/* window refers to an SDL_Window*, callback_data to a void*\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowHitTest(\n\t\t\tIntPtr window,\n\t\t\tSDL_HitTest callback,\n\t\t\tIntPtr callback_data\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Window*\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetGrabbedWindow();\n\n\t\t/* window refers to an SDL_Window*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowMouseRect(\n\t\t\tIntPtr window,\n\t\t\tref SDL_Rect rect\n\t\t);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * rect refers to an SDL_Rect*\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for rect.\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowMouseRect(\n\t\t\tIntPtr window,\n\t\t\tIntPtr rect\n\t\t);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * IntPtr refers to an SDL_Rect*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetWindowMouseRect(\n\t\t\tIntPtr window\n\t\t);\n\n\t\t/* window refers to an SDL_Window*\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_FlashWindow(\n\t\t\tIntPtr window,\n\t\t\tSDL_FlashOperation operation\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_blendmode.h\n\n\t\t[Flags]\n\t\tpublic enum SDL_BlendMode\n\t\t{\n\t\t\tSDL_BLENDMODE_NONE =\t0x00000000,\n\t\t\tSDL_BLENDMODE_BLEND =\t0x00000001,\n\t\t\tSDL_BLENDMODE_ADD =\t0x00000002,\n\t\t\tSDL_BLENDMODE_MOD =\t0x00000004,\n\t\t\tSDL_BLENDMODE_MUL =\t0x00000008,\t/* >= 2.0.11 */\n\t\t\tSDL_BLENDMODE_INVALID =\t0x7FFFFFFF\n\t\t}\n\n\t\tpublic enum SDL_BlendOperation\n\t\t{\n\t\t\tSDL_BLENDOPERATION_ADD\t\t= 0x1,\n\t\t\tSDL_BLENDOPERATION_SUBTRACT\t= 0x2,\n\t\t\tSDL_BLENDOPERATION_REV_SUBTRACT\t= 0x3,\n\t\t\tSDL_BLENDOPERATION_MINIMUM\t= 0x4,\n\t\t\tSDL_BLENDOPERATION_MAXIMUM\t= 0x5\n\t\t}\n\n\t\tpublic enum SDL_BlendFactor\n\t\t{\n\t\t\tSDL_BLENDFACTOR_ZERO\t\t\t= 0x1,\n\t\t\tSDL_BLENDFACTOR_ONE\t\t\t= 0x2,\n\t\t\tSDL_BLENDFACTOR_SRC_COLOR\t\t= 0x3,\n\t\t\tSDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR\t= 0x4,\n\t\t\tSDL_BLENDFACTOR_SRC_ALPHA\t\t= 0x5,\n\t\t\tSDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA\t= 0x6,\n\t\t\tSDL_BLENDFACTOR_DST_COLOR\t\t= 0x7,\n\t\t\tSDL_BLENDFACTOR_ONE_MINUS_DST_COLOR\t= 0x8,\n\t\t\tSDL_BLENDFACTOR_DST_ALPHA\t\t= 0x9,\n\t\t\tSDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA\t= 0xA\n\t\t}\n\n\t\t/* Only available in 2.0.6 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_BlendMode SDL_ComposeCustomBlendMode(\n\t\t\tSDL_BlendFactor srcColorFactor,\n\t\t\tSDL_BlendFactor dstColorFactor,\n\t\t\tSDL_BlendOperation colorOperation,\n\t\t\tSDL_BlendFactor srcAlphaFactor,\n\t\t\tSDL_BlendFactor dstAlphaFactor,\n\t\t\tSDL_BlendOperation alphaOperation\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_vulkan.h\n\n\t\t/* Only available in 2.0.6 or higher. */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_Vulkan_LoadLibrary\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe int INTERNAL_SDL_Vulkan_LoadLibrary(\n\t\t\tbyte* path\n\t\t);\n\t\tpublic static unsafe int SDL_Vulkan_LoadLibrary(string path)\n\t\t{\n\t\t\tbyte* utf8Path = Utf8EncodeHeap(path);\n\t\t\tint result = INTERNAL_SDL_Vulkan_LoadLibrary(\n\t\t\t\tutf8Path\n\t\t\t);\n\t\t\tMarshal.FreeHGlobal((IntPtr) utf8Path);\n\t\t\treturn result;\n\t\t}\n\n\t\t/* Only available in 2.0.6 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_Vulkan_GetVkGetInstanceProcAddr();\n\n\t\t/* Only available in 2.0.6 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_Vulkan_UnloadLibrary();\n\n\t\t/* window refers to an SDL_Window*, pNames to a const char**.\n\t\t * Only available in 2.0.6 or higher.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for pNames.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_Vulkan_GetInstanceExtensions(\n\t\t\tIntPtr window,\n\t\t\tout uint pCount,\n\t\t\tIntPtr pNames\n\t\t);\n\n\t\t/* window refers to an SDL_Window*, pNames to a const char**.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_Vulkan_GetInstanceExtensions(\n\t\t\tIntPtr window,\n\t\t\tout uint pCount,\n\t\t\tIntPtr[] pNames\n\t\t);\n\n\t\t/* window refers to an SDL_Window.\n\t\t * instance refers to a VkInstance.\n\t\t * surface refers to a VkSurfaceKHR.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_Vulkan_CreateSurface(\n\t\t\tIntPtr window,\n\t\t\tIntPtr instance,\n\t\t\tout ulong surface\n\t\t);\n\n\t\t/* window refers to an SDL_Window*.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_Vulkan_GetDrawableSize(\n\t\t\tIntPtr window,\n\t\t\tout int w,\n\t\t\tout int h\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_metal.h\n\n\t\t/* Only available in 2.0.11 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_Metal_CreateView(\n\t\t\tIntPtr window\n\t\t);\n\n\t\t/* Only available in 2.0.11 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_Metal_DestroyView(\n\t\t\tIntPtr view\n\t\t);\n\n\t\t/* view refers to an SDL_MetalView.\n\t\t * Only available in 2.0.14 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_Metal_GetLayer(\n\t\t\tIntPtr view\n\t\t);\n\n\t\t/* window refers to an SDL_Window*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_Metal_GetDrawableSize(\n\t\t\tIntPtr window,\n\t\t\tout int w,\n\t\t\tout int h\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_render.h\n\n\t\t[Flags]\n\t\tpublic enum SDL_RendererFlags : uint\n\t\t{\n\t\t\tSDL_RENDERER_SOFTWARE =\t\t0x00000001,\n\t\t\tSDL_RENDERER_ACCELERATED =\t0x00000002,\n\t\t\tSDL_RENDERER_PRESENTVSYNC =\t0x00000004,\n\t\t\tSDL_RENDERER_TARGETTEXTURE =\t0x00000008\n\t\t}\n\n\t\t[Flags]\n\t\tpublic enum SDL_RendererFlip\n\t\t{\n\t\t\tSDL_FLIP_NONE =\t\t0x00000000,\n\t\t\tSDL_FLIP_HORIZONTAL =\t0x00000001,\n\t\t\tSDL_FLIP_VERTICAL =\t0x00000002\n\t\t}\n\n\t\tpublic enum SDL_TextureAccess\n\t\t{\n\t\t\tSDL_TEXTUREACCESS_STATIC,\n\t\t\tSDL_TEXTUREACCESS_STREAMING,\n\t\t\tSDL_TEXTUREACCESS_TARGET\n\t\t}\n\n\t\t[Flags]\n\t\tpublic enum SDL_TextureModulate\n\t\t{\n\t\t\tSDL_TEXTUREMODULATE_NONE =\t\t0x00000000,\n\t\t\tSDL_TEXTUREMODULATE_HORIZONTAL =\t0x00000001,\n\t\t\tSDL_TEXTUREMODULATE_VERTICAL =\t\t0x00000002\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic unsafe struct SDL_RendererInfo\n\t\t{\n\t\t\tpublic IntPtr name; // const char*\n\t\t\tpublic uint flags;\n\t\t\tpublic uint num_texture_formats;\n\t\t\tpublic fixed uint texture_formats[16];\n\t\t\tpublic int max_texture_width;\n\t\t\tpublic int max_texture_height;\n\t\t}\n\n\t\t/* Only available in 2.0.11 or higher. */\n\t\tpublic enum SDL_ScaleMode\n\t\t{\n\t\t\tSDL_ScaleModeNearest,\n\t\t\tSDL_ScaleModeLinear,\n\t\t\tSDL_ScaleModeBest\n\t\t}\n\n\t\t/* Only available in 2.0.18 or higher. */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_Vertex\n\t\t{\n\t\t\tpublic SDL_FPoint position;\n\t\t\tpublic SDL_Color color;\n\t\t\tpublic SDL_FPoint tex_coord;\n\t\t}\n\n\t\t/* IntPtr refers to an SDL_Renderer*, window to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateRenderer(\n\t\t\tIntPtr window,\n\t\t\tint index,\n\t\t\tSDL_RendererFlags flags\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Renderer*, surface to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateSoftwareRenderer(IntPtr surface);\n\n\t\t/* IntPtr refers to an SDL_Texture*, renderer to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateTexture(\n\t\t\tIntPtr renderer,\n\t\t\tuint format,\n\t\t\tint access,\n\t\t\tint w,\n\t\t\tint h\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Texture*\n\t\t * renderer refers to an SDL_Renderer*\n\t\t * surface refers to an SDL_Surface*\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateTextureFromSurface(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr surface\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_DestroyRenderer(IntPtr renderer);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_DestroyTexture(IntPtr texture);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetNumRenderDrivers();\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetRenderDrawBlendMode(\n\t\t\tIntPtr renderer,\n\t\t\tout SDL_BlendMode blendMode\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture*\n\t\t * Only available in 2.0.11 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetTextureScaleMode(\n\t\t\tIntPtr texture,\n\t\t\tSDL_ScaleMode scaleMode\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture*\n\t\t * Only available in 2.0.11 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetTextureScaleMode(\n\t\t\tIntPtr texture,\n\t\t\tout SDL_ScaleMode scaleMode\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture*\n\t\t * userdata refers to a void*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetTextureUserData(\n\t\t\tIntPtr texture,\n\t\t\tIntPtr userdata\n\t\t);\n\n\t\t/* IntPtr refers to a void*, texture refers to an SDL_Texture*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetTextureUserData(IntPtr texture);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetRenderDrawColor(\n\t\t\tIntPtr renderer,\n\t\t\tout byte r,\n\t\t\tout byte g,\n\t\t\tout byte b,\n\t\t\tout byte a\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetRenderDriverInfo(\n\t\t\tint index,\n\t\t\tout SDL_RendererInfo info\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Renderer*, window to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetRenderer(IntPtr window);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetRendererInfo(\n\t\t\tIntPtr renderer,\n\t\t\tout SDL_RendererInfo info\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetRendererOutputSize(\n\t\t\tIntPtr renderer,\n\t\t\tout int w,\n\t\t\tout int h\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetTextureAlphaMod(\n\t\t\tIntPtr texture,\n\t\t\tout byte alpha\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetTextureBlendMode(\n\t\t\tIntPtr texture,\n\t\t\tout SDL_BlendMode blendMode\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetTextureColorMod(\n\t\t\tIntPtr texture,\n\t\t\tout byte r,\n\t\t\tout byte g,\n\t\t\tout byte b\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture*, pixels to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_LockTexture(\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect rect,\n\t\t\tout IntPtr pixels,\n\t\t\tout int pitch\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture*, pixels to a void*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * the rectangle is passed as NULL.\n\t\t * This overload allows for IntPtr.Zero to be passed for rect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_LockTexture(\n\t\t\tIntPtr texture,\n\t\t\tIntPtr rect,\n\t\t\tout IntPtr pixels,\n\t\t\tout int pitch\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture*, surface to an SDL_Surface*\n\t\t * Only available in 2.0.11 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_LockTextureToSurface(\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect rect,\n\t\t\tout IntPtr surface\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture*, surface to an SDL_Surface*\n\t\t * Internally, this function contains logic to use default values when\n\t\t * the rectangle is passed as NULL.\n\t\t * This overload allows for IntPtr.Zero to be passed for rect.\n\t\t * Only available in 2.0.11 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_LockTextureToSurface(\n\t\t\tIntPtr texture,\n\t\t\tIntPtr rect,\n\t\t\tout IntPtr surface\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_QueryTexture(\n\t\t\tIntPtr texture,\n\t\t\tout uint format,\n\t\t\tout int access,\n\t\t\tout int w,\n\t\t\tout int h\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderClear(IntPtr renderer);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopy(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for srcrect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopy(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for dstrect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopy(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dstrect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for both SDL_Rects.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopy(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tIntPtr dstrect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyEx(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tref SDL_Rect dstrect,\n\t\t\tdouble angle,\n\t\t\tref SDL_Point center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for srcrect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyEx(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tref SDL_Rect dstrect,\n\t\t\tdouble angle,\n\t\t\tref SDL_Point center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for dstrect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyEx(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dstrect,\n\t\t\tdouble angle,\n\t\t\tref SDL_Point center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for center.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyEx(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tref SDL_Rect dstrect,\n\t\t\tdouble angle,\n\t\t\tIntPtr center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for both\n\t\t * srcrect and dstrect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyEx(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tIntPtr dstrect,\n\t\t\tdouble angle,\n\t\t\tref SDL_Point center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for both\n\t\t * srcrect and center.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyEx(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tref SDL_Rect dstrect,\n\t\t\tdouble angle,\n\t\t\tIntPtr center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for both\n\t\t * dstrect and center.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyEx(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dstrect,\n\t\t\tdouble angle,\n\t\t\tIntPtr center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for all\n\t\t * three parameters.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyEx(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tIntPtr dstrect,\n\t\t\tdouble angle,\n\t\t\tIntPtr center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawLine(\n\t\t\tIntPtr renderer,\n\t\t\tint x1,\n\t\t\tint y1,\n\t\t\tint x2,\n\t\t\tint y2\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawLines(\n\t\t\tIntPtr renderer,\n\t\t\t[In] SDL_Point[] points,\n\t\t\tint count\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawPoint(\n\t\t\tIntPtr renderer,\n\t\t\tint x,\n\t\t\tint y\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawPoints(\n\t\t\tIntPtr renderer,\n\t\t\t[In] SDL_Point[] points,\n\t\t\tint count\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawRect(\n\t\t\tIntPtr renderer,\n\t\t\tref SDL_Rect rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, rect to an SDL_Rect*.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for rect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawRect(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawRects(\n\t\t\tIntPtr renderer,\n\t\t\t[In] SDL_Rect[] rects,\n\t\t\tint count\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderFillRect(\n\t\t\tIntPtr renderer,\n\t\t\tref SDL_Rect rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, rect to an SDL_Rect*.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for rect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderFillRect(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderFillRects(\n\t\t\tIntPtr renderer,\n\t\t\t[In] SDL_Rect[] rects,\n\t\t\tint count\n\t\t);\n\n\t\t#region Floating Point Render Functions\n\n\t\t/* This region only available in SDL 2.0.10 or higher. */\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tref SDL_FRect dstrect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for srcrect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tref SDL_FRect dstrect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for dstrect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dstrect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for both SDL_Rects.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tIntPtr dstrect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyEx(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tref SDL_FRect dstrect,\n\t\t\tdouble angle,\n\t\t\tref SDL_FPoint center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for srcrect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyEx(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tref SDL_FRect dstrect,\n\t\t\tdouble angle,\n\t\t\tref SDL_FPoint center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for dstrect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyExF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dstrect,\n\t\t\tdouble angle,\n\t\t\tref SDL_FPoint center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for center.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyExF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tref SDL_FRect dstrect,\n\t\t\tdouble angle,\n\t\t\tIntPtr center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for both\n\t\t * srcrect and dstrect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyExF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tIntPtr dstrect,\n\t\t\tdouble angle,\n\t\t\tref SDL_FPoint center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for both\n\t\t * srcrect and center.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyExF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tref SDL_FRect dstrect,\n\t\t\tdouble angle,\n\t\t\tIntPtr center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for both\n\t\t * dstrect and center.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyExF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dstrect,\n\t\t\tdouble angle,\n\t\t\tIntPtr center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture*.\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source, destination, and/or center are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for all\n\t\t * three parameters.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderCopyExF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\tIntPtr srcrect,\n\t\t\tIntPtr dstrect,\n\t\t\tdouble angle,\n\t\t\tIntPtr center,\n\t\t\tSDL_RendererFlip flip\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * texture refers to an SDL_Texture*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderGeometry(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\t[In] SDL_Vertex[] vertices,\n\t\t\tint num_vertices,\n\t\t\t[In] int[] indices,\n\t\t\tint num_indices\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * texture refers to an SDL_Texture*\n\t\t * indices refers to a void*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderGeometryRaw(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture,\n\t\t\t[In] float[] xy,\n\t\t\tint xy_stride,\n\t\t\t[In] int[] color,\n\t\t\tint color_stride,\n\t\t\t[In] float[] uv,\n\t\t\tint uv_stride,\n\t\t\tint num_vertices,\n\t\t\tIntPtr indices,\n\t\t\tint num_indices,\n\t\t\tint size_indices\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawPointF(\n\t\t\tIntPtr renderer,\n\t\t\tfloat x,\n\t\t\tfloat y\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawPointsF(\n\t\t\tIntPtr renderer,\n\t\t\t[In] SDL_FPoint[] points,\n\t\t\tint count\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawLineF(\n\t\t\tIntPtr renderer,\n\t\t\tfloat x1,\n\t\t\tfloat y1,\n\t\t\tfloat x2,\n\t\t\tfloat y2\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawLinesF(\n\t\t\tIntPtr renderer,\n\t\t\t[In] SDL_FPoint[] points,\n\t\t\tint count\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawRectF(\n\t\t\tIntPtr renderer,\n\t\t\tref SDL_FRect rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, rect to an SDL_Rect*.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for rect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawRectF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderDrawRectsF(\n\t\t\tIntPtr renderer,\n\t\t\t[In] SDL_FRect[] rects,\n\t\t\tint count\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderFillRectF(\n\t\t\tIntPtr renderer,\n\t\t\tref SDL_FRect rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, rect to an SDL_Rect*.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for rect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderFillRectF(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderFillRectsF(\n\t\t\tIntPtr renderer,\n\t\t\t[In] SDL_FRect[] rects,\n\t\t\tint count\n\t\t);\n\n\t\t#endregion\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_RenderGetClipRect(\n\t\t\tIntPtr renderer,\n\t\t\tout SDL_Rect rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_RenderGetLogicalSize(\n\t\t\tIntPtr renderer,\n\t\t\tout int w,\n\t\t\tout int h\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_RenderGetScale(\n\t\t\tIntPtr renderer,\n\t\t\tout float scaleX,\n\t\t\tout float scaleY\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_RenderWindowToLogical(\n\t\t\tIntPtr renderer,\n\t\t\tint windowX,\n\t\t\tint windowY,\n\t\t\tout float logicalX,\n\t\t\tout float logicalY\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_RenderLogicalToWindow(\n\t\t\tIntPtr renderer,\n\t\t\tfloat logicalX,\n\t\t\tfloat logicalY,\n\t\t\tout int windowX,\n\t\t\tout int windowY\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderGetViewport(\n\t\t\tIntPtr renderer,\n\t\t\tout SDL_Rect rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_RenderPresent(IntPtr renderer);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderReadPixels(\n\t\t\tIntPtr renderer,\n\t\t\tref SDL_Rect rect,\n\t\t\tuint format,\n\t\t\tIntPtr pixels,\n\t\t\tint pitch\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderSetClipRect(\n\t\t\tIntPtr renderer,\n\t\t\tref SDL_Rect rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for rect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderSetClipRect(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderSetLogicalSize(\n\t\t\tIntPtr renderer,\n\t\t\tint w,\n\t\t\tint h\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderSetScale(\n\t\t\tIntPtr renderer,\n\t\t\tfloat scaleX,\n\t\t\tfloat scaleY\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderSetIntegerScale(\n\t\t\tIntPtr renderer,\n\t\t\tSDL_bool enable\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderSetViewport(\n\t\t\tIntPtr renderer,\n\t\t\tref SDL_Rect rect\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetRenderDrawBlendMode(\n\t\t\tIntPtr renderer,\n\t\t\tSDL_BlendMode blendMode\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetRenderDrawColor(\n\t\t\tIntPtr renderer,\n\t\t\tbyte r,\n\t\t\tbyte g,\n\t\t\tbyte b,\n\t\t\tbyte a\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*, texture to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetRenderTarget(\n\t\t\tIntPtr renderer,\n\t\t\tIntPtr texture\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetTextureAlphaMod(\n\t\t\tIntPtr texture,\n\t\t\tbyte alpha\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetTextureBlendMode(\n\t\t\tIntPtr texture,\n\t\t\tSDL_BlendMode blendMode\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetTextureColorMod(\n\t\t\tIntPtr texture,\n\t\t\tbyte r,\n\t\t\tbyte g,\n\t\t\tbyte b\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_UnlockTexture(IntPtr texture);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_UpdateTexture(\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect rect,\n\t\t\tIntPtr pixels,\n\t\t\tint pitch\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_UpdateTexture(\n\t\t\tIntPtr texture,\n\t\t\tIntPtr rect,\n\t\t\tIntPtr pixels,\n\t\t\tint pitch\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture*\n\t\t * Only available in 2.0.1 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_UpdateYUVTexture(\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect rect,\n\t\t\tIntPtr yPlane,\n\t\t\tint yPitch,\n\t\t\tIntPtr uPlane,\n\t\t\tint uPitch,\n\t\t\tIntPtr vPlane,\n\t\t\tint vPitch\n\t\t);\n\n\t\t/* texture refers to an SDL_Texture*.\n\t\t * yPlane and uvPlane refer to const Uint*.\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_UpdateNVTexture(\n\t\t\tIntPtr texture,\n\t\t\tref SDL_Rect rect,\n\t\t\tIntPtr yPlane,\n\t\t\tint yPitch,\n\t\t\tIntPtr uvPlane,\n\t\t\tint uvPitch\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_RenderTargetSupported(\n\t\t\tIntPtr renderer\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Texture*, renderer to an SDL_Renderer* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetRenderTarget(IntPtr renderer);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * Only available in 2.0.8 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_RenderGetMetalLayer(\n\t\t\tIntPtr renderer\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * Only available in 2.0.8 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_RenderGetMetalCommandEncoder(\n\t\t\tIntPtr renderer\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderSetVSync(IntPtr renderer, int vsync);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_RenderIsClipEnabled(IntPtr renderer);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * Only available in 2.0.10 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_RenderFlush(IntPtr renderer);\n\n\t\t#endregion\n\n\t\t#region SDL_pixels.h\n\n\t\tpublic static uint SDL_DEFINE_PIXELFOURCC(byte A, byte B, byte C, byte D)\n\t\t{\n\t\t\treturn SDL_FOURCC(A, B, C, D);\n\t\t}\n\n\t\tpublic static uint SDL_DEFINE_PIXELFORMAT(\n\t\t\tSDL_PixelType type,\n\t\t\tuint order,\n\t\t\tSDL_PackedLayout layout,\n\t\t\tbyte bits,\n\t\t\tbyte bytes\n\t\t) {\n\t\t\treturn (uint) (\n\t\t\t\t(1 << 28) |\n\t\t\t\t(((byte) type) << 24) |\n\t\t\t\t(((byte) order) << 20) |\n\t\t\t\t(((byte) layout) << 16) |\n\t\t\t\t(bits << 8) |\n\t\t\t\t(bytes)\n\t\t\t);\n\t\t}\n\n\t\tpublic static byte SDL_PIXELFLAG(uint X)\n\t\t{\n\t\t\treturn (byte) ((X >> 28) & 0x0F);\n\t\t}\n\n\t\tpublic static byte SDL_PIXELTYPE(uint X)\n\t\t{\n\t\t\treturn (byte) ((X >> 24) & 0x0F);\n\t\t}\n\n\t\tpublic static byte SDL_PIXELORDER(uint X)\n\t\t{\n\t\t\treturn (byte) ((X >> 20) & 0x0F);\n\t\t}\n\n\t\tpublic static byte SDL_PIXELLAYOUT(uint X)\n\t\t{\n\t\t\treturn (byte) ((X >> 16) & 0x0F);\n\t\t}\n\n\t\tpublic static byte SDL_BITSPERPIXEL(uint X)\n\t\t{\n\t\t\treturn (byte) ((X >> 8) & 0xFF);\n\t\t}\n\n\t\tpublic static byte SDL_BYTESPERPIXEL(uint X)\n\t\t{\n\t\t\tif (SDL_ISPIXELFORMAT_FOURCC(X))\n\t\t\t{\n\t\t\t\tif (\t(X == SDL_PIXELFORMAT_YUY2) ||\n\t\t\t\t\t\t(X == SDL_PIXELFORMAT_UYVY) ||\n\t\t\t\t\t\t(X == SDL_PIXELFORMAT_YVYU)\t)\n\t\t\t\t{\n\t\t\t\t\treturn 2;\n\t\t\t\t}\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn (byte) (X & 0xFF);\n\t\t}\n\n\t\tpublic static bool SDL_ISPIXELFORMAT_INDEXED(uint format)\n\t\t{\n\t\t\tif (SDL_ISPIXELFORMAT_FOURCC(format))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tSDL_PixelType pType =\n\t\t\t\t(SDL_PixelType) SDL_PIXELTYPE(format);\n\t\t\treturn (\n\t\t\t\tpType == SDL_PixelType.SDL_PIXELTYPE_INDEX1 ||\n\t\t\t\tpType == SDL_PixelType.SDL_PIXELTYPE_INDEX4 ||\n\t\t\t\tpType == SDL_PixelType.SDL_PIXELTYPE_INDEX8\n\t\t\t);\n\t\t}\n\n\t\tpublic static bool SDL_ISPIXELFORMAT_PACKED(uint format)\n\t\t{\n\t\t\tif (SDL_ISPIXELFORMAT_FOURCC(format))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tSDL_PixelType pType =\n\t\t\t\t(SDL_PixelType) SDL_PIXELTYPE(format);\n\t\t\treturn (\n\t\t\t\tpType == SDL_PixelType.SDL_PIXELTYPE_PACKED8 ||\n\t\t\t\tpType == SDL_PixelType.SDL_PIXELTYPE_PACKED16 ||\n\t\t\t\tpType == SDL_PixelType.SDL_PIXELTYPE_PACKED32\n\t\t\t);\n\t\t}\n\n\t\tpublic static bool SDL_ISPIXELFORMAT_ARRAY(uint format)\n\t\t{\n\t\t\tif (SDL_ISPIXELFORMAT_FOURCC(format))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tSDL_PixelType pType =\n\t\t\t\t(SDL_PixelType) SDL_PIXELTYPE(format);\n\t\t\treturn (\n\t\t\t\tpType == SDL_PixelType.SDL_PIXELTYPE_ARRAYU8 ||\n\t\t\t\tpType == SDL_PixelType.SDL_PIXELTYPE_ARRAYU16 ||\n\t\t\t\tpType == SDL_PixelType.SDL_PIXELTYPE_ARRAYU32 ||\n\t\t\t\tpType == SDL_PixelType.SDL_PIXELTYPE_ARRAYF16 ||\n\t\t\t\tpType == SDL_PixelType.SDL_PIXELTYPE_ARRAYF32\n\t\t\t);\n\t\t}\n\n\t\tpublic static bool SDL_ISPIXELFORMAT_ALPHA(uint format)\n\t\t{\n\t\t\tif (SDL_ISPIXELFORMAT_PACKED(format))\n\t\t\t{\n\t\t\t\tSDL_PackedOrder pOrder =\n\t\t\t\t\t(SDL_PackedOrder) SDL_PIXELORDER(format);\n\t\t\t\treturn (\n\t\t\t\t\tpOrder == SDL_PackedOrder.SDL_PACKEDORDER_ARGB ||\n\t\t\t\t\tpOrder == SDL_PackedOrder.SDL_PACKEDORDER_RGBA ||\n\t\t\t\t\tpOrder == SDL_PackedOrder.SDL_PACKEDORDER_ABGR ||\n\t\t\t\t\tpOrder == SDL_PackedOrder.SDL_PACKEDORDER_BGRA\n\t\t\t\t);\n\t\t\t}\n\t\t\telse if (SDL_ISPIXELFORMAT_ARRAY(format))\n\t\t\t{\n\t\t\t\tSDL_ArrayOrder aOrder =\n\t\t\t\t\t(SDL_ArrayOrder) SDL_PIXELORDER(format);\n\t\t\t\treturn (\n\t\t\t\t\taOrder == SDL_ArrayOrder.SDL_ARRAYORDER_ARGB ||\n\t\t\t\t\taOrder == SDL_ArrayOrder.SDL_ARRAYORDER_RGBA ||\n\t\t\t\t\taOrder == SDL_ArrayOrder.SDL_ARRAYORDER_ABGR ||\n\t\t\t\t\taOrder == SDL_ArrayOrder.SDL_ARRAYORDER_BGRA\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tpublic static bool SDL_ISPIXELFORMAT_FOURCC(uint format)\n\t\t{\n\t\t\treturn (format == 0) && (SDL_PIXELFLAG(format) != 1);\n\t\t}\n\n\t\tpublic enum SDL_PixelType\n\t\t{\n\t\t\tSDL_PIXELTYPE_UNKNOWN,\n\t\t\tSDL_PIXELTYPE_INDEX1,\n\t\t\tSDL_PIXELTYPE_INDEX4,\n\t\t\tSDL_PIXELTYPE_INDEX8,\n\t\t\tSDL_PIXELTYPE_PACKED8,\n\t\t\tSDL_PIXELTYPE_PACKED16,\n\t\t\tSDL_PIXELTYPE_PACKED32,\n\t\t\tSDL_PIXELTYPE_ARRAYU8,\n\t\t\tSDL_PIXELTYPE_ARRAYU16,\n\t\t\tSDL_PIXELTYPE_ARRAYU32,\n\t\t\tSDL_PIXELTYPE_ARRAYF16,\n\t\t\tSDL_PIXELTYPE_ARRAYF32\n\t\t}\n\n\t\tpublic enum SDL_BitmapOrder\n\t\t{\n\t\t\tSDL_BITMAPORDER_NONE,\n\t\t\tSDL_BITMAPORDER_4321,\n\t\t\tSDL_BITMAPORDER_1234\n\t\t}\n\n\t\tpublic enum SDL_PackedOrder\n\t\t{\n\t\t\tSDL_PACKEDORDER_NONE,\n\t\t\tSDL_PACKEDORDER_XRGB,\n\t\t\tSDL_PACKEDORDER_RGBX,\n\t\t\tSDL_PACKEDORDER_ARGB,\n\t\t\tSDL_PACKEDORDER_RGBA,\n\t\t\tSDL_PACKEDORDER_XBGR,\n\t\t\tSDL_PACKEDORDER_BGRX,\n\t\t\tSDL_PACKEDORDER_ABGR,\n\t\t\tSDL_PACKEDORDER_BGRA\n\t\t}\n\n\t\tpublic enum SDL_ArrayOrder\n\t\t{\n\t\t\tSDL_ARRAYORDER_NONE,\n\t\t\tSDL_ARRAYORDER_RGB,\n\t\t\tSDL_ARRAYORDER_RGBA,\n\t\t\tSDL_ARRAYORDER_ARGB,\n\t\t\tSDL_ARRAYORDER_BGR,\n\t\t\tSDL_ARRAYORDER_BGRA,\n\t\t\tSDL_ARRAYORDER_ABGR\n\t\t}\n\n\t\tpublic enum SDL_PackedLayout\n\t\t{\n\t\t\tSDL_PACKEDLAYOUT_NONE,\n\t\t\tSDL_PACKEDLAYOUT_332,\n\t\t\tSDL_PACKEDLAYOUT_4444,\n\t\t\tSDL_PACKEDLAYOUT_1555,\n\t\t\tSDL_PACKEDLAYOUT_5551,\n\t\t\tSDL_PACKEDLAYOUT_565,\n\t\t\tSDL_PACKEDLAYOUT_8888,\n\t\t\tSDL_PACKEDLAYOUT_2101010,\n\t\t\tSDL_PACKEDLAYOUT_1010102\n\t\t}\n\n\t\tpublic static readonly uint SDL_PIXELFORMAT_UNKNOWN = 0;\n\t\tpublic static readonly uint SDL_PIXELFORMAT_INDEX1LSB =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_INDEX1,\n\t\t\t\t(uint) SDL_BitmapOrder.SDL_BITMAPORDER_4321,\n\t\t\t\t0,\n\t\t\t\t1, 0\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_INDEX1MSB =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_INDEX1,\n\t\t\t\t(uint) SDL_BitmapOrder.SDL_BITMAPORDER_1234,\n\t\t\t\t0,\n\t\t\t\t1, 0\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_INDEX4LSB =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_INDEX4,\n\t\t\t\t(uint) SDL_BitmapOrder.SDL_BITMAPORDER_4321,\n\t\t\t\t0,\n\t\t\t\t4, 0\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_INDEX4MSB =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_INDEX4,\n\t\t\t\t(uint) SDL_BitmapOrder.SDL_BITMAPORDER_1234,\n\t\t\t\t0,\n\t\t\t\t4, 0\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_INDEX8 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_INDEX8,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t8, 1\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_RGB332 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED8,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_XRGB,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_332,\n\t\t\t\t8, 1\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_XRGB444 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_XRGB,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_4444,\n\t\t\t\t12, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_RGB444 =\n\t\t\tSDL_PIXELFORMAT_XRGB444;\n\t\tpublic static readonly uint SDL_PIXELFORMAT_XBGR444 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_XBGR,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_4444,\n\t\t\t\t12, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_BGR444 =\n\t\t\tSDL_PIXELFORMAT_XBGR444;\n\t\tpublic static readonly uint SDL_PIXELFORMAT_XRGB1555 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_XRGB,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_1555,\n\t\t\t\t15, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_RGB555 =\n\t\t\tSDL_PIXELFORMAT_XRGB1555;\n\t\tpublic static readonly uint SDL_PIXELFORMAT_XBGR1555 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_INDEX1,\n\t\t\t\t(uint) SDL_BitmapOrder.SDL_BITMAPORDER_4321,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_1555,\n\t\t\t\t15, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_BGR555 =\n\t\t\tSDL_PIXELFORMAT_XBGR1555;\n\t\tpublic static readonly uint SDL_PIXELFORMAT_ARGB4444 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_ARGB,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_4444,\n\t\t\t\t16, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_RGBA4444 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_RGBA,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_4444,\n\t\t\t\t16, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_ABGR4444 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_ABGR,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_4444,\n\t\t\t\t16, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_BGRA4444 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_BGRA,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_4444,\n\t\t\t\t16, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_ARGB1555 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_ARGB,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_1555,\n\t\t\t\t16, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_RGBA5551 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_RGBA,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_5551,\n\t\t\t\t16, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_ABGR1555 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_ABGR,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_1555,\n\t\t\t\t16, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_BGRA5551 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_BGRA,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_5551,\n\t\t\t\t16, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_RGB565 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_XRGB,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_565,\n\t\t\t\t16, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_BGR565 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED16,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_XBGR,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_565,\n\t\t\t\t16, 2\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_RGB24 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_ARRAYU8,\n\t\t\t\t(uint) SDL_ArrayOrder.SDL_ARRAYORDER_RGB,\n\t\t\t\t0,\n\t\t\t\t24, 3\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_BGR24 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_ARRAYU8,\n\t\t\t\t(uint) SDL_ArrayOrder.SDL_ARRAYORDER_BGR,\n\t\t\t\t0,\n\t\t\t\t24, 3\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_XRGB888 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED32,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_XRGB,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_8888,\n\t\t\t\t24, 4\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_RGB888 =\n\t\t\tSDL_PIXELFORMAT_XRGB888;\n\t\tpublic static readonly uint SDL_PIXELFORMAT_RGBX8888 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED32,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_RGBX,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_8888,\n\t\t\t\t24, 4\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_XBGR888 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED32,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_XBGR,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_8888,\n\t\t\t\t24, 4\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_BGR888 =\n\t\t\tSDL_PIXELFORMAT_XBGR888;\n\t\tpublic static readonly uint SDL_PIXELFORMAT_BGRX8888 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED32,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_BGRX,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_8888,\n\t\t\t\t24, 4\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_ARGB8888 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED32,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_ARGB,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_8888,\n\t\t\t\t32, 4\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_RGBA8888 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED32,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_RGBA,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_8888,\n\t\t\t\t32, 4\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_ABGR8888 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED32,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_ABGR,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_8888,\n\t\t\t\t32, 4\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_BGRA8888 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED32,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_BGRA,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_8888,\n\t\t\t\t32, 4\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_ARGB2101010 =\n\t\t\tSDL_DEFINE_PIXELFORMAT(\n\t\t\t\tSDL_PixelType.SDL_PIXELTYPE_PACKED32,\n\t\t\t\t(uint) SDL_PackedOrder.SDL_PACKEDORDER_ARGB,\n\t\t\t\tSDL_PackedLayout.SDL_PACKEDLAYOUT_2101010,\n\t\t\t\t32, 4\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_YV12 =\n\t\t\tSDL_DEFINE_PIXELFOURCC(\n\t\t\t\t(byte) 'Y', (byte) 'V', (byte) '1', (byte) '2'\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_IYUV =\n\t\t\tSDL_DEFINE_PIXELFOURCC(\n\t\t\t\t(byte) 'I', (byte) 'Y', (byte) 'U', (byte) 'V'\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_YUY2 =\n\t\t\tSDL_DEFINE_PIXELFOURCC(\n\t\t\t\t(byte) 'Y', (byte) 'U', (byte) 'Y', (byte) '2'\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_UYVY =\n\t\t\tSDL_DEFINE_PIXELFOURCC(\n\t\t\t\t(byte) 'U', (byte) 'Y', (byte) 'V', (byte) 'Y'\n\t\t\t);\n\t\tpublic static readonly uint SDL_PIXELFORMAT_YVYU =\n\t\t\tSDL_DEFINE_PIXELFOURCC(\n\t\t\t\t(byte) 'Y', (byte) 'V', (byte) 'Y', (byte) 'U'\n\t\t\t);\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_Color\n\t\t{\n\t\t\tpublic byte r;\n\t\t\tpublic byte g;\n\t\t\tpublic byte b;\n\t\t\tpublic byte a;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_Palette\n\t\t{\n\t\t\tpublic int ncolors;\n\t\t\tpublic IntPtr colors;\n\t\t\tpublic int version;\n\t\t\tpublic int refcount;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_PixelFormat\n\t\t{\n\t\t\tpublic uint format;\n\t\t\tpublic IntPtr palette; // SDL_Palette*\n\t\t\tpublic byte BitsPerPixel;\n\t\t\tpublic byte BytesPerPixel;\n\t\t\tpublic uint Rmask;\n\t\t\tpublic uint Gmask;\n\t\t\tpublic uint Bmask;\n\t\t\tpublic uint Amask;\n\t\t\tpublic byte Rloss;\n\t\t\tpublic byte Gloss;\n\t\t\tpublic byte Bloss;\n\t\t\tpublic byte Aloss;\n\t\t\tpublic byte Rshift;\n\t\t\tpublic byte Gshift;\n\t\t\tpublic byte Bshift;\n\t\t\tpublic byte Ashift;\n\t\t\tpublic int refcount;\n\t\t\tpublic IntPtr next; // SDL_PixelFormat*\n\t\t}\n\n\t\t/* IntPtr refers to an SDL_PixelFormat* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_AllocFormat(uint pixel_format);\n\n\t\t/* IntPtr refers to an SDL_Palette* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_AllocPalette(int ncolors);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_CalculateGammaRamp(\n\t\t\tfloat gamma,\n\t\t\t[Out()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U2, SizeConst = 256)]\n\t\t\t\tushort[] ramp\n\t\t);\n\n\t\t/* format refers to an SDL_PixelFormat* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_FreeFormat(IntPtr format);\n\n\t\t/* palette refers to an SDL_Palette* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_FreePalette(IntPtr palette);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetPixelFormatName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetPixelFormatName(\n\t\t\tuint format\n\t\t);\n\t\tpublic static string SDL_GetPixelFormatName(uint format)\n\t\t{\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GetPixelFormatName(format)\n\t\t\t);\n\t\t}\n\n\t\t/* format refers to an SDL_PixelFormat* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GetRGB(\n\t\t\tuint pixel,\n\t\t\tIntPtr format,\n\t\t\tout byte r,\n\t\t\tout byte g,\n\t\t\tout byte b\n\t\t);\n\n\t\t/* format refers to an SDL_PixelFormat* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GetRGBA(\n\t\t\tuint pixel,\n\t\t\tIntPtr format,\n\t\t\tout byte r,\n\t\t\tout byte g,\n\t\t\tout byte b,\n\t\t\tout byte a\n\t\t);\n\n\t\t/* format refers to an SDL_PixelFormat* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_MapRGB(\n\t\t\tIntPtr format,\n\t\t\tbyte r,\n\t\t\tbyte g,\n\t\t\tbyte b\n\t\t);\n\n\t\t/* format refers to an SDL_PixelFormat* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_MapRGBA(\n\t\t\tIntPtr format,\n\t\t\tbyte r,\n\t\t\tbyte g,\n\t\t\tbyte b,\n\t\t\tbyte a\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_MasksToPixelFormatEnum(\n\t\t\tint bpp,\n\t\t\tuint Rmask,\n\t\t\tuint Gmask,\n\t\t\tuint Bmask,\n\t\t\tuint Amask\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_PixelFormatEnumToMasks(\n\t\t\tuint format,\n\t\t\tout int bpp,\n\t\t\tout uint Rmask,\n\t\t\tout uint Gmask,\n\t\t\tout uint Bmask,\n\t\t\tout uint Amask\n\t\t);\n\n\t\t/* palette refers to an SDL_Palette* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetPaletteColors(\n\t\t\tIntPtr palette,\n\t\t\t[In] SDL_Color[] colors,\n\t\t\tint firstcolor,\n\t\t\tint ncolors\n\t\t);\n\n\t\t/* format and palette refer to an SDL_PixelFormat* and SDL_Palette* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetPixelFormatPalette(\n\t\t\tIntPtr format,\n\t\t\tIntPtr palette\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_rect.h\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_Point\n\t\t{\n\t\t\tpublic int x;\n\t\t\tpublic int y;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_Rect\n\t\t{\n\t\t\tpublic int x;\n\t\t\tpublic int y;\n\t\t\tpublic int w;\n\t\t\tpublic int h;\n\t\t}\n\n\t\t/* Only available in 2.0.10 or higher. */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_FPoint\n\t\t{\n\t\t\tpublic float x;\n\t\t\tpublic float y;\n\t\t}\n\n\t\t/* Only available in 2.0.10 or higher. */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_FRect\n\t\t{\n\t\t\tpublic float x;\n\t\t\tpublic float y;\n\t\t\tpublic float w;\n\t\t\tpublic float h;\n\t\t}\n\n\t\t/* Only available in 2.0.4 or higher. */\n\t\tpublic static SDL_bool SDL_PointInRect(ref SDL_Point p, ref SDL_Rect r)\n\t\t{\n\t\t\treturn (\t(p.x >= r.x) &&\n\t\t\t\t\t(p.x < (r.x + r.w)) &&\n\t\t\t\t\t(p.y >= r.y) &&\n\t\t\t\t\t(p.y < (r.y + r.h))\t) ?\n\t\t\t\tSDL_bool.SDL_TRUE :\n\t\t\t\tSDL_bool.SDL_FALSE;\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_EnclosePoints(\n\t\t\t[In] SDL_Point[] points,\n\t\t\tint count,\n\t\t\tref SDL_Rect clip,\n\t\t\tout SDL_Rect result\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasIntersection(\n\t\t\tref SDL_Rect A,\n\t\t\tref SDL_Rect B\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IntersectRect(\n\t\t\tref SDL_Rect A,\n\t\t\tref SDL_Rect B,\n\t\t\tout SDL_Rect result\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IntersectRectAndLine(\n\t\t\tref SDL_Rect rect,\n\t\t\tref int X1,\n\t\t\tref int Y1,\n\t\t\tref int X2,\n\t\t\tref int Y2\n\t\t);\n\n\t\tpublic static SDL_bool SDL_RectEmpty(ref SDL_Rect r)\n\t\t{\n\t\t\treturn ((r.w <= 0) || (r.h <= 0)) ?\n\t\t\t\tSDL_bool.SDL_TRUE :\n\t\t\t\tSDL_bool.SDL_FALSE;\n\t\t}\n\n\t\tpublic static SDL_bool SDL_RectEquals(\n\t\t\tref SDL_Rect a,\n\t\t\tref SDL_Rect b\n\t\t) {\n\t\t\treturn (\t(a.x == b.x) &&\n\t\t\t\t\t(a.y == b.y) &&\n\t\t\t\t\t(a.w == b.w) &&\n\t\t\t\t\t(a.h == b.h)\t) ?\n\t\t\t\tSDL_bool.SDL_TRUE :\n\t\t\t\tSDL_bool.SDL_FALSE;\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_UnionRect(\n\t\t\tref SDL_Rect A,\n\t\t\tref SDL_Rect B,\n\t\t\tout SDL_Rect result\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_shape.h\n\n\t\tpublic const int SDL_NONSHAPEABLE_WINDOW = -1;\n\t\tpublic const int SDL_INVALID_SHAPE_ARGUMENT = -2;\n\t\tpublic const int SDL_WINDOW_LACKS_SHAPE = -3;\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_CreateShapedWindow\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static unsafe extern IntPtr INTERNAL_SDL_CreateShapedWindow(\n\t\t\tbyte* title,\n\t\t\tuint x,\n\t\t\tuint y,\n\t\t\tuint w,\n\t\t\tuint h,\n\t\t\tSDL_WindowFlags flags\n\t\t);\n\n\t\tpublic static unsafe IntPtr SDL_CreateShapedWindow(string title, uint x, uint y, uint w, uint h, SDL_WindowFlags flags)\n\t\t{\n\t\t\tbyte* utf8Title = Utf8EncodeHeap(title);\n\t\t\tIntPtr result = INTERNAL_SDL_CreateShapedWindow(utf8Title, x, y, w, h, flags);\n\t\t\tMarshal.FreeHGlobal((IntPtr)utf8Title);\n\t\t\treturn result;\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_IsShapedWindow\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IsShapedWindow(IntPtr window);\n\n\t\tpublic enum WindowShapeMode\n\t\t{\n\t\t\tShapeModeDefault,\n\t\t\tShapeModeBinarizeAlpha,\n\t\t\tShapeModeReverseBinarizeAlpha,\n\t\t\tShapeModeColorKey\n\t\t}\n\n\t\tpublic static bool SDL_SHAPEMODEALPHA(WindowShapeMode mode)\n\t\t{\n\t\t\tswitch (mode)\n\t\t\t{\n\t\t\t\tcase WindowShapeMode.ShapeModeDefault:\n\t\t\t\tcase WindowShapeMode.ShapeModeBinarizeAlpha:\n\t\t\t\tcase WindowShapeMode.ShapeModeReverseBinarizeAlpha:\n\t\t\t\t\treturn true;\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Explicit)]\n\t\tpublic struct SDL_WindowShapeParams\n\t\t{\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic byte binarizationCutoff;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_Color colorKey;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_WindowShapeMode\n\t\t{\n\t\t\tpublic WindowShapeMode mode;\n\t\t\tpublic SDL_WindowShapeParams parameters;\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_SetWindowShape\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetWindowShape(\n\t\t\tIntPtr window,\n\t\t\tIntPtr shape,\n\t\t\tref SDL_WindowShapeMode shape_mode\n\t\t);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetShapedWindowMode\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetShapedWindowMode(\n\t\t\tIntPtr window,\n\t\t\tout SDL_WindowShapeMode shape_mode\n\t\t);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetShapedWindowMode\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetShapedWindowMode(\n\t\t\tIntPtr window,\n\t\t\tIntPtr shape_mode\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_surface.h\n\n\t\tpublic const uint SDL_SWSURFACE =\t0x00000000;\n\t\tpublic const uint SDL_PREALLOC =\t0x00000001;\n\t\tpublic const uint SDL_RLEACCEL =\t0x00000002;\n\t\tpublic const uint SDL_DONTFREE =\t0x00000004;\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_Surface\n\t\t{\n\t\t\tpublic uint flags;\n\t\t\tpublic IntPtr format; // SDL_PixelFormat*\n\t\t\tpublic int w;\n\t\t\tpublic int h;\n\t\t\tpublic int pitch;\n\t\t\tpublic IntPtr pixels; // void*\n\t\t\tpublic IntPtr userdata; // void*\n\t\t\tpublic int locked;\n\t\t\tpublic IntPtr list_blitmap; // void*\n\t\t\tpublic SDL_Rect clip_rect;\n\t\t\tpublic IntPtr map; // SDL_BlitMap*\n\t\t\tpublic int refcount;\n\t\t}\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\tpublic static bool SDL_MUSTLOCK(IntPtr surface)\n\t\t{\n\t\t\tSDL_Surface sur;\n\t\t\tsur = PtrToStructure<SDL_Surface>(\n\t\t\t\tsurface\n\t\t\t);\n\t\t\treturn (sur.flags & SDL_RLEACCEL) != 0;\n\t\t}\n\n\t\t/* src and dst refer to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_UpperBlit\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_BlitSurface(\n\t\t\tIntPtr src,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dst,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* src and dst refer to an SDL_Surface*\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for srcrect.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_UpperBlit\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_BlitSurface(\n\t\t\tIntPtr src,\n\t\t\tIntPtr srcrect,\n\t\t\tIntPtr dst,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* src and dst refer to an SDL_Surface*\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for dstrect.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_UpperBlit\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_BlitSurface(\n\t\t\tIntPtr src,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dst,\n\t\t\tIntPtr dstrect\n\t\t);\n\n\t\t/* src and dst refer to an SDL_Surface*\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for both SDL_Rects.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_UpperBlit\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_BlitSurface(\n\t\t\tIntPtr src,\n\t\t\tIntPtr srcrect,\n\t\t\tIntPtr dst,\n\t\t\tIntPtr dstrect\n\t\t);\n\n\t\t/* src and dst refer to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_UpperBlitScaled\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_BlitScaled(\n\t\t\tIntPtr src,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dst,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* src and dst refer to an SDL_Surface*\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for srcrect.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_UpperBlitScaled\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_BlitScaled(\n\t\t\tIntPtr src,\n\t\t\tIntPtr srcrect,\n\t\t\tIntPtr dst,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* src and dst refer to an SDL_Surface*\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for dstrect.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_UpperBlitScaled\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_BlitScaled(\n\t\t\tIntPtr src,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dst,\n\t\t\tIntPtr dstrect\n\t\t);\n\n\t\t/* src and dst refer to an SDL_Surface*\n\t\t * Internally, this function contains logic to use default values when\n\t\t * source and destination rectangles are passed as NULL.\n\t\t * This overload allows for IntPtr.Zero (null) to be passed for both SDL_Rects.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_UpperBlitScaled\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_BlitScaled(\n\t\t\tIntPtr src,\n\t\t\tIntPtr srcrect,\n\t\t\tIntPtr dst,\n\t\t\tIntPtr dstrect\n\t\t);\n\n\t\t/* src and dst are void* pointers */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_ConvertPixels(\n\t\t\tint width,\n\t\t\tint height,\n\t\t\tuint src_format,\n\t\t\tIntPtr src,\n\t\t\tint src_pitch,\n\t\t\tuint dst_format,\n\t\t\tIntPtr dst,\n\t\t\tint dst_pitch\n\t\t);\n\n\t\t/* src and dst are void* pointers\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_PremultiplyAlpha(\n\t\t\tint width,\n\t\t\tint height,\n\t\t\tuint src_format,\n\t\t\tIntPtr src,\n\t\t\tint src_pitch,\n\t\t\tuint dst_format,\n\t\t\tIntPtr dst,\n\t\t\tint dst_pitch\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Surface*\n\t\t * src refers to an SDL_Surface*\n\t\t * fmt refers to an SDL_PixelFormat*\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_ConvertSurface(\n\t\t\tIntPtr src,\n\t\t\tIntPtr fmt,\n\t\t\tuint flags\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Surface*, src to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_ConvertSurfaceFormat(\n\t\t\tIntPtr src,\n\t\t\tuint pixel_format,\n\t\t\tuint flags\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateRGBSurface(\n\t\t\tuint flags,\n\t\t\tint width,\n\t\t\tint height,\n\t\t\tint depth,\n\t\t\tuint Rmask,\n\t\t\tuint Gmask,\n\t\t\tuint Bmask,\n\t\t\tuint Amask\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Surface*, pixels to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateRGBSurfaceFrom(\n\t\t\tIntPtr pixels,\n\t\t\tint width,\n\t\t\tint height,\n\t\t\tint depth,\n\t\t\tint pitch,\n\t\t\tuint Rmask,\n\t\t\tuint Gmask,\n\t\t\tuint Bmask,\n\t\t\tuint Amask\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Surface*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateRGBSurfaceWithFormat(\n\t\t\tuint flags,\n\t\t\tint width,\n\t\t\tint height,\n\t\t\tint depth,\n\t\t\tuint format\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Surface*, pixels to a void*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateRGBSurfaceWithFormatFrom(\n\t\t\tIntPtr pixels,\n\t\t\tint width,\n\t\t\tint height,\n\t\t\tint depth,\n\t\t\tint pitch,\n\t\t\tuint format\n\t\t);\n\n\t\t/* dst refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_FillRect(\n\t\t\tIntPtr dst,\n\t\t\tref SDL_Rect rect,\n\t\t\tuint color\n\t\t);\n\n\t\t/* dst refers to an SDL_Surface*.\n\t\t * This overload allows passing NULL to rect.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_FillRect(\n\t\t\tIntPtr dst,\n\t\t\tIntPtr rect,\n\t\t\tuint color\n\t\t);\n\n\t\t/* dst refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_FillRects(\n\t\t\tIntPtr dst,\n\t\t\t[In] SDL_Rect[] rects,\n\t\t\tint count,\n\t\t\tuint color\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_FreeSurface(IntPtr surface);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GetClipRect(\n\t\t\tIntPtr surface,\n\t\t\tout SDL_Rect rect\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface*.\n\t\t * Only available in 2.0.9 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasColorKey(IntPtr surface);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetColorKey(\n\t\t\tIntPtr surface,\n\t\t\tout uint key\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetSurfaceAlphaMod(\n\t\t\tIntPtr surface,\n\t\t\tout byte alpha\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetSurfaceBlendMode(\n\t\t\tIntPtr surface,\n\t\t\tout SDL_BlendMode blendMode\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetSurfaceColorMod(\n\t\t\tIntPtr surface,\n\t\t\tout byte r,\n\t\t\tout byte g,\n\t\t\tout byte b\n\t\t);\n\n\t\t/* These are for SDL_LoadBMP, which is a macro in the SDL headers. */\n\t\t/* IntPtr refers to an SDL_Surface* */\n\t\t/* THIS IS AN RWops FUNCTION! */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_LoadBMP_RW(\n\t\t\tIntPtr src,\n\t\t\tint freesrc\n\t\t);\n\t\tpublic static IntPtr SDL_LoadBMP(string file)\n\t\t{\n\t\t\tIntPtr rwops = SDL_RWFromFile(file, \"rb\");\n\t\t\treturn SDL_LoadBMP_RW(rwops, 1);\n\t\t}\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_LockSurface(IntPtr surface);\n\n\t\t/* src and dst refer to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_LowerBlit(\n\t\t\tIntPtr src,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dst,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* src and dst refer to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_LowerBlitScaled(\n\t\t\tIntPtr src,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dst,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* These are for SDL_SaveBMP, which is a macro in the SDL headers. */\n\t\t/* IntPtr refers to an SDL_Surface* */\n\t\t/* THIS IS AN RWops FUNCTION! */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SaveBMP_RW(\n\t\t\tIntPtr surface,\n\t\t\tIntPtr src,\n\t\t\tint freesrc\n\t\t);\n\t\tpublic static int SDL_SaveBMP(IntPtr surface, string file)\n\t\t{\n\t\t\tIntPtr rwops = SDL_RWFromFile(file, \"wb\");\n\t\t\treturn SDL_SaveBMP_RW(surface, rwops, 1);\n\t\t}\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_SetClipRect(\n\t\t\tIntPtr surface,\n\t\t\tref SDL_Rect rect\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetColorKey(\n\t\t\tIntPtr surface,\n\t\t\tint flag,\n\t\t\tuint key\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetSurfaceAlphaMod(\n\t\t\tIntPtr surface,\n\t\t\tbyte alpha\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetSurfaceBlendMode(\n\t\t\tIntPtr surface,\n\t\t\tSDL_BlendMode blendMode\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetSurfaceColorMod(\n\t\t\tIntPtr surface,\n\t\t\tbyte r,\n\t\t\tbyte g,\n\t\t\tbyte b\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface*, palette to an SDL_Palette* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetSurfacePalette(\n\t\t\tIntPtr surface,\n\t\t\tIntPtr palette\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetSurfaceRLE(\n\t\t\tIntPtr surface,\n\t\t\tint flag\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasSurfaceRLE(\n\t\t\tIntPtr surface\n\t\t);\n\n\t\t/* src and dst refer to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SoftStretch(\n\t\t\tIntPtr src,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dst,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* src and dst refer to an SDL_Surface*\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SoftStretchLinear(\n\t\t\tIntPtr src,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dst,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* surface refers to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_UnlockSurface(IntPtr surface);\n\n\t\t/* src and dst refer to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_UpperBlit(\n\t\t\tIntPtr src,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dst,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* src and dst refer to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_UpperBlitScaled(\n\t\t\tIntPtr src,\n\t\t\tref SDL_Rect srcrect,\n\t\t\tIntPtr dst,\n\t\t\tref SDL_Rect dstrect\n\t\t);\n\n\t\t/* surface and IntPtr refer to an SDL_Surface* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_DuplicateSurface(IntPtr surface);\n\n\t\t#endregion\n\n\t\t#region SDL_clipboard.h\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasClipboardText();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetClipboardText\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetClipboardText();\n\t\tpublic static string SDL_GetClipboardText()\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_GetClipboardText(), true);\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_SetClipboardText\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe int INTERNAL_SDL_SetClipboardText(\n\t\t\tbyte* text\n\t\t);\n\t\tpublic static unsafe int SDL_SetClipboardText(\n\t\t\tstring text\n\t\t) {\n\t\t\tbyte* utf8Text = Utf8EncodeHeap(text);\n\t\t\tint result = INTERNAL_SDL_SetClipboardText(\n\t\t\t\tutf8Text\n\t\t\t);\n\t\t\tMarshal.FreeHGlobal((IntPtr) utf8Text);\n\t\t\treturn result;\n\t\t}\n\n\t\t#endregion\n\n\t\t#region SDL_events.h\n\n\t\t/* General keyboard/mouse state definitions. */\n\t\tpublic const byte SDL_PRESSED =\t\t1;\n\t\tpublic const byte SDL_RELEASED =\t0;\n\n\t\t/* Default size is according to SDL2 default. */\n\t\tpublic const int SDL_TEXTEDITINGEVENT_TEXT_SIZE = 32;\n\t\tpublic const int SDL_TEXTINPUTEVENT_TEXT_SIZE = 32;\n\n\t\t/* The types of events that can be delivered. */\n\t\tpublic enum SDL_EventType : uint\n\t\t{\n\t\t\tSDL_FIRSTEVENT =\t\t0,\n\n\t\t\t/* Application events */\n\t\t\tSDL_QUIT = \t\t\t0x100,\n\n\t\t\t/* iOS/Android/WinRT app events */\n\t\t\tSDL_APP_TERMINATING,\n\t\t\tSDL_APP_LOWMEMORY,\n\t\t\tSDL_APP_WILLENTERBACKGROUND,\n\t\t\tSDL_APP_DIDENTERBACKGROUND,\n\t\t\tSDL_APP_WILLENTERFOREGROUND,\n\t\t\tSDL_APP_DIDENTERFOREGROUND,\n\n\t\t\t/* Only available in SDL 2.0.14 or higher. */\n\t\t\tSDL_LOCALECHANGED,\n\n\t\t\t/* Display events */\n\t\t\t/* Only available in SDL 2.0.9 or higher. */\n\t\t\tSDL_DISPLAYEVENT =\t\t0x150,\n\n\t\t\t/* Window events */\n\t\t\tSDL_WINDOWEVENT = \t\t0x200,\n\t\t\tSDL_SYSWMEVENT,\n\n\t\t\t/* Keyboard events */\n\t\t\tSDL_KEYDOWN = \t\t\t0x300,\n\t\t\tSDL_KEYUP,\n\t\t\tSDL_TEXTEDITING,\n\t\t\tSDL_TEXTINPUT,\n\t\t\tSDL_KEYMAPCHANGED,\n\t\t\tSDL_TEXTEDITING_EXT,\n\n\t\t\t/* Mouse events */\n\t\t\tSDL_MOUSEMOTION = \t\t0x400,\n\t\t\tSDL_MOUSEBUTTONDOWN,\n\t\t\tSDL_MOUSEBUTTONUP,\n\t\t\tSDL_MOUSEWHEEL,\n\n\t\t\t/* Joystick events */\n\t\t\tSDL_JOYAXISMOTION =\t\t0x600,\n\t\t\tSDL_JOYBALLMOTION,\n\t\t\tSDL_JOYHATMOTION,\n\t\t\tSDL_JOYBUTTONDOWN,\n\t\t\tSDL_JOYBUTTONUP,\n\t\t\tSDL_JOYDEVICEADDED,\n\t\t\tSDL_JOYDEVICEREMOVED,\n\n\t\t\t/* Game controller events */\n\t\t\tSDL_CONTROLLERAXISMOTION = \t0x650,\n\t\t\tSDL_CONTROLLERBUTTONDOWN,\n\t\t\tSDL_CONTROLLERBUTTONUP,\n\t\t\tSDL_CONTROLLERDEVICEADDED,\n\t\t\tSDL_CONTROLLERDEVICEREMOVED,\n\t\t\tSDL_CONTROLLERDEVICEREMAPPED,\n\t\t\tSDL_CONTROLLERTOUCHPADDOWN,\t/* Requires >= 2.0.14 */\n\t\t\tSDL_CONTROLLERTOUCHPADMOTION,\t/* Requires >= 2.0.14 */\n\t\t\tSDL_CONTROLLERTOUCHPADUP,\t/* Requires >= 2.0.14 */\n\t\t\tSDL_CONTROLLERSENSORUPDATE,\t/* Requires >= 2.0.14 */\n\n\t\t\t/* Touch events */\n\t\t\tSDL_FINGERDOWN = \t\t0x700,\n\t\t\tSDL_FINGERUP,\n\t\t\tSDL_FINGERMOTION,\n\n\t\t\t/* Gesture events */\n\t\t\tSDL_DOLLARGESTURE =\t\t0x800,\n\t\t\tSDL_DOLLARRECORD,\n\t\t\tSDL_MULTIGESTURE,\n\n\t\t\t/* Clipboard events */\n\t\t\tSDL_CLIPBOARDUPDATE =\t\t0x900,\n\n\t\t\t/* Drag and drop events */\n\t\t\tSDL_DROPFILE =\t\t\t0x1000,\n\t\t\t/* Only available in 2.0.4 or higher. */\n\t\t\tSDL_DROPTEXT,\n\t\t\tSDL_DROPBEGIN,\n\t\t\tSDL_DROPCOMPLETE,\n\n\t\t\t/* Audio hotplug events */\n\t\t\t/* Only available in SDL 2.0.4 or higher. */\n\t\t\tSDL_AUDIODEVICEADDED =\t\t0x1100,\n\t\t\tSDL_AUDIODEVICEREMOVED,\n\n\t\t\t/* Sensor events */\n\t\t\t/* Only available in SDL 2.0.9 or higher. */\n\t\t\tSDL_SENSORUPDATE =\t\t0x1200,\n\n\t\t\t/* Render events */\n\t\t\t/* Only available in SDL 2.0.2 or higher. */\n\t\t\tSDL_RENDER_TARGETS_RESET =\t0x2000,\n\t\t\t/* Only available in SDL 2.0.4 or higher. */\n\t\t\tSDL_RENDER_DEVICE_RESET,\n\n\t\t\t/* Internal events */\n\t\t\t/* Only available in 2.0.18 or higher. */\n\t\t\tSDL_POLLSENTINEL =\t\t0x7F00,\n\n\t\t\t/* Events SDL_USEREVENT through SDL_LASTEVENT are for\n\t\t\t * your use, and should be allocated with\n\t\t\t * SDL_RegisterEvents()\n\t\t\t */\n\t\t\tSDL_USEREVENT =\t\t\t0x8000,\n\n\t\t\t/* The last event, used for bouding arrays. */\n\t\t\tSDL_LASTEVENT =\t\t\t0xFFFF\n\t\t}\n\n\t\t/* Only available in 2.0.4 or higher. */\n\t\tpublic enum SDL_MouseWheelDirection : uint\n\t\t{\n\t\t\tSDL_MOUSEWHEEL_NORMAL,\n\t\t\tSDL_MOUSEWHEEL_FLIPPED\n\t\t}\n\n\t\t/* Fields shared by every event */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_GenericEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t}\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_DisplayEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic UInt32 display;\n\t\t\tpublic SDL_DisplayEventID displayEvent; // event, lolC#\n\t\t\tprivate byte padding1;\n\t\t\tprivate byte padding2;\n\t\t\tprivate byte padding3;\n\t\t\tpublic Int32 data1;\n\t\t}\n#pragma warning restore 0169\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t/* Window state change event data (event.window.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_WindowEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic UInt32 windowID;\n\t\t\tpublic SDL_WindowEventID windowEvent; // event, lolC#\n\t\t\tprivate byte padding1;\n\t\t\tprivate byte padding2;\n\t\t\tprivate byte padding3;\n\t\t\tpublic Int32 data1;\n\t\t\tpublic Int32 data2;\n\t\t}\n#pragma warning restore 0169\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t/* Keyboard button event structure (event.key.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_KeyboardEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic UInt32 windowID;\n\t\t\tpublic byte state;\n\t\t\tpublic byte repeat; /* non-zero if this is a repeat */\n\t\t\tprivate byte padding2;\n\t\t\tprivate byte padding3;\n\t\t\tpublic SDL_Keysym keysym;\n\t\t}\n#pragma warning restore 0169\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic unsafe struct SDL_TextEditingEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic UInt32 windowID;\n\t\t\tpublic fixed byte text[SDL_TEXTEDITINGEVENT_TEXT_SIZE];\n\t\t\tpublic Int32 start;\n\t\t\tpublic Int32 length;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic unsafe struct SDL_TextEditingExtEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic UInt32 windowID;\n\t\t\tpublic IntPtr text; /* char*, free with SDL_free */\n\t\t\tpublic Int32 start;\n\t\t\tpublic Int32 length;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic unsafe struct SDL_TextInputEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic UInt32 windowID;\n\t\t\tpublic fixed byte text[SDL_TEXTINPUTEVENT_TEXT_SIZE];\n\t\t}\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t/* Mouse motion event structure (event.motion.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_MouseMotionEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic UInt32 windowID;\n\t\t\tpublic UInt32 which;\n\t\t\tpublic byte state; /* bitmask of buttons */\n\t\t\tprivate byte padding1;\n\t\t\tprivate byte padding2;\n\t\t\tprivate byte padding3;\n\t\t\tpublic Int32 x;\n\t\t\tpublic Int32 y;\n\t\t\tpublic Int32 xrel;\n\t\t\tpublic Int32 yrel;\n\t\t}\n#pragma warning restore 0169\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t/* Mouse button event structure (event.button.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_MouseButtonEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic UInt32 windowID;\n\t\t\tpublic UInt32 which;\n\t\t\tpublic byte button; /* button id */\n\t\t\tpublic byte state; /* SDL_PRESSED or SDL_RELEASED */\n\t\t\tpublic byte clicks; /* 1 for single-click, 2 for double-click, etc. */\n\t\t\tprivate byte padding1;\n\t\t\tpublic Int32 x;\n\t\t\tpublic Int32 y;\n\t\t}\n#pragma warning restore 0169\n\n\t\t/* Mouse wheel event structure (event.wheel.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_MouseWheelEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic UInt32 windowID;\n\t\t\tpublic UInt32 which;\n\t\t\tpublic Int32 x; /* amount scrolled horizontally */\n\t\t\tpublic Int32 y; /* amount scrolled vertically */\n\t\t\tpublic UInt32 direction; /* Set to one of the SDL_MOUSEWHEEL_* defines */\n\t\t\tpublic float preciseX; /* Requires >= 2.0.18 */\n\t\t\tpublic float preciseY; /* Requires >= 2.0.18 */\n\t\t}\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t/* Joystick axis motion event structure (event.jaxis.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_JoyAxisEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int32 which; /* SDL_JoystickID */\n\t\t\tpublic byte axis;\n\t\t\tprivate byte padding1;\n\t\t\tprivate byte padding2;\n\t\t\tprivate byte padding3;\n\t\t\tpublic Int16 axisValue; /* value, lolC# */\n\t\t\tpublic UInt16 padding4;\n\t\t}\n#pragma warning restore 0169\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t/* Joystick trackball motion event structure (event.jball.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_JoyBallEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int32 which; /* SDL_JoystickID */\n\t\t\tpublic byte ball;\n\t\t\tprivate byte padding1;\n\t\t\tprivate byte padding2;\n\t\t\tprivate byte padding3;\n\t\t\tpublic Int16 xrel;\n\t\t\tpublic Int16 yrel;\n\t\t}\n#pragma warning restore 0169\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t/* Joystick hat position change event struct (event.jhat.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_JoyHatEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int32 which; /* SDL_JoystickID */\n\t\t\tpublic byte hat; /* index of the hat */\n\t\t\tpublic byte hatValue; /* value, lolC# */\n\t\t\tprivate byte padding1;\n\t\t\tprivate byte padding2;\n\t\t}\n#pragma warning restore 0169\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t/* Joystick button event structure (event.jbutton.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_JoyButtonEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int32 which; /* SDL_JoystickID */\n\t\t\tpublic byte button;\n\t\t\tpublic byte state; /* SDL_PRESSED or SDL_RELEASED */\n\t\t\tprivate byte padding1;\n\t\t\tprivate byte padding2;\n\t\t}\n#pragma warning restore 0169\n\n\t\t/* Joystick device event structure (event.jdevice.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_JoyDeviceEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int32 which; /* SDL_JoystickID */\n\t\t}\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t/* Game controller axis motion event (event.caxis.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_ControllerAxisEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int32 which; /* SDL_JoystickID */\n\t\t\tpublic byte axis;\n\t\t\tprivate byte padding1;\n\t\t\tprivate byte padding2;\n\t\t\tprivate byte padding3;\n\t\t\tpublic Int16 axisValue; /* value, lolC# */\n\t\t\tprivate UInt16 padding4;\n\t\t}\n#pragma warning restore 0169\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t/* Game controller button event (event.cbutton.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_ControllerButtonEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int32 which; /* SDL_JoystickID */\n\t\t\tpublic byte button;\n\t\t\tpublic byte state;\n\t\t\tprivate byte padding1;\n\t\t\tprivate byte padding2;\n\t\t}\n#pragma warning restore 0169\n\n\t\t/* Game controller device event (event.cdevice.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_ControllerDeviceEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int32 which;\t/* joystick id for ADDED,\n\t\t\t\t\t\t * else instance id\n\t\t\t\t\t\t */\n\t\t}\n\n\t\t/* Game controller touchpad event structure (event.ctouchpad.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_ControllerTouchpadEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int32 which; /* SDL_JoystickID */\n\t\t\tpublic Int32 touchpad;\n\t\t\tpublic Int32 finger;\n\t\t\tpublic float x;\n\t\t\tpublic float y;\n\t\t\tpublic float pressure;\n\t\t}\n\n\t\t/* Game controller sensor event structure (event.csensor.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_ControllerSensorEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int32 which; /* SDL_JoystickID */\n\t\t\tpublic Int32 sensor;\n\t\t\tpublic float data1;\n\t\t\tpublic float data2;\n\t\t\tpublic float data3;\n\t\t}\n\n// Ignore private members used for padding in this struct\n#pragma warning disable 0169\n\t\t/* Audio device event (event.adevice.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_AudioDeviceEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic UInt32 which;\n\t\t\tpublic byte iscapture;\n\t\t\tprivate byte padding1;\n\t\t\tprivate byte padding2;\n\t\t\tprivate byte padding3;\n\t\t}\n#pragma warning restore 0169\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_TouchFingerEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int64 touchId; // SDL_TouchID\n\t\t\tpublic Int64 fingerId; // SDL_GestureID\n\t\t\tpublic float x;\n\t\t\tpublic float y;\n\t\t\tpublic float dx;\n\t\t\tpublic float dy;\n\t\t\tpublic float pressure;\n\t\t\tpublic uint windowID;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_MultiGestureEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int64 touchId; // SDL_TouchID\n\t\t\tpublic float dTheta;\n\t\t\tpublic float dDist;\n\t\t\tpublic float x;\n\t\t\tpublic float y;\n\t\t\tpublic UInt16 numFingers;\n\t\t\tpublic UInt16 padding;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_DollarGestureEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int64 touchId; // SDL_TouchID\n\t\t\tpublic Int64 gestureId; // SDL_GestureID\n\t\t\tpublic UInt32 numFingers;\n\t\t\tpublic float error;\n\t\t\tpublic float x;\n\t\t\tpublic float y;\n\t\t}\n\n\t\t/* File open request by system (event.drop.*), enabled by\n\t\t * default\n\t\t */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_DropEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\n\t\t\t/* char* filename, to be freed.\n\t\t\t * Access the variable EXACTLY ONCE like this:\n\t\t\t * string s = SDL.UTF8_ToManaged(evt.drop.file, true);\n\t\t\t */\n\t\t\tpublic IntPtr file;\n\t\t\tpublic UInt32 windowID;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic unsafe struct SDL_SensorEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic Int32 which;\n\t\t\tpublic fixed float data[6];\n\t\t}\n\n\t\t/* The \"quit requested\" event */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_QuitEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t}\n\n\t\t/* A user defined event (event.user.*) */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_UserEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic UInt32 windowID;\n\t\t\tpublic Int32 code;\n\t\t\tpublic IntPtr data1; /* user-defined */\n\t\t\tpublic IntPtr data2; /* user-defined */\n\t\t}\n\n\t\t/* A video driver dependent event (event.syswm.*), disabled */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_SysWMEvent\n\t\t{\n\t\t\tpublic SDL_EventType type;\n\t\t\tpublic UInt32 timestamp;\n\t\t\tpublic IntPtr msg; /* SDL_SysWMmsg*, system-dependent*/\n\t\t}\n\n\t\t/* General event structure */\n\t\t// C# doesn't do unions, so we do this ugly thing. */\n\t\t[StructLayout(LayoutKind.Explicit)]\n\t\tpublic unsafe struct SDL_Event\n\t\t{\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_EventType type;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_EventType typeFSharp;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_DisplayEvent display;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_WindowEvent window;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_KeyboardEvent key;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_TextEditingEvent edit;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_TextEditingExtEvent editExt;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_TextInputEvent text;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_MouseMotionEvent motion;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_MouseButtonEvent button;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_MouseWheelEvent wheel;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_JoyAxisEvent jaxis;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_JoyBallEvent jball;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_JoyHatEvent jhat;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_JoyButtonEvent jbutton;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_JoyDeviceEvent jdevice;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_ControllerAxisEvent caxis;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_ControllerButtonEvent cbutton;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_ControllerDeviceEvent cdevice;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_ControllerTouchpadEvent ctouchpad;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_ControllerSensorEvent csensor;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_AudioDeviceEvent adevice;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_SensorEvent sensor;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_QuitEvent quit;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_UserEvent user;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_SysWMEvent syswm;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_TouchFingerEvent tfinger;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_MultiGestureEvent mgesture;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_DollarGestureEvent dgesture;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_DropEvent drop;\n\t\t\t[FieldOffset(0)]\n\t\t\tprivate fixed byte padding[56];\n\t\t}\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate int SDL_EventFilter(\n\t\t\tIntPtr userdata, // void*\n\t\t\tIntPtr sdlevent // SDL_Event* event, lolC#\n\t\t);\n\n\t\t/* Pump the event loop, getting events from the input devices*/\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_PumpEvents();\n\n\t\tpublic enum SDL_eventaction\n\t\t{\n\t\t\tSDL_ADDEVENT,\n\t\t\tSDL_PEEKEVENT,\n\t\t\tSDL_GETEVENT\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_PeepEvents(\n\t\t\t[Out] SDL_Event[] events,\n\t\t\tint numevents,\n\t\t\tSDL_eventaction action,\n\t\t\tSDL_EventType minType,\n\t\t\tSDL_EventType maxType\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern unsafe int SDL_PeepEvents(\n\t\t\tSDL_Event* events,\n\t\t\tint numevents,\n\t\t\tSDL_eventaction action,\n\t\t\tSDL_EventType minType,\n\t\t\tSDL_EventType maxType\n\t\t);\n\n\t\t/* Checks to see if certain events are in the event queue */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasEvent(SDL_EventType type);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasEvents(\n\t\t\tSDL_EventType minType,\n\t\t\tSDL_EventType maxType\n\t\t);\n\n\t\t/* Clears events from the event queue */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_FlushEvent(SDL_EventType type);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_FlushEvents(\n\t\t\tSDL_EventType min,\n\t\t\tSDL_EventType max\n\t\t);\n\n\t\t/* Polls for currently pending events */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_PollEvent(out SDL_Event _event);\n\n\t\t/* Waits indefinitely for the next event */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_WaitEvent(out SDL_Event _event);\n\n\t\t/* Waits until the specified timeout (in ms) for the next event\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_WaitEventTimeout(out SDL_Event _event, int timeout);\n\n\t\t/* Add an event to the event queue */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_PushEvent(ref SDL_Event _event);\n\n\t\t/* userdata refers to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetEventFilter(\n\t\t\tSDL_EventFilter filter,\n\t\t\tIntPtr userdata\n\t\t);\n\n\t\t/* userdata refers to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern SDL_bool SDL_GetEventFilter(\n\t\t\tout IntPtr filter,\n\t\t\tout IntPtr userdata\n\t\t);\n\t\tpublic static SDL_bool SDL_GetEventFilter(\n\t\t\tout SDL_EventFilter filter,\n\t\t\tout IntPtr userdata\n\t\t) {\n\t\t\tIntPtr result = IntPtr.Zero;\n\t\t\tSDL_bool retval = SDL_GetEventFilter(out result, out userdata);\n\t\t\tif (result != IntPtr.Zero)\n\t\t\t{\n\t\t\t\tfilter = (SDL_EventFilter) GetDelegateForFunctionPointer<SDL_EventFilter>(\n\t\t\t\t\tresult\n\t\t\t\t);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfilter = null;\n\t\t\t}\n\t\t\treturn retval;\n\t\t}\n\n\t\t/* userdata refers to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_AddEventWatch(\n\t\t\tSDL_EventFilter filter,\n\t\t\tIntPtr userdata\n\t\t);\n\n\t\t/* userdata refers to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_DelEventWatch(\n\t\t\tSDL_EventFilter filter,\n\t\t\tIntPtr userdata\n\t\t);\n\n\t\t/* userdata refers to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_FilterEvents(\n\t\t\tSDL_EventFilter filter,\n\t\t\tIntPtr userdata\n\t\t);\n\n\t\t/* These are for SDL_EventState() */\n\t\tpublic const int SDL_QUERY = \t\t-1;\n\t\tpublic const int SDL_IGNORE = \t\t0;\n\t\tpublic const int SDL_DISABLE =\t\t0;\n\t\tpublic const int SDL_ENABLE = \t\t1;\n\n\t\t/* This function allows you to enable/disable certain events */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern byte SDL_EventState(SDL_EventType type, int state);\n\n\t\t/* Get the state of an event */\n\t\tpublic static byte SDL_GetEventState(SDL_EventType type)\n\t\t{\n\t\t\treturn SDL_EventState(type, SDL_QUERY);\n\t\t}\n\n\t\t/* Allocate a set of user-defined events */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_RegisterEvents(int numevents);\n\t\t#endregion\n\n\t\t#region SDL_scancode.h\n\n\t\t/* Scancodes based off USB keyboard page (0x07) */\n\t\tpublic enum SDL_Scancode\n\t\t{\n\t\t\tSDL_SCANCODE_UNKNOWN = 0,\n\n\t\t\tSDL_SCANCODE_A = 4,\n\t\t\tSDL_SCANCODE_B = 5,\n\t\t\tSDL_SCANCODE_C = 6,\n\t\t\tSDL_SCANCODE_D = 7,\n\t\t\tSDL_SCANCODE_E = 8,\n\t\t\tSDL_SCANCODE_F = 9,\n\t\t\tSDL_SCANCODE_G = 10,\n\t\t\tSDL_SCANCODE_H = 11,\n\t\t\tSDL_SCANCODE_I = 12,\n\t\t\tSDL_SCANCODE_J = 13,\n\t\t\tSDL_SCANCODE_K = 14,\n\t\t\tSDL_SCANCODE_L = 15,\n\t\t\tSDL_SCANCODE_M = 16,\n\t\t\tSDL_SCANCODE_N = 17,\n\t\t\tSDL_SCANCODE_O = 18,\n\t\t\tSDL_SCANCODE_P = 19,\n\t\t\tSDL_SCANCODE_Q = 20,\n\t\t\tSDL_SCANCODE_R = 21,\n\t\t\tSDL_SCANCODE_S = 22,\n\t\t\tSDL_SCANCODE_T = 23,\n\t\t\tSDL_SCANCODE_U = 24,\n\t\t\tSDL_SCANCODE_V = 25,\n\t\t\tSDL_SCANCODE_W = 26,\n\t\t\tSDL_SCANCODE_X = 27,\n\t\t\tSDL_SCANCODE_Y = 28,\n\t\t\tSDL_SCANCODE_Z = 29,\n\n\t\t\tSDL_SCANCODE_1 = 30,\n\t\t\tSDL_SCANCODE_2 = 31,\n\t\t\tSDL_SCANCODE_3 = 32,\n\t\t\tSDL_SCANCODE_4 = 33,\n\t\t\tSDL_SCANCODE_5 = 34,\n\t\t\tSDL_SCANCODE_6 = 35,\n\t\t\tSDL_SCANCODE_7 = 36,\n\t\t\tSDL_SCANCODE_8 = 37,\n\t\t\tSDL_SCANCODE_9 = 38,\n\t\t\tSDL_SCANCODE_0 = 39,\n\n\t\t\tSDL_SCANCODE_RETURN = 40,\n\t\t\tSDL_SCANCODE_ESCAPE = 41,\n\t\t\tSDL_SCANCODE_BACKSPACE = 42,\n\t\t\tSDL_SCANCODE_TAB = 43,\n\t\t\tSDL_SCANCODE_SPACE = 44,\n\n\t\t\tSDL_SCANCODE_MINUS = 45,\n\t\t\tSDL_SCANCODE_EQUALS = 46,\n\t\t\tSDL_SCANCODE_LEFTBRACKET = 47,\n\t\t\tSDL_SCANCODE_RIGHTBRACKET = 48,\n\t\t\tSDL_SCANCODE_BACKSLASH = 49,\n\t\t\tSDL_SCANCODE_NONUSHASH = 50,\n\t\t\tSDL_SCANCODE_SEMICOLON = 51,\n\t\t\tSDL_SCANCODE_APOSTROPHE = 52,\n\t\t\tSDL_SCANCODE_GRAVE = 53,\n\t\t\tSDL_SCANCODE_COMMA = 54,\n\t\t\tSDL_SCANCODE_PERIOD = 55,\n\t\t\tSDL_SCANCODE_SLASH = 56,\n\n\t\t\tSDL_SCANCODE_CAPSLOCK = 57,\n\n\t\t\tSDL_SCANCODE_F1 = 58,\n\t\t\tSDL_SCANCODE_F2 = 59,\n\t\t\tSDL_SCANCODE_F3 = 60,\n\t\t\tSDL_SCANCODE_F4 = 61,\n\t\t\tSDL_SCANCODE_F5 = 62,\n\t\t\tSDL_SCANCODE_F6 = 63,\n\t\t\tSDL_SCANCODE_F7 = 64,\n\t\t\tSDL_SCANCODE_F8 = 65,\n\t\t\tSDL_SCANCODE_F9 = 66,\n\t\t\tSDL_SCANCODE_F10 = 67,\n\t\t\tSDL_SCANCODE_F11 = 68,\n\t\t\tSDL_SCANCODE_F12 = 69,\n\n\t\t\tSDL_SCANCODE_PRINTSCREEN = 70,\n\t\t\tSDL_SCANCODE_SCROLLLOCK = 71,\n\t\t\tSDL_SCANCODE_PAUSE = 72,\n\t\t\tSDL_SCANCODE_INSERT = 73,\n\t\t\tSDL_SCANCODE_HOME = 74,\n\t\t\tSDL_SCANCODE_PAGEUP = 75,\n\t\t\tSDL_SCANCODE_DELETE = 76,\n\t\t\tSDL_SCANCODE_END = 77,\n\t\t\tSDL_SCANCODE_PAGEDOWN = 78,\n\t\t\tSDL_SCANCODE_RIGHT = 79,\n\t\t\tSDL_SCANCODE_LEFT = 80,\n\t\t\tSDL_SCANCODE_DOWN = 81,\n\t\t\tSDL_SCANCODE_UP = 82,\n\n\t\t\tSDL_SCANCODE_NUMLOCKCLEAR = 83,\n\t\t\tSDL_SCANCODE_KP_DIVIDE = 84,\n\t\t\tSDL_SCANCODE_KP_MULTIPLY = 85,\n\t\t\tSDL_SCANCODE_KP_MINUS = 86,\n\t\t\tSDL_SCANCODE_KP_PLUS = 87,\n\t\t\tSDL_SCANCODE_KP_ENTER = 88,\n\t\t\tSDL_SCANCODE_KP_1 = 89,\n\t\t\tSDL_SCANCODE_KP_2 = 90,\n\t\t\tSDL_SCANCODE_KP_3 = 91,\n\t\t\tSDL_SCANCODE_KP_4 = 92,\n\t\t\tSDL_SCANCODE_KP_5 = 93,\n\t\t\tSDL_SCANCODE_KP_6 = 94,\n\t\t\tSDL_SCANCODE_KP_7 = 95,\n\t\t\tSDL_SCANCODE_KP_8 = 96,\n\t\t\tSDL_SCANCODE_KP_9 = 97,\n\t\t\tSDL_SCANCODE_KP_0 = 98,\n\t\t\tSDL_SCANCODE_KP_PERIOD = 99,\n\n\t\t\tSDL_SCANCODE_NONUSBACKSLASH = 100,\n\t\t\tSDL_SCANCODE_APPLICATION = 101,\n\t\t\tSDL_SCANCODE_POWER = 102,\n\t\t\tSDL_SCANCODE_KP_EQUALS = 103,\n\t\t\tSDL_SCANCODE_F13 = 104,\n\t\t\tSDL_SCANCODE_F14 = 105,\n\t\t\tSDL_SCANCODE_F15 = 106,\n\t\t\tSDL_SCANCODE_F16 = 107,\n\t\t\tSDL_SCANCODE_F17 = 108,\n\t\t\tSDL_SCANCODE_F18 = 109,\n\t\t\tSDL_SCANCODE_F19 = 110,\n\t\t\tSDL_SCANCODE_F20 = 111,\n\t\t\tSDL_SCANCODE_F21 = 112,\n\t\t\tSDL_SCANCODE_F22 = 113,\n\t\t\tSDL_SCANCODE_F23 = 114,\n\t\t\tSDL_SCANCODE_F24 = 115,\n\t\t\tSDL_SCANCODE_EXECUTE = 116,\n\t\t\tSDL_SCANCODE_HELP = 117,\n\t\t\tSDL_SCANCODE_MENU = 118,\n\t\t\tSDL_SCANCODE_SELECT = 119,\n\t\t\tSDL_SCANCODE_STOP = 120,\n\t\t\tSDL_SCANCODE_AGAIN = 121,\n\t\t\tSDL_SCANCODE_UNDO = 122,\n\t\t\tSDL_SCANCODE_CUT = 123,\n\t\t\tSDL_SCANCODE_COPY = 124,\n\t\t\tSDL_SCANCODE_PASTE = 125,\n\t\t\tSDL_SCANCODE_FIND = 126,\n\t\t\tSDL_SCANCODE_MUTE = 127,\n\t\t\tSDL_SCANCODE_VOLUMEUP = 128,\n\t\t\tSDL_SCANCODE_VOLUMEDOWN = 129,\n\t\t\t/* not sure whether there's a reason to enable these */\n\t\t\t/*\tSDL_SCANCODE_LOCKINGCAPSLOCK = 130, */\n\t\t\t/*\tSDL_SCANCODE_LOCKINGNUMLOCK = 131, */\n\t\t\t/*\tSDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */\n\t\t\tSDL_SCANCODE_KP_COMMA = 133,\n\t\t\tSDL_SCANCODE_KP_EQUALSAS400 = 134,\n\n\t\t\tSDL_SCANCODE_INTERNATIONAL1 = 135,\n\t\t\tSDL_SCANCODE_INTERNATIONAL2 = 136,\n\t\t\tSDL_SCANCODE_INTERNATIONAL3 = 137,\n\t\t\tSDL_SCANCODE_INTERNATIONAL4 = 138,\n\t\t\tSDL_SCANCODE_INTERNATIONAL5 = 139,\n\t\t\tSDL_SCANCODE_INTERNATIONAL6 = 140,\n\t\t\tSDL_SCANCODE_INTERNATIONAL7 = 141,\n\t\t\tSDL_SCANCODE_INTERNATIONAL8 = 142,\n\t\t\tSDL_SCANCODE_INTERNATIONAL9 = 143,\n\t\t\tSDL_SCANCODE_LANG1 = 144,\n\t\t\tSDL_SCANCODE_LANG2 = 145,\n\t\t\tSDL_SCANCODE_LANG3 = 146,\n\t\t\tSDL_SCANCODE_LANG4 = 147,\n\t\t\tSDL_SCANCODE_LANG5 = 148,\n\t\t\tSDL_SCANCODE_LANG6 = 149,\n\t\t\tSDL_SCANCODE_LANG7 = 150,\n\t\t\tSDL_SCANCODE_LANG8 = 151,\n\t\t\tSDL_SCANCODE_LANG9 = 152,\n\n\t\t\tSDL_SCANCODE_ALTERASE = 153,\n\t\t\tSDL_SCANCODE_SYSREQ = 154,\n\t\t\tSDL_SCANCODE_CANCEL = 155,\n\t\t\tSDL_SCANCODE_CLEAR = 156,\n\t\t\tSDL_SCANCODE_PRIOR = 157,\n\t\t\tSDL_SCANCODE_RETURN2 = 158,\n\t\t\tSDL_SCANCODE_SEPARATOR = 159,\n\t\t\tSDL_SCANCODE_OUT = 160,\n\t\t\tSDL_SCANCODE_OPER = 161,\n\t\t\tSDL_SCANCODE_CLEARAGAIN = 162,\n\t\t\tSDL_SCANCODE_CRSEL = 163,\n\t\t\tSDL_SCANCODE_EXSEL = 164,\n\n\t\t\tSDL_SCANCODE_KP_00 = 176,\n\t\t\tSDL_SCANCODE_KP_000 = 177,\n\t\t\tSDL_SCANCODE_THOUSANDSSEPARATOR = 178,\n\t\t\tSDL_SCANCODE_DECIMALSEPARATOR = 179,\n\t\t\tSDL_SCANCODE_CURRENCYUNIT = 180,\n\t\t\tSDL_SCANCODE_CURRENCYSUBUNIT = 181,\n\t\t\tSDL_SCANCODE_KP_LEFTPAREN = 182,\n\t\t\tSDL_SCANCODE_KP_RIGHTPAREN = 183,\n\t\t\tSDL_SCANCODE_KP_LEFTBRACE = 184,\n\t\t\tSDL_SCANCODE_KP_RIGHTBRACE = 185,\n\t\t\tSDL_SCANCODE_KP_TAB = 186,\n\t\t\tSDL_SCANCODE_KP_BACKSPACE = 187,\n\t\t\tSDL_SCANCODE_KP_A = 188,\n\t\t\tSDL_SCANCODE_KP_B = 189,\n\t\t\tSDL_SCANCODE_KP_C = 190,\n\t\t\tSDL_SCANCODE_KP_D = 191,\n\t\t\tSDL_SCANCODE_KP_E = 192,\n\t\t\tSDL_SCANCODE_KP_F = 193,\n\t\t\tSDL_SCANCODE_KP_XOR = 194,\n\t\t\tSDL_SCANCODE_KP_POWER = 195,\n\t\t\tSDL_SCANCODE_KP_PERCENT = 196,\n\t\t\tSDL_SCANCODE_KP_LESS = 197,\n\t\t\tSDL_SCANCODE_KP_GREATER = 198,\n\t\t\tSDL_SCANCODE_KP_AMPERSAND = 199,\n\t\t\tSDL_SCANCODE_KP_DBLAMPERSAND = 200,\n\t\t\tSDL_SCANCODE_KP_VERTICALBAR = 201,\n\t\t\tSDL_SCANCODE_KP_DBLVERTICALBAR = 202,\n\t\t\tSDL_SCANCODE_KP_COLON = 203,\n\t\t\tSDL_SCANCODE_KP_HASH = 204,\n\t\t\tSDL_SCANCODE_KP_SPACE = 205,\n\t\t\tSDL_SCANCODE_KP_AT = 206,\n\t\t\tSDL_SCANCODE_KP_EXCLAM = 207,\n\t\t\tSDL_SCANCODE_KP_MEMSTORE = 208,\n\t\t\tSDL_SCANCODE_KP_MEMRECALL = 209,\n\t\t\tSDL_SCANCODE_KP_MEMCLEAR = 210,\n\t\t\tSDL_SCANCODE_KP_MEMADD = 211,\n\t\t\tSDL_SCANCODE_KP_MEMSUBTRACT = 212,\n\t\t\tSDL_SCANCODE_KP_MEMMULTIPLY = 213,\n\t\t\tSDL_SCANCODE_KP_MEMDIVIDE = 214,\n\t\t\tSDL_SCANCODE_KP_PLUSMINUS = 215,\n\t\t\tSDL_SCANCODE_KP_CLEAR = 216,\n\t\t\tSDL_SCANCODE_KP_CLEARENTRY = 217,\n\t\t\tSDL_SCANCODE_KP_BINARY = 218,\n\t\t\tSDL_SCANCODE_KP_OCTAL = 219,\n\t\t\tSDL_SCANCODE_KP_DECIMAL = 220,\n\t\t\tSDL_SCANCODE_KP_HEXADECIMAL = 221,\n\n\t\t\tSDL_SCANCODE_LCTRL = 224,\n\t\t\tSDL_SCANCODE_LSHIFT = 225,\n\t\t\tSDL_SCANCODE_LALT = 226,\n\t\t\tSDL_SCANCODE_LGUI = 227,\n\t\t\tSDL_SCANCODE_RCTRL = 228,\n\t\t\tSDL_SCANCODE_RSHIFT = 229,\n\t\t\tSDL_SCANCODE_RALT = 230,\n\t\t\tSDL_SCANCODE_RGUI = 231,\n\n\t\t\tSDL_SCANCODE_MODE = 257,\n\n\t\t\t/* These come from the USB consumer page (0x0C) */\n\t\t\tSDL_SCANCODE_AUDIONEXT = 258,\n\t\t\tSDL_SCANCODE_AUDIOPREV = 259,\n\t\t\tSDL_SCANCODE_AUDIOSTOP = 260,\n\t\t\tSDL_SCANCODE_AUDIOPLAY = 261,\n\t\t\tSDL_SCANCODE_AUDIOMUTE = 262,\n\t\t\tSDL_SCANCODE_MEDIASELECT = 263,\n\t\t\tSDL_SCANCODE_WWW = 264,\n\t\t\tSDL_SCANCODE_MAIL = 265,\n\t\t\tSDL_SCANCODE_CALCULATOR = 266,\n\t\t\tSDL_SCANCODE_COMPUTER = 267,\n\t\t\tSDL_SCANCODE_AC_SEARCH = 268,\n\t\t\tSDL_SCANCODE_AC_HOME = 269,\n\t\t\tSDL_SCANCODE_AC_BACK = 270,\n\t\t\tSDL_SCANCODE_AC_FORWARD = 271,\n\t\t\tSDL_SCANCODE_AC_STOP = 272,\n\t\t\tSDL_SCANCODE_AC_REFRESH = 273,\n\t\t\tSDL_SCANCODE_AC_BOOKMARKS = 274,\n\n\t\t\t/* These come from other sources, and are mostly mac related */\n\t\t\tSDL_SCANCODE_BRIGHTNESSDOWN = 275,\n\t\t\tSDL_SCANCODE_BRIGHTNESSUP = 276,\n\t\t\tSDL_SCANCODE_DISPLAYSWITCH = 277,\n\t\t\tSDL_SCANCODE_KBDILLUMTOGGLE = 278,\n\t\t\tSDL_SCANCODE_KBDILLUMDOWN = 279,\n\t\t\tSDL_SCANCODE_KBDILLUMUP = 280,\n\t\t\tSDL_SCANCODE_EJECT = 281,\n\t\t\tSDL_SCANCODE_SLEEP = 282,\n\n\t\t\tSDL_SCANCODE_APP1 = 283,\n\t\t\tSDL_SCANCODE_APP2 = 284,\n\n\t\t\t/* These come from the USB consumer page (0x0C) */\n\t\t\tSDL_SCANCODE_AUDIOREWIND = 285,\n\t\t\tSDL_SCANCODE_AUDIOFASTFORWARD = 286,\n\n\t\t\t/* This is not a key, simply marks the number of scancodes\n\t\t\t * so that you know how big to make your arrays. */\n\t\t\tSDL_NUM_SCANCODES = 512\n\t\t}\n\n\t\t#endregion\n\n\t\t#region SDL_keycode.h\n\n\t\tpublic const int SDLK_SCANCODE_MASK = (1 << 30);\n\t\tpublic static SDL_Keycode SDL_SCANCODE_TO_KEYCODE(SDL_Scancode X)\n\t\t{\n\t\t\treturn (SDL_Keycode)((int)X | SDLK_SCANCODE_MASK);\n\t\t}\n\n\t\tpublic enum SDL_Keycode\n\t\t{\n\t\t\tSDLK_UNKNOWN = 0,\n\n\t\t\tSDLK_RETURN = '\\r',\n\t\t\tSDLK_ESCAPE = 27, // '\\033'\n\t\t\tSDLK_BACKSPACE = '\\b',\n\t\t\tSDLK_TAB = '\\t',\n\t\t\tSDLK_SPACE = ' ',\n\t\t\tSDLK_EXCLAIM = '!',\n\t\t\tSDLK_QUOTEDBL = '\"',\n\t\t\tSDLK_HASH = '#',\n\t\t\tSDLK_PERCENT = '%',\n\t\t\tSDLK_DOLLAR = '$',\n\t\t\tSDLK_AMPERSAND = '&',\n\t\t\tSDLK_QUOTE = '\\'',\n\t\t\tSDLK_LEFTPAREN = '(',\n\t\t\tSDLK_RIGHTPAREN = ')',\n\t\t\tSDLK_ASTERISK = '*',\n\t\t\tSDLK_PLUS = '+',\n\t\t\tSDLK_COMMA = ',',\n\t\t\tSDLK_MINUS = '-',\n\t\t\tSDLK_PERIOD = '.',\n\t\t\tSDLK_SLASH = '/',\n\t\t\tSDLK_0 = '0',\n\t\t\tSDLK_1 = '1',\n\t\t\tSDLK_2 = '2',\n\t\t\tSDLK_3 = '3',\n\t\t\tSDLK_4 = '4',\n\t\t\tSDLK_5 = '5',\n\t\t\tSDLK_6 = '6',\n\t\t\tSDLK_7 = '7',\n\t\t\tSDLK_8 = '8',\n\t\t\tSDLK_9 = '9',\n\t\t\tSDLK_COLON = ':',\n\t\t\tSDLK_SEMICOLON = ';',\n\t\t\tSDLK_LESS = '<',\n\t\t\tSDLK_EQUALS = '=',\n\t\t\tSDLK_GREATER = '>',\n\t\t\tSDLK_QUESTION = '?',\n\t\t\tSDLK_AT = '@',\n\t\t\t/*\n\t\t\tSkip uppercase letters\n\t\t\t*/\n\t\t\tSDLK_LEFTBRACKET = '[',\n\t\t\tSDLK_BACKSLASH = '\\\\',\n\t\t\tSDLK_RIGHTBRACKET = ']',\n\t\t\tSDLK_CARET = '^',\n\t\t\tSDLK_UNDERSCORE = '_',\n\t\t\tSDLK_BACKQUOTE = '`',\n\t\t\tSDLK_a = 'a',\n\t\t\tSDLK_b = 'b',\n\t\t\tSDLK_c = 'c',\n\t\t\tSDLK_d = 'd',\n\t\t\tSDLK_e = 'e',\n\t\t\tSDLK_f = 'f',\n\t\t\tSDLK_g = 'g',\n\t\t\tSDLK_h = 'h',\n\t\t\tSDLK_i = 'i',\n\t\t\tSDLK_j = 'j',\n\t\t\tSDLK_k = 'k',\n\t\t\tSDLK_l = 'l',\n\t\t\tSDLK_m = 'm',\n\t\t\tSDLK_n = 'n',\n\t\t\tSDLK_o = 'o',\n\t\t\tSDLK_p = 'p',\n\t\t\tSDLK_q = 'q',\n\t\t\tSDLK_r = 'r',\n\t\t\tSDLK_s = 's',\n\t\t\tSDLK_t = 't',\n\t\t\tSDLK_u = 'u',\n\t\t\tSDLK_v = 'v',\n\t\t\tSDLK_w = 'w',\n\t\t\tSDLK_x = 'x',\n\t\t\tSDLK_y = 'y',\n\t\t\tSDLK_z = 'z',\n\n\t\t\tSDLK_CAPSLOCK = (int)SDL_Scancode.SDL_SCANCODE_CAPSLOCK | SDLK_SCANCODE_MASK,\n\n\t\t\tSDLK_F1 = (int)SDL_Scancode.SDL_SCANCODE_F1 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F2 = (int)SDL_Scancode.SDL_SCANCODE_F2 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F3 = (int)SDL_Scancode.SDL_SCANCODE_F3 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F4 = (int)SDL_Scancode.SDL_SCANCODE_F4 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F5 = (int)SDL_Scancode.SDL_SCANCODE_F5 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F6 = (int)SDL_Scancode.SDL_SCANCODE_F6 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F7 = (int)SDL_Scancode.SDL_SCANCODE_F7 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F8 = (int)SDL_Scancode.SDL_SCANCODE_F8 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F9 = (int)SDL_Scancode.SDL_SCANCODE_F9 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F10 = (int)SDL_Scancode.SDL_SCANCODE_F10 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F11 = (int)SDL_Scancode.SDL_SCANCODE_F11 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F12 = (int)SDL_Scancode.SDL_SCANCODE_F12 | SDLK_SCANCODE_MASK,\n\n\t\t\tSDLK_PRINTSCREEN = (int)SDL_Scancode.SDL_SCANCODE_PRINTSCREEN | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_SCROLLLOCK = (int)SDL_Scancode.SDL_SCANCODE_SCROLLLOCK | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_PAUSE = (int)SDL_Scancode.SDL_SCANCODE_PAUSE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_INSERT = (int)SDL_Scancode.SDL_SCANCODE_INSERT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_HOME = (int)SDL_Scancode.SDL_SCANCODE_HOME | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_PAGEUP = (int)SDL_Scancode.SDL_SCANCODE_PAGEUP | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_DELETE = 127,\n\t\t\tSDLK_END = (int)SDL_Scancode.SDL_SCANCODE_END | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_PAGEDOWN = (int)SDL_Scancode.SDL_SCANCODE_PAGEDOWN | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_RIGHT = (int)SDL_Scancode.SDL_SCANCODE_RIGHT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_LEFT = (int)SDL_Scancode.SDL_SCANCODE_LEFT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_DOWN = (int)SDL_Scancode.SDL_SCANCODE_DOWN | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_UP = (int)SDL_Scancode.SDL_SCANCODE_UP | SDLK_SCANCODE_MASK,\n\n\t\t\tSDLK_NUMLOCKCLEAR = (int)SDL_Scancode.SDL_SCANCODE_NUMLOCKCLEAR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_DIVIDE = (int)SDL_Scancode.SDL_SCANCODE_KP_DIVIDE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_MULTIPLY = (int)SDL_Scancode.SDL_SCANCODE_KP_MULTIPLY | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_MINUS = (int)SDL_Scancode.SDL_SCANCODE_KP_MINUS | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_PLUS = (int)SDL_Scancode.SDL_SCANCODE_KP_PLUS | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_ENTER = (int)SDL_Scancode.SDL_SCANCODE_KP_ENTER | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_1 = (int)SDL_Scancode.SDL_SCANCODE_KP_1 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_2 = (int)SDL_Scancode.SDL_SCANCODE_KP_2 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_3 = (int)SDL_Scancode.SDL_SCANCODE_KP_3 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_4 = (int)SDL_Scancode.SDL_SCANCODE_KP_4 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_5 = (int)SDL_Scancode.SDL_SCANCODE_KP_5 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_6 = (int)SDL_Scancode.SDL_SCANCODE_KP_6 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_7 = (int)SDL_Scancode.SDL_SCANCODE_KP_7 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_8 = (int)SDL_Scancode.SDL_SCANCODE_KP_8 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_9 = (int)SDL_Scancode.SDL_SCANCODE_KP_9 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_0 = (int)SDL_Scancode.SDL_SCANCODE_KP_0 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_PERIOD = (int)SDL_Scancode.SDL_SCANCODE_KP_PERIOD | SDLK_SCANCODE_MASK,\n\n\t\t\tSDLK_APPLICATION = (int)SDL_Scancode.SDL_SCANCODE_APPLICATION | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_POWER = (int)SDL_Scancode.SDL_SCANCODE_POWER | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_EQUALS = (int)SDL_Scancode.SDL_SCANCODE_KP_EQUALS | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F13 = (int)SDL_Scancode.SDL_SCANCODE_F13 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F14 = (int)SDL_Scancode.SDL_SCANCODE_F14 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F15 = (int)SDL_Scancode.SDL_SCANCODE_F15 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F16 = (int)SDL_Scancode.SDL_SCANCODE_F16 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F17 = (int)SDL_Scancode.SDL_SCANCODE_F17 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F18 = (int)SDL_Scancode.SDL_SCANCODE_F18 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F19 = (int)SDL_Scancode.SDL_SCANCODE_F19 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F20 = (int)SDL_Scancode.SDL_SCANCODE_F20 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F21 = (int)SDL_Scancode.SDL_SCANCODE_F21 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F22 = (int)SDL_Scancode.SDL_SCANCODE_F22 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F23 = (int)SDL_Scancode.SDL_SCANCODE_F23 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_F24 = (int)SDL_Scancode.SDL_SCANCODE_F24 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_EXECUTE = (int)SDL_Scancode.SDL_SCANCODE_EXECUTE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_HELP = (int)SDL_Scancode.SDL_SCANCODE_HELP | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_MENU = (int)SDL_Scancode.SDL_SCANCODE_MENU | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_SELECT = (int)SDL_Scancode.SDL_SCANCODE_SELECT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_STOP = (int)SDL_Scancode.SDL_SCANCODE_STOP | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AGAIN = (int)SDL_Scancode.SDL_SCANCODE_AGAIN | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_UNDO = (int)SDL_Scancode.SDL_SCANCODE_UNDO | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_CUT = (int)SDL_Scancode.SDL_SCANCODE_CUT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_COPY = (int)SDL_Scancode.SDL_SCANCODE_COPY | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_PASTE = (int)SDL_Scancode.SDL_SCANCODE_PASTE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_FIND = (int)SDL_Scancode.SDL_SCANCODE_FIND | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_MUTE = (int)SDL_Scancode.SDL_SCANCODE_MUTE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_VOLUMEUP = (int)SDL_Scancode.SDL_SCANCODE_VOLUMEUP | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_VOLUMEDOWN = (int)SDL_Scancode.SDL_SCANCODE_VOLUMEDOWN | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_COMMA = (int)SDL_Scancode.SDL_SCANCODE_KP_COMMA | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_EQUALSAS400 =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_KP_EQUALSAS400 | SDLK_SCANCODE_MASK,\n\n\t\t\tSDLK_ALTERASE = (int)SDL_Scancode.SDL_SCANCODE_ALTERASE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_SYSREQ = (int)SDL_Scancode.SDL_SCANCODE_SYSREQ | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_CANCEL = (int)SDL_Scancode.SDL_SCANCODE_CANCEL | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_CLEAR = (int)SDL_Scancode.SDL_SCANCODE_CLEAR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_PRIOR = (int)SDL_Scancode.SDL_SCANCODE_PRIOR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_RETURN2 = (int)SDL_Scancode.SDL_SCANCODE_RETURN2 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_SEPARATOR = (int)SDL_Scancode.SDL_SCANCODE_SEPARATOR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_OUT = (int)SDL_Scancode.SDL_SCANCODE_OUT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_OPER = (int)SDL_Scancode.SDL_SCANCODE_OPER | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_CLEARAGAIN = (int)SDL_Scancode.SDL_SCANCODE_CLEARAGAIN | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_CRSEL = (int)SDL_Scancode.SDL_SCANCODE_CRSEL | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_EXSEL = (int)SDL_Scancode.SDL_SCANCODE_EXSEL | SDLK_SCANCODE_MASK,\n\n\t\t\tSDLK_KP_00 = (int)SDL_Scancode.SDL_SCANCODE_KP_00 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_000 = (int)SDL_Scancode.SDL_SCANCODE_KP_000 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_THOUSANDSSEPARATOR =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_THOUSANDSSEPARATOR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_DECIMALSEPARATOR =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_DECIMALSEPARATOR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_CURRENCYUNIT = (int)SDL_Scancode.SDL_SCANCODE_CURRENCYUNIT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_CURRENCYSUBUNIT =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_CURRENCYSUBUNIT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_LEFTPAREN = (int)SDL_Scancode.SDL_SCANCODE_KP_LEFTPAREN | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_RIGHTPAREN = (int)SDL_Scancode.SDL_SCANCODE_KP_RIGHTPAREN | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_LEFTBRACE = (int)SDL_Scancode.SDL_SCANCODE_KP_LEFTBRACE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_RIGHTBRACE = (int)SDL_Scancode.SDL_SCANCODE_KP_RIGHTBRACE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_TAB = (int)SDL_Scancode.SDL_SCANCODE_KP_TAB | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_BACKSPACE = (int)SDL_Scancode.SDL_SCANCODE_KP_BACKSPACE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_A = (int)SDL_Scancode.SDL_SCANCODE_KP_A | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_B = (int)SDL_Scancode.SDL_SCANCODE_KP_B | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_C = (int)SDL_Scancode.SDL_SCANCODE_KP_C | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_D = (int)SDL_Scancode.SDL_SCANCODE_KP_D | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_E = (int)SDL_Scancode.SDL_SCANCODE_KP_E | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_F = (int)SDL_Scancode.SDL_SCANCODE_KP_F | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_XOR = (int)SDL_Scancode.SDL_SCANCODE_KP_XOR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_POWER = (int)SDL_Scancode.SDL_SCANCODE_KP_POWER | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_PERCENT = (int)SDL_Scancode.SDL_SCANCODE_KP_PERCENT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_LESS = (int)SDL_Scancode.SDL_SCANCODE_KP_LESS | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_GREATER = (int)SDL_Scancode.SDL_SCANCODE_KP_GREATER | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_AMPERSAND = (int)SDL_Scancode.SDL_SCANCODE_KP_AMPERSAND | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_DBLAMPERSAND =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_KP_DBLAMPERSAND | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_VERTICALBAR =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_KP_VERTICALBAR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_DBLVERTICALBAR =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_KP_DBLVERTICALBAR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_COLON = (int)SDL_Scancode.SDL_SCANCODE_KP_COLON | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_HASH = (int)SDL_Scancode.SDL_SCANCODE_KP_HASH | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_SPACE = (int)SDL_Scancode.SDL_SCANCODE_KP_SPACE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_AT = (int)SDL_Scancode.SDL_SCANCODE_KP_AT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_EXCLAM = (int)SDL_Scancode.SDL_SCANCODE_KP_EXCLAM | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_MEMSTORE = (int)SDL_Scancode.SDL_SCANCODE_KP_MEMSTORE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_MEMRECALL = (int)SDL_Scancode.SDL_SCANCODE_KP_MEMRECALL | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_MEMCLEAR = (int)SDL_Scancode.SDL_SCANCODE_KP_MEMCLEAR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_MEMADD = (int)SDL_Scancode.SDL_SCANCODE_KP_MEMADD | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_MEMSUBTRACT =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_KP_MEMSUBTRACT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_MEMMULTIPLY =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_KP_MEMMULTIPLY | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_MEMDIVIDE = (int)SDL_Scancode.SDL_SCANCODE_KP_MEMDIVIDE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_PLUSMINUS = (int)SDL_Scancode.SDL_SCANCODE_KP_PLUSMINUS | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_CLEAR = (int)SDL_Scancode.SDL_SCANCODE_KP_CLEAR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_CLEARENTRY = (int)SDL_Scancode.SDL_SCANCODE_KP_CLEARENTRY | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_BINARY = (int)SDL_Scancode.SDL_SCANCODE_KP_BINARY | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_OCTAL = (int)SDL_Scancode.SDL_SCANCODE_KP_OCTAL | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_DECIMAL = (int)SDL_Scancode.SDL_SCANCODE_KP_DECIMAL | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KP_HEXADECIMAL =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_KP_HEXADECIMAL | SDLK_SCANCODE_MASK,\n\n\t\t\tSDLK_LCTRL = (int)SDL_Scancode.SDL_SCANCODE_LCTRL | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_LSHIFT = (int)SDL_Scancode.SDL_SCANCODE_LSHIFT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_LALT = (int)SDL_Scancode.SDL_SCANCODE_LALT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_LGUI = (int)SDL_Scancode.SDL_SCANCODE_LGUI | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_RCTRL = (int)SDL_Scancode.SDL_SCANCODE_RCTRL | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_RSHIFT = (int)SDL_Scancode.SDL_SCANCODE_RSHIFT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_RALT = (int)SDL_Scancode.SDL_SCANCODE_RALT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_RGUI = (int)SDL_Scancode.SDL_SCANCODE_RGUI | SDLK_SCANCODE_MASK,\n\n\t\t\tSDLK_MODE = (int)SDL_Scancode.SDL_SCANCODE_MODE | SDLK_SCANCODE_MASK,\n\n\t\t\tSDLK_AUDIONEXT = (int)SDL_Scancode.SDL_SCANCODE_AUDIONEXT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AUDIOPREV = (int)SDL_Scancode.SDL_SCANCODE_AUDIOPREV | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AUDIOSTOP = (int)SDL_Scancode.SDL_SCANCODE_AUDIOSTOP | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AUDIOPLAY = (int)SDL_Scancode.SDL_SCANCODE_AUDIOPLAY | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AUDIOMUTE = (int)SDL_Scancode.SDL_SCANCODE_AUDIOMUTE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_MEDIASELECT = (int)SDL_Scancode.SDL_SCANCODE_MEDIASELECT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_WWW = (int)SDL_Scancode.SDL_SCANCODE_WWW | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_MAIL = (int)SDL_Scancode.SDL_SCANCODE_MAIL | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_CALCULATOR = (int)SDL_Scancode.SDL_SCANCODE_CALCULATOR | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_COMPUTER = (int)SDL_Scancode.SDL_SCANCODE_COMPUTER | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AC_SEARCH = (int)SDL_Scancode.SDL_SCANCODE_AC_SEARCH | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AC_HOME = (int)SDL_Scancode.SDL_SCANCODE_AC_HOME | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AC_BACK = (int)SDL_Scancode.SDL_SCANCODE_AC_BACK | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AC_FORWARD = (int)SDL_Scancode.SDL_SCANCODE_AC_FORWARD | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AC_STOP = (int)SDL_Scancode.SDL_SCANCODE_AC_STOP | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AC_REFRESH = (int)SDL_Scancode.SDL_SCANCODE_AC_REFRESH | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AC_BOOKMARKS = (int)SDL_Scancode.SDL_SCANCODE_AC_BOOKMARKS | SDLK_SCANCODE_MASK,\n\n\t\t\tSDLK_BRIGHTNESSDOWN =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_BRIGHTNESSDOWN | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_BRIGHTNESSUP = (int)SDL_Scancode.SDL_SCANCODE_BRIGHTNESSUP | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_DISPLAYSWITCH = (int)SDL_Scancode.SDL_SCANCODE_DISPLAYSWITCH | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KBDILLUMTOGGLE =\n\t\t\t(int)SDL_Scancode.SDL_SCANCODE_KBDILLUMTOGGLE | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KBDILLUMDOWN = (int)SDL_Scancode.SDL_SCANCODE_KBDILLUMDOWN | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_KBDILLUMUP = (int)SDL_Scancode.SDL_SCANCODE_KBDILLUMUP | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_EJECT = (int)SDL_Scancode.SDL_SCANCODE_EJECT | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_SLEEP = (int)SDL_Scancode.SDL_SCANCODE_SLEEP | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_APP1 = (int)SDL_Scancode.SDL_SCANCODE_APP1 | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_APP2 = (int)SDL_Scancode.SDL_SCANCODE_APP2 | SDLK_SCANCODE_MASK,\n\n\t\t\tSDLK_AUDIOREWIND = (int)SDL_Scancode.SDL_SCANCODE_AUDIOREWIND | SDLK_SCANCODE_MASK,\n\t\t\tSDLK_AUDIOFASTFORWARD = (int)SDL_Scancode.SDL_SCANCODE_AUDIOFASTFORWARD | SDLK_SCANCODE_MASK\n\t\t}\n\n\t\t/* Key modifiers (bitfield) */\n\t\t[Flags]\n\t\tpublic enum SDL_Keymod : ushort\n\t\t{\n\t\t\tKMOD_NONE = 0x0000,\n\t\t\tKMOD_LSHIFT = 0x0001,\n\t\t\tKMOD_RSHIFT = 0x0002,\n\t\t\tKMOD_LCTRL = 0x0040,\n\t\t\tKMOD_RCTRL = 0x0080,\n\t\t\tKMOD_LALT = 0x0100,\n\t\t\tKMOD_RALT = 0x0200,\n\t\t\tKMOD_LGUI = 0x0400,\n\t\t\tKMOD_RGUI = 0x0800,\n\t\t\tKMOD_NUM = 0x1000,\n\t\t\tKMOD_CAPS = 0x2000,\n\t\t\tKMOD_MODE = 0x4000,\n\t\t\tKMOD_SCROLL = 0x8000,\n\n\t\t\t/* These are defines in the SDL headers */\n\t\t\tKMOD_CTRL = (KMOD_LCTRL | KMOD_RCTRL),\n\t\t\tKMOD_SHIFT = (KMOD_LSHIFT | KMOD_RSHIFT),\n\t\t\tKMOD_ALT = (KMOD_LALT | KMOD_RALT),\n\t\t\tKMOD_GUI = (KMOD_LGUI | KMOD_RGUI),\n\n\t\t\tKMOD_RESERVED = KMOD_SCROLL\n\t\t}\n\n\t\t#endregion\n\n\t\t#region SDL_keyboard.h\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_Keysym\n\t\t{\n\t\t\tpublic SDL_Scancode scancode;\n\t\t\tpublic SDL_Keycode sym;\n\t\t\tpublic SDL_Keymod mod; /* UInt16 */\n\t\t\tpublic UInt32 unicode; /* Deprecated */\n\t\t}\n\n\t\t/* Get the window which has kbd focus */\n\t\t/* Return type is an SDL_Window pointer */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetKeyboardFocus();\n\n\t\t/* Get a snapshot of the keyboard state. */\n\t\t/* Return value is a pointer to a UInt8 array */\n\t\t/* Numkeys returns the size of the array if non-null */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetKeyboardState(out int numkeys);\n\n\t\t/* Get the current key modifier state for the keyboard. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_Keymod SDL_GetModState();\n\n\t\t/* Set the current key modifier state */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetModState(SDL_Keymod modstate);\n\n\t\t/* Get the key code corresponding to the given scancode\n\t\t * with the current keyboard layout.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_Keycode SDL_GetKeyFromScancode(SDL_Scancode scancode);\n\n\t\t/* Get the scancode for the given keycode */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_Scancode SDL_GetScancodeFromKey(SDL_Keycode key);\n\n\t\t/* Wrapper for SDL_GetScancodeName */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetScancodeName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetScancodeName(SDL_Scancode scancode);\n\t\tpublic static string SDL_GetScancodeName(SDL_Scancode scancode)\n\t\t{\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GetScancodeName(scancode)\n\t\t\t);\n\t\t}\n\n\t\t/* Get a scancode from a human-readable name */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetScancodeFromName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe SDL_Scancode INTERNAL_SDL_GetScancodeFromName(\n\t\t\tbyte* name\n\t\t);\n\t\tpublic static unsafe SDL_Scancode SDL_GetScancodeFromName(string name)\n\t\t{\n\t\t\tint utf8NameBufSize = Utf8Size(name);\n\t\t\tbyte* utf8Name = stackalloc byte[utf8NameBufSize];\n\t\t\treturn INTERNAL_SDL_GetScancodeFromName(\n\t\t\t\tUtf8Encode(name, utf8Name, utf8NameBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Wrapper for SDL_GetKeyName */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetKeyName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetKeyName(SDL_Keycode key);\n\t\tpublic static string SDL_GetKeyName(SDL_Keycode key)\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_GetKeyName(key));\n\t\t}\n\n\t\t/* Get a key code from a human-readable name */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetKeyFromName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe SDL_Keycode INTERNAL_SDL_GetKeyFromName(\n\t\t\tbyte* name\n\t\t);\n\t\tpublic static unsafe SDL_Keycode SDL_GetKeyFromName(string name)\n\t\t{\n\t\t\tint utf8NameBufSize = Utf8Size(name);\n\t\t\tbyte* utf8Name = stackalloc byte[utf8NameBufSize];\n\t\t\treturn INTERNAL_SDL_GetKeyFromName(\n\t\t\t\tUtf8Encode(name, utf8Name, utf8NameBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Start accepting Unicode text input events, show keyboard */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_StartTextInput();\n\n\t\t/* Check if unicode input events are enabled */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IsTextInputActive();\n\n\t\t/* Stop receiving any text input events, hide onscreen kbd */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_StopTextInput();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_ClearComposition();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IsTextInputShown();\n\n\t\t/* Set the rectangle used for text input, hint for IME */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetTextInputRect(ref SDL_Rect rect);\n\n\t\t/* Does the platform support an on-screen keyboard? */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasScreenKeyboardSupport();\n\n\t\t/* Is the on-screen keyboard shown for a given window? */\n\t\t/* window is an SDL_Window pointer */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IsScreenKeyboardShown(IntPtr window);\n\n\t\t#endregion\n\n\t\t#region SDL_mouse.c\n\n\t\t/* Note: SDL_Cursor is a typedef normally. We'll treat it as\n\t\t * an IntPtr, because C# doesn't do typedefs. Yay!\n\t\t */\n\n\t\t/* System cursor types */\n\t\tpublic enum SDL_SystemCursor\n\t\t{\n\t\t\tSDL_SYSTEM_CURSOR_ARROW,\t// Arrow\n\t\t\tSDL_SYSTEM_CURSOR_IBEAM,\t// I-beam\n\t\t\tSDL_SYSTEM_CURSOR_WAIT,\t\t// Wait\n\t\t\tSDL_SYSTEM_CURSOR_CROSSHAIR,\t// Crosshair\n\t\t\tSDL_SYSTEM_CURSOR_WAITARROW,\t// Small wait cursor (or Wait if not available)\n\t\t\tSDL_SYSTEM_CURSOR_SIZENWSE,\t// Double arrow pointing northwest and southeast\n\t\t\tSDL_SYSTEM_CURSOR_SIZENESW,\t// Double arrow pointing northeast and southwest\n\t\t\tSDL_SYSTEM_CURSOR_SIZEWE,\t// Double arrow pointing west and east\n\t\t\tSDL_SYSTEM_CURSOR_SIZENS,\t// Double arrow pointing north and south\n\t\t\tSDL_SYSTEM_CURSOR_SIZEALL,\t// Four pointed arrow pointing north, south, east, and west\n\t\t\tSDL_SYSTEM_CURSOR_NO,\t\t// Slashed circle or crossbones\n\t\t\tSDL_SYSTEM_CURSOR_HAND,\t\t// Hand\n\t\t\tSDL_NUM_SYSTEM_CURSORS\n\t\t}\n\n\t\t/* Get the window which currently has mouse focus */\n\t\t/* Return value is an SDL_Window pointer */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetMouseFocus();\n\n\t\t/* Get the current state of the mouse */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_GetMouseState(out int x, out int y);\n\n\t\t/* Get the current state of the mouse */\n\t\t/* This overload allows for passing NULL to x */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_GetMouseState(IntPtr x, out int y);\n\n\t\t/* Get the current state of the mouse */\n\t\t/* This overload allows for passing NULL to y */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_GetMouseState(out int x, IntPtr y);\n\n\t\t/* Get the current state of the mouse */\n\t\t/* This overload allows for passing NULL to both x and y */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_GetMouseState(IntPtr x, IntPtr y);\n\n\t\t/* Get the current state of the mouse, in relation to the desktop.\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_GetGlobalMouseState(out int x, out int y);\n\n\t\t/* Get the current state of the mouse, in relation to the desktop.\n\t\t * Only available in 2.0.4 or higher.\n\t\t * This overload allows for passing NULL to x.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_GetGlobalMouseState(IntPtr x, out int y);\n\n\t\t/* Get the current state of the mouse, in relation to the desktop.\n\t\t * Only available in 2.0.4 or higher.\n\t\t * This overload allows for passing NULL to y.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_GetGlobalMouseState(out int x, IntPtr y);\n\n\t\t/* Get the current state of the mouse, in relation to the desktop.\n\t\t * Only available in 2.0.4 or higher.\n\t\t * This overload allows for passing NULL to both x and y\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_GetGlobalMouseState(IntPtr x, IntPtr y);\n\n\t\t/* Get the mouse state with relative coords*/\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_GetRelativeMouseState(out int x, out int y);\n\n\t\t/* Set the mouse cursor's position (within a window) */\n\t\t/* window is an SDL_Window pointer */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_WarpMouseInWindow(IntPtr window, int x, int y);\n\n\t\t/* Set the mouse cursor's position in global screen space.\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_WarpMouseGlobal(int x, int y);\n\n\t\t/* Enable/Disable relative mouse mode (grabs mouse, rel coords) */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SetRelativeMouseMode(SDL_bool enabled);\n\n\t\t/* Capture the mouse, to track input outside an SDL window.\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_CaptureMouse(SDL_bool enabled);\n\n\t\t/* Query if the relative mouse mode is enabled */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GetRelativeMouseMode();\n\n\t\t/* Create a cursor from bitmap data (amd mask) in MSB format.\n\t\t * data and mask are byte arrays, and w must be a multiple of 8.\n\t\t * return value is an SDL_Cursor pointer.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateCursor(\n\t\t\tIntPtr data,\n\t\t\tIntPtr mask,\n\t\t\tint w,\n\t\t\tint h,\n\t\t\tint hot_x,\n\t\t\tint hot_y\n\t\t);\n\n\t\t/* Create a cursor from an SDL_Surface.\n\t\t * IntPtr refers to an SDL_Cursor*, surface to an SDL_Surface*\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateColorCursor(\n\t\t\tIntPtr surface,\n\t\t\tint hot_x,\n\t\t\tint hot_y\n\t\t);\n\n\t\t/* Create a cursor from a system cursor id.\n\t\t * return value is an SDL_Cursor pointer\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_CreateSystemCursor(SDL_SystemCursor id);\n\n\t\t/* Set the active cursor.\n\t\t * cursor is an SDL_Cursor pointer\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetCursor(IntPtr cursor);\n\n\t\t/* Return the active cursor\n\t\t * return value is an SDL_Cursor pointer\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetCursor();\n\n\t\t/* Frees a cursor created with one of the CreateCursor functions.\n\t\t * cursor in an SDL_Cursor pointer\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_FreeCursor(IntPtr cursor);\n\n\t\t/* Toggle whether or not the cursor is shown */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_ShowCursor(int toggle);\n\n\t\tpublic static uint SDL_BUTTON(uint X)\n\t\t{\n\t\t\t// If only there were a better way of doing this in C#\n\t\t\treturn (uint) (1 << ((int) X - 1));\n\t\t}\n\n\t\tpublic const uint SDL_BUTTON_LEFT =\t1;\n\t\tpublic const uint SDL_BUTTON_MIDDLE =\t2;\n\t\tpublic const uint SDL_BUTTON_RIGHT =\t3;\n\t\tpublic const uint SDL_BUTTON_X1 =\t4;\n\t\tpublic const uint SDL_BUTTON_X2 =\t5;\n\t\tpublic static readonly UInt32 SDL_BUTTON_LMASK =\tSDL_BUTTON(SDL_BUTTON_LEFT);\n\t\tpublic static readonly UInt32 SDL_BUTTON_MMASK =\tSDL_BUTTON(SDL_BUTTON_MIDDLE);\n\t\tpublic static readonly UInt32 SDL_BUTTON_RMASK =\tSDL_BUTTON(SDL_BUTTON_RIGHT);\n\t\tpublic static readonly UInt32 SDL_BUTTON_X1MASK =\tSDL_BUTTON(SDL_BUTTON_X1);\n\t\tpublic static readonly UInt32 SDL_BUTTON_X2MASK =\tSDL_BUTTON(SDL_BUTTON_X2);\n\n\t\t#endregion\n\n\t\t#region SDL_touch.h\n\n\t\tpublic const uint SDL_TOUCH_MOUSEID = uint.MaxValue;\n\n\t\tpublic struct SDL_Finger\n\t\t{\n\t\t\tpublic long id; // SDL_FingerID\n\t\t\tpublic float x;\n\t\t\tpublic float y;\n\t\t\tpublic float pressure;\n\t\t}\n\n\t\t/* Only available in 2.0.10 or higher. */\n\t\tpublic enum SDL_TouchDeviceType\n\t\t{\n\t\t\tSDL_TOUCH_DEVICE_INVALID = -1,\n\t\t\tSDL_TOUCH_DEVICE_DIRECT,            /* touch screen with window-relative coordinates */\n\t\t\tSDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE, /* trackpad with absolute device coordinates */\n\t\t\tSDL_TOUCH_DEVICE_INDIRECT_RELATIVE  /* trackpad with screen cursor-relative coordinates */\n\t\t}\n\n\t\t/**\n\t\t *  \\brief Get the number of registered touch devices.\n \t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetNumTouchDevices();\n\n\t\t/**\n\t\t *  \\brief Get the touch ID with the given index, or 0 if the index is invalid.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern long SDL_GetTouchDevice(int index);\n\n\t\t/**\n\t\t *  \\brief Get the number of active fingers for a given touch device.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetNumTouchFingers(long touchID);\n\n\t\t/**\n\t\t *  \\brief Get the finger object of the given touch, with the given index.\n\t\t *  Returns pointer to SDL_Finger.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetTouchFinger(long touchID, int index);\n\n\t\t/* Only available in 2.0.10 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_TouchDeviceType SDL_GetTouchDeviceType(Int64 touchID);\n\n\t\t/* Only available in 2.0.22 or higher. */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetTouchName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetTouchName(int index);\n\n\t\t/* Only available in 2.0.22 or higher. */\n\t\tpublic static string SDL_GetTouchName(int index)\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_GetTouchName(index));\n\t\t}\n\n\t\t#endregion\n\n\t\t#region SDL_joystick.h\n\n\t\tpublic const byte SDL_HAT_CENTERED =\t0x00;\n\t\tpublic const byte SDL_HAT_UP =\t\t0x01;\n\t\tpublic const byte SDL_HAT_RIGHT =\t0x02;\n\t\tpublic const byte SDL_HAT_DOWN =\t0x04;\n\t\tpublic const byte SDL_HAT_LEFT =\t0x08;\n\t\tpublic const byte SDL_HAT_RIGHTUP =\tSDL_HAT_RIGHT | SDL_HAT_UP;\n\t\tpublic const byte SDL_HAT_RIGHTDOWN =\tSDL_HAT_RIGHT | SDL_HAT_DOWN;\n\t\tpublic const byte SDL_HAT_LEFTUP =\tSDL_HAT_LEFT | SDL_HAT_UP;\n\t\tpublic const byte SDL_HAT_LEFTDOWN =\tSDL_HAT_LEFT | SDL_HAT_DOWN;\n\n\t\tpublic enum SDL_JoystickPowerLevel\n\t\t{\n\t\t\tSDL_JOYSTICK_POWER_UNKNOWN = -1,\n\t\t\tSDL_JOYSTICK_POWER_EMPTY,\n\t\t\tSDL_JOYSTICK_POWER_LOW,\n\t\t\tSDL_JOYSTICK_POWER_MEDIUM,\n\t\t\tSDL_JOYSTICK_POWER_FULL,\n\t\t\tSDL_JOYSTICK_POWER_WIRED,\n\t\t\tSDL_JOYSTICK_POWER_MAX\n\t\t}\n\n\t\tpublic enum SDL_JoystickType\n\t\t{\n\t\t\tSDL_JOYSTICK_TYPE_UNKNOWN,\n\t\t\tSDL_JOYSTICK_TYPE_GAMECONTROLLER,\n\t\t\tSDL_JOYSTICK_TYPE_WHEEL,\n\t\t\tSDL_JOYSTICK_TYPE_ARCADE_STICK,\n\t\t\tSDL_JOYSTICK_TYPE_FLIGHT_STICK,\n\t\t\tSDL_JOYSTICK_TYPE_DANCE_PAD,\n\t\t\tSDL_JOYSTICK_TYPE_GUITAR,\n\t\t\tSDL_JOYSTICK_TYPE_DRUM_KIT,\n\t\t\tSDL_JOYSTICK_TYPE_ARCADE_PAD\n\t\t}\n\n\t\t/* Only available in 2.0.14 or higher. */\n\t\tpublic const float SDL_IPHONE_MAX_GFORCE = 5.0f;\n\n\t\t/* joystick refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.9 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickRumble(\n\t\t\tIntPtr joystick,\n\t\t\tUInt16 low_frequency_rumble,\n\t\t\tUInt16 high_frequency_rumble,\n\t\t\tUInt32 duration_ms\n\t\t);\n\n\t\t/* joystick refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickRumbleTriggers(\n\t\t\tIntPtr joystick,\n\t\t\tUInt16 left_rumble,\n\t\t\tUInt16 right_rumble,\n\t\t\tUInt32 duration_ms\n\t\t);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_JoystickClose(IntPtr joystick);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickEventState(int state);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern short SDL_JoystickGetAxis(\n\t\t\tIntPtr joystick,\n\t\t\tint axis\n\t\t);\n\n\t\t/* joystick refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_JoystickGetAxisInitialState(\n\t\t\tIntPtr joystick,\n\t\t\tint axis,\n\t\t\tout short state\n\t\t);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickGetBall(\n\t\t\tIntPtr joystick,\n\t\t\tint ball,\n\t\t\tout int dx,\n\t\t\tout int dy\n\t\t);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern byte SDL_JoystickGetButton(\n\t\t\tIntPtr joystick,\n\t\t\tint button\n\t\t);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern byte SDL_JoystickGetHat(\n\t\t\tIntPtr joystick,\n\t\t\tint hat\n\t\t);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_JoystickName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_JoystickName(\n\t\t\tIntPtr joystick\n\t\t);\n\t\tpublic static string SDL_JoystickName(IntPtr joystick)\n\t\t{\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_JoystickName(joystick)\n\t\t\t);\n\t\t}\r\n\r\n        [DllImport(nativeLibName, EntryPoint = \"SDL_JoystickPath\", CallingConvention = CallingConvention.Cdecl)]\r\n        private static extern IntPtr INTERNAL_SDL_JoystickPath(\r\n\t\t\tIntPtr joystick\r\n\t\t);\r\n        public static string SDL_JoystickPath(IntPtr joystick)\r\n        {\r\n            return UTF8_ToManaged(\r\n                INTERNAL_SDL_JoystickPath(joystick)\r\n            );\r\n        }\r\n\r\n        [DllImport(nativeLibName, EntryPoint = \"SDL_JoystickNameForIndex\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_JoystickNameForIndex(\n\t\t\tint device_index\n\t\t);\n\t\tpublic static string SDL_JoystickNameForIndex(int device_index)\n\t\t{\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_JoystickNameForIndex(device_index)\n\t\t\t);\n\t\t}\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickNumAxes(IntPtr joystick);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickNumBalls(IntPtr joystick);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickNumButtons(IntPtr joystick);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickNumHats(IntPtr joystick);\n\n\t\t/* IntPtr refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_JoystickOpen(int device_index);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_JoystickUpdate();\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_NumJoysticks();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern Guid SDL_JoystickGetDeviceGUID(\n\t\t\tint device_index\n\t\t);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern Guid SDL_JoystickGetGUID(\n\t\t\tIntPtr joystick\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_JoystickGetGUIDString(\n\t\t\tGuid guid,\n\t\t\tbyte[] pszGUID,\n\t\t\tint cbGUID\n\t\t);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_JoystickGetGUIDFromString\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe Guid INTERNAL_SDL_JoystickGetGUIDFromString(\n\t\t\tbyte* pchGUID\n\t\t);\n\t\tpublic static unsafe Guid SDL_JoystickGetGUIDFromString(string pchGuid)\n\t\t{\n\t\t\tint utf8PchGuidBufSize = Utf8Size(pchGuid);\n\t\t\tbyte* utf8PchGuid = stackalloc byte[utf8PchGuidBufSize];\n\t\t\treturn INTERNAL_SDL_JoystickGetGUIDFromString(\n\t\t\t\tUtf8Encode(pchGuid, utf8PchGuid, utf8PchGuidBufSize)\n\t\t\t);\n\t\t}\n\n\t\t/* Only available in 2.0.6 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern ushort SDL_JoystickGetDeviceVendor(int device_index);\n\n\t\t/* Only available in 2.0.6 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern ushort SDL_JoystickGetDeviceProduct(int device_index);\n\n\t\t/* Only available in 2.0.6 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern ushort SDL_JoystickGetDeviceProductVersion(int device_index);\n\n\t\t/* Only available in 2.0.6 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_JoystickType SDL_JoystickGetDeviceType(int device_index);\n\n\t\t/* int refers to an SDL_JoystickID.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickGetDeviceInstanceID(int device_index);\n\n\t\t/* joystick refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern ushort SDL_JoystickGetVendor(IntPtr joystick);\n\n\t\t/* joystick refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern ushort SDL_JoystickGetProduct(IntPtr joystick);\n\n\t\t/* joystick refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern ushort SDL_JoystickGetProductVersion(IntPtr joystick);\n\n\t\t/* joystick refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_JoystickGetSerial\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_JoystickGetSerial(\n\t\t\tIntPtr joystick\n\t\t);\n\t\tpublic static string SDL_JoystickGetSerial(\n\t\t\tIntPtr joystick\n\t\t) {\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_JoystickGetSerial(joystick)\n\t\t\t);\n\t\t}\n\n\t\t/* joystick refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_JoystickType SDL_JoystickGetType(IntPtr joystick);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_JoystickGetAttached(IntPtr joystick);\n\n\t\t/* int refers to an SDL_JoystickID, joystick to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickInstanceID(IntPtr joystick);\n\n\t\t/* joystick refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_JoystickPowerLevel SDL_JoystickCurrentPowerLevel(\n\t\t\tIntPtr joystick\n\t\t);\n\n\t\t/* int refers to an SDL_JoystickID, IntPtr to an SDL_Joystick*.\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_JoystickFromInstanceID(int instance_id);\n\n\t\t/* Only available in 2.0.7 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_LockJoysticks();\n\n\t\t/* Only available in 2.0.7 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_UnlockJoysticks();\n\n\t\t/* IntPtr refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.11 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_JoystickFromPlayerIndex(int player_index);\n\n\t\t/* IntPtr refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.11 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_JoystickSetPlayerIndex(\n\t\t\tIntPtr joystick,\n\t\t\tint player_index\n\t\t);\n\n\t\t/* Int32 refers to an SDL_JoystickType.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickAttachVirtual(\n\t\t\tInt32 type,\n\t\t\tint naxes,\n\t\t\tint nbuttons,\n\t\t\tint nhats\n\t\t);\n\n\t\t/* Only available in 2.0.14 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickDetachVirtual(int device_index);\n\n\t\t/* Only available in 2.0.14 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_JoystickIsVirtual(int device_index);\n\n\t\t/* IntPtr refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickSetVirtualAxis(\n\t\t\tIntPtr joystick,\n\t\t\tint axis,\n\t\t\tInt16 value\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickSetVirtualButton(\n\t\t\tIntPtr joystick,\n\t\t\tint button,\n\t\t\tbyte value\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickSetVirtualHat(\n\t\t\tIntPtr joystick,\n\t\t\tint hat,\n\t\t\tbyte value\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_JoystickHasLED(IntPtr joystick);\n\n\t\t/* IntPtr refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_JoystickHasRumble(IntPtr joystick);\n\n\t\t/* IntPtr refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_JoystickHasRumbleTriggers(IntPtr joystick);\n\n\t\t/* IntPtr refers to an SDL_Joystick*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickSetLED(\n\t\t\tIntPtr joystick,\n\t\t\tbyte red,\n\t\t\tbyte green,\n\t\t\tbyte blue\n\t\t);\n\n\t\t/* joystick refers to an SDL_Joystick*.\n\t\t * data refers to a const void*.\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickSendEffect(\n\t\t\tIntPtr joystick,\n\t\t\tIntPtr data,\n\t\t\tint size\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_gamecontroller.h\n\n\t\tpublic enum SDL_GameControllerBindType\n\t\t{\n\t\t\tSDL_CONTROLLER_BINDTYPE_NONE,\n\t\t\tSDL_CONTROLLER_BINDTYPE_BUTTON,\n\t\t\tSDL_CONTROLLER_BINDTYPE_AXIS,\n\t\t\tSDL_CONTROLLER_BINDTYPE_HAT\n\t\t}\n\n\t\tpublic enum SDL_GameControllerAxis\n\t\t{\n\t\t\tSDL_CONTROLLER_AXIS_INVALID = -1,\n\t\t\tSDL_CONTROLLER_AXIS_LEFTX,\n\t\t\tSDL_CONTROLLER_AXIS_LEFTY,\n\t\t\tSDL_CONTROLLER_AXIS_RIGHTX,\n\t\t\tSDL_CONTROLLER_AXIS_RIGHTY,\n\t\t\tSDL_CONTROLLER_AXIS_TRIGGERLEFT,\n\t\t\tSDL_CONTROLLER_AXIS_TRIGGERRIGHT,\n\t\t\tSDL_CONTROLLER_AXIS_MAX\n\t\t}\n\n\t\tpublic enum SDL_GameControllerButton\n\t\t{\n\t\t\tSDL_CONTROLLER_BUTTON_INVALID = -1,\n\t\t\tSDL_CONTROLLER_BUTTON_A,\n\t\t\tSDL_CONTROLLER_BUTTON_B,\n\t\t\tSDL_CONTROLLER_BUTTON_X,\n\t\t\tSDL_CONTROLLER_BUTTON_Y,\n\t\t\tSDL_CONTROLLER_BUTTON_BACK,\n\t\t\tSDL_CONTROLLER_BUTTON_GUIDE,\n\t\t\tSDL_CONTROLLER_BUTTON_START,\n\t\t\tSDL_CONTROLLER_BUTTON_LEFTSTICK,\n\t\t\tSDL_CONTROLLER_BUTTON_RIGHTSTICK,\n\t\t\tSDL_CONTROLLER_BUTTON_LEFTSHOULDER,\n\t\t\tSDL_CONTROLLER_BUTTON_RIGHTSHOULDER,\n\t\t\tSDL_CONTROLLER_BUTTON_DPAD_UP,\n\t\t\tSDL_CONTROLLER_BUTTON_DPAD_DOWN,\n\t\t\tSDL_CONTROLLER_BUTTON_DPAD_LEFT,\n\t\t\tSDL_CONTROLLER_BUTTON_DPAD_RIGHT,\n\t\t\tSDL_CONTROLLER_BUTTON_MISC1,\n\t\t\tSDL_CONTROLLER_BUTTON_PADDLE1,\n\t\t\tSDL_CONTROLLER_BUTTON_PADDLE2,\n\t\t\tSDL_CONTROLLER_BUTTON_PADDLE3,\n\t\t\tSDL_CONTROLLER_BUTTON_PADDLE4,\n\t\t\tSDL_CONTROLLER_BUTTON_TOUCHPAD,\n\t\t\tSDL_CONTROLLER_BUTTON_MAX,\n\t\t}\n\n\t\tpublic enum SDL_GameControllerType\n\t\t{\n\t\t\tSDL_CONTROLLER_TYPE_UNKNOWN = 0,\n\t\t\tSDL_CONTROLLER_TYPE_XBOX360,\n\t\t\tSDL_CONTROLLER_TYPE_XBOXONE,\n\t\t\tSDL_CONTROLLER_TYPE_PS3,\n\t\t\tSDL_CONTROLLER_TYPE_PS4,\n\t\t\tSDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO,\n\t\t\tSDL_CONTROLLER_TYPE_VIRTUAL,\t\t/* Requires >= 2.0.14 */\n\t\t\tSDL_CONTROLLER_TYPE_PS5,\t\t/* Requires >= 2.0.14 */\n\t\t\tSDL_CONTROLLER_TYPE_AMAZON_LUNA,\t/* Requires >= 2.0.16 */\n\t\t\tSDL_CONTROLLER_TYPE_GOOGLE_STADIA\t/* Requires >= 2.0.16 */\n\t\t}\n\n\t\t// FIXME: I'd rather this somehow be private...\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_GameControllerButtonBind_hat\n\t\t{\n\t\t\tpublic int hat;\n\t\t\tpublic int hat_mask;\n\t\t}\n\n\t\t// FIXME: I'd rather this somehow be private...\n\t\t[StructLayout(LayoutKind.Explicit)]\n\t\tpublic struct INTERNAL_GameControllerButtonBind_union\n\t\t{\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic int button;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic int axis;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_GameControllerButtonBind_hat hat;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_GameControllerButtonBind\n\t\t{\n\t\t\tpublic SDL_GameControllerBindType bindType;\n\t\t\tpublic INTERNAL_GameControllerButtonBind_union value;\n\t\t}\n\n\t\t/* This exists to deal with C# being stupid about blittable types. */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tprivate struct INTERNAL_SDL_GameControllerButtonBind\n\t\t{\n\t\t\tpublic int bindType;\n\t\t\t/* Largest data type in the union is two ints in size */\n\t\t\tpublic int unionVal0;\n\t\t\tpublic int unionVal1;\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerAddMapping\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe int INTERNAL_SDL_GameControllerAddMapping(\n\t\t\tbyte* mappingString\n\t\t);\n\t\tpublic static unsafe int SDL_GameControllerAddMapping(\n\t\t\tstring mappingString\n\t\t) {\n\t\t\tbyte* utf8MappingString = Utf8EncodeHeap(mappingString);\n\t\t\tint result = INTERNAL_SDL_GameControllerAddMapping(\n\t\t\t\tutf8MappingString\n\t\t\t);\n\t\t\tMarshal.FreeHGlobal((IntPtr) utf8MappingString);\n\t\t\treturn result;\n\t\t}\n\n\t\t/* Only available in 2.0.6 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerNumMappings();\n\n\t\t/* Only available in 2.0.6 or higher. */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerMappingForIndex\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GameControllerMappingForIndex(int mapping_index);\n\t\tpublic static string SDL_GameControllerMappingForIndex(int mapping_index)\n\t\t{\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GameControllerMappingForIndex(\n\t\t\t\t\tmapping_index\n\t\t\t\t),\n\t\t\t\ttrue\n\t\t\t);\n\t\t}\n\n\t\t/* THIS IS AN RWops FUNCTION! */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerAddMappingsFromRW\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern int INTERNAL_SDL_GameControllerAddMappingsFromRW(\n\t\t\tIntPtr rw,\n\t\t\tint freerw\n\t\t);\n\t\tpublic static int SDL_GameControllerAddMappingsFromFile(string file)\n\t\t{\n\t\t\tIntPtr rwops = SDL_RWFromFile(file, \"rb\");\n\t\t\treturn INTERNAL_SDL_GameControllerAddMappingsFromRW(rwops, 1);\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerMappingForGUID\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GameControllerMappingForGUID(\n\t\t\tGuid guid\n\t\t);\n\t\tpublic static string SDL_GameControllerMappingForGUID(Guid guid)\n\t\t{\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GameControllerMappingForGUID(guid),\n\t\t\t\ttrue\n\t\t\t);\n\t\t}\n\n\t\t/* gamecontroller refers to an SDL_GameController* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerMapping\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GameControllerMapping(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\t\tpublic static string SDL_GameControllerMapping(\n\t\t\tIntPtr gamecontroller\n\t\t) {\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GameControllerMapping(\n\t\t\t\t\tgamecontroller\n\t\t\t\t),\n\t\t\t\ttrue\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IsGameController(int joystick_index);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerNameForIndex\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GameControllerNameForIndex(\n\t\t\tint joystick_index\n\t\t);\n\t\tpublic static string SDL_GameControllerNameForIndex(\n\t\t\tint joystick_index\n\t\t) {\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GameControllerNameForIndex(joystick_index)\n\t\t\t);\n\t\t}\n\n\t\t/* Only available in 2.0.9 or higher. */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerMappingForDeviceIndex\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GameControllerMappingForDeviceIndex(\n\t\t\tint joystick_index\n\t\t);\n\t\tpublic static string SDL_GameControllerMappingForDeviceIndex(\n\t\t\tint joystick_index\n\t\t) {\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GameControllerMappingForDeviceIndex(joystick_index),\n\t\t\t\ttrue\n\t\t\t);\n\t\t}\n\n\t\t/* IntPtr refers to an SDL_GameController* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GameControllerOpen(int joystick_index);\n\n\t\t/* gamecontroller refers to an SDL_GameController* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GameControllerName(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\t\tpublic static string SDL_GameControllerName(\n\t\t\tIntPtr gamecontroller\n\t\t) {\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GameControllerName(gamecontroller)\n\t\t\t);\n\t\t}\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern ushort SDL_GameControllerGetVendor(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern ushort SDL_GameControllerGetProduct(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.6 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern ushort SDL_GameControllerGetProductVersion(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerGetSerial\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GameControllerGetSerial(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\t\tpublic static string SDL_GameControllerGetSerial(\n\t\t\tIntPtr gamecontroller\n\t\t) {\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GameControllerGetSerial(gamecontroller)\n\t\t\t);\n\t\t}\n\n\t\t/* gamecontroller refers to an SDL_GameController* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GameControllerGetAttached(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Joystick*\n\t\t * gamecontroller refers to an SDL_GameController*\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GameControllerGetJoystick(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerEventState(int state);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GameControllerUpdate();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerGetAxisFromString\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe SDL_GameControllerAxis INTERNAL_SDL_GameControllerGetAxisFromString(\n\t\t\tbyte* pchString\n\t\t);\n\t\tpublic static unsafe SDL_GameControllerAxis SDL_GameControllerGetAxisFromString(\n\t\t\tstring pchString\n\t\t) {\n\t\t\tint utf8PchStringBufSize = Utf8Size(pchString);\n\t\t\tbyte* utf8PchString = stackalloc byte[utf8PchStringBufSize];\n\t\t\treturn INTERNAL_SDL_GameControllerGetAxisFromString(\n\t\t\t\tUtf8Encode(pchString, utf8PchString, utf8PchStringBufSize)\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerGetStringForAxis\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GameControllerGetStringForAxis(\n\t\t\tSDL_GameControllerAxis axis\n\t\t);\n\t\tpublic static string SDL_GameControllerGetStringForAxis(\n\t\t\tSDL_GameControllerAxis axis\n\t\t) {\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GameControllerGetStringForAxis(\n\t\t\t\t\taxis\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\t/* gamecontroller refers to an SDL_GameController* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerGetBindForAxis\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern INTERNAL_SDL_GameControllerButtonBind INTERNAL_SDL_GameControllerGetBindForAxis(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerAxis axis\n\t\t);\n\t\tpublic static SDL_GameControllerButtonBind SDL_GameControllerGetBindForAxis(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerAxis axis\n\t\t) {\n\t\t\t// This is guaranteed to never be null\n\t\t\tINTERNAL_SDL_GameControllerButtonBind dumb = INTERNAL_SDL_GameControllerGetBindForAxis(\n\t\t\t\tgamecontroller,\n\t\t\t\taxis\n\t\t\t);\n\t\t\tSDL_GameControllerButtonBind result = new SDL_GameControllerButtonBind();\n\t\t\tresult.bindType = (SDL_GameControllerBindType) dumb.bindType;\n\t\t\tresult.value.hat.hat = dumb.unionVal0;\n\t\t\tresult.value.hat.hat_mask = dumb.unionVal1;\n\t\t\treturn result;\n\t\t}\n\n\t\t/* gamecontroller refers to an SDL_GameController* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern short SDL_GameControllerGetAxis(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerAxis axis\n\t\t);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerGetButtonFromString\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe SDL_GameControllerButton INTERNAL_SDL_GameControllerGetButtonFromString(\n\t\t\tbyte* pchString\n\t\t);\n\t\tpublic static unsafe SDL_GameControllerButton SDL_GameControllerGetButtonFromString(\n\t\t\tstring pchString\n\t\t) {\n\t\t\tint utf8PchStringBufSize = Utf8Size(pchString);\n\t\t\tbyte* utf8PchString = stackalloc byte[utf8PchStringBufSize];\n\t\t\treturn INTERNAL_SDL_GameControllerGetButtonFromString(\n\t\t\t\tUtf8Encode(pchString, utf8PchString, utf8PchStringBufSize)\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerGetStringForButton\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GameControllerGetStringForButton(\n\t\t\tSDL_GameControllerButton button\n\t\t);\n\t\tpublic static string SDL_GameControllerGetStringForButton(\n\t\t\tSDL_GameControllerButton button\n\t\t) {\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GameControllerGetStringForButton(button)\n\t\t\t);\n\t\t}\n\n\t\t/* gamecontroller refers to an SDL_GameController* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerGetBindForButton\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern INTERNAL_SDL_GameControllerButtonBind INTERNAL_SDL_GameControllerGetBindForButton(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerButton button\n\t\t);\n\t\tpublic static SDL_GameControllerButtonBind SDL_GameControllerGetBindForButton(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerButton button\n\t\t) {\n\t\t\t// This is guaranteed to never be null\n\t\t\tINTERNAL_SDL_GameControllerButtonBind dumb = INTERNAL_SDL_GameControllerGetBindForButton(\n\t\t\t\tgamecontroller,\n\t\t\t\tbutton\n\t\t\t);\n\t\t\tSDL_GameControllerButtonBind result = new SDL_GameControllerButtonBind();\n\t\t\tresult.bindType = (SDL_GameControllerBindType) dumb.bindType;\n\t\t\tresult.value.hat.hat = dumb.unionVal0;\n\t\t\tresult.value.hat.hat_mask = dumb.unionVal1;\n\t\t\treturn result;\n\t\t}\n\n\t\t/* gamecontroller refers to an SDL_GameController* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern byte SDL_GameControllerGetButton(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerButton button\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.9 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerRumble(\n\t\t\tIntPtr gamecontroller,\n\t\t\tUInt16 low_frequency_rumble,\n\t\t\tUInt16 high_frequency_rumble,\n\t\t\tUInt32 duration_ms\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerRumbleTriggers(\n\t\t\tIntPtr gamecontroller,\n\t\t\tUInt16 left_rumble,\n\t\t\tUInt16 right_rumble,\n\t\t\tUInt32 duration_ms\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GameControllerClose(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerGetAppleSFSymbolsNameForButton\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GameControllerGetAppleSFSymbolsNameForButton(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerButton button\n\t\t);\n\t\tpublic static string SDL_GameControllerGetAppleSFSymbolsNameForButton(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerButton button\n\t\t) {\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GameControllerGetAppleSFSymbolsNameForButton(gamecontroller, button)\n\t\t\t);\n\t\t}\n\n\t\t/* gamecontroller refers to an SDL_GameController*\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GameControllerGetAppleSFSymbolsNameForAxis\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GameControllerGetAppleSFSymbolsNameForAxis(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerAxis axis\n\t\t);\n\t\tpublic static string SDL_GameControllerGetAppleSFSymbolsNameForAxis(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerAxis axis\n\t\t) {\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GameControllerGetAppleSFSymbolsNameForAxis(gamecontroller, axis)\n\t\t\t);\n\t\t}\n\n\t\t/* int refers to an SDL_JoystickID, IntPtr to an SDL_GameController*.\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GameControllerFromInstanceID(int joyid);\n\n\t\t/* Only available in 2.0.11 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_GameControllerType SDL_GameControllerTypeForIndex(\n\t\t\tint joystick_index\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_GameController*.\n\t\t * Only available in 2.0.11 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_GameControllerType SDL_GameControllerGetType(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_GameController*.\n\t\t * Only available in 2.0.11 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GameControllerFromPlayerIndex(\n\t\t\tint player_index\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_GameController*.\n\t\t * Only available in 2.0.11 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_GameControllerSetPlayerIndex(\n\t\t\tIntPtr gamecontroller,\n\t\t\tint player_index\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GameControllerHasLED(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GameControllerHasRumble(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GameControllerHasRumbleTriggers(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerSetLED(\n\t\t\tIntPtr gamecontroller,\n\t\t\tbyte red,\n\t\t\tbyte green,\n\t\t\tbyte blue\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GameControllerHasAxis(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerAxis axis\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GameControllerHasButton(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_GameControllerButton button\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerGetNumTouchpads(\n\t\t\tIntPtr gamecontroller\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerGetNumTouchpadFingers(\n\t\t\tIntPtr gamecontroller,\n\t\t\tint touchpad\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerGetTouchpadFinger(\n\t\t\tIntPtr gamecontroller,\n\t\t\tint touchpad,\n\t\t\tint finger,\n\t\t\tout byte state,\n\t\t\tout float x,\n\t\t\tout float y,\n\t\t\tout float pressure\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GameControllerHasSensor(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_SensorType type\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerSetSensorEnabled(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_SensorType type,\n\t\t\tSDL_bool enabled\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GameControllerIsSensorEnabled(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_SensorType type\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * data refers to a float*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerGetSensorData(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_SensorType type,\n\t\t\tIntPtr data,\n\t\t\tint num_values\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerGetSensorData(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_SensorType type,\n\t\t\t[In] float[] data,\n\t\t\tint num_values\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern float SDL_GameControllerGetSensorDataRate(\n\t\t\tIntPtr gamecontroller,\n\t\t\tSDL_SensorType type\n\t\t);\n\n\t\t/* gamecontroller refers to an SDL_GameController*.\n\t\t * data refers to a const void*.\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GameControllerSendEffect(\n\t\t\tIntPtr gamecontroller,\n\t\t\tIntPtr data,\n\t\t\tint size\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_haptic.h\n\n\t\t/* SDL_HapticEffect type */\n\t\tpublic const ushort SDL_HAPTIC_CONSTANT =\t(1 << 0);\n\t\tpublic const ushort SDL_HAPTIC_SINE =\t\t(1 << 1);\n\t\tpublic const ushort SDL_HAPTIC_LEFTRIGHT =\t(1 << 2);\n\t\tpublic const ushort SDL_HAPTIC_TRIANGLE =\t(1 << 3);\n\t\tpublic const ushort SDL_HAPTIC_SAWTOOTHUP =\t(1 << 4);\n\t\tpublic const ushort SDL_HAPTIC_SAWTOOTHDOWN =\t(1 << 5);\n\t\tpublic const ushort SDL_HAPTIC_SPRING =\t\t(1 << 7);\n\t\tpublic const ushort SDL_HAPTIC_DAMPER =\t\t(1 << 8);\n\t\tpublic const ushort SDL_HAPTIC_INERTIA =\t(1 << 9);\n\t\tpublic const ushort SDL_HAPTIC_FRICTION =\t(1 << 10);\n\t\tpublic const ushort SDL_HAPTIC_CUSTOM =\t\t(1 << 11);\n\t\tpublic const ushort SDL_HAPTIC_GAIN =\t\t(1 << 12);\n\t\tpublic const ushort SDL_HAPTIC_AUTOCENTER =\t(1 << 13);\n\t\tpublic const ushort SDL_HAPTIC_STATUS =\t\t(1 << 14);\n\t\tpublic const ushort SDL_HAPTIC_PAUSE =\t\t(1 << 15);\n\n\t\t/* SDL_HapticDirection type */\n\t\tpublic const byte SDL_HAPTIC_POLAR =\t\t0;\n\t\tpublic const byte SDL_HAPTIC_CARTESIAN =\t1;\n\t\tpublic const byte SDL_HAPTIC_SPHERICAL =\t2;\n\t\tpublic const byte SDL_HAPTIC_STEERING_AXIS =\t3; /* Requires >= 2.0.14 */\n\n\t\t/* SDL_HapticRunEffect */\n\t\tpublic const uint SDL_HAPTIC_INFINITY = 4294967295U;\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic unsafe struct SDL_HapticDirection\n\t\t{\n\t\t\tpublic byte type;\n\t\t\tpublic fixed int dir[3];\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_HapticConstant\n\t\t{\n\t\t\t// Header\n\t\t\tpublic ushort type;\n\t\t\tpublic SDL_HapticDirection direction;\n\t\t\t// Replay\n\t\t\tpublic uint length;\n\t\t\tpublic ushort delay;\n\t\t\t// Trigger\n\t\t\tpublic ushort button;\n\t\t\tpublic ushort interval;\n\t\t\t// Constant\n\t\t\tpublic short level;\n\t\t\t// Envelope\n\t\t\tpublic ushort attack_length;\n\t\t\tpublic ushort attack_level;\n\t\t\tpublic ushort fade_length;\n\t\t\tpublic ushort fade_level;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_HapticPeriodic\n\t\t{\n\t\t\t// Header\n\t\t\tpublic ushort type;\n\t\t\tpublic SDL_HapticDirection direction;\n\t\t\t// Replay\n\t\t\tpublic uint length;\n\t\t\tpublic ushort delay;\n\t\t\t// Trigger\n\t\t\tpublic ushort button;\n\t\t\tpublic ushort interval;\n\t\t\t// Periodic\n\t\t\tpublic ushort period;\n\t\t\tpublic short magnitude;\n\t\t\tpublic short offset;\n\t\t\tpublic ushort phase;\n\t\t\t// Envelope\n\t\t\tpublic ushort attack_length;\n\t\t\tpublic ushort attack_level;\n\t\t\tpublic ushort fade_length;\n\t\t\tpublic ushort fade_level;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic unsafe struct SDL_HapticCondition\n\t\t{\n\t\t\t// Header\n\t\t\tpublic ushort type;\n\t\t\tpublic SDL_HapticDirection direction;\n\t\t\t// Replay\n\t\t\tpublic uint length;\n\t\t\tpublic ushort delay;\n\t\t\t// Trigger\n\t\t\tpublic ushort button;\n\t\t\tpublic ushort interval;\n\t\t\t// Condition\n\t\t\tpublic fixed ushort right_sat[3];\n\t\t\tpublic fixed ushort left_sat[3];\n\t\t\tpublic fixed short right_coeff[3];\n\t\t\tpublic fixed short left_coeff[3];\n\t\t\tpublic fixed ushort deadband[3];\n\t\t\tpublic fixed short center[3];\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_HapticRamp\n\t\t{\n\t\t\t// Header\n\t\t\tpublic ushort type;\n\t\t\tpublic SDL_HapticDirection direction;\n\t\t\t// Replay\n\t\t\tpublic uint length;\n\t\t\tpublic ushort delay;\n\t\t\t// Trigger\n\t\t\tpublic ushort button;\n\t\t\tpublic ushort interval;\n\t\t\t// Ramp\n\t\t\tpublic short start;\n\t\t\tpublic short end;\n\t\t\t// Envelope\n\t\t\tpublic ushort attack_length;\n\t\t\tpublic ushort attack_level;\n\t\t\tpublic ushort fade_length;\n\t\t\tpublic ushort fade_level;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_HapticLeftRight\n\t\t{\n\t\t\t// Header\n\t\t\tpublic ushort type;\n\t\t\t// Replay\n\t\t\tpublic uint length;\n\t\t\t// Rumble\n\t\t\tpublic ushort large_magnitude;\n\t\t\tpublic ushort small_magnitude;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_HapticCustom\n\t\t{\n\t\t\t// Header\n\t\t\tpublic ushort type;\n\t\t\tpublic SDL_HapticDirection direction;\n\t\t\t// Replay\n\t\t\tpublic uint length;\n\t\t\tpublic ushort delay;\n\t\t\t// Trigger\n\t\t\tpublic ushort button;\n\t\t\tpublic ushort interval;\n\t\t\t// Custom\n\t\t\tpublic byte channels;\n\t\t\tpublic ushort period;\n\t\t\tpublic ushort samples;\n\t\t\tpublic IntPtr data; // Uint16*\n\t\t\t// Envelope\n\t\t\tpublic ushort attack_length;\n\t\t\tpublic ushort attack_level;\n\t\t\tpublic ushort fade_length;\n\t\t\tpublic ushort fade_level;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Explicit)]\n\t\tpublic struct SDL_HapticEffect\n\t\t{\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic ushort type;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_HapticConstant constant;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_HapticPeriodic periodic;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_HapticCondition condition;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_HapticRamp ramp;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_HapticLeftRight leftright;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic SDL_HapticCustom custom;\n\t\t}\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_HapticClose(IntPtr haptic);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_HapticDestroyEffect(\n\t\t\tIntPtr haptic,\n\t\t\tint effect\n\t\t);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticEffectSupported(\n\t\t\tIntPtr haptic,\n\t\t\tref SDL_HapticEffect effect\n\t\t);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticGetEffectStatus(\n\t\t\tIntPtr haptic,\n\t\t\tint effect\n\t\t);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticIndex(IntPtr haptic);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_HapticName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_HapticName(int device_index);\n\t\tpublic static string SDL_HapticName(int device_index)\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_HapticName(device_index));\n\t\t}\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticNewEffect(\n\t\t\tIntPtr haptic,\n\t\t\tref SDL_HapticEffect effect\n\t\t);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticNumAxes(IntPtr haptic);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticNumEffects(IntPtr haptic);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticNumEffectsPlaying(IntPtr haptic);\n\n\t\t/* IntPtr refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_HapticOpen(int device_index);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticOpened(int device_index);\n\n\t\t/* IntPtr refers to an SDL_Haptic*, joystick to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_HapticOpenFromJoystick(\n\t\t\tIntPtr joystick\n\t\t);\n\n\t\t/* IntPtr refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_HapticOpenFromMouse();\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticPause(IntPtr haptic);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_HapticQuery(IntPtr haptic);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticRumbleInit(IntPtr haptic);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticRumblePlay(\n\t\t\tIntPtr haptic,\n\t\t\tfloat strength,\n\t\t\tuint length\n\t\t);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticRumbleStop(IntPtr haptic);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticRumbleSupported(IntPtr haptic);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticRunEffect(\n\t\t\tIntPtr haptic,\n\t\t\tint effect,\n\t\t\tuint iterations\n\t\t);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticSetAutocenter(\n\t\t\tIntPtr haptic,\n\t\t\tint autocenter\n\t\t);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticSetGain(\n\t\t\tIntPtr haptic,\n\t\t\tint gain\n\t\t);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticStopAll(IntPtr haptic);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticStopEffect(\n\t\t\tIntPtr haptic,\n\t\t\tint effect\n\t\t);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticUnpause(IntPtr haptic);\n\n\t\t/* haptic refers to an SDL_Haptic* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_HapticUpdateEffect(\n\t\t\tIntPtr haptic,\n\t\t\tint effect,\n\t\t\tref SDL_HapticEffect data\n\t\t);\n\n\t\t/* joystick refers to an SDL_Joystick* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_JoystickIsHaptic(IntPtr joystick);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_MouseIsHaptic();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_NumHaptics();\n\n\t\t#endregion\n\n\t\t#region SDL_sensor.h\n\n\t\t/* This region is only available in 2.0.9 or higher. */\n\n\t\tpublic enum SDL_SensorType\n\t\t{\n\t\t\tSDL_SENSOR_INVALID = -1,\n\t\t\tSDL_SENSOR_UNKNOWN,\n\t\t\tSDL_SENSOR_ACCEL,\n\t\t\tSDL_SENSOR_GYRO\n\t\t}\n\n\t\tpublic const float SDL_STANDARD_GRAVITY = 9.80665f;\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_NumSensors();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_SensorGetDeviceName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_SensorGetDeviceName(int device_index);\n\t\tpublic static string SDL_SensorGetDeviceName(int device_index)\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_SensorGetDeviceName(device_index));\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_SensorType SDL_SensorGetDeviceType(int device_index);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SensorGetDeviceNonPortableType(int device_index);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern Int32 SDL_SensorGetDeviceInstanceID(int device_index);\n\n\t\t/* IntPtr refers to an SDL_Sensor* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_SensorOpen(int device_index);\n\n\t\t/* IntPtr refers to an SDL_Sensor* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_SensorFromInstanceID(\n\t\t\tInt32 instance_id\n\t\t);\n\n\t\t/* sensor refers to an SDL_Sensor* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_SensorGetName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_SensorGetName(IntPtr sensor);\n\t\tpublic static string SDL_SensorGetName(IntPtr sensor)\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_SensorGetName(sensor));\n\t\t}\n\n\t\t/* sensor refers to an SDL_Sensor* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_SensorType SDL_SensorGetType(IntPtr sensor);\n\n\t\t/* sensor refers to an SDL_Sensor* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SensorGetNonPortableType(IntPtr sensor);\n\n\t\t/* sensor refers to an SDL_Sensor* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern Int32 SDL_SensorGetInstanceID(IntPtr sensor);\n\n\t\t/* sensor refers to an SDL_Sensor* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_SensorGetData(\n\t\t\tIntPtr sensor,\n\t\t\tfloat[] data,\n\t\t\tint num_values\n\t\t);\n\n\t\t/* sensor refers to an SDL_Sensor* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SensorClose(IntPtr sensor);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SensorUpdate();\n\n\t\t/* Only available in 2.0.14 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_LockSensors();\n\n\t\t/* Only available in 2.0.14 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_UnlockSensors();\n\n\t\t#endregion\n\n\t\t#region SDL_audio.h\n\n\t\tpublic const ushort SDL_AUDIO_MASK_BITSIZE =\t0xFF;\n\t\tpublic const ushort SDL_AUDIO_MASK_DATATYPE =\t(1 << 8);\n\t\tpublic const ushort SDL_AUDIO_MASK_ENDIAN =\t(1 << 12);\n\t\tpublic const ushort SDL_AUDIO_MASK_SIGNED =\t(1 << 15);\n\n\t\tpublic static ushort SDL_AUDIO_BITSIZE(ushort x)\n\t\t{\n\t\t\treturn (ushort) (x & SDL_AUDIO_MASK_BITSIZE);\n\t\t}\n\n\t\tpublic static bool SDL_AUDIO_ISFLOAT(ushort x)\n\t\t{\n\t\t\treturn (x & SDL_AUDIO_MASK_DATATYPE) != 0;\n\t\t}\n\n\t\tpublic static bool SDL_AUDIO_ISBIGENDIAN(ushort x)\n\t\t{\n\t\t\treturn (x & SDL_AUDIO_MASK_ENDIAN) != 0;\n\t\t}\n\n\t\tpublic static bool SDL_AUDIO_ISSIGNED(ushort x)\n\t\t{\n\t\t\treturn (x & SDL_AUDIO_MASK_SIGNED) != 0;\n\t\t}\n\n\t\tpublic static bool SDL_AUDIO_ISINT(ushort x)\n\t\t{\n\t\t\treturn (x & SDL_AUDIO_MASK_DATATYPE) == 0;\n\t\t}\n\n\t\tpublic static bool SDL_AUDIO_ISLITTLEENDIAN(ushort x)\n\t\t{\n\t\t\treturn (x & SDL_AUDIO_MASK_ENDIAN) == 0;\n\t\t}\n\n\t\tpublic static bool SDL_AUDIO_ISUNSIGNED(ushort x)\n\t\t{\n\t\t\treturn (x & SDL_AUDIO_MASK_SIGNED) == 0;\n\t\t}\n\n\t\tpublic const ushort AUDIO_U8 =\t\t0x0008;\n\t\tpublic const ushort AUDIO_S8 =\t\t0x8008;\n\t\tpublic const ushort AUDIO_U16LSB =\t0x0010;\n\t\tpublic const ushort AUDIO_S16LSB =\t0x8010;\n\t\tpublic const ushort AUDIO_U16MSB =\t0x1010;\n\t\tpublic const ushort AUDIO_S16MSB =\t0x9010;\n\t\tpublic const ushort AUDIO_U16 =\t\tAUDIO_U16LSB;\n\t\tpublic const ushort AUDIO_S16 =\t\tAUDIO_S16LSB;\n\t\tpublic const ushort AUDIO_S32LSB =\t0x8020;\n\t\tpublic const ushort AUDIO_S32MSB =\t0x9020;\n\t\tpublic const ushort AUDIO_S32 =\t\tAUDIO_S32LSB;\n\t\tpublic const ushort AUDIO_F32LSB =\t0x8120;\n\t\tpublic const ushort AUDIO_F32MSB =\t0x9120;\n\t\tpublic const ushort AUDIO_F32 =\t\tAUDIO_F32LSB;\n\n\t\tpublic static readonly ushort AUDIO_U16SYS =\n\t\t\tBitConverter.IsLittleEndian ? AUDIO_U16LSB : AUDIO_U16MSB;\n\t\tpublic static readonly ushort AUDIO_S16SYS =\n\t\t\tBitConverter.IsLittleEndian ? AUDIO_S16LSB : AUDIO_S16MSB;\n\t\tpublic static readonly ushort AUDIO_S32SYS =\n\t\t\tBitConverter.IsLittleEndian ? AUDIO_S32LSB : AUDIO_S32MSB;\n\t\tpublic static readonly ushort AUDIO_F32SYS =\n\t\t\tBitConverter.IsLittleEndian ? AUDIO_F32LSB : AUDIO_F32MSB;\n\n\t\tpublic const uint SDL_AUDIO_ALLOW_FREQUENCY_CHANGE =\t0x00000001;\n\t\tpublic const uint SDL_AUDIO_ALLOW_FORMAT_CHANGE =\t0x00000002;\n\t\tpublic const uint SDL_AUDIO_ALLOW_CHANNELS_CHANGE =\t0x00000004;\n\t\tpublic const uint SDL_AUDIO_ALLOW_SAMPLES_CHANGE =\t0x00000008;\n\t\tpublic const uint SDL_AUDIO_ALLOW_ANY_CHANGE = (\n\t\t\tSDL_AUDIO_ALLOW_FREQUENCY_CHANGE |\n\t\t\tSDL_AUDIO_ALLOW_FORMAT_CHANGE |\n\t\t\tSDL_AUDIO_ALLOW_CHANNELS_CHANGE |\n\t\t\tSDL_AUDIO_ALLOW_SAMPLES_CHANGE\n\t\t);\n\n\t\tpublic const int SDL_MIX_MAXVOLUME = 128;\n\n\t\tpublic enum SDL_AudioStatus\n\t\t{\n\t\t\tSDL_AUDIO_STOPPED,\n\t\t\tSDL_AUDIO_PLAYING,\n\t\t\tSDL_AUDIO_PAUSED\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_AudioSpec\n\t\t{\n\t\t\tpublic int freq;\n\t\t\tpublic ushort format; // SDL_AudioFormat\n\t\t\tpublic byte channels;\n\t\t\tpublic byte silence;\n\t\t\tpublic ushort samples;\n\t\t\tpublic uint size;\n\t\t\tpublic SDL_AudioCallback callback;\n\t\t\tpublic IntPtr userdata; // void*\n\t\t}\n\n\t\t/* userdata refers to a void*, stream to a Uint8 */\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate void SDL_AudioCallback(\n\t\t\tIntPtr userdata,\n\t\t\tIntPtr stream,\n\t\t\tint len\n\t\t);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_AudioInit\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe int INTERNAL_SDL_AudioInit(\n\t\t\tbyte* driver_name\n\t\t);\n\t\tpublic static unsafe int SDL_AudioInit(string driver_name)\n\t\t{\n\t\t\tint utf8DriverNameBufSize = Utf8Size(driver_name);\n\t\t\tbyte* utf8DriverName = stackalloc byte[utf8DriverNameBufSize];\n\t\t\treturn INTERNAL_SDL_AudioInit(\n\t\t\t\tUtf8Encode(driver_name, utf8DriverName, utf8DriverNameBufSize)\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_AudioQuit();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_CloseAudio();\n\n\t\t/* dev refers to an SDL_AudioDeviceID */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_CloseAudioDevice(uint dev);\n\n\t\t/* audio_buf refers to a malloc()'d buffer from SDL_LoadWAV */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_FreeWAV(IntPtr audio_buf);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetAudioDeviceName\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetAudioDeviceName(\n\t\t\tint index,\n\t\t\tint iscapture\n\t\t);\n\t\tpublic static string SDL_GetAudioDeviceName(\n\t\t\tint index,\n\t\t\tint iscapture\n\t\t) {\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GetAudioDeviceName(index, iscapture)\n\t\t\t);\n\t\t}\n\n\t\t/* dev refers to an SDL_AudioDeviceID */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_AudioStatus SDL_GetAudioDeviceStatus(\n\t\t\tuint dev\n\t\t);\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetAudioDriver\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetAudioDriver(int index);\n\t\tpublic static string SDL_GetAudioDriver(int index)\n\t\t{\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GetAudioDriver(index)\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_AudioStatus SDL_GetAudioStatus();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetCurrentAudioDriver\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetCurrentAudioDriver();\n\t\tpublic static string SDL_GetCurrentAudioDriver()\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_GetCurrentAudioDriver());\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetNumAudioDevices(int iscapture);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetNumAudioDrivers();\n\n\t\t/* audio_buf refers to a malloc()'d buffer, IntPtr to an SDL_AudioSpec* */\n\t\t/* THIS IS AN RWops FUNCTION! */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_LoadWAV_RW(\n\t\t\tIntPtr src,\n\t\t\tint freesrc,\n\t\t\tout SDL_AudioSpec spec,\n\t\t\tout IntPtr audio_buf,\n\t\t\tout uint audio_len\n\t\t);\n\t\tpublic static IntPtr SDL_LoadWAV(\n\t\t\tstring file,\n\t\t\tout SDL_AudioSpec spec,\n\t\t\tout IntPtr audio_buf,\n\t\t\tout uint audio_len\n\t\t) {\n\t\t\tIntPtr rwops = SDL_RWFromFile(file, \"rb\");\n\t\t\treturn SDL_LoadWAV_RW(\n\t\t\t\trwops,\n\t\t\t\t1,\n\t\t\t\tout spec,\n\t\t\t\tout audio_buf,\n\t\t\t\tout audio_len\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_LockAudio();\n\n\t\t/* dev refers to an SDL_AudioDeviceID */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_LockAudioDevice(uint dev);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_MixAudio(\n\t\t\t[Out()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U1, SizeParamIndex = 2)]\n\t\t\t\tbyte[] dst,\n\t\t\t[In()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U1, SizeParamIndex = 2)]\n\t\t\t\tbyte[] src,\n\t\t\tuint len,\n\t\t\tint volume\n\t\t);\n\n\t\t/* format refers to an SDL_AudioFormat */\n\t\t/* This overload allows raw pointers to be passed for dst and src. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_MixAudioFormat(\n\t\t\tIntPtr dst,\n\t\t\tIntPtr src,\n\t\t\tushort format,\n\t\t\tuint len,\n\t\t\tint volume\n\t\t);\n\n\t\t/* format refers to an SDL_AudioFormat */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_MixAudioFormat(\n\t\t\t[Out()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U1, SizeParamIndex = 3)]\n\t\t\t\tbyte[] dst,\n\t\t\t[In()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U1, SizeParamIndex = 3)]\n\t\t\t\tbyte[] src,\n\t\t\tushort format,\n\t\t\tuint len,\n\t\t\tint volume\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_OpenAudio(\n\t\t\tref SDL_AudioSpec desired,\n\t\t\tout SDL_AudioSpec obtained\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_OpenAudio(\n\t\t\tref SDL_AudioSpec desired,\n\t\t\tIntPtr obtained\n\t\t);\n\n\t\t/* uint refers to an SDL_AudioDeviceID */\n\t\t/* This overload allows for IntPtr.Zero (null) to be passed for device. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern unsafe uint SDL_OpenAudioDevice(\n\t\t\tIntPtr device,\n\t\t\tint iscapture,\n\t\t\tref SDL_AudioSpec desired,\n\t\t\tout SDL_AudioSpec obtained,\n\t\t\tint allowed_changes\n\t\t);\n\n\t\t/* uint refers to an SDL_AudioDeviceID */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_OpenAudioDevice\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe uint INTERNAL_SDL_OpenAudioDevice(\n\t\t\tbyte* device,\n\t\t\tint iscapture,\n\t\t\tref SDL_AudioSpec desired,\n\t\t\tout SDL_AudioSpec obtained,\n\t\t\tint allowed_changes\n\t\t);\n\t\tpublic static unsafe uint SDL_OpenAudioDevice(\n\t\t\tstring device,\n\t\t\tint iscapture,\n\t\t\tref SDL_AudioSpec desired,\n\t\t\tout SDL_AudioSpec obtained,\n\t\t\tint allowed_changes\n\t\t) {\n\t\t\tint utf8DeviceBufSize = Utf8Size(device);\n\t\t\tbyte* utf8Device = stackalloc byte[utf8DeviceBufSize];\n\t\t\treturn INTERNAL_SDL_OpenAudioDevice(\n\t\t\t\tUtf8Encode(device, utf8Device, utf8DeviceBufSize),\n\t\t\t\tiscapture,\n\t\t\t\tref desired,\n\t\t\t\tout obtained,\n\t\t\t\tallowed_changes\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_PauseAudio(int pause_on);\n\n\t\t/* dev refers to an SDL_AudioDeviceID */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_PauseAudioDevice(\n\t\t\tuint dev,\n\t\t\tint pause_on\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_UnlockAudio();\n\n\t\t/* dev refers to an SDL_AudioDeviceID */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_UnlockAudioDevice(uint dev);\n\n\t\t/* dev refers to an SDL_AudioDeviceID, data to a void*\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_QueueAudio(\n\t\t\tuint dev,\n\t\t\tIntPtr data,\n\t\t\tUInt32 len\n\t\t);\n\n\t\t/* dev refers to an SDL_AudioDeviceID, data to a void*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_DequeueAudio(\n\t\t\tuint dev,\n\t\t\tIntPtr data,\n\t\t\tuint len\n\t\t);\n\n\t\t/* dev refers to an SDL_AudioDeviceID\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_GetQueuedAudioSize(uint dev);\n\n\t\t/* dev refers to an SDL_AudioDeviceID\n\t\t * Only available in 2.0.4 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_ClearQueuedAudio(uint dev);\n\n\t\t/* src_format and dst_format refer to SDL_AudioFormats.\n\t\t * IntPtr refers to an SDL_AudioStream*.\n\t\t * Only available in 2.0.7 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_NewAudioStream(\n\t\t\tushort src_format,\n\t\t\tbyte src_channels,\n\t\t\tint src_rate,\n\t\t\tushort dst_format,\n\t\t\tbyte dst_channels,\n\t\t\tint dst_rate\n\t\t);\n\n\t\t/* stream refers to an SDL_AudioStream*, buf to a void*.\n\t\t * Only available in 2.0.7 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_AudioStreamPut(\n\t\t\tIntPtr stream,\n\t\t\tIntPtr buf,\n\t\t\tint len\n\t\t);\n\n\t\t/* stream refers to an SDL_AudioStream*, buf to a void*.\n\t\t * Only available in 2.0.7 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_AudioStreamGet(\n\t\t\tIntPtr stream,\n\t\t\tIntPtr buf,\n\t\t\tint len\n\t\t);\n\n\t\t/* stream refers to an SDL_AudioStream*.\n\t\t * Only available in 2.0.7 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_AudioStreamAvailable(IntPtr stream);\n\n\t\t/* stream refers to an SDL_AudioStream*.\n\t\t * Only available in 2.0.7 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_AudioStreamClear(IntPtr stream);\n\n\t\t/* stream refers to an SDL_AudioStream*.\n\t\t * Only available in 2.0.7 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_FreeAudioStream(IntPtr stream);\n\n\t\t/* Only available in 2.0.16 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetAudioDeviceSpec(\n\t\t\tint index,\n\t\t\tint iscapture,\n\t\t\tout SDL_AudioSpec spec\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_timer.h\n\n\t\t/* System timers rely on different OS mechanisms depending on\n\t\t * which operating system SDL2 is compiled against.\n\t\t */\n\n\t\t/* Compare tick values, return true if A has passed B. Introduced in SDL 2.0.1,\n\t\t * but does not require it (it was a macro).\n\t\t */\n\t\tpublic static bool SDL_TICKS_PASSED(UInt32 A, UInt32 B)\n\t\t{\n\t\t\treturn ((Int32)(B - A) <= 0);\n\t\t}\n\n\t\t/* Delays the thread's processing based on the milliseconds parameter */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_Delay(UInt32 ms);\n\n\t\t/* Returns the milliseconds that have passed since SDL was initialized */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt32 SDL_GetTicks();\n\n\t\t/* Returns the milliseconds that have passed since SDL was initialized\n\t\t * Only available in 2.0.18 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt64 SDL_GetTicks64();\n\n\t\t/* Get the current value of the high resolution counter */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt64 SDL_GetPerformanceCounter();\n\n\t\t/* Get the count per second of the high resolution counter */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern UInt64 SDL_GetPerformanceFrequency();\n\n\t\t/* param refers to a void* */\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate UInt32 SDL_TimerCallback(UInt32 interval, IntPtr param);\n\n\t\t/* int refers to an SDL_TimerID, param to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_AddTimer(\n\t\t\tUInt32 interval,\n\t\t\tSDL_TimerCallback callback,\n\t\t\tIntPtr param\n\t\t);\n\n\t\t/* id refers to an SDL_TimerID */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_RemoveTimer(int id);\n\n\t\t#endregion\n\n\t\t#region SDL_system.h\n\n\t\t/* Windows */\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate IntPtr SDL_WindowsMessageHook(\n\t\t\tIntPtr userdata,\n\t\t\tIntPtr hWnd,\n\t\t\tuint message,\n\t\t\tulong wParam,\n\t\t\tlong lParam\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SetWindowsMessageHook(\n\t\t\tSDL_WindowsMessageHook callback,\n\t\t\tIntPtr userdata\n\t\t);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * IntPtr refers to an IDirect3DDevice9*\n\t\t * Only available in 2.0.1 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_RenderGetD3D9Device(IntPtr renderer);\n\n\t\t/* renderer refers to an SDL_Renderer*\n\t\t * IntPtr refers to an ID3D11Device*\n\t\t * Only available in 2.0.16 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_RenderGetD3D11Device(IntPtr renderer);\n\n\t\t/* iOS */\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate void SDL_iPhoneAnimationCallback(IntPtr p);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_iPhoneSetAnimationCallback(\n\t\t\tIntPtr window, /* SDL_Window* */\n\t\t\tint interval,\n\t\t\tSDL_iPhoneAnimationCallback callback,\n\t\t\tIntPtr callbackParam\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_iPhoneSetEventPump(SDL_bool enabled);\n\n\t\t/* Android */\n\n\t\tpublic const int SDL_ANDROID_EXTERNAL_STORAGE_READ = 0x01;\n\t\tpublic const int SDL_ANDROID_EXTERNAL_STORAGE_WRITE = 0x02;\n\n\t\t/* IntPtr refers to a JNIEnv* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_AndroidGetJNIEnv();\n\n\t\t/* IntPtr refers to a jobject */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_AndroidGetActivity();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IsAndroidTV();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IsChromebook();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IsDeXMode();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_AndroidBackButton();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_AndroidGetInternalStoragePath\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_AndroidGetInternalStoragePath();\n\n\t\tpublic static string SDL_AndroidGetInternalStoragePath()\n\t\t{\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_AndroidGetInternalStoragePath()\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_AndroidGetExternalStorageState();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_AndroidGetExternalStoragePath\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_AndroidGetExternalStoragePath();\n\n\t\tpublic static string SDL_AndroidGetExternalStoragePath()\n\t\t{\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_AndroidGetExternalStoragePath()\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetAndroidSDKVersion();\n\n\t\t/* Only available in 2.0.14 or higher. */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_AndroidRequestPermission\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static unsafe extern SDL_bool INTERNAL_SDL_AndroidRequestPermission(\n\t\t\tbyte* permission\n\t\t);\n\t\tpublic static unsafe SDL_bool SDL_AndroidRequestPermission(\n\t\t\tstring permission\n\t\t) {\n\t\t\tbyte* permissionPtr = Utf8EncodeHeap(permission);\n\t\t\tSDL_bool result = INTERNAL_SDL_AndroidRequestPermission(\n\t\t\t\tpermissionPtr\n\t\t\t);\n\t\t\tMarshal.FreeHGlobal((IntPtr) permissionPtr);\n\t\t\treturn result;\n\t\t}\n\n\t\t/* Only available in 2.0.16 or higher. */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_AndroidShowToast\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static unsafe extern int INTERNAL_SDL_AndroidShowToast(\n\t\t\tbyte* message,\n\t\t\tint duration,\n\t\t\tint gravity,\n\t\t\tint xOffset,\n\t\t\tint yOffset\n\t\t);\n\t\tpublic static unsafe int SDL_AndroidShowToast(\n\t\t\tstring message,\n\t\t\tint duration,\n\t\t\tint gravity,\n\t\t\tint xOffset,\n\t\t\tint yOffset\n\t\t) {\n\t\t\tbyte* messagePtr = Utf8EncodeHeap(message);\n\t\t\tint result = INTERNAL_SDL_AndroidShowToast(\n\t\t\t\tmessagePtr,\n\t\t\t\tduration,\n\t\t\t\tgravity,\n\t\t\t\txOffset,\n\t\t\t\tyOffset\n\t\t\t);\n\t\t\tMarshal.FreeHGlobal((IntPtr) messagePtr);\n\t\t\treturn result;\n\t\t}\n\n\t\t/* WinRT */\n\n\t\tpublic enum SDL_WinRT_DeviceFamily\n\t\t{\n\t\t\tSDL_WINRT_DEVICEFAMILY_UNKNOWN,\n\t\t\tSDL_WINRT_DEVICEFAMILY_DESKTOP,\n\t\t\tSDL_WINRT_DEVICEFAMILY_MOBILE,\n\t\t\tSDL_WINRT_DEVICEFAMILY_XBOX\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_WinRT_DeviceFamily SDL_WinRTGetDeviceFamily();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_IsTablet();\n\n\t\t#endregion\n\n\t\t#region SDL_syswm.h\n\n\t\tpublic enum SDL_SYSWM_TYPE\n\t\t{\n\t\t\tSDL_SYSWM_UNKNOWN,\n\t\t\tSDL_SYSWM_WINDOWS,\n\t\t\tSDL_SYSWM_X11,\n\t\t\tSDL_SYSWM_DIRECTFB,\n\t\t\tSDL_SYSWM_COCOA,\n\t\t\tSDL_SYSWM_UIKIT,\n\t\t\tSDL_SYSWM_WAYLAND,\n\t\t\tSDL_SYSWM_MIR,\n\t\t\tSDL_SYSWM_WINRT,\n\t\t\tSDL_SYSWM_ANDROID,\n\t\t\tSDL_SYSWM_VIVANTE,\n\t\t\tSDL_SYSWM_OS2,\n\t\t\tSDL_SYSWM_HAIKU,\n\t\t\tSDL_SYSWM_KMSDRM /* requires >= 2.0.16 */\n\t\t}\n\n\t\t// FIXME: I wish these weren't public...\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_windows_wminfo\n\t\t{\n\t\t\tpublic IntPtr window; // Refers to an HWND\n\t\t\tpublic IntPtr hdc; // Refers to an HDC\n\t\t\tpublic IntPtr hinstance; // Refers to an HINSTANCE\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_winrt_wminfo\n\t\t{\n\t\t\tpublic IntPtr window; // Refers to an IInspectable*\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_x11_wminfo\n\t\t{\n\t\t\tpublic IntPtr display; // Refers to a Display*\n\t\t\tpublic IntPtr window; // Refers to a Window (XID, use ToInt64!)\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_directfb_wminfo\n\t\t{\n\t\t\tpublic IntPtr dfb; // Refers to an IDirectFB*\n\t\t\tpublic IntPtr window; // Refers to an IDirectFBWindow*\n\t\t\tpublic IntPtr surface; // Refers to an IDirectFBSurface*\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_cocoa_wminfo\n\t\t{\n\t\t\tpublic IntPtr window; // Refers to an NSWindow*\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_uikit_wminfo\n\t\t{\n\t\t\tpublic IntPtr window; // Refers to a UIWindow*\n\t\t\tpublic uint framebuffer;\n\t\t\tpublic uint colorbuffer;\n\t\t\tpublic uint resolveFramebuffer;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_wayland_wminfo\n\t\t{\n\t\t\tpublic IntPtr display; // Refers to a wl_display*\n\t\t\tpublic IntPtr surface; // Refers to a wl_surface*\n\t\t\tpublic IntPtr shell_surface; // Refers to a wl_shell_surface*\n\t\t\tpublic IntPtr egl_window; // Refers to an egl_window*, requires >= 2.0.16\n\t\t\tpublic IntPtr xdg_surface; // Refers to an xdg_surface*, requires >= 2.0.16\n\t\t\tpublic IntPtr xdg_toplevel; // Referes to an xdg_toplevel*, requires >= 2.0.18\n\t\t\tpublic IntPtr xdg_popup;\n\t\t\tpublic IntPtr xdg_positioner;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_mir_wminfo\n\t\t{\n\t\t\tpublic IntPtr connection; // Refers to a MirConnection*\n\t\t\tpublic IntPtr surface; // Refers to a MirSurface*\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_android_wminfo\n\t\t{\n\t\t\tpublic IntPtr window; // Refers to an ANativeWindow\n\t\t\tpublic IntPtr surface; // Refers to an EGLSurface\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_vivante_wminfo\n\t\t{\n\t\t\tpublic IntPtr display; // Refers to an EGLNativeDisplayType\n\t\t\tpublic IntPtr window; // Refers to an EGLNativeWindowType\n\t\t}\n\n\t\t/* Only available in 2.0.14 or higher. */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_os2_wminfo\n\t\t{\n\t\t\tpublic IntPtr hwnd; // Refers to an HWND\n\t\t\tpublic IntPtr hwndFrame; // Refers to an HWND\n\t\t}\n\n\t\t/* Only available in 2.0.16 or higher. */\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct INTERNAL_kmsdrm_wminfo\n\t\t{\n\t\t\tint dev_index;\n\t\t\tint drm_fd;\n\t\t\tIntPtr gbm_dev; // Refers to a gbm_device*\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Explicit)]\n\t\tpublic struct INTERNAL_SysWMDriverUnion\n\t\t{\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_windows_wminfo win;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_winrt_wminfo winrt;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_x11_wminfo x11;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_directfb_wminfo dfb;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_cocoa_wminfo cocoa;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_uikit_wminfo uikit;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_wayland_wminfo wl;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_mir_wminfo mir;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_android_wminfo android;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_os2_wminfo os2;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_vivante_wminfo vivante;\n\t\t\t[FieldOffset(0)]\n\t\t\tpublic INTERNAL_kmsdrm_wminfo ksmdrm;\n\t\t\t// private int dummy;\n\t\t}\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_SysWMinfo\n\t\t{\n\t\t\tpublic SDL_version version;\n\t\t\tpublic SDL_SYSWM_TYPE subsystem;\n\t\t\tpublic INTERNAL_SysWMDriverUnion info;\n\t\t}\n\n\t\t/* window refers to an SDL_Window* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_GetWindowWMInfo(\n\t\t\tIntPtr window,\n\t\t\tref SDL_SysWMinfo info\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_filesystem.h\n\n\t\t/* Only available in 2.0.1 or higher. */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetBasePath\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_SDL_GetBasePath();\n\t\tpublic static string SDL_GetBasePath()\n\t\t{\n\t\t\treturn UTF8_ToManaged(INTERNAL_SDL_GetBasePath(), true);\n\t\t}\n\n\t\t/* Only available in 2.0.1 or higher. */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_GetPrefPath\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe IntPtr INTERNAL_SDL_GetPrefPath(\n\t\t\tbyte* org,\n\t\t\tbyte* app\n\t\t);\n\t\tpublic static unsafe string SDL_GetPrefPath(string org, string app)\n\t\t{\n\t\t\tint utf8OrgBufSize = Utf8Size(org);\n\t\t\tbyte* utf8Org = stackalloc byte[utf8OrgBufSize];\n\n\t\t\tint utf8AppBufSize = Utf8Size(app);\n\t\t\tbyte* utf8App = stackalloc byte[utf8AppBufSize];\n\n\t\t\treturn UTF8_ToManaged(\n\t\t\t\tINTERNAL_SDL_GetPrefPath(\n\t\t\t\t\tUtf8Encode(org, utf8Org, utf8OrgBufSize),\n\t\t\t\t\tUtf8Encode(app, utf8App, utf8AppBufSize)\n\t\t\t\t),\n\t\t\t\ttrue\n\t\t\t);\n\t\t}\n\n\t\t#endregion\n\n\t\t#region SDL_power.h\n\n\t\tpublic enum SDL_PowerState\n\t\t{\n\t\t\tSDL_POWERSTATE_UNKNOWN = 0,\n\t\t\tSDL_POWERSTATE_ON_BATTERY,\n\t\t\tSDL_POWERSTATE_NO_BATTERY,\n\t\t\tSDL_POWERSTATE_CHARGING,\n\t\t\tSDL_POWERSTATE_CHARGED\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_PowerState SDL_GetPowerInfo(\n\t\t\tout int secs,\n\t\t\tout int pct\n\t\t);\n\n\t\t#endregion\n\n\t\t#region SDL_cpuinfo.h\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetCPUCount();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetCPUCacheLineSize();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasRDTSC();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasAltiVec();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasMMX();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_Has3DNow();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasSSE();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasSSE2();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasSSE3();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasSSE41();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasSSE42();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasAVX();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasAVX2();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasAVX512F();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasNEON();\n\n\t\t/* Only available in 2.0.1 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int SDL_GetSystemRAM();\n\n\t\t/* Only available in SDL 2.0.10 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern uint SDL_SIMDGetAlignment();\n\n\t\t/* Only available in SDL 2.0.10 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_SIMDAlloc(uint len);\n\n\t\t/* Only available in SDL 2.0.14 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_SIMDRealloc(IntPtr ptr, uint len);\n\n\t\t/* Only available in SDL 2.0.10 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void SDL_SIMDFree(IntPtr ptr);\n\n\t\t/* Only available in SDL 2.0.11 or higher. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern SDL_bool SDL_HasARMSIMD();\n\n\t\t#endregion\n\n\t\t#region SDL_locale.h\n\n\t\t[StructLayout(LayoutKind.Sequential)]\n\t\tpublic struct SDL_Locale\n\t\t{\n\t\t\tpublic IntPtr language; /* char* */\n\t\t\tpublic IntPtr country; /* char* */\n\t\t}\n\n\t\t/* IntPtr refers to an SDL_Locale*.\n\t\t * Only available in 2.0.14 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr SDL_GetPreferredLocales();\n\n\t\t#endregion\n\n\t\t#region SDL_misc.h\n\n\t\t/* Only available in 2.0.14 or higher. */\n\t\t[DllImport(nativeLibName, EntryPoint = \"SDL_OpenURL\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static unsafe extern int INTERNAL_SDL_OpenURL(byte* url);\n\t\tpublic static unsafe int SDL_OpenURL(string url)\n\t\t{\n\t\t\tbyte* urlPtr = Utf8EncodeHeap(url);\n\t\t\tint result = INTERNAL_SDL_OpenURL(urlPtr);\n\t\t\tMarshal.FreeHGlobal((IntPtr) urlPtr);\n\t\t\treturn result;\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "source/Playnite/SDL2_mixer.cs",
    "content": "#region License\n/* SDL2# - C# Wrapper for SDL2\n *\n * Copyright (c) 2013-2021 Ethan Lee.\n *\n * This software is provided 'as-is', without any express or implied warranty.\n * In no event will the authors be held liable for any damages arising from\n * the use of this software.\n *\n * Permission is granted to anyone to use this software for any purpose,\n * including commercial applications, and to alter it and redistribute it\n * freely, subject to the following restrictions:\n *\n * 1. The origin of this software must not be misrepresented; you must not\n * claim that you wrote the original software. If you use this software in a\n * product, an acknowledgment in the product documentation would be\n * appreciated but is not required.\n *\n * 2. Altered source versions must be plainly marked as such, and must not be\n * misrepresented as being the original software.\n *\n * 3. This notice may not be removed or altered from any source distribution.\n *\n * Ethan \"flibitijibibo\" Lee <flibitijibibo@flibitijibibo.com>\n *\n */\n#endregion\n\n#region Using Statements\nusing System;\nusing System.Runtime.InteropServices;\n#endregion\n\nnamespace SDL2\n{\n\tpublic static class SDL_mixer\n\t{\n\t\t#region SDL2# Variables\n\n\t\t/* Used by DllImport to load the native library. */\n\t\tprivate const string nativeLibName = \"SDL2_mixer\";\n\n\t\t#endregion\n\n\t\t#region SDL_mixer.h\n\n\t\t/* Similar to the headers, this is the version we're expecting to be\n\t\t * running with. You will likely want to check this somewhere in your\n\t\t * program!\n\t\t */\n\t\tpublic const int SDL_MIXER_MAJOR_VERSION =\t2;\n\t\tpublic const int SDL_MIXER_MINOR_VERSION =\t0;\n\t\tpublic const int SDL_MIXER_PATCHLEVEL =\t\t5;\n\n\t\t/* In C, you can redefine this value before including SDL_mixer.h.\n\t\t * We're not going to allow this in SDL2#, since the value of this\n\t\t * variable is persistent and not dependent on preprocessor ordering.\n\t\t */\n\t\tpublic const int MIX_CHANNELS = 8;\n\n\t\tpublic static readonly int MIX_DEFAULT_FREQUENCY = 44100;\n\t\tpublic static readonly ushort MIX_DEFAULT_FORMAT =\n\t\t\tBitConverter.IsLittleEndian ? SDL.AUDIO_S16LSB : SDL.AUDIO_S16MSB;\n\t\tpublic static readonly int MIX_DEFAULT_CHANNELS = 2;\n\t\tpublic static readonly byte MIX_MAX_VOLUME = 128;\n\n\t\t[Flags]\n\t\tpublic enum MIX_InitFlags\n\t\t{\n\t\t\tMIX_INIT_FLAC =\t\t0x00000001,\n\t\t\tMIX_INIT_MOD =\t\t0x00000002,\n\t\t\tMIX_INIT_MP3 =\t\t0x00000008,\n\t\t\tMIX_INIT_OGG =\t\t0x00000010,\n\t\t\tMIX_INIT_MID =\t\t0x00000020,\n\t\t\tMIX_INIT_OPUS =\t\t0x00000040\n\t\t}\n\n\t\tpublic struct MIX_Chunk\n\t\t{\n\t\t\tpublic int allocated;\n\t\t\tpublic IntPtr abuf; /* Uint8* */\n\t\t\tpublic uint alen;\n\t\t\tpublic byte volume;\n\t\t}\n\n\t\tpublic enum Mix_Fading\n\t\t{\n\t\t\tMIX_NO_FADING,\n\t\t\tMIX_FADING_OUT,\n\t\t\tMIX_FADING_IN\n\t\t}\n\n\t\tpublic enum Mix_MusicType\n\t\t{\n\t\t\tMUS_NONE,\n\t\t\tMUS_CMD,\n\t\t\tMUS_WAV,\n\t\t\tMUS_MOD,\n\t\t\tMUS_MID,\n\t\t\tMUS_OGG,\n\t\t\tMUS_MP3,\n\t\t\tMUS_MP3_MAD_UNUSED,\n\t\t\tMUS_FLAC,\n\t\t\tMUS_MODPLUG_UNUSED,\n\t\t\tMUS_OPUS\n\t\t}\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate void MixFuncDelegate(\n\t\t\tIntPtr udata, // void*\n\t\t\tIntPtr stream, // Uint8*\n\t\t\tint len\n\t\t);\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate void Mix_EffectFunc_t(\n\t\t\tint chan,\n\t\t\tIntPtr stream, // void*\n\t\t\tint len,\n\t\t\tIntPtr udata // void*\n\t\t);\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate void Mix_EffectDone_t(\n\t\t\tint chan,\n\t\t\tIntPtr udata // void*\n\t\t);\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate void MusicFinishedDelegate();\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate void ChannelFinishedDelegate(int channel);\n\n\t\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]\n\t\tpublic delegate int SoundFontDelegate(\n\t\t\tIntPtr a, // const char*\n\t\t\tIntPtr b // void*\n\t\t);\n\n\t\tpublic static void SDL_MIXER_VERSION(out SDL.SDL_version X)\n\t\t{\n\t\t\tX.major = SDL_MIXER_MAJOR_VERSION;\n\t\t\tX.minor = SDL_MIXER_MINOR_VERSION;\n\t\t\tX.patch = SDL_MIXER_PATCHLEVEL;\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"MIX_Linked_Version\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_MIX_Linked_Version();\n\t\tpublic static SDL.SDL_version MIX_Linked_Version()\n\t\t{\n\t\t\tSDL.SDL_version result;\n\t\t\tIntPtr result_ptr = INTERNAL_MIX_Linked_Version();\n\t\t\tresult = SDL.PtrToStructure<SDL.SDL_version>(\n\t\t\t\tresult_ptr\n\t\t\t);\n\t\t\treturn result;\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_Init(MIX_InitFlags flags);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_Quit();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_OpenAudio(\n\t\t\tint frequency,\n\t\t\tushort format,\n\t\t\tint channels,\n\t\t\tint chunksize\n\t\t);\r\n\r\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\r\n\t\tpublic static extern int Mix_OpenAudioDevice(\r\n\t\t\tint frequency,\r\n\t\t\tushort format,\r\n\t\t\tint channels,\r\n\t\t\tint chunksize,\r\n\t\t\tstring device,\r\n\t\t\tuint allowed_changes\r\n\t\t);\r\n\r\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_AllocateChannels(int numchans);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_QuerySpec(\n\t\t\tout int frequency,\n\t\t\tout ushort format,\n\t\t\tout int channels\n\t\t);\n\n\t\t/* src refers to an SDL_RWops*, IntPtr to a Mix_Chunk* */\n\t\t/* THIS IS A PUBLIC RWops FUNCTION! */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr Mix_LoadWAV_RW(\n\t\t\tIntPtr src,\n\t\t\tint freesrc\n\t\t);\n\r\n\t\t/* IntPtr refers to a Mix_Chunk* */\n\t\t/* This is an RWops macro in the C header. */\n\t\tpublic static IntPtr Mix_LoadWAV(string file)\n\t\t{\n\t\t\tIntPtr rwops = SDL.SDL_RWFromFile(file, \"rb\");\n\t\t\treturn Mix_LoadWAV_RW(rwops, 1);\n\t\t}\n\n\t\t/* IntPtr refers to a Mix_Music* */\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_LoadMUS\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe IntPtr INTERNAL_Mix_LoadMUS(\n\t\t\tbyte* file\n\t\t);\n\t\tpublic static unsafe IntPtr Mix_LoadMUS(string file)\n\t\t{\n\t\t\tbyte* utf8File = SDL.Utf8EncodeHeap(file);\n\t\t\tIntPtr handle = INTERNAL_Mix_LoadMUS(\n\t\t\t\tutf8File\n\t\t\t);\n\t\t\tMarshal.FreeHGlobal((IntPtr) utf8File);\n\t\t\treturn handle;\n\t\t}\n\n\t\t/* IntPtr refers to a Mix_Chunk* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr Mix_QuickLoad_WAV(\n\t\t\t[In()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U1)]\n\t\t\t\tbyte[] mem\n\t\t);\n\n\t\t/* IntPtr refers to a Mix_Chunk* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr Mix_QuickLoad_RAW(\n\t\t\t[In()] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U1, SizeParamIndex = 1)]\n\t\t\t\tbyte[] mem,\n\t\t\tuint len\n\t\t);\n\n\t\t/* chunk refers to a Mix_Chunk* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_FreeChunk(IntPtr chunk);\n\n\t\t/* music refers to a Mix_Music* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_FreeMusic(IntPtr music);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_GetNumChunkDecoders();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_GetChunkDecoder\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_Mix_GetChunkDecoder(int index);\n\t\tpublic static string Mix_GetChunkDecoder(int index)\n\t\t{\n\t\t\treturn SDL.UTF8_ToManaged(\n\t\t\t\tINTERNAL_Mix_GetChunkDecoder(index)\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_GetNumMusicDecoders();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_GetMusicDecoder\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_Mix_GetMusicDecoder(int index);\n\t\tpublic static string Mix_GetMusicDecoder(int index)\n\t\t{\n\t\t\treturn SDL.UTF8_ToManaged(\n\t\t\t\tINTERNAL_Mix_GetMusicDecoder(index)\n\t\t\t);\n\t\t}\n\n\t\t/* music refers to a Mix_Music* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern Mix_MusicType Mix_GetMusicType(IntPtr music);\n\n\t\t/* music refers to a Mix_Music*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_GetMusicTitle\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr INTERNAL_Mix_GetMusicTitle(IntPtr music);\n\t\tpublic static string Mix_GetMusicTitle(IntPtr music)\n\t\t{\n\t\t\treturn SDL.UTF8_ToManaged(\n\t\t\t\tINTERNAL_Mix_GetMusicTitle(music)\n\t\t\t);\n\t\t}\n\n\t\t/* music refers to a Mix_Music*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_GetMusicTitleTag\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr INTERNAL_Mix_GetMusicTitleTag(IntPtr music);\n\t\tpublic static string Mix_GetMusicTitleTag(IntPtr music)\n\t\t{\n\t\t\treturn SDL.UTF8_ToManaged(\n\t\t\t\tINTERNAL_Mix_GetMusicTitleTag(music)\n\t\t\t);\n\t\t}\n\n\t\t/* music refers to a Mix_Music*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_GetMusicArtistTag\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr INTERNAL_Mix_GetMusicArtistTag(IntPtr music);\n\t\tpublic static string Mix_GetMusicArtistTag(IntPtr music)\n\t\t{\n\t\t\treturn SDL.UTF8_ToManaged(\n\t\t\t\tINTERNAL_Mix_GetMusicArtistTag(music)\n\t\t\t);\n\t\t}\n\n\t\t/* music refers to a Mix_Music*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_GetMusicAlbumTag\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr INTERNAL_Mix_GetMusicAlbumTag(IntPtr music);\n\t\tpublic static string Mix_GetMusicAlbumTag(IntPtr music)\n\t\t{\n\t\t\treturn SDL.UTF8_ToManaged(\n\t\t\t\tINTERNAL_Mix_GetMusicAlbumTag(music)\n\t\t\t);\n\t\t}\n\n\t\t/* music refers to a Mix_Music*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_GetMusicCopyrightTag\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr INTERNAL_Mix_GetMusicCopyrightTag(IntPtr music);\n\t\tpublic static string Mix_GetMusicCopyrightTag(IntPtr music)\n\t\t{\n\t\t\treturn SDL.UTF8_ToManaged(\n\t\t\t\tINTERNAL_Mix_GetMusicCopyrightTag(music)\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_SetPostMix(\n\t\t\tMixFuncDelegate mix_func,\n\t\t\tIntPtr arg // void*\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_HookMusic(\n\t\t\tMixFuncDelegate mix_func,\n\t\t\tIntPtr arg // void*\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_HookMusicFinished(\n\t\t\tMusicFinishedDelegate music_finished\n\t\t);\n\n\t\t/* IntPtr refers to a void* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr Mix_GetMusicHookData();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_ChannelFinished(\n\t\t\tChannelFinishedDelegate channel_finished\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_RegisterEffect(\n\t\t\tint chan,\n\t\t\tMix_EffectFunc_t f,\n\t\t\tMix_EffectDone_t d,\n\t\t\tIntPtr arg // void*\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_UnregisterEffect(\n\t\t\tint channel,\n\t\t\tMix_EffectFunc_t f\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_UnregisterAllEffects(int channel);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_SetPanning(\n\t\t\tint channel,\n\t\t\tbyte left,\n\t\t\tbyte right\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_SetPosition(\n\t\t\tint channel,\n\t\t\tshort angle,\n\t\t\tbyte distance\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_SetDistance(int channel, byte distance);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_SetReverseStereo(int channel, int flip);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_ReserveChannels(int num);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_GroupChannel(int which, int tag);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_GroupChannels(int from, int to, int tag);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_GroupAvailable(int tag);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_GroupCount(int tag);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_GroupOldest(int tag);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_GroupNewer(int tag);\n\n\t\t/* chunk refers to a Mix_Chunk* */\n\t\tpublic static int Mix_PlayChannel(\n\t\t\tint channel,\n\t\t\tIntPtr chunk,\n\t\t\tint loops\n\t\t) {\n\t\t\treturn Mix_PlayChannelTimed(channel, chunk, loops, -1);\n\t\t}\n\n\t\t/* chunk refers to a Mix_Chunk* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_PlayChannelTimed(\n\t\t\tint channel,\n\t\t\tIntPtr chunk,\n\t\t\tint loops,\n\t\t\tint ticks\n\t\t);\n\n\t\t/* music refers to a Mix_Music* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_PlayMusic(IntPtr music, int loops);\n\n\t\t/* music refers to a Mix_Music* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_FadeInMusic(\n\t\t\tIntPtr music,\n\t\t\tint loops,\n\t\t\tint ms\n\t\t);\n\n\t\t/* music refers to a Mix_Music* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_FadeInMusicPos(\n\t\t\tIntPtr music,\n\t\t\tint loops,\n\t\t\tint ms,\n\t\t\tdouble position\n\t\t);\n\n\t\t/* chunk refers to a Mix_Chunk* */\n\t\tpublic static int Mix_FadeInChannel(\n\t\t\tint channel,\n\t\t\tIntPtr chunk,\n\t\t\tint loops,\n\t\t\tint ms\n\t\t) {\n\t\t\treturn Mix_FadeInChannelTimed(channel, chunk, loops, ms, -1);\n\t\t}\n\n\t\t/* chunk refers to a Mix_Chunk* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_FadeInChannelTimed(\n\t\t\tint channel,\n\t\t\tIntPtr chunk,\n\t\t\tint loops,\n\t\t\tint ms,\n\t\t\tint ticks\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_Volume(int channel, int volume);\n\n\t\t/* chunk refers to a Mix_Chunk* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_VolumeChunk(\n\t\t\tIntPtr chunk,\n\t\t\tint volume\n\t\t);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_VolumeMusic(int volume);\n\n\t\t/* music refers to a Mix_Music*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_GetVolumeMusicStream(IntPtr music);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_HaltChannel(int channel);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_HaltGroup(int tag);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_HaltMusic();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_ExpireChannel(int channel, int ticks);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_FadeOutChannel(int which, int ms);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_FadeOutGroup(int tag, int ms);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_FadeOutMusic(int ms);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern Mix_Fading Mix_FadingMusic();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern Mix_Fading Mix_FadingChannel(int which);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_Pause(int channel);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_Resume(int channel);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_Paused(int channel);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_PauseMusic();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_ResumeMusic();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_RewindMusic();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_PausedMusic();\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_SetMusicPosition(double position);\n\n\t\t/* music refers to a Mix_Music*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern double Mix_GetMusicPosition(IntPtr music);\n\n\t\t/* music refers to a Mix_Music*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern double Mix_MusicDuration(IntPtr music);\n\n\t\t/* music refers to a Mix_Music*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern double Mix_GetMusicLoopStartTime(IntPtr music);\n\n\t\t/* music refers to a Mix_Music*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern double Mix_GetMusicLoopEndTime(IntPtr music);\n\n\t\t/* music refers to a Mix_Music*\n\t\t * Only available in 2.0.5 or higher.\n\t\t */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern double Mix_GetMusicLoopLengthTime(IntPtr music);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_Playing(int channel);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_PlayingMusic();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_SetMusicCMD\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe int INTERNAL_Mix_SetMusicCMD(\n\t\t\tbyte* command\n\t\t);\n\t\tpublic static unsafe int Mix_SetMusicCMD(string command)\n\t\t{\n\t\t\tbyte* utf8Cmd = SDL.Utf8EncodeHeap(command);\n\t\t\tint result = INTERNAL_Mix_SetMusicCMD(\n\t\t\t\tutf8Cmd\n\t\t\t);\n\t\t\tMarshal.FreeHGlobal((IntPtr) utf8Cmd);\n\t\t\treturn result;\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_SetSynchroValue(int value);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_GetSynchroValue();\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_SetSoundFonts\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern unsafe int INTERNAL_Mix_SetSoundFonts(\n\t\t\tbyte* paths\n\t\t);\n\t\tpublic static unsafe int Mix_SetSoundFonts(string paths)\n\t\t{\n\t\t\tbyte* utf8Paths = SDL.Utf8EncodeHeap(paths);\n\t\t\tint result = INTERNAL_Mix_SetSoundFonts(\n\t\t\t\tutf8Paths\n\t\t\t);\n\t\t\tMarshal.FreeHGlobal((IntPtr) utf8Paths);\n\t\t\treturn result;\n\t\t}\n\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_GetSoundFonts\", CallingConvention = CallingConvention.Cdecl)]\n\t\tprivate static extern IntPtr INTERNAL_Mix_GetSoundFonts();\n\t\tpublic static string Mix_GetSoundFonts()\n\t\t{\n\t\t\treturn SDL.UTF8_ToManaged(\n\t\t\t\tINTERNAL_Mix_GetSoundFonts()\n\t\t\t);\n\t\t}\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_EachSoundFont(\n\t\t\tSoundFontDelegate function,\n\t\t\tIntPtr data // void*\n\t\t);\n\n\t\t/* Only available in 2.0.5 or later. */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern int Mix_SetTimidityCfg(\n\t\t\t[In()] [MarshalAs(UnmanagedType.LPStr)]\n\t\t\t\tstring path\n\t\t);\n\n\t\t/* Only available in 2.0.5 or later. */\n\t\t[DllImport(nativeLibName, EntryPoint = \"Mix_GetTimidityCfg\", CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr INTERNAL_Mix_GetTimidityCfg();\n\t\tpublic static string Mix_GetTimidityCfg()\n\t\t{\n\t\t\treturn SDL.UTF8_ToManaged(\n\t\t\t\tINTERNAL_Mix_GetTimidityCfg()\n\t\t\t);\n\t\t}\n\n\t\t/* IntPtr refers to a Mix_Chunk* */\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern IntPtr Mix_GetChunk(int channel);\n\n\t\t[DllImport(nativeLibName, CallingConvention = CallingConvention.Cdecl)]\n\t\tpublic static extern void Mix_CloseAudio();\n\n\t\tpublic static string Mix_GetError()\n\t\t{\n\t\t\treturn SDL.SDL_GetError();\n\t\t}\n\n\t\tpublic static void Mix_SetError(string fmtAndArglist)\n\t\t{\n\t\t\tSDL.SDL_SetError(fmtAndArglist);\n\t\t}\n\r\n\t\tpublic static void Mix_ClearError()\n\t\t{\n\t\t\tSDL.SDL_ClearError();\n\t\t}\n\r\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "source/Playnite/Safe Mode.bat",
    "content": "start Playnite.DesktopApp.exe --safestartup"
  },
  {
    "path": "source/Playnite/Scripting/PlayniteScript.cs",
    "content": "﻿using Playnite.Scripting.PowerShell;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Events;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Scripting\r\n{\r\n    public enum SupportedMenuMethods\r\n    {\r\n        GameMenu,\r\n        MainMenu\r\n    }\r\n\r\n    public class ScriptFunctionExport : ExtensionFunction\r\n    {\r\n        public string FunctionName\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public PlayniteScript Script\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public ScriptFunctionExport(string name, string functionName, PlayniteScript script) : base (name)\r\n        {\r\n            Name = name;\r\n            FunctionName = functionName;\r\n            Script = script;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n\r\n        public override void Invoke()\r\n        {\r\n            Script.InvokeExportedFunction(this);\r\n        }\r\n    }\r\n\r\n    public abstract class PlayniteScript: IDisposable\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        public List<ApplicationEvent> SupportedEvents { get; internal set; }\r\n        public List<SupportedMenuMethods> SupportedMenus { get; internal set; }\r\n\r\n        public string Path\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        private string name;\r\n        public string Name\r\n        {\r\n            get => name ?? System.IO.Path.GetFileName(Path);\r\n        }\r\n\r\n        public PlayniteScript(string path, string name = null)\r\n        {\r\n            Path = path;\r\n            this.name = name;\r\n        }\r\n\r\n        public virtual List<ScriptGameMenuItem> GetGameMenuItems(GetGameMenuItemsArgs args)\r\n        {\r\n            return new List<ScriptGameMenuItem>();\r\n        }\r\n\r\n        public virtual List<ScriptMainMenuItem> GetMainMenuItems(GetMainMenuItemsArgs args)\r\n        {\r\n            return new List<ScriptMainMenuItem>();\r\n        }\r\n\r\n        public static PlayniteScript FromFile(string path, string name)\r\n        {\r\n            var extension = System.IO.Path.GetExtension(path).ToLower();\r\n            if (extension == \".psm1\" || extension == \".psd1\")\r\n            {\r\n                if (PowerShellRuntime.IsInstalled)\r\n                {\r\n                    return new PowerShellScript(path, name);\r\n                }\r\n                else\r\n                {\r\n                    logger.Warn(\"Cannot load PowerShell script, PowerShell 3+ not installed.\");\r\n                    return null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new Exception(\"Cannot load script file, uknown format.\");\r\n            }\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return System.IO.Path.GetFileName(Path);\r\n        }\r\n\r\n        public virtual void Dispose()\r\n        {\r\n        }\r\n\r\n        public abstract object InvokeFunction(string functionName);\r\n        public abstract object InvokeFunction(string functionName, List<object> arguments);\r\n        public abstract void InvokeExportedFunction(ScriptFunctionExport function);\r\n        public abstract void SetVariable(string name, object value);\r\n        public abstract void OnApplicationStarted();\r\n        public abstract void OnApplicationStopped();\r\n        public abstract void OnLibraryUpdated();\r\n        public abstract void OnGameStarting(OnGameStartingEventArgs args);\r\n        public abstract void OnGameStarted(OnGameStartedEventArgs args);\r\n        public abstract void OnGameStopped(OnGameStoppedEventArgs args);\r\n        public abstract void OnGameInstalled(OnGameInstalledEventArgs args);\r\n        public abstract void OnGameInstallationCancelled(OnGameInstallationCancelledEventArgs args);\r\n        public abstract void OnGameUninstalled(OnGameUninstalledEventArgs args);\r\n        public abstract void OnGameSelected(OnGameSelectedEventArgs args);\r\n        public abstract void OnGameStartupCancelled(OnGameStartupCancelledEventArgs args);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Scripting/PowerShell/PowerShell.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Management.Automation;\r\nusing System.Management.Automation.Runspaces;\r\nusing System.Collections.ObjectModel;\r\nusing Playnite.API;\r\nusing Microsoft.Win32;\r\nusing System.IO;\r\nusing Playnite.SDK.Exceptions;\r\nusing Microsoft.PowerShell;\r\nusing Playnite.SDK;\r\nusing System.Diagnostics;\r\nusing Playnite.Native;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.Scripting.PowerShell\r\n{\r\n    public interface IPowerShellRuntime : IDisposable\r\n    {\r\n        object Execute(string script, string workDir = null, Dictionary<string, object> variables = null);\r\n        object ExecuteFile(string path, string workDir = null);\r\n        object ExecuteFile(string path, string workDir = null, Dictionary<string, object> variables = null);\r\n        void SetVariable(string name, object value);\r\n        object GetVariable(string name);\r\n        CommandInfo GetFunction(string name);\r\n        void ImportModule(string path);\r\n        object InvokeFunction(string name, List<object> arguments);\r\n    }\r\n\r\n    public class DummyPowerShellRuntime : IPowerShellRuntime\r\n    {\r\n        public DummyPowerShellRuntime()\r\n        {\r\n        }\r\n\r\n        public object Execute(string script, string workDir = null, Dictionary<string, object> variables = null)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public object ExecuteFile(string path, string workDir = null)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public object ExecuteFile(string path, string workDir = null, Dictionary<string, object> variables = null)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public void SetVariable(string name, object value)\r\n        {\r\n        }\r\n\r\n        public object GetVariable(string name)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public CommandInfo GetFunction(string name)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void ImportModule(string path)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public object InvokeFunction(string name, List<object> arguments)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n        }\r\n    }\r\n\r\n    public class PowerShellRuntime : IPowerShellRuntime\r\n    {\r\n        private static PowerShellRuntime interactiveRuntime;\r\n        private static Process interactiveProcess;\r\n\r\n        private System.Management.Automation.PowerShell powershell;\r\n        private Runspace runspace;\r\n        private PSModuleInfo module;\r\n        private InitialSessionState initialSessionState;\r\n        public bool IsDisposed { get; internal set; }\r\n\r\n        public static bool IsInstalled\r\n        {\r\n            get\r\n            {\r\n                return Registry.GetValue(@\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\PowerShell\\3\", \"Install\", null)?.ToString() == \"1\";\r\n            }\r\n        }\r\n\r\n        public PowerShellRuntime(string runspaceName)\r\n        {\r\n            if (!IsInstalled)\r\n            {\r\n                throw new Exception(\"PowerShell 5.1 is not installed.\");\r\n            }\r\n\r\n            initialSessionState = InitialSessionState.CreateDefault();\r\n            initialSessionState.ExecutionPolicy = ExecutionPolicy.Bypass;\r\n            initialSessionState.ThreadOptions = PSThreadOptions.UseCurrentThread;\r\n            powershell = System.Management.Automation.PowerShell.Create(initialSessionState);\r\n            runspace = powershell.Runspace;\r\n            runspace.Name = runspaceName;\r\n            SetVariable(\"ErrorActionPreference\", \"Stop\");\r\n            SetVariable(\"__logger\", LogManager.GetLogger(runspaceName));\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            IsDisposed = true;\r\n            runspace.Close();\r\n            runspace.Dispose();\r\n        }\r\n\r\n        public static void StartInteractiveSession(Dictionary<string, object> variables = null)\r\n        {\r\n            if (interactiveRuntime != null)\r\n            {\r\n                throw new Exception(\"Interactive session is already running\");\r\n            }\r\n\r\n            interactiveRuntime = new PowerShellRuntime(\"PSInteractive\");\r\n            variables?.ForEach(a => interactiveRuntime.SetVariable(a.Key, a.Value));\r\n            interactiveProcess = new Process();\r\n            interactiveProcess.StartInfo.FileName = @\"c:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\";\r\n\r\n            // This is really sad solution, but there's currently no way how to initialize these variables automatically, because:\r\n            // - Enter-PSHostProcess is blocking so we can't pass any command after it\r\n            // - We can't redirect stdin because then user wouldn't be able to interact witht the console\r\n            // - Messages like WM_PASTE don't work on PowerShell console\r\n            // - Passing CTLR-V and ENTER is not possible, because the only reliable method works globaly and can't be sent directly to window handle\r\n            interactiveProcess.StartInfo.Arguments = $\"-NoExit -Command \\\"\" +\r\n                $\"Write-Host \\\"`n\" +\r\n                $\"`tConnected to Playnite process.`n\" +\r\n                $\"`tUse CTLR-V and ENTER to paste commands to initialize basic SDK variables.`n\" +\r\n                $\"`tMore information at:`n\" +\r\n                $\"`thttps://playnite.link/docs/master/tutorials/extensions/scriptingDebugging.html`n\" +\r\n                $\"\\\" -ForegroundColor Green;\" +\r\n                $\"Enter-PSHostProcess -Id {Process.GetCurrentProcess().Id};\";\r\n            interactiveProcess.EnableRaisingEvents = true;\r\n            interactiveProcess.Exited += (_, __) =>\r\n            {\r\n                interactiveProcess.Dispose();\r\n                interactiveProcess = null;\r\n                interactiveRuntime.Dispose();\r\n                interactiveRuntime = null;\r\n            };\r\n\r\n            interactiveProcess.Start();\r\n            Clipboard.SetText(@\"$PlayniteRunspace = Get-Runspace -Name 'PSInteractive'\r\n$PlayniteApi = $PlayniteRunspace.SessionStateProxy.GetVariable('PlayniteApi')\r\n\");\r\n        }\r\n\r\n        public void ImportModule(string path)\r\n        {\r\n            powershell.Runspace.SessionStateProxy.Path.SetLocation(Path.GetDirectoryName(path));\r\n            module = powershell\r\n                .AddCommand(\"Import-Module\")\r\n                .AddParameter(\"PassThru\")\r\n                .AddArgument(path)\r\n                .Invoke<PSModuleInfo>().FirstOrDefault();\r\n            powershell.Streams.ClearStreams();\r\n            powershell.Commands.Clear();\r\n        }\r\n\r\n        public object Execute(string script, string workDir = null, Dictionary<string, object> variables = null)\r\n        {\r\n            if (!workDir.IsNullOrEmpty() && Directory.Exists(workDir))\r\n            {\r\n                runspace.SessionStateProxy.Path.PushCurrentLocation(\"main\");\r\n                runspace.SessionStateProxy.Path.SetLocation(WildcardPattern.Escape(workDir));\r\n            }\r\n\r\n            try\r\n            {\r\n                using (var pipe = runspace.CreatePipeline(script))\r\n                {\r\n                    if (variables != null)\r\n                    {\r\n                        foreach (var key in variables.Keys)\r\n                        {\r\n                            runspace.SessionStateProxy.SetVariable(key, variables[key]);\r\n                        }\r\n                    }\r\n\r\n                    Collection<PSObject> result = null;\r\n\r\n                    try\r\n                    {\r\n                        result = pipe.Invoke();\r\n                    }\r\n                    catch (RuntimeException e)\r\n                    {\r\n                        throw new ScriptRuntimeException(e.Message, e.ErrorRecord.ScriptStackTrace);\r\n                    }\r\n\r\n                    if (result == null)\r\n                    {\r\n                        return null;\r\n                    }\r\n                    else\r\n                    {\r\n                        if (result.Count == 1)\r\n                        {\r\n                            return result[0]?.BaseObject;\r\n                        }\r\n                        else\r\n                        {\r\n                            return result.Select(a => a?.BaseObject).ToList();\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                if (!workDir.IsNullOrEmpty() && Directory.Exists(workDir) && runspace.RunspaceStateInfo.State == RunspaceState.Opened)\r\n                {\r\n                    runspace.SessionStateProxy.Path.PopLocation(\"main\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public object ExecuteFile(string path, string workDir = null)\r\n        {\r\n            return ExecuteFile(path, workDir);\r\n        }\r\n\r\n        public object ExecuteFile(string path, string workDir = null, Dictionary<string, object> variables = null)\r\n        {\r\n            var cmd = \"& '{0}' $__FileArg\".Format(Path.GetFullPath(path));\r\n            return Execute(cmd, workDir, variables != null ? new Dictionary<string, object> { { \"__FileArg\", variables } } : null);\r\n        }\r\n\r\n        public void SetVariable(string name, object value)\r\n        {\r\n            runspace.SessionStateProxy.SetVariable(name, value);\r\n        }\r\n\r\n        public object GetVariable(string name)\r\n        {\r\n            return runspace.SessionStateProxy.GetVariable(name);\r\n        }\r\n\r\n        public CommandInfo GetFunction(string name)\r\n        {\r\n            if (module == null)\r\n            {\r\n                return null;\r\n            }\r\n            CommandInfo command;\r\n            return module.ExportedCommands.TryGetValue(name, out command) ? command : null;\r\n        }\r\n\r\n        public object InvokeFunction(string name, List<object> arguments)\r\n        {\r\n            try\r\n            {\r\n                var command = GetFunction(name);\r\n                powershell.AddCommand(command);\r\n                foreach (var argument in arguments)\r\n                {\r\n                    powershell.AddArgument(argument);\r\n                }\r\n\r\n                var result = powershell.Invoke();\r\n                if (result.Count == 1)\r\n                {\r\n                    return result[0].BaseObject;\r\n                }\r\n                else\r\n                {\r\n                    return result.Select(a => a?.BaseObject).ToList();\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                powershell.Streams.ClearStreams();\r\n                powershell.Commands.Clear();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Scripting/PowerShell/PowerShellScript.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Events;\r\nusing System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Management.Automation;\r\nusing Playnite.Common;\r\nusing Playnite.SDK.Plugins;\r\n\r\nnamespace Playnite.Scripting.PowerShell\r\n{\r\n    public class PowerShellScript : PlayniteScript\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public PowerShellRuntime Runtime { get; }\r\n\r\n        public PowerShellScript(string path, string name) : base(path, name)\r\n        {\r\n            Runtime = new PowerShellRuntime(Name);\r\n            Runtime.ImportModule(path);\r\n            SupportedEvents = GetSupportedEvents();\r\n            SupportedMenus = GetSupportedMenus();\r\n        }\r\n\r\n        public override void Dispose()\r\n        {\r\n            base.Dispose();\r\n            Runtime.Dispose();\r\n        }\r\n\r\n        public override List<ScriptGameMenuItem> GetGameMenuItems(GetGameMenuItemsArgs args)\r\n        {\r\n            if (SupportedMenus.Contains(SupportedMenuMethods.GameMenu))\r\n            {\r\n                var res = InvokeFunction(nameof(Plugin.GetGameMenuItems), new List<object> { args });\r\n                if (res is ScriptGameMenuItem item)\r\n                {\r\n                    return new List<ScriptGameMenuItem> { item };\r\n                }\r\n                else if (res is List<object> items)\r\n                {\r\n                    return items.Cast<ScriptGameMenuItem>().ToList();\r\n                }\r\n                else\r\n                {\r\n                    return base.GetGameMenuItems(args);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return base.GetGameMenuItems(args);\r\n            }\r\n        }\r\n\r\n        public override List<ScriptMainMenuItem> GetMainMenuItems(GetMainMenuItemsArgs args)\r\n        {\r\n            if (SupportedMenus.Contains(SupportedMenuMethods.MainMenu))\r\n            {\r\n                var res = InvokeFunction(nameof(Plugin.GetMainMenuItems), new List<object> { args });\r\n                if (res is ScriptMainMenuItem item)\r\n                {\r\n                    return new List<ScriptMainMenuItem> { item };\r\n                }\r\n                else if (res is List<object> items)\r\n                {\r\n                    return items.Cast<ScriptMainMenuItem>().ToList();\r\n                }\r\n                else\r\n                {\r\n                    return base.GetMainMenuItems(args);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return base.GetMainMenuItems(args);\r\n            }\r\n        }\r\n\r\n        internal List<SupportedMenuMethods> GetSupportedMenus()\r\n        {\r\n            var menus = new List<SupportedMenuMethods>();\r\n            if (Runtime.GetFunction(nameof(Plugin.GetMainMenuItems)) != null)\r\n            {\r\n                menus.Add(SupportedMenuMethods.MainMenu);\r\n            }\r\n            if (Runtime.GetFunction(nameof(Plugin.GetGameMenuItems)) != null)\r\n            {\r\n                menus.Add(SupportedMenuMethods.GameMenu);\r\n            }\r\n            return menus;\r\n        }\r\n\r\n        internal List<ApplicationEvent> GetSupportedEvents()\r\n        {\r\n            var events = new List<ApplicationEvent>();\r\n            foreach (ApplicationEvent ev in Enum.GetValues(typeof(ApplicationEvent)))\r\n            {\r\n                if (Runtime.GetFunction(ev.ToString()) != null)\r\n                {\r\n                    events.Add(ev);\r\n                }\r\n            }\r\n            return events;\r\n        }\r\n\r\n        public override void InvokeExportedFunction(ScriptFunctionExport function)\r\n        {\r\n            Runtime.Execute(function.FunctionName);\r\n        }\r\n\r\n        public override void SetVariable(string name, object value)\r\n        {\r\n            Runtime.SetVariable(name, value);\r\n        }\r\n\r\n        public override void OnApplicationStarted()\r\n        {\r\n            if (SupportedEvents.Contains(ApplicationEvent.OnApplicationStarted))\r\n            {\r\n                InvokeFunction(ApplicationEvent.OnApplicationStarted.ToString());\r\n            }\r\n        }\r\n\r\n        public override void OnApplicationStopped()\r\n        {\r\n            if (SupportedEvents.Contains(ApplicationEvent.OnApplicationStopped))\r\n            {\r\n                InvokeFunction(ApplicationEvent.OnApplicationStopped.ToString());\r\n            }\r\n        }\r\n\r\n        public override void OnLibraryUpdated()\r\n        {\r\n            if (SupportedEvents.Contains(ApplicationEvent.OnLibraryUpdated))\r\n            {\r\n                InvokeFunction(ApplicationEvent.OnLibraryUpdated.ToString());\r\n            }\r\n        }\r\n\r\n        public override void OnGameStarting(OnGameStartingEventArgs args)\r\n        {\r\n            if (SupportedEvents.Contains(ApplicationEvent.OnGameStarting))\r\n            {\r\n                InvokeFunction(ApplicationEvent.OnGameStarting.ToString(), new List<object> { args });\r\n            }\r\n        }\r\n\r\n        public override void OnGameStarted(OnGameStartedEventArgs args)\r\n        {\r\n            if (SupportedEvents.Contains(ApplicationEvent.OnGameStarted))\r\n            {\r\n                InvokeFunction(ApplicationEvent.OnGameStarted.ToString(), new List<object> { args });\r\n            }\r\n        }\r\n\r\n        public override void OnGameStopped(OnGameStoppedEventArgs args)\r\n        {\r\n            if (SupportedEvents.Contains(ApplicationEvent.OnGameStopped))\r\n            {\r\n                InvokeFunction(ApplicationEvent.OnGameStopped.ToString(), new List<object> { args });\r\n            }\r\n        }\r\n\r\n        public override void OnGameStartupCancelled(OnGameStartupCancelledEventArgs args)\r\n        {\r\n            if (SupportedEvents.Contains(ApplicationEvent.OnGameStartupCancelled))\r\n            {\r\n                InvokeFunction(ApplicationEvent.OnGameStartupCancelled.ToString(), new List<object> { args });\r\n            }\r\n        }\r\n\r\n        public override void OnGameInstalled(OnGameInstalledEventArgs args)\r\n        {\r\n            if (SupportedEvents.Contains(ApplicationEvent.OnGameInstalled))\r\n            {\r\n                InvokeFunction(ApplicationEvent.OnGameInstalled.ToString(), new List<object> { args });\r\n            }\r\n        }\r\n\r\n        public override void OnGameInstallationCancelled(OnGameInstallationCancelledEventArgs args)\r\n        {\r\n            if (SupportedEvents.Contains(ApplicationEvent.OnGameInstallationCancelled))\r\n            {\r\n                InvokeFunction(ApplicationEvent.OnGameInstallationCancelled.ToString(), new List<object> { args });\r\n            }\r\n        }\r\n\r\n        public override void OnGameUninstalled(OnGameUninstalledEventArgs args)\r\n        {\r\n            if (SupportedEvents.Contains(ApplicationEvent.OnGameUninstalled))\r\n            {\r\n                InvokeFunction(ApplicationEvent.OnGameUninstalled.ToString(), new List<object> { args });\r\n            }\r\n        }\r\n\r\n        public override void OnGameSelected(OnGameSelectedEventArgs args)\r\n        {\r\n            if (SupportedEvents.Contains(ApplicationEvent.OnGameSelected))\r\n            {\r\n                InvokeFunction(ApplicationEvent.OnGameSelected.ToString(), new List<object> { args });\r\n            }\r\n        }\r\n\r\n        public override object InvokeFunction(string functionName)\r\n        {\r\n            return Runtime.InvokeFunction(functionName, new List<object>());\r\n        }\r\n\r\n        public override object InvokeFunction(string functionName, List<object> arguments)\r\n        {\r\n            return Runtime.InvokeFunction(functionName, arguments);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/SdkHelpers.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.Extensions.Markup;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite\r\n{\r\n    public class SdkHelpers\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        public static object ResolveUiItemIcon(object icon, SynchronizationContext syncContext = null)\r\n        {\r\n            if (syncContext == null)\r\n            {\r\n                syncContext = SynchronizationContext.Current;\r\n            }\r\n\r\n            if (icon == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            try\r\n            {\r\n                if (icon is string stringIcon)\r\n                {\r\n                    var resource = ResourceProvider.GetResource(stringIcon);\r\n                    if (resource != null)\r\n                    {\r\n                        if (resource is BitmapImage bitmap)\r\n                        {\r\n                            var image = new System.Windows.Controls.Image() { Source = bitmap };\r\n                            RenderOptions.SetBitmapScalingMode(image, RenderOptions.GetBitmapScalingMode(bitmap));\r\n                            return image;\r\n                        }\r\n                        else if (resource is TextBlock textIcon)\r\n                        {\r\n                            var text = new TextBlock\r\n                            {\r\n                                Text = textIcon.Text,\r\n                                FontFamily = textIcon.FontFamily,\r\n                                FontStyle = textIcon.FontStyle\r\n                            };\r\n\r\n                            if (textIcon.ReadLocalValue(TextBlock.ForegroundProperty) != DependencyProperty.UnsetValue)\r\n                            {\r\n                                text.Foreground = textIcon.Foreground;\r\n                            }\r\n\r\n                            return text;\r\n                        }\r\n                    }\r\n                    else if (stringIcon.IsHttpUrl())\r\n                    {\r\n                        try\r\n                        {\r\n                            var cachedFile = HttpFileCache.GetWebFile(stringIcon);\r\n                            if (string.IsNullOrEmpty(cachedFile))\r\n                            {\r\n                                return null;\r\n                            }\r\n\r\n                            var image = BitmapExtensions.BitmapFromFile(cachedFile);\r\n                            Image imageObj = null;\r\n                            if (image != null)\r\n                            {\r\n                                syncContext.Send(_ =>\r\n                                {\r\n                                    imageObj = image.ToImage();\r\n                                    RenderOptions.SetBitmapScalingMode(imageObj, BitmapScalingMode.Fant);\r\n                                }, null);\r\n                            }\r\n\r\n                            return imageObj;\r\n                        }\r\n                        catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            logger.Error(exc, $\"Failed to create bitmap from {stringIcon} file.\");\r\n                            return null;\r\n                        }\r\n                    }\r\n                    else if (System.IO.File.Exists(stringIcon))\r\n                    {\r\n                        var image = BitmapExtensions.BitmapFromFile(stringIcon);\r\n                        Image imageObj = null;\r\n                        if (image != null)\r\n                        {\r\n                            syncContext.Send(_ =>\r\n                            {\r\n                                imageObj = image.ToImage();\r\n                                RenderOptions.SetBitmapScalingMode(imageObj, BitmapScalingMode.Fant);\r\n                            }, null);\r\n                        }\r\n\r\n                        return imageObj;\r\n                    }\r\n                    else\r\n                    {\r\n                        var themeFile = ThemeFile.GetFilePath(stringIcon);\r\n                        if (themeFile != null)\r\n                        {\r\n                            return Images.GetImageFromFile(themeFile, BitmapScalingMode.Fant, double.NaN, double.NaN);\r\n                        }\r\n\r\n                        var dbFile = GameDatabase.Instance.GetFileAsImage(stringIcon);\r\n                        if (dbFile != null)\r\n                        {\r\n                            return dbFile.ToImage();\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return icon;\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to get icon object.\");\r\n            }\r\n\r\n            return null;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/SelectableItem.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Collections.Specialized;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\n\r\nnamespace System\r\n{\r\n    public class NamedObject<TItem> : ObservableObject\r\n    {\r\n        public string Name { get; }\r\n        public TItem Value { get; }\r\n\r\n        public NamedObject(TItem value)\r\n        {\r\n            Value = value;\r\n            Name = value.ToString();\r\n        }\r\n\r\n        public NamedObject(TItem value, string name)\r\n        {\r\n            Value = value;\r\n            Name = name;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n\r\n        public override bool Equals(object obj)\r\n        {\r\n            return Equals(obj as NamedObject<TItem>);\r\n        }\r\n\r\n        public bool Equals(NamedObject<TItem> p)\r\n        {\r\n            if (p is null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Value.Equals(p.Value);\r\n        }\r\n\r\n        public override int GetHashCode()\r\n        {\r\n            return Value.GetHashCode();\r\n        }\r\n\r\n        public static bool operator ==(NamedObject<TItem> l, NamedObject<TItem> r)\r\n        {\r\n            if ((l is null && !(r is null)) || (!(l is null) && r is null))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (l is null && r is null)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            return l.Value.Equals(r.Value);\r\n        }\r\n\r\n        public static bool operator !=(NamedObject<TItem> l, NamedObject<TItem> r)\r\n        {\r\n            return !(l == r);\r\n        }\r\n    }\r\n\r\n    // TODO: refactor this and merge it with NamedObject and SelectableItem\r\n    public class SelectableNamedObject<TItem> : NamedObject<TItem>\r\n    {\r\n        private bool selected = false;\r\n        public bool Selected { get => selected; set => SetValue(ref selected, value); }\r\n\r\n        public SelectableNamedObject(TItem value) : base(value)\r\n        {\r\n        }\r\n\r\n        public SelectableNamedObject(TItem value, string name) : base(value, name)\r\n        {\r\n        }\r\n\r\n        public SelectableNamedObject(TItem value, string name, bool selected) : base(value, name)\r\n        {\r\n            Selected = selected;\r\n        }\r\n    }\r\n\r\n    // TODO: refactor this and merge it with NamedObject and SelectableNamedObject\r\n    public class SelectableItem<TItem> : ObservableObject\r\n    {\r\n        private bool? selected = false;\r\n        public bool? Selected\r\n        {\r\n            get => selected;\r\n            set\r\n            {\r\n                selected = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private TItem item;\r\n        public TItem Item\r\n        {\r\n            get => item;\r\n            set\r\n            {\r\n                item = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public SelectableItem(TItem item)\r\n        {\r\n            this.item = item;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Item?.ToString() ?? base.ToString();\r\n        }\r\n    }\r\n\r\n    public class SelectableObjectList<TItem> : ObservableObject, ICollection<SelectableItem<TItem>>, INotifyCollectionChanged\r\n    {\r\n        internal readonly List<SelectableItem<TItem>> Items;\r\n\r\n        public int Count => Items.Count;\r\n\r\n        public bool IsReadOnly => true;\r\n\r\n        public string AsString => ToString();\r\n\r\n        public event EventHandler SelectionChanged;\r\n\r\n        public event NotifyCollectionChangedEventHandler CollectionChanged;\r\n\r\n        public SelectableObjectList(\r\n            IEnumerable<TItem> collection,\r\n            IEnumerable<TItem> selected = null)\r\n        {\r\n            if (collection.HasItems())\r\n            {\r\n                Items = new List<SelectableItem<TItem>>(collection.Select(a =>\r\n                {\r\n                    var newItem = new SelectableItem<TItem>(a);\r\n                    newItem.Selected = selected?.Contains(a) == true;\r\n                    newItem.PropertyChanged += NewItem_PropertyChanged;\r\n                    return newItem;\r\n                }));\r\n            }\r\n            else\r\n            {\r\n                Items = new List<SelectableItem<TItem>>();\r\n            }\r\n        }\r\n\r\n        internal virtual void OnSelectionChanged()\r\n        {\r\n            OnPropertyChanged(nameof(AsString));\r\n            SelectionChanged?.Invoke(this, EventArgs.Empty);\r\n        }\r\n\r\n        internal void OnCollectionChanged()\r\n        {\r\n            CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));\r\n        }\r\n\r\n        internal void NewItem_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(SelectableItem<TItem>.Selected))\r\n            {\r\n                if (!SuppressNotifications)\r\n                {\r\n                    OnSelectionChanged();\r\n                }\r\n            }\r\n        }\r\n\r\n        public void SetSelection(IEnumerable<TItem> toSelect)\r\n        {\r\n            SuppressNotifications = true;\r\n            if (toSelect?.Any() == true)\r\n            {\r\n                foreach (var item in Items)\r\n                {\r\n                    item.Selected = toSelect?.Contains(item.Item) == true;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                Items.ForEach(a => a.Selected = false);\r\n            }\r\n\r\n            SuppressNotifications = false;\r\n            OnSelectionChanged();\r\n        }\r\n\r\n        public List<TItem> GetSelectedItems()\r\n        {\r\n            return Items.Where(a => a.Selected == true).Select(a => a.Item).ToList();\r\n        }\r\n\r\n        public void Add(TItem item, bool selected = false)\r\n        {\r\n            if (Items.Any(a => a.Item.Equals(item)))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var newItem = new SelectableItem<TItem>(item)\r\n            {\r\n                Selected = selected\r\n            };\r\n            newItem.PropertyChanged += NewItem_PropertyChanged;\r\n            Items.Add(newItem);\r\n            OnCollectionChanged();\r\n            if (selected)\r\n            {\r\n                OnSelectionChanged();\r\n            }\r\n        }\r\n\r\n        public virtual void SetItems(IEnumerable<TItem> items, IEnumerable<TItem> selected = null)\r\n        {\r\n            SuppressNotifications = true;\r\n            var oldSelection = GetSelectedItems();\r\n            foreach (var item in Items)\r\n            {\r\n                item.PropertyChanged -= NewItem_PropertyChanged;\r\n            }\r\n\r\n            Items.Clear();\r\n            if (items.HasItems())\r\n            {\r\n                foreach (var item in items)\r\n                {\r\n                    var newItem = new SelectableItem<TItem>(item)\r\n                    {\r\n                        Selected = selected?.Contains(item) == true\r\n                    };\r\n\r\n                    newItem.PropertyChanged += NewItem_PropertyChanged;\r\n                    Items.Add(newItem);\r\n                }\r\n            }\r\n\r\n            SuppressNotifications = false;\r\n            OnCollectionChanged();\r\n            if (!oldSelection.IsListEqual(GetSelectedItems()))\r\n            {\r\n                OnSelectionChanged();\r\n            }\r\n        }\r\n\r\n        public void Add(SelectableItem<TItem> item)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public bool Remove(SelectableItem<TItem> item)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public bool Contains(SelectableItem<TItem> item)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void CopyTo(SelectableItem<TItem>[] array, int arrayIndex)\r\n        {\r\n            Items.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        public IEnumerator<SelectableItem<TItem>> GetEnumerator()\r\n        {\r\n            return Items.GetEnumerator();\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return Items.GetEnumerator();\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return string.Join(\", \", this.Where(a => a.Selected == true).Select(a => a.Item.ToString()));\r\n        }\r\n    }\r\n\r\n    public class SelectableStringList : SelectableObjectList<string>\r\n    {\r\n        private readonly bool includeNoneItem;\r\n\r\n        public SelectableStringList(\r\n            IEnumerable<string> collection,\r\n            IEnumerable<string> selected = null,\r\n            bool includeNoneItem = false) : base(collection, selected)\r\n        {\r\n            this.includeNoneItem = includeNoneItem;\r\n            if (includeNoneItem)\r\n            {\r\n                var newItem = new SelectableItem<string>(Playnite.FilterSettings.MissingFieldString);\r\n                newItem.PropertyChanged += NewItem_PropertyChanged;\r\n                Items.Insert(0, newItem);\r\n            }\r\n        }\r\n\r\n        public override void SetItems(IEnumerable<string> items, IEnumerable<string> selected = null)\r\n        {\r\n            SuppressNotifications = true;\r\n            var oldSelection = GetSelectedItems();\r\n            foreach (var item in Items)\r\n            {\r\n                item.PropertyChanged -= NewItem_PropertyChanged;\r\n            }\r\n\r\n            Items.Clear();\r\n\r\n            if (includeNoneItem)\r\n            {\r\n                var newItem = new SelectableItem<string>(Playnite.FilterSettings.MissingFieldString);\r\n                newItem.PropertyChanged += NewItem_PropertyChanged;\r\n                Items.Add(newItem);\r\n            }\r\n\r\n            foreach (var item in items)\r\n            {\r\n                var newItem = new SelectableItem<string>(item)\r\n                {\r\n                    Selected = selected?.Contains(item) == true\r\n                };\r\n\r\n                newItem.PropertyChanged += NewItem_PropertyChanged;\r\n                Items.Add(newItem);\r\n            }\r\n\r\n            SuppressNotifications = false;\r\n            OnCollectionChanged();\r\n            if (!oldSelection.IsListEqual(GetSelectedItems()))\r\n            {\r\n                OnSelectionChanged();\r\n            }\r\n        }\r\n    }\r\n\r\n    public abstract class SelectableIdItemList : ObservableObject\r\n    {\r\n        public event EventHandler SelectionChanged;\r\n        public abstract string AsString { get; }\r\n        public abstract List<Guid> GetSelectedIds();\r\n        public abstract void SetSelection(IEnumerable<Guid> toSelect);\r\n\r\n        internal virtual void OnSelectionChanged()\r\n        {\r\n            OnPropertyChanged(nameof(AsString));\r\n            SelectionChanged?.Invoke(this, EventArgs.Empty);\r\n        }\r\n    }\r\n\r\n    public class SelectableIdItemList<TItem> : SelectableIdItemList, ICollection<SelectableItem<TItem>>\r\n    {\r\n        private readonly Func<TItem, Guid> idSelector;\r\n        internal readonly List<SelectableItem<TItem>> Items;\r\n        public event NotifyCollectionChangedEventHandler CollectionChanged;\r\n\r\n        public override string AsString\r\n        {\r\n            get => ToString();\r\n        }\r\n\r\n        public SelectableIdItemList(\r\n            IEnumerable<TItem> collection,\r\n            Func<TItem, Guid> idSelector,\r\n            IEnumerable<Guid> selected = null,\r\n            IEnumerable<Guid> undetermined = null)\r\n        {\r\n            this.idSelector = idSelector;\r\n            Items = new List<SelectableItem<TItem>>(collection.Select(a =>\r\n            {\r\n                var newItem = new SelectableItem<TItem>(a);\r\n                if (selected?.Contains(idSelector(a)) == true)\r\n                {\r\n                    newItem.Selected = true;\r\n                }\r\n                else if (undetermined?.Contains(idSelector(a)) == true)\r\n                {\r\n                    newItem.Selected = null;\r\n                }\r\n                else\r\n                {\r\n                    newItem.Selected = false;\r\n                }\r\n\r\n                newItem.PropertyChanged += NewItem_PropertyChanged;\r\n                return newItem;\r\n            }));\r\n        }\r\n\r\n        internal void NewItem_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(SelectableItem<DatabaseObject>.Selected))\r\n            {\r\n                if (!SuppressNotifications)\r\n                {\r\n                    OnSelectionChanged();\r\n                }\r\n            }\r\n        }\r\n\r\n        public override void SetSelection(IEnumerable<Guid> toSelect)\r\n        {\r\n            SuppressNotifications = true;\r\n            if (toSelect?.Any() == true)\r\n            {\r\n                foreach (var item in Items)\r\n                {\r\n                    item.Selected = toSelect?.Contains(idSelector(item.Item)) == true;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                Items.ForEach(a => a.Selected = false);\r\n            }\r\n\r\n            SuppressNotifications = false;\r\n            OnSelectionChanged();\r\n        }\r\n\r\n        public override List<Guid> GetSelectedIds()\r\n        {\r\n            return Items.Where(a => a.Selected == true).Select(a => idSelector(a.Item)).ToList();\r\n        }\r\n\r\n        public int Count => Items.Count;\r\n\r\n        public bool IsReadOnly => true;\r\n\r\n        public void Add(SelectableItem<TItem> item)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void Clear()\r\n        {\r\n            foreach (var item in Items)\r\n            {\r\n                item.PropertyChanged -= NewItem_PropertyChanged;\r\n            }\r\n\r\n            Items.Clear();\r\n            OnSelectionChanged();\r\n            OnCollectionChanged();\r\n        }\r\n\r\n        public bool Contains(SelectableItem<TItem> item)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public void CopyTo(SelectableItem<TItem>[] array, int arrayIndex)\r\n        {\r\n            Items.CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        public bool Remove(SelectableItem<TItem> item)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public IEnumerator<SelectableItem<TItem>> GetEnumerator()\r\n        {\r\n            return Items.GetEnumerator();\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return Items.GetEnumerator();\r\n        }\r\n\r\n        internal void OnCollectionChanged()\r\n        {\r\n            CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return string.Join(\", \", this.Where(a => a.Selected == true).Select(a => a.Item.ToString()));\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// TODO: Reworkd this whole thing with CollectionView, this should be just data holder...\r\n    /// </summary>\r\n    public class SelectableDbItemList : SelectableIdItemList<DatabaseObject>, INotifyCollectionChanged\r\n    {\r\n        private readonly bool includeNoneItem;\r\n\r\n        private bool showSelectedOnly = false;\r\n        public bool ShowSelectedOnly\r\n        {\r\n            get\r\n            {\r\n                return showSelectedOnly;\r\n            }\r\n\r\n            set\r\n            {\r\n                showSelectedOnly = value;\r\n                OnPropertyChanged();\r\n                CollectionView?.Refresh();\r\n            }\r\n        }\r\n\r\n        private string searchText = string.Empty;\r\n        public string SearchText\r\n        {\r\n            get\r\n            {\r\n                return searchText;\r\n            }\r\n\r\n            set\r\n            {\r\n                searchText = value;\r\n                OnPropertyChanged();\r\n                CollectionView?.Refresh();\r\n            }\r\n        }\r\n\r\n        private ListCollectionView collectionView;\r\n        public ListCollectionView CollectionView\r\n        {\r\n            get => collectionView;\r\n            private set\r\n            {\r\n                collectionView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public SelectableDbItemList(\r\n            IEnumerable<DatabaseObject> collection,\r\n            IEnumerable<Guid> selected = null,\r\n            IEnumerable<Guid> undetermined = null,\r\n            bool includeNoneItem = false)\r\n            : base(collection.OrderBy(a => a.Name), (a) => a.Id, selected, undetermined)\r\n        {\r\n            this.includeNoneItem = includeNoneItem;\r\n            if (includeNoneItem)\r\n            {\r\n                var newItem = new SelectableItem<DatabaseObject>(new DatabaseObject()\r\n                {\r\n                    Id = Guid.Empty,\r\n                    Name = ResourceProvider.GetString(\"LOCNone\")\r\n                })\r\n                {\r\n                    Selected = selected?.Contains(Guid.Empty) == true\r\n                };\r\n                newItem.PropertyChanged += NewItem_PropertyChanged;\r\n                Items.Insert(0, newItem);\r\n            }\r\n\r\n            CollectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(Items);\r\n            CollectionView.Filter = CollectionViewFilter;\r\n            CollectionView.SortDescriptions.Add(new SortDescription(\"Item.Name\", ListSortDirection.Ascending));\r\n        }\r\n\r\n        public void Add(DatabaseObject item, bool selected = false)\r\n        {\r\n            var existing = Items.FirstOrDefault(a => a.Item.Id == item.Id);\r\n            if (existing != null)\r\n            {\r\n                if (selected)\r\n                {\r\n                    existing.Selected = true;\r\n                }\r\n            }\r\n\r\n            var newItem = new SelectableItem<DatabaseObject>(item)\r\n            {\r\n                Selected = selected\r\n            };\r\n            newItem.PropertyChanged += NewItem_PropertyChanged;\r\n            Items.Add(newItem);\r\n            OnCollectionChanged();\r\n            if (selected)\r\n            {\r\n                OnSelectionChanged();\r\n            }\r\n\r\n            CollectionView?.Refresh();\r\n        }\r\n\r\n        public void SetItems(IEnumerable<DatabaseObject> items, IEnumerable<Guid> selected = null)\r\n        {\r\n            SuppressNotifications = true;\r\n            var oldSelection = GetSelectedIds();\r\n            foreach (var item in Items)\r\n            {\r\n                item.PropertyChanged -= NewItem_PropertyChanged;\r\n            }\r\n\r\n            Items.Clear();\r\n\r\n            if (includeNoneItem)\r\n            {\r\n                var noneItem = new SelectableItem<DatabaseObject>(new DatabaseObject()\r\n                {\r\n                    Id = Guid.Empty,\r\n                    Name = ResourceProvider.GetString(\"LOCNone\")\r\n                })\r\n                {\r\n                    Selected = selected?.Contains(Guid.Empty) == true\r\n                };\r\n\r\n                noneItem.PropertyChanged += NewItem_PropertyChanged;\r\n                Items.Add(noneItem);\r\n            }\r\n\r\n            foreach (var item in items.OrderBy(a => a.Name))\r\n            {\r\n                var newItem = new SelectableItem<DatabaseObject>(item)\r\n                {\r\n                    Selected = selected?.Contains(item.Id) == true\r\n                };\r\n\r\n                newItem.PropertyChanged += NewItem_PropertyChanged;\r\n                Items.Add(newItem);\r\n            }\r\n\r\n            SuppressNotifications = false;\r\n            OnCollectionChanged();\r\n            if (!oldSelection.IsListEqual(GetSelectedIds()))\r\n            {\r\n                OnSelectionChanged();\r\n            }\r\n\r\n            CollectionView?.Refresh();\r\n        }\r\n\r\n        public bool Remove(DatabaseObject item)\r\n        {\r\n            var listItem = Items.FirstOrDefault(a => a.Item.Id == item.Id);\r\n            if (listItem == null)\r\n            {\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                listItem.PropertyChanged -= NewItem_PropertyChanged;\r\n                Items.Remove(listItem);\r\n                if (listItem.Selected == true)\r\n                {\r\n                    OnSelectionChanged();\r\n                }\r\n\r\n                OnCollectionChanged();\r\n                CollectionView?.Refresh();\r\n                return true;\r\n            }\r\n        }\r\n\r\n        public bool ContainsId(Guid id)\r\n        {\r\n            return Items.Any(a => a.Item.Id == id);\r\n        }\r\n\r\n        public bool ContainsIds(IEnumerable<Guid> ids)\r\n        {\r\n            return Items.Select(a => a.Item.Id).Contains(ids);\r\n        }\r\n\r\n        private bool CollectionViewFilter(object item)\r\n        {\r\n            var entry = (SelectableItem<DatabaseObject>)item;\r\n            return (ShowSelectedOnly ? entry.Selected == true : true) && entry.Item.Name.Contains(SearchText, StringComparison.OrdinalIgnoreCase);\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return string.Join(\", \", this.Where(a => a.Selected == true).Select(a => a.Item.Name));\r\n        }\r\n    }\r\n\r\n    public class SelectableLibraryPluginList : SelectableIdItemList<LibraryPlugin>\r\n    {\r\n        public SelectableLibraryPluginList(IEnumerable<LibraryPlugin> collection, IEnumerable<Guid> selected = null)\r\n            : base(collection, (a) => a.Id, selected)\r\n        {\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return string.Join(\", \", this.Where(a => a.Selected == true).Select(a => a.Item.Name));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Services/BaseServicesClient.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Data;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Net.Http;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Serialization = Playnite.SDK.Data.Serialization;\r\n\r\nnamespace Playnite.Services\r\n{\r\n    public class BaseServicesClient\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public readonly string Endpoint;\r\n\r\n        public HttpClient HttpClient = new HttpClient()\r\n        {\r\n            Timeout = new TimeSpan(0, 0, 60)\r\n        };\r\n\r\n        public BaseServicesClient(string endpoint, Version playniteVersion)\r\n        {\r\n            Endpoint = endpoint.TrimEnd('/');\r\n            HttpClient.DefaultRequestHeaders.Add(\"Playnite-Version\", playniteVersion.ToString(4));\r\n        }\r\n\r\n        public T ExecuteGetRequest<T>(string subUrl)\r\n        {\r\n            var url = Uri.EscapeUriString(Endpoint + subUrl);\r\n            var strResult = HttpClient.GetStringAsync(url).GetAwaiter().GetResult();\r\n            var result = Serialization.FromJson<ServicesResponse<T>>(strResult);\r\n\r\n            if (!string.IsNullOrEmpty(result.Error))\r\n            {\r\n                logger.Error(\"Service request error by proxy: \" + result.Error);\r\n                throw new Exception(result.Error);\r\n            }\r\n\r\n            return result.Data;\r\n        }\r\n\r\n        public T ExecutePostRequest<T>(string subUrl, string jsonContent)\r\n        {\r\n            var url = Uri.EscapeUriString(Endpoint + subUrl);\r\n            var content = new StringContent(jsonContent, Encoding.UTF8, \"application/json\");\r\n            var response = HttpClient.PostAsync(url, content).GetAwaiter().GetResult();\r\n            var strResult = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();\r\n            var result = Serialization.FromJson<ServicesResponse<T>>(strResult);\r\n\r\n            if (!string.IsNullOrEmpty(result.Error))\r\n            {\r\n                logger.Error(\"Service request error by proxy: \" + result.Error);\r\n                throw new Exception(result.Error);\r\n            }\r\n\r\n            return result.Data;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Services/GenericResponse.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Services\r\n{\r\n    public class GenericResponse\r\n    {\r\n        public string Error\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public object Data\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public GenericResponse()\r\n        {\r\n\r\n        }\r\n\r\n        public GenericResponse(object data, string error)\r\n        {\r\n            Data = data;\r\n            Error = error;\r\n        }\r\n    }\r\n\r\n    public class ServicesResponse<T>\r\n    {\r\n        public string Error\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public T Data\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public ServicesResponse(T data, string error)\r\n        {\r\n            Data = data;\r\n            Error = error;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Services/ServicesClient.cs",
    "content": "﻿using Microsoft.Win32;\r\nusing Newtonsoft.Json;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Configuration;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Net.Http;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Services\r\n{\r\n    public class ServicesClient : BaseServicesClient\r\n    {\r\n        public class RecommendedAddons\r\n        {\r\n            public Dictionary<string, string> Libraries { get; set; }\r\n            public Dictionary<string, string> Generic { get; set; }\r\n        }\r\n\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public ServicesClient() : this(ConfigurationManager.AppSettings[\"ServicesUrl\"])\r\n        {\r\n        }\r\n\r\n        public ServicesClient(string endpoint) : base(endpoint, Updater.CurrentVersion)\r\n        {\r\n        }\r\n\r\n        public List<string> GetPatrons()\r\n        {\r\n            return ExecuteGetRequest<List<string>>(\"/patreon/patrons\");\r\n        }\r\n\r\n        public Guid UploadDiagPackage(string diagPath)\r\n        {\r\n            using (var fs = new FileStream(diagPath, FileMode.Open))\r\n            {\r\n                using (var content = new StreamContent(fs))\r\n                {\r\n                    var response = HttpClient.PostAsync(Endpoint + \"/playnite/diag\", content).GetAwaiter().GetResult();\r\n                    var strResult = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();\r\n                    var result = JsonConvert.DeserializeObject<ServicesResponse<Guid>>(strResult);\r\n                    if (!string.IsNullOrEmpty(result.Error))\r\n                    {\r\n                        logger.Error(\"Service request error by proxy: \" + result.Error);\r\n                        throw new Exception(result.Error);\r\n                    }\r\n\r\n                    return result.Data;\r\n                }\r\n            }\r\n        }\r\n\r\n        public List<AddonManifest> GetAllAddons(AddonType type, string searchTerm)\r\n        {\r\n            return ExecuteGetRequest<List<AddonManifest>>($\"/addons?type={type}&searchTerm={searchTerm}\".UrlEncode());\r\n        }\r\n\r\n        public AddonManifest GetAddon(string addonId)\r\n        {\r\n            return ExecuteGetRequest<List<AddonManifest>>($\"/addons?addonId={addonId}\".UrlEncode()).FirstOrDefault();\r\n        }\r\n\r\n        public AddonInstallerManifest GetAddonInstaller(string addonId)\r\n        {\r\n            return ExecuteGetRequest<AddonInstallerManifest>($\"/addons/installer?addonId={addonId}\".UrlEncode());\r\n        }\r\n\r\n        public string[] GetAddonBlacklist()\r\n        {\r\n            return ExecuteGetRequest<string[]>(\"/addons/blacklist\") ?? new string[0];\r\n        }\r\n\r\n        public RecommendedAddons GetDefaultExtensions()\r\n        {\r\n            var stringData = ExecuteGetRequest<string>(\"/addons/defaultextensions\");\r\n            if (stringData.IsNullOrEmpty())\r\n            {\r\n                return new RecommendedAddons();\r\n            }\r\n            else\r\n            {\r\n                return Serialization.FromJson<RecommendedAddons>(stringData);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Settings/AutoClientShutdownSettings.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class AutoClientShutdownSettings : ObservableObject\r\n    {\r\n        private uint graceTimeout = 60;\r\n        public uint GraceTimeout\r\n        {\r\n            get => graceTimeout;\r\n            set\r\n            {\r\n                graceTimeout = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private uint minimalSessionTime = 120;\r\n        public uint MinimalSessionTime\r\n        {\r\n            get => minimalSessionTime;\r\n            set\r\n            {\r\n                minimalSessionTime = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool shutdownClients = false;\r\n        public bool ShutdownClients\r\n        {\r\n            get => shutdownClients;\r\n            set\r\n            {\r\n                shutdownClients = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> shutdownPlugins = new List<Guid>();\r\n        public List<Guid> ShutdownPlugins\r\n        {\r\n            get => shutdownPlugins;\r\n            set\r\n            {\r\n                shutdownPlugins = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Settings/DetailsVisibilitySettings.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class DetailsVisibilitySettings : ObservableObject\r\n    {\r\n        private bool library = true;\r\n        public bool Library\r\n        {\r\n            get\r\n            {\r\n                return library;\r\n            }\r\n\r\n            set\r\n            {\r\n                library = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool playTime = true;\r\n        public bool PlayTime\r\n        {\r\n            get\r\n            {\r\n                return playTime;\r\n            }\r\n\r\n            set\r\n            {\r\n                playTime = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool installSize = true;\r\n        public bool InstallSize\r\n        {\r\n            get\r\n            {\r\n                return installSize;\r\n            }\r\n\r\n            set\r\n            {\r\n                installSize = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool installDirectory = true;\r\n        public bool InstallDirectory\r\n        {\r\n            get\r\n            {\r\n                return installDirectory;\r\n            }\r\n\r\n            set\r\n            {\r\n                installDirectory = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool lastPlayed = false;\r\n        public bool LastPlayed\r\n        {\r\n            get\r\n            {\r\n                return lastPlayed;\r\n            }\r\n\r\n            set\r\n            {\r\n                lastPlayed = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool added = false;\r\n        public bool Added\r\n        {\r\n            get\r\n            {\r\n                return added;\r\n            }\r\n\r\n            set\r\n            {\r\n                added = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool recentActivity = true;\r\n        public bool RecentActivity\r\n        {\r\n            get\r\n            {\r\n                return recentActivity;\r\n            }\r\n\r\n            set\r\n            {\r\n                recentActivity = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool completionStatus = false;\r\n        public bool CompletionStatus\r\n        {\r\n            get\r\n            {\r\n                return completionStatus;\r\n            }\r\n\r\n            set\r\n            {\r\n                completionStatus = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool icon = false;\r\n        public bool Icon\r\n        {\r\n            get\r\n            {\r\n                return icon;\r\n            }\r\n\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool coverImage = true;\r\n        public bool CoverImage\r\n        {\r\n            get\r\n            {\r\n                return coverImage;\r\n            }\r\n\r\n            set\r\n            {\r\n                coverImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool backgroundImage = true;\r\n        public bool BackgroundImage\r\n        {\r\n            get\r\n            {\r\n                return backgroundImage;\r\n            }\r\n\r\n            set\r\n            {\r\n                backgroundImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool platform = true;\r\n        public bool Platform\r\n        {\r\n            get\r\n            {\r\n                return platform;\r\n            }\r\n\r\n            set\r\n            {\r\n                platform = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool genres = true;\r\n        public bool Genres\r\n        {\r\n            get\r\n            {\r\n                return genres;\r\n            }\r\n\r\n            set\r\n            {\r\n                genres = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool developers = true;\r\n        public bool Developers\r\n        {\r\n            get\r\n            {\r\n                return developers;\r\n            }\r\n\r\n            set\r\n            {\r\n                developers = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool publishers = true;\r\n        public bool Publishers\r\n        {\r\n            get\r\n            {\r\n                return publishers;\r\n            }\r\n\r\n            set\r\n            {\r\n                publishers = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool releaseDate = true;\r\n        public bool ReleaseDate\r\n        {\r\n            get\r\n            {\r\n                return releaseDate;\r\n            }\r\n\r\n            set\r\n            {\r\n                releaseDate = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool categories = true;\r\n        public bool Categories\r\n        {\r\n            get\r\n            {\r\n                return categories;\r\n            }\r\n\r\n            set\r\n            {\r\n                categories = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool tags = true;\r\n        public bool Tags\r\n        {\r\n            get\r\n            {\r\n                return tags;\r\n            }\r\n\r\n            set\r\n            {\r\n                tags = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool links = true;\r\n        public bool Links\r\n        {\r\n            get\r\n            {\r\n                return links;\r\n            }\r\n\r\n            set\r\n            {\r\n                links = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool description = true;\r\n        public bool Description\r\n        {\r\n            get\r\n            {\r\n                return description;\r\n            }\r\n\r\n            set\r\n            {\r\n                description = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool ageRating = false;\r\n        public bool AgeRating\r\n        {\r\n            get\r\n            {\r\n                return ageRating;\r\n            }\r\n\r\n            set\r\n            {\r\n                ageRating = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool series = false;\r\n        public bool Series\r\n        {\r\n            get\r\n            {\r\n                return series;\r\n            }\r\n\r\n            set\r\n            {\r\n                series = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool source = false;\r\n        public bool Source\r\n        {\r\n            get\r\n            {\r\n                return source;\r\n            }\r\n\r\n            set\r\n            {\r\n                source = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool region = false;\r\n        public bool Region\r\n        {\r\n            get\r\n            {\r\n                return region;\r\n            }\r\n\r\n            set\r\n            {\r\n                region = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool version = false;\r\n        public bool Version\r\n        {\r\n            get\r\n            {\r\n                return version;\r\n            }\r\n\r\n            set\r\n            {\r\n                version = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool communityScore = false;\r\n        public bool CommunityScore\r\n        {\r\n            get\r\n            {\r\n                return communityScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                communityScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool criticScore = false;\r\n        public bool CriticScore\r\n        {\r\n            get\r\n            {\r\n                return criticScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                criticScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool userScore = false;\r\n        public bool UserScore\r\n        {\r\n            get\r\n            {\r\n                return userScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                userScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool features = true;\r\n        public bool Features\r\n        {\r\n            get\r\n            {\r\n                return features;\r\n            }\r\n\r\n            set\r\n            {\r\n                features = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool notes = true;\r\n        public bool Notes\r\n        {\r\n            get\r\n            {\r\n                return notes;\r\n            }\r\n\r\n            set\r\n            {\r\n                notes = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool name = true;\r\n        public bool Name\r\n        {\r\n            get\r\n            {\r\n                return name;\r\n            }\r\n\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Settings/FilterSettings.cs",
    "content": "﻿using System;\r\nusing System.Collections.Concurrent;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Newtonsoft.Json;\r\nusing Playnite.Common;\r\nusing SdkModels = Playnite.SDK.Models;\r\n\r\nnamespace Playnite\r\n{\r\n    public class FilterChangedEventArgs : EventArgs\r\n    {\r\n        public List<string> Fields\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public FilterChangedEventArgs()\r\n        {\r\n        }\r\n\r\n        public FilterChangedEventArgs(List<string> fields)\r\n        {\r\n            Fields = fields;\r\n        }\r\n    }\r\n\r\n    public class StringFilterItemProperties : ObservableObject\r\n    {\r\n        [JsonIgnore]\r\n        public bool IsSet => Values.HasNonEmptyItems();\r\n\r\n        private List<string> values;\r\n        public List<string> Values\r\n        {\r\n            get => values;\r\n            set\r\n            {\r\n                values = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(IsSet));\r\n            }\r\n        }\r\n\r\n        public StringFilterItemProperties()\r\n        {\r\n        }\r\n\r\n        public StringFilterItemProperties(List<string> values)\r\n        {\r\n            Values = values;\r\n        }\r\n\r\n        public StringFilterItemProperties(string value)\r\n        {\r\n            Values = new List<string>() { value };\r\n        }\r\n\r\n        public bool Equals(StringFilterItemProperties obj)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Values.IsListEqual(obj?.Values);\r\n        }\r\n\r\n        public bool Equals(SdkModels.StringFilterItemProperties obj)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Values.IsListEqual(obj?.Values);\r\n        }\r\n\r\n        public SdkModels.StringFilterItemProperties ToSdkModel()\r\n        {\r\n            if (Values.HasItems())\r\n            {\r\n                return new SdkModels.StringFilterItemProperties(Values);\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static StringFilterItemProperties FromSdkModel(SdkModels.StringFilterItemProperties sdk)\r\n        {\r\n            if (sdk != null)\r\n            {\r\n                if (sdk.Values.HasItems())\r\n                {\r\n                    return new StringFilterItemProperties(sdk.Values);\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n    }\r\n\r\n    public class EnumFilterItemProperties : ObservableObject\r\n    {\r\n        [JsonIgnore]\r\n        public bool IsSet => Values.HasItems();\r\n\r\n        private List<int> values;\r\n        public List<int> Values\r\n        {\r\n            get => values;\r\n            set\r\n            {\r\n                values = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(IsSet));\r\n            }\r\n        }\r\n\r\n        public EnumFilterItemProperties()\r\n        {\r\n        }\r\n\r\n        public EnumFilterItemProperties(List<int> values)\r\n        {\r\n            Values = values;\r\n        }\r\n\r\n        public EnumFilterItemProperties(int value)\r\n        {\r\n            Values = new List<int>() { value };\r\n        }\r\n\r\n        public bool Equals(EnumFilterItemProperties obj)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Values.IsListEqual(obj?.Values);\r\n        }\r\n\r\n        public bool Equals(SdkModels.EnumFilterItemProperties obj)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Values.IsListEqual(obj?.Values);\r\n        }\r\n\r\n        public SdkModels.EnumFilterItemProperties ToSdkModel()\r\n        {\r\n            if (Values.HasItems())\r\n            {\r\n                return new SdkModels.EnumFilterItemProperties(Values);\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static EnumFilterItemProperties FromSdkModel(SdkModels.EnumFilterItemProperties sdk)\r\n        {\r\n            if (sdk != null)\r\n            {\r\n                if (sdk.Values.HasItems())\r\n                {\r\n                    return new EnumFilterItemProperties(sdk.Values);\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n    }\r\n\r\n    public class IdItemFilterItemProperties : ObservableObject\r\n    {\r\n        [JsonIgnore]\r\n        public List<string> Texts { get; private set; }\r\n\r\n        [JsonIgnore]\r\n        public bool IsSet => !Text.IsNullOrEmpty() || Ids?.Any() == true;\r\n\r\n        private List<Guid> ids;\r\n        public List<Guid> Ids\r\n        {\r\n            get => ids;\r\n            set\r\n            {\r\n                ids = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(IsSet));\r\n            }\r\n        }\r\n\r\n        private string text;\r\n        public string Text\r\n        {\r\n            get => text;\r\n            set\r\n            {\r\n                text = value;\r\n                if (text?.Contains(Constants.ListSeparator) == true)\r\n                {\r\n                    Texts = text.Split(Constants.ListSeparators, StringSplitOptions.RemoveEmptyEntries).\r\n                        Select(a => a.Trim()).Where(a => !a.IsNullOrEmpty()).ToList();\r\n                }\r\n                else\r\n                {\r\n                    Texts = new List<string> { text };\r\n                }\r\n\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(IsSet));\r\n                OnPropertyChanged(nameof(Texts));\r\n            }\r\n        }\r\n\r\n        public IdItemFilterItemProperties()\r\n        {\r\n        }\r\n\r\n        public IdItemFilterItemProperties(List<Guid> ids)\r\n        {\r\n            Ids = ids;\r\n        }\r\n\r\n        public IdItemFilterItemProperties(Guid id)\r\n        {\r\n            Ids = new List<Guid>() { id };\r\n        }\r\n\r\n        public IdItemFilterItemProperties(string text)\r\n        {\r\n            Text = text;\r\n        }\r\n\r\n        public bool ShouldSerializeText()\r\n        {\r\n            return !Text.IsNullOrEmpty();\r\n        }\r\n\r\n        public bool ShouldSerializeIds()\r\n        {\r\n            return Ids.HasItems();\r\n        }\r\n\r\n        public bool Equals(IdItemFilterItemProperties obj)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Ids.IsListEqual(obj?.Ids) && Text == obj.Text;\r\n        }\r\n\r\n        public bool Equals(SdkModels.IdItemFilterItemProperties obj)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Ids.IsListEqual(obj?.Ids) && Text == obj.Text;\r\n        }\r\n\r\n        public SdkModels.IdItemFilterItemProperties ToSdkModel()\r\n        {\r\n            if (!Text.IsNullOrEmpty())\r\n            {\r\n                return new SdkModels.IdItemFilterItemProperties(Text);\r\n            }\r\n            else if (Ids.HasItems())\r\n            {\r\n                return new SdkModels.IdItemFilterItemProperties(Ids);\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public static IdItemFilterItemProperties FromSdkModel(SdkModels.IdItemFilterItemProperties sdk)\r\n        {\r\n            if (sdk != null)\r\n            {\r\n                if (sdk.Ids.HasItems())\r\n                {\r\n                    return new IdItemFilterItemProperties(sdk.Ids);\r\n                }\r\n                else if (!sdk.Text.IsNullOrEmpty())\r\n                {\r\n                    return new IdItemFilterItemProperties(sdk.Text);\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n    }\r\n\r\n    public class FilterSettings : ObservableObject\r\n    {\r\n        public const string MissingFieldString = \"{}\";\r\n\r\n        [JsonIgnore]\r\n        public bool SearchActive\r\n        {\r\n            get => !string.IsNullOrEmpty(Name);\r\n        }\r\n\r\n        [JsonIgnore]\r\n        public bool IsActive\r\n        {\r\n            get\r\n            {\r\n                return\r\n                    IsInstalled ||\r\n                    IsUnInstalled ||\r\n                    Hidden ||\r\n                    Favorite ||\r\n                    !string.IsNullOrEmpty(Name) ||\r\n                    !string.IsNullOrEmpty(Version) ||\r\n                    Series?.IsSet == true ||\r\n                    Source?.IsSet == true ||\r\n                    AgeRating?.IsSet == true ||\r\n                    Region?.IsSet == true ||\r\n                    Genre?.IsSet == true ||\r\n                    Publisher?.IsSet == true ||\r\n                    Developer?.IsSet == true ||\r\n                    Category?.IsSet == true ||\r\n                    Tag?.IsSet == true ||\r\n                    Platform?.IsSet == true ||\r\n                    Library?.IsSet == true ||\r\n                    CompletionStatuses?.IsSet == true ||\r\n                    UserScore?.IsSet == true ||\r\n                    CriticScore?.IsSet == true ||\r\n                    CommunityScore?.IsSet == true ||\r\n                    LastActivity?.IsSet == true ||\r\n                    RecentActivity?.IsSet == true ||\r\n                    Added?.IsSet == true ||\r\n                    Modified?.IsSet == true ||\r\n                    ReleaseYear?.IsSet == true ||\r\n                    PlayTime?.IsSet == true ||\r\n                    InstallSize?.IsSet == true ||\r\n                    Feature?.IsSet == true;\r\n            }\r\n        }\r\n\r\n        private string name;\r\n        public string Name\r\n        {\r\n            get\r\n            {\r\n                return name;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (name != value)\r\n                {\r\n                    name = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Name));\r\n                    OnPropertyChanged(nameof(IsActive));\r\n                    OnPropertyChanged(nameof(SearchActive));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties genre;\r\n        public IdItemFilterItemProperties Genre\r\n        {\r\n            get\r\n            {\r\n                return genre;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (genre != value)\r\n                {\r\n                    genre = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Genre));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties platforms;\r\n        public IdItemFilterItemProperties Platform\r\n        {\r\n            get\r\n            {\r\n                return platforms;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (platforms != value)\r\n                {\r\n                    platforms = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Platform));\r\n                }\r\n            }\r\n        }\r\n\r\n        private StringFilterItemProperties releaseDate;\r\n        public StringFilterItemProperties ReleaseYear\r\n        {\r\n            get\r\n            {\r\n                return releaseDate;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (releaseDate != value)\r\n                {\r\n                    releaseDate = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(ReleaseYear));\r\n                }\r\n            }\r\n        }\r\n\r\n        private string version;\r\n        public string Version\r\n        {\r\n            get\r\n            {\r\n                return version;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (version != value)\r\n                {\r\n                    version = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Version));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties publishers;\r\n        public IdItemFilterItemProperties Publisher\r\n        {\r\n            get\r\n            {\r\n                return publishers;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (publishers != value)\r\n                {\r\n                    publishers = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Publisher));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties developers;\r\n        public IdItemFilterItemProperties Developer\r\n        {\r\n            get\r\n            {\r\n                return developers;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (developers != value)\r\n                {\r\n                    developers = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Developer));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties categories;\r\n        public IdItemFilterItemProperties Category\r\n        {\r\n            get\r\n            {\r\n                return categories;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (categories != value)\r\n                {\r\n                    categories = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Category));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties tags;\r\n        public IdItemFilterItemProperties Tag\r\n        {\r\n            get\r\n            {\r\n                return tags;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (tags != value)\r\n                {\r\n                    tags = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Tag));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties series;\r\n        public IdItemFilterItemProperties Series\r\n        {\r\n            get\r\n            {\r\n                return series;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (series != value)\r\n                {\r\n                    series = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Series));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties region;\r\n        public IdItemFilterItemProperties Region\r\n        {\r\n            get\r\n            {\r\n                return region;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (region != value)\r\n                {\r\n                    region = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Region));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties source;\r\n        public IdItemFilterItemProperties Source\r\n        {\r\n            get\r\n            {\r\n                return source;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (source != value)\r\n                {\r\n                    source = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Source));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties ageRating;\r\n        public IdItemFilterItemProperties AgeRating\r\n        {\r\n            get\r\n            {\r\n                return ageRating;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (ageRating != value)\r\n                {\r\n                    ageRating = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(AgeRating));\r\n                }\r\n            }\r\n        }\r\n\r\n        private bool useAndFilteringStyle;\r\n        public bool UseAndFilteringStyle\r\n        {\r\n            get\r\n            {\r\n                return useAndFilteringStyle;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (useAndFilteringStyle != value)\r\n                {\r\n                    useAndFilteringStyle = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(UseAndFilteringStyle));\r\n                }\r\n            }\r\n        }\r\n\r\n        private bool isInstalled;\r\n        public bool IsInstalled\r\n        {\r\n            get\r\n            {\r\n                return isInstalled;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (isInstalled != value)\r\n                {\r\n                    isInstalled = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(IsInstalled));\r\n                }\r\n            }\r\n        }\r\n\r\n        private bool isUnInstalled;\r\n        public bool IsUnInstalled\r\n        {\r\n            get\r\n            {\r\n                return isUnInstalled;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (isUnInstalled != value)\r\n                {\r\n                    isUnInstalled = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(IsUnInstalled));\r\n                }\r\n            }\r\n        }\r\n\r\n        private bool hidden;\r\n        public bool Hidden\r\n        {\r\n            get\r\n            {\r\n                return hidden;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (hidden != value)\r\n                {\r\n                    hidden = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Hidden));\r\n                }\r\n            }\r\n        }\r\n\r\n        private bool favorite;\r\n        public bool Favorite\r\n        {\r\n            get\r\n            {\r\n                return favorite;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (favorite != value)\r\n                {\r\n                    favorite = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Favorite));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties library;\r\n        public IdItemFilterItemProperties Library\r\n        {\r\n            get\r\n            {\r\n                return library;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (library != value)\r\n                {\r\n                    library = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Library));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties completionStatus;\r\n        public IdItemFilterItemProperties CompletionStatuses\r\n        {\r\n            get\r\n            {\r\n                return completionStatus;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (completionStatus != value)\r\n                {\r\n                    completionStatus = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(CompletionStatuses));\r\n                }\r\n            }\r\n        }\r\n\r\n        private EnumFilterItemProperties userScore;\r\n        public EnumFilterItemProperties UserScore\r\n        {\r\n            get\r\n            {\r\n                return userScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (userScore != value)\r\n                {\r\n                    userScore = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(UserScore));\r\n                }\r\n            }\r\n        }\r\n\r\n        private EnumFilterItemProperties criticScore;\r\n        public EnumFilterItemProperties CriticScore\r\n        {\r\n            get\r\n            {\r\n                return criticScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (criticScore != value)\r\n                {\r\n                    criticScore = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(CriticScore));\r\n                }\r\n            }\r\n        }\r\n\r\n        private EnumFilterItemProperties communityScore;\r\n        public EnumFilterItemProperties CommunityScore\r\n        {\r\n            get\r\n            {\r\n                return communityScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (communityScore != value)\r\n                {\r\n                    communityScore = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(CommunityScore));\r\n                }\r\n            }\r\n        }\r\n\r\n        private EnumFilterItemProperties lastActivity;\r\n        public EnumFilterItemProperties LastActivity\r\n        {\r\n            get\r\n            {\r\n                return lastActivity;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (lastActivity != value)\r\n                {\r\n                    lastActivity = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(LastActivity));\r\n                }\r\n            }\r\n        }\r\n\r\n        private EnumFilterItemProperties recentActivity;\r\n        public EnumFilterItemProperties RecentActivity\r\n        {\r\n            get\r\n            {\r\n                return recentActivity;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (recentActivity != value)\r\n                {\r\n                    recentActivity = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(RecentActivity));\r\n                }\r\n            }\r\n        }\r\n\r\n        private EnumFilterItemProperties added;\r\n        public EnumFilterItemProperties Added\r\n        {\r\n            get\r\n            {\r\n                return added;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (added != value)\r\n                {\r\n                    added = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Added));\r\n                }\r\n            }\r\n        }\r\n\r\n        private EnumFilterItemProperties modified;\r\n        public EnumFilterItemProperties Modified\r\n        {\r\n            get\r\n            {\r\n                return modified;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (modified != value)\r\n                {\r\n                    modified = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Modified));\r\n                }\r\n            }\r\n        }\r\n\r\n        private EnumFilterItemProperties playTime;\r\n        public EnumFilterItemProperties PlayTime\r\n        {\r\n            get\r\n            {\r\n                return playTime;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (playTime != value)\r\n                {\r\n                    playTime = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(PlayTime));\r\n                }\r\n            }\r\n        }\r\n\r\n        private EnumFilterItemProperties installSize;\r\n        public EnumFilterItemProperties InstallSize\r\n        {\r\n            get\r\n            {\r\n                return installSize;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (installSize != value)\r\n                {\r\n                    installSize = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(InstallSize));\r\n                }\r\n            }\r\n        }\r\n\r\n        private IdItemFilterItemProperties feature;\r\n        public IdItemFilterItemProperties Feature\r\n        {\r\n            get\r\n            {\r\n                return feature;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (feature != value)\r\n                {\r\n                    feature = value;\r\n                    OnPropertyChanged();\r\n                    OnFilterChanged(nameof(Feature));\r\n                }\r\n            }\r\n        }\r\n\r\n        [JsonIgnore]\r\n        public bool SuppressFilterChanges { get; set; } = false;\r\n        public event EventHandler<FilterChangedEventArgs> FilterChanged;\r\n\r\n        public void OnFilterChanged(string field)\r\n        {\r\n            if (!SuppressFilterChanges)\r\n            {\r\n                FilterChanged?.Invoke(this, new FilterChangedEventArgs(new List<string>() { field }));\r\n            }\r\n\r\n            OnPropertyChanged(nameof(IsActive));\r\n        }\r\n\r\n        public void OnFilterChanged(List<string> fields)\r\n        {\r\n            if (!SuppressFilterChanges)\r\n            {\r\n                FilterChanged?.Invoke(this, new FilterChangedEventArgs(fields));\r\n            }\r\n\r\n            OnPropertyChanged(nameof(IsActive));\r\n        }\r\n\r\n        public void ClearFilters(bool notify = true)\r\n        {\r\n            SuppressFilterChanges = true;\r\n            var filterChanges = new List<string>();\r\n\r\n            if (Name != null)\r\n            {\r\n                Name = null;\r\n                filterChanges.Add(nameof(Name));\r\n            }\r\n\r\n            if (Genre?.IsSet == true)\r\n            {\r\n                Genre = null;\r\n                filterChanges.Add(nameof(Genre));\r\n            }\r\n\r\n            if (Platform?.IsSet == true)\r\n            {\r\n                Platform = null;\r\n                filterChanges.Add(nameof(Platform));\r\n            }\r\n\r\n            if (ReleaseYear != null)\r\n            {\r\n                ReleaseYear = null;\r\n                filterChanges.Add(nameof(ReleaseYear));\r\n            }\r\n\r\n            if (Version != null)\r\n            {\r\n                Version = null;\r\n                filterChanges.Add(nameof(Version));\r\n            }\r\n\r\n            if (Publisher?.IsSet == true)\r\n            {\r\n                Publisher = null;\r\n                filterChanges.Add(nameof(Publisher));\r\n            }\r\n\r\n            if (Developer?.IsSet == true)\r\n            {\r\n                Developer = null;\r\n                filterChanges.Add(nameof(Developer));\r\n            }\r\n\r\n            if (Category?.IsSet == true)\r\n            {\r\n                Category = null;\r\n                filterChanges.Add(nameof(Category));\r\n            }\r\n\r\n            if (Tag?.IsSet == true)\r\n            {\r\n                Tag = null;\r\n                filterChanges.Add(nameof(Tag));\r\n            }\r\n\r\n            if (UseAndFilteringStyle != false)\r\n            {\r\n                UseAndFilteringStyle = false;\r\n                filterChanges.Add(nameof(UseAndFilteringStyle));\r\n            }\r\n\r\n            if (IsInstalled != false)\r\n            {\r\n                IsInstalled = false;\r\n                filterChanges.Add(nameof(IsInstalled));\r\n            }\r\n\r\n            if (IsUnInstalled != false)\r\n            {\r\n                IsUnInstalled = false;\r\n                filterChanges.Add(nameof(IsUnInstalled));\r\n            }\r\n\r\n            if (Hidden != false)\r\n            {\r\n                Hidden = false;\r\n                filterChanges.Add(nameof(Hidden));\r\n            }\r\n\r\n            if (Favorite != false)\r\n            {\r\n                Favorite = false;\r\n                filterChanges.Add(nameof(Favorite));\r\n            }\r\n\r\n            if (Series?.IsSet == true)\r\n            {\r\n                Series = null;\r\n                filterChanges.Add(nameof(Series));\r\n            }\r\n\r\n            if (Region?.IsSet == true)\r\n            {\r\n                Region = null;\r\n                filterChanges.Add(nameof(Region));\r\n            }\r\n\r\n            if (Source?.IsSet == true)\r\n            {\r\n                Source = null;\r\n                filterChanges.Add(nameof(Source));\r\n            }\r\n\r\n            if (AgeRating?.IsSet == true)\r\n            {\r\n                AgeRating = null;\r\n                filterChanges.Add(nameof(AgeRating));\r\n            }\r\n\r\n            if (Library != null)\r\n            {\r\n                Library = null;\r\n                filterChanges.Add(nameof(Library));\r\n            }\r\n\r\n            if (CompletionStatuses != null)\r\n            {\r\n                CompletionStatuses = null;\r\n                filterChanges.Add(nameof(CompletionStatuses));\r\n            }\r\n\r\n            if (UserScore != null)\r\n            {\r\n                UserScore = null;\r\n                filterChanges.Add(nameof(UserScore));\r\n            }\r\n\r\n            if (CriticScore != null)\r\n            {\r\n                CriticScore = null;\r\n                filterChanges.Add(nameof(CriticScore));\r\n            }\r\n\r\n            if (CommunityScore != null)\r\n            {\r\n                CommunityScore = null;\r\n                filterChanges.Add(nameof(CommunityScore));\r\n            }\r\n\r\n            if (LastActivity != null)\r\n            {\r\n                LastActivity = null;\r\n                filterChanges.Add(nameof(LastActivity));\r\n            }\r\n\r\n            if (RecentActivity != null)\r\n            {\r\n                RecentActivity = null;\r\n                filterChanges.Add(nameof(RecentActivity));\r\n            }\r\n\r\n            if (Added != null)\r\n            {\r\n                Added = null;\r\n                filterChanges.Add(nameof(Added));\r\n            }\r\n\r\n            if (Modified != null)\r\n            {\r\n                Modified = null;\r\n                filterChanges.Add(nameof(Modified));\r\n            }\r\n\r\n            if (PlayTime != null)\r\n            {\r\n                PlayTime = null;\r\n                filterChanges.Add(nameof(PlayTime));\r\n            }\r\n\r\n            if (InstallSize != null)\r\n            {\r\n                InstallSize = null;\r\n                filterChanges.Add(nameof(InstallSize));\r\n            }\r\n\r\n            if (Feature?.IsSet == true)\r\n            {\r\n                Feature = null;\r\n                filterChanges.Add(nameof(Feature));\r\n            }\r\n\r\n            SuppressFilterChanges = false;\r\n            if (notify)\r\n            {\r\n                OnFilterChanged(filterChanges);\r\n            }\r\n        }\r\n\r\n        public SdkModels.FilterPresetSettings AsPresetSettings()\r\n        {\r\n            return new SdkModels.FilterPresetSettings\r\n            {\r\n                UseAndFilteringStyle = UseAndFilteringStyle,\r\n                IsInstalled = IsInstalled,\r\n                IsUnInstalled = IsUnInstalled,\r\n                Hidden = Hidden,\r\n                Favorite = Favorite,\r\n                Name = Name,\r\n                Version = Version,\r\n                ReleaseYear = ReleaseYear?.ToSdkModel(),\r\n                Genre = Genre?.ToSdkModel(),\r\n                Platform = Platform?.ToSdkModel(),\r\n                Publisher = Publisher?.ToSdkModel(),\r\n                Developer = Developer?.ToSdkModel(),\r\n                Category = Category?.ToSdkModel(),\r\n                Tag = Tag?.ToSdkModel(),\r\n                Series = Series?.ToSdkModel(),\r\n                Region = Region?.ToSdkModel(),\r\n                Source = Source?.ToSdkModel(),\r\n                AgeRating = AgeRating?.ToSdkModel(),\r\n                Library = Library?.ToSdkModel(),\r\n                CompletionStatuses = CompletionStatuses?.ToSdkModel(),\r\n                Feature = Feature?.ToSdkModel(),\r\n                UserScore = UserScore?.ToSdkModel(),\r\n                CriticScore = CriticScore?.ToSdkModel(),\r\n                CommunityScore = CommunityScore?.ToSdkModel(),\r\n                LastActivity = LastActivity?.ToSdkModel(),\r\n                RecentActivity = RecentActivity?.ToSdkModel(),\r\n                Added = Added?.ToSdkModel(),\r\n                Modified = Modified?.ToSdkModel(),\r\n                PlayTime = PlayTime?.ToSdkModel(),\r\n                InstallSize = InstallSize?.ToSdkModel()\r\n            };\r\n        }\r\n\r\n        public static FilterSettings FromSdkFilterSettings(SdkModels.FilterPresetSettings settings)\r\n        {\r\n            return new FilterSettings\r\n            {\r\n                IsInstalled = settings.IsInstalled,\r\n                IsUnInstalled = settings.IsUnInstalled,\r\n                Hidden = settings.Hidden,\r\n                Favorite = settings.Favorite,\r\n                Name = settings.Name,\r\n                Version = settings.Version,\r\n                ReleaseYear = StringFilterItemProperties.FromSdkModel(settings.ReleaseYear),\r\n                Genre = IdItemFilterItemProperties.FromSdkModel(settings.Genre),\r\n                Platform = IdItemFilterItemProperties.FromSdkModel(settings.Platform),\r\n                Publisher = IdItemFilterItemProperties.FromSdkModel(settings.Publisher),\r\n                Developer = IdItemFilterItemProperties.FromSdkModel(settings.Developer),\r\n                Category = IdItemFilterItemProperties.FromSdkModel(settings.Category),\r\n                Tag = IdItemFilterItemProperties.FromSdkModel(settings.Tag),\r\n                Series = IdItemFilterItemProperties.FromSdkModel(settings.Series),\r\n                Region = IdItemFilterItemProperties.FromSdkModel(settings.Region),\r\n                Source = IdItemFilterItemProperties.FromSdkModel(settings.Source),\r\n                AgeRating = IdItemFilterItemProperties.FromSdkModel(settings.AgeRating),\r\n                Library = IdItemFilterItemProperties.FromSdkModel(settings.Library),\r\n                CompletionStatuses = IdItemFilterItemProperties.FromSdkModel(settings.CompletionStatuses),\r\n                Feature = IdItemFilterItemProperties.FromSdkModel(settings.Feature),\r\n                UserScore = EnumFilterItemProperties.FromSdkModel(settings.UserScore),\r\n                CriticScore = EnumFilterItemProperties.FromSdkModel(settings.CriticScore),\r\n                CommunityScore = EnumFilterItemProperties.FromSdkModel(settings.CommunityScore),\r\n                LastActivity = EnumFilterItemProperties.FromSdkModel(settings.LastActivity),\r\n                RecentActivity = EnumFilterItemProperties.FromSdkModel(settings.RecentActivity),\r\n                Added = EnumFilterItemProperties.FromSdkModel(settings.Added),\r\n                Modified = EnumFilterItemProperties.FromSdkModel(settings.Modified),\r\n                PlayTime = EnumFilterItemProperties.FromSdkModel(settings.PlayTime),\r\n                InstallSize = EnumFilterItemProperties.FromSdkModel(settings.InstallSize)\r\n            };\r\n        }\r\n\r\n        public void ApplyFilter(SdkModels.FilterPresetSettings settings)\r\n        {\r\n            var filterChanges = new List<string>();\r\n            SuppressFilterChanges = true;\r\n\r\n            if (UseAndFilteringStyle != settings.UseAndFilteringStyle)\r\n            {\r\n                UseAndFilteringStyle = settings.UseAndFilteringStyle;\r\n                filterChanges.Add(nameof(UseAndFilteringStyle));\r\n            }\r\n\r\n            if (Name != settings.Name)\r\n            {\r\n                Name = settings.Name;\r\n                filterChanges.Add(nameof(Name));\r\n            }\r\n\r\n            if (Genre?.Equals(settings.Genre) != true)\r\n            {\r\n                Genre = IdItemFilterItemProperties.FromSdkModel(settings.Genre);\r\n                filterChanges.Add(nameof(Genre));\r\n            }\r\n            if (Platform?.Equals(settings.Platform) != true)\r\n            {\r\n                Platform = IdItemFilterItemProperties.FromSdkModel(settings.Platform);\r\n                filterChanges.Add(nameof(Platform));\r\n            }\r\n\r\n            if (ReleaseYear?.Equals(settings.ReleaseYear) != true)\r\n            {\r\n                ReleaseYear = StringFilterItemProperties.FromSdkModel(settings.ReleaseYear);\r\n                filterChanges.Add(nameof(ReleaseYear));\r\n            }\r\n\r\n            if (Version != settings.Version)\r\n            {\r\n                Version = settings.Version;\r\n                filterChanges.Add(nameof(Version));\r\n            }\r\n\r\n            if (Publisher?.Equals(settings.Publisher) != true)\r\n            {\r\n                Publisher = IdItemFilterItemProperties.FromSdkModel(settings.Publisher);\r\n                filterChanges.Add(nameof(Publisher));\r\n            }\r\n\r\n            if (Developer?.Equals(settings.Developer) != true)\r\n            {\r\n                Developer = IdItemFilterItemProperties.FromSdkModel(settings.Developer);\r\n                filterChanges.Add(nameof(Developer));\r\n            }\r\n\r\n            if (Category?.Equals(settings.Category) != true)\r\n            {\r\n                Category = IdItemFilterItemProperties.FromSdkModel(settings.Category);\r\n                filterChanges.Add(nameof(Category));\r\n            }\r\n\r\n            if (Tag?.Equals(settings.Tag) != true)\r\n            {\r\n                Tag = IdItemFilterItemProperties.FromSdkModel(settings.Tag);\r\n                filterChanges.Add(nameof(Tag));\r\n            }\r\n\r\n            if (IsInstalled != settings.IsInstalled)\r\n            {\r\n                IsInstalled = settings.IsInstalled;\r\n                filterChanges.Add(nameof(IsInstalled));\r\n            }\r\n\r\n            if (IsUnInstalled != settings.IsUnInstalled)\r\n            {\r\n                IsUnInstalled = settings.IsUnInstalled;\r\n                filterChanges.Add(nameof(IsUnInstalled));\r\n            }\r\n\r\n            if (Hidden != settings.Hidden)\r\n            {\r\n                Hidden = settings.Hidden;\r\n                filterChanges.Add(nameof(Hidden));\r\n            }\r\n\r\n            if (Favorite != settings.Favorite)\r\n            {\r\n                Favorite = settings.Favorite;\r\n                filterChanges.Add(nameof(Favorite));\r\n            }\r\n\r\n            if (Series?.Equals(settings.Series) != true)\r\n            {\r\n                Series = IdItemFilterItemProperties.FromSdkModel(settings.Series);\r\n                filterChanges.Add(nameof(Series));\r\n            }\r\n\r\n            if (Region?.Equals(settings.Region) != true)\r\n            {\r\n                Region = IdItemFilterItemProperties.FromSdkModel(settings.Region);\r\n                filterChanges.Add(nameof(Region));\r\n            }\r\n\r\n            if (Source?.Equals(settings.Source) != true)\r\n            {\r\n                Source = IdItemFilterItemProperties.FromSdkModel(settings.Source);\r\n                filterChanges.Add(nameof(Source));\r\n            }\r\n\r\n            if (AgeRating?.Equals(settings.AgeRating) != true)\r\n            {\r\n                AgeRating = IdItemFilterItemProperties.FromSdkModel(settings.AgeRating);\r\n                filterChanges.Add(nameof(AgeRating));\r\n            }\r\n\r\n            if (Library?.Equals(settings.Library) != true)\r\n            {\r\n                Library = IdItemFilterItemProperties.FromSdkModel(settings.Library);\r\n                filterChanges.Add(nameof(Library));\r\n            }\r\n\r\n            if (CompletionStatuses?.Equals(settings.CompletionStatuses) != true)\r\n            {\r\n                CompletionStatuses = IdItemFilterItemProperties.FromSdkModel(settings.CompletionStatuses);\r\n                filterChanges.Add(nameof(CompletionStatuses));\r\n            }\r\n\r\n            if (UserScore?.Equals(settings.UserScore) != true)\r\n            {\r\n                UserScore = EnumFilterItemProperties.FromSdkModel(settings.UserScore);\r\n                filterChanges.Add(nameof(UserScore));\r\n            }\r\n\r\n            if (CriticScore?.Equals(settings.CriticScore) != true)\r\n            {\r\n                CriticScore = EnumFilterItemProperties.FromSdkModel(settings.CriticScore);\r\n                filterChanges.Add(nameof(CriticScore));\r\n            }\r\n\r\n            if (CommunityScore?.Equals(settings.CommunityScore) != true)\r\n            {\r\n                CommunityScore = EnumFilterItemProperties.FromSdkModel(settings.CommunityScore);\r\n                filterChanges.Add(nameof(CommunityScore));\r\n            }\r\n\r\n            if (LastActivity?.Equals(settings.LastActivity) != true)\r\n            {\r\n                LastActivity = EnumFilterItemProperties.FromSdkModel(settings.LastActivity);\r\n                filterChanges.Add(nameof(LastActivity));\r\n            }\r\n\r\n            if (RecentActivity?.Equals(settings.RecentActivity) != true)\r\n            {\r\n                RecentActivity = EnumFilterItemProperties.FromSdkModel(settings.RecentActivity);\r\n                filterChanges.Add(nameof(RecentActivity));\r\n            }\r\n\r\n            if (Added?.Equals(settings.Added) != true)\r\n            {\r\n                Added = EnumFilterItemProperties.FromSdkModel(settings.Added);\r\n                filterChanges.Add(nameof(Added));\r\n            }\r\n\r\n            if (Modified?.Equals(settings.Modified) != true)\r\n            {\r\n                Modified = EnumFilterItemProperties.FromSdkModel(settings.Modified);\r\n                filterChanges.Add(nameof(Modified));\r\n            }\r\n\r\n            if (PlayTime?.Equals(settings.PlayTime) != true)\r\n            {\r\n                PlayTime = EnumFilterItemProperties.FromSdkModel(settings.PlayTime);\r\n                filterChanges.Add(nameof(PlayTime));\r\n            }\r\n\r\n            if (InstallSize?.Equals(settings.InstallSize) != true)\r\n            {\r\n                InstallSize = EnumFilterItemProperties.FromSdkModel(settings.InstallSize);\r\n                filterChanges.Add(nameof(InstallSize));\r\n            }\r\n\r\n            if (Feature?.Equals(settings.Feature) != true)\r\n            {\r\n                Feature = IdItemFilterItemProperties.FromSdkModel(settings.Feature);\r\n                filterChanges.Add(nameof(Feature));\r\n            }\r\n\r\n            SuppressFilterChanges = false;\r\n            OnFilterChanged(filterChanges);\r\n        }\r\n\r\n        #region Serialization Conditions\r\n\r\n        public bool ShouldSerializeName()\r\n        {\r\n            return !Name.IsNullOrEmpty();\r\n        }\r\n\r\n        public bool ShouldSerializeReleaseYear()\r\n        {\r\n            return ReleaseYear?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeVersion()\r\n        {\r\n            return !Version.IsNullOrEmpty();\r\n        }\r\n\r\n        public bool ShouldSerializeSeries()\r\n        {\r\n            return Series?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeSource()\r\n        {\r\n            return Source?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeAgeRating()\r\n        {\r\n            return AgeRating?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeRegion()\r\n        {\r\n            return Region?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeGenre()\r\n        {\r\n            return Genre?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializePublisher()\r\n        {\r\n            return Publisher?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeDeveloper()\r\n        {\r\n            return Developer?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeCategory()\r\n        {\r\n            return Category?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeTag()\r\n        {\r\n            return Tag?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializePlatform()\r\n        {\r\n            return Platform?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeLibrary()\r\n        {\r\n            return Library?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeCompletionStatuses()\r\n        {\r\n            return CompletionStatuses?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeUserScore()\r\n        {\r\n            return UserScore?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeCriticScore()\r\n        {\r\n            return CriticScore?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeCommunityScore()\r\n        {\r\n            return CommunityScore?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeLastActivity()\r\n        {\r\n            return LastActivity?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeRecentActivity()\r\n        {\r\n            return RecentActivity?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeAdded()\r\n        {\r\n            return Added?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeModified()\r\n        {\r\n            return Modified?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializePlayTime()\r\n        {\r\n            return PlayTime?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeInstallSize()\r\n        {\r\n            return InstallSize?.IsSet == true;\r\n        }\r\n\r\n        public bool ShouldSerializeFeature()\r\n        {\r\n            return Feature?.IsSet == true;\r\n        }\r\n\r\n        #endregion Serialization Conditions\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Settings/FullscreenSettings.cs",
    "content": "﻿using Newtonsoft.Json;\r\nusing Playnite.Audio;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Forms;\r\n\r\nnamespace Playnite\r\n{\r\n    public enum FullscreenButtonPrompts\r\n    {\r\n        Xbox,\r\n        PlayStation\r\n    }\r\n\r\n    public enum ActiveFullscreenView : int\r\n    {\r\n        RecentlyPlayed = 0,\r\n        Favorites = 1,\r\n        MostPlayed = 2,\r\n        All = 3\r\n        //Explore\r\n    }\r\n\r\n    public class FullscreenViewSettings : ViewSettingsBase\r\n    {\r\n    }\r\n\r\n    public class FullscreenFilterSettings : FilterSettings\r\n    {\r\n        public FullscreenFilterSettings() : base()\r\n        {\r\n            FilterChanged += (s, e) => OnPropertyChanged(nameof(IsSubAdditionalFilterActive));\r\n        }\r\n\r\n        [JsonIgnore]\r\n        public bool IsSubAdditionalFilterActive\r\n        {\r\n            get\r\n            {\r\n                return\r\n                    Series?.IsSet == true ||\r\n                    Source?.IsSet == true ||\r\n                    AgeRating?.IsSet == true ||\r\n                    Region?.IsSet == true ||\r\n                    Genre?.IsSet == true ||\r\n                    Publisher?.IsSet == true ||\r\n                    Developer?.IsSet == true ||\r\n                    Tag?.IsSet == true ||\r\n                    Feature?.IsSet == true ||\r\n                    CompletionStatuses?.IsSet == true ||\r\n                    UserScore?.IsSet == true ||\r\n                    CriticScore?.IsSet == true ||\r\n                    CommunityScore?.IsSet == true ||\r\n                    LastActivity?.IsSet == true ||\r\n                    Added?.IsSet == true ||\r\n                    Modified?.IsSet == true ||\r\n                    ReleaseYear?.IsSet == true ||\r\n                    PlayTime?.IsSet == true;\r\n            }\r\n        }\r\n    }\r\n\r\n    public class FullscreenSettings : ObservableObject\r\n    {\r\n        [JsonIgnore]\r\n        public List<ComputerScreen> AvailableScreens => Computer.GetScreens();\r\n\r\n        [JsonIgnore]\r\n        public List<ThemeManifest> AvailableThemes => ThemeManager.GetAvailableThemes(ApplicationMode.Fullscreen).OrderBy(a => a.Name).ToList();\r\n\r\n        [JsonIgnore]\r\n        public const FullscreenButtonPrompts DefaultButtonPrompts = FullscreenButtonPrompts.Xbox;\r\n\r\n        private bool isMusicMuted = false;\r\n        [JsonIgnore]\r\n        public bool IsMusicMuted\r\n        {\r\n            get\r\n            {\r\n                return isMusicMuted;\r\n            }\r\n\r\n            set\r\n            {\r\n                if (isMusicMuted != value)\r\n                {\r\n                    isMusicMuted = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n        }\r\n\r\n        private int monitor = Computer.GetGetPrimaryScreenIndex();\r\n        public int Monitor\r\n        {\r\n            get\r\n            {\r\n                return monitor;\r\n            }\r\n\r\n            set\r\n            {\r\n                monitor = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string theme = ThemeManager.DefaultFullscreenThemeId;\r\n        [RequiresRestart]\r\n        public string Theme\r\n        {\r\n            get\r\n            {\r\n                return theme;\r\n            }\r\n\r\n            set\r\n            {\r\n                theme = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int rows = 2;\r\n        public int Rows\r\n        {\r\n            get\r\n            {\r\n                return rows;\r\n            }\r\n\r\n            set\r\n            {\r\n                rows = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int columns = 4;\r\n        public int Columns\r\n        {\r\n            get\r\n            {\r\n                return columns;\r\n            }\r\n\r\n            set\r\n            {\r\n                columns = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool horizontalLayout = false;\r\n        public bool HorizontalLayout\r\n        {\r\n            get\r\n            {\r\n                return horizontalLayout;\r\n            }\r\n\r\n            set\r\n            {\r\n                horizontalLayout = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showBattery = false;\r\n        public bool ShowBattery\r\n        {\r\n            get\r\n            {\r\n                return showBattery;\r\n            }\r\n\r\n            set\r\n            {\r\n                showBattery = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showClock = true;\r\n        public bool ShowClock\r\n        {\r\n            get\r\n            {\r\n                return showClock;\r\n            }\r\n\r\n            set\r\n            {\r\n                showClock = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showBatteryPercentage = false;\r\n        public bool ShowBatteryPercentage\r\n        {\r\n            get\r\n            {\r\n                return showBatteryPercentage;\r\n            }\r\n\r\n            set\r\n            {\r\n                showBatteryPercentage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showGameTitles = false;\r\n        public bool ShowGameTitles\r\n        {\r\n            get\r\n            {\r\n                return showGameTitles;\r\n            }\r\n\r\n            set\r\n            {\r\n                showGameTitles = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FullscreenButtonPrompts buttonPrompts = DefaultButtonPrompts;\r\n        public FullscreenButtonPrompts ButtonPrompts\r\n        {\r\n            get\r\n            {\r\n                return buttonPrompts;\r\n            }\r\n\r\n            set\r\n            {\r\n                buttonPrompts = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FullscreenFilterSettings filterSettings = new FullscreenFilterSettings();\r\n        public FullscreenFilterSettings FilterSettings\r\n        {\r\n            get\r\n            {\r\n                return filterSettings;\r\n            }\r\n\r\n            set\r\n            {\r\n                filterSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FullscreenViewSettings viewSettings = new FullscreenViewSettings();\r\n        public FullscreenViewSettings ViewSettings\r\n        {\r\n            get\r\n            {\r\n                return viewSettings;\r\n            }\r\n\r\n            set\r\n            {\r\n                viewSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool darkenUninstalledGamesGrid = false;\r\n        public bool DarkenUninstalledGamesGrid\r\n        {\r\n            get => darkenUninstalledGamesGrid;\r\n            set\r\n            {\r\n                darkenUninstalledGamesGrid = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool enableMainBackgroundImage = false;\r\n        public bool EnableMainBackgroundImage\r\n        {\r\n            get\r\n            {\r\n                return enableMainBackgroundImage;\r\n            }\r\n\r\n            set\r\n            {\r\n                enableMainBackgroundImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int mainBackgroundImageBlurAmount = 0;\r\n        public int MainBackgroundImageBlurAmount\r\n        {\r\n            get\r\n            {\r\n                return mainBackgroundImageBlurAmount;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainBackgroundImageBlurAmount = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private float mainBackgroundImageDarkAmount = 30;\r\n        public float MainBackgroundImageDarkAmount\r\n        {\r\n            get\r\n            {\r\n                return mainBackgroundImageDarkAmount;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainBackgroundImageDarkAmount = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool usePrimaryDisplay = false;\r\n        public bool UsePrimaryDisplay\r\n        {\r\n            get => usePrimaryDisplay;\r\n            set\r\n            {\r\n                usePrimaryDisplay = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid selectedFilterPreset;\r\n        public Guid SelectedFilterPreset\r\n        {\r\n            get => selectedFilterPreset;\r\n            set\r\n            {\r\n                selectedFilterPreset = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool hideMouserCursor = false;\r\n        public bool HideMouserCursor\r\n        {\r\n            get => hideMouserCursor;\r\n            set\r\n            {\r\n                hideMouserCursor = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool asyncImageLoading = true;\r\n        [RequiresRestart]\r\n        public bool AsyncImageLoading\r\n        {\r\n            get\r\n            {\r\n                return asyncImageLoading;\r\n            }\r\n\r\n            set\r\n            {\r\n                asyncImageLoading = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool minimizeAfterGameStartup = true;\r\n        public bool MinimizeAfterGameStartup\r\n        {\r\n            get\r\n            {\r\n                return minimizeAfterGameStartup;\r\n            }\r\n\r\n            set\r\n            {\r\n                minimizeAfterGameStartup = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double fontSize = 22;\r\n        [RequiresRestart]\r\n        public double FontSize\r\n        {\r\n            get\r\n            {\r\n                return fontSize;\r\n            }\r\n\r\n            set\r\n            {\r\n                fontSize = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double fontSizeSmall = 18;\r\n        [RequiresRestart]\r\n        public double FontSizeSmall\r\n        {\r\n            get\r\n            {\r\n                return fontSizeSmall;\r\n            }\r\n\r\n            set\r\n            {\r\n                fontSizeSmall = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool enableGameControllerSupport = true;\r\n        public bool EnableGameControllerSupport\r\n        {\r\n            get\r\n            {\r\n                return enableGameControllerSupport;\r\n            }\r\n\r\n            set\r\n            {\r\n                enableGameControllerSupport = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<string> disabledGameControllers = new List<string>();\r\n        public List<string> DisabledGameControllers\r\n        {\r\n            get\r\n            {\r\n                return disabledGameControllers;\r\n            }\r\n\r\n            set\r\n            {\r\n                disabledGameControllers = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mainMenuShowRestart = true;\r\n        public bool MainMenuShowRestart\r\n        {\r\n            get\r\n            {\r\n                return mainMenuShowRestart;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainMenuShowRestart = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mainMenuShowShutdown = true;\r\n        public bool MainMenuShowShutdown\r\n        {\r\n            get\r\n            {\r\n                return mainMenuShowShutdown;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainMenuShowShutdown = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mainMenuShowSuspend = true;\r\n        public bool MainMenuShowSuspend\r\n        {\r\n            get\r\n            {\r\n                return mainMenuShowSuspend;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainMenuShowSuspend = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mainMenuShowHibernate = true;\r\n        public bool MainMenuShowHibernate\r\n        {\r\n            get\r\n            {\r\n                return mainMenuShowHibernate;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainMenuShowHibernate = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mainMenuShowMinimize = true;\r\n        public bool MainMenuShowMinimize\r\n        {\r\n            get\r\n            {\r\n                return mainMenuShowMinimize;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainMenuShowMinimize = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mainMenuShowLogout = false;\r\n        public bool MainMenuShowLogout\r\n        {\r\n            get\r\n            {\r\n                return mainMenuShowLogout;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainMenuShowLogout = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mainMenuShowLock = false;\r\n        public bool MainMenuShowLock\r\n        {\r\n            get\r\n            {\r\n                return mainMenuShowLock;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainMenuShowLock = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mainMenuShowTools = true;\r\n        public bool MainMenuShowTools\r\n        {\r\n            get\r\n            {\r\n                return mainMenuShowTools;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainMenuShowTools = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mainMenuExtensions = true;\r\n        public bool MainMenuShowExtensions\r\n        {\r\n            get\r\n            {\r\n                return mainMenuExtensions;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainMenuExtensions = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mainMenuClients = true;\r\n        public bool MainMenuShowClients\r\n        {\r\n            get\r\n            {\r\n                return mainMenuClients;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainMenuClients = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool swapStartDetailsAction = false;\r\n        public bool SwapStartDetailsAction\r\n        {\r\n            get\r\n            {\r\n                return swapStartDetailsAction;\r\n            }\r\n\r\n            set\r\n            {\r\n                swapStartDetailsAction = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool swapConfirmCancelButtons = false;\r\n        public bool SwapConfirmCancelButtons\r\n        {\r\n            get\r\n            {\r\n                return swapConfirmCancelButtons;\r\n            }\r\n\r\n            set\r\n            {\r\n                swapConfirmCancelButtons = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private float interfaceVolume = 0.5f;\r\n        public float InterfaceVolume\r\n        {\r\n            get\r\n            {\r\n                return interfaceVolume;\r\n            }\r\n\r\n            set\r\n            {\r\n                interfaceVolume = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private float musicVolume = 0.3f;\r\n        public float BackgroundVolume\r\n        {\r\n            get\r\n            {\r\n                return musicVolume;\r\n            }\r\n\r\n            set\r\n            {\r\n                musicVolume = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool muteInBackground = true;\r\n        public bool MuteInBackground\r\n        {\r\n            get\r\n            {\r\n                return muteInBackground;\r\n            }\r\n\r\n            set\r\n            {\r\n                muteInBackground = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool guideButtonFocus = false;\r\n        public bool GuideButtonFocus\r\n        {\r\n            get\r\n            {\r\n                return guideButtonFocus;\r\n            }\r\n\r\n            set\r\n            {\r\n                guideButtonFocus = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ImageLoadScaling imageScalerMode = ImageLoadScaling.BitmapDotNet;\r\n        public ImageLoadScaling ImageScalerMode\r\n        {\r\n            get => imageScalerMode;\r\n            set\r\n            {\r\n                imageScalerMode = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool smoothScrolling = true;\r\n        public bool SmoothScrolling\r\n        {\r\n            get => smoothScrolling;\r\n            set\r\n            {\r\n                smoothScrolling = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Settings/OldSettings/Plugins.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Settings.OldSettings\r\n{\r\n    public class BattleNetSettings\r\n    {\r\n        public bool LibraryDownloadEnabled { get; set; }\r\n        public bool IntegrationEnabled { get; set; }\r\n    }\r\n    public class SteamSettings\r\n    {\r\n        public enum SteamIdSource\r\n        {\r\n            Name,\r\n            LocalUser\r\n        }\r\n\r\n        public SteamIdSource IdSource { get; set; }\r\n        public ulong AccountId { get; set; }\r\n        public string AccountName { get; set; }\r\n        public bool PrivateAccount { get; set; }\r\n        public string APIKey { get; set; }\r\n        public bool LibraryDownloadEnabled { get; set; }\r\n        public bool IntegrationEnabled { get; set; }\r\n        public bool PreferScreenshotForBackground { get; set; }\r\n    }\r\n\r\n    public class UplaySettings\r\n    {\r\n        public bool LibraryDownloadEnabled { get; set; }\r\n        public bool IntegrationEnabled { get; set; }\r\n    }\r\n\r\n    public class OriginSettings\r\n    {\r\n        public bool LibraryDownloadEnabled { get; set; }\r\n        public bool IntegrationEnabled { get; set; }\r\n    }\r\n\r\n    public class GogSettings\r\n    {\r\n        public bool LibraryDownloadEnabled { get; set; }\r\n        public bool IntegrationEnabled { get; set; }\r\n        public bool RunViaGalaxy { get; set; }\r\n    }\r\n\r\n    public class Settings\r\n    {\r\n        public SteamSettings SteamSettings { get; set; }\r\n        public OriginSettings OriginSettings { get; set; }\r\n        public UplaySettings UplaySettings { get; set; }\r\n        public BattleNetSettings BattleNetSettings { get; set; }\r\n        public GogSettings GOGSettings { get; set; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Settings/PlaynitePaths.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class PlaynitePaths\r\n    {\r\n        public const string ExtensionManifestFileName = \"extension.yaml\";\r\n        public const string ThemeManifestFileName = \"theme.yaml\";\r\n        public const string PackedThemeFileExtention = \".pthm\";\r\n        public const string PackedExtensionFileExtention = \".pext\";\r\n        public const string EngLocSourceFileName = \"LocSource.xaml\";\r\n\r\n        public const string ThemeSlnFileName = \"Theme.sln\";\r\n        public const string ThemeProjFileName = \"Theme.csproj\";\r\n        public const string AppXamlFileName = \"App.xaml\";\r\n\r\n        public const string ExtensionsDirName = \"Extensions\";\r\n        public const string ExtensionsDataDirName = \"ExtensionsData\";\r\n        public const string ThemesDirName = \"Themes\";\r\n        public const string ConfigFileName = \"config.json\";\r\n        public const string FullscreenConfigFileName = \"fullscreenConfig.json\";\r\n        public const string WindowPositionsFileName = \"windowPositions.json\";\r\n        public const string LocalizationsDirName = \"Localization\";\r\n\r\n        public static string ProgramPath { get; }\r\n        public static string ConfigRootPath { get; private set; }\r\n        public static string LocalizationsPath { get; }\r\n        public static string DataCachePath { get; private set; }\r\n\r\n        public static string DesktopExecutablePath { get; }\r\n        public static string FullscreenExecutablePath { get; }\r\n        public static string PlayniteAssemblyPath { get; }\r\n        public static string PlayniteSDKAssemblyPath { get; }\r\n        public static string ExtensionsUserDataPath { get; private set; }\r\n        public static string ExtensionsProgramPath { get; }\r\n        public static string ExtensionsDataPath { get; private set; }\r\n        public static string ExtensionQueueFilePath { get; private set; }\r\n        public static string AddonLicenseAgreementsFilePath { get; private set; }\r\n        public static string LocalizationsStatusPath { get; }\r\n        public static string ThemesProgramPath { get; }\r\n        public static string ThemesUserDataPath { get; private set; }\r\n        public static string UninstallerPath { get; }\r\n        public static string BrowserCachePath { get; private set; }\r\n        public static string TempPath { get; }\r\n        public static string LogPath { get; private set; }\r\n        public static string ConfigFilePath { get; private set; }\r\n        public static string FullscreenConfigFilePath { get; private set; }\r\n        public static string WindowPositionsPath { get; private set; }\r\n        public static string BackupConfigFilePath { get; private set; }\r\n        public static string BackupFullscreenConfigFilePath { get; private set; }\r\n        public static string BackupWindowPositionsPath { get; private set; }\r\n        public static string ImagesCachePath { get; private set; }\r\n        public static string IconsCachePath { get; private set; }\r\n        public static string JitProfilesPath { get; private set; }\r\n        public static string EmulationDatabasePath { get; }\r\n        public static string SafeStartupFlagFile { get; private set; }\r\n        public static string BackupActionFile { get; private set; }\r\n        public static string RestoreBackupActionFile { get; private set; }\r\n\r\n        public static bool IsPortable { get; }\r\n\r\n        static PlaynitePaths()\r\n        {\r\n            ProgramPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);\r\n            UninstallerPath = Path.Combine(ProgramPath, \"unins000.exe\");\r\n            IsPortable = !File.Exists(UninstallerPath);\r\n\r\n            LocalizationsPath = Path.Combine(ProgramPath, LocalizationsDirName);\r\n            DesktopExecutablePath = Path.Combine(ProgramPath, \"Playnite.DesktopApp.exe\");\r\n            FullscreenExecutablePath = Path.Combine(ProgramPath, \"Playnite.FullscreenApp.exe\");\r\n            PlayniteAssemblyPath = Path.Combine(ProgramPath, \"Playnite.dll\");\r\n            PlayniteSDKAssemblyPath = Path.Combine(ProgramPath, \"Playnite.SDK.dll\");\r\n            ExtensionsProgramPath = Path.Combine(ProgramPath, ExtensionsDirName);\r\n            LocalizationsStatusPath = Path.Combine(LocalizationsPath, \"locstatus.json\");\r\n            ThemesProgramPath = Path.Combine(ProgramPath, ThemesDirName);\r\n            EmulationDatabasePath = Path.Combine(ProgramPath, \"Emulation\", \"Database\");\r\n            TempPath = Path.Combine(Path.GetTempPath(), \"Playnite\");\r\n\r\n            // We need to always initialize some default set for environments like Blend or Rider\r\n            UpdateUserDataDir(IsPortable ? ProgramPath : Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"Playnite\"));\r\n        }\r\n\r\n        public static void UpdateUserDataDir(string dir)\r\n        {\r\n            ConfigRootPath = dir;\r\n            DataCachePath = Path.Combine(ConfigRootPath, \"cache\");\r\n            ThemesUserDataPath = Path.Combine(ConfigRootPath, ThemesDirName);\r\n            ExtensionsDataPath = Path.Combine(ConfigRootPath, ExtensionsDataDirName);\r\n            ExtensionQueueFilePath = Path.Combine(ConfigRootPath, \"extinstalls.json\");\r\n            AddonLicenseAgreementsFilePath = Path.Combine(ConfigRootPath, \"licenseagreements.json\");\r\n            ExtensionsUserDataPath = Path.Combine(ConfigRootPath, ExtensionsDirName);\r\n            BrowserCachePath = Path.Combine(ConfigRootPath, \"browsercache\");\r\n            LogPath = Path.Combine(ConfigRootPath, \"playnite.log\");\r\n            ConfigFilePath = Path.Combine(ConfigRootPath, ConfigFileName);\r\n            FullscreenConfigFilePath = Path.Combine(ConfigRootPath, FullscreenConfigFileName);\r\n            WindowPositionsPath = Path.Combine(ConfigRootPath, WindowPositionsFileName);\r\n            BackupConfigFilePath = Path.Combine(ConfigRootPath, \"Backup\", ConfigFileName);\r\n            BackupFullscreenConfigFilePath = Path.Combine(ConfigRootPath, \"Backup\", FullscreenConfigFileName);\r\n            BackupWindowPositionsPath = Path.Combine(ConfigRootPath, \"Backup\", WindowPositionsFileName);\r\n            ImagesCachePath = Path.Combine(DataCachePath, \"images\");\r\n            IconsCachePath = Path.Combine(DataCachePath, \"icons\");\r\n            JitProfilesPath = Path.Combine(ConfigRootPath, \"JITProfiles\");\r\n            SafeStartupFlagFile = Path.Combine(ConfigRootPath, \"safestart.flag\");\r\n            BackupActionFile = Path.Combine(ConfigRootPath, \"backup.json\");\r\n            RestoreBackupActionFile = Path.Combine(ConfigRootPath, \"restoreBackup.json\");\r\n        }\r\n\r\n        public static string ExpandVariables(string inputString, string emulatorDir = null, bool fixSeparators = false)\r\n        {\r\n            if (string.IsNullOrEmpty(inputString) || !inputString.Contains('{'))\r\n            {\r\n                return inputString;\r\n            }\r\n\r\n            var result = inputString;\r\n            if (!emulatorDir.IsNullOrEmpty())\r\n            {\r\n                emulatorDir = emulatorDir.Replace(ExpandableVariables.PlayniteDirectory, ProgramPath, StringComparison.Ordinal);\r\n            }\r\n\r\n            result = result.Replace(ExpandableVariables.PlayniteDirectory, ProgramPath, StringComparison.Ordinal);\r\n            result = result.Replace(ExpandableVariables.EmulatorDirectory, emulatorDir, StringComparison.Ordinal);\r\n            return fixSeparators ? Paths.FixSeparators(result) : result;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/Settings/PlayniteSettings.cs",
    "content": "﻿using System;\r\nusing System.Collections.Concurrent;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Newtonsoft.Json;\r\nusing NLog;\r\nusing NLog.Config;\r\nusing NLog.Targets;\r\nusing System.Configuration;\r\nusing Playnite.Common;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Media;\r\nusing System.Windows;\r\nusing Newtonsoft.Json.Serialization;\r\nusing System.Runtime.Serialization;\r\nusing Playnite.Metadata;\r\nusing Playnite.SDK;\r\nusing Microsoft.Win32;\r\nusing Playnite.SDK.Models;\r\nusing System.Collections.ObjectModel;\r\nusing Playnite.SDK.Plugins;\r\n\r\nnamespace Playnite\r\n{\r\n    public enum DesktopSettingsPage\r\n    {\r\n        General = 0,\r\n        AppearanceGeneral = 1,\r\n        AppearanceAdvanced = 2,\r\n        AppearanceDetailsView = 3,\r\n        AppearanceGridView = 4,\r\n        AppearanceLayout = 5,\r\n        GeneralAdvanced = 6,\r\n        Input = 7,\r\n        Metadata = 9,\r\n        Scripting = 11,\r\n        ClientShutdown = 12,\r\n        Performance = 13,\r\n        ImportExlusionList = 14,\r\n        Development = 19,\r\n        AppearanceTopPanel = 20,\r\n        Sorting = 21,\r\n        Updates = 22,\r\n        AppearanceListView = 23,\r\n        Search = 24,\r\n        Backup = 25\r\n    }\r\n\r\n    public enum AccessibilityInterfaceOptions\r\n    {\r\n        [Description(LOC.Automatic)]\r\n        Auto,\r\n        [Description(LOC.AlwaysOn)]\r\n        AlwaysOn,\r\n        [Description(LOC.AlwaysOff)]\r\n        AlwaysOff\r\n    }\r\n\r\n    public enum GameSearchItemAction\r\n    {\r\n        [Description(LOC.GameSearchItemActionPlay)]\r\n        Play,\r\n        [Description(LOC.GameSearchItemActionSwitchTo)]\r\n        SwitchTo,\r\n        [Description(LOC.GameSearchItemActionOpenMenu)]\r\n        OpenMenu,\r\n        [Description(LOC.GameSearchItemActionEdit)]\r\n        Edit,\r\n        [Description(LOC.None)]\r\n        None\r\n    }\r\n\r\n    public enum AfterLaunchOptions\r\n    {\r\n        [Description(LOC.DoNothing)]\r\n        None,\r\n        [Description(LOC.Minimize)]\r\n        Minimize,\r\n        [Description(LOC.Close)]\r\n        Close\r\n    }\r\n\r\n    public enum AfterGameCloseOptions\r\n    {\r\n        [Description(LOC.DoNothing)]\r\n        None,\r\n        [Description(LOC.RestoreWindow)]\r\n        Restore,\r\n        [Description(LOC.RestoreWindowOnlyFromUI)]\r\n        RestoreOnlyFromUI,\r\n        [Description(LOC.ExitPlaynite)]\r\n        Exit\r\n    }\r\n\r\n    public enum ApplicationView\r\n    {\r\n        Library,\r\n        Statistics\r\n    }\r\n\r\n    public enum ImageLoadScaling\r\n    {\r\n        [Description(LOC.SettingsImageScalingQuality)]\r\n        None,\r\n        [Description(LOC.SettingsImageScalingBalanced)]\r\n        BitmapDotNet,\r\n        [Description(LOC.SettingsImageScalingAlternative)]\r\n        Custom\r\n    }\r\n\r\n    public enum TrayIconType\r\n    {\r\n        [Description(\"TrayIcon\")]\r\n        Default,\r\n        [Description(\"TrayIconWhite\")]\r\n        Bright,\r\n        [Description(\"TrayIconBlack\")]\r\n        Dark\r\n    }\r\n\r\n    public enum DefaultIconSourceOptions\r\n    {\r\n        [Description(\"LOCGameProviderTitle\")]\r\n        Library,\r\n        [Description(\"LOCPlatformTitle\")]\r\n        Platform,\r\n        [Description(\"Playnite\")]\r\n        General,\r\n        [Description(\"LOCNone\")]\r\n        None\r\n    }\r\n\r\n    public enum DefaultCoverSourceOptions\r\n    {\r\n        [Description(\"LOCPlatformTitle\")]\r\n        Platform,\r\n        [Description(\"Playnite\")]\r\n        General,\r\n        [Description(\"LOCNone\")]\r\n        None\r\n    }\r\n\r\n    public enum DefaultBackgroundSourceOptions\r\n    {\r\n        [Description(\"LOCGameProviderTitle\")]\r\n        Library,\r\n        [Description(\"LOCPlatformTitle\")]\r\n        Platform,\r\n        [Description(\"LOCGameCoverTitle\")]\r\n        Cover,\r\n        [Description(\"LOCNone\")]\r\n        None\r\n    }\r\n\r\n    public enum TextRenderingModeOptions\r\n    {\r\n        [Description(\"LOCSettingsTextRenderingModeOptionAuto\")]\r\n        Auto = 0,\r\n        [Description(\"LOCSettingsTextRenderingModeOptionAliased\")]\r\n        Aliased = 1,\r\n        [Description(\"LOCSettingsTextRenderingModeOptionGrayscale\")]\r\n        Grayscale = 2,\r\n        [Description(\"LOCSettingsTextRenderingModeOptionClearType\")]\r\n        ClearType = 3\r\n    }\r\n\r\n    public enum TextFormattingModeOptions\r\n    {\r\n        [Description(\"LOCSettingsTextFormattingModeOptionIdeal\")]\r\n        Ideal = 0,\r\n        [Description(\"LOCSettingsTextFormattingModeOptionDisplay\")]\r\n        Display = 1\r\n    }\r\n\r\n    public enum UpdateCheckFrequency\r\n    {\r\n        [Description(LOC.OptionOnEveryStartup)]\r\n        OnEveryStartup = 0,\r\n        [Description(LOC.OptionOnceADay)]\r\n        OnceADay = 1,\r\n        [Description(LOC.OptionOnceAWeek)]\r\n        OnceAWeek = 2,\r\n        [Description(LOC.OptionOnlyManually)]\r\n        Manually = 3\r\n    }\r\n\r\n    public enum LibraryUpdateCheckFrequency\r\n    {\r\n        [Description(LOC.OptionOnlyManually)]\r\n        Manually = 0,\r\n        [Description(LOC.OptionOnEveryStartup)]\r\n        OnEveryStartup = 1,\r\n        [Description(LOC.OptionOnceADay)]\r\n        OnceADay = 2,\r\n        [Description(LOC.OptionOnceAWeek)]\r\n        OnceAWeek = 3\r\n    }\r\n\r\n    public enum AutoBackupFrequency\r\n    {\r\n        [Description(LOC.OptionOnceADay)]\r\n        OnceADay = 1,\r\n        [Description(LOC.OptionOnceAWeek)]\r\n        OnceAWeek = 2\r\n    }\r\n\r\n    public enum SafeSearchSettings\r\n    {\r\n        [Description(LOC.Default)]\r\n        Default,\r\n        [Description(LOC.EnabledTitle)]\r\n        On,\r\n        [Description(LOC.DisabledTitle)]\r\n        Off\r\n    }\r\n\r\n    public class DateFormattingOptions : ObservableObject\r\n    {\r\n        private string format;\r\n        private bool pastWeekRelativeFormat;\r\n\r\n        public string Format { get => format; set => SetValue(ref format, value); }\r\n        public bool PastWeekRelativeFormat { get => pastWeekRelativeFormat; set => SetValue(ref pastWeekRelativeFormat, value); }\r\n\r\n        public DateFormattingOptions()\r\n        {\r\n        }\r\n\r\n        public DateFormattingOptions(string format, bool pastWeekRelativeFormat)\r\n        {\r\n            Format = format;\r\n            PastWeekRelativeFormat = pastWeekRelativeFormat;\r\n        }\r\n    }\r\n\r\n    public class ReleaseDateFormattingOptions : DateFormattingOptions\r\n    {\r\n        private string partialFormat = Constants.DefaultPartialReleaseDateTimeFormat;\r\n        public string PartialFormat { get => partialFormat; set => SetValue(ref partialFormat, value); }\r\n\r\n        public ReleaseDateFormattingOptions() : base()\r\n        {\r\n        }\r\n\r\n        public ReleaseDateFormattingOptions(string format, bool pastWeekRelativeFormat) : base(format, pastWeekRelativeFormat)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class PlayniteSettings : ObservableObject\r\n    {\r\n        private static SDK.ILogger logger = SDK.LogManager.GetLogger();\r\n\r\n        public int Version\r\n        {\r\n            get; set;\r\n        } = 7;\r\n\r\n        private DetailsVisibilitySettings detailsVisibility = new DetailsVisibilitySettings();\r\n        public DetailsVisibilitySettings DetailsVisibility\r\n        {\r\n            get\r\n            {\r\n                return detailsVisibility;\r\n            }\r\n\r\n            set\r\n            {\r\n                detailsVisibility = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DefaultIconSourceOptions defaultIconSource = DefaultIconSourceOptions.General;\r\n        public DefaultIconSourceOptions DefaultIconSource\r\n        {\r\n            get\r\n            {\r\n                return defaultIconSource;\r\n            }\r\n\r\n            set\r\n            {\r\n                defaultIconSource = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DefaultCoverSourceOptions defaultCoverSource = DefaultCoverSourceOptions.General;\r\n        public DefaultCoverSourceOptions DefaultCoverSource\r\n        {\r\n            get\r\n            {\r\n                return defaultCoverSource;\r\n            }\r\n\r\n            set\r\n            {\r\n                defaultCoverSource = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DefaultBackgroundSourceOptions defaultBackgroundSource = DefaultBackgroundSourceOptions.None;\r\n        public DefaultBackgroundSourceOptions DefaultBackgroundSource\r\n        {\r\n            get\r\n            {\r\n                return defaultBackgroundSource;\r\n            }\r\n\r\n            set\r\n            {\r\n                defaultBackgroundSource = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool indentGameDetails = true;\r\n        public bool IndentGameDetails\r\n        {\r\n            get\r\n            {\r\n                return indentGameDetails;\r\n            }\r\n\r\n            set\r\n            {\r\n                indentGameDetails = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(CalculatedGameDetailsIndentation));\r\n            }\r\n        }\r\n\r\n        public double CalculatedGameDetailsIndentation\r\n        {\r\n            get\r\n            {\r\n                return IndentGameDetails ? GameDetailsIndentation : Double.NaN;\r\n            }\r\n        }\r\n\r\n        private int gameDetailsIndentation = 400;\r\n        public int GameDetailsIndentation\r\n        {\r\n            get\r\n            {\r\n                return gameDetailsIndentation;\r\n            }\r\n\r\n            set\r\n            {\r\n                gameDetailsIndentation = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(CalculatedGameDetailsIndentation));\r\n            }\r\n        }\r\n\r\n        private Dock gridViewDetailsPosition = Dock.Right;\r\n        public Dock GridViewDetailsPosition\r\n        {\r\n            get\r\n            {\r\n                return gridViewDetailsPosition;\r\n            }\r\n\r\n            set\r\n            {\r\n                gridViewDetailsPosition = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Dock filterPanelPosition = Dock.Right;\r\n        public Dock FilterPanelPosition\r\n        {\r\n            get\r\n            {\r\n                return filterPanelPosition;\r\n            }\r\n\r\n            set\r\n            {\r\n                filterPanelPosition = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Dock explorerPanelPosition = Dock.Left;\r\n        public Dock ExplorerPanelPosition\r\n        {\r\n            get\r\n            {\r\n                return explorerPanelPosition;\r\n            }\r\n\r\n            set\r\n            {\r\n                explorerPanelPosition = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Dock detailsListPosition = Dock.Left;\r\n        public Dock DetailsListPosition\r\n        {\r\n            get\r\n            {\r\n                return detailsListPosition;\r\n            }\r\n\r\n            set\r\n            {\r\n                detailsListPosition = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool explorerPanelVisible = false;\r\n        public bool ExplorerPanelVisible\r\n        {\r\n            get\r\n            {\r\n                return explorerPanelVisible;\r\n            }\r\n\r\n            set\r\n            {\r\n                explorerPanelVisible = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double filterPanelWitdh = 240;\r\n        public double FilterPanelWitdh\r\n        {\r\n            get\r\n            {\r\n                return filterPanelWitdh;\r\n            }\r\n\r\n            set\r\n            {\r\n                filterPanelWitdh = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double explorerPanelWitdh = 280;\r\n        public double ExplorerPanelWitdh\r\n        {\r\n            get\r\n            {\r\n                return explorerPanelWitdh;\r\n            }\r\n\r\n            set\r\n            {\r\n                explorerPanelWitdh = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double grdiDetailsWitdh = 350;\r\n        public double GrdiDetailsWitdh\r\n        {\r\n            get\r\n            {\r\n                return grdiDetailsWitdh;\r\n            }\r\n\r\n            set\r\n            {\r\n                grdiDetailsWitdh = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double detailsListWitdh = 350;\r\n        public double DetailsListWitdh\r\n        {\r\n            get\r\n            {\r\n                return detailsListWitdh;\r\n            }\r\n\r\n            set\r\n            {\r\n                detailsListWitdh = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showGridItemBackground = true;\r\n        public bool ShowGridItemBackground\r\n        {\r\n            get\r\n            {\r\n                return showGridItemBackground;\r\n            }\r\n\r\n            set\r\n            {\r\n                showGridItemBackground = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        [JsonIgnore]\r\n        public double GridItemHeight\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        private double gridItemWidth = ViewSettings.DefaultGridItemWidth;\r\n        public double GridItemWidth\r\n        {\r\n            get\r\n            {\r\n                return gridItemWidth;\r\n            }\r\n\r\n            set\r\n            {\r\n                gridItemWidth = Math.Round(value);\r\n                OnPropertyChanged();\r\n                UpdateGridItemHeight();\r\n            }\r\n        }\r\n\r\n        [JsonIgnore]\r\n        public AspectRatio CoverAspectRatio => new AspectRatio(GridItemWidthRatio, GridItemHeightRatio);\r\n\r\n        private int gridItemWidthRatio = 3;\r\n        public int GridItemWidthRatio\r\n        {\r\n            get\r\n            {\r\n                return gridItemWidthRatio;\r\n            }\r\n\r\n            set\r\n            {\r\n                gridItemWidthRatio = value;\r\n                OnPropertyChanged();\r\n                UpdateGridItemHeight();\r\n                OnPropertyChanged(nameof(CoverAspectRatio));\r\n            }\r\n        }\r\n\r\n        private int gridItemHeightRatio = 4;\r\n        public int GridItemHeightRatio\r\n        {\r\n            get\r\n            {\r\n                return gridItemHeightRatio;\r\n            }\r\n\r\n            set\r\n            {\r\n                gridItemHeightRatio = value;\r\n                OnPropertyChanged();\r\n                UpdateGridItemHeight();\r\n                OnPropertyChanged(nameof(CoverAspectRatio));\r\n            }\r\n        }\r\n\r\n        private Stretch coverArtStretch = Stretch.UniformToFill;\r\n        public Stretch CoverArtStretch\r\n        {\r\n            get\r\n            {\r\n                return coverArtStretch;\r\n            }\r\n\r\n            set\r\n            {\r\n                coverArtStretch = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int gridItemSpacing = 8;\r\n        public int GridItemSpacing\r\n        {\r\n            get\r\n            {\r\n                return gridItemSpacing;\r\n            }\r\n\r\n            set\r\n            {\r\n                gridItemSpacing = value;\r\n                OnPropertyChanged();\r\n                ItemSpacingMargin = GetItemSpacingMargin();\r\n                OnPropertyChanged(nameof(ItemSpacingMargin));\r\n            }\r\n        }\r\n\r\n        private int gridItemMargin = 2;\r\n        public int GridItemMargin\r\n        {\r\n            get\r\n            {\r\n                return gridItemMargin;\r\n            }\r\n\r\n            set\r\n            {\r\n                gridItemMargin = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int fullscreenItemSpacing = 20;\r\n        public int FullscreenItemSpacing\r\n        {\r\n            get\r\n            {\r\n                return fullscreenItemSpacing;\r\n            }\r\n\r\n            set\r\n            {\r\n                fullscreenItemSpacing = value;\r\n                OnPropertyChanged();\r\n                FullscreenItemSpacingMargin = GetFullscreenItemSpacingMargin();\r\n                OnPropertyChanged(nameof(FullscreenItemSpacingMargin));\r\n            }\r\n        }\r\n\r\n        [JsonIgnore]\r\n        public Thickness ItemSpacingMargin\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        [JsonIgnore]\r\n        public Thickness FullscreenItemSpacingMargin\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        private bool firstTimeWizardComplete;\r\n        public bool FirstTimeWizardComplete\r\n        {\r\n            get\r\n            {\r\n                return firstTimeWizardComplete;\r\n            }\r\n\r\n            set\r\n            {\r\n                firstTimeWizardComplete = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool disableHwAcceleration = false;\r\n        [RequiresRestart]\r\n        public bool DisableHwAcceleration\r\n        {\r\n            get\r\n            {\r\n                return disableHwAcceleration;\r\n            }\r\n\r\n            set\r\n            {\r\n                disableHwAcceleration = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool asyncImageLoading = true;\r\n        [RequiresRestart]\r\n        public bool AsyncImageLoading\r\n        {\r\n            get\r\n            {\r\n                return asyncImageLoading;\r\n            }\r\n\r\n            set\r\n            {\r\n                asyncImageLoading = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showNameEmptyCover = true;\r\n        public bool ShowNameEmptyCover\r\n        {\r\n            get\r\n            {\r\n                return showNameEmptyCover;\r\n            }\r\n\r\n            set\r\n            {\r\n                showNameEmptyCover = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showNamesUnderCovers = false;\r\n        public bool ShowNamesUnderCovers\r\n        {\r\n            get\r\n            {\r\n                return showNamesUnderCovers;\r\n            }\r\n\r\n            set\r\n            {\r\n                showNamesUnderCovers = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showBackgroundImageOnWindow = true;\r\n        public bool ShowBackgroundImageOnWindow\r\n        {\r\n            get\r\n            {\r\n                return showBackgroundImageOnWindow;\r\n            }\r\n\r\n            set\r\n            {\r\n                showBackgroundImageOnWindow = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool highQualityBackgroundBlur = true;\r\n        public bool HighQualityBackgroundBlur\r\n        {\r\n            get\r\n            {\r\n                return highQualityBackgroundBlur;\r\n            }\r\n\r\n            set\r\n            {\r\n                highQualityBackgroundBlur = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool blurWindowBackgroundImage = true;\r\n        public bool BlurWindowBackgroundImage\r\n        {\r\n            get\r\n            {\r\n                return blurWindowBackgroundImage;\r\n            }\r\n\r\n            set\r\n            {\r\n                blurWindowBackgroundImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double backgroundImageBlurAmount = 60;\r\n        public double BackgroundImageBlurAmount\r\n        {\r\n            get\r\n            {\r\n                return backgroundImageBlurAmount;\r\n            }\r\n\r\n            set\r\n            {\r\n                backgroundImageBlurAmount = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool darkenWindowBackgroundImage = true;\r\n        public bool DarkenWindowBackgroundImage\r\n        {\r\n            get\r\n            {\r\n                return darkenWindowBackgroundImage;\r\n            }\r\n\r\n            set\r\n            {\r\n                darkenWindowBackgroundImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private float backgroundImageDarkAmount = 0.7f;\r\n        public float BackgroundImageDarkAmount\r\n        {\r\n            get\r\n            {\r\n                return backgroundImageDarkAmount;\r\n            }\r\n\r\n            set\r\n            {\r\n                backgroundImageDarkAmount = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showBackImageOnGridView = false;\r\n        public bool ShowBackImageOnGridView\r\n        {\r\n            get\r\n            {\r\n                return showBackImageOnGridView;\r\n            }\r\n\r\n            set\r\n            {\r\n                showBackImageOnGridView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool downloadMetadataOnImport = true;\r\n        public bool DownloadMetadataOnImport\r\n        {\r\n            get\r\n            {\r\n                return downloadMetadataOnImport;\r\n            }\r\n\r\n            set\r\n            {\r\n                downloadMetadataOnImport = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showIconsOnList = true;\r\n        public bool ShowIconsOnList\r\n        {\r\n            get\r\n            {\r\n                return showIconsOnList;\r\n            }\r\n\r\n            set\r\n            {\r\n                showIconsOnList = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showGroupCount = true;\r\n        public bool ShowGroupCount\r\n        {\r\n            get\r\n            {\r\n                return showGroupCount;\r\n            }\r\n\r\n            set\r\n            {\r\n                showGroupCount = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool startInFullscreen = false;\r\n        public bool StartInFullscreen\r\n        {\r\n            get\r\n            {\r\n                return startInFullscreen;\r\n            }\r\n\r\n            set\r\n            {\r\n                startInFullscreen = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string databasePath;\r\n        [RequiresRestart]\r\n        public string DatabasePath\r\n        {\r\n            get\r\n            {\r\n                return databasePath;\r\n            }\r\n\r\n            set\r\n            {\r\n                databasePath = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FilterSettings filterSettings = new FilterSettings();\r\n        public FilterSettings FilterSettings\r\n        {\r\n            get\r\n            {\r\n                return filterSettings;\r\n            }\r\n\r\n            set\r\n            {\r\n                filterSettings = value;\r\n            }\r\n        }\r\n\r\n        private ViewSettings desktopViewSettings = new ViewSettings();\r\n        public ViewSettings ViewSettings\r\n        {\r\n            get\r\n            {\r\n                return desktopViewSettings;\r\n            }\r\n\r\n            set\r\n            {\r\n                desktopViewSettings = value;\r\n            }\r\n        }\r\n\r\n        private bool gridViewSideBarVisible = false;\r\n        public bool GridViewSideBarVisible\r\n        {\r\n            get\r\n            {\r\n                return gridViewSideBarVisible;\r\n            }\r\n\r\n            set\r\n            {\r\n                gridViewSideBarVisible = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool filterPanelVisible = false;\r\n        public bool FilterPanelVisible\r\n        {\r\n            get\r\n            {\r\n                return filterPanelVisible;\r\n            }\r\n\r\n            set\r\n            {\r\n                filterPanelVisible = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool notificationPanelVisible = false;\r\n        [JsonIgnore]\r\n        public bool NotificationPanelVisible\r\n        {\r\n            get\r\n            {\r\n                return notificationPanelVisible;\r\n            }\r\n\r\n            set\r\n            {\r\n                notificationPanelVisible = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showSidebar = true;\r\n        public bool ShowSidebar\r\n        {\r\n            get\r\n            {\r\n                return showSidebar;\r\n            }\r\n\r\n            set\r\n            {\r\n                showSidebar = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowMainMenuOnTopPanel));\r\n            }\r\n        }\r\n\r\n        private Dock sidebarPosition = Dock.Left;\r\n        public Dock SidebarPosition\r\n        {\r\n            get\r\n            {\r\n                return sidebarPosition;\r\n            }\r\n\r\n            set\r\n            {\r\n                sidebarPosition = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mainMenuButtonSidebarMove = true;\r\n        public bool MainMenuButtonSidebarMove\r\n        {\r\n            get\r\n            {\r\n                return mainMenuButtonSidebarMove;\r\n            }\r\n\r\n            set\r\n            {\r\n                mainMenuButtonSidebarMove = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowMainMenuOnTopPanel));\r\n            }\r\n        }\r\n\r\n        [JsonIgnore]\r\n        public bool ShowMainMenuOnTopPanel => !ShowSidebar || (ShowSidebar && !MainMenuButtonSidebarMove);\r\n\r\n        private bool minimizeToTray = false;\r\n        public bool MinimizeToTray\r\n        {\r\n            get\r\n            {\r\n                return minimizeToTray;\r\n            }\r\n\r\n            set\r\n            {\r\n                minimizeToTray = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool closeToTray = true;\r\n        public bool CloseToTray\r\n        {\r\n            get\r\n            {\r\n                return closeToTray;\r\n            }\r\n\r\n            set\r\n            {\r\n                closeToTray = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool enableTray = true;\r\n        [RequiresRestart]\r\n        public bool EnableTray\r\n        {\r\n            get\r\n            {\r\n                return enableTray;\r\n            }\r\n\r\n            set\r\n            {\r\n                enableTray = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string language = \"english\";\r\n        [RequiresRestart]\r\n        public string Language\r\n        {\r\n            get\r\n            {\r\n                return language;\r\n            }\r\n\r\n            set\r\n            {\r\n                language = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private AfterLaunchOptions afterLaunch = AfterLaunchOptions.Minimize;\r\n        public AfterLaunchOptions AfterLaunch\r\n        {\r\n            get\r\n            {\r\n                return afterLaunch;\r\n            }\r\n\r\n            set\r\n            {\r\n                afterLaunch = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private AfterGameCloseOptions afterGameClose = AfterGameCloseOptions.RestoreOnlyFromUI;\r\n        public AfterGameCloseOptions AfterGameClose\r\n        {\r\n            get\r\n            {\r\n                return afterGameClose;\r\n            }\r\n\r\n            set\r\n            {\r\n                afterGameClose = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string theme = ThemeManager.DefaultDesktopThemeId;\r\n        [RequiresRestart]\r\n        public string Theme\r\n        {\r\n            get\r\n            {\r\n                return theme;\r\n            }\r\n\r\n            set\r\n            {\r\n                theme = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private TrayIconType trayIcon = TrayIconType.Default;\r\n        [RequiresRestart]\r\n        public TrayIconType TrayIcon\r\n        {\r\n            get\r\n            {\r\n                return trayIcon;\r\n            }\r\n\r\n            set\r\n            {\r\n                trayIcon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public string InstallInstanceId\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        private List<string> disabledPlugins = new List<string>();\r\n        [RequiresRestart]\r\n        public List<string> DisabledPlugins\r\n        {\r\n            get\r\n            {\r\n                return disabledPlugins;\r\n            }\r\n\r\n            set\r\n            {\r\n                disabledPlugins = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool startMinimized = false;\r\n        public bool StartMinimized\r\n        {\r\n            get\r\n            {\r\n                return startMinimized;\r\n            }\r\n\r\n            set\r\n            {\r\n                startMinimized = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool startOnBoot = false;\r\n        public bool StartOnBoot\r\n        {\r\n            get\r\n            {\r\n                return startOnBoot;\r\n            }\r\n\r\n            set\r\n            {\r\n                startOnBoot = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool startOnBootClosedToTray = false;\r\n        public bool StartOnBootClosedToTray\r\n        {\r\n            get\r\n            {\r\n                return startOnBootClosedToTray;\r\n            }\r\n\r\n            set\r\n            {\r\n                startOnBootClosedToTray = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool enableGameControllerSupport = false;\r\n        [RequiresRestart]\r\n        public bool EnableGameControllerSupport\r\n        {\r\n            get\r\n            {\r\n                return enableGameControllerSupport;\r\n            }\r\n\r\n            set\r\n            {\r\n                enableGameControllerSupport = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<string> disabledGameControllers = new List<string>();\r\n        public List<string> DisabledGameControllers\r\n        {\r\n            get\r\n            {\r\n                return disabledGameControllers;\r\n            }\r\n\r\n            set\r\n            {\r\n                disabledGameControllers = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showPanelSeparators = true;\r\n        public bool ShowPanelSeparators\r\n        {\r\n            get\r\n            {\r\n                return showPanelSeparators;\r\n            }\r\n\r\n            set\r\n            {\r\n                showPanelSeparators = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double gameDetailsCoverHeight = 170;\r\n        public double GameDetailsCoverHeight\r\n        {\r\n            get\r\n            {\r\n                return gameDetailsCoverHeight;\r\n            }\r\n\r\n            set\r\n            {\r\n                gameDetailsCoverHeight = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string fontFamilyName = \"Trebuchet MS\";\r\n        [RequiresRestart]\r\n        public string FontFamilyName\r\n        {\r\n            get\r\n            {\r\n                return fontFamilyName;\r\n            }\r\n\r\n            set\r\n            {\r\n                fontFamilyName = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string monospaceFontFamilyName = \"Consolas\";\r\n        [RequiresRestart]\r\n        public string MonospaceFontFamilyName\r\n        {\r\n            get\r\n            {\r\n                return monospaceFontFamilyName;\r\n            }\r\n\r\n            set\r\n            {\r\n                monospaceFontFamilyName = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double fontSize = 14;\r\n        [RequiresRestart]\r\n        public double FontSize\r\n        {\r\n            get\r\n            {\r\n                return fontSize;\r\n            }\r\n\r\n            set\r\n            {\r\n                fontSize = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double fontSizeSmall = 12;\r\n        [RequiresRestart]\r\n        public double FontSizeSmall\r\n        {\r\n            get\r\n            {\r\n                return fontSizeSmall;\r\n            }\r\n\r\n            set\r\n            {\r\n                fontSizeSmall = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double fontSizeLarge = 15;\r\n        [RequiresRestart]\r\n        public double FontSizeLarge\r\n        {\r\n            get\r\n            {\r\n                return fontSizeLarge;\r\n            }\r\n\r\n            set\r\n            {\r\n                fontSizeLarge = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double fontSizeLarger = 20;\r\n        [RequiresRestart]\r\n        public double FontSizeLarger\r\n        {\r\n            get\r\n            {\r\n                return fontSizeLarger;\r\n            }\r\n\r\n            set\r\n            {\r\n                fontSizeLarger = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double fontSizeLargest = 29;\r\n        [RequiresRestart]\r\n        public double FontSizeLargest\r\n        {\r\n            get\r\n            {\r\n                return fontSizeLargest;\r\n            }\r\n\r\n            set\r\n            {\r\n                fontSizeLargest = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double detailsViewListIconSize = 26;\r\n        public double DetailsViewListIconSize\r\n        {\r\n            get\r\n            {\r\n                return detailsViewListIconSize;\r\n            }\r\n\r\n            set\r\n            {\r\n                detailsViewListIconSize = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private TextFormattingModeOptions textFormattingMode = TextFormattingModeOptions.Ideal;\r\n        [RequiresRestart]\r\n        public TextFormattingModeOptions TextFormattingMode\r\n        {\r\n            get\r\n            {\r\n                return textFormattingMode;\r\n            }\r\n\r\n            set\r\n            {\r\n                textFormattingMode = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private TextRenderingModeOptions textRenderingMode = TextRenderingModeOptions.Auto;\r\n        [RequiresRestart]\r\n        public TextRenderingModeOptions TextRenderingMode\r\n        {\r\n            get\r\n            {\r\n                return textRenderingMode;\r\n            }\r\n\r\n            set\r\n            {\r\n                textRenderingMode = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MetadataDownloaderSettings metadataSettings;\r\n        public MetadataDownloaderSettings MetadataSettings\r\n        {\r\n            get\r\n            {\r\n                return metadataSettings;\r\n            }\r\n\r\n            set\r\n            {\r\n                metadataSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string preScript;\r\n        public string PreScript\r\n        {\r\n            get => preScript;\r\n            set\r\n            {\r\n                preScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string postScript;\r\n        public string PostScript\r\n        {\r\n            get => postScript;\r\n            set\r\n            {\r\n                postScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string gameStartedScript;\r\n        public string GameStartedScript\r\n        {\r\n            get => gameStartedScript;\r\n            set\r\n            {\r\n                gameStartedScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string appStartupScript;\r\n        public string AppStartupScript\r\n        {\r\n            get => appStartupScript;\r\n            set\r\n            {\r\n                appStartupScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string appShutdownScript;\r\n        public string AppShutdownScript\r\n        {\r\n            get => appShutdownScript;\r\n            set\r\n            {\r\n                appShutdownScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool downloadBackgroundsImmediately = true;\r\n        public bool DownloadBackgroundsImmediately\r\n        {\r\n            get => downloadBackgroundsImmediately;\r\n            set\r\n            {\r\n                downloadBackgroundsImmediately = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showImagePerformanceWarning = true;\r\n        public bool ShowImagePerformanceWarning\r\n        {\r\n            get => showImagePerformanceWarning;\r\n            set\r\n            {\r\n                showImagePerformanceWarning = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool backgroundImageAnimation = true;\r\n        public bool BackgroundImageAnimation\r\n        {\r\n            get => backgroundImageAnimation;\r\n            set\r\n            {\r\n                backgroundImageAnimation = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private AutoClientShutdownSettings clientAutoShutdown = new AutoClientShutdownSettings();\r\n        public AutoClientShutdownSettings ClientAutoShutdown\r\n        {\r\n            get => clientAutoShutdown;\r\n            set\r\n            {\r\n                clientAutoShutdown = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool darkenUninstalledGamesGrid = false;\r\n        public bool DarkenUninstalledGamesGrid\r\n        {\r\n            get => darkenUninstalledGamesGrid;\r\n            set\r\n            {\r\n                darkenUninstalledGamesGrid = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool usedFieldsOnlyOnFilterLists = true;\r\n        public bool UsedFieldsOnlyOnFilterLists\r\n        {\r\n            get => usedFieldsOnlyOnFilterLists;\r\n            set\r\n            {\r\n                usedFieldsOnlyOnFilterLists = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool discordPresenceEnabled = false;\r\n        public bool DiscordPresenceEnabled\r\n        {\r\n            get => discordPresenceEnabled;\r\n            set\r\n            {\r\n                discordPresenceEnabled = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showHiddenInQuickLaunch = true;\r\n        public bool ShowHiddenInQuickLaunch\r\n        {\r\n            get => showHiddenInQuickLaunch;\r\n            set\r\n            {\r\n                showHiddenInQuickLaunch = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int quickLaunchItems = 10;\r\n        public int QuickLaunchItems\r\n        {\r\n            get => quickLaunchItems;\r\n            set\r\n            {\r\n                quickLaunchItems = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string directoryOpenCommand;\r\n        public string DirectoryOpenCommand\r\n        {\r\n            get => directoryOpenCommand;\r\n            set\r\n            {\r\n                directoryOpenCommand = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private AgeRatingOrg ageRatingOrgPriority = AgeRatingOrg.PEGI;\r\n        public AgeRatingOrg AgeRatingOrgPriority\r\n        {\r\n            get => ageRatingOrgPriority;\r\n            set\r\n            {\r\n                ageRatingOrgPriority = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool traceLogEnabled = false;\r\n        public bool TraceLogEnabled\r\n        {\r\n            get => traceLogEnabled;\r\n            set\r\n            {\r\n                traceLogEnabled = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double gridViewScrollSensitivity = 1.5;\r\n        public double GridViewScrollSensitivity\r\n        {\r\n            get => gridViewScrollSensitivity;\r\n            set\r\n            {\r\n                gridViewScrollSensitivity = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private long gridViewScrollSpeed = 250 * TimeSpan.TicksPerMillisecond;\r\n        public long GridViewScrollSpeed\r\n        {\r\n            get => gridViewScrollSpeed;\r\n            set\r\n            {\r\n                gridViewScrollSpeed = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool gridViewSmoothScrollEnabled = false;\r\n        public bool GridViewSmoothScrollEnabled\r\n        {\r\n            get => gridViewSmoothScrollEnabled;\r\n            set\r\n            {\r\n                gridViewSmoothScrollEnabled = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double detailsViewScrollSensitivity = 1.5;\r\n        public double DetailsViewScrollSensitivity\r\n        {\r\n            get => detailsViewScrollSensitivity;\r\n            set\r\n            {\r\n                detailsViewScrollSensitivity = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private long detailsViewScrollSpeed = 250 * TimeSpan.TicksPerMillisecond;\r\n        public long DetailsViewScrollSpeed\r\n        {\r\n            get => detailsViewScrollSpeed;\r\n            set\r\n            {\r\n                detailsViewScrollSpeed = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool detailsViewSmoothScrollEnabled = false;\r\n        public bool DetailsViewSmoothScrollEnabled\r\n        {\r\n            get => detailsViewSmoothScrollEnabled;\r\n            set\r\n            {\r\n                detailsViewSmoothScrollEnabled = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double listViewScrollSensitivity = 1.5;\r\n        public double ListViewScrollSensitivity\r\n        {\r\n            get => listViewScrollSensitivity;\r\n            set\r\n            {\r\n                listViewScrollSensitivity = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private long listViewScrollSpeed = 250 * TimeSpan.TicksPerMillisecond;\r\n        public long ListViewScrollSpeed\r\n        {\r\n            get => listViewScrollSpeed;\r\n            set\r\n            {\r\n                listViewScrollSpeed = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool listViewSmoothScrollEnabled = false;\r\n        public bool ListViewSmoothScrollEnabled\r\n        {\r\n            get => listViewSmoothScrollEnabled;\r\n            set\r\n            {\r\n                listViewSmoothScrollEnabled = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelGeneralViewItem = false;\r\n        public bool ShowTopPanelGeneralViewItem\r\n        {\r\n            get => showTopPanelGeneralViewItem;\r\n            set\r\n            {\r\n                showTopPanelGeneralViewItem = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelGroupingItem = true;\r\n        public bool ShowTopPanelGroupingItem\r\n        {\r\n            get => showTopPanelGroupingItem;\r\n            set\r\n            {\r\n                showTopPanelGroupingItem = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelSortingItem = true;\r\n        public bool ShowTopPanelSortingItem\r\n        {\r\n            get => showTopPanelSortingItem;\r\n            set\r\n            {\r\n                showTopPanelSortingItem = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelFilterPresetsItem = true;\r\n        public bool ShowTopPanelFilterPresetsItem\r\n        {\r\n            get => showTopPanelFilterPresetsItem;\r\n            set\r\n            {\r\n                showTopPanelFilterPresetsItem = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelDetailsViewSwitch = true;\r\n        public bool ShowTopPanelDetailsViewSwitch\r\n        {\r\n            get => showTopPanelDetailsViewSwitch;\r\n            set\r\n            {\r\n                showTopPanelDetailsViewSwitch = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelGridViewSwitch = true;\r\n        public bool ShowTopPanelGridViewSwitch\r\n        {\r\n            get => showTopPanelGridViewSwitch;\r\n            set\r\n            {\r\n                showTopPanelGridViewSwitch = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelListViewSwitch = true;\r\n        public bool ShowTopPanelListViewSwitch\r\n        {\r\n            get => showTopPanelListViewSwitch;\r\n            set\r\n            {\r\n                showTopPanelListViewSwitch = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelExplorerSwitch = true;\r\n        public bool ShowTopPanelExplorerSwitch\r\n        {\r\n            get => showTopPanelExplorerSwitch;\r\n            set\r\n            {\r\n                showTopPanelExplorerSwitch = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelSelectRandomGameButton = false;\r\n        public bool ShowTopPanelSelectRandomGameButton\r\n        {\r\n            get => showTopPanelSelectRandomGameButton;\r\n            set\r\n            {\r\n                showTopPanelSelectRandomGameButton = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelViewSelectRandomGameButton = true;\r\n        public bool ShowTopPanelViewSelectRandomGameButton\r\n        {\r\n            get => showTopPanelViewSelectRandomGameButton;\r\n            set\r\n            {\r\n                showTopPanelViewSelectRandomGameButton = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelSearchButton = true;\r\n        public bool ShowTopPanelSearchButton\r\n        {\r\n            get => showTopPanelSearchButton;\r\n            set\r\n            {\r\n                showTopPanelSearchButton = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showTopPanelSearchBox = true;\r\n        public bool ShowTopPanelSearchBox\r\n        {\r\n            get => showTopPanelSearchBox;\r\n            set\r\n            {\r\n                showTopPanelSearchBox = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool fuzzyMatchingInNameFilter = true;\r\n        public bool FuzzyMatchingInNameFilter\r\n        {\r\n            get => fuzzyMatchingInNameFilter;\r\n            set\r\n            {\r\n                fuzzyMatchingInNameFilter = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double topPanelSectionSeparatorWidth = 15;\r\n        public double TopPanelSectionSeparatorWidth\r\n        {\r\n            get\r\n            {\r\n                return topPanelSectionSeparatorWidth;\r\n            }\r\n\r\n            set\r\n            {\r\n                topPanelSectionSeparatorWidth = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Dock pluginTopPanelAlignment = Dock.Right;\r\n        public Dock PluginTopPanelAlignment\r\n        {\r\n            get => pluginTopPanelAlignment;\r\n            set\r\n            {\r\n                pluginTopPanelAlignment = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid selectedFilterPreset;\r\n        public Guid SelectedFilterPreset\r\n        {\r\n            get => selectedFilterPreset;\r\n            set\r\n            {\r\n                selectedFilterPreset = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ImageLoadScaling imageScalerMode = ImageLoadScaling.BitmapDotNet;\r\n        public ImageLoadScaling ImageScalerMode\r\n        {\r\n            get => imageScalerMode;\r\n            set\r\n            {\r\n                imageScalerMode = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private PlaytimeImportMode playtimeImportMode = PlaytimeImportMode.NewImportsOnly;\r\n        public PlaytimeImportMode PlaytimeImportMode\r\n        {\r\n            get => playtimeImportMode;\r\n            set\r\n            {\r\n                playtimeImportMode = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool useCompositionWebViewRenderer = false;\r\n        public bool UseCompositionWebViewRenderer\r\n        {\r\n            get => useCompositionWebViewRenderer;\r\n            set\r\n            {\r\n                useCompositionWebViewRenderer = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool addonsPerfNoticeShown = false;\r\n        public bool AddonsPerfNoticeShown\r\n        {\r\n            get => addonsPerfNoticeShown;\r\n            set\r\n            {\r\n                addonsPerfNoticeShown = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool gameSortingNameAutofill = true;\r\n        public bool GameSortingNameAutofill\r\n        {\r\n            get => gameSortingNameAutofill;\r\n            set\r\n            {\r\n                gameSortingNameAutofill = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<string> gameSortingNameRemovedArticles = new List<string> { \"The\", \"A\", \"An\" };\r\n        [JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)]\r\n        public List<string> GameSortingNameRemovedArticles\r\n        {\r\n            get => gameSortingNameRemovedArticles;\r\n            set\r\n            {\r\n                gameSortingNameRemovedArticles = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showNahimicServiceWarning = true;\r\n        public bool ShowNahimicServiceWarning\r\n        {\r\n            get => showNahimicServiceWarning;\r\n            set\r\n            {\r\n                showNahimicServiceWarning = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showElevatedRightsWarning = true;\r\n        public bool ShowElevatedRightsWarning\r\n        {\r\n            get => showElevatedRightsWarning;\r\n            set\r\n            {\r\n                showElevatedRightsWarning = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateFormattingOptions dateTimeFormatAdded = new DateFormattingOptions(Constants.DefaultDateTimeFormat, false);\r\n        [RequiresRestart]\r\n        public DateFormattingOptions DateTimeFormatAdded\r\n        {\r\n            get => dateTimeFormatAdded;\r\n            set\r\n            {\r\n                dateTimeFormatAdded = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateFormattingOptions dateTimeFormatModified = new DateFormattingOptions(Constants.DefaultDateTimeFormat, false);\r\n        [RequiresRestart]\r\n        public DateFormattingOptions DateTimeFormatModified\r\n        {\r\n            get => dateTimeFormatModified;\r\n            set\r\n            {\r\n                dateTimeFormatModified = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateFormattingOptions dateTimeFormatRecentActivity = new DateFormattingOptions(Constants.DefaultDateTimeFormat, true);\r\n        [RequiresRestart]\r\n        public DateFormattingOptions DateTimeFormatRecentActivity\r\n        {\r\n            get => dateTimeFormatRecentActivity;\r\n            set\r\n            {\r\n                dateTimeFormatRecentActivity = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ReleaseDateFormattingOptions dateTimeFormatReleaseDate = new ReleaseDateFormattingOptions(Constants.DefaultDateTimeFormat, false);\r\n        [RequiresRestart]\r\n        public ReleaseDateFormattingOptions DateTimeFormatReleaseDate\r\n        {\r\n            get => dateTimeFormatReleaseDate;\r\n            set\r\n            {\r\n                dateTimeFormatReleaseDate = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateFormattingOptions dateTimeFormatLastPlayed = new DateFormattingOptions(Constants.DefaultDateTimeFormat, true);\r\n        [RequiresRestart]\r\n        public DateFormattingOptions DateTimeFormatLastPlayed\r\n        {\r\n            get => dateTimeFormatLastPlayed;\r\n            set\r\n            {\r\n                dateTimeFormatLastPlayed = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool playtimeUseDaysFormat = false;\r\n        [RequiresRestart]\r\n        public bool PlaytimeUseDaysFormat\r\n        {\r\n            get => playtimeUseDaysFormat;\r\n            set\r\n            {\r\n                playtimeUseDaysFormat = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool installSizeScanUseSizeOnDisk = true;\r\n        public bool InstallSizeScanUseSizeOnDisk\r\n        {\r\n            get => installSizeScanUseSizeOnDisk;\r\n            set\r\n            {\r\n                installSizeScanUseSizeOnDisk = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool scanLibInstallSizeOnLibUpdate = true;\r\n        public bool ScanLibInstallSizeOnLibUpdate\r\n        {\r\n            get => scanLibInstallSizeOnLibUpdate;\r\n            set\r\n            {\r\n                scanLibInstallSizeOnLibUpdate = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private UpdateCheckFrequency checkForProgramUpdates = UpdateCheckFrequency.OnEveryStartup;\r\n        public UpdateCheckFrequency CheckForProgramUpdates\r\n        {\r\n            get => checkForProgramUpdates;\r\n            set\r\n            {\r\n                checkForProgramUpdates = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private UpdateCheckFrequency checkForAddonUpdates = UpdateCheckFrequency.OnEveryStartup;\r\n        public UpdateCheckFrequency CheckForAddonUpdates\r\n        {\r\n            get => checkForAddonUpdates;\r\n            set\r\n            {\r\n                checkForAddonUpdates = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private LibraryUpdateCheckFrequency checkForLibraryUpdates = LibraryUpdateCheckFrequency.OnEveryStartup;\r\n        public LibraryUpdateCheckFrequency CheckForLibraryUpdates\r\n        {\r\n            get => checkForLibraryUpdates;\r\n            set\r\n            {\r\n                checkForLibraryUpdates = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private LibraryUpdateCheckFrequency checkForEmulatedLibraryUpdates = LibraryUpdateCheckFrequency.OnEveryStartup;\r\n        public LibraryUpdateCheckFrequency CheckForEmulatedLibraryUpdates\r\n        {\r\n            get => checkForEmulatedLibraryUpdates;\r\n            set\r\n            {\r\n                checkForEmulatedLibraryUpdates = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public DateTime LastProgramUpdateCheck { get; set; }\r\n        public DateTime LastAddonUpdateCheck { get; set; }\r\n        public DateTime LastLibraryUpdateCheck { get; set; }\r\n        public DateTime LastEmuLibraryUpdateCheck { get; set; }\r\n        public DateTime LastAutoBackup { get; set; }\r\n\r\n        private GameSearchItemAction primaryGameSearchItemAction = GameSearchItemAction.SwitchTo;\r\n        public GameSearchItemAction PrimaryGameSearchItemAction { get => primaryGameSearchItemAction; set => SetValue(ref primaryGameSearchItemAction, value); }\r\n\r\n        private GameSearchItemAction secondaryGameSearchItemAction = GameSearchItemAction.Play;\r\n        public GameSearchItemAction SecondaryGameSearchItemAction { get => secondaryGameSearchItemAction; set => SetValue(ref secondaryGameSearchItemAction, value); }\r\n\r\n        private bool globalSearchOpenWithLegacySearch = true;\r\n        public bool GlobalSearchOpenWithLegacySearch { get => globalSearchOpenWithLegacySearch; set => SetValue(ref globalSearchOpenWithLegacySearch, value); }\r\n\r\n        private bool saveGlobalSearchFilterSettings = true;\r\n        public bool SaveGlobalSearchFilterSettings { get => saveGlobalSearchFilterSettings; set => SetValue(ref saveGlobalSearchFilterSettings, value); }\r\n\r\n        private Dictionary<string, string> customSearchKeywrods = new Dictionary<string, string>();\r\n        [JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)]\r\n        public Dictionary<string, string> CustomSearchKeywrods { get => customSearchKeywrods; set => SetValue(ref customSearchKeywrods, value); }\r\n\r\n        private GameSearchFilterSettings gameSearchFilterSettings = new GameSearchFilterSettings();\r\n        public GameSearchFilterSettings GameSearchFilterSettings { get => gameSearchFilterSettings; set => SetValue(ref gameSearchFilterSettings, value); }\r\n\r\n        private HotKey systemSearchHotkey;\r\n        public HotKey SystemSearchHotkey { get => systemSearchHotkey; set => SetValue(ref systemSearchHotkey, value); }\r\n\r\n        private bool includeCommandsInDefaultSearch = true;\r\n        public bool IncludeCommandsInDefaultSearch { get => includeCommandsInDefaultSearch; set => SetValue(ref includeCommandsInDefaultSearch, value); }\r\n\r\n        private bool autoBackupEnabled = false;\r\n        public bool AutoBackupEnabled { get => autoBackupEnabled; set => SetValue(ref autoBackupEnabled, value); }\r\n\r\n        private AutoBackupFrequency autoBackupFrequency = AutoBackupFrequency.OnceAWeek;\r\n        public AutoBackupFrequency AutoBackupFrequency { get => autoBackupFrequency; set => SetValue(ref autoBackupFrequency, value); }\r\n\r\n        private string autoBackupDir;\r\n        public string AutoBackupDir { get => autoBackupDir; set => SetValue(ref autoBackupDir, value); }\r\n\r\n        private int rotatingBackups;\r\n        public int RotatingBackups { get => rotatingBackups; set => SetValue(ref rotatingBackups, value); }\r\n\r\n        private bool autoBackupIncludeLibFiles = true;\r\n        public bool AutoBackupIncludeLibFiles { get => autoBackupIncludeLibFiles; set => SetValue(ref autoBackupIncludeLibFiles, value); }\r\n\r\n        private bool autoBackupIncludeExtensionsData = true;\r\n        public bool AutoBackupIncludeExtensionsData { get => autoBackupIncludeExtensionsData; set => SetValue(ref autoBackupIncludeExtensionsData, value); }\r\n\r\n        private bool autoBackupIncludeExtensions = false;\r\n        public bool AutoBackupIncludeExtensions { get => autoBackupIncludeExtensions; set => SetValue(ref autoBackupIncludeExtensions, value); }\r\n\r\n        private bool autoBackupIncludeThemes = false;\r\n        public bool AutoBackupIncludeThemes { get => autoBackupIncludeThemes; set => SetValue(ref autoBackupIncludeThemes, value); }\r\n\r\n        private bool updateNotificationOnPatchesOnly = false;\r\n        public bool UpdateNotificationOnPatchesOnly { get => updateNotificationOnPatchesOnly; set => SetValue(ref updateNotificationOnPatchesOnly, value); }\r\n\r\n        private string webImageSarchIconTerm = \"\\\"{Name}\\\" icon\";\r\n        public string WebImageSarchIconTerm { get => webImageSarchIconTerm; set => SetValue(ref webImageSarchIconTerm, value); }\r\n\r\n        private string webImageSarchCoverTerm = \"\\\"{Name}\\\" cover\";\r\n        public string WebImageSarchCoverTerm { get => webImageSarchCoverTerm; set => SetValue(ref webImageSarchCoverTerm, value); }\r\n\r\n        private string webImageSarchBackgroundTerm = \"\\\"{Name}\\\" wallpaper\";\r\n        public string WebImageSarchBackgroundTerm { get => webImageSarchBackgroundTerm; set => SetValue(ref webImageSarchBackgroundTerm, value); }\r\n\r\n        // See OnCreateAutomationPeer comment in WindowBase.cs for why this exists.\r\n        private AccessibilityInterfaceOptions accessibilityInterface = AccessibilityInterfaceOptions.Auto;\r\n        [RequiresRestart]\r\n        public AccessibilityInterfaceOptions AccessibilityInterface { get => accessibilityInterface; set => SetValue(ref accessibilityInterface, value); }\r\n\r\n        private bool partialDescriptionLoading = true;\r\n        public bool PartialDescriptionLoading { get => partialDescriptionLoading; set => SetValue(ref partialDescriptionLoading, value); }\r\n\r\n        private SafeSearchSettings webImageSafeSearch = SafeSearchSettings.Default;\r\n        public SafeSearchSettings WebImageSafeSearch { get => webImageSafeSearch; set => SetValue(ref webImageSafeSearch, value); }\r\n\r\n        public Guid LastSelectedGame { get; set; }\r\n\r\n        [JsonIgnore]\r\n        public static bool IsPortable\r\n        {\r\n            get\r\n            {\r\n                return PlaynitePaths.IsPortable;\r\n            }\r\n        }\r\n\r\n        [JsonIgnore]\r\n        public WindowPositions WindowPositions\r\n        {\r\n            get; private set;\r\n        } = new WindowPositions();\r\n\r\n        [JsonIgnore]\r\n        public FullscreenSettings Fullscreen\r\n        {\r\n            get; private set;\r\n        } = new FullscreenSettings();\r\n\r\n        private List<SelectableItem<string>> develExtenions = new List<SelectableItem<string>>();\r\n        public List<SelectableItem<string>> DevelExtenions\r\n        {\r\n            get\r\n            {\r\n                return develExtenions;\r\n            }\r\n\r\n            set\r\n            {\r\n                develExtenions = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SearchWindowVisibilitySettings searchWindowVisibility = new SearchWindowVisibilitySettings();\r\n        public SearchWindowVisibilitySettings SearchWindowVisibility\r\n        {\r\n            get\r\n            {\r\n                return searchWindowVisibility;\r\n            }\r\n\r\n            set\r\n            {\r\n                searchWindowVisibility = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public PlayniteSettings()\r\n        {\r\n            var gpus = Computer.GetGpuVendors();\r\n            if (gpus.Contains(HwCompany.Intel) || gpus.Contains(HwCompany.VMware))\r\n            {\r\n                BackgroundImageAnimation = false;\r\n            }\r\n\r\n            InstallInstanceId = Guid.NewGuid().ToString();\r\n            ItemSpacingMargin = GetItemSpacingMargin();\r\n            FullscreenItemSpacingMargin = GetFullscreenItemSpacingMargin();\r\n            UpdateGridItemHeight();\r\n        }\r\n\r\n        private static T LoadSettingFile<T>(string path) where T : class\r\n        {\r\n            try\r\n            {\r\n                if (File.Exists(path))\r\n                {\r\n                    return JsonConvert.DeserializeObject<T>(File.ReadAllText(path));\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to load {path} setting file.\");\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        private static void SaveSettingFile(object settings, string path)\r\n        {\r\n            FileSystem.WriteStringToFile(path, JsonConvert.SerializeObject(settings, Formatting.Indented));\r\n        }\r\n\r\n        public static PlayniteSettings GetDefaultSettings()\r\n        {\r\n            var settings = new PlayniteSettings();\r\n            settings.ViewSettings.ListViewColumsOrder = new List<GameField>\r\n                {\r\n                    GameField.Icon,\r\n                    GameField.Name,\r\n                    GameField.ReleaseDate,\r\n                    GameField.Genres,\r\n                    GameField.LastActivity,\r\n                    GameField.Playtime,\r\n                    GameField.PluginId\r\n                };\r\n\r\n            var columns = new ListViewColumnsProperties();\r\n            columns.Icon.Visible = true;\r\n            columns.Name.Visible = true;\r\n            columns.ReleaseDate.Visible = true;\r\n            columns.Genres.Visible = true;\r\n            columns.LastActivity.Visible = true;\r\n            columns.Playtime.Visible = true;\r\n            columns.PluginId.Visible = true;\r\n            settings.ViewSettings.ListViewColumns = columns;\r\n            settings.MetadataSettings = MetadataDownloaderSettings.GetDefaultSettings();\r\n            return settings;\r\n        }\r\n\r\n        public static PlayniteSettings LoadSettings()\r\n        {\r\n            var settings = LoadSettingFile<PlayniteSettings>(PlaynitePaths.ConfigFilePath);\r\n            if (settings == null)\r\n            {\r\n                logger.Warn(\"No existing settings found.\");\r\n                settings = LoadSettingFile<PlayniteSettings>(PlaynitePaths.BackupConfigFilePath);\r\n                if (settings == null)\r\n                {\r\n                    logger.Warn(\"No settings backup found, creating default ones.\");\r\n                    settings = new PlayniteSettings();\r\n                }\r\n            }\r\n\r\n            if (settings.ViewSettings.ListViewColumsOrder == null)\r\n            {\r\n                settings.ViewSettings.ListViewColumsOrder = new List<GameField>\r\n                {\r\n                    GameField.Icon,\r\n                    GameField.Name,\r\n                    GameField.ReleaseDate,\r\n                    GameField.Genres,\r\n                    GameField.LastActivity,\r\n                    GameField.Playtime,\r\n                    GameField.PluginId\r\n                };\r\n            }\r\n\r\n            if (settings.ViewSettings.ListViewColumns == null)\r\n            {\r\n                var columns = new ListViewColumnsProperties();\r\n                columns.Icon.Visible = true;\r\n                columns.Name.Visible = true;\r\n                columns.ReleaseDate.Visible = true;\r\n                columns.Genres.Visible = true;\r\n                columns.LastActivity.Visible = true;\r\n                columns.Playtime.Visible = true;\r\n                columns.PluginId.Visible = true;\r\n                settings.ViewSettings.ListViewColumns = columns;\r\n            }\r\n\r\n            if (settings.MetadataSettings == null)\r\n            {\r\n                settings.MetadataSettings = MetadataDownloaderSettings.GetDefaultSettings();\r\n            }\r\n\r\n            if (settings.Version == 1)\r\n            {\r\n                settings.BackgroundImageBlurAmount = 17;\r\n                settings.Version = 2;\r\n            }\r\n\r\n            if (settings.Version == 2)\r\n            {\r\n                settings.BackgroundImageBlurAmount = 60;\r\n                settings.Version = 3;\r\n            }\r\n\r\n            if (settings.Version == 3)\r\n            {\r\n                settings.MetadataSettings.Feature = new MetadataFieldSettings(\r\n                    true, new List<Guid> { Guid.Empty, BuiltinExtensions.GetIdFromExtension(BuiltinExtension.IgdbMetadata) });\r\n                settings.Version = 4;\r\n            }\r\n\r\n            if (settings.Version == 4)\r\n            {\r\n                settings.MetadataSettings.AgeRating = new MetadataFieldSettings(\r\n                    true, new List<Guid> { Guid.Empty, BuiltinExtensions.GetIdFromExtension(BuiltinExtension.IgdbMetadata) });\r\n                settings.MetadataSettings.Series = new MetadataFieldSettings(\r\n                    true, new List<Guid> { Guid.Empty, BuiltinExtensions.GetIdFromExtension(BuiltinExtension.IgdbMetadata) });\r\n                settings.MetadataSettings.Platform = new MetadataFieldSettings(\r\n                    true, new List<Guid> { Guid.Empty });\r\n                settings.MetadataSettings.Region = new MetadataFieldSettings(\r\n                    true, new List<Guid> { Guid.Empty });\r\n                settings.Version = 5;\r\n            }\r\n\r\n            if (settings.Version == 5)\r\n            {\r\n                if (settings.DisabledPlugins.HasItems())\r\n                {\r\n                    // P9 saves disabled list based on add-on IDs, not directory names.\r\n                    var idsMigration = new Dictionary<string, string>\r\n                    {\r\n                        { \"AmazonGamesLibrary\", \"AmazonLibrary_Builtin\" },\r\n                        { \"BattleNetLibrary\", \"BattlenetLibrary_Builtin\" },\r\n                        { \"BethesdaLibrary\", \"BethesdaLibrary_Builtin\" },\r\n                        { \"EpicLibrary\", \"EpicGamesLibrary_Builtin\" },\r\n                        { \"GogLibrary\", \"GogLibrary_Builtin\" },\r\n                        { \"HumbleLibrary\", \"HumbleLibrary_Builtin\" },\r\n                        { \"IGDBMetadata\", \"IGDBMetadata_Builtin\" },\r\n                        { \"ItchioLibrary\", \"ItchioLibrary_Builtin\" },\r\n                        { \"LibraryExporter\", \"LibraryExporterPS_Builtin\" },\r\n                        { \"OriginLibrary\", \"OriginLibrary_Builtin\" },\r\n                        { \"PSNLibrary\", \"PlayStationLibrary_Builtin\" },\r\n                        { \"SteamLibrary\", \"SteamLibrary_Builtin\" },\r\n                        { \"TwitchLibrary\", \"TwitchLibrary_Builtin\" },\r\n                        { \"UplayLibrary\", \"UplayLibrary_Builtin\" },\r\n                        { \"XboxLibrary\", \"XboxLibrary_Builtin\" }\r\n                    };\r\n\r\n                    for (int i = 0; i < settings.DisabledPlugins.Count; i++)\r\n                    {\r\n                        if (idsMigration.TryGetValue(settings.DisabledPlugins[i], out var newValue))\r\n                        {\r\n                            settings.DisabledPlugins[i] = newValue;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                settings.ViewSettings.ListViewColumns.AgeRating.Field = GameField.AgeRatings;\r\n                settings.ViewSettings.ListViewColumns.Platform.Field = GameField.Platforms;\r\n                settings.ViewSettings.ListViewColumns.Series.Field = GameField.Series;\r\n                settings.ViewSettings.ListViewColumns.Region.Field = GameField.Regions;\r\n                settings.Version = 6;\r\n            }\r\n\r\n            if (settings.Version == 6)\r\n            {\r\n                var oldSettings = LoadSettingFile<Dictionary<string, object>>(PlaynitePaths.ConfigFilePath);\r\n                if (oldSettings != null)\r\n                {\r\n                    if (oldSettings.TryGetValue(\"UpdateLibStartup\", out var oldUpdateLibStartup) && (bool)oldUpdateLibStartup == false)\r\n                    {\r\n                        settings.CheckForLibraryUpdates = LibraryUpdateCheckFrequency.Manually;\r\n                    }\r\n\r\n                    if (oldSettings.TryGetValue(\"UpdateEmulatedLibStartup\", out var oldUpdateEmulatedLibStartup) && (bool)oldUpdateEmulatedLibStartup == false)\r\n                    {\r\n                        settings.CheckForEmulatedLibraryUpdates = LibraryUpdateCheckFrequency.Manually;\r\n                    }\r\n\r\n                    if (oldSettings.TryGetValue(\"ForcePlayTimeSync\", out var oldForcePlayTimeSync) && (bool)oldForcePlayTimeSync == true)\r\n                    {\r\n                        settings.PlaytimeImportMode = PlaytimeImportMode.Always;\r\n                    }\r\n                }\r\n\r\n                settings.Version = 7;\r\n            }\r\n\r\n            settings.WindowPositions = LoadExternalConfig<WindowPositions>(PlaynitePaths.WindowPositionsPath, PlaynitePaths.BackupWindowPositionsPath);\r\n            settings.Fullscreen = LoadExternalConfig<FullscreenSettings>(PlaynitePaths.FullscreenConfigFilePath, PlaynitePaths.BackupFullscreenConfigFilePath);\r\n            settings.BackupSettings();\r\n            return settings;\r\n        }\r\n\r\n        private static T LoadExternalConfig<T>(string origPath, string backupPath, bool generateDefault = true) where T : class, new()\r\n        {\r\n            var name = Path.GetFileName(origPath);\r\n            var config = LoadSettingFile<T>(origPath);\r\n            if (config == null)\r\n            {\r\n                logger.Warn($\"No existing {name} settings found.\");\r\n                config = LoadSettingFile<T>(backupPath);\r\n                if (config == null)\r\n                {\r\n                    logger.Warn($\"No {name} settings backup found, creating default ones.\");\r\n                    if (generateDefault)\r\n                    {\r\n                        config = new T();\r\n                    }\r\n                }\r\n            }\r\n\r\n            return config;\r\n        }\r\n\r\n        public void SaveSettings()\r\n        {\r\n            try\r\n            {\r\n                FileSystem.CreateDirectory(PlaynitePaths.ConfigRootPath);\r\n                SaveSettingFile(this, PlaynitePaths.ConfigFilePath);\r\n                SaveSettingFile(WindowPositions, PlaynitePaths.WindowPositionsPath);\r\n                SaveSettingFile(Fullscreen, PlaynitePaths.FullscreenConfigFilePath);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to save application settings.\");\r\n            }\r\n        }\r\n\r\n        public void BackupSettings()\r\n        {\r\n            try\r\n            {\r\n                FileSystem.CreateDirectory(PlaynitePaths.ConfigRootPath);\r\n                SaveSettingFile(this, PlaynitePaths.BackupConfigFilePath);\r\n                SaveSettingFile(WindowPositions, PlaynitePaths.BackupWindowPositionsPath);\r\n                SaveSettingFile(Fullscreen, PlaynitePaths.BackupFullscreenConfigFilePath);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to backup application settings.\");\r\n            }\r\n        }\r\n\r\n        public static void ConfigureLogger()\r\n        {\r\n            var config = new LoggingConfiguration();\r\n            config.DefaultCultureInfo = new System.Globalization.CultureInfo(\"en-US\");\r\n#if DEBUG\r\n            var consoleTarget = new ColoredConsoleTarget()\r\n            {\r\n                Layout = @\"${level:uppercase=true:padding=-5}|${logger}:${message}${onexception:${newline}${exception}}\"\r\n            };\r\n\r\n            config.AddTarget(\"console\", consoleTarget);\r\n\r\n            var rule1 = new LoggingRule(\"*\", LogLevel.Trace, consoleTarget);\r\n            config.LoggingRules.Add(rule1);\r\n#endif\r\n            var coreFileTarget = new FileTarget()\r\n            {\r\n                FileName = Path.Combine(PlaynitePaths.ConfigRootPath, \"playnite.log\"),\r\n                Layout = \"${date:format=dd-MM HH\\\\:mm\\\\:ss.fff}|${level:uppercase=true:padding=-5}|${logger}:${message}${onexception:${newline}${exception:format=toString}}\",\r\n                KeepFileOpen = false,\r\n                ArchiveFileName = Path.Combine(PlaynitePaths.ConfigRootPath, \"playnite.{#####}.log\"),\r\n                ArchiveAboveSize = 4096000,\r\n                ArchiveNumbering = ArchiveNumberingMode.Sequence,\r\n                MaxArchiveFiles = 2,\r\n                Encoding = Encoding.UTF8\r\n            };\r\n\r\n            var extensionFileTarget = new FileTarget()\r\n            {\r\n                FileName = Path.Combine(PlaynitePaths.ConfigRootPath, \"extensions.log\"),\r\n                Layout = \"${date:format=dd-MM HH\\\\:mm\\\\:ss.fff}|${level:uppercase=true:padding=-5}|${logger}:${message}${onexception:${newline}${exception:format=toString}}\",\r\n                KeepFileOpen = false,\r\n                ArchiveFileName = Path.Combine(PlaynitePaths.ConfigRootPath, \"extensions.{#####}.log\"),\r\n                ArchiveAboveSize = 4096000,\r\n                ArchiveNumbering = ArchiveNumberingMode.Sequence,\r\n                MaxArchiveFiles = 2,\r\n                Encoding = Encoding.UTF8\r\n            };\r\n\r\n            var allRule = new LoggingRule(\"*\", LogLevel.Trace, coreFileTarget);\r\n            allRule.Filters.Add(new NLog.Filters.ConditionBasedFilter()\r\n            {\r\n                Condition = \"contains('${logger}', '#')\",\r\n                Action = NLog.Filters.FilterResult.Ignore\r\n            });\r\n\r\n            config.LoggingRules.Add(allRule);\r\n            config.LoggingRules.Add(new LoggingRule(\"*#*\", LogLevel.Trace, extensionFileTarget));\r\n\r\n            NLog.LogManager.Configuration = config;\r\n            SDK.LogManager.Init(new NLogLogProvider());\r\n            logger = SDK.LogManager.GetLogger();\r\n        }\r\n\r\n        public static string GetAppConfigValue(string key)\r\n        {\r\n            return ConfigurationManager.AppSettings[key];\r\n        }\r\n\r\n        public static bool GetAppConfigBoolValue(string key)\r\n        {\r\n            if (bool.TryParse(ConfigurationManager.AppSettings[key], out var result))\r\n            {\r\n                return result;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public static void MigrateSettingsConfig()\r\n        {\r\n        }\r\n\r\n        private Thickness GetItemSpacingMargin()\r\n        {\r\n            return new Thickness(GridItemSpacing / 2, GridItemSpacing / 2, GridItemSpacing / 2, GridItemSpacing / 2);;\r\n        }\r\n\r\n        private Thickness GetFullscreenItemSpacingMargin()\r\n        {\r\n            double marginX = FullscreenItemSpacing / 2;\r\n            double marginY = CoverAspectRatio.GetWidth(FullscreenItemSpacing) / 2;\r\n            return new Thickness(marginY / 2, marginX / 2, marginY / 2, marginX / 2);\r\n        }\r\n\r\n        private void UpdateGridItemHeight()\r\n        {\r\n            if (GridItemWidth != 0)\r\n            {\r\n                GridItemHeight = Math.Round(GridItemWidth * ((double)gridItemHeightRatio / GridItemWidthRatio));\r\n            }\r\n            else\r\n            {\r\n                GridItemHeight = 0;\r\n            }\r\n\r\n            OnPropertyChanged(nameof(GridItemHeight));\r\n        }\r\n\r\n        public bool ShouldCheckProgramUpdatePeriodic()\r\n        {\r\n            switch (CheckForProgramUpdates)\r\n            {\r\n                case UpdateCheckFrequency.Manually:\r\n                    return false;\r\n                case UpdateCheckFrequency.OnceADay:\r\n                    return DateTimes.Now.Date > LastProgramUpdateCheck.Date;\r\n                case UpdateCheckFrequency.OnceAWeek:\r\n                    return (DateTimes.Now - LastProgramUpdateCheck).TotalDays > 6;\r\n                case UpdateCheckFrequency.OnEveryStartup:\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        public bool ShouldCheckAddonUpdatePeriodic()\r\n        {\r\n            switch (CheckForAddonUpdates)\r\n            {\r\n                case UpdateCheckFrequency.Manually:\r\n                    return false;\r\n                case UpdateCheckFrequency.OnceADay:\r\n                    return DateTimes.Now.Date > LastAddonUpdateCheck.Date;\r\n                case UpdateCheckFrequency.OnceAWeek:\r\n                    return (DateTimes.Now - LastAddonUpdateCheck).TotalDays > 6;\r\n                case UpdateCheckFrequency.OnEveryStartup:\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        public bool ShouldCheckProgramUpdateStartup()\r\n        {\r\n            switch (CheckForProgramUpdates)\r\n            {\r\n                case UpdateCheckFrequency.Manually:\r\n                    return false;\r\n                case UpdateCheckFrequency.OnceADay:\r\n                    return DateTimes.Now.Date > LastProgramUpdateCheck.Date;\r\n                case UpdateCheckFrequency.OnceAWeek:\r\n                    return (DateTimes.Now - LastProgramUpdateCheck).TotalDays > 6;\r\n                case UpdateCheckFrequency.OnEveryStartup:\r\n                default:\r\n                    return true;\r\n            }\r\n        }\r\n\r\n        public bool ShouldCheckAddonUpdateStartup()\r\n        {\r\n            switch (CheckForAddonUpdates)\r\n            {\r\n                case UpdateCheckFrequency.Manually:\r\n                    return false;\r\n                case UpdateCheckFrequency.OnceADay:\r\n                    return DateTimes.Now.Date > LastAddonUpdateCheck.Date;\r\n                case UpdateCheckFrequency.OnceAWeek:\r\n                    return (DateTimes.Now - LastAddonUpdateCheck).TotalDays > 6;\r\n                case UpdateCheckFrequency.OnEveryStartup:\r\n                default:\r\n                    return true;\r\n            }\r\n        }\r\n\r\n        public bool ShouldCheckLibraryOnStartup()\r\n        {\r\n            switch (CheckForLibraryUpdates)\r\n            {\r\n                case LibraryUpdateCheckFrequency.OnceADay:\r\n                    return DateTimes.Now.Date > LastLibraryUpdateCheck.Date;\r\n                case LibraryUpdateCheckFrequency.OnceAWeek:\r\n                    return (DateTimes.Now - LastLibraryUpdateCheck).TotalDays > 6;\r\n                case LibraryUpdateCheckFrequency.Manually:\r\n                    return false;\r\n                case LibraryUpdateCheckFrequency.OnEveryStartup:\r\n                default:\r\n                    return true;\r\n            }\r\n        }\r\n\r\n        public bool ShouldCheckEmuLibraryOnStartup()\r\n        {\r\n            switch (CheckForEmulatedLibraryUpdates)\r\n            {\r\n                case LibraryUpdateCheckFrequency.OnceADay:\r\n                    return DateTimes.Now.Date > LastEmuLibraryUpdateCheck.Date;\r\n                case LibraryUpdateCheckFrequency.OnceAWeek:\r\n                    return (DateTimes.Now - LastEmuLibraryUpdateCheck).TotalDays > 6;\r\n                case LibraryUpdateCheckFrequency.Manually:\r\n                    return false;\r\n                case LibraryUpdateCheckFrequency.OnEveryStartup:\r\n                default:\r\n                    return true;\r\n            }\r\n        }\r\n\r\n        public bool ShouldDataBackupOnStartup()\r\n        {\r\n            if (!AutoBackupEnabled)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            switch (AutoBackupFrequency)\r\n            {\r\n                case AutoBackupFrequency.OnceADay:\r\n                    return DateTimes.Now.Date > LastAutoBackup.Date;\r\n                case AutoBackupFrequency.OnceAWeek:\r\n                    return (DateTimes.Now - LastAutoBackup).TotalDays > 6;\r\n                default:\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        #region Serialization Conditions\r\n\r\n        public bool ShouldSerializeDisabledPlugins()\r\n        {\r\n            return DisabledPlugins.HasItems();\r\n        }\r\n\r\n        #endregion Serialization Conditions\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Settings/SearchWindowVisibilitySettings.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class SearchWindowVisibilitySettings : ObservableObject\r\n    {\r\n        private bool gameIcon = true;\r\n        private bool libraryIcon = true;\r\n        private bool hiddenStatus = true;\r\n        private bool platform = true;\r\n        private bool playTime = true;\r\n        private bool completionStatus = true;\r\n        private bool releaseDate = false;\r\n\r\n        public bool GameIcon { get => gameIcon; set => SetValue(ref gameIcon, value); }\r\n        public bool LibraryIcon { get => libraryIcon; set => SetValue(ref libraryIcon, value); }\r\n        public bool HiddenStatus { get => hiddenStatus; set => SetValue(ref hiddenStatus, value); }\r\n        public bool Platform { get => platform; set => SetValue(ref platform, value); }\r\n        public bool PlayTime { get => playTime; set => SetValue(ref playTime, value); }\r\n        public bool CompletionStatus { get => completionStatus; set => SetValue(ref completionStatus, value); }\r\n        public bool ReleaseDate { get => releaseDate; set => SetValue(ref releaseDate, value); }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Settings/SettingsAttributes.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    [AttributeUsage(AttributeTargets.Property)]\r\n    public class RequiresRestartAttribute : Attribute\r\n    {        \r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Settings/ViewProperties.cs",
    "content": "﻿using Newtonsoft.Json;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Concurrent;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite\r\n{\r\n    public class ListViewColumnProperty : ObservableObject\r\n    {\r\n        public GameField Field { get; set; }\r\n\r\n        private bool visible = false;\r\n        public bool Visible\r\n        {\r\n            get\r\n            {\r\n                return visible;\r\n            }\r\n\r\n            set\r\n            {\r\n                visible = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double width = double.NaN;\r\n        public double Width\r\n        {\r\n            get\r\n            {\r\n                return width;\r\n            }\r\n\r\n            set\r\n            {\r\n                width = value;\r\n                // Don't allow exteremly small size because it could lead to a user accidentely hiding the column by resizing: #2257\r\n                if (width < 25)\r\n                {\r\n                    width = 25;\r\n                }\r\n\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public ListViewColumnProperty()\r\n        {\r\n        }\r\n\r\n        public ListViewColumnProperty(GameField field)\r\n        {\r\n            Field = field;\r\n        }\r\n    }\r\n\r\n    public class ListViewColumnsProperties : ObservableObject\r\n    {\r\n        private ListViewColumnProperty icon = new ListViewColumnProperty(GameField.Icon);\r\n        public ListViewColumnProperty Icon\r\n        {\r\n            get\r\n            {\r\n                return icon;\r\n            }\r\n\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty name = new ListViewColumnProperty(GameField.Name);\r\n        public ListViewColumnProperty Name\r\n        {\r\n            get\r\n            {\r\n                return name;\r\n            }\r\n\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty platform = new ListViewColumnProperty(GameField.Platforms);\r\n        public ListViewColumnProperty Platform\r\n        {\r\n            get\r\n            {\r\n                return platform;\r\n            }\r\n\r\n            set\r\n            {\r\n                platform = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty developers = new ListViewColumnProperty(GameField.Developers);\r\n        public ListViewColumnProperty Developers\r\n        {\r\n            get\r\n            {\r\n                return developers;\r\n            }\r\n\r\n            set\r\n            {\r\n                developers = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty publishers = new ListViewColumnProperty(GameField.Publishers);\r\n        public ListViewColumnProperty Publishers\r\n        {\r\n            get\r\n            {\r\n                return publishers;\r\n            }\r\n\r\n            set\r\n            {\r\n                publishers = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty releaseDate = new ListViewColumnProperty(GameField.ReleaseDate);\r\n        public ListViewColumnProperty ReleaseDate\r\n        {\r\n            get\r\n            {\r\n                return releaseDate;\r\n            }\r\n\r\n            set\r\n            {\r\n                releaseDate = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty genres = new ListViewColumnProperty(GameField.Genres);\r\n        public ListViewColumnProperty Genres\r\n        {\r\n            get\r\n            {\r\n                return genres;\r\n            }\r\n\r\n            set\r\n            {\r\n                genres = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty lastActivity = new ListViewColumnProperty(GameField.LastActivity);\r\n        public ListViewColumnProperty LastActivity\r\n        {\r\n            get\r\n            {\r\n                return lastActivity;\r\n            }\r\n\r\n            set\r\n            {\r\n                lastActivity = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty recentActivity = new ListViewColumnProperty(GameField.RecentActivity);\r\n        public ListViewColumnProperty RecentActivity\r\n        {\r\n            get\r\n            {\r\n                return recentActivity;\r\n            }\r\n\r\n            set\r\n            {\r\n                recentActivity = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty isInstalled = new ListViewColumnProperty(GameField.IsInstalled);\r\n        public ListViewColumnProperty IsInstalled\r\n        {\r\n            get\r\n            {\r\n                return isInstalled;\r\n            }\r\n\r\n            set\r\n            {\r\n                isInstalled = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty installDirectory = new ListViewColumnProperty(GameField.InstallDirectory);\r\n        public ListViewColumnProperty InstallDirectory\r\n        {\r\n            get\r\n            {\r\n                return installDirectory;\r\n            }\r\n\r\n            set\r\n            {\r\n                installDirectory = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty categories = new ListViewColumnProperty(GameField.Categories);\r\n        public ListViewColumnProperty Categories\r\n        {\r\n            get\r\n            {\r\n                return categories;\r\n            }\r\n\r\n            set\r\n            {\r\n                categories = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty playtime = new ListViewColumnProperty(GameField.Playtime);\r\n        public ListViewColumnProperty Playtime\r\n        {\r\n            get\r\n            {\r\n                return playtime;\r\n            }\r\n\r\n            set\r\n            {\r\n                playtime = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty added = new ListViewColumnProperty(GameField.Added);\r\n        public ListViewColumnProperty Added\r\n        {\r\n            get\r\n            {\r\n                return added;\r\n            }\r\n\r\n            set\r\n            {\r\n                added = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty modified = new ListViewColumnProperty(GameField.Modified);\r\n        public ListViewColumnProperty Modified\r\n        {\r\n            get\r\n            {\r\n                return modified;\r\n            }\r\n\r\n            set\r\n            {\r\n                modified = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty playCount = new ListViewColumnProperty(GameField.PlayCount);\r\n        public ListViewColumnProperty PlayCount\r\n        {\r\n            get\r\n            {\r\n                return playCount;\r\n            }\r\n\r\n            set\r\n            {\r\n                playCount = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty installSize = new ListViewColumnProperty(GameField.InstallSize);\r\n        public ListViewColumnProperty InstallSize\r\n        {\r\n            get\r\n            {\r\n                return installSize;\r\n            }\r\n\r\n            set\r\n            {\r\n                installSize = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty series = new ListViewColumnProperty(GameField.Series);\r\n        public ListViewColumnProperty Series\r\n        {\r\n            get\r\n            {\r\n                return series;\r\n            }\r\n\r\n            set\r\n            {\r\n                series = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty version = new ListViewColumnProperty(GameField.Version);\r\n        public ListViewColumnProperty Version\r\n        {\r\n            get\r\n            {\r\n                return version;\r\n            }\r\n\r\n            set\r\n            {\r\n                version = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty ageRating = new ListViewColumnProperty(GameField.AgeRatings);\r\n        public ListViewColumnProperty AgeRating\r\n        {\r\n            get\r\n            {\r\n                return ageRating;\r\n            }\r\n\r\n            set\r\n            {\r\n                ageRating = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty region = new ListViewColumnProperty(GameField.Regions);\r\n        public ListViewColumnProperty Region\r\n        {\r\n            get\r\n            {\r\n                return region;\r\n            }\r\n\r\n            set\r\n            {\r\n                region = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty source = new ListViewColumnProperty(GameField.Source);\r\n        public ListViewColumnProperty Source\r\n        {\r\n            get\r\n            {\r\n                return source;\r\n            }\r\n\r\n            set\r\n            {\r\n                source = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty completionStatus = new ListViewColumnProperty(GameField.CompletionStatus);\r\n        public ListViewColumnProperty CompletionStatus\r\n        {\r\n            get\r\n            {\r\n                return completionStatus;\r\n            }\r\n\r\n            set\r\n            {\r\n                completionStatus = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty userScore = new ListViewColumnProperty(GameField.UserScore);\r\n        public ListViewColumnProperty UserScore\r\n        {\r\n            get\r\n            {\r\n                return userScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                userScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty criticScore = new ListViewColumnProperty(GameField.CriticScore);\r\n        public ListViewColumnProperty CriticScore\r\n        {\r\n            get\r\n            {\r\n                return criticScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                criticScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty communityScore = new ListViewColumnProperty(GameField.CommunityScore);\r\n        public ListViewColumnProperty CommunityScore\r\n        {\r\n            get\r\n            {\r\n                return communityScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                communityScore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty tags = new ListViewColumnProperty(GameField.Tags);\r\n        public ListViewColumnProperty Tags\r\n        {\r\n            get\r\n            {\r\n                return tags;\r\n            }\r\n\r\n            set\r\n            {\r\n                tags = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty pluginId = new ListViewColumnProperty(GameField.PluginId);\r\n        public ListViewColumnProperty PluginId\r\n        {\r\n            get\r\n            {\r\n                return pluginId;\r\n            }\r\n\r\n            set\r\n            {\r\n                pluginId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty features = new ListViewColumnProperty(GameField.Features);\r\n        public ListViewColumnProperty Features\r\n        {\r\n            get\r\n            {\r\n                return features;\r\n            }\r\n\r\n            set\r\n            {\r\n                features = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnProperty roms = new ListViewColumnProperty(GameField.Roms);\r\n        public ListViewColumnProperty Roms\r\n        {\r\n            get\r\n            {\r\n                return roms;\r\n            }\r\n\r\n            set\r\n            {\r\n                roms = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n    }\r\n\r\n    public class ViewSettingsBase : ObservableObject\r\n    {\r\n        private SortOrder sortingOrder = SortOrder.Name;\r\n        public SortOrder SortingOrder\r\n        {\r\n            get\r\n            {\r\n                return sortingOrder;\r\n            }\r\n\r\n            set\r\n            {\r\n                sortingOrder = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SortOrderDirection sortingOrderDirection = SortOrderDirection.Ascending;\r\n        public SortOrderDirection SortingOrderDirection\r\n        {\r\n            get\r\n            {\r\n                return sortingOrderDirection;\r\n            }\r\n\r\n            set\r\n            {\r\n                sortingOrderDirection = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n    }\r\n\r\n    public class ViewSettings : ViewSettingsBase\r\n    {\r\n        public const double MinGridItemWidth = 60;\r\n        public const double DefaultGridItemWidth = 200;\r\n        public const double MaxGridItemWidth = 700;\r\n\r\n        private GroupableField groupingOrder = GroupableField.None;\r\n        public GroupableField GroupingOrder\r\n        {\r\n            get\r\n            {\r\n                return groupingOrder;\r\n            }\r\n\r\n            set\r\n            {\r\n                groupingOrder = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DesktopView gamesViewType = DesktopView.Details;\r\n        public DesktopView GamesViewType\r\n        {\r\n            get\r\n            {\r\n                return gamesViewType;\r\n            }\r\n\r\n            set\r\n            {\r\n                gamesViewType = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ExplorerField selectedExplorerField = ExplorerField.Library;\r\n        public ExplorerField SelectedExplorerField\r\n        {\r\n            get\r\n            {\r\n                return selectedExplorerField;\r\n            }\r\n\r\n            set\r\n            {\r\n                selectedExplorerField = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListViewColumnsProperties listViewColumns;\r\n        public ListViewColumnsProperties ListViewColumns\r\n        {\r\n            get\r\n            {\r\n                return listViewColumns;\r\n            }\r\n\r\n            set\r\n            {\r\n                listViewColumns = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<GameField> listViewColumsOrder;\r\n        public List<GameField> ListViewColumsOrder\r\n        {\r\n            get\r\n            {\r\n                return listViewColumsOrder;\r\n            }\r\n\r\n            set\r\n            {\r\n                listViewColumsOrder = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Dictionary<GroupableField, List<string>> collapsedGroups = new Dictionary<GroupableField, List<string>>();\r\n        public Dictionary<GroupableField, List<string>> CollapsedGroups\r\n        {\r\n            get\r\n            {\r\n                return collapsedGroups;\r\n            }\r\n\r\n            set\r\n            {\r\n                collapsedGroups = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public bool IsGroupCollapsed(GroupableField field, string groupName)\r\n        {\r\n            if (collapsedGroups.ContainsKey(field) &&\r\n                collapsedGroups[field].ContainsString(groupName, StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        public void ExpandAllGroups(GroupableField field)\r\n        {\r\n            if (collapsedGroups.ContainsKey(field))\r\n            {\r\n                collapsedGroups.Remove(field);\r\n                OnPropertyChanged(nameof(CollapsedGroups));\r\n            }\r\n        }\r\n\r\n        public void CollapseGroups(GroupableField field, List<string> groupNames)\r\n        {\r\n            if (!collapsedGroups.ContainsKey(field))\r\n            {\r\n                collapsedGroups.Add(field, new List<string>());\r\n            }\r\n\r\n            foreach (var groupName in groupNames)\r\n            {\r\n                if (!collapsedGroups[field].ContainsString(groupName, StringComparison.OrdinalIgnoreCase))\r\n                {\r\n                    collapsedGroups[field].Add(groupName);\r\n                }\r\n            }\r\n\r\n            OnPropertyChanged(nameof(CollapsedGroups));\r\n        }\r\n\r\n        public void SetGroupCollapseState(GroupableField field, string groupName, bool collapsed)\r\n        {\r\n            if (collapsed)\r\n            {\r\n                if (!collapsedGroups.ContainsKey(field))\r\n                {\r\n                    collapsedGroups.Add(field, new List<string>());\r\n                }\r\n\r\n                if (!collapsedGroups[field].ContainsString(groupName, StringComparison.OrdinalIgnoreCase))\r\n                {\r\n                    collapsedGroups[field].Add(groupName);\r\n                    OnPropertyChanged(nameof(CollapsedGroups));\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (collapsedGroups.ContainsKey(field))\r\n                {\r\n                    var existing = collapsedGroups[field].FirstOrDefault(a => string.Equals(a, groupName, StringComparison.OrdinalIgnoreCase));\r\n                    if (existing != null)\r\n                    {\r\n                        collapsedGroups[field].Remove(existing);\r\n                    }\r\n\r\n                    if (collapsedGroups[field].Count == 0)\r\n                    {\r\n                        collapsedGroups.Remove(field);\r\n                    }\r\n\r\n                    OnPropertyChanged(nameof(CollapsedGroups));\r\n                }\r\n            }\r\n        }\r\n\r\n        public ViewSettings()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Settings/WindowPositions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class WindowPosition\r\n    {\r\n        public class Point\r\n        {\r\n            public double X\r\n            {\r\n                get; set;\r\n            }\r\n\r\n            public double Y\r\n            {\r\n                get; set;\r\n            }\r\n        }\r\n\r\n        public Point Position\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public Point Size\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public System.Windows.WindowState State\r\n        {\r\n            get; set;\r\n        } = System.Windows.WindowState.Normal;\r\n    }\r\n\r\n    public class WindowPositions\r\n    {\r\n        public Dictionary<string, WindowPosition> Positions\r\n        {\r\n            get; set;\r\n        } = new Dictionary<string, WindowPosition>();\r\n\r\n        public WindowPositions()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/SortableNameConverter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nnamespace Playnite\n{\n    public class SortableNameConverter\n    {\n        private readonly Regex regex;\n        private readonly Regex ignoredEndWordsRegex;\n\n        /// <summary>\n        /// The minimum string length of numbers. If 4, XXIII or 23 will turn into 0023.\n        /// </summary>\n        private static int numberLength = 2;\n\n        private static string[] excludedRomanNumerals = new[] { \"XL\", \"XD\", \"DX\", \"XXX\", \"L\", \"C\", \"D\", \"M\", \"MII\", \"MIX\", \"MX\", \"MC\", \"DC\" };\n\n        //Haven't observed game titles with zero, or four and above that would benefit from making those words sortable numbers\n        private static Dictionary<string, int> numberWordValues = new Dictionary<string, int>(StringComparer.InvariantCultureIgnoreCase) { { \"one\", 1 }, { \"two\", 2 }, { \"three\", 3 } };\n\n        private static Dictionary<char, int> romanNumeralValues = new Dictionary<char, int>\n        {\n            { 'I', 1 }, { 'V', 5 }, { 'X', 10 }, { 'L', 50 }, { 'C', 100 }, { 'D', 500 }, { 'M', 1000 },\n            //unicode uppercase\n            {'Ⅰ', 1}, {'Ⅱ', 2}, {'Ⅲ', 3}, {'Ⅳ', 4}, {'Ⅴ', 5}, {'Ⅵ', 6}, {'Ⅶ', 7}, {'Ⅷ', 8}, {'Ⅸ', 9}, {'Ⅹ', 10}, {'Ⅺ', 11}, {'Ⅻ', 12}, {'Ⅼ', 50}, {'Ⅽ', 100}, {'Ⅾ', 500}, {'Ⅿ', 1000},\n            //unicode lowercase\n            {'ⅰ', 1}, {'ⅱ', 2}, {'ⅲ', 3}, {'ⅳ', 4}, {'ⅴ', 5}, {'ⅵ', 6}, {'ⅶ', 7}, {'ⅷ', 8}, {'ⅸ', 9}, {'ⅹ', 10}, {'ⅺ', 11}, {'ⅻ', 12}, {'ⅼ', 50}, {'ⅽ', 100}, {'ⅾ', 500}, {'ⅿ', 1000},\n            //unicode big/exotic numbers\n            {'ↀ', 1000}, {'ↁ', 5000}, {'ↂ', 10000}, {'Ↄ', 100}, {'ↄ', 100}, {'ↅ', 6}, {'ↆ', 50 }, {'ↇ', 50000}, {'ↈ', 100000 }\n        };\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"articles\">Words to remove from the start of the title. Suggested: the contents of PlayniteSettings.GameSortingNameRemovedArticles, or \"The\", \"A\", \"An\".</param>\n        /// <param name=\"batchOperation\">Optimize for larger amounts of throughput. Slower for small amounts.</param>\n        public SortableNameConverter(IEnumerable<string> articles, bool batchOperation = false)\n        {\n            if (articles == null)\n            {\n                throw new ArgumentNullException(nameof(articles));\n            }\n\n            //(?<![\\w.]|^) prevents the numerical matches from happening at the start of the string (for example for X-COM or XIII) or attached to a word or . (to avoid S.T.A.L.K.E.R. -> S.T.A.50.K.E.R.)\n            //(?!\\.) prevents matching roman numerals with a period right after (again for cases like abbreviations with periods, but that start with a roman numeral character)\n            //\\u2160-\\u2188 is the unicode range of roman numerals listed in RomanNumeralValues\n            //using [0-9] here instead of \\d because \\d also matches ٠١٢٣٤٥٦٧٨٩ and I don't know what to do with those           \n            //the (?i) is a modifier that makes the rest of the regex (to the right of it) case insensitive\n            //see https://www.regular-expressions.info/modifiers.html\n\n            var articlesPattern = string.Join(\"|\", articles.Select(Regex.Escape));\n            var articlesGroup = string.IsNullOrEmpty(articlesPattern) ? string.Empty : $@\"^(?<article>{articlesPattern})\\s+|\";\n            var regexStr = $@\"(?<![\\w.]|^)((?<roman>[IVXLCDM\\u2160-\\u2188]+(?!\\.))|(?<arabic>[0-9]+))(?=\\W|$)|(?i){articlesGroup}\\b(?<numberword>{string.Join(\"|\", numberWordValues.Keys)})\\b\";\n            var options = RegexOptions.ExplicitCapture;\n            if (batchOperation)\n            {\n                options |= RegexOptions.Compiled;\n            }\n\n            regex = new Regex(regexStr, options);\n            ignoredEndWordsRegex = new Regex(@\"(\\s*[:-])?(\\s+([a-z']+\\s+(edition|cut)|hd|collection|remaster(ed)?|remake|ultimate|anthology|game of the))+$\", options | RegexOptions.IgnoreCase);\n        }\n\n        public string Convert(string input)\n        {\n            if (string.IsNullOrWhiteSpace(input))\n            {\n                return input;\n            }\n\n            input = StripEdition(input, out string edition);\n\n            string output = regex.Replace(input, match =>\n            {\n                if (match.Groups[\"roman\"].Success)\n                {\n                    if (match.Value == \"I\")\n                    {\n                        if (MatchComesAfterChapterOrEpisodeOrAtEndOfString(input, match))\n                        {\n                            return \"1\".PadLeft(numberLength, '0');\n                        }\n                        else\n                        {\n                            return match.Value;\n                        }\n                    }\n                    else if (match.Value == \"X\")\n                    {\n                        if (MatchComesAfterChapterOrEpisodeOrAtEndOfString(input, match, maxDistanceFromEnd: 4) && !MatchComesBeforeDashAndWord(input, match))\n                        {\n                            return \"10\".PadLeft(numberLength, '0');\n                        }\n                        else\n                        {\n                            return match.Value;\n                        }\n                    }\n                    else if (excludedRomanNumerals.Contains(match.Value))\n                    {\n                        return match.Value;\n                    }\n                    return ConvertRomanNumeralToInt(match.Value)?.ToString(new string('0', numberLength)) ?? match.Value;\n                }\n                else if (match.Groups[\"arabic\"].Success)\n                {\n                    return match.Value.PadLeft(numberLength, '0');\n                }\n                else if (match.Groups[\"article\"].Success)\n                {\n                    return string.Empty;\n                }\n                else if (match.Groups[\"numberword\"].Success)\n                {\n                    if (MatchComesAfterChapterOrEpisodeOrAtEndOfString(input, match))\n                    {\n                        return numberWordValues[match.Value].ToString(new string('0', numberLength));\n                    }\n                    else\n                    {\n                        return match.Value;\n                    }\n                }\n                return match.Value;\n            });\n\n            return output + edition;\n        }\n\n        /// <summary>\n        /// Convert a number from Roman numerals to an integer\n        /// </summary>\n        /// <param name=\"input\">The roman numeral.</param>\n        /// <param name=\"validate\">If false, parse any roman numeral. If true, reject invalid ones.</param>\n        /// <returns>An integer form of the supplied roman numeral, or NULL if the supplied roman numeral is invalid and <paramref name=\"validate\"/> is true.</returns>\n        /// <exception cref=\"KeyNotFoundException\">When the input contains non-numeral characters.</exception>\n        public static int? ConvertRomanNumeralToInt(string input, bool validate = true)\n        {\n            if (string.IsNullOrWhiteSpace(input))\n            {\n                return null;\n            }\n\n            int output = 0;\n            int biggestNumberToTheRight = 0;\n\n            int prevCharGroupLength = 0;\n            int lastNumericValue = 0;\n            for (int i = input.Length - 1; i >= 0; i--)\n            {\n                char c = input[i];\n                if (!romanNumeralValues.TryGetValue(c, out int value))\n                {\n                    return null;\n                }\n\n                bool subtract = value < biggestNumberToTheRight;\n                if (subtract)\n                {\n                    output -= value;\n                }\n                else\n                {\n                    output += value;\n                    biggestNumberToTheRight = value;\n                }\n\n                #region validation\n\n                if (!validate)\n                {\n                    continue;\n                }\n\n                //reject things like IVX and VIX and IIX\n                //subtractive numerals are only ever singular\n                if (subtract && lastNumericValue < biggestNumberToTheRight)\n                {\n                    return null;\n                }\n\n                //reject things like VX or LC or DM\n                //subtractions can't be half the bigger value\n                //IV is as close as the two numbers get in value\n                if (subtract && value * 5 > biggestNumberToTheRight)\n                {\n                    return null;\n                }\n\n                if (value == lastNumericValue)\n                {\n                    //Numerals that aren't 1 or 10ⁿ can't repeat\n                    if (!IsOneOrPowerOfTen(value))\n                    {\n                        return null;\n                    }\n\n                    //No numeral can repeat 4 times\n                    prevCharGroupLength++;\n                    if (prevCharGroupLength == 4)\n                    {\n                        return null;\n                    }\n                }\n                else\n                {\n                    prevCharGroupLength = 1;\n                }\n\n                lastNumericValue = value;\n\n                #endregion validation\n            }\n            return output;\n        }\n\n        private string StripEdition(string input, out string edition)\n        {\n            var match = ignoredEndWordsRegex.Match(input);\n            if (match.Success)\n            {\n                edition = match.Value;\n                return input.Remove(match.Index);\n            }\n            else\n            {\n                edition = string.Empty;\n                return input;\n            }\n        }\n\n        private static bool MatchComesAfterChapterOrEpisodeOrAtEndOfString(string input, Match match, int maxDistanceFromEnd = 0)\n        {\n            bool matchIsAtEndOfString = MatchIsNearEndOfString(input, match, maxDistanceFromEnd);\n            string theBitImmediatelyPriorToTheMatch = input.Substring(Math.Max(0, match.Index - 9), length: Math.Min(9, match.Index));\n            return matchIsAtEndOfString\n                || theBitImmediatelyPriorToTheMatch.Contains(\"chapter\", StringComparison.InvariantCultureIgnoreCase)\n                || theBitImmediatelyPriorToTheMatch.Contains(\"season\", StringComparison.InvariantCultureIgnoreCase)\n                || theBitImmediatelyPriorToTheMatch.Contains(\"episode\", StringComparison.InvariantCultureIgnoreCase);\n        }\n\n        private static bool MatchIsNearEndOfString(string input, Match match, int maxDistanceFromEnd)\n        {\n            int distance = input.Length - (match.Index + match.Length);\n            return distance <= maxDistanceFromEnd;\n        }\n\n        private static bool MatchComesBeforeDashAndWord(string input, Match match)\n        {\n            if (MatchIsNearEndOfString(input, match, maxDistanceFromEnd: 1))\n            {\n                return false;\n            }\n\n            char nextChar = input[match.Index + match.Length];\n            if (nextChar != '-')\n            {\n                return false;\n            }\n\n            string nextWord = \"\";\n\n            for (int i = match.Index + match.Length + 1; i < input.Length; i++)\n            {\n                char c = input[i];\n                if (char.IsWhiteSpace(c))\n                {\n                    break;\n                }\n\n                if (!char.IsLetter(c))\n                {\n                    return false;\n                }\n\n                nextWord += c;\n            }\n\n            return excludedRomanNumerals.Contains(nextWord) || ConvertRomanNumeralToInt(nextWord) == null;\n        }\n\n        private static bool IsOneOrPowerOfTen(int x)\n        {\n            while (x > 9 && x % 10 == 0)\n            {\n                x /= 10;\n            }\n\n            return x == 1;\n        }\n    }\n}\n"
  },
  {
    "path": "source/Playnite/SystemIntegration.cs",
    "content": "﻿using Microsoft.Win32;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class SystemIntegration\r\n    {\r\n        public static void RegisterPlayniteUriProtocol()\r\n        {\r\n            var view = RegistryView.Registry32;\r\n            if (Environment.Is64BitOperatingSystem)\r\n            {\r\n                view = RegistryView.Registry64;\r\n            }\r\n\r\n            using (var root = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, view))\r\n            using (var classes = root.OpenSubKey(@\"Software\\Classes\", true))\r\n            {\r\n                var openString = $\"\\\"{PlaynitePaths.DesktopExecutablePath}\\\" --uridata \\\"%1\\\"\";\r\n                var existing = classes.OpenSubKey(@\"Playnite\\shell\\open\\command\");\r\n                if (existing != null && existing.GetValue(string.Empty)?.ToString() == openString)\r\n                {\r\n                    existing.Dispose();\r\n                    return;\r\n                }\r\n\r\n                using (var newEntry = classes.CreateSubKey(\"Playnite\"))\r\n                {\r\n                    newEntry.SetValue(string.Empty, \"URL:playnite\");\r\n                    newEntry.SetValue(\"URL Protocol\", string.Empty);\r\n                    using (var command = newEntry.CreateSubKey(@\"shell\\open\\command\"))\r\n                    {\r\n                        command.SetValue(string.Empty, openString);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void SetBootupStateRegistration(bool runOnBootup, bool startClosed)\r\n        {\r\n            var startupPath = Environment.GetFolderPath(Environment.SpecialFolder.Startup, Environment.SpecialFolderOption.Create);\r\n            var shortcutPath = Path.Combine(startupPath, \"Playnite.lnk\");\r\n            if (runOnBootup)\r\n            {\r\n                var args = new CmdLineOptions()\r\n                {\r\n                    HideSplashScreen = true,\r\n                    StartClosedToTray = startClosed\r\n                }.ToString();\r\n\r\n                if (File.Exists(shortcutPath))\r\n                {\r\n                    var existLnk = Programs.GetLnkShortcutData(shortcutPath);\r\n                    if (existLnk.Path == PlaynitePaths.DesktopExecutablePath &&\r\n                        existLnk.Arguments == args)\r\n                    {\r\n                        return;\r\n                    }\r\n                }\r\n\r\n                FileSystem.DeleteFile(shortcutPath);\r\n                Programs.CreateShortcut(PlaynitePaths.DesktopExecutablePath, args, \"\", shortcutPath);\r\n            }\r\n            else\r\n            {\r\n                FileSystem.DeleteFile(shortcutPath);\r\n            }\r\n        }\r\n\r\n        public static void RegisterFileExtensions()\r\n        {\r\n            var view = RegistryView.Registry32;\r\n            if (Environment.Is64BitOperatingSystem)\r\n            {\r\n                view = RegistryView.Registry64;\r\n            }\r\n\r\n            using (var root = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, view))\r\n            using (var classes = root.OpenSubKey(@\"Software\\Classes\", true))\r\n            {\r\n                var openString = $\"\\\"{PlaynitePaths.DesktopExecutablePath}\\\" --installext \\\"%1\\\"\";\r\n                var existing = classes.OpenSubKey(@\"Playnite.ext\\shell\\open\\command\");\r\n                if (existing != null && existing.GetValue(string.Empty)?.ToString() == openString)\r\n                {\r\n                    existing.Dispose();\r\n                    return;\r\n                }\r\n\r\n                using (var newEntry = classes.CreateSubKey(\"Playnite.ext\"))\r\n                {\r\n                    newEntry.SetValue(string.Empty, \"Playnite extension file\");\r\n                    using (var command = newEntry.CreateSubKey(@\"DefaultIcon\"))\r\n                    {\r\n                        var icoPath = Path.Combine(PlaynitePaths.ProgramPath, \"Resources\", \"playnite_extension.ico\");\r\n                        command.SetValue(string.Empty, $\"\\\"{icoPath}\\\"\");\r\n                    }\r\n\r\n                    using (var command = newEntry.CreateSubKey(@\"shell\\open\\command\"))\r\n                    {\r\n                        command.SetValue(string.Empty, openString);\r\n                    }\r\n                }\r\n\r\n                using (var newEntry = classes.CreateSubKey(PlaynitePaths.PackedExtensionFileExtention))\r\n                using (var command = newEntry.CreateSubKey(@\"OpenWithProgids\"))\r\n                {\r\n                    command.SetValue(\"Playnite.ext\", string.Empty);\r\n                }\r\n\r\n                using (var newEntry = classes.CreateSubKey(PlaynitePaths.PackedThemeFileExtention))\r\n                using (var command = newEntry.CreateSubKey(@\"OpenWithProgids\"))\r\n                {\r\n                    command.SetValue(\"Playnite.ext\", string.Empty);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Themes.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing Playnite;\r\nusing System.Windows;\r\nusing System.Windows.Markup;\r\nusing System.Text.RegularExpressions;\r\nusing Playnite.Settings;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing YamlDotNet.Serialization;\r\nusing Playnite.API;\r\nusing Playnite.Extensions.Markup;\r\nusing System.Windows.Input;\r\nusing Playnite.Plugins;\r\n\r\nnamespace Playnite\r\n{\r\n    public class ThemeManager\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        public static System.Version DesktopApiVersion => new System.Version(\"2.9.0\");\r\n        public static System.Version FullscreenApiVersion => new System.Version(\"2.9.0\");\r\n        public static ThemeManifest CurrentTheme { get; private set; }\r\n        public static ThemeManifest DefaultTheme { get; private set; }\r\n        public const string DefaultDesktopThemeId = \"Playnite_builtin_DefaultDesktop\";\r\n        public const string DefaultFullscreenThemeId = \"Playnite_builtin_DefaultFullscreen\";\r\n        public const string DefaultThemeDirName = \"Default\";\r\n\r\n        public static System.Version GetApiVersion(ApplicationMode mode)\r\n        {\r\n            return mode == ApplicationMode.Desktop ? DesktopApiVersion : FullscreenApiVersion;\r\n        }\r\n\r\n        public static string GetThemeRootDir(ApplicationMode mode)\r\n        {\r\n            return mode == ApplicationMode.Desktop ? \"Desktop\" : \"Fullscreen\";\r\n        }\r\n\r\n        public static void SetCurrentTheme(ThemeManifest theme)\r\n        {\r\n            CurrentTheme = theme;\r\n        }\r\n\r\n        public static void SetDefaultTheme(ThemeManifest theme)\r\n        {\r\n            DefaultTheme = theme;\r\n        }\r\n\r\n        public static void ApplyFullscreenButtonPrompts(Application app, FullscreenButtonPrompts prompts)\r\n        {\r\n            if (prompts == FullscreenSettings.DefaultButtonPrompts)\r\n            {\r\n                var defaultXaml = $\"{FullscreenSettings.DefaultButtonPrompts.ToString()}.xaml\";\r\n                foreach (var dir in PlayniteApplication.CurrentNative.Resources.MergedDictionaries.ToList())\r\n                {\r\n                    if (dir.Source == null)\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    if (dir.Source.OriginalString.Contains(\"ButtonPrompts\") &&\r\n                        !dir.Source.OriginalString.EndsWith(defaultXaml))\r\n                    {\r\n                        PlayniteApplication.CurrentNative.Resources.MergedDictionaries.Remove(dir);\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var promptsPath = Path.Combine(ThemeManager.DefaultTheme.DirectoryPath, \"Images\", \"ButtonPrompts\");\r\n                foreach (var dir in Directory.GetDirectories(promptsPath))\r\n                {\r\n                    var dirInfo = new DirectoryInfo(dir);\r\n                    var promptXaml = Path.Combine(dir, $\"{dirInfo.Name}.xaml\");\r\n                    if (File.Exists(promptXaml) && dirInfo.Name == prompts.ToString())\r\n                    {\r\n                        var xaml = Xaml.FromFile(promptXaml);\r\n                        if (xaml is ResourceDictionary xamlDir)\r\n                        {\r\n                            xamlDir.Source = new Uri(promptXaml, UriKind.Absolute);\r\n                            PlayniteApplication.CurrentNative.Resources.MergedDictionaries.Add(xamlDir);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static AddonLoadError ApplyTheme(Application app, ThemeManifest theme, ApplicationMode mode)\r\n        {\r\n            if (theme.Id.IsNullOrEmpty())\r\n            {\r\n                logger.Error($\"Theme {theme.Name}, doesn't have ID.\");\r\n                return AddonLoadError.Uknown;\r\n            }\r\n\r\n            var apiVesion = mode == ApplicationMode.Desktop ? DesktopApiVersion : FullscreenApiVersion;\r\n            if (!theme.ThemeApiVersion.IsNullOrEmpty())\r\n            {\r\n                var themeVersion = new Version(theme.ThemeApiVersion);\r\n                if (themeVersion.Major != apiVesion.Major || themeVersion > apiVesion)\r\n                {\r\n                    logger.Error($\"Failed to apply {theme.Name} theme, unsupported API version {theme.ThemeApiVersion}.\");\r\n                    return AddonLoadError.SDKVersion;\r\n                }\r\n            }\r\n\r\n            var acceptableXamls = new List<string>();\r\n            var defaultRoot = $\"Themes/{mode.GetDescription()}/{DefaultTheme.DirectoryName}/\";\r\n            foreach (var dict in app.Resources.MergedDictionaries)\r\n            {\r\n                if (dict.Source.OriginalString.StartsWith(defaultRoot))\r\n                {\r\n                    acceptableXamls.Add(dict.Source.OriginalString.Replace(defaultRoot, \"\").Replace('/', '\\\\'));\r\n                }\r\n            }\r\n\r\n            var allLoaded = true;\r\n            foreach (var accXaml in acceptableXamls)\r\n            {\r\n                var xamlPath = Path.Combine(theme.DirectoryPath, accXaml);\r\n                if (!File.Exists(xamlPath))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                try\r\n                {\r\n                    var xaml = Xaml.FromFile(xamlPath);\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to load xaml {xamlPath}\");\r\n                    allLoaded = false;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (!allLoaded)\r\n            {\r\n                return AddonLoadError.Uknown;\r\n            }\r\n\r\n            try\r\n            {\r\n                var cursorFile = ThemeFile.GetFilePath(\"cursor.cur\");\r\n                if (cursorFile.IsNullOrEmpty())\r\n                {\r\n                    cursorFile = ThemeFile.GetFilePath(\"cursor.ani\");\r\n                }\r\n\r\n                if (!cursorFile.IsNullOrEmpty())\r\n                {\r\n                    Mouse.OverrideCursor = new Cursor(cursorFile, true);\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to set custom mouse cursor.\");\r\n            }\r\n\r\n            var themeRoot = $\"Themes\\\\{mode.GetDescription()}\\\\{theme.DirectoryName}\\\\\";\r\n            // This is sad that we have to do this, but it fixes issues like #2328\r\n            // We need to remove all loaded theme resources and reload them in specific order:\r\n            //      default/1.xaml -> theme/1.xaml -> default/2.xaml -> theme/2.xaml etc.\r\n            //\r\n            // We can't just load custom theme files at the end or insert them in already loaded pool of resources\r\n            // because styling with static references won't reload data from custom theme files.\r\n            // That's why we also have to create new instances of default styles.\r\n            foreach (var defaultRes in app.Resources.MergedDictionaries.ToList())\r\n            {\r\n                if (defaultRes.Source.OriginalString.StartsWith(defaultRoot))\r\n                {\r\n                    app.Resources.MergedDictionaries.Remove(defaultRes);\r\n                }\r\n            }\r\n\r\n            foreach (var themeXamlFile in acceptableXamls)\r\n            {\r\n                var defaultPath = Path.Combine(PlaynitePaths.ThemesProgramPath, mode.GetDescription(), DefaultThemeDirName, themeXamlFile);\r\n                var defaultXaml = Xaml.FromFile(defaultPath);\r\n                if (defaultXaml is ResourceDictionary xamlDir)\r\n                {\r\n                    xamlDir.Source = new Uri(defaultPath, UriKind.Absolute);\r\n                    app.Resources.MergedDictionaries.Add(xamlDir);\r\n                }\r\n\r\n                var xamlPath = Path.Combine(theme.DirectoryPath, themeXamlFile);\r\n                if (!File.Exists(xamlPath))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                var xaml = Xaml.FromFile(xamlPath);\r\n                if (xaml is ResourceDictionary themeDir)\r\n                {\r\n                    themeDir.Source = new Uri(xamlPath, UriKind.Absolute);\r\n                    app.Resources.MergedDictionaries.Add(themeDir);\r\n                }\r\n                else\r\n                {\r\n                    logger.Error($\"Skipping theme file {xamlPath}, it's not resource dictionary.\");\r\n                }\r\n            }\r\n\r\n            try\r\n            {\r\n                Localization.LoadAddonLocalization(theme.DirectoryPath);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to load theme's localization files.\");\r\n                return AddonLoadError.Uknown;\r\n            }\r\n\r\n            return AddonLoadError.None;\r\n        }\r\n\r\n        public static IEnumerable<ThemeManifest> GetAvailableThemes()\r\n        {\r\n            foreach (var theme in GetAvailableThemes(ApplicationMode.Desktop))\r\n            {\r\n                yield return theme;\r\n            }\r\n\r\n            foreach (var theme in GetAvailableThemes(ApplicationMode.Fullscreen))\r\n            {\r\n                yield return theme;\r\n            }\r\n        }\r\n\r\n        public static List<ThemeManifest> GetAvailableThemes(ApplicationMode mode)\r\n        {\r\n            var modeDir = GetThemeRootDir(mode);\r\n            var user = new List<BaseExtensionManifest>();\r\n            var install = new List<BaseExtensionManifest>();\r\n\r\n            var userPath = Path.Combine(PlaynitePaths.ThemesUserDataPath, modeDir);\r\n            if (Directory.Exists(userPath))\r\n            {\r\n                foreach (var dir in Directory.GetDirectories(userPath))\r\n                {\r\n                    try\r\n                    {\r\n                        var descriptorPath = Path.Combine(dir, PlaynitePaths.ThemeManifestFileName);\r\n                        if (File.Exists(descriptorPath))\r\n                        {\r\n                            var info = new FileInfo(descriptorPath);\r\n                            var man = new ThemeManifest(descriptorPath);\r\n                            if (!man.Id.IsNullOrEmpty())\r\n                            {\r\n                                user.Add(man);\r\n                            }\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to load theme info {dir}\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            var programPath = Path.Combine(PlaynitePaths.ThemesProgramPath, modeDir);\r\n            if (Directory.Exists(programPath))\r\n            {\r\n                foreach (var dir in Directory.GetDirectories(programPath))\r\n                {\r\n                    try\r\n                    {\r\n                        var descriptorPath = Path.Combine(dir, PlaynitePaths.ThemeManifestFileName);\r\n                        if (File.Exists(descriptorPath))\r\n                        {\r\n                            var info = new FileInfo(descriptorPath);\r\n                            var man = new ThemeManifest(descriptorPath);\r\n                            if (!man.Id.IsNullOrEmpty())\r\n                            {\r\n                                if (user.Any(a => a.Id == man.Id))\r\n                                {\r\n                                    continue;\r\n                                }\r\n                                else\r\n                                {\r\n                                    install.Add(man);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to load theme info {dir}\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            var result = new List<ThemeManifest>();\r\n            result.AddRange(ExtensionFactory.DeduplicateExtList(user).Cast<ThemeManifest>());\r\n            result.AddRange(ExtensionFactory.DeduplicateExtList(install).Cast<ThemeManifest>());\r\n            return result;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite/ThirdPartyClients/ThirdPartyToolsList.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public class ThirdPartyTool\r\n    {\r\n        public LibraryClient Client { get; set; }\r\n\r\n        public string Name { get; set; }\r\n\r\n        public System.Windows.Controls.Image Icon { get; set; }\r\n\r\n        public void Start()\r\n        {\r\n            Client.Open();\r\n        }\r\n    }\r\n\r\n    public class ThirdPartyToolsList\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        public static List<ThirdPartyTool> GetTools(IEnumerable<LibraryPlugin> plugins)\r\n        {\r\n            var tools = new List<ThirdPartyTool>();\r\n            if (plugins?.Any() == true)\r\n            {\r\n                foreach (var plugin in plugins.OrderBy(a => a.Name))\r\n                {\r\n                    try\r\n                    {\r\n                        if (plugin.Client != null && plugin.Client.IsInstalled)\r\n                        {\r\n                            var tool = new ThirdPartyTool()\r\n                            {\r\n                                Client = plugin.Client,\r\n                                Name = plugin.Name\r\n                            };\r\n\r\n                            if (plugin.Client?.Icon != null && File.Exists(plugin.Client.Icon))\r\n                            {\r\n                                tool.Icon = Images.GetImageFromFile(\r\n                                    plugin.Client.Icon,\r\n                                    System.Windows.Media.BitmapScalingMode.Fant,\r\n                                    double.NaN,\r\n                                    double.NaN);\r\n                            }\r\n\r\n                            tools.Add(tool);\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to get client info from {plugin.Name}.\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            return tools;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/UrlConstants.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    public static class UrlConstants\r\n    {\r\n        public const string IssuesTesting = @\"https://github.com/JosefNemec/Playnite.Testing/issues/new\";\r\n        public const string Issues = @\"https://github.com/JosefNemec/Playnite/issues/new/choose\";\r\n        public const string Patreon = @\"https://www.patreon.com/playnite\";\r\n        public const string Kofi = @\"https://ko-fi.com/playnite\";\r\n        public const string Discord = @\"https://playnite.link/discord\";\r\n        public const string Reddit = @\"https://www.reddit.com/r/playnite/\";\r\n        public const string SdkDocs = @\"https://playnite.link/docs/\";\r\n        public const string Wiki = @\"https://github.com/JosefNemec/Playnite/wiki\";\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ViewModels/AddonsViewModelBase_Online.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Common.Web;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.ViewModels\r\n{\r\n    public class AddonsViewModelBase : ObservableObject\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        public readonly IDialogsFactory dialogs;\r\n        public readonly IResourceProvider resources;\r\n\r\n        private bool isRestartRequired = false;\r\n        public bool IsRestartRequired\r\n        {\r\n            get => isRestartRequired;\r\n            set\r\n            {\r\n                isRestartRequired = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<AddonUpdate> updateAddonList;\r\n        public List<AddonUpdate> UpdateAddonList\r\n        {\r\n            get => updateAddonList;\r\n            set\r\n            {\r\n                updateAddonList = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<AddonManifest> UpdateAddonsCommand\r\n        {\r\n            get => new RelayCommand<AddonManifest>((a) =>\r\n            {\r\n                UpdateAddons();\r\n            });\r\n        }\r\n\r\n        public AddonsViewModelBase(\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources)\r\n        {\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n        }\r\n\r\n        public void UpdateAddons()\r\n        {\r\n            var addons = UpdateAddonList.Where(a => a.Selected == true);\r\n            if (!addons.HasItems())\r\n            {\r\n                return;\r\n            }\r\n\r\n            dialogs.ActivateGlobalProgress((prg) =>\r\n            {\r\n                prg.ProgressMaxValue = addons.Count();\r\n                prg.CurrentProgressValue = -1;\r\n                foreach (var update in addons)\r\n                {\r\n                    try\r\n                    {\r\n                        prg.CurrentProgressValue++;\r\n                        prg.Text = string.Format(resources.GetString(LOC.AddonDownloadingAddon), update.Item.Name);\r\n                        Thread.Sleep(500);\r\n\r\n                        var licenseRes = update.Item.CheckAddonLicense();\r\n                        if (licenseRes == null)\r\n                        {\r\n                            update.Status = AddonUpdateStatus.Failed;\r\n                            continue;\r\n                        }\r\n\r\n                        if (licenseRes == false)\r\n                        {\r\n                            update.Status = AddonUpdateStatus.LicenseRejected;\r\n                            continue;\r\n                        }\r\n\r\n                        var locaPath = update.Item.GetTargetDownloadPath();\r\n                        FileSystem.DeleteFile(locaPath);\r\n\r\n                        if (update.Package.PackageUrl.IsHttpUrl())\r\n                        {\r\n                            FileSystem.PrepareSaveFile(locaPath);\r\n                            HttpDownloader.DownloadFile(update.Package.PackageUrl, locaPath);\r\n                        }\r\n                        else\r\n                        {\r\n                            File.Copy(update.Package.PackageUrl, locaPath);\r\n                        }\r\n\r\n                        ExtensionInstaller.QueuePackageInstall(locaPath);\r\n                        update.Status = AddonUpdateStatus.Downloaded;\r\n                        IsRestartRequired = true;\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to download addon update. {update.Item.AddonId}\");\r\n                        update.Status = AddonUpdateStatus.Failed;\r\n                        update.StatusMessage = e.Message;\r\n                    }\r\n                }\r\n            }, new GlobalProgressOptions(\"\") { IsIndeterminate = false });\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ViewModels/CrashHandlerViewModel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.Services;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\n\r\nnamespace Playnite.ViewModels\r\n{\r\n    public class CrashHandlerViewModel : ObservableObject\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        private IWindowFactory window;\r\n        private IDialogsFactory dialogs;\r\n        private IResourceProvider resources;\r\n        private ApplicationMode mode;\r\n        private ExceptionInfo exInfo;\r\n        private PlayniteSettings settings;\r\n\r\n        private string description;\r\n        public string Description\r\n        {\r\n            get => description;\r\n            set\r\n            {\r\n                description = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool disableExtension;\r\n        public bool DisableExtension\r\n        {\r\n            get => disableExtension;\r\n            set\r\n            {\r\n                disableExtension = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showDisableCheck;\r\n        public bool ShowDisableCheck\r\n        {\r\n            get => showDisableCheck;\r\n            set\r\n            {\r\n                showDisableCheck = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public string ExtCrashDescription { get; set; }\r\n\r\n        public RelayCommand<object> CreateDiagPackageCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CreateDiagPackage(new DiagnosticPackageInfo\r\n                {\r\n                    IsCrashPackage = true,\r\n                    PlayniteVersion = Updater.CurrentVersion.ToString(4)\r\n                });\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> CloseCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ReportIssueCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ReportIssue();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> RestartCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RestartApp();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> RestartSafeCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RestartAppSafe();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SaveLogCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SaveLog();\r\n            });\r\n        }\r\n\r\n        public CrashHandlerViewModel(\r\n            CrashHandlerWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ApplicationMode mode)\r\n        {\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            this.mode = mode;\r\n        }\r\n\r\n        public CrashHandlerViewModel(\r\n            ExtensionCrashHandlerWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ApplicationMode mode,\r\n            ExceptionInfo exInfo,\r\n            PlayniteSettings settings)\r\n        {\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            this.mode = mode;\r\n            this.exInfo = exInfo;\r\n            this.settings = settings;\r\n            if (exInfo.CrashExtension == null)\r\n            {\r\n                ShowDisableCheck = false;\r\n                ExtCrashDescription = resources.GetString(LOC.ExtCrashDescriptionUknown);\r\n            }\r\n            else\r\n            {\r\n                ShowDisableCheck = true;\r\n                ExtCrashDescription = resources.\r\n                    GetString(mode == ApplicationMode.Desktop ? LOC.ExtCrashDescription : LOC.ExtCrashDescriptionFS).\r\n                    Format(exInfo.CrashExtension.Name);\r\n            }\r\n        }\r\n\r\n        public void OpenView()\r\n        {\r\n            window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView()\r\n        {\r\n            window.Close();\r\n        }\r\n\r\n        public static void ReportIssue()\r\n        {\r\n            try\r\n            {\r\n                if (PlayniteEnvironment.ReleaseChannel == ReleaseChannel.Beta)\r\n                {\r\n                    ProcessStarter.StartUrl(UrlConstants.IssuesTesting);\r\n                }\r\n                else\r\n                {\r\n                    ProcessStarter.StartUrl(UrlConstants.Issues);\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to open report issue url.\");\r\n            }\r\n        }\r\n\r\n        public void RestartApp()\r\n        {\r\n            if (exInfo?.CrashExtension != null && exInfo?.IsExtensionCrash == true && DisableExtension)\r\n            {\r\n                settings.DisabledPlugins.AddMissing(exInfo.CrashExtension.Id);\r\n                settings.SaveSettings();\r\n            }\r\n\r\n            if (mode == ApplicationMode.Desktop)\r\n            {\r\n                Process.Start(PlaynitePaths.DesktopExecutablePath);\r\n            }\r\n            else\r\n            {\r\n                Process.Start(PlaynitePaths.FullscreenExecutablePath);\r\n            }\r\n\r\n            CloseView();\r\n        }\r\n\r\n        public void RestartAppSafe()\r\n        {\r\n            var options = new CmdLineOptions\r\n            {\r\n                SafeStartup = true,\r\n                UserDataDir = PlayniteApplication.Current.CmdLine.UserDataDir\r\n            };\r\n\r\n            if (mode == ApplicationMode.Desktop)\r\n            {\r\n                Process.Start(PlaynitePaths.DesktopExecutablePath, options.ToString());\r\n            }\r\n            else\r\n            {\r\n                Process.Start(PlaynitePaths.FullscreenExecutablePath, options.ToString());\r\n            }\r\n\r\n            CloseView();\r\n        }\r\n\r\n        private void CreateDiagPackage(DiagnosticPackageInfo packageInfo)\r\n        {\r\n            CreateDiagPackage(dialogs, Description, packageInfo);\r\n        }\r\n\r\n        public static void CreateDiagPackage(\r\n            IDialogsFactory dialogs,\r\n            string crashDescription = null,\r\n            DiagnosticPackageInfo packageInfo = null)\r\n        {\r\n            try\r\n            {\r\n                var diagPath = Path.Combine(PlaynitePaths.TempPath, \"diag.zip\");\r\n                if (packageInfo == null)\r\n                {\r\n                    packageInfo = new DiagnosticPackageInfo\r\n                    {\r\n                        IsCrashPackage = false,\r\n                        PlayniteVersion = Updater.CurrentVersion.ToString(4)\r\n                    };\r\n                }\r\n\r\n                var genResult = GlobalProgress.ActivateProgress((_) =>\r\n                    Diagnostic.CreateDiagPackage(diagPath, crashDescription, packageInfo),\r\n                    new GlobalProgressOptions(\"LOCDiagGenerating\"));\r\n                if (genResult.Result != true)\r\n                {\r\n                    logger.Error(genResult.Error, \"Failed to created diagnostics package.\");\r\n                    dialogs.ShowErrorMessage(ResourceProvider.GetString(\"LOCDiagPackageCreationError\"), \"\");\r\n                    return;\r\n                }\r\n\r\n                var mode = PlayniteApplication.Current.Mode;\r\n                if (PlayniteEnvironment.InOfflineMode && mode == ApplicationMode.Desktop)\r\n                {\r\n                    Explorer.NavigateToFileSystemEntry(diagPath);\r\n                    return;\r\n                }\r\n\r\n                var uploadedId = Guid.Empty;\r\n                var uploadResult = GlobalProgress.ActivateProgress((_) =>\r\n                    uploadedId = new ServicesClient().UploadDiagPackage(diagPath),\r\n                    new GlobalProgressOptions(\"LOCDiagUploading\"));\r\n                if (uploadedId == Guid.Empty)\r\n                {\r\n                    Explorer.NavigateToFileSystemEntry(diagPath);\r\n                    return;\r\n                }\r\n\r\n                if (uploadResult.Result == true)\r\n                {\r\n                    if (mode == ApplicationMode.Desktop)\r\n                    {\r\n                        dialogs.ShowSelectableString(ResourceProvider.GetString(\"LOCDiagPackageCreationSuccess\"), \"\", uploadedId.ToString());\r\n                    }\r\n                    else\r\n                    {\r\n                        dialogs.ShowMessage(ResourceProvider.GetString(\"LOCDiagPackageSentSuccess\"));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    logger.Error(uploadResult.Error, \"Failed to upload diag package.\");\r\n                    dialogs.ShowErrorMessage(ResourceProvider.GetString(\"LOCDiagPackageUploadError\"), \"\");\r\n                    if (mode == ApplicationMode.Desktop)\r\n                    {\r\n                        Explorer.NavigateToFileSystemEntry(diagPath);\r\n                    }\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to process CreateDiagPackage\");\r\n                dialogs.ShowErrorMessage(ResourceProvider.GetString(\"LOCDiagPackageCreationError\"), \"\");\r\n            }\r\n        }\r\n\r\n        private void SaveLog()\r\n        {\r\n            var targetPath = dialogs.SaveFile(\"zip file|*.zip\", true);\r\n            if (!targetPath.IsNullOrEmpty())\r\n            {\r\n                Diagnostic.CreateLogPackage(targetPath);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ViewModels/ItemSelectionViewModel.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.ViewModels\r\n{\r\n    public class SingleItemSelectionViewModel<TItem> : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private SelectableNamedObject<TItem> selectedItem;\r\n\r\n        public List<SelectableNamedObject<TItem>> Items { get; set; }\r\n        public int StartIndex { get; private set; }\r\n        public string HeaderText { get; set; }\r\n        public string MessageText { get; set; }\r\n\r\n        public RelayCommand<SelectableNamedObject<TItem>> SelectItemCommand { get; }\r\n        public RelayCommand CancelCommand => new RelayCommand(() => window.Close(null));\r\n\r\n        public SingleItemSelectionViewModel(IWindowFactory window, string header, string message)\r\n        {\r\n            this.window = window;\r\n            HeaderText = header?.GetLocalized();\r\n            MessageText = message?.GetLocalized();\r\n            SelectItemCommand = new RelayCommand<SelectableNamedObject<TItem>>((item) =>\r\n            {\r\n                selectedItem = item;\r\n                window.Close(true);\r\n            });\r\n        }\r\n\r\n        public bool SelectItem(List<SelectableNamedObject<TItem>> items, out TItem selected)\r\n        {\r\n            if (!items.HasItems())\r\n            {\r\n                selected = default;\r\n                return false;\r\n            }\r\n\r\n            Items = items;\r\n            // Selected property is actually not used for selection it's setting focus.\r\n            // So some item has to be selected (and have focus) otherwise the view would not be controllable.\r\n            if (Items.All(a => a.Selected == false))\r\n            {\r\n                Items[0].Selected = true;\r\n            }\r\n\r\n            // This is for the virtualized view to know where to scroll on view load.\r\n            StartIndex = Items.IndexOf(Items.First(a => a.Selected));\r\n\r\n            if (window.CreateAndOpenDialog(this) == true)\r\n            {\r\n                selected = selectedItem.Value;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                selected = default;\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    public class MultiItemSelectionViewModel<TItem> : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n\r\n        public List<SelectableNamedObject<TItem>> Items { get; set; }\r\n        public string HeaderText { get; set; }\r\n        public string MessageText { get; set; }\r\n\r\n        public RelayCommand CancelCommand => new RelayCommand(() => window.Close(null));\r\n        public RelayCommand ConfirmCommand => new RelayCommand(() => window.Close(true));\r\n        public RelayCommand ToggleSelectionCommand => new RelayCommand(() => ToggleSelection());\r\n\r\n        public MultiItemSelectionViewModel(IWindowFactory window, string header, string message)\r\n        {\r\n            this.window = window;\r\n            HeaderText = header?.GetLocalized();\r\n            MessageText = message?.GetLocalized();\r\n        }\r\n\r\n        public bool SelectItem(List<SelectableNamedObject<TItem>> items, out List<TItem> selected)\r\n        {\r\n            Items = items;\r\n            if (window.CreateAndOpenDialog(this) == true)\r\n            {\r\n                selected = Items.Where(a => a.Selected).Select(a => a.Value).ToList();\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                selected = null;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        private void ToggleSelection()\r\n        {\r\n            if (!Items.HasItems())\r\n            {\r\n                return;\r\n            }\r\n\r\n            var toggle = !Items[0].Selected;\r\n            Items.ForEach(a => a.Selected = toggle);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ViewModels/LicenseAgreementViewModel.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.ViewModels\r\n{\r\n    public class LicenseAgreementViewModel : ObservableObject\r\n    {\r\n        private IWindowFactory window;\r\n\r\n        public string License { get; set; }\r\n        public string LicenseTitle { get; set; }\r\n\r\n        public RelayCommand<object> AcceptCommnad\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                window.Close(true);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> DeclineCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                window.Close(false);\r\n            });\r\n        }\r\n\r\n        public LicenseAgreementViewModel(IWindowFactory window, string license, string addonName)\r\n        {\r\n            this.window = window;\r\n            License = license;\r\n            LicenseTitle = string.Format(ResourceProvider.GetString(LOC.AddonLicenseWindowTitle), addonName);\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ViewModels/MainViewModelBase.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.Emulators;\r\nusing Playnite.Metadata;\r\nusing Playnite.Plugins;\r\nusing Playnite.Scripting.PowerShell;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Exceptions;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.ViewModels\r\n{\r\n    public interface IMainViewModelBase\r\n    {\r\n        string ProgressStatus { get; set; }\r\n        double ProgressValue { get; set; }\r\n        double ProgressTotal { get; set; }\r\n        bool ProgressActive { get; set; }\r\n        BaseCollectionView GamesView { get; set; }\r\n        GamesCollectionViewEntry SelectedGame { get; }\r\n        List<GamesCollectionViewEntry> SelectedGames { get; set; }\r\n    }\r\n\r\n    public abstract class MainViewModelBase : ObservableObject\r\n    {\r\n        public static ILogger Logger = LogManager.GetLogger();\r\n\r\n        private DatabaseFilter databaseFilters;\r\n        public DatabaseFilter DatabaseFilters\r\n        {\r\n            get => databaseFilters;\r\n            set\r\n            {\r\n                databaseFilters = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool gameAdditionAllowed = true;\r\n        public bool GameAdditionAllowed\r\n        {\r\n            get => gameAdditionAllowed;\r\n            set\r\n            {\r\n                gameAdditionAllowed = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string progressStatus;\r\n        public string ProgressStatus\r\n        {\r\n            get => progressStatus;\r\n            set\r\n            {\r\n                progressStatus = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double progressValue;\r\n        public double ProgressValue\r\n        {\r\n            get => progressValue;\r\n            set\r\n            {\r\n                progressValue = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double progressTotal;\r\n        public double ProgressTotal\r\n        {\r\n            get => progressTotal;\r\n            set\r\n            {\r\n                progressTotal = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool progressActive;\r\n        public bool ProgressActive\r\n        {\r\n            get => progressActive;\r\n            set\r\n            {\r\n                progressActive = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool updatesAvailable = false;\r\n        public bool UpdatesAvailable\r\n        {\r\n            get => updatesAvailable;\r\n            set\r\n            {\r\n                updatesAvailable = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private BaseCollectionView gamesView;\r\n        public BaseCollectionView GamesView\r\n        {\r\n            get => gamesView;\r\n            set\r\n            {\r\n                gamesView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public List<FilterPreset> SortedFilterPresets\r\n        {\r\n            get\r\n            {\r\n                return Database.GetSortedFilterPresets();\r\n            }\r\n        }\r\n\r\n        public List<FilterPreset> SortedFilterFullscreenPresets\r\n        {\r\n            get\r\n            {\r\n                return Database.GetSortedFilterPresets()\r\n                    .Where(a => a.ShowInFullscreeQuickSelection)\r\n                    .ToList();\r\n            }\r\n        }\r\n\r\n        private List<ThirdPartyTool> thirdPartyTools = new List<ThirdPartyTool>();\r\n        public List<ThirdPartyTool> ThirdPartyTools\r\n        {\r\n            get => thirdPartyTools;\r\n            set\r\n            {\r\n                thirdPartyTools = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public bool IsDisposing { get; set; } = false;\r\n        public RelayCommand<object> AddFilterPresetCommand { get; private set; }\r\n        public RelayCommand<FilterPreset> RenameFilterPresetCommand { get; private set; }\r\n        public RelayCommand<FilterPreset> RemoveFilterPresetCommand { get; private set; }\r\n        public RelayCommand<FilterPreset> ApplyFilterPresetCommand { get; private set; }\r\n        public RelayCommand CancelProgressCommand { get; private set; }\r\n        public RelayCommand<object> OpenUpdatesCommand { get; private set; }\r\n        public RelayCommand StartInteractivePowerShellCommand { get; private set; }\r\n        public RelayCommand RestartApp { get; private set; }\r\n        public RelayCommand RestartInSafeMode { get; private set; }\r\n        public RelayCommand BackupDataCommand { get; private set; }\r\n        public RelayCommand RestoreDataBackupCommand { get; private set; }\r\n        public RelayCommand<ThirdPartyTool> ThirdPartyToolOpenCommand { get; private set; }\r\n\r\n        public IGameDatabaseMain Database { get; }\r\n        public PlayniteApplication App { get; }\r\n        public IDialogsFactory Dialogs { get; }\r\n        public IResourceProvider Resources { get; }\r\n        public ExtensionFactory Extensions { get; set; }\r\n        public bool IgnoreFilterChanges { get; set; } = false;\r\n        public IWindowFactory Window { get; }\r\n\r\n        public MainViewModelBase(\r\n            IGameDatabaseMain database,\r\n            PlayniteApplication app,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ExtensionFactory extensions,\r\n            IWindowFactory window)\r\n        {\r\n            Database = database;\r\n            App = app;\r\n            Dialogs = dialogs;\r\n            Resources = resources;\r\n            Extensions = extensions;\r\n            Window = window;\r\n\r\n            ApplyFilterPresetCommand = new RelayCommand<FilterPreset>((a) =>\r\n            {\r\n                ApplyFilterPreset(a);\r\n            });\r\n\r\n            RemoveFilterPresetCommand = new RelayCommand<FilterPreset>((a) =>\r\n            {\r\n                RemoveFilterPreset(a);\r\n            }, (a) => a != null);\r\n\r\n            RenameFilterPresetCommand = new RelayCommand<FilterPreset>((a) =>\r\n            {\r\n                RenameFilterPreset(a);\r\n            }, (a) => a != null);\r\n\r\n            AddFilterPresetCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                AddFilterPreset();\r\n            });\r\n\r\n            OpenUpdatesCommand = new RelayCommand<object>((_) =>\r\n            {\r\n                OpenUpdates();\r\n            });\r\n\r\n            CancelProgressCommand = new RelayCommand(() =>\r\n            {\r\n                CancelProgress();\r\n            }, () => GlobalTaskHandler.CancelToken?.IsCancellationRequested == false);\r\n\r\n            StartInteractivePowerShellCommand = new RelayCommand(() =>\r\n            {\r\n                try\r\n                {\r\n                    Scripting.PowerShell.PowerShellRuntime.StartInteractiveSession(new Dictionary<string, object>\r\n                    {\r\n                        { \"PlayniteApi\", App.PlayniteApiGlobal }\r\n                    });\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    Dialogs.ShowErrorMessage(\"Failed to start interactive PowerShell.\\n\" + e.Message);\r\n                }\r\n            });\r\n\r\n            ThirdPartyToolOpenCommand = new RelayCommand<ThirdPartyTool>((tool) =>\r\n            {\r\n                StartThirdPartyTool(tool);\r\n            });\r\n\r\n            RestartApp = new RelayCommand(() => RestartAppSkipLibUpdate());\r\n            RestartInSafeMode = new RelayCommand(() => RestartAppSafe());\r\n            BackupDataCommand = new RelayCommand(() => BackupData());\r\n            RestoreDataBackupCommand = new RelayCommand(() => RestoreDataBackup());\r\n            var filterPresetsCollection = (database.FilterPresets as FilterPresetsCollection);\r\n            if (filterPresetsCollection != null)\r\n            {\r\n                filterPresetsCollection.OnSettingsUpdated += FilterPresetsCollection_OnSettingsUpdated;\r\n                database.FilterPresets.ItemCollectionChanged += FilterPresets_ItemCollectionChanged;\r\n            }\r\n        }\r\n\r\n        private void FilterPresetsCollection_OnSettingsUpdated(object sender, FilterPresetsSettingsUpdateEvent e)\r\n        {\r\n            App.SyncContext.Send((_) =>\r\n            {\r\n                OnPropertyChanged(nameof(SortedFilterPresets));\r\n                OnPropertyChanged(nameof(SortedFilterFullscreenPresets));\r\n            }, null);\r\n        }\r\n\r\n        private void FilterPresets_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<FilterPreset> e)\r\n        {\r\n            App.SyncContext.Send((_) =>\r\n            {\r\n                OnPropertyChanged(nameof(SortedFilterPresets));\r\n                OnPropertyChanged(nameof(SortedFilterFullscreenPresets));\r\n            }, null);\r\n        }\r\n\r\n        private PlayniteSettings appSettings;\r\n        public PlayniteSettings AppSettings\r\n        {\r\n            get => appSettings;\r\n            set\r\n            {\r\n                appSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FilterPreset activeFilterPreset;\r\n        public FilterPreset ActiveFilterPreset\r\n        {\r\n            get => activeFilterPreset;\r\n            set\r\n            {\r\n                if (activeFilterPreset == value)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                activeFilterPreset = value;\r\n                if (App.Mode == ApplicationMode.Desktop)\r\n                {\r\n                    AppSettings.SelectedFilterPreset = value?.Id ?? Guid.Empty;\r\n                }\r\n                else\r\n                {\r\n                    AppSettings.Fullscreen.SelectedFilterPreset = value?.Id ?? Guid.Empty;\r\n                }\r\n\r\n                ApplyFilterPreset(value);\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public void ApplyFilterPreset(Guid presetId)\r\n        {\r\n            var preset = Database.FilterPresets[presetId];\r\n            if (preset == null)\r\n            {\r\n                Logger.Error($\"Cannot apply filter, filter preset {presetId} not found.\");\r\n            }\r\n            else\r\n            {\r\n                ActiveFilterPreset = preset;\r\n            }\r\n        }\r\n\r\n        private void ApplyFilterPreset(FilterPreset preset)\r\n        {\r\n            if (preset == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (ActiveFilterPreset != preset)\r\n            {\r\n                ActiveFilterPreset = preset;\r\n                return;\r\n            }\r\n\r\n            if (GamesView != null)\r\n            {\r\n                GamesView.IgnoreViewConfigChanges = true;\r\n            }\r\n\r\n            IgnoreFilterChanges = true;\r\n            var filter = App.Mode == ApplicationMode.Desktop ? AppSettings.FilterSettings : AppSettings.Fullscreen.FilterSettings;\r\n            var view = App.Mode == ApplicationMode.Desktop ? AppSettings.ViewSettings : (ViewSettingsBase)AppSettings.Fullscreen.ViewSettings;\r\n            filter.ApplyFilter(preset.Settings);\r\n            if (preset.SortingOrder != null)\r\n            {\r\n                view.SortingOrder = preset.SortingOrder.Value;\r\n            }\r\n\r\n            if (preset.SortingOrderDirection != null)\r\n            {\r\n                view.SortingOrderDirection = preset.SortingOrderDirection.Value;\r\n            }\r\n\r\n            if (App.Mode == ApplicationMode.Desktop && preset.GroupingOrder != null)\r\n            {\r\n                AppSettings.ViewSettings.GroupingOrder = preset.GroupingOrder.Value;\r\n            }\r\n\r\n            if (GamesView != null)\r\n            {\r\n                IgnoreFilterChanges = false;\r\n                GamesView.IgnoreViewConfigChanges = false;\r\n                GamesView.RefreshView();\r\n                if (GamesView.CollectionView.Count > 0)\r\n                {\r\n                    SelectGame((GamesView.CollectionView.GetItemAt(0) as GamesCollectionViewEntry).Id);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void RenameFilterPreset(FilterPreset preset)\r\n        {\r\n            if (preset == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var options = new List<MessageBoxToggle>\r\n            {\r\n                new MessageBoxToggle(LOC.FilterPresetShowOnFSTopPanel, preset.ShowInFullscreeQuickSelection)\r\n            };\r\n\r\n            var res = Dialogs.SelectString(LOC.EnterName, string.Empty, preset.Name, options);\r\n            if (res.Result && !res.SelectedString.IsNullOrEmpty())\r\n            {\r\n                preset.Name = res.SelectedString;\r\n                preset.ShowInFullscreeQuickSelection = options[0].Selected;\r\n                Database.FilterPresets.Update(preset);\r\n            }\r\n\r\n            OnPropertyChanged(nameof(SortedFilterPresets));\r\n            OnPropertyChanged(nameof(SortedFilterFullscreenPresets));\r\n        }\r\n\r\n        private void RemoveFilterPreset(FilterPreset preset)\r\n        {\r\n            if (preset == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (Dialogs.ShowMessage(LOC.AskRemoveItemMessage, LOC.AskRemoveItemTitle, MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)\r\n            {\r\n                Database.FilterPresets.Remove(preset);\r\n                if (ActiveFilterPreset == preset)\r\n                {\r\n                    ActiveFilterPreset = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void AddFilterPreset()\r\n        {\r\n            var options = new List<MessageBoxToggle>\r\n            {\r\n                new MessageBoxToggle(LOC.FilterPresetSaveViewOptions, true),\r\n                new MessageBoxToggle(LOC.FilterPresetShowOnFSTopPanel, false)\r\n            };\r\n\r\n            var overwriteExisting = false;\r\n            var res = Dialogs.SelectString(LOC.EnterName, string.Empty, string.Empty, options);\r\n            if (res.Result && !res.SelectedString.IsNullOrEmpty())\r\n            {\r\n                var existingPreset = Database.FilterPresets.FirstOrDefault(a => string.Equals(a.Name, res.SelectedString, StringComparison.InvariantCultureIgnoreCase));\r\n                if (existingPreset != null)\r\n                {\r\n                    var dialogRes = Dialogs.ShowMessage(LOC.FilterPresetNameConflict, \"\", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);\r\n                    if (dialogRes == MessageBoxResult.Cancel)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    if (dialogRes == MessageBoxResult.Yes)\r\n                    {\r\n                        overwriteExisting = true;\r\n                    }\r\n                }\r\n\r\n                var filter = App.Mode == ApplicationMode.Desktop ? AppSettings.FilterSettings : AppSettings.Fullscreen.FilterSettings;\r\n                var preset = new FilterPreset\r\n                {\r\n                    Name = res.SelectedString,\r\n                    Settings = filter.AsPresetSettings(),\r\n                    ShowInFullscreeQuickSelection = options[1].Selected\r\n                };\r\n\r\n                if (options[0].Selected)\r\n                {\r\n                    var view = App.Mode == ApplicationMode.Desktop ? AppSettings.ViewSettings : (ViewSettingsBase)AppSettings.Fullscreen.ViewSettings;\r\n                    preset.SortingOrder = view.SortingOrder;\r\n                    preset.SortingOrderDirection = view.SortingOrderDirection;\r\n                    if (App.Mode == ApplicationMode.Desktop)\r\n                    {\r\n                        preset.GroupingOrder = AppSettings.ViewSettings.GroupingOrder;\r\n                    }\r\n                }\r\n\r\n                if (existingPreset != null && overwriteExisting)\r\n                {\r\n                    preset.Id = existingPreset.Id;\r\n                    Database.FilterPresets.Update(preset);\r\n                    ActiveFilterPreset = existingPreset;\r\n                }\r\n                else\r\n                {\r\n                    Database.FilterPresets.Add(preset);\r\n                    ActiveFilterPreset = preset;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void OpenUpdates()\r\n        {\r\n            new UpdateViewModel(\r\n                new Updater(App),\r\n                new UpdateWindowFactory(),\r\n                new ResourceProvider(),\r\n                Dialogs,\r\n                App.Mode).OpenView();\r\n        }\r\n\r\n        public abstract NotificationMessage GetAddonUpdatesFoundMessage(List<AddonUpdate> updates);\r\n\r\n        private List<Game> ImportLibraryGames(LibraryPlugin plugin, CancellationToken token)\r\n        {\r\n            var addedGames = new List<Game>();\r\n            if (token.IsCancellationRequested)\r\n            {\r\n                return addedGames;\r\n            }\r\n\r\n            Logger.Info($\"Importing games from {plugin.Name} plugin.\");\r\n            ProgressStatus = Resources.GetString(LOC.ProgressImportinGames).Format(plugin.Name);\r\n\r\n            try\r\n            {\r\n                addedGames.AddRange(Database.ImportGames(plugin, token, AppSettings.PlaytimeImportMode));\r\n                App.Notifications.Remove($\"{plugin.Id} - download\");\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(e, $\"Failed to import games from plugin: {plugin.Name}\");\r\n                App.Notifications.Add(new NotificationMessage(\r\n                    $\"{plugin.Id} - download\",\r\n                    Resources.GetString(LOC.LibraryImportError).Format(plugin.Name) + $\"\\n{e.Message}\",\r\n                    NotificationType.Error));\r\n            }\r\n\r\n            return addedGames;\r\n        }\r\n\r\n        public async Task ProcessStartupLibUpdate()\r\n        {\r\n            if (App.CmdLine.SkipLibUpdate)\r\n            {\r\n                Logger.Warn(\"Startup library update disabled via cmdline.\");\r\n                return;\r\n            }\r\n\r\n            if (!await Common.Network.GetIsConnectedToInternet())\r\n            {\r\n                Logger.Warn(\"Startup library update disabled because of no internet connection.\");\r\n                return;\r\n            }\r\n\r\n            var updateLibs = AppSettings.ShouldCheckLibraryOnStartup();\r\n            var updateEmu = AppSettings.ShouldCheckEmuLibraryOnStartup();\r\n            if (!updateLibs && !updateEmu)\r\n            {\r\n                return;\r\n            }\r\n\r\n            await UpdateLibrary(AppSettings.DownloadMetadataOnImport, updateLibs, updateEmu);\r\n        }\r\n\r\n        public async Task UpdateLibrary(bool metaForNewGames, bool updateIntegrations, bool updateEmu)\r\n        {\r\n            if (!GameAdditionAllowed)\r\n            {\r\n                return;\r\n            }\r\n\r\n            await UpdateLibraryData((token) =>\r\n            {\r\n                var addedGames = new List<Game>();\r\n                if (updateIntegrations)\r\n                {\r\n                    foreach (var plugin in Extensions.LibraryPlugins)\r\n                    {\r\n                        if (token.IsCancellationRequested)\r\n                        {\r\n                            return addedGames;\r\n                        }\r\n\r\n                        addedGames.AddRange(ImportLibraryGames(plugin, token));\r\n                    }\r\n\r\n                    AppSettings.LastLibraryUpdateCheck = DateTimes.Now;\r\n                }\r\n\r\n                if (updateEmu)\r\n                {\r\n                    foreach (var scanConfig in Database.GameScanners.Where(a => a.InGlobalUpdate).ToList())\r\n                    {\r\n                        if (token.IsCancellationRequested)\r\n                        {\r\n                            return addedGames;\r\n                        }\r\n\r\n                        addedGames.AddRange(ImportEmulatedGames(scanConfig, token));\r\n                    }\r\n\r\n                    AppSettings.LastEmuLibraryUpdateCheck = DateTimes.Now;\r\n                }\r\n\r\n                if (AppSettings.ScanLibInstallSizeOnLibUpdate)\r\n                {\r\n                    UpdateGamesInstallSizes(token, Database.Games, LOC.ProgressScanningGamesInstallSize);\r\n                }\r\n\r\n                return addedGames;\r\n            }, metaForNewGames);\r\n        }\r\n\r\n        public async Task UpdateLibrary(LibraryPlugin plugin)\r\n        {\r\n            if (!GameAdditionAllowed)\r\n            {\r\n                return;\r\n            }\r\n\r\n            await UpdateLibraryData((token) =>\r\n            {\r\n                var addedGames = ImportLibraryGames(plugin, token);\r\n                if (AppSettings.ScanLibInstallSizeOnLibUpdate)\r\n                {\r\n                    UpdateGamesInstallSizes(token, Database.Games, LOC.ProgressScanningGamesInstallSize);\r\n                }\r\n\r\n                return addedGames;\r\n            }, AppSettings.DownloadMetadataOnImport);\r\n        }\r\n\r\n        public void UpdateGamesInstallSizes(CancellationToken token, IEnumerable<Game> games, string progressMessageLocKey)\r\n        {\r\n            if (token.IsCancellationRequested)\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                ProgressActive = true;\r\n                ProgressValue = 0;\r\n                ProgressTotal = games.Count() + 1;\r\n\r\n                Logger.Info($\"Starting Library Install Size scan\");\r\n                ProgressStatus = Resources.GetString(progressMessageLocKey);\r\n                var errorStrings = new List<string>();\r\n                var errorsCount = 0;\r\n                using (Database.Games.BufferedUpdate())\r\n                {\r\n                    foreach (var game in games)\r\n                    {\r\n                        if (token.IsCancellationRequested)\r\n                        {\r\n                            Logger.Info($\"Library Install Size scan was cancelled\");\r\n                            break;\r\n                        }\r\n\r\n                        if (Database.Games[game.Id] == null)\r\n                        {\r\n                            continue; // This can happen if a user deleted game after import before we got here\r\n                        }\r\n\r\n                        try\r\n                        {\r\n                            App.GamesEditor.UpdateGameSize(game, false, true, true);\r\n                        }\r\n                        catch (Exception e)\r\n                        {\r\n                            errorsCount++;\r\n                            if (errorStrings.Count < 10)\r\n                            {\r\n                                errorStrings.Add($\"{game.Name}: {e.Message}\");\r\n                            }\r\n                        }\r\n\r\n                        ProgressValue++;\r\n                    }\r\n                }\r\n\r\n                Logger.Info($\"Finished Library Install Size scan\");\r\n                if (errorsCount > 0)\r\n                {\r\n                    var errorMessage = ResourceProvider.GetString(\"LOCCalculateGamesSizeErrorMessage\").Format(errorsCount)\r\n                        + $\"\\n\\n\" + string.Join(\"\\n\", errorStrings);\r\n                    if (errorsCount > 10)\r\n                    {\r\n                        errorMessage += \"\\n...\";\r\n                    }\r\n\r\n                    App.Notifications.Add(new NotificationMessage(\r\n                            $\"LibUpdateScanSizeError - {DateTime.Now}\",\r\n                            ResourceProvider.GetString(\"LOCCalculateGamesSizeErrorMessage\").Format(errorsCount),\r\n                            NotificationType.Error,\r\n                            () =>\r\n                            {\r\n                                Dialogs.ShowMessage(\r\n                                    errorMessage,\r\n                                    Resources.GetString(\"LOCCalculateGameSizeErrorCaption\"),\r\n                                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n                            }\r\n                        )\r\n                    );\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                ProgressActive = false;\r\n            }\r\n        }\r\n\r\n        private List<Game> ImportEmulatedGames(GameScannerConfig scanConfig, CancellationToken token)\r\n        {\r\n            var addedGames = new List<Game>();\r\n            if (token.IsCancellationRequested)\r\n            {\r\n                return addedGames;\r\n            }\r\n\r\n            Logger.Info($\"Importing emulated games from {scanConfig.Name} config.\");\r\n            ProgressStatus = Resources.GetString(LOC.ProgressImportinEmulatedGames).Format(scanConfig.Directory);\r\n\r\n            try\r\n            {\r\n                var scanned = new GameScanner(scanConfig, Database).Scan(\r\n                    token,\r\n                    out var newPlatforms,\r\n                    out var newRegions).Select(a => a.ToGame()).ToList();\r\n                if (scanned.HasItems())\r\n                {\r\n                    var statusSettings = Database.GetCompletionStatusSettings();\r\n                    if (newPlatforms.HasItems())\r\n                    {\r\n                        Database.Platforms.Add(newPlatforms);\r\n                    }\r\n\r\n                    if (newRegions.HasItems())\r\n                    {\r\n                        Database.Regions.Add(newRegions);\r\n                    }\r\n\r\n                    if (statusSettings.DefaultStatus != Guid.Empty)\r\n                    {\r\n                        scanned.ForEach(g => g.CompletionStatusId = statusSettings.DefaultStatus);\r\n                    }\r\n\r\n                    addedGames.AddRange(scanned);\r\n                    Database.Games.Add(scanned);\r\n                }\r\n\r\n                App.Notifications.Remove($\"{scanConfig.Id} - import\");\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(e, $\"Failed to import emulated games from config:\\n{scanConfig.Directory}\\n{scanConfig.EmulatorId}\\n{scanConfig.EmulatorProfileId}\");\r\n                App.Notifications.Add(new NotificationMessage(\r\n                    $\"{scanConfig.Id} - import\",\r\n                    Resources.GetString(LOC.LibraryImportEmulatedError).Format(scanConfig.Name) + $\"\\n{e.Message}\",\r\n                    NotificationType.Error));\r\n            }\r\n\r\n            return addedGames;\r\n        }\r\n\r\n        public async Task UpdateEmulationLibrary(GameScannerConfig config)\r\n        {\r\n            await UpdateLibraryData((token) =>\r\n            {\r\n                var addedGames = ImportEmulatedGames(config, token);\r\n                if (AppSettings.ScanLibInstallSizeOnLibUpdate)\r\n                {\r\n                    UpdateGamesInstallSizes(token, addedGames, LOC.ProgressScanningImportedGamesInstallSize);\r\n                }\r\n\r\n                return addedGames;\r\n            }, AppSettings.DownloadMetadataOnImport);\r\n        }\r\n\r\n        public async Task UpdateEmulationLibrary()\r\n        {\r\n            await UpdateLibraryData((token) =>\r\n            {\r\n                var addedGames = new List<Game>();\r\n                foreach (var scanConfig in Database.GameScanners.Where(a => a.InGlobalUpdate))\r\n                {\r\n                    addedGames.AddRange(ImportEmulatedGames(scanConfig, token));\r\n                }\r\n\r\n                if (AppSettings.ScanLibInstallSizeOnLibUpdate)\r\n                {\r\n                    UpdateGamesInstallSizes(token, addedGames, LOC.ProgressScanningImportedGamesInstallSize);\r\n                }\r\n\r\n                return addedGames;\r\n            }, AppSettings.DownloadMetadataOnImport);\r\n        }\r\n\r\n        private async Task UpdateLibraryData(Func<CancellationToken, List<Game>> updateAction, bool downloadMetadata)\r\n        {\r\n            if (GlobalTaskHandler.ProgressTask != null && GlobalTaskHandler.ProgressTask.Status == TaskStatus.Running)\r\n            {\r\n                GlobalTaskHandler.CancelToken.Cancel();\r\n                await GlobalTaskHandler.ProgressTask;\r\n            }\r\n\r\n            GameAdditionAllowed = false;\r\n\r\n            try\r\n            {\r\n                GlobalTaskHandler.CancelToken = new CancellationTokenSource();\r\n                GlobalTaskHandler.ProgressTask = Task.Run(() =>\r\n                {\r\n                    DatabaseFilters.IgnoreDatabaseUpdates = true;\r\n                    ProgressActive = true;\r\n                    ProgressValue = 0;\r\n                    ProgressTotal = 1;\r\n\r\n                    var addedGames = updateAction(GlobalTaskHandler.CancelToken.Token);\r\n                    if (GlobalTaskHandler.CancelToken.IsCancellationRequested)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    ProgressActive = true;\r\n                    ProgressStatus = Resources.GetString(LOC.ProgressLibImportFinish);\r\n                    Thread.Sleep(1000);\r\n                    if (addedGames.Any() && downloadMetadata)\r\n                    {\r\n                        Logger.Info($\"Downloading metadata for {addedGames.Count} new games.\");\r\n                        ProgressValue = 0;\r\n                        ProgressTotal = addedGames.Count;\r\n                        string progressBaseStr = ProgressStatus = Resources.GetString(LOC.ProgressMetadata);\r\n                        using (var downloader = new MetadataDownloader(Database, Extensions.MetadataPlugins, Extensions.LibraryPlugins))\r\n                        {\r\n                            downloader.DownloadMetadataAsync(addedGames, AppSettings.MetadataSettings, AppSettings,\r\n                                (g, i, t) =>\r\n                                {\r\n                                    ProgressValue = i + 1;\r\n                                    ProgressStatus = $\"{progressBaseStr} [{ProgressValue}/{ProgressTotal}]\";\r\n                                },\r\n                                GlobalTaskHandler.CancelToken.Token).Wait();\r\n                        }\r\n                    }\r\n\r\n                    if (addedGames.Any() && AppSettings.GameSortingNameAutofill)\r\n                    {\r\n                        Logger.Info($\"Setting Sorting Name for {addedGames.Count} new games.\");\r\n                        ProgressStatus = Resources.GetString(LOC.SortingNameAutofillProgress);\r\n                        var c = new SortableNameConverter(AppSettings.GameSortingNameRemovedArticles, batchOperation: addedGames.Count > 20);\r\n                        using (Database.BufferedUpdate())\r\n                        {\r\n                            foreach (var game in addedGames)\r\n                            {\r\n                                if (GlobalTaskHandler.CancelToken.IsCancellationRequested)\r\n                                {\r\n                                    break;\r\n                                }\r\n\r\n                                if (Database.Games[game.Id] == null)\r\n                                {\r\n                                    continue; // This can happen if a user deleted game after import before we got here\r\n                                }\r\n\r\n                                string sortingName = c.Convert(game.Name);\r\n                                if (sortingName != game.Name)\r\n                                {\r\n                                    game.SortingName = sortingName;\r\n                                    Database.Games.Update(game);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                });\r\n\r\n                await GlobalTaskHandler.ProgressTask;\r\n                Extensions.NotifiyOnLibraryUpdated();\r\n            }\r\n            finally\r\n            {\r\n                GameAdditionAllowed = true;\r\n                ProgressActive = false;\r\n                DatabaseFilters.IgnoreDatabaseUpdates = false;\r\n            }\r\n        }\r\n\r\n        public async void CancelProgress()\r\n        {\r\n            await GlobalTaskHandler.CancelAndWaitAsync();\r\n        }\r\n\r\n        public virtual void SelectGame(Guid id, bool restoreView = false)\r\n        {\r\n        }\r\n\r\n        private void RunAppScript(string script, string eventName)\r\n        {\r\n            if (script.IsNullOrWhiteSpace())\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                if (!PowerShellRuntime.IsInstalled)\r\n                {\r\n                    throw new Exception(ResourceProvider.GetString(LOC.ErrorPowerShellNotInstalled));\r\n                }\r\n\r\n                using (var runtime = new PowerShellRuntime($\"app {eventName} script\"))\r\n                {\r\n                    runtime.Execute(\r\n                        script,\r\n                        PlaynitePaths.ProgramPath,\r\n                        new Dictionary<string, object> { { \"PlayniteApi\", App.PlayniteApiGlobal } });\r\n                }\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(exc, $\"Failed to execute {eventName} script.\");\r\n                Logger.Debug(script);\r\n                var message = ResourceProvider.GetString(LOC.ErrorApplicationScript) + Environment.NewLine + exc.Message;\r\n                if (exc is ScriptRuntimeException scriptExc)\r\n                {\r\n                    message = message + Environment.NewLine + Environment.NewLine + scriptExc.ScriptStackTrace;\r\n                }\r\n\r\n                Dialogs.ShowMessage(\r\n                    message,\r\n                    \"\",\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n            }\r\n        }\r\n\r\n        public void RunStartupScript()\r\n        {\r\n            if (!App.CmdLine.SafeStartup)\r\n            {\r\n                RunAppScript(AppSettings.AppStartupScript, \"startup\");\r\n            }\r\n        }\r\n\r\n        public void RunShutdowScript()\r\n        {\r\n            RunAppScript(AppSettings.AppShutdownScript, \"shutdown\");\r\n        }\r\n\r\n        public void RestartAppSkipLibUpdate()\r\n        {\r\n            CloseView();\r\n            App.Restart(new CmdLineOptions { SkipLibUpdate = true });\r\n        }\r\n\r\n        public void RestartAppSafe()\r\n        {\r\n            CloseView();\r\n            App.Restart(new CmdLineOptions { SafeStartup = true });\r\n        }\r\n\r\n        public abstract void CloseView();\r\n        public virtual IEnumerable<SearchItem> GetSearchCommands()\r\n        {\r\n            yield break;\r\n        }\r\n\r\n        public abstract void OpenSettings(int settingsPageIndex);\r\n        public void StartGame(Game game, bool launchedFromUI)\r\n        {\r\n            if (game.IsLaunching || game.IsRunning)\r\n            {\r\n                if (Dialogs.ShowMessage(\r\n                    LOC.CancelMonitoringExecutionAsk,\r\n                    LOC.CancelMonitoringAskTitle,\r\n                    MessageBoxButton.YesNo) == MessageBoxResult.Yes)\r\n                {\r\n                    App.GamesEditor.CancelGameMonitoring(game);\r\n                    App.GamesEditor.PlayGame(game, launchedFromUI);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                App.GamesEditor.PlayGame(game, launchedFromUI);\r\n            }\r\n        }\r\n\r\n        public void InstallGame(Game game)\r\n        {\r\n            App.GamesEditor.InstallGame(game);\r\n        }\r\n\r\n        public abstract void EditGame(Game game);\r\n        public abstract void AssignCategories(Game game);\r\n\r\n        public void StartSoftwareTool(AppSoftware app)\r\n        {\r\n            try\r\n            {\r\n                if (app.AppType == AppSoftwareType.Standard)\r\n                {\r\n                    ProcessStarter.StartProcess(\r\n                        PlaynitePaths.ExpandVariables(app.Path, fixSeparators: true),\r\n                        PlaynitePaths.ExpandVariables(app.Arguments),\r\n                        PlaynitePaths.ExpandVariables(app.WorkingDir, fixSeparators: true));\r\n                }\r\n                else\r\n                {\r\n                    using (var runtime = new PowerShellRuntime($\"Software tool {app.Name} runtime\"))\r\n                    {\r\n                        var scriptVars = new Dictionary<string, object>\r\n                        {\r\n                            [\"PlayniteApi\"] = App.PlayniteApiGlobal\r\n                        };\r\n\r\n                        runtime.Execute(PlaynitePaths.ExpandVariables(app.Script), variables: scriptVars);\r\n                    }\r\n                }\r\n            }\r\n            catch (ScriptRuntimeException e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(e, \"Failed to start app script.\");\r\n                var message = e.Message + Environment.NewLine + Environment.NewLine + e.ScriptStackTrace;\r\n                Dialogs.ShowErrorMessage(\r\n                    message,\r\n                    \"LOCScriptError\");\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(e, \"Failed to start app tool.\");\r\n                Dialogs.ShowErrorMessage(\r\n                    Resources.GetString(\"LOCAppStartupError\") + \"\\n\\n\" +\r\n                    e.Message,\r\n                    \"LOCStartupError\");\r\n            }\r\n        }\r\n\r\n        private void RestoreDataBackup()\r\n        {\r\n            var backupFile = Dialogs.SelectFile(\"Playnite Backup|*.zip\");\r\n            if (backupFile.IsNullOrEmpty())\r\n            {\r\n                return;\r\n            }\r\n\r\n            List<BackupDataItem> restoreOptions = null;\r\n            try\r\n            {\r\n                restoreOptions = Backup.GetRestoreSelections(backupFile);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                Logger.Error(e, $\"Failed to read backup file {backupFile}\");\r\n                return;\r\n            }\r\n\r\n            var restoreItems = restoreOptions.Select(a => new SelectableNamedObject<BackupDataItem>(a, a.GetDescription(), true)).ToList();\r\n            if (ItemSelector.SelectMultiple(\r\n                LOC.MenuRestoreBackup,\r\n                LOC.BackupRestoreMessage,\r\n                restoreItems,\r\n                out var selectedRestoreItems))\r\n            {\r\n                var options = new BackupRestoreOptions\r\n                {\r\n                    BackupFile = backupFile,\r\n                    DataDir = PlaynitePaths.ConfigRootPath,\r\n                    LibraryDir = GameDatabase.GetFullDbPath(AppSettings.DatabasePath),\r\n                    RestoreItems = selectedRestoreItems,\r\n                    RestoreLibrarySettingsPath = AppSettings.DatabasePath\r\n                };\r\n\r\n                FileSystem.WriteStringToFile(PlaynitePaths.RestoreBackupActionFile, Serialization.ToJson(options));\r\n                App.Restart(new CmdLineOptions\r\n                {\r\n                    RestoreBackup = PlaynitePaths.RestoreBackupActionFile,\r\n                    SkipLibUpdate = true\r\n                });\r\n            }\r\n        }\r\n\r\n        private void BackupData()\r\n        {\r\n            var backupFile = Dialogs.SaveFile(\"Playnite Backup|*.zip\", true);\r\n            if (backupFile.IsNullOrEmpty())\r\n            {\r\n                return;\r\n            }\r\n\r\n            List<BackupDataItem> backupOptions = new List<BackupDataItem> { BackupDataItem.LibraryFiles, BackupDataItem.Extensions, BackupDataItem.ExtensionsData, BackupDataItem.Themes };\r\n            var restoreItems = backupOptions.Select(a => new SelectableNamedObject<BackupDataItem>(a, a.GetDescription(), true)).ToList();\r\n            if (ItemSelector.SelectMultiple(\r\n                LOC.MenuBackupData,\r\n                LOC.BackupDataBackupMessage,\r\n                restoreItems,\r\n                out var selectedBackupItems))\r\n            {\r\n                var options = new BackupOptions\r\n                {\r\n                    OutputFile = backupFile,\r\n                    DataDir = PlaynitePaths.ConfigRootPath,\r\n                    LibraryDir = GameDatabase.GetFullDbPath(AppSettings.DatabasePath),\r\n                    BackupItems = selectedBackupItems\r\n                };\r\n\r\n                FileSystem.WriteStringToFile(PlaynitePaths.BackupActionFile, Serialization.ToJson(options));\r\n                App.Restart(new CmdLineOptions\r\n                {\r\n                    Backup = PlaynitePaths.BackupActionFile,\r\n                    SkipLibUpdate = true\r\n                });\r\n            }\r\n        }\r\n\r\n        public void StartThirdPartyTool(ThirdPartyTool tool)\r\n        {\r\n            try\r\n            {\r\n                tool.Start();\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(e, \"Failed to start 3rd party tool.\");\r\n                Dialogs.ShowErrorMessage(Resources.GetString(\"LOCAppStartupError\") + \"\\n\\n\" + e.Message, Resources.GetString(\"LOCStartupError\"));\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ViewModels/ProgressViewViewModel.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Threading;\r\n\r\nnamespace Playnite.ViewModels\r\n{\r\n    public class ProgressViewViewModel : ObservableObject\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private GlobalProgressOptions args;\r\n        private CancellationTokenSource cancellationToken;\r\n        private bool canCancel = false;\r\n        private bool wasCancelled = false;\r\n        private bool wasProcessed = false;\r\n\r\n        private GlobalProgressActionArgs progressArgs;\r\n        public GlobalProgressActionArgs ProgressArgs\r\n        {\r\n            get => progressArgs;\r\n            set\r\n            {\r\n                progressArgs = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool cancelable;\r\n        public bool Cancelable\r\n        {\r\n            get => cancelable;\r\n            set\r\n            {\r\n                cancelable = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                if (!canCancel)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                canCancel = false;\r\n                wasCancelled = true;\r\n                cancellationToken.Cancel();\r\n            }, (a) => Cancelable && canCancel && !cancellationToken.IsCancellationRequested);\r\n        }\r\n\r\n        public Exception FailException { get; private set; }\r\n\r\n        public ProgressViewViewModel(IWindowFactory window, GlobalProgressOptions args)\r\n        {\r\n            this.window = window;\r\n            this.args = args;\r\n\r\n            cancellationToken = new CancellationTokenSource();\r\n            Cancelable = args.Cancelable;\r\n            canCancel = Cancelable;\r\n            ProgressArgs = new GlobalProgressActionArgs(\r\n                PlayniteApplication.Current.SyncContext,\r\n                PlayniteApplication.CurrentNative.Dispatcher,\r\n                cancellationToken.Token)\r\n            {\r\n                Text = args.Text,\r\n                IsIndeterminate = args.IsIndeterminate\r\n            };\r\n        }\r\n\r\n        public GlobalProgressResult ActivateProgress(Action<GlobalProgressActionArgs> progresAction)\r\n        {\r\n            if (wasProcessed)\r\n            {\r\n                throw new Exception(\"Progress can be shown only once per instance.\");\r\n            }\r\n\r\n            Task.Run(() =>\r\n            {\r\n                try\r\n                {\r\n                    progresAction(ProgressArgs);\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    FailException = exc;\r\n                    window.Close(false);\r\n                    return;\r\n                }\r\n                finally\r\n                {\r\n                    canCancel = false;\r\n                    cancellationToken.Dispose();\r\n                }\r\n\r\n                window.Close(true);\r\n            });\r\n\r\n            var res = window.CreateAndOpenDialog(this);\r\n            wasProcessed = true;\r\n            return new GlobalProgressResult(res, wasCancelled, FailException);\r\n        }\r\n\r\n        public GlobalProgressResult ActivateProgress(Func<GlobalProgressActionArgs, Task> progresAction)\r\n        {\r\n            if (wasProcessed)\r\n            {\r\n                throw new Exception(\"Progress can be shown only once per instance.\");\r\n            }\r\n\r\n            Task.Run(async () =>\r\n            {\r\n                try\r\n                {\r\n                    await progresAction(ProgressArgs);\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    FailException = exc;\r\n                    window.Close(false);\r\n                    return;\r\n                }\r\n                finally\r\n                {\r\n                    canCancel = false;\r\n                    cancellationToken.Dispose();\r\n                }\r\n\r\n                window.Close(true);\r\n            });\r\n\r\n            var res = window.CreateAndOpenDialog(this);\r\n            wasProcessed = true;\r\n            return new GlobalProgressResult(res, wasCancelled, FailException);\r\n        }\r\n\r\n        public GlobalProgressResult ActivateProgress(Action<GlobalProgressActionArgs> progresAction, int delay)\r\n        {\r\n            if (wasProcessed)\r\n            {\r\n                throw new Exception(\"Progress can be shown only once per instance.\");\r\n            }\r\n\r\n            bool? res = null;\r\n            var progressTask = Task.Run(() =>\r\n            {\r\n                try\r\n                {\r\n                    progresAction(ProgressArgs);\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    FailException = exc;\r\n                    if (window.Window?.IsShown == true)\r\n                    {\r\n                        window.Close(false);\r\n                    }\r\n\r\n                    res = false;\r\n                    return;\r\n                }\r\n                finally\r\n                {\r\n                    canCancel = false;\r\n                    cancellationToken.Dispose();\r\n                }\r\n\r\n                if (window.Window?.IsShown == true)\r\n                {\r\n                    window.Close(true);\r\n                }\r\n\r\n                res = true;\r\n            });\r\n\r\n            if (!progressTask.Wait(delay))\r\n            {\r\n                window.CreateAndOpenDialog(this);\r\n            }\r\n\r\n            if (window.Window?.IsShown == true)\r\n            {\r\n                window.Close(true);\r\n            }\r\n\r\n            wasProcessed = true;\r\n            return new GlobalProgressResult(res, wasCancelled, FailException);\r\n        }\r\n    }\r\n\r\n    public class GlobalProgress\r\n    {\r\n        public static GlobalProgressResult ActivateProgress(Action<GlobalProgressActionArgs> progresAction, GlobalProgressOptions progressArgs)\r\n        {\r\n            var progressModel = new ProgressViewViewModel(new ProgressWindowFactory(), progressArgs);\r\n            return progressModel.ActivateProgress(progresAction);\r\n        }\r\n\r\n        public static GlobalProgressResult ActivateProgress(Func<GlobalProgressActionArgs, Task> progresAction, GlobalProgressOptions progressArgs)\r\n        {\r\n            var progressModel = new ProgressViewViewModel(new ProgressWindowFactory(), progressArgs);\r\n            return progressModel.ActivateProgress(progresAction);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ViewModels/RandomGameSelectViewModel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.ViewModels\r\n{\r\n    public enum RandomGameSelectAction\r\n    {\r\n        None,\r\n        Play,\r\n        Navigate\r\n    }\r\n\r\n    public class RandomGameSelectViewModel : ObservableObject\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private readonly IResourceProvider resources;\r\n        private readonly BaseCollectionView collection;\r\n        private readonly IGameDatabaseMain database;\r\n\r\n        public RandomGameSelectAction SelectedAction { get; private set; } = RandomGameSelectAction.None;\r\n\r\n        private bool isLimitedToFilter = true;\r\n        public bool IsLimitedToFilter\r\n        {\r\n            get => isLimitedToFilter;\r\n            set\r\n            {\r\n                isLimitedToFilter = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Game selectedGame;\r\n        public Game SelectedGame\r\n        {\r\n            get => selectedGame;\r\n            set\r\n            {\r\n                selectedGame = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> PickAnotherCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                PickGame();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> PlayGameCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                PlayGame();\r\n            }, (a) => SelectedGame != null);\r\n        }\r\n\r\n        public RelayCommand<object> CloseCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView();\r\n            });\r\n        }\r\n\r\n        public RelayCommand NavigateToGameCommand\r\n        {\r\n            get => new RelayCommand(() =>\r\n            {\r\n                NavigateToGame();\r\n            }, () => SelectedGame != null);\r\n        }\r\n\r\n        public RandomGameSelectViewModel(\r\n            IGameDatabaseMain database,\r\n            BaseCollectionView collection,\r\n            IWindowFactory window,\r\n            IResourceProvider resources)\r\n        {\r\n            this.database = database;\r\n            this.window = window;\r\n            this.resources = resources;\r\n            this.collection = collection;\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            PickGame();\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void PlayGame()\r\n        {\r\n            SelectedAction = RandomGameSelectAction.Play;\r\n            window.Close(true);\r\n        }\r\n\r\n        public void CloseView()\r\n        {\r\n            SelectedAction = RandomGameSelectAction.None;\r\n            window.Close(false);\r\n        }\r\n\r\n        public void NavigateToGame()\r\n        {\r\n            SelectedAction = RandomGameSelectAction.Navigate;\r\n            window.Close(false);\r\n        }\r\n\r\n        public void PickGame()\r\n        {\r\n            var lastSelection = SelectedGame;\r\n            if (IsLimitedToFilter)\r\n            {\r\n                var count = collection.CollectionView.Count;\r\n                if (count == 1)\r\n                {\r\n                    SelectedGame = (collection.CollectionView.GetItemAt(0) as GamesCollectionViewEntry).Game;\r\n                }\r\n                else if (count > 1)\r\n                {\r\n                    var newSelection = lastSelection;\r\n                    while (newSelection == lastSelection)\r\n                    {\r\n                        var index = GlobalRandom.Next(0, count);\r\n                        newSelection = (collection.CollectionView.GetItemAt(index) as GamesCollectionViewEntry).Game;\r\n                    }\r\n\r\n                    SelectedGame = newSelection;\r\n                }\r\n                else\r\n                {\r\n                    SelectedGame = null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var count = database.Games.Count;\r\n                if (count == 1)\r\n                {\r\n                    SelectedGame = database.Games.First();\r\n                }\r\n                else if (count > 1)\r\n                {\r\n                    var newSelection = lastSelection;\r\n                    while (newSelection == lastSelection)\r\n                    {\r\n                        var index = GlobalRandom.Next(0, count);\r\n                        newSelection = database.Games.ElementAt(index);\r\n                    }\r\n\r\n                    SelectedGame = newSelection;\r\n                }\r\n                else\r\n                {\r\n                    SelectedGame = null;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ViewModels/SearchViewModel.cs",
    "content": "﻿using Playnite.Converters;\r\nusing Playnite.Database;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Diagnostics;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.ViewModels\r\n{\r\n    public class GameMenuContext : SearchContext\r\n    {\r\n        private readonly MainViewModelBase mainModel;\r\n        private readonly Game game;\r\n\r\n        public GameMenuContext(Game game, MainViewModelBase mainModel)\r\n        {\r\n            this.game = game;\r\n            this.mainModel = mainModel;\r\n            UseAutoSearch = true;\r\n            Label = game.Name;\r\n        }\r\n\r\n        public override IEnumerable<SearchItem> GetSearchResults(GetSearchResultsArgs args)\r\n        {\r\n            return MenuItems.GetSearchGameMenuItems(game, mainModel);\r\n        }\r\n    }\r\n\r\n    public class DefaultSearchContext : SearchContext\r\n    {\r\n        private readonly MainViewModelBase mainModel;\r\n        private readonly List<SearchSupport> searchProviders;\r\n        private readonly bool commandsInDefault;\r\n        private List<SearchItem> commands;\r\n\r\n        public DefaultSearchContext(MainViewModelBase mainModel, List<SearchSupport> searchProviders, bool commandsInDefault)\r\n        {\r\n            this.mainModel = mainModel;\r\n            this.searchProviders = searchProviders;\r\n            this.commandsInDefault = commandsInDefault;\r\n            Description = ResourceProvider.GetString(LOC.DefaultSearchDescription);\r\n            Hint = ResourceProvider.GetString(LOC.DefaultSearchHint);\r\n        }\r\n\r\n        private SearchItemAction GetGameAction(Game game, GameSearchItemAction actionSettings)\r\n        {\r\n            switch (actionSettings)\r\n            {\r\n                case GameSearchItemAction.Play:\r\n                    return new SearchItemAction(game.IsInstalled ? LOC.PlayGame : LOC.InstallGame, () => mainModel.App.GamesEditor.StartContextAction(game));\r\n                case GameSearchItemAction.SwitchTo:\r\n                    return new SearchItemAction(LOC.GameSearchItemActionSwitchTo, () =>\r\n                    {\r\n                        if (mainModel.AppSettings.ViewSettings.GamesViewType == DesktopView.List)\r\n                        {\r\n                            mainModel.AppSettings.ViewSettings.GamesViewType = DesktopView.Details;\r\n                        }\r\n                        else if (mainModel.AppSettings.ViewSettings.GamesViewType == DesktopView.Grid)\r\n                        {\r\n                            if (!mainModel.AppSettings.GridViewSideBarVisible)\r\n                            {\r\n                                mainModel.AppSettings.GridViewSideBarVisible = true;\r\n                            }\r\n                        }\r\n\r\n                        mainModel.SelectGame(game.Id, true);\r\n                    });\r\n                case GameSearchItemAction.OpenMenu:\r\n                    return new ContextSwitchSearchItemAction(LOC.GameSearchItemActionOpenMenu, new GameMenuContext(game, mainModel));\r\n                case GameSearchItemAction.Edit:\r\n                    return new SearchItemAction(LOC.GameSearchItemActionEdit, () => mainModel.EditGame(game));\r\n                case GameSearchItemAction.None:\r\n                default:\r\n                    return null;\r\n            }\r\n        }\r\n\r\n        private SearchItemAction GetPrimaryGameAction(Game game)\r\n        {\r\n            return GetGameAction(game, mainModel.AppSettings.PrimaryGameSearchItemAction);\r\n        }\r\n\r\n        private SearchItemAction GetSecondaryGameAction(Game game)\r\n        {\r\n            return GetGameAction(game, mainModel.AppSettings.SecondaryGameSearchItemAction);\r\n        }\r\n\r\n        private ContextSwitchSearchItemAction GetGameMenuAction(Game game)\r\n        {\r\n            return new ContextSwitchSearchItemAction(LOC.GameSearchItemActionOpenMenu, new GameMenuContext(game, mainModel));\r\n        }\r\n\r\n        private bool GameFilter(Game game, string searchTerm, GameSearchFilterSettings settings, bool matchTargetAcronymStart)\r\n        {\r\n            if (game.Hidden && !settings.Hidden)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!game.IsInstalled && !settings.Uninstalled)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!SearchViewModel.MatchTextFilter(searchTerm, game.Name, matchTargetAcronymStart))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        public override IEnumerable<SearchItem> GetSearchResults(GetSearchResultsArgs args)\r\n        {\r\n            IEnumerable<SearchItem> searchCommnands(string keyword)\r\n            {\r\n                if (commands == null)\r\n                {\r\n                    commands = mainModel.GetSearchCommands().ToList();\r\n                }\r\n\r\n                foreach (var command in commands.Where(a => SearchViewModel.MatchTextFilter(keyword, a.Name, true)))\r\n                {\r\n                    yield return command;\r\n                }\r\n            }\r\n\r\n            if (args.SearchTerm.StartsWith(\"#\"))\r\n            {\r\n                var commandSearch = args.SearchTerm.Substring(1).Trim();\r\n                foreach (var cmd in searchCommnands(commandSearch))\r\n                {\r\n                    yield return cmd;\r\n                }\r\n\r\n                yield break;\r\n            }\r\n\r\n            if (args.SearchTerm.EndsWith(\" \"))\r\n            {\r\n                var providerTest = args.SearchTerm.Trim().TrimStart('/');\r\n                var provider = searchProviders.FirstOrDefault(a => a.Keyword.Equals(providerTest, StringComparison.InvariantCultureIgnoreCase));\r\n                if (provider != null)\r\n                {\r\n                    args.SwitchContext(provider.Context);\r\n                    yield break;\r\n                }\r\n            }\r\n\r\n            if (args.SearchTerm.StartsWith(\"/\"))\r\n            {\r\n                var pluginSearch = args.SearchTerm.Substring(1).Trim();\r\n                foreach (var provider in searchProviders.Where(a => SearchViewModel.MatchTextFilter(pluginSearch, a.Name, false)))\r\n                {\r\n                    yield return new SearchItem(provider.Name, new ContextSwitchSearchItemAction(LOC.Activate, provider.Context))\r\n                    {\r\n                        Description = \"/\" + provider.Keyword\r\n                    };\r\n                }\r\n\r\n                yield break;\r\n            }\r\n\r\n            if (args.SearchTerm.IsNullOrWhiteSpace())\r\n            {\r\n                foreach (var game in mainModel.Database.Games.\r\n                    Where(a => a.LastActivity != null && GameFilter(a, string.Empty, args.GameFilterSettings, true)).\r\n                    OrderByDescending(a => a.LastActivity).\r\n                    Take(20))\r\n                {\r\n                    yield return new GameSearchItem(game, GetPrimaryGameAction(game))\r\n                    {\r\n                        SecondaryAction = GetSecondaryGameAction(game),\r\n                        MenuAction = GetGameMenuAction(game)\r\n                    };\r\n                }\r\n\r\n                yield break;\r\n            }\r\n\r\n            var searchTerm = args.SearchTerm.Trim();\r\n            if (commandsInDefault)\r\n            {\r\n                foreach (var cmd in searchCommnands(searchTerm))\r\n                {\r\n                    yield return cmd;\r\n                }\r\n            }\r\n\r\n            foreach (var game in mainModel.Database.Games.\r\n                Where(g => GameFilter(g, searchTerm, args.GameFilterSettings, true))\r\n                .OrderBy(a => a.Name.GetLevenshteinDistanceIgnoreCase(searchTerm))\r\n                .ThenBy(x => x.Name)\r\n                .ThenByDescending(x => x.IsInstalled)\r\n                .Take(60))\r\n            {\r\n                yield return new GameSearchItem(game, GetPrimaryGameAction(game))\r\n                {\r\n                    SecondaryAction = GetSecondaryGameAction(game),\r\n                    MenuAction = GetGameMenuAction(game)\r\n                };\r\n            }\r\n\r\n            foreach (var tool in mainModel.Database.SoftwareApps.Where(a => SearchViewModel.MatchTextFilter(searchTerm, a.Name, true)))\r\n            {\r\n                yield return new SearchItem(tool.Name, LOC.Open, () => mainModel.StartSoftwareTool(tool), tool.Icon);\r\n            }\r\n        }\r\n    }\r\n\r\n    // TODO replace this in future by exposing GamesCollectionViewEntry to SDK and let plugins create them directly.\r\n    // Also remove all plugin and setting dependencies from View class.\r\n    public class GameSearchItemWrapper : GameSearchItem\r\n    {\r\n        public GamesCollectionViewEntry GameView { get; set; }\r\n        public List<string> AdditionalInfo { get; set; } = new List<string>();\r\n\r\n        public GameSearchItemWrapper(GameSearchItem item, LibraryPlugin plugin, PlayniteSettings settings)\r\n            : base(item.Game, item.PrimaryAction)\r\n        {\r\n            GameView = new GamesCollectionViewEntry(item.Game, plugin, settings, true);\r\n            SecondaryAction = item.SecondaryAction;\r\n            MenuAction = item.MenuAction;\r\n\r\n            if (settings.SearchWindowVisibility.CompletionStatus && item.Game.CompletionStatus != null)\r\n            {\r\n                AdditionalInfo.Add(item.Game.CompletionStatus.Name);\r\n            }\r\n\r\n            if (settings.SearchWindowVisibility.PlayTime)\r\n            {\r\n                AdditionalInfo.Add(PlayTimeToStringConverter.Instance.Convert(item.Game.Playtime, typeof(string), settings.PlaytimeUseDaysFormat, CultureInfo.CurrentCulture) as string);\r\n            }\r\n\r\n            if (settings.SearchWindowVisibility.Platform && item.Game.Platforms.HasItems())\r\n            {\r\n                item.Game.Platforms.ForEach(a => AdditionalInfo.Add(a.Name));\r\n            }\r\n\r\n            if (settings.SearchWindowVisibility.ReleaseDate && item.Game.ReleaseDate != null)\r\n            {\r\n                AdditionalInfo.Add(item.Game.ReleaseDate.Value.Year.ToString());\r\n            }\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return GameView?.Name;\r\n        }\r\n    }\r\n\r\n    public class SearchItemWrapper : SearchItem\r\n    {\r\n        private readonly SynchronizationContext syncContext;\r\n\r\n        public SearchItem Item { get; }\r\n\r\n        private object itemIcon = null;\r\n        public object ItemIcon\r\n        {\r\n            get\r\n            {\r\n                if (itemIcon != null)\r\n                {\r\n                    return itemIcon;\r\n                }\r\n\r\n                if (Item.Icon == null)\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                if (Item.Icon is string stringIcon && stringIcon.IsHttpUrl())\r\n                {\r\n                    Task.Run(() =>\r\n                    {\r\n                        itemIcon = SdkHelpers.ResolveUiItemIcon(Item.Icon, syncContext);\r\n                        if (itemIcon == null)\r\n                        {\r\n                            itemIcon = DependencyProperty.UnsetValue;\r\n                        }\r\n                        else\r\n                        {\r\n                            syncContext.Send((_) => OnPropertyChanged(nameof(ItemIcon)), null);\r\n                        }\r\n                    });\r\n\r\n                    return null;\r\n                }\r\n                else\r\n                {\r\n                    return SdkHelpers.ResolveUiItemIcon(Item.Icon);\r\n                }\r\n            }\r\n        }\r\n\r\n        public SearchItemWrapper(SearchItem item, SynchronizationContext syncContext)\r\n            : base(item.Name, item.PrimaryAction)\r\n\r\n        {\r\n            this.syncContext = syncContext;\r\n            Item = item;\r\n            Description = item.Description;\r\n            MenuAction = item.MenuAction;\r\n            SecondaryAction = item.SecondaryAction;\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            return Item?.Name;\r\n        }\r\n    }\r\n\r\n    public class SearchViewModel : ObservableObject\r\n    {\r\n        public class ItemAction : ObservableObject\r\n        {\r\n            private bool selected;\r\n\r\n            public bool Selected { get => selected; set => SetValue(ref selected, value); }\r\n            public string Name { get; set; }\r\n            public Action Action { get; set; }\r\n            public bool CloseView { get; set; }\r\n\r\n            public ItemAction(string name, Action action, bool closeView)\r\n            {\r\n                Name = name;\r\n                Action = action;\r\n                CloseView = closeView;\r\n            }\r\n\r\n            public ItemAction(SearchItemAction action)\r\n            {\r\n                Name = action.Name;\r\n                Action = action.Action;\r\n                CloseView = action.CloseSearch;\r\n            }\r\n        }\r\n\r\n        #region backing fields\r\n        private List<SearchItem> searchResults;\r\n        private SearchItem selectedSearchItem;\r\n        private string currentSearchProviderDescription;\r\n        private bool slowAnimationActive;\r\n        private ItemAction primaryAction;\r\n        private ItemAction secondaryAction;\r\n        private ItemAction menuAction;\r\n        private string currentContextHint;\r\n        private bool contextHintVisible;\r\n        private bool filterHintVisible = false;\r\n        private string filterHint;\r\n        private string currentContextLabel;\r\n        #endregion backing fields\r\n\r\n        private static readonly char[] textMatchSplitter = new char[] { ' ' };\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private readonly IGameDatabaseMain database;\r\n        private readonly ExtensionFactory extensions;\r\n        private readonly MainViewModelBase mainModel;\r\n        private int currentSearchDelay = 0;\r\n        private readonly SynchronizationContext syncContext;\r\n        private readonly System.Timers.Timer searchDelayTimer = new System.Timers.Timer { AutoReset = false };\r\n        private readonly System.Timers.Timer longSearchTimer = new System.Timers.Timer { AutoReset = false, Interval = 700 };\r\n        private CancellationTokenSource currentSearchToken;\r\n        private int customProviderDeleteAttemps = 0;\r\n        private readonly Stack<SearchContext> searchContextStack = new Stack<SearchContext>();\r\n        private const double defaultMinimumJaronWinklerSimilarity = 0.90;\r\n        private bool isClosing = false;\r\n\r\n        private string searchTerm;\r\n        public string SearchTerm\r\n        {\r\n            get => searchTerm;\r\n            set\r\n            {\r\n                searchTerm = value;\r\n                OnPropertyChanged();\r\n\r\n                if (currentSearchDelay == 0)\r\n                {\r\n#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n                    PerformSearch();\r\n#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n                }\r\n                else\r\n                {\r\n                    searchDelayTimer.Stop();\r\n                    searchDelayTimer.Interval = currentSearchDelay;\r\n                    searchDelayTimer.Start();\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool FilterHintVisible { get => filterHintVisible; set => SetValue(ref filterHintVisible, value); }\r\n        public string FilterHint { get => filterHint; set => SetValue(ref filterHint, value); }\r\n        public GameSearchFilterSettings GameFilterSettings { get; set; }\r\n        public string CurrentContextHint { get => currentContextHint; set => SetValue(ref currentContextHint, value); }\r\n        public string CurrentContextLabel { get => currentContextLabel; set => SetValue(ref currentContextLabel, value); }\r\n        public bool ContextHintVisible { get => contextHintVisible; set => SetValue(ref contextHintVisible, value); }\r\n        public bool SlowAnimationActive { get => slowAnimationActive; set => SetValue(ref slowAnimationActive, value); }\r\n        public string CurrentSearchProviderDescription { get => currentSearchProviderDescription; set => SetValue(ref currentSearchProviderDescription, value); }\r\n        public List<SearchItem> SearchResults { get => searchResults; set =>SetValue(ref searchResults, value); }\r\n        public SearchItem SelectedSearchItem { get => selectedSearchItem;\r\n            set\r\n            {\r\n                SetValue(ref selectedSearchItem, value);\r\n                InitActions(selectedSearchItem);\r\n            }\r\n        }\r\n\r\n        public RelayCommand CloseCommand => new RelayCommand(() => Close());\r\n        public RelayCommand<KeyEventArgs> TextBoxKeyDownCommand => new RelayCommand<KeyEventArgs>((keyArgs) => TextBoxKeyDown(keyArgs));\r\n        public RelayCommand<KeyEventArgs> TextBoxKeyUpCommand => new RelayCommand<KeyEventArgs>((keyArgs) => TextBoxKeyUp(keyArgs));\r\n        public RelayCommand<EventArgs> WindowClosedCommand => new RelayCommand<EventArgs>((_) => WindowClosed(_));\r\n        public RelayCommand<EventArgs> WindowDeactivatedCommand => new RelayCommand<EventArgs>((_) => WindowDeactivated(_));\r\n        public RelayCommand<EventArgs> WindowClosingCommand => new RelayCommand<EventArgs>((_) => WindowClosing(_));\r\n        public RelayCommand ToggleHintCommand => new RelayCommand(() => ToggleHint());\r\n        public RelayCommand OpenSearchSettingsCommand => new RelayCommand(() => OpenSearchSettings());\r\n        public RelayCommand DeactiveCurrentContextCommand => new RelayCommand(() => DeactiveCurrentContext());\r\n\r\n        public RelayCommand PrimaryActionCommand { get; }\r\n        public RelayCommand SecondaryActionCommand { get; }\r\n        public RelayCommand OpenMenuCommand { get; }\r\n\r\n        public ItemAction PrimaryAction { get => primaryAction; set => SetValue(ref primaryAction, value); }\r\n        public ItemAction SecondaryAction { get => secondaryAction; set => SetValue(ref secondaryAction, value); }\r\n        public ItemAction MenuAction { get => menuAction; set => SetValue(ref menuAction, value); }\r\n\r\n        public event EventHandler SearchClosed;\r\n        public bool Active => window.Window.IsActive;\r\n\r\n        public SearchViewModel(\r\n            IWindowFactory window,\r\n            IGameDatabaseMain database,\r\n            ExtensionFactory extensions,\r\n            MainViewModelBase mainModel)\r\n        {\r\n            this.window = window;\r\n            this.database = database;\r\n            this.extensions = extensions;\r\n            this.mainModel = mainModel;\r\n\r\n            PrimaryActionCommand = new RelayCommand(() => syncContext.Send(_ =>\r\n            {\r\n                if (PrimaryAction.CloseView)\r\n                {\r\n                    Close();\r\n                }\r\n                PrimaryAction.Action();\r\n            }, null));\r\n            SecondaryActionCommand = new RelayCommand(() => syncContext.Send(_ =>\r\n            {\r\n                if (SecondaryAction.CloseView)\r\n                {\r\n                    Close();\r\n                }\r\n                SecondaryAction.Action();\r\n            }, null));\r\n            OpenMenuCommand = new RelayCommand(() => syncContext.Send(_ =>\r\n            {\r\n                if (MenuAction.CloseView)\r\n                {\r\n                    Close();\r\n                }\r\n                MenuAction.Action();\r\n            }, null));\r\n\r\n            var searchProviders = new List<SearchSupport>();\r\n            foreach (var plugin in extensions.Plugins)\r\n            {\r\n                foreach (var search in plugin.Value.Plugin.Searches ?? new List<SearchSupport>())\r\n                {\r\n                    var searchId = plugin.Value.Description.Id + search.DefaultKeyword;\r\n                    if (mainModel.AppSettings.CustomSearchKeywrods.TryGetValue(searchId, out var customKeywrod))\r\n                    {\r\n                        search.Keyword = customKeywrod;\r\n                    }\r\n                    else\r\n                    {\r\n                        search.Keyword = search.DefaultKeyword;\r\n                    }\r\n\r\n                    searchProviders.Add(search);\r\n                }\r\n            }\r\n\r\n            syncContext = SynchronizationContext.Current;\r\n            searchDelayTimer.Elapsed += (_, __) => syncContext.Post((___) =>\r\n            {\r\n#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n                PerformSearch();\r\n#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n            }, null);\r\n\r\n            longSearchTimer.Elapsed += (_, __) =>\r\n            {\r\n                syncContext.Send((___) => SlowAnimationActive = true, null);\r\n            };\r\n\r\n            if (mainModel.AppSettings.SaveGlobalSearchFilterSettings)\r\n            {\r\n                GameFilterSettings = mainModel.AppSettings.GameSearchFilterSettings.GetClone();\r\n            }\r\n            else\r\n            {\r\n                GameFilterSettings = new GameSearchFilterSettings();\r\n            }\r\n\r\n            GameFilterSettings.PropertyChanged += GameFilterSettings_PropertyChanged;\r\n            SetCurrentContext(new DefaultSearchContext(mainModel, searchProviders, mainModel.AppSettings.IncludeCommandsInDefaultSearch));\r\n        }\r\n\r\n        private void GameFilterSettings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\r\n        {\r\n            SearchTerm = SearchTerm;\r\n        }\r\n\r\n        public void OpenSearch()\r\n        {\r\n            window.Show(this);\r\n        }\r\n\r\n        public void OpenSearch(string search)\r\n        {\r\n            window.Show(this);\r\n            SearchTerm = search;\r\n        }\r\n        public void OpenSearch(SearchContext context, string search)\r\n        {\r\n            window.Show(this);\r\n            SetCurrentContext(context);\r\n            if (!search.IsNullOrEmpty())\r\n            {\r\n                SearchTerm = search;\r\n            }\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n            // This is used because deactivate event is called before close event\r\n            // so WindowDeactivated and WindowClosed would conflict.\r\n            isClosing = true;\r\n            window.Close();\r\n        }\r\n\r\n        private void WindowDeactivated(EventArgs args)\r\n        {\r\n            // The view would get automatically closed once you switch to debugger...\r\n            if (Debugger.IsAttached)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (isClosing)\r\n            {\r\n                return;\r\n            }\r\n\r\n            Close();\r\n        }\r\n\r\n        private void WindowClosing(EventArgs args)\r\n        {\r\n            isClosing = true;\r\n        }\r\n\r\n        private void WindowClosed(EventArgs args)\r\n        {\r\n            // Don't call this in Close method because that's not invoked when closing using ALT-F4\r\n            currentSearchToken?.Cancel();\r\n            searchDelayTimer.Dispose();\r\n            longSearchTimer.Dispose();\r\n            if (mainModel.AppSettings.SaveGlobalSearchFilterSettings)\r\n            {\r\n                mainModel.AppSettings.GameSearchFilterSettings = GameFilterSettings.GetClone();\r\n            }\r\n\r\n            SearchClosed?.Invoke(this, EventArgs.Empty);\r\n        }\r\n\r\n        private void SetCurrentContext(SearchContext context)\r\n        {\r\n            syncContext.Send((_) =>\r\n            {\r\n                if (searchContextStack.Count == 0 || searchContextStack.Peek() != context)\r\n                {\r\n                    searchContextStack.Push(context);\r\n                }\r\n\r\n                ContextHintVisible = false;\r\n                CurrentContextHint = context.Hint;\r\n                CurrentSearchProviderDescription = context.Description;\r\n                if (searchContextStack.Count == 1)\r\n                {\r\n                    CurrentContextLabel = null;\r\n                }\r\n                else\r\n                {\r\n                    CurrentContextLabel = context.Label.IsNullOrEmpty() ? \"search\" : context.Label;\r\n                }\r\n\r\n                customProviderDeleteAttemps = 0;\r\n                currentSearchDelay = 0;\r\n                searchDelayTimer.Stop();\r\n                longSearchTimer.Stop();\r\n                SlowAnimationActive = false;\r\n\r\n                // Not clearing results immediately will prevent \"flashing\" when switching contexts\r\n                // because results list is being cleared completely and then populated again.\r\n                if (context.Delay > 0)\r\n                {\r\n                    SearchResults = null;\r\n                }\r\n\r\n                SearchTerm = string.Empty;\r\n\r\n                // This is called AFTER initial search is set for case where's there's a delay set by search provider.\r\n                // This makes it so the first search has no delay at all.\r\n                customProviderDeleteAttemps = 1;\r\n                currentSearchDelay = context.Delay;\r\n            }, null);\r\n        }\r\n\r\n        private void DeactiveCurrentContext()\r\n        {\r\n            if (searchContextStack.Count == 1)\r\n            {\r\n                return;\r\n            }\r\n\r\n            searchContextStack.Pop();\r\n            SetCurrentContext(searchContextStack.Peek());\r\n        }\r\n\r\n        private List<SearchItem> FilterSearchResults(List<SearchItem> toFilter, string filter, bool matchTargetAcronymStart)\r\n        {\r\n            if (toFilter is null)\r\n                return new List<SearchItem>();\r\n\r\n            var results = new List<SearchItem>();\r\n            foreach (var item in toFilter)\r\n            {\r\n                if (MatchTextFilter(filter, item.Name, matchTargetAcronymStart))\r\n                {\r\n                    results.Add(item);\r\n                }\r\n            }\r\n\r\n            return results;\r\n        }\r\n\r\n        public static bool MatchTextFilter(string filter, string toMatch, bool matchTargetAcronymStart, double minimumJaronWinklerSimilarity = defaultMinimumJaronWinklerSimilarity)\r\n        {\r\n            if (filter.IsNullOrWhiteSpace())\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if (!filter.IsNullOrWhiteSpace() && toMatch.IsNullOrWhiteSpace())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (filter.IsNullOrWhiteSpace() && toMatch.IsNullOrWhiteSpace())\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if (filter.GetJaroWinklerSimilarityIgnoreCase(toMatch) >= minimumJaronWinklerSimilarity)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if (filter.Length > toMatch.Length)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (matchTargetAcronymStart && filter.IsStartOfStringAcronym(toMatch))\r\n            {\r\n                return true;\r\n            }\r\n\r\n            var filterSplit = filter.Split(textMatchSplitter, StringSplitOptions.RemoveEmptyEntries);\r\n            var toMatchSplit = toMatch.Split(textMatchSplitter, StringSplitOptions.RemoveEmptyEntries);\r\n            var allMatch = true;\r\n            // This is pretty crude, but it works for most cases and provides relatively good results.\r\n            // TODO definitely could use some improvements for better fuzzy results.\r\n            foreach (var word in filterSplit)\r\n            {\r\n                if (!toMatchSplit.Any(a => a.ContainsInvariantCulture(word, CompareOptions.IgnoreCase | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace)))\r\n                {\r\n                    allMatch = false;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return allMatch;\r\n        }\r\n\r\n        public async Task PerformSearch()\r\n        {\r\n            SlowAnimationActive = false;\r\n            longSearchTimer.Stop();\r\n            longSearchTimer.Start();\r\n\r\n            searchDelayTimer.Stop();\r\n            currentSearchToken?.Cancel();\r\n\r\n            var searchToken = new CancellationTokenSource();\r\n            currentSearchToken = searchToken;\r\n            var searchArgs = new GetSearchResultsArgs\r\n            {\r\n                CancelToken = searchToken.Token,\r\n                SearchTerm = SearchTerm,\r\n                SwitchContextAction = SetCurrentContext,\r\n                GameFilterSettings =  GameFilterSettings\r\n            };\r\n\r\n            var results = await Task.Run(() =>\r\n            {\r\n                try\r\n                {\r\n                    var context = searchContextStack.Peek();\r\n                    if (context.UseAutoSearch)\r\n                    {\r\n                        if (context.CacheAutoSearchResults)\r\n                        {\r\n                            if (context.AutoSearchCache == null)\r\n                            {\r\n                                context.AutoSearchCache = context.GetSearchResults(searchArgs)?.ToList() ?? new List<SearchItem>();\r\n                            }\r\n\r\n                            if (SearchTerm.IsNullOrWhiteSpace())\r\n                            {\r\n                                return context.AutoSearchCache;\r\n                            }\r\n                            else\r\n                            {\r\n                                return FilterSearchResults(context.AutoSearchCache, SearchTerm, true);\r\n                            }\r\n                        }\r\n\r\n                        return FilterSearchResults(context.GetSearchResults(searchArgs)?.ToList(), SearchTerm, true);\r\n                    }\r\n                    else\r\n                    {\r\n                        return context.GetSearchResults(searchArgs)?.ToList() ?? new List<SearchItem>();\r\n                    }\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, \"Failed to get search results.\");\r\n                    return null;\r\n                }\r\n            });\r\n\r\n            if (searchToken.IsCancellationRequested)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (results.HasItems())\r\n            {\r\n                foreach (var item in results.ToList())\r\n                {\r\n                    if (item is GameSearchItemWrapper || item is SearchItemWrapper)\r\n                    {\r\n                        continue;\r\n                    }\r\n                    else if (item is GameSearchItem gameItem)\r\n                    {\r\n                        var index = results.IndexOf(item);\r\n                        results[index] = new GameSearchItemWrapper(gameItem, mainModel.Extensions.GetLibraryPlugin(gameItem.Game.PluginId), mainModel.AppSettings);\r\n                    }\r\n                    else\r\n                    {\r\n                        var index = results.IndexOf(item);\r\n                        results[index] = new SearchItemWrapper(item, syncContext);\r\n                    }\r\n                }\r\n\r\n                SearchResults = results;\r\n                SelectedSearchItem = SearchResults[0];\r\n            }\r\n            else\r\n            {\r\n                SearchResults = null;\r\n                SelectedSearchItem = null;\r\n            }\r\n\r\n            currentSearchToken = null;\r\n            searchToken.Dispose();\r\n            longSearchTimer.Stop();\r\n            SlowAnimationActive = false;\r\n        }\r\n\r\n        private void TextBoxKeyDown(KeyEventArgs keyArgs)\r\n        {\r\n            if (!SearchResults.HasItems())\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (SearchResults.Count > 0)\r\n            {\r\n                var selected = false;\r\n                var curIndex = SearchResults.IndexOf(SelectedSearchItem);\r\n                if (keyArgs.Key == Key.Up)\r\n                {\r\n                    if (curIndex > 0)\r\n                    {\r\n                        SelectedSearchItem = SearchResults[curIndex - 1];\r\n                        selected = true;\r\n                    }\r\n                }\r\n                else if (keyArgs.Key == Key.Down)\r\n                {\r\n                    if (curIndex < SearchResults.Count - 1)\r\n                    {\r\n                        SelectedSearchItem = SearchResults[curIndex + 1];\r\n                        selected = true;\r\n                    }\r\n                }\r\n                else if (keyArgs.Key == Key.PageUp)\r\n                {\r\n                    if (curIndex - 5 > 0)\r\n                    {\r\n                        SelectedSearchItem = SearchResults[curIndex - 5];\r\n                    }\r\n                    else\r\n                    {\r\n                        SelectedSearchItem = SearchResults[0];\r\n                    }\r\n\r\n                    selected = true;\r\n                }\r\n                else if (keyArgs.Key == Key.PageDown)\r\n                {\r\n                    if (curIndex + 5 < SearchResults.Count)\r\n                    {\r\n                        SelectedSearchItem = SearchResults[curIndex + 5];\r\n                    }\r\n                    else\r\n                    {\r\n                        SelectedSearchItem = SearchResults[SearchResults.Count - 1];\r\n                    }\r\n\r\n                    selected = true;\r\n                }\r\n\r\n                if (selected)\r\n                {\r\n                    keyArgs.Handled = true;\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (keyArgs.Key == Key.Tab)\r\n            {\r\n                ToggleSelectedAction();\r\n                keyArgs.Handled = true;\r\n                return;\r\n            }\r\n        }\r\n\r\n        private void TextBoxKeyUp(KeyEventArgs keyArgs)\r\n        {\r\n            if ((keyArgs.Key == Key.Return || keyArgs.Key == Key.Enter) && keyArgs.KeyboardDevice.Modifiers == ModifierKeys.Shift &&\r\n                MenuAction != null)\r\n            {\r\n                MenuAction.Action();\r\n                return;\r\n            }\r\n\r\n            if ((keyArgs.Key == Key.Return || keyArgs.Key == Key.Enter) && keyArgs.KeyboardDevice.Modifiers == ModifierKeys.Shift &&\r\n                MenuAction == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if ((keyArgs.Key == Key.Return || keyArgs.Key == Key.Enter) && SelectedSearchItem != null)\r\n            {\r\n                InvokeSelectedAction();\r\n                return;\r\n            }\r\n\r\n            if (keyArgs.Key == Key.Back && SearchTerm.IsNullOrEmpty())\r\n            {\r\n                if (customProviderDeleteAttemps >= 1)\r\n                {\r\n                    DeactiveCurrentContext();\r\n                }\r\n                else\r\n                {\r\n                    // This is to switch contexts only after user uses backspace on already cleared search.\r\n                    // We don't want to switch contexts if user is just deleting current search.\r\n                    customProviderDeleteAttemps++;\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            if (keyArgs.Key == Key.F1)\r\n            {\r\n                ToggleHint();\r\n                return;\r\n            }\r\n\r\n            if (keyArgs.Key == Key.F2)\r\n            {\r\n                ToggleInstalledFilter();\r\n                return;\r\n            }\r\n\r\n            if (keyArgs.Key == Key.F3)\r\n            {\r\n                ToggleHiddenFilter();\r\n                return;\r\n            }\r\n\r\n            if (!SearchTerm.IsNullOrEmpty())\r\n            {\r\n                customProviderDeleteAttemps = 0;\r\n            }\r\n        }\r\n\r\n        private void ToggleSelectedAction()\r\n        {\r\n            if (PrimaryAction?.Selected == true && SecondaryAction != null)\r\n            {\r\n                PrimaryAction.Selected = false;\r\n                SecondaryAction.Selected = true;\r\n            }\r\n            else if (PrimaryAction?.Selected == true && MenuAction != null)\r\n            {\r\n                PrimaryAction.Selected = false;\r\n                MenuAction.Selected = true;\r\n            }\r\n            else if (SecondaryAction?.Selected == true && MenuAction != null)\r\n            {\r\n                SecondaryAction.Selected = false;\r\n                MenuAction.Selected = true;\r\n            }\r\n            else if (SecondaryAction?.Selected == true && PrimaryAction != null)\r\n            {\r\n                SecondaryAction.Selected = false;\r\n                PrimaryAction.Selected = true;\r\n            }\r\n            else if (MenuAction?.Selected == true && PrimaryAction != null)\r\n            {\r\n                MenuAction.Selected = false;\r\n                PrimaryAction.Selected = true;\r\n            }\r\n            else if (MenuAction?.Selected == true && SecondaryAction != null)\r\n            {\r\n                MenuAction.Selected = false;\r\n                SecondaryAction.Selected = true;\r\n            }\r\n        }\r\n\r\n        private void InvokeSelectedAction()\r\n        {\r\n            try\r\n            {\r\n                syncContext.Send(_ =>\r\n                {\r\n                    if (PrimaryAction?.Selected == true)\r\n                    {\r\n                        if (PrimaryAction.CloseView)\r\n                        {\r\n                            Close();\r\n                        }\r\n\r\n                        PrimaryAction.Action();\r\n                    }\r\n                    else if (SecondaryAction?.Selected == true)\r\n                    {\r\n                        if (SecondaryAction.CloseView)\r\n                        {\r\n                            Close();\r\n                        }\r\n\r\n                        SecondaryAction.Action();\r\n                    }\r\n                    else if (MenuAction?.Selected == true)\r\n                    {\r\n                        if (MenuAction.CloseView)\r\n                        {\r\n                            Close();\r\n                        }\r\n\r\n                        MenuAction.Action();\r\n                    }\r\n                }, null);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to invoke search item action.\");\r\n            }\r\n        }\r\n\r\n        private void InitActions(SearchItem selectedSearchItem)\r\n        {\r\n            if (selectedSearchItem == null)\r\n            {\r\n                PrimaryAction = null;\r\n                SecondaryAction = null;\r\n                MenuAction = null;\r\n                return;\r\n            }\r\n\r\n            ItemAction getAction(SearchItemAction action)\r\n            {\r\n                if (action != null)\r\n                {\r\n                    if (action is ContextSwitchSearchItemAction contextAction)\r\n                    {\r\n                        return new ItemAction(contextAction.Name, () => SetCurrentContext(contextAction.Context), false);\r\n                    }\r\n                    else\r\n                    {\r\n                        return new ItemAction(action);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            PrimaryAction = getAction(selectedSearchItem.PrimaryAction);\r\n            SecondaryAction = getAction(selectedSearchItem.SecondaryAction);\r\n            MenuAction = getAction(selectedSearchItem.MenuAction);\r\n            if (PrimaryAction != null)\r\n            {\r\n                PrimaryAction.Selected = true;\r\n            }\r\n            else if (SecondaryAction != null)\r\n            {\r\n                SecondaryAction.Selected = true;\r\n            }\r\n            else if (MenuAction != null)\r\n            {\r\n                MenuAction.Selected = true;\r\n            }\r\n        }\r\n\r\n        private void ToggleHint()\r\n        {\r\n            var context = searchContextStack.Peek();\r\n            if (!context.Hint.IsNullOrWhiteSpace())\r\n            {\r\n                ContextHintVisible = !ContextHintVisible;\r\n            }\r\n        }\r\n\r\n        private void OpenSearchSettings()\r\n        {\r\n            Close();\r\n            if (mainModel.App.Mode == ApplicationMode.Desktop)\r\n            {\r\n                mainModel.OpenSettings((int)DesktopSettingsPage.Search);\r\n            }\r\n            else\r\n            {\r\n                throw new NotSupportedInFullscreenException();\r\n            }\r\n        }\r\n\r\n        private void ToggleInstalledFilter()\r\n        {\r\n            FilterHint = GameFilterSettings.Uninstalled ? ResourceProvider.GetString(LOC.SearchFilterUninstalledExcluded) : ResourceProvider.GetString(LOC.SearchFilterUninstalledIncluded);\r\n            GameFilterSettings.Uninstalled = !GameFilterSettings.Uninstalled;\r\n            FilterHintVisible = true;\r\n            FilterHintVisible = false;\r\n        }\r\n\r\n        private void ToggleHiddenFilter()\r\n        {\r\n            FilterHint = GameFilterSettings.Hidden ? ResourceProvider.GetString(LOC.SearchFilterHiddenalledExcluded) : ResourceProvider.GetString(LOC.SearchFilterHiddenIncluded);\r\n            GameFilterSettings.Hidden = !GameFilterSettings.Hidden;\r\n            FilterHintVisible = true;\r\n            FilterHintVisible = false;\r\n        }\r\n\r\n        public void Focus()\r\n        {\r\n            window.RestoreWindow();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/ViewModels/UpdateViewModel.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Threading;\r\nusing System.Windows;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.ViewModels\r\n{\r\n    public class UpdateViewModel : ObservableObject\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private Updater updater;\r\n        private IResourceProvider resources;\r\n        private IDialogsFactory dialogs;\r\n        private ApplicationMode mode;\r\n        private readonly SynchronizationContext context;\r\n\r\n        private int updateProgress;\r\n        public int UpdateProgress\r\n        {\r\n            get => updateProgress;\r\n            set\r\n            {\r\n                updateProgress = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showProgress;\r\n        public bool ShowProgress\r\n        {\r\n            get => showProgress;\r\n            set\r\n            {\r\n                showProgress = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> CloseCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> InstallUpdateCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                InstallUpdate();\r\n            });\r\n        }\r\n\r\n        public List<ReleaseNoteData> ReleaseNotes\r\n        {\r\n            get;\r\n            private set;\r\n        }\r\n\r\n        public UpdateViewModel(\r\n            Updater updater,\r\n            IWindowFactory window,\r\n            IResourceProvider resources,\r\n            IDialogsFactory dialogs,\r\n            ApplicationMode mode)\r\n        {\r\n            context = SynchronizationContext.Current;\r\n            this.window = window;\r\n            this.updater = updater;\r\n            this.resources = resources;\r\n            this.dialogs = dialogs;\r\n            this.mode = mode;\r\n\r\n            try\r\n            {\r\n                ReleaseNotes = updater.GetReleaseNotes();\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to download release notes.\");\r\n            }\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView()\r\n        {\r\n            window.Close();\r\n        }\r\n\r\n        public async void InstallUpdate()\r\n        {\r\n            if (GlobalTaskHandler.IsActive)\r\n            {\r\n                if (dialogs.ShowMessage(resources.GetString(\"LOCUpdateProgressCancelAsk\"), \"\", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n                {\r\n                    dialogs.ActivateGlobalProgress((_) =>\r\n                    {\r\n                        try\r\n                        {\r\n                            GlobalTaskHandler.CancelAndWait();\r\n                        }\r\n                        catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                        {\r\n                            logger.Error(exc, \"Failed to cancel global progress task.\");\r\n                            throw;\r\n                        }\r\n                    }, new GlobalProgressOptions(\"LOCProgressReleasingResources\"));\r\n                }\r\n                else\r\n                {\r\n                    window.Close(false);\r\n                    return;\r\n                }\r\n            }\r\n\r\n            try\r\n            {\r\n                ShowProgress = true;\r\n                await updater.DownloadUpdate((e) =>\r\n                {\r\n                    context.Post((a) => UpdateProgress = e.ProgressPercentage, null);\r\n                });\r\n                updater.InstallUpdate(mode);\r\n                window.Close(true);\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                ShowProgress = false;\r\n                logger.Error(exc, \"Failed to download and install update.\");\r\n                dialogs.ShowMessage(\r\n                    resources.GetString(\"LOCGeneralUpdateFailMessage\") + $\"\\n{exc.Message}\",\r\n                    resources.GetString(\"LOCUpdateError\"),\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n\r\n                window.Close(false);\r\n                return;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/WebView/CookieDestroyer.cs",
    "content": "﻿using CefSharp;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.WebView\r\n{\r\n    public class CookieDestroyer : ICookieVisitor\r\n    {\r\n        private readonly string domainName;\r\n        private readonly bool useRegex;\r\n\r\n        internal readonly AutoResetEvent Finished = new AutoResetEvent(false);\r\n\r\n        public CookieDestroyer(string domainName, bool useRegex)\r\n        {\r\n            this.domainName = domainName;\r\n            this.useRegex = useRegex;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n        }\r\n\r\n        public bool Visit(Cookie cookie, int count, int total, ref bool deleteCookie)\r\n        {\r\n            if (useRegex && Regex.IsMatch(cookie.Domain, domainName))\r\n            {\r\n                deleteCookie = true;\r\n            }\r\n            else if (cookie.Domain == domainName)\r\n            {\r\n                deleteCookie = true;\r\n            }\r\n\r\n            if (count == total - 1)\r\n            {\r\n                Finished.Set();\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n\r\n    public class StandardCookieVisitor : ICookieVisitor\r\n    {\r\n        public readonly List<HttpCookie> Cookies = new List<HttpCookie>();\r\n        internal readonly AutoResetEvent Finished = new AutoResetEvent(false);\r\n\r\n        public StandardCookieVisitor()\r\n        {\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n        }\r\n\r\n        public bool Visit(Cookie cookie, int count, int total, ref bool deleteCookie)\r\n        {\r\n            Cookies.Add(new HttpCookie\r\n            {\r\n                Name = cookie.Name,\r\n                Value = cookie.Value,\r\n                Domain = cookie.Domain,\r\n                Path = cookie.Path,\r\n                Expires = cookie.Expires,\r\n                Creation = cookie.Creation,\r\n                HttpOnly = cookie.HttpOnly,\r\n                LastAccess = cookie.LastAccess,\r\n                Priority = (CookiePriority)(int)cookie.Priority,\r\n                SameSite = (CookieSameSite)(int)cookie.SameSite,\r\n                Secure = cookie.Secure\r\n            });\r\n\r\n            if (count == total - 1)\r\n            {\r\n                Finished.Set();\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n\r\n    public class DeleteCookiesHandler : IDeleteCookiesCallback\r\n    {\r\n        internal readonly AutoResetEvent Finished = new AutoResetEvent(false);\r\n        public bool IsDisposed { get; private set; }\r\n\r\n        public void Dispose()\r\n        {\r\n            IsDisposed = true;\r\n        }\r\n\r\n        public void OnComplete(int numDeleted)\r\n        {\r\n            Finished.Set();\r\n        }\r\n    }\r\n\r\n    public class SetCookieHandler : ISetCookieCallback\r\n    {\r\n        internal readonly AutoResetEvent Finished = new AutoResetEvent(false);\r\n        public bool IsDisposed { get; private set; }\r\n\r\n        public void Dispose()\r\n        {\r\n            IsDisposed = true;\r\n        }\r\n\r\n        public void OnComplete(bool success)\r\n        {\r\n            Finished.Set();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/WebView/OffscreenWebView.cs",
    "content": "﻿using CefSharp;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Events;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.WebView\r\n{\r\n    public class OffscreenWebView : WebViewBase, IWebView\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private AutoResetEvent browserInitializedEvent = new AutoResetEvent(false);\r\n        private AutoResetEvent loadCompleteEvent = new AutoResetEvent(false);\r\n        private CefSharp.OffScreen.ChromiumWebBrowser browser;\r\n        private readonly WebViewSettings settings;\r\n\r\n        public bool CanExecuteJavascriptInMainFrame => browser.CanExecuteJavascriptInMainFrame;\r\n        public Window WindowHost { get; }\r\n\r\n        public event EventHandler NavigationChanged;\r\n        public event EventHandler<WebViewLoadingChangedEventArgs> LoadingChanged;\r\n\r\n        public OffscreenWebView()\r\n        {\r\n            this.settings = new WebViewSettings();\r\n            Initialize();\r\n        }\r\n\r\n        public OffscreenWebView(WebViewSettings settings)\r\n        {\r\n            this.settings = settings;\r\n            Initialize(new BrowserSettings\r\n            {\r\n                Javascript = settings.JavaScriptEnabled ? CefState.Enabled : CefState.Disabled\r\n            });\r\n        }\r\n\r\n        private void Initialize(BrowserSettings browserSettings = null)\r\n        {\r\n            browser = new CefSharp.OffScreen.ChromiumWebBrowser(automaticallyCreateBrowser: false);\r\n            if (!settings.UserAgent.IsNullOrWhiteSpace() || settings.ResourceLoadedCallback != null)\r\n            {\r\n                browser.RequestHandler = new CustomRequestHandler(settings);\r\n            }\r\n\r\n            browser.LoadingStateChanged += Browser_LoadingStateChanged;\r\n            browser.BrowserInitialized += Browser_BrowserInitialized;\r\n            if (browserSettings != null)\r\n            {\r\n                browser.CreateBrowser(null, browserSettings);\r\n            }\r\n            else\r\n            {\r\n                browser.CreateBrowser();\r\n            }\r\n\r\n            if (!browserInitializedEvent.WaitOne(30000))\r\n            {\r\n                logger.Error(\"Failed to initialize OffscreenWebView in timely manner.\");\r\n            }\r\n        }\r\n\r\n        private void Browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)\r\n        {\r\n            if (e.IsLoading == false)\r\n            {\r\n                loadCompleteEvent.Set();\r\n            }\r\n\r\n            LoadingChanged?.Invoke(this, new WebViewLoadingChangedEventArgs { IsLoading = e.IsLoading });\r\n            NavigationChanged?.Invoke(this, new EventArgs());\r\n        }\r\n\r\n        private async void Browser_BrowserInitialized(object sender, EventArgs e)\r\n        {\r\n            browserInitializedEvent.Set();\r\n            if (!settings.UserAgent.IsNullOrWhiteSpace())\r\n            {\r\n                using (var client = browser.GetDevToolsClient())\r\n                {\r\n                    await client.Network.SetUserAgentOverrideAsync(settings.UserAgent);\r\n                    await client.Emulation.SetUserAgentOverrideAsync(settings.UserAgent);\r\n                }\r\n            }\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            browser.LoadingStateChanged -= Browser_LoadingStateChanged;\r\n            browser.BrowserInitialized -= Browser_BrowserInitialized;\r\n            browser.Dispose();\r\n        }\r\n\r\n        public string GetCurrentAddress()\r\n        {\r\n            return browser.Address;\r\n        }\r\n\r\n        public string GetPageText()\r\n        {\r\n            return browser.GetTextAsync().GetAwaiter().GetResult();\r\n        }\r\n\r\n        public Task<string> GetPageTextAsync()\r\n        {\r\n            return browser.GetTextAsync();\r\n        }\r\n\r\n        public string GetPageSource()\r\n        {\r\n            return browser.GetSourceAsync().GetAwaiter().GetResult();\r\n        }\r\n\r\n        public Task<string> GetPageSourceAsync()\r\n        {\r\n            return browser.GetSourceAsync();\r\n        }\r\n\r\n        public void NavigateAndWait(string url)\r\n        {\r\n            browser.Load(url);\r\n            loadCompleteEvent.WaitOne(20000);\r\n        }\r\n\r\n        public void Navigate(string url)\r\n        {\r\n            browser.Load(url);\r\n        }\r\n\r\n        public void Open()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public bool? OpenDialog()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public async Task<JavaScriptEvaluationResult> EvaluateScriptAsync(string script)\r\n        {\r\n            var res = await browser.EvaluateScriptAsync(script);\r\n            return new JavaScriptEvaluationResult\r\n            {\r\n                Message = res.Message,\r\n                Result = res.Result,\r\n                Success = res.Success\r\n            };\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/WebView/WebView.cs",
    "content": "﻿using CefSharp;\r\nusing Playnite.Windows;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Media;\r\nusing System.Windows;\r\nusing Playnite.SDK.Events;\r\nusing CefSharp.Wpf.Rendering.Experimental;\r\n\r\nnamespace Playnite.WebView\r\n{\r\n    public class WebView : WebViewBase, IWebView\r\n    {\r\n        private readonly SynchronizationContext context;\r\n        private AutoResetEvent loadCompleteEvent = new AutoResetEvent(false);\r\n        private WebViewWindow window;\r\n        private readonly WebViewSettings settings;\r\n\r\n        public bool CanExecuteJavascriptInMainFrame => window.Browser.CanExecuteJavascriptInMainFrame;\r\n        public event EventHandler NavigationChanged;\r\n        public event EventHandler<WebViewLoadingChangedEventArgs> LoadingChanged;\r\n        public Window WindowHost => window;\r\n\r\n        public WebView(WebViewSettings settings, bool useCompositionRenderer = false)\r\n        {\r\n            context = SynchronizationContext.Current;\r\n            window = new WebViewWindow();\r\n            this.settings = settings;\r\n            window.Browser.LoadingStateChanged += Browser_LoadingStateChanged;\r\n            window.Browser.TitleChanged += Browser_TitleChanged;\r\n\r\n            if (!settings.UserAgent.IsNullOrWhiteSpace() || settings.ResourceLoadedCallback != null)\r\n            {\r\n                window.Browser.IsBrowserInitializedChanged += Browser_IsBrowserInitializedChanged;\r\n                window.Browser.RequestHandler = new CustomRequestHandler(settings);\r\n            }\r\n\r\n            if (useCompositionRenderer)\r\n            {\r\n                window.Browser.RenderHandler = new CompositionTargetRenderHandler(window.Browser, window.Browser.DpiScaleFactor, window.Browser.DpiScaleFactor);\r\n            }\r\n\r\n            window.Owner = WindowManager.CurrentWindow;\r\n            window.Width = settings.WindowWidth;\r\n            window.Height = settings.WindowHeight;\r\n            window.PanelContent.Background = new SolidColorBrush(settings.WindowBackground);\r\n        }\r\n\r\n        private async void Browser_IsBrowserInitializedChanged(object sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            if ((e.NewValue is bool init) && init == true && !settings.UserAgent.IsNullOrWhiteSpace())\r\n            {\r\n                using (var client = window.Browser.GetDevToolsClient())\r\n                {\r\n                    await client.Network.SetUserAgentOverrideAsync(settings.UserAgent);\r\n                    await client.Emulation.SetUserAgentOverrideAsync(settings.UserAgent);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)\r\n        {\r\n            if (e.IsLoading == false)\r\n            {\r\n                loadCompleteEvent.Set();\r\n            }\r\n\r\n            LoadingChanged?.Invoke(this, new WebViewLoadingChangedEventArgs { IsLoading = e.IsLoading });\r\n            NavigationChanged?.Invoke(this, new EventArgs());\r\n        }\r\n\r\n        private void Browser_TitleChanged(object sender, DependencyPropertyChangedEventArgs args)\r\n        {\r\n            string titlePrefix = args.NewValue as string;\r\n            string titleSuffix = \"Playnite\";\r\n\r\n            window.Title = string.IsNullOrEmpty(titlePrefix) ? titleSuffix : string.Format(\"{0} - {1}\", titlePrefix, titleSuffix);\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n            context.Send(a => window.Close(), null);\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            window.Browser.LoadingStateChanged -= Browser_LoadingStateChanged;\r\n            window.Browser.TitleChanged -= Browser_TitleChanged;\r\n            window.Browser.IsBrowserInitializedChanged -= Browser_IsBrowserInitializedChanged;\r\n            window.Close();\r\n            window.Browser.Dispose();\r\n        }\r\n\r\n        public string GetCurrentAddress()\r\n        {\r\n            var address = string.Empty;\r\n            context.Send(a => address = window.Browser.Address, null);\r\n            return address;\r\n        }\r\n\r\n        public Task<string> GetPageTextAsync()\r\n        {\r\n            return window.Browser.GetTextAsync();\r\n        }\r\n\r\n        public string GetPageText()\r\n        {\r\n            var text = string.Empty;\r\n            context.Send(a => text = window.Browser.GetTextAsync().GetAwaiter().GetResult(), null);\r\n            return text;\r\n        }\r\n\r\n        public string GetPageSource()\r\n        {\r\n            var text = string.Empty;\r\n            context.Send(a => text = window.Browser.GetSourceAsync().GetAwaiter().GetResult(), null);\r\n            return text;\r\n        }\r\n\r\n        public Task<string> GetPageSourceAsync()\r\n        {\r\n            return window.Browser.GetSourceAsync();\r\n        }\r\n\r\n        public void NavigateAndWait(string url)\r\n        {\r\n            context.Send(a => window.Browser.Address = url, null);\r\n            loadCompleteEvent.WaitOne(20000);\r\n        }\r\n\r\n        public void Navigate(string url)\r\n        {\r\n            context.Send(a => window.Browser.Address = url, null);\r\n        }\r\n\r\n        public void Open()\r\n        {\r\n            window.Show();\r\n        }\r\n\r\n        public bool? OpenDialog()\r\n        {\r\n            return window.ShowDialog();\r\n        }\r\n\r\n        public async Task<JavaScriptEvaluationResult> EvaluateScriptAsync(string script)\r\n        {\r\n            var res = await window.Browser.EvaluateScriptAsync(script);\r\n            return new JavaScriptEvaluationResult\r\n            {\r\n                Message = res.Message,\r\n                Result = res.Result,\r\n                Success = res.Success\r\n            };\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/WebView/WebViewBase.cs",
    "content": "﻿using CefSharp;\r\nusing DiscordRPC;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\n\r\nnamespace Playnite.WebView\r\n{\r\n    public class CustomResourceRequestHandler : CefSharp.Handler.ResourceRequestHandler\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly WebViewSettings settings;\r\n        private readonly MemoryStream contentStream;\r\n\r\n        public CustomResourceRequestHandler(WebViewSettings settings)\r\n        {\r\n            this.settings = settings;\r\n            if (settings.PassResourceContentStreamToCallback)\r\n                contentStream = new MemoryStream();\r\n        }\r\n\r\n        public static Playnite.SDK.WebViewModels.Request ConvertRequest(IRequest request)\r\n        {\r\n            var result = new SDK.WebViewModels.Request\r\n            {\r\n                Method = request.Method,\r\n                ResourceType = (Playnite.SDK.WebViewModels.ResourceType)request.ResourceType,\r\n                Url = request.Url,\r\n                Headers = new Dictionary<string, string>()\r\n            };\r\n\r\n            foreach (string header in request.Headers)\r\n                result.Headers.Add(header, request.Headers[header]);\r\n\r\n            return result;\r\n        }\r\n\r\n        public static Playnite.SDK.WebViewModels.Response ConvertResponse(IResponse response)\r\n        {\r\n            var result = new SDK.WebViewModels.Response\r\n            {\r\n                Charset = response.Charset,\r\n                MimeType = response.MimeType,\r\n                StatusCode = response.StatusCode,\r\n                StatusText = response.StatusText,\r\n                Headers = new Dictionary<string, string>()\r\n            };\r\n\r\n            foreach (string header in response.Headers)\r\n                result.Headers.Add(header, response.Headers[header]);\r\n\r\n            return result;\r\n        }\r\n\r\n        protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)\r\n        {\r\n            if (!settings.UserAgent.IsNullOrWhiteSpace())\r\n                request.SetHeaderByName(\"user-agent\", settings.UserAgent, true);\r\n            return CefReturnValue.Continue;\r\n        }\r\n\r\n        protected override IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)\r\n        {\r\n            if (settings.PassResourceContentStreamToCallback)\r\n                return new CefSharp.ResponseFilter.StreamResponseFilter(contentStream);\r\n            else\r\n                return base.GetResourceResponseFilter(chromiumWebBrowser, browser, frame, request, response);\r\n        }\r\n\r\n        protected override void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)\r\n        {\r\n            if (settings.ResourceLoadedCallback != null)\r\n            {\r\n                var args = new WebViewResourceLoadedCallback(\r\n                    ConvertRequest(request),\r\n                    ConvertResponse(response),\r\n                    (SDK.WebViewModels.UrlRequestStatus)status,\r\n                    receivedContentLength);\r\n                if (settings.PassResourceContentStreamToCallback)\r\n                    args.ResponseContent = contentStream;\r\n\r\n                try\r\n                {\r\n                    settings.ResourceLoadedCallback(args);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, \"Web view resource callback failed.\");\r\n                }\r\n            }\r\n\r\n            base.OnResourceLoadComplete(chromiumWebBrowser, browser, frame, request, response, status, receivedContentLength);\r\n        }\r\n\r\n        protected override void Dispose()\r\n        {\r\n            base.Dispose();\r\n            contentStream?.Dispose();\r\n        }\r\n    }\r\n\r\n    public class CustomRequestHandler : CefSharp.Handler.RequestHandler\r\n    {\r\n        private readonly WebViewSettings settings;\r\n\r\n        public CustomRequestHandler(WebViewSettings settings)\r\n        {\r\n            this.settings = settings;\r\n        }\r\n\r\n        protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)\r\n        {\r\n            return new CustomResourceRequestHandler(settings);\r\n        }\r\n    }\r\n\r\n    public class WebViewBase\r\n    {\r\n        // This needs to be done before calling cookie visit methods because we won't get any callbacks if no cookies exist,\r\n        // which would lead to a deadlock. There's no way how to tell beforehand if any cookies exist or not.\r\n        private void MakeSureCookiesExist(ICookieManager manager)\r\n        {\r\n            using (var setHandler = new SetCookieHandler())\r\n            {\r\n                if (manager.SetCookie(\"https://playnite.test\", new Cookie { Domain = \"playnite.test\", Name = \"playnite.test\", Value = \"playnite.test\" }, setHandler))\r\n                {\r\n                    setHandler.Finished.WaitOne();\r\n                }\r\n            }\r\n        }\r\n\r\n        public List<HttpCookie> GetCookies()\r\n        {\r\n            using (var manager = Cef.GetGlobalCookieManager())\r\n            using (var visitor = new StandardCookieVisitor())\r\n            {\r\n                MakeSureCookiesExist(manager);\r\n                if (manager.VisitAllCookies(visitor))\r\n                {\r\n                    visitor.Finished.WaitOne();\r\n                }\r\n\r\n                return visitor.Cookies;\r\n            }\r\n        }\r\n\r\n        public void DeleteDomainCookies(string domain)\r\n        {\r\n            using (var manager = Cef.GetGlobalCookieManager())\r\n            using (var destoyer = new CookieDestroyer(domain, false))\r\n            {\r\n                MakeSureCookiesExist(manager);\r\n                if (manager.VisitAllCookies(destoyer))\r\n                {\r\n                    destoyer.Finished.WaitOne();\r\n                }\r\n            }\r\n        }\r\n\r\n        public void DeleteDomainCookiesRegex(string domainRegex)\r\n        {\r\n            using (var manager = Cef.GetGlobalCookieManager())\r\n            using (var destoyer = new CookieDestroyer(domainRegex, true))\r\n            {\r\n                MakeSureCookiesExist(manager);\r\n                if (manager.VisitAllCookies(destoyer))\r\n                {\r\n                    destoyer.Finished.WaitOne();\r\n                }\r\n            }\r\n        }\r\n\r\n        public void DeleteCookies(string url, string name)\r\n        {\r\n            using (var manager = Cef.GetGlobalCookieManager())\r\n            using (var deleteHandle = new DeleteCookiesHandler())\r\n            {\r\n                MakeSureCookiesExist(manager);\r\n                if (manager.DeleteCookies(url, name, deleteHandle))\r\n                {\r\n                    deleteHandle.Finished.WaitOne();\r\n                }\r\n            }\r\n        }\r\n\r\n        public void SetCookies(string url, string domain, string name, string value, string path, DateTime expires)\r\n        {\r\n            using (var manager = Cef.GetGlobalCookieManager())\r\n            using (var setHandler = new SetCookieHandler())\r\n            {\r\n                if (manager.SetCookie(url, new Cookie\r\n                {\r\n                    Domain = domain,\r\n                    Name = name,\r\n                    Value = value,\r\n                    Expires = expires,\r\n                    HttpOnly = false,\r\n                    Secure = false,\r\n                    Path = path\r\n                }, setHandler))\r\n                {\r\n                    setHandler.Finished.WaitOne();\r\n                }\r\n            }\r\n        }\r\n\r\n        public void SetCookies(string url, HttpCookie cookie)\r\n        {\r\n            using (var manager = Cef.GetGlobalCookieManager())\r\n            using (var setHandler = new SetCookieHandler())\r\n            {\r\n                if (manager.SetCookie(url, new Cookie()\r\n                {\r\n                    Domain = cookie.Domain,\r\n                    Expires = cookie.Expires,\r\n                    HttpOnly = cookie.HttpOnly,\r\n                    Secure = cookie.Secure,\r\n                    SameSite = (CefSharp.Enums.CookieSameSite)(int)cookie.SameSite,\r\n                    Priority = (CefSharp.Enums.CookiePriority)(int)cookie.Priority,\r\n                    Name = cookie.Name,\r\n                    Path = cookie.Path,\r\n                    Value = cookie.Value\r\n                }, setHandler))\r\n                {\r\n                    setHandler.Finished.WaitOne();\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/WebView/WebViewFactory.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Media;\r\n\r\nnamespace Playnite.WebView\r\n{\r\n    public class WebViewFactory : IWebViewFactory\r\n    {\r\n        private PlayniteSettings appSettings;\r\n\r\n        public WebViewFactory(PlayniteSettings settings)\r\n        {\r\n            appSettings = settings;\r\n        }\r\n\r\n        public IWebView CreateOffscreenView()\r\n        {\r\n            return new OffscreenWebView();\r\n        }\r\n\r\n        public IWebView CreateOffscreenView(WebViewSettings settings)\r\n        {\r\n            return new OffscreenWebView(settings);\r\n        }\r\n\r\n        public IWebView CreateView(int width, int height)\r\n        {\r\n            return new WebView(\r\n                new WebViewSettings() { WindowWidth = width, WindowHeight = height },\r\n                appSettings.UseCompositionWebViewRenderer);\r\n        }\r\n\r\n        public IWebView CreateView(int width, int height, Color background)\r\n        {\r\n            return new WebView(\r\n                new WebViewSettings() { WindowWidth = width, WindowHeight = height, WindowBackground = background },\r\n                appSettings.UseCompositionWebViewRenderer);\r\n        }\r\n\r\n        public IWebView CreateView(WebViewSettings settings)\r\n        {\r\n            return new WebView(settings, appSettings.UseCompositionWebViewRenderer);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Windows/CrashHandlerWindowFactory.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Windows\r\n{\r\n    public class CrashHandlerWindowFactory : WindowFactory\r\n    {\r\n        public static Type WindowType { get; private set; }\r\n\r\n        public static void SetWindowType<TType>() where TType : WindowBase\r\n        {\r\n            WindowType = typeof(TType);\r\n        }\r\n\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return WindowType.CrateInstance<WindowBase>();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Windows/ExtensionCrashHandlerWindowFactory.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Windows\r\n{\r\n    public class ExtensionCrashHandlerWindowFactory : WindowFactory\r\n    {\r\n        public static Type WindowType { get; private set; }\r\n\r\n        public static void SetWindowType<TType>() where TType : WindowBase\r\n        {\r\n            WindowType = typeof(TType);\r\n        }\r\n\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return WindowType.CrateInstance<WindowBase>();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Windows/ItemSelectorWindowFactory.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Windows\r\n{\r\n    public class SingleItemSelectionWindowFactory : WindowFactory\r\n    {\r\n        public static Type WindowType { get; private set; }\r\n\r\n        public static void SetWindowType<TType>() where TType : WindowBase\r\n        {\r\n            WindowType = typeof(TType);\r\n        }\r\n\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return WindowType.CrateInstance<WindowBase>();\r\n        }\r\n    }\r\n\r\n    public class MultiItemSelectionWindowFactory : WindowFactory\r\n    {\r\n        public static Type WindowType { get; private set; }\r\n\r\n        public static void SetWindowType<TType>() where TType : WindowBase\r\n        {\r\n            WindowType = typeof(TType);\r\n        }\r\n\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return WindowType.CrateInstance<WindowBase>();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Windows/LicenseAgreementWindowFactory.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Windows\r\n{\r\n    public class LicenseAgreementWindowFactory : WindowFactory\r\n    {\r\n        public static Type WindowType { get; private set; }\r\n\r\n        public static void SetWindowType<TType>() where TType : WindowBase\r\n        {\r\n            WindowType = typeof(TType);\r\n        }\r\n\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return WindowType.CrateInstance<WindowBase>();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Windows/ProgressWindowFactory.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Windows\r\n{\r\n    public class ProgressWindowFactory : WindowFactory\r\n    {\r\n        public static Type WindowType { get; private set; }\r\n\r\n        public static void SetWindowType<TType>() where TType : WindowBase\r\n        {\r\n            WindowType = typeof(TType);\r\n        }\r\n\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return WindowType.CrateInstance<WindowBase>();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Windows/UpdateWindowFactory.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Windows\r\n{\r\n    public class UpdateWindowFactory : WindowFactory\r\n    {\r\n        public static Type WindowType { get; private set; }\r\n\r\n        public static void SetWindowType<TType>() where TType : WindowBase\r\n        {\r\n            WindowType = typeof(TType);\r\n        }\r\n\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return WindowType.CrateInstance<WindowBase>();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Windows/WebViewWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.Windows.WebViewWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.Windows\"\r\n        xmlns:cefSharp=\"clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf\"\r\n        mc:Ignorable=\"d\" Loaded=\"Window_Loaded\"\r\n        Title=\"\" Height=\"450\" Width=\"800\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        WindowStartupLocation=\"CenterOwner\"\r\n        KeyUp=\"WindowBase_KeyUp\">\r\n    <DockPanel Name=\"PanelContent\">\r\n        <TextBox Text=\"{Binding Address, ElementName=Browser}\"\r\n                 Background=\"{DynamicResource NormalBrushDark}\"\r\n                 DockPanel.Dock=\"Top\" IsReadOnly=\"True\" BorderThickness=\"0\"/>\r\n        <cefSharp:ChromiumWebBrowser Name=\"Browser\" DockPanel.Dock=\"Bottom\" />\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite/Windows/WebViewWindow.xaml.cs",
    "content": "﻿using CefSharp;\r\nusing Playnite.Controls;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for WebViewWindow.xaml\r\n    /// </summary>\r\n    public partial class WebViewWindow :  WindowBase\r\n    {\r\n        public WebViewWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        private void Window_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            Browser.Focus();\r\n        }\r\n\r\n        private void WindowBase_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)\r\n        {\r\n            if (Browser.IsInitialized && e.Key == System.Windows.Input.Key.F12)\r\n            {\r\n                Browser.ShowDevTools();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Windows/WindowFactory.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.Native;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Interop;\r\n\r\nnamespace Playnite.Windows\r\n{\r\n    public interface IWindowFactory\r\n    {\r\n        bool WasClosed { get; }\r\n\r\n        bool? CreateAndOpenDialog(object dataContext);\r\n\r\n        void Show(object dataContext);\r\n\r\n        void RestoreWindow();\r\n\r\n        void Close();\r\n\r\n        void Close(bool? resutl);\r\n\r\n        WindowBase Window { get; }\r\n    }\r\n\r\n    public abstract class WindowFactory : IWindowFactory\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private readonly SynchronizationContext context;\r\n        private bool asDialog = false;\r\n        private AutoResetEvent initFinishedEvent { get; } = new AutoResetEvent(false);\r\n        public bool WasClosed { get; private set; } = false;\r\n\r\n        public WindowBase Window\r\n        {\r\n            get;\r\n            private set;\r\n        }\r\n\r\n        public abstract WindowBase CreateNewWindowInstance();\r\n\r\n        public WindowFactory()\r\n        {\r\n            context = SynchronizationContext.Current ?? PlayniteApplication.Current.SyncContext;\r\n        }\r\n\r\n        public bool? CreateAndOpenDialog(object dataContext)\r\n        {\r\n            bool? result = null;\r\n            context.Send((a) =>\r\n            {\r\n                Window = CreateNewWindowInstance();\r\n                Window.Closed += Window_Closed;\r\n                Window.Loaded += Window_Loaded;\r\n                Window.DataContext = dataContext;\r\n                logger.Debug($\"Show dialog window {GetType()}: {Window.Id}\");\r\n\r\n                var currentWindow = WindowManager.CurrentWindow;\r\n                if (currentWindow != null && Window != currentWindow)\r\n                {\r\n                    if (typeof(WindowBase).IsAssignableFrom(currentWindow.GetType()) && ((WindowBase)currentWindow).IsShown)\r\n                    {\r\n                        Window.Owner = currentWindow;\r\n                    }\r\n                }\r\n\r\n                if (Window.Owner == null)\r\n                {\r\n                    Window.WindowStartupLocation = WindowStartupLocation.CenterScreen;\r\n                    Window.ShowInTaskbar = true;\r\n                }\r\n\r\n                asDialog = true;\r\n                WasClosed = false;\r\n                Window.ShowDialog();\r\n                result = Window.DialogResultFixed;\r\n            }, null);\r\n\r\n            return result;\r\n        }\r\n\r\n        public void Show(object dataContext)\r\n        {\r\n            context.Send((a) =>\r\n            {\r\n                asDialog = false;\r\n                if (WasClosed)\r\n                {\r\n                    logger.Debug($\"Opening window that was closed previously {GetType()}, old Id: {Window.Id}\");\r\n                    Window = CreateNewWindowInstance();\r\n                    Window.Closed += Window_Closed;\r\n                    Window.Loaded += Window_Loaded;\r\n                }\r\n\r\n                if (Window == null)\r\n                {\r\n                    Window = CreateNewWindowInstance();\r\n                    Window.Closed += Window_Closed;\r\n                    Window.Loaded += Window_Loaded;\r\n                }\r\n\r\n                logger.Debug($\"Show window {GetType()}: {Window.Id}\");\r\n                Window.DataContext = dataContext;\r\n                WasClosed = false;\r\n                Window.Show();\r\n            }, null);\r\n        }\r\n\r\n        private void Window_Closed(object sender, EventArgs e)\r\n        {\r\n            WasClosed = true;\r\n            Window.Closed -= Window_Closed;\r\n            Window.Loaded -= Window_Loaded;\r\n        }\r\n\r\n        private void Window_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            Window.Loaded -= Window_Loaded; // Loaded can be in theory called more than once so we remove handler on first hit\r\n            initFinishedEvent.Set();\r\n        }\r\n\r\n        public void RestoreWindow()\r\n        {\r\n            context.Send((a) =>\r\n            {\r\n                WindowUtils.RestoreWindow(Window);\r\n            }, null);\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n            Close(null);\r\n        }\r\n\r\n        public void Close(bool? result)\r\n        {\r\n            // This needs to be here in case Close is called too early.\r\n            // This can happen in async scenarios like with ProgressViewViewModel and progress dialogs if progress code is too fast to complete.\r\n            initFinishedEvent.WaitOne();\r\n\r\n            logger.Debug($\"Closing window {GetType()}: {Window.Id}, {result}\");\r\n            context.Send(async (_) =>\r\n            {\r\n                // This is a workaround for WPF bug which causes deadlock in ShowDialog\r\n                // if parent of modal window is closed before the child window itself is closed.\r\n                // To prevent this we need to make sure that window parenting other windows is only\r\n                // closed after all children are closed.\r\n                // https://github.com/dotnet/wpf/issues/277\r\n                // https://stackoverflow.com/questions/40304161/showdialog-method-hangs-without-showing-the-window-deadlock#48208699\r\n                while (Window.GetHasChild())\r\n                {\r\n                    await Task.Delay(100);\r\n                }\r\n\r\n                if (asDialog)\r\n                {\r\n                    // This is a workaround for issue with original DialogResult.\r\n                    // For some reason, setting DialogResult fails in rare cases on\r\n                    // \"you need to open this window first\" exception even when we are for sure\r\n                    // setting this after the window was already opened, see initFinishedEvent.\r\n                    Window.DialogResultFixed = result;\r\n\r\n                    try\r\n                    {\r\n                        Window.DialogResult = result;\r\n                    }\r\n                    catch (Exception e)\r\n                    {\r\n                        logger.Error(e, $\"DialogResult fail {GetType()}, {Window.Id}, {result}\");\r\n                    }\r\n                }\r\n\r\n                Window.Close();\r\n            }, null);\r\n        }\r\n    }\r\n\r\n    public static class WindowUtils\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public static void RestoreWindow(this Window window)\r\n        {\r\n            // This is the only reliable method that also doesn't result in issues like this:\r\n            // https://www.reddit.com/r/playnite/comments/f6d73l/bug_full_screen_ui_wont_respond_to_left_stick/\r\n            // Adapted from https://ask.xiaolee.net/questions/1040342\r\n\r\n            try\r\n            {\r\n                if (PlayniteApplication.Current?.Mode == ApplicationMode.Fullscreen)\r\n                {\r\n                    // Show() call is needed when restoring from minimized state otherwise restored window will\r\n                    // not render properly for some reason (will display just black).\r\n                    // BUT we can't call it always otherwise it will bug out restore if atl-tabbing was\r\n                    // used in the past for switching windows, see next comment...\r\n                    if (window.WindowState == WindowState.Minimized || window.Visibility != Visibility.Visible)\r\n                    {\r\n                        window.Show();\r\n                    }\r\n\r\n                    // This needs to be set always otherwise restore will not work if user alt-tabbed out of Playnite.\r\n                    // Yeah apparently switching windows is something Windows can't do reliably in 2023...\r\n                    window.WindowState = WindowState.Normal;\r\n                    if (!window.Activate())\r\n                    {\r\n                        window.Topmost = true;\r\n                        window.Topmost = false;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    window.Show();\r\n                    if (!window.Activate())\r\n                    {\r\n                        window.Topmost = true;\r\n                        window.Topmost = false;\r\n                    }\r\n\r\n                    if (window.WindowState == WindowState.Minimized)\r\n                    {\r\n                        window.WindowState = WindowState.Normal;\r\n                    }\r\n                }\r\n\r\n                //Get the process ID for this window's thread\r\n                var interopHelper = new WindowInteropHelper(window);\r\n                var thisWindowThreadId = User32.GetWindowThreadProcessId(interopHelper.Handle, IntPtr.Zero);\r\n\r\n                //Get the process ID for the foreground window's thread\r\n                var currentForegroundWindow = User32.GetForegroundWindow();\r\n                var currentForegroundWindowThreadId = User32.GetWindowThreadProcessId(currentForegroundWindow, IntPtr.Zero);\r\n\r\n                //Attach this window's thread to the current window's thread\r\n                User32.AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, true);\r\n\r\n                //Set the window position\r\n                User32.SetWindowPos(interopHelper.Handle, new IntPtr(0), 0, 0, 0, 0, SWP.NOSIZE | SWP.NOMOVE | SWP.SHOWWINDOW);\r\n\r\n                //Detach this window's thread from the current window's thread\r\n                User32.AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, false);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to restore window.\");\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Windows/WindowManager.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.Windows\r\n{\r\n    public static class WindowManager\r\n    {\r\n        static WindowManager()\r\n        {\r\n            EventManager.RegisterClassHandler(typeof(WindowBase), WindowBase.ActivatedRoutedEvent, new RoutedEventHandler(ActivatedRoutedEventHandler));\r\n            EventManager.RegisterClassHandler(typeof(WindowBase), WindowBase.ClosedRoutedEvent, new RoutedEventHandler(WindowBaseCloseHandler));\r\n        }\r\n\r\n        private static void ActivatedRoutedEventHandler(object sender, RoutedEventArgs e)\r\n        {\r\n            LastActiveWindow = (WindowBase)sender;\r\n        }\r\n\r\n        private static void WindowBaseCloseHandler(object sender, RoutedEventArgs e)\r\n        {\r\n            if (LastActiveWindow == (WindowBase)sender)\r\n            {\r\n                LastActiveWindow = null;\r\n            }\r\n        }\r\n\r\n        public static WindowBase LastActiveWindow { get; private set; }\r\n\r\n        public static Window CurrentWindow\r\n        {\r\n            get\r\n            {\r\n                Window window = null;\r\n                for (int i = PlayniteApplication.CurrentNative.Windows.Count - 1; i >= 0; i--)\r\n                {\r\n                    window = PlayniteApplication.CurrentNative.Windows[i];\r\n                    if (window.IsActive)\r\n                    {\r\n                        return window;\r\n                    }\r\n                }\r\n\r\n                return window ?? PlayniteApplication.CurrentNative.MainWindow;\r\n            }\r\n        }\r\n\r\n        public static bool GetHasChild(this Window window)\r\n        {\r\n            return window.OwnedWindows.Count > 0;\r\n        }\r\n\r\n        public static void NotifyChildOwnershipChanges()\r\n        {\r\n            foreach (var wnd in PlayniteApplication.CurrentNative.Windows)\r\n            {\r\n                if (wnd is WindowBase window)\r\n                {\r\n                    window.OnPropertyChanged(nameof(WindowBase.HasChildWindow));\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void SetEnableMouseInput(bool enable)\r\n        {\r\n            foreach (var wnd in PlayniteApplication.CurrentNative.Windows)\r\n            {\r\n                if (wnd is WindowBase window)\r\n                {\r\n                    window.IsHitTestVisible = enable;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/Windows/WindowPositionHandler.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Forms;\r\nusing System.Windows.Media;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.Settings;\r\n\r\nnamespace Playnite.Windows\r\n{\r\n    public class WindowPositionHandler\r\n    {\r\n        private Window window;\r\n        private readonly string windowName;\r\n        private readonly WindowPositions configuration;\r\n        private bool ignoreChanges = false;\r\n        private readonly bool saveSize;\r\n\r\n        public WindowPositionHandler(Window window, string windowName, WindowPositions settings, bool saveSize = true)\r\n        {\r\n            this.window = window;\r\n            this.windowName = windowName;\r\n            this.saveSize = saveSize;\r\n            configuration = settings;\r\n            window.SizeChanged += Window_SizeChanged;\r\n            window.LocationChanged += Window_LocationChanged;\r\n            window.StateChanged += Window_StateChanged;\r\n            window.Loaded += Window_Loaded;\r\n            window.Closed += Window_Closed;\r\n        }\r\n\r\n        private void Window_Closed(object sender, EventArgs e)\r\n        {\r\n            window.SizeChanged -= Window_SizeChanged;\r\n            window.LocationChanged -= Window_LocationChanged;\r\n            window.StateChanged -= Window_StateChanged;\r\n            window.Loaded -= Window_Loaded;\r\n            window.Closed -= Window_Closed;\r\n            window = null;\r\n        }\r\n\r\n        private void Window_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            RestoreSizeAndLocation();\r\n            window.Loaded -= Window_Loaded;\r\n        }\r\n\r\n        private void Window_StateChanged(object sender, EventArgs e)\r\n        {\r\n            if (window.IsLoaded)\r\n            {\r\n                SaveState();\r\n            }\r\n        }\r\n\r\n        private void Window_LocationChanged(object sender, EventArgs e)\r\n        {\r\n            if (window.IsLoaded)\r\n            {\r\n                SavePosition();\r\n            }\r\n        }\r\n\r\n        private void Window_SizeChanged(object sender, SizeChangedEventArgs e)\r\n        {\r\n            if (window.IsLoaded)\r\n            {\r\n                SaveSize();\r\n            }\r\n        }\r\n\r\n        private void MakeSureConfigEntryExists()\r\n        {\r\n            if (!configuration.Positions.ContainsKey(windowName))\r\n            {\r\n                configuration.Positions[windowName] = new WindowPosition();\r\n            }\r\n        }\r\n\r\n        private void SaveState()\r\n        {\r\n            if (configuration == null || ignoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Don't save minimized state. It would not be very user friendly if user exit Playnite while minimized\r\n            // and it would then open minimized on next startup.\r\n            if (window.WindowState == WindowState.Minimized)\r\n            {\r\n                return;\r\n            }\r\n\r\n            MakeSureConfigEntryExists();\r\n            configuration.Positions[windowName].State = window.WindowState;\r\n        }\r\n\r\n        private void SaveSize()\r\n        {\r\n            if (!saveSize)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (configuration == null || ignoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            // Don't save size if windows is maximized, it would be too large when it would restore back to normal state.\r\n            // Don't save size if windows is minimized becuase it has no size :)\r\n            if (window.WindowState != WindowState.Normal)\r\n            {\r\n                return;\r\n            }\r\n\r\n            MakeSureConfigEntryExists();\r\n            configuration.Positions[windowName].Size = new WindowPosition.Point()\r\n            {\r\n                X = window.Width,\r\n                Y = window.Height\r\n            };\r\n        }\r\n\r\n        private void SavePosition()\r\n        {\r\n            if (configuration == null || ignoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            MakeSureConfigEntryExists();\r\n            configuration.Positions[windowName].Position = new WindowPosition.Point()\r\n            {\r\n                X = window.Left,\r\n                Y = window.Top\r\n            };\r\n        }\r\n\r\n        // TODO: this needs complete rework when per display DPI support is enabled in P11.\r\n        // Stored position must be saved in DPI independent (in 100% scaling) coordinates and relative to active display,\r\n        // not relative to the whole desktop. Otherwise it gets messy in mixed DPI multi-monitor environments.\r\n        private void ConstrainWindow(int x, int y)\r\n        {\r\n            var dpi = VisualTreeHelper.GetDpi(window);\r\n            var positioned = false;\r\n            // Make sure that position is part of at least one connected screen\r\n            foreach (var monitor in Computer.GetScreens())\r\n            {\r\n                var xTest = (int)(x * dpi.DpiScaleX);\r\n                var yTest = (int)(y * dpi.DpiScaleY);\r\n                if (monitor.WorkingArea.Contains(xTest, yTest))\r\n                {\r\n                    window.Left = x;\r\n                    window.Top = y;\r\n                    positioned = true;\r\n                    break;\r\n                }\r\n                else if (monitor.WorkingArea.Contains(xTest + 8, yTest + 8))\r\n                {\r\n                    // 8 pixel offset is there for cases where a window is maximized using drag to top of the screen.\r\n                    // Window's position is then, for some reason, set with -8,-8 pixel offset which would make constrain check to fail.\r\n                    window.Left = x + 8;\r\n                    window.Top = y + 8;\r\n                    positioned = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (!positioned)\r\n            {\r\n                window.Left = 0;\r\n                window.Top = 0;\r\n            }\r\n        }\r\n\r\n        private void RestoreSizeAndLocation()\r\n        {\r\n            if (!configuration.Positions.ContainsKey(windowName))\r\n            {\r\n                ConstrainWindow((int)window.Left, (int)window.Top);\r\n                return;\r\n            }\r\n\r\n            ignoreChanges = true;\r\n\r\n            try\r\n            {\r\n                var data = configuration.Positions[windowName];\r\n                if (data.Position != null)\r\n                {\r\n                    ConstrainWindow((int)data.Position.X, (int)data.Position.Y);\r\n                }\r\n\r\n                if (saveSize)\r\n                {\r\n                    if (data.Size != null)\r\n                    {\r\n                        // If a window has some constrains set (like min size), then size change event is called when settings new value\r\n                        // which overrides saved data because of Window_SizeChanged callback.\r\n                        var width = data.Size.X;\r\n                        var height = data.Size.Y;\r\n\r\n                        if (width >= window.MinWidth)\r\n                        {\r\n                            window.Width = width;\r\n                        }\r\n\r\n                        if (height >= window.MinHeight)\r\n                        {\r\n                            window.Height = height;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                window.WindowState = data.State;\r\n            }\r\n            finally\r\n            {\r\n                ignoreChanges = false;\r\n            }\r\n        }\r\n\r\n        public bool HasSavedData()\r\n        {\r\n            return configuration.Positions.ContainsKey(windowName);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite/WindowsNotifyIconManager.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Windows.Forms;\n\nnamespace Playnite\n{\n    public static class WindowsNotifyIconManager\n    {\n        public static void Notify(Icon icon, string title, string body, Action clickAction = null)\n        {\n            var notifyIcon = new NotifyIcon\n            {\n                Icon = icon,\n                BalloonTipTitle = title,\n                BalloonTipText = body,\n                Visible = true\n            };\n\n            notifyIcon.BalloonTipClicked += (o, ea) => { clickAction?.Invoke(); notifyIcon.Dispose(); };\n            notifyIcon.BalloonTipClosed += (o, ea) => { notifyIcon.Dispose(); };\n            notifyIcon.ShowBalloonTip(0); // Windows Vista and up timeout is 5sec by default, only Windows Accessibility Settings can override this\n        }\n    }\n}"
  },
  {
    "path": "source/Playnite/crash_reporter.cfg",
    "content": "﻿\n[Config]\nProductName=Playnite\nProductVersion=1.0.0\nAppName=Playnite\nExternalHandler=CefSharp.BrowserSubprocess.exe"
  },
  {
    "path": "source/Playnite/gamecontrollerdb.txt",
    "content": "# Game Controller DB for SDL in 2.0.16 format\n# Source: https://github.com/mdqinc/SDL_GameControllerDB\n\n# Windows\n03000000300f00000a01000000000000,3 In 1 Conversion Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows,\n03000000fa190000918d000000000000,3 In 1 Conversion Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows,\n03000000fa2d00000100000000000000,3dRudder Foot Motion Controller,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows,\n03000000d0160000040d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows,\n03000000d0160000050d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows,\n03000000d0160000060d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows,\n03000000d0160000070d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows,\n03000000d0160000600a000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows,\n03000000c82d00001930000000000000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b11,platform:Windows,\n03000000c82d00000031000000000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000531000000000000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000951000000000000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows,\n03000000008000000210000000000000,8BitDo F30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n030000003512000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000c82d00001028000000000000,8BitDo F30 Arcade Joystick,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000801000000900000000000000,8BitDo F30 Arcade Stick,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00006a28000000000000,8BitDo GameCube,a:b0,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b9,paddle2:b8,rightshoulder:b10,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b1,y:b4,platform:Windows,\n03000000c82d00001251000000000000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00001151000000000000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000150000000000000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000151000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,guide:b2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00002090000000000000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000451000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows,\n03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d0000e002000000000000,8BitDo N30,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b6,platform:Windows,\n03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000290000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,\n03000000c82d00003038000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows,\n03000000c82d00006928000000000000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b11,platform:Windows,\n03000000c82d00002590000000000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n030000003512000012ab000000000000,8BitDo NES30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Windows,\n03000000c82d000012ab000000000000,8BitDo NES30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000022000000090000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000203800000900000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00002038000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000851000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000360000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000361000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000660000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000960000000000000,8BitDo Pro 3,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000131000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000231000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000331000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000431000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00002867000000000000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b10,x:b3,y:b4,platform:Windows,\n03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000060000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000061000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000102800000900000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d000021ab000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00003028000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n030000003512000020ab000000000000,8BitDo SN30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000351000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a2,rightshoulder:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00006228000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000021000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000260000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00000261000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00001230000000000000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001260000000000000,8BitDo Ultimate 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001b30000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001c30000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001d30000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001530000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001630000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001730000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00000121000000000000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,\n03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,\n03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,\n030000008f0e00001200000000000000,Acme GA02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n03000000c01100000355000000000000,Acrux,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000fa190000f0ff000000000000,Acteck AGJ 3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000d1180000402c000000000000,ADT1,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a3,rightx:a2,righty:a5,x:b3,y:b4,platform:Windows,\n030000006f0e00008801000000000000,Afterglow Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001401000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001402000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001901000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001a01000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001301000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00001302000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00001304000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00001413000000000000,Afterglow Xbox Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00003901000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ab1200000103000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000000f9000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000100000008200000000000000,Akishop Customs PS360,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000007c1800000006000000000000,Alienware Dual Compatible PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000491900001904000000000000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows,\n03000000710100001904000000000000,Amazon Luna Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b8,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b4,rightstick:b7,rightx:a3,righty:a4,start:b6,x:b3,y:b2,platform:Windows,\n0300000008100000e501000000000000,Anbernic Game Pad,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000020500000913000000000000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000373500000710000000000000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000373500004610000000000000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000190e00000110000000000000,Aquaplus Piece,a:b1,b:b0,back:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b2,platform:Windows,\n03000000830500000160000000000000,Arcade,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b4,platform:Windows,\n03000000120c0000100e000000000000,Armor 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000490b00004406000000000000,ASCII Seamic Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n03000000869800002500000000000000,Astro C40 TR PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000a30c00002700000000000000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000050b00000579000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000050b00000679000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000503200000110000000000000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,start:b3,platform:Windows,\n03000000503200000210000000000000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,\n03000000380800001889000000000000,AtGames Legends Gamer Pro,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b14,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000008a3500000102000000000000,Backbone One,a:b4,b:b5,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b10,leftstick:b17,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b18,righttrigger:b13,rightx:a3,righty:a4,start:b15,x:b7,y:b8,platform:Windows,\n030000008a3500000201000000000000,Backbone One,a:b4,b:b5,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b10,leftstick:b17,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b18,righttrigger:b13,rightx:a3,righty:a4,start:b15,x:b7,y:b8,platform:Windows,\n030000008a3500000302000000000000,Backbone One,a:b4,b:b5,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b10,leftstick:b17,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b18,righttrigger:b13,rightx:a3,righty:a4,start:b15,x:b7,y:b8,platform:Windows,\n030000008a3500000402000000000000,Backbone One,a:b4,b:b5,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b10,leftstick:b17,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b18,righttrigger:b13,rightx:a3,righty:a4,start:b15,x:b7,y:b8,platform:Windows,\n03000000e4150000103f000000000000,Batarang,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000d6200000e557000000000000,Batarang PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows,\n030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000ad1b000001f9000000000000,BB 070,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000bc2000005250000000000000,Beitong G3,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a3,righty:a4,start:b15,x:b3,y:b4,platform:Windows,\n030000000d0500000208000000000000,Belkin Nostromo N40,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000bc2000000055000000000000,Betop BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000790000000700000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,\n03000000808300000300000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,\n03000000bc2000006312000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000bc2000006321000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000bc2000006412000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000c01100000555000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000c01100000655000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000006f0e00006401000000000000,BF One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows,\n03000000300f00000202000000000000,Bigben,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a5,righty:a2,start:b7,x:b2,y:b3,platform:Windows,\n030000006b1400000209000000000000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,\n03000000120c0000200e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000210e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000f10e000000000000,Brook PS2 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000310c000000000000,Brook Super Converter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000d81d00000b00000000000000,Buffalo BSGP1601 Series,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows,\n030000005a1c00002400000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows,\n030000005b1c00002400000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows,\n030000005b1c00002500000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows,\n030000006d04000042c2000000000000,ChillStream,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000457500000401000000000000,Cobra,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000b0400003365000000000000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows,\n030000004c050000c505000000000000,CronusMax Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000d814000007cd000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000d8140000cefa000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000260900008888000000000000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a4,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Windows,\n030000003807000002cb000000000000,Cyborg,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000a306000022f6000000000000,Cyborg V.3 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000f806000000a3000000000000,DA Leader,a:b7,b:b6,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b8,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:b3,rightx:a2,righty:a3,start:b12,x:b4,y:b5,platform:Windows,\n030000001a1c00000001000000000000,Datel Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000451300000830000000000000,Defender Game Racer X7,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000791d00000103000000000000,Dual Box Wii,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000004f040000070f000000000000,Dual Power,a:b8,b:b9,back:b4,dpdown:b1,dpleft:b2,dpright:b3,dpup:b0,leftshoulder:b13,leftstick:b6,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b12,rightstick:b7,righttrigger:b15,start:b5,x:b10,y:b11,platform:Windows,\n030000004f04000012b3000000000000,Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n030000004f04000020b3000000000000,Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n03000000bd12000002e0000000000000,Dual Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows,\n03000000ff1100003133000000000000,DualForce,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b1,platform:Windows,\n030000006f0e00003001000000000000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000fc0400000250000000000000,Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n03000000bc2000000091000000000000,EasySMX Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000006e0500000a20000000000000,Elecom DUX60 MMO,a:b2,b:b3,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b14,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b15,righttrigger:b13,rightx:a3,righty:a4,start:b20,x:b0,y:b1,platform:Windows,\n03000000b80500000410000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,\n03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,\n03000095090000010000000000000000,Elecom JC-U609,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b8,x:b3,y:b4,platform:Windows,\n0300004112000000e500000000000000,Elecom JC-U909Z,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b8,x:b3,y:b4,platform:Windows,\n03000041120000001050000000000000,Elecom JC-U911,a:b1,b:b2,back:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b0,x:b4,y:b5,platform:Windows,\n030000006e0500000520000000000000,Elecom P301U PlayStation Controller Adapter,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,\n03000000250900000218000000000000,Elecom PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000411200004450000000000000,Elecom U1012,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,\n030000006e0500000320000000000000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,\n030000006e0500000e20000000000000,Elecom U3912T,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,\n030000006e0500000f20000000000000,Elecom U4013S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,\n030000006e0500001320000000000000,Elecom U4113,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006e0500001020000000000000,Elecom U4113S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows,\n030000006e0500000720000000000000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,\n030000007d0400000640000000000000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Windows,\n03000000120c0000f61c000000000000,Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000430b00000300000000000000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000062000001801000000000000,EMS TrioLinker Plus II,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Windows,\n03000000242f000000b7000000000000,ESM 9110,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows,\n03000000101c0000181c000000000000,Essential,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b4,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,\n03000000341a00000108000000000000,EXEQ RF Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000006f0e00008401000000000000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00008101000000000000,Faceoff Deluxe Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00008001000000000000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000021000000090000000000000,FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,\n0300000011040000c600000000000000,FC801,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n03000000852100000201000000000000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000ad1b000028f0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b00002ef0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000038f0000000000000,Fightpad TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,\n03005036852100000000000000000000,Final Fantasy XIV Online Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000f806000001a3000000000000,Firestorm,a:b9,b:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b10,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b12,x:b8,y:b4,platform:Windows,\n03000000b50700000399000000000000,Firestorm 2,a:b2,b:b4,back:b10,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,righttrigger:b9,start:b11,x:b3,y:b5,platform:Windows,\n03000000b50700001302000000000000,Firestorm D3,a:b0,b:b2,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,x:b1,y:b3,platform:Windows,\n03000000b40400001024000000000000,Flydigi Apex,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000151900004000000000000000,Flydigi Vader 2,a:b27,b:b26,back:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b23,leftstick:b17,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b22,rightstick:b16,righttrigger:b20,rightx:a3,righty:a4,start:b18,x:b25,y:b24,platform:Windows,\n03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b14,paddle1:b4,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Windows,\n03000000b40400001224000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n030000008305000000a0000000000000,G08XU,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b5,x:b2,y:b3,platform:Windows,\n0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows,\n03000000260900002625000000000000,GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows,\n03000000341a000005f7000000000000,GameCube Controller,a:b2,b:b3,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b1,y:b0,platform:Windows,\n03000000430b00000500000000000000,GameCube Controller,a:b0,b:b2,dpdown:b10,dpleft:b8,dpright:b9,dpup:b11,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a3,rightx:a5,righty:a2,start:b7,x:b1,y:b3,platform:Windows,\n03000000790000004718000000000000,GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n03000000790000004618000000000000,GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n030000008f0e00000d31000000000000,Gamepad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000ac0500003d03000000000000,GameSir G3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000ac0500005b05000000000000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000ac0500002d02000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000ac0500004d04000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000373500002210000000000000,GameSir G7 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000ac0500001a06000000000000,GameSir T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000373500000410000000000000,GameSir T4 Kaleid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000373500009410000000000000,GameSir Tegenaria Lite,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n030000004c0e00001035000000000000,Gamester,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000000d0f00001110000000000000,GameStick Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n0300000047530000616d000000000000,GameStop,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000b62500000100000000000000,Gametel GT004 01,a:b3,b:b0,dpdown:b10,dpleft:b9,dpright:b8,dpup:b11,leftshoulder:b4,rightshoulder:b5,start:b7,x:b1,y:b2,platform:Windows,\n030000008f0e00001411000000000000,Gamo2 Divaller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000a857000000000000,Gator Claw,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000008305000009a0000000000000,Genius,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000008305000031b0000000000000,Genius Maxfire Blaze 3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000451300000010000000000000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000005c1a00003330000000000000,Genius MaxFire Grandias 12V,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n03000000300f00000b01000000000000,GGE909 Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000f0250000c283000000000000,Gioteck PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000f025000031c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000f0250000c383000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000f0250000c483000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000d11800000094000000000000,Google Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,\n030000004f04000026b3000000000000,GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n0300000079000000d418000000000000,GPD Win,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c6240000025b000000000000,GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000007d0400000840000000000000,Gravis Destroyer Tilt,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,x:b0,y:b3,platform:Windows,\n030000007d0400000540000000000000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n03000000280400000140000000000000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a3,dpup:-a4,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000008f0e00000610000000000000,GreenAsia,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a5,righty:a2,start:b11,x:b3,y:b0,platform:Windows,\n03000000ac0500006b05000000000000,GT2a,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000008a2e0000dd10000000000000,Hand Held Legend GC Ultimate,a:b0,b:b2,back:b17,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,guide:b18,leftshoulder:b10,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b19,misc2:b24,paddle1:b13,paddle2:b12,rightshoulder:b11,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b1,y:b3,platform:Windows,\n030000008a2e0000df10000000000000,Hand Held Legend ProGCC,a:b1,b:b0,back:b17,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,guide:b18,leftshoulder:b10,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b19,paddle1:b13,paddle2:b12,rightshoulder:b11,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b3,y:b2,platform:Windows,\n030000000d0f00004900000000000000,Hatsune Miku Sho PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000001008000001e1000000000000,Havit HV G60,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows,\n030000000d0f00000c00000000000000,HEXT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000d81400000862000000000000,HitBox Edition Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,\n03000000632500002605000000000000,HJD X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n030000000d0f00000a00000000000000,Hori DOA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f00008500000000000000,Hori Fighting Commander 2016 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002500000000000000,Hori Fighting Commander 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000000d0f00008400000000000000,Hori Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006201000000000000,Hori Fighting Commander Octa,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006401000000000000,Hori Fighting Commander Octa,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f00005100000000000000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00008600000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f0000ba00000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f00008800000000000000,Hori Fighting Stick mini 4 PS3,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows,\n030000000d0f00008700000000000000,Hori Fighting Stick mini 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000000d0f00001000000000000000,Hori Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00003200000000000000,Hori Fightstick 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000c000000000000000,Hori Fightstick 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f00000d00000000000000,Hori Fightstick EX2,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000000d0f00003701000000000000,Hori Fightstick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Windows,\n030000000d0f00004000000000000000,Hori Fightstick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002100000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002700000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000a000000000000000,Hori Grip TAC4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b13,x:b0,y:b3,platform:Windows,\n030000000d0f0000a500000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000000d0f0000a600000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000000d0f00000101000000000000,Hori Mini Hatsune Miku FT,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00003801000000000000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Windows,\n030000000d0f00009200000000000000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002301000000000000,Hori PS4 Controller Light,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n030000000d0f00001100000000000000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00002600000000000000,Hori Real Arcade Pro 3P,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00004b00000000000000,Hori Real Arcade Pro 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00008a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00008b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006f00000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00007000000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00003d00000000000000,Hori Real Arcade Pro N3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b4,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b6,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000ae00000000000000,Hori Real Arcade Pro N4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f00008c00000000000000,Hori Real Arcade Pro P4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f0000aa00000000000000,Hori Real Arcade Pro S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000d800000000000000,Hori Real Arcade Pro S,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows,\n030000000d0f00002200000000000000,Hori Real Arcade Pro V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005b00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005c00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000af00000000000000,Hori Real Arcade Pro VHS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00001b00000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000002f5000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Windows,\n030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000c900000000000000,Hori Taiko Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006400000000000000,Horipad 3TP,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00001300000000000000,Horipad 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006e00000000000000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f00006600000000000000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000000d0f00004200000000000000,Horipad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000ad1b000001f5000000000000,Horipad EXT2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000c100000000000000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000000d0f0000f600000000000000,Horipad Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000000d0f00000202000000000000,Horipad O Nintendo Switch 2 Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,misc2:b14,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,\n030000000d0f00006700000000000000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000000d0f00009601000000000000,Horipad Steam,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc2:b2,paddle1:b5,paddle2:b15,paddle3:b18,paddle4:b19,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n030000000d0f0000dc00000000000000,Horipad Switch,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000242e00000b20000000000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Windows,\n03000000242e0000ff0b000000000000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Windows,\n03000000790000004e95000000000000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Windows,\n03000000242e00006a48000000000000,Hyperkin RetroN Sq,a:b3,b:b7,back:b5,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b0,rightshoulder:b1,start:b4,x:b2,y:b6,platform:Windows,\n03000000242f00000a20000000000000,Hyperkin Scout,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,\n03000000242e00000a20000000000000,Hyperkin Scout Premium SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,\n03000000242e00006a38000000000000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Windows,\n03000000f00300008d04000000000000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:-a2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:+a5,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000d81d00000e00000000000000,iBuffalo AC02 Arcade Joystick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows,\n03000000d81d00000f00000000000000,iBuffalo BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000d81d00001000000000000000,iBuffalo BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000005c0a00000285000000000000,iDroidCon,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b6,platform:Windows,\n03000000696400006964000000000000,iDroidCon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000511d00000230000000000000,iGUGU Gamecore,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b1,leftstick:b4,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b2,platform:Windows,\n03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n030000006f0e00002401000000000000,Injustice Fightstick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n03000000830500005130000000000000,InterAct ActionPad,a:b0,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n03000000ef0500000300000000000000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows,\n03000000fd0500000230000000000000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows,\n03000000fd0500000030000000000000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows,\n03000000fd0500003902000000000000,InterAct Hammerhead,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,rightshoulder:b7,rightstick:b5,righttrigger:b9,start:b10,x:b0,y:b1,platform:Windows,\n03000000fd0500002a26000000000000,InterAct Hammerhead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows,\n03000000fd0500002f26000000000000,InterAct Hammerhead FX,a:b4,b:b5,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b1,y:b2,platform:Windows,\n03000000fd0500005302000000000000,InterAct ProPad,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows,\n03000000ac0500002c02000000000000,Ipega Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000491900000204000000000000,Ipega PG9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000491900000304000000000000,Ipega PG9087,+righty:+a5,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows,\n030000007e0500000620000000000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows,\n030000007e0500000720000000000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,\n03000000250900000017000000000000,Joypad Adapter,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows,\n03000000bd12000003c0000000000000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000ff1100004033000000000000,JPD FFB,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a2,start:b15,x:b3,y:b0,platform:Windows,\n03000000242f00002d00000000000000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000242f00008a00000000000000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,\n03000000c4100000c082000000000000,KADE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000828200000180000000000000,Keio,a:b4,b:b5,back:b8,leftshoulder:b2,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b1,platform:Windows,\n03000000790000000200000000000000,King PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,\n03000000bd12000001e0000000000000,Leadership,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n030000006f0e00000103000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00000104000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000008f0e00001300000000000000,Logic3,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000006d040000d1ca000000000000,Logitech ChillStream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d040000d2ca000000000000,Logitech Cordless Precision,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d04000011c2000000000000,Logitech Cordless Wingman,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,platform:Windows,\n030000006d04000016c2000000000000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d0400001dc2000000000000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006d04000018c2000000000000,Logitech F510,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d0400001ec2000000000000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006d04000019c2000000000000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006d0400001ac2000000000000,Logitech Precision,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000006d04000009c2000000000000,Logitech WingMan,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,\n030000006d0400000bc2000000000000,Logitech WingMan Action Pad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:a5~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:a2~,start:b8,x:b3,y:b4,platform:Windows,\n030000006d0400000ac2000000000000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows,\n03000000380700005645000000000000,Lynx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000222200006000000000000000,Macally,a:b1,b:b2,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700003888000000000000,Mad Catz Arcade Fightstick TE S Plus PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008532000000000000,Mad Catz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700006352000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700006652000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700005032000000000000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700005082000000000000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000380700008031000000000000,Mad Catz FightStick Alpha PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000003807000038b7000000000000,Mad Catz Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700008433000000000000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008483000000000000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000380700008134000000000000,Mad Catz Fightstick TE2 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008184000000000000,Mad Catz Fightstick TE2 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000380700006252000000000000,Mad Catz Micro CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008232000000000000,Mad Catz PlayStation Brawlpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008731000000000000,Mad Catz PlayStation Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000003807000056a8000000000000,Mad Catz PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700001888000000000000,Mad Catz SFIV Fightstick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000380700008081000000000000,Mad Catz SFV Arcade Fightstick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000380700001847000000000000,Mad Catz Street Fighter 4 Xbox 360 FightStick,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,\n030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows,\n030000008f0e00001330000000000000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000242f00003700000000000000,Mayflash F101,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n03000000242f00003900000000000000,Mayflash F300 Elite Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000004318000000000000,Mayflash GameCube Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,\n0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000242f0000f500000000000000,Mayflash N64 Adapter,a:b2,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a5,start:b9,platform:Windows,\n03000000242f0000f400000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a5,start:b9,platform:Windows,\n03000000790000007918000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows,\n030000008f0e00001030000000000000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,\n03000000790000000318000000000000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,\n03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000002418000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows,\n0300000079000000ae18000000000000,Mega Drive Controller,a:b0,b:b1,back:b7,dpdown:b14,dpleft:b15,dpright:b13,dpup:b2,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n03000000c0160000990a000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,righttrigger:b2,start:b3,platform:Windows,\n030000005e0400002800000000000000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Windows,\n030000005e0400000300000000000000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,\n030000005e0400000700000000000000,Microsoft SideWinder,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n030000005e0400000e00000000000000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b8,x:b3,y:b4,platform:Windows,\n030000005e0400002700000000000000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Windows,\n03000000280d00000202000000000000,Miller Lite Cantroller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b5,x:b2,y:b3,platform:Windows,\n03000000ad1b000023f0000000000000,MLG,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a6,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000ad1b00003ef0000000000000,MLG Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700006382000000000000,MLG PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000004523000015e0000000000000,Mobapad Chitu HD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000491900000904000000000000,Mobapad Chitu HD,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000ffff00000000000000000000,Mocute M053,a:b3,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b11,leftstick:b7,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b6,righttrigger:b4,rightx:a3,righty:a4,start:b8,x:b1,y:b0,platform:Windows,\n03000000d6200000e589000000000000,Moga 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows,\n03000000d62000007162000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows,\n03000000d6200000ad0d000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c62400002a89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c62400002b89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c62400001a89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c62400001b89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000091200004488000000000000,MUSIA PlayStation 2 Input Display,a:b0,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b7,righttrigger:b11,rightx:a2,righty:a3,start:b5,x:b1,y:b3,platform:Windows,\n03000000f70600000100000000000000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Windows,\n03000000c9110000f055000000000000,Nacon GC100XF,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000c21100000791000000000000,Nacon GC101 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000006b140000010c000000000000,Nacon GC400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000006b1400001106000000000000,Nacon Revolution 3 PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n0300000085320000170d000000000000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n0300000085320000190d000000000000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000006b140000100d000000000000,Nacon Revolution Infinity PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000006b140000080d000000000000,Nacon Revolution Unlimited Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000bd12000001c0000000000000,Nebular,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000eb0300000000000000000000,NeGcon Adapter,a:a2,b:b13,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,lefttrigger:a4,leftx:a1,righttrigger:b11,start:b3,x:a3,y:b12,platform:Windows,\n0300000038070000efbe000000000000,NEO SE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n0300000092120000474e000000000000,NeoGeo X Arcade Stick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b3,y:b2,platform:Windows,\n03000000921200004b46000000000000,NES 2 port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows,\n03000000000f00000100000000000000,NES Controller,a:b1,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows,\n03000000921200004346000000000000,NES Controller,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows,\n03000000790000004518000000000000,NEXILUX GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Windows,\n03000000050b00000045000000000000,Nexus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Windows,\n03000000152000000182000000000000,NGDS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows,\n03000000ec110000e1a7000000000000,Nintendo Switch,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000007e0500006920000000000000,Nintendo Switch 2 Pro Controller,a:b0,b:b1,back:b14,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b12,leftstick:b15,lefttrigger:b13,leftx:a0,lefty:a1~,misc1:b17,misc2:b20,paddle1:b18,paddle2:b19,rightshoulder:b4,rightstick:b7,righttrigger:b5,rightx:a2,righty:a3~,start:b6,x:b2,y:b3,platform:Windows,\n030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Windows,\n030000007e0500007320000000000000,NSO GameCube Controller,a:b1,b:b3,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b13,lefttrigger:b12,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b4,rightx:a2,righty:a3~,start:b6,x:b0,y:b2,platform:Windows,\n030000007e0500001920000000000000,NSO N64 Controller,+rightx:b8,+righty:b2,-rightx:b3,-righty:b7,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Windows,\n030000007e0500001720000000000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Windows,\n03000000550900001472000000000000,NVIDIA Controller,a:b11,b:b10,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b5,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b4,righttrigger:a5,rightx:a3,righty:a6,start:b3,x:b9,y:b8,platform:Windows,\n03000000550900001072000000000000,NVIDIA Shield,a:b9,b:b8,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b3,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b2,righttrigger:a4,rightx:a2,righty:a5,start:b0,x:b7,y:b6,platform:Windows,\n030000005509000000b4000000000000,NVIDIA Virtual,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000120c00000288000000000000,Nyko Air Flo Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000004b120000014d000000000000,NYKO Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n03000000d62000001d57000000000000,Nyko Airflo PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000791d00000900000000000000,Nyko Playpad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000782300000a10000000000000,Onlive Controller,a:b15,b:b14,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b11,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b13,y:b12,platform:Windows,\n030000000d0f00000401000000000000,Onyx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000008916000001fd000000000000,Onza CE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a3,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000008916000000fd000000000000,Onza TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000d62000006d57000000000000,OPP PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006b14000001a1000000000000,Orange Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,\n0300000009120000072f000000000000,OrangeFox86 DreamPicoPort,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:-a2,leftx:a0,lefty:a1,righttrigger:-a5,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000362800000100000000000000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows,\n03000000120c0000f60e000000000000,P4 Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000002201000000000000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000006f0e00008501000000000000,PDP Fightpad Pro GameCube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000006f0e00000901000000000000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00008901000000000000,PDP Realmz Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000008f0e00004100000000000000,PlaySega,a:b1,b:b0,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b4,y:b3,platform:Windows,\n03000000d620000011a7000000000000,PowerA Core Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000dd62000015a7000000000000,PowerA Fusion Nintendo Switch Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d620000012a7000000000000,PowerA Fusion Nintendo Switch Fight Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000dd62000016a7000000000000,PowerA Fusion Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d620000013a7000000000000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d62000003340000000000000,PowerA OPS Pro Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000d62000002640000000000000,PowerA OPS Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n0300000062060000d570000000000000,PowerA PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d620000014a7000000000000,PowerA Spectra Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d04000084ca000000000000,Precision,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000c62400001a53000000000000,Pro Ex Mini,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000d62000009f31000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d6200000c757000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000110e000000000000,Pro5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000100800000100000000000000,PS1 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n030000008f0e00007530000000000000,PS1 Controller,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b1,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000100800000300000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000250900000088000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000250900006888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b6,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000151a00006222000000000000,PS2 Dual Plus Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000120a00000100000000000000,PS3 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000120c00001307000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c00001cf1000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c0000f90e000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000250900000118000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows,\n030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows,\n030000004f1f00000800000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows,\n03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows,\n030000008f0e00000300000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,\n030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000ba2200002010000000000000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Windows,\n03000000120c00000807000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000111e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000121e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000130e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000150e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000180e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000181e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000191e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000f51c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120c0000f70e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000120e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000160e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000001a1e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000004c0500005f0e000000000000,PS5 Access Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000004c050000f20d000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000830500005020000000000000,PSX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Windows,\n03000000300f00000111000000000000,Qanba 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00000211000000000000,Qanba 2P,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000300f00000011000000000000,Qanba Arcade Stick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,platform:Windows,\n03000000300f00001611000000000000,Qanba Arcade Stick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows,\n03000000222c00000025000000000000,Qanba Dragon Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000222c00000020000000000000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00001211000000000000,Qanba Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00001210000000000000,Qanba Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,\n03000000341a00000104000000000000,Qanba Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows,\n03000000222c00000223000000000000,Qanba Obsidian Arcade Stick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000222c00000023000000000000,Qanba Obsidian Arcade Stick PS4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000008a2400006682000000000000,R1 Mobile Controller,a:b3,b:b1,back:b7,leftx:a0,lefty:a1,start:b6,x:b4,y:b0,platform:Windows,\n03000000086700006626000000000000,RadioShack,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,\n03000000ff1100004733000000000000,Ramox FPS Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows,\n030000009b2800002300000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows,\n030000009b2800006900000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows,\n030000009b2800000800000000000000,Raphnet Dreamcast Adapter,a:b2,b:b1,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,lefttrigger:a2,leftx:a0,righttrigger:a3,righty:a1,start:b3,x:b10,y:b9,platform:Windows,\n030000009b280000d000000000000000,Raphnet Dreamcast Adapter,a:b1,b:b0,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,lefttrigger:+a5,leftx:a0,lefty:a1,righttrigger:+a2,start:b3,x:b5,y:b4,platform:Windows,\n030000009b2800006200000000000000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,\n030000009b2800003200000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,\n030000009b2800006000000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,\n030000009b2800001800000000000000,Raphnet Jaguar Adapter,a:b2,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b10,start:b3,x:b11,y:b12,platform:Windows,\n030000009b2800003c00000000000000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Windows,\n030000009b2800006100000000000000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Windows,\n030000009b2800006300000000000000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Windows,\n030000009b2800006400000000000000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Windows,\n030000009b2800000200000000000000,Raphnet NES Adapter,a:b7,b:b6,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b4,platform:Windows,\n030000009b2800004400000000000000,Raphnet PS1 and PS2 Adapter,a:b1,b:b2,back:b5,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b9,rightx:a3,righty:a4,start:b4,x:b0,y:b3,platform:Windows,\n030000009b2800004300000000000000,Raphnet Saturn,a:b0,b:b1,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,\n030000009b2800000500000000000000,Raphnet Saturn Adapter 2.0,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,\n030000009b2800000300000000000000,Raphnet SNES Adapter,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows,\n030000009b2800002600000000000000,Raphnet SNES Adapter,a:b1,b:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows,\n030000009b2800002e00000000000000,Raphnet SNES Adapter,a:b1,b:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows,\n030000009b2800002f00000000000000,Raphnet SNES Adapter,a:b1,b:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows,\n030000009b2800005600000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows,\n030000009b2800005700000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows,\n030000009b2800001e00000000000000,Raphnet Vectrex Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a1,lefty:a2,x:b2,y:b3,platform:Windows,\n030000009b2800002b00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,\n030000009b2800002c00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,\n030000009b2800008000000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows,\n03000000790000008f18000000000000,Rapoo Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,\n0300000032150000a602000000000000,Razer Huntsman V3 Pro,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b12,dpright:b13,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000f8270000bf0b000000000000,Razer Kishi,a:b6,b:b7,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b18,leftshoulder:b12,leftstick:b19,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b13,rightstick:b20,righttrigger:b15,rightx:a3,righty:a4,start:b17,x:b9,y:b10,platform:Windows,\n03000000321500000204000000000000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000321500000010000000000000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000321500000710000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000a10000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000410000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000910000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000321500000011000000000000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000921200004547000000000000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b6,x:b3,y:b4,platform:Windows,\n03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,\n03000000830500006020000000000000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,\n03000000632500007805000000000000,Retro Fighters Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n0300000003040000c197000000000000,Retrode Adapter,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows,\n03000000bd12000013d0000000000000,Retrolink Sega Saturn Classic Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,lefttrigger:b6,rightshoulder:b2,righttrigger:b7,start:b8,x:b3,y:b4,platform:Windows,\n03000000bd12000015d0000000000000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Windows,\n0300000000f000000300000000000000,RetroUSB RetroPad,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows,\n0300000000f00000f100000000000000,RetroUSB Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows,\n03000000830500000960000000000000,Revenger,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b5,platform:Windows,\n030000006b140000010d000000000000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000006b140000020d000000000000,Revolution Pro Controller 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000006b140000130d000000000000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001f01000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00004601000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c6240000fefa000000000000,Rock Candy Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00008701000000000000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000830500007030000000000000,Rockfire Space Ranger,a:b0,b:b1,back:b5,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b9,righttrigger:b8,start:b2,x:b3,y:b4,platform:Windows,\n03000000050b0000e318000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n03000000050b0000e518000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n03000000050b00005819000000000000,ROG Chakram Core,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n03000000050b0000181a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n03000000050b00001a1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n03000000050b00001c1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows,\n030000004f04000001d0000000000000,Rumble Force,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n030000000d0f0000ad00000000000000,RX Gamepad,a:b0,b:b4,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b6,start:b9,x:b2,y:b1,platform:Windows,\n030000008916000000fe000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c6240000045d000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e00001311000000000000,Saffun Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Windows,\n03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000a306000023f6000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00001201000000000000,Saitek Dual Analog,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n03000000a30600000701000000000000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Windows,\n03000000a30600000cff000000000000,Saitek P2500 Force Rumble,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b0,y:b1,platform:Windows,\n03000000a30600000d5f000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Windows,\n03000000a30600000dff000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b8,x:b0,y:b3,platform:Windows,\n03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000a306000018f5000000000000,Saitek P3200,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00001001000000000000,Saitek P480 Rumble,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n03000000a30600000901000000000000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b5,rightx:a3,righty:a2,x:b0,y:b1,platform:Windows,\n03000000a30600000b04000000000000,Saitek P990,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows,\n03000000a30600002106000000000000,Saitek PS1000 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000a306000020f6000000000000,Saitek PS2700 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000300f00001101000000000000,Saitek Rumble,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n03000000e804000000a0000000000000,Samsung EIGP20,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000c01100000252000000000000,Sanwa Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n03000000c01100004350000000000000,Sanwa Micro Grip P3,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,x:b3,y:b2,platform:Windows,\n03000000411200004550000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a1,righty:a2,start:b9,x:b1,y:b3,platform:Windows,\n03000000c01100004150000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n03000000c01100004450000000000000,Sanwa Online Grip,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b11,righttrigger:b9,rightx:a3,righty:a2,start:b14,x:b3,y:b4,platform:Windows,\n03000000730700000401000000000000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows,\n030000009d0d00001130000000000000,Sanwa PlayStation Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000830500006120000000000000,Sanwa Smart Grip II,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,x:b1,y:b3,platform:Windows,\n03000000c01100000051000000000000,Satechi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n030000004f04000028b3000000000000,Score A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000a30c00002500000000000000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows,\n03000000a30c00002400000000000000,Sega Mega Drive Mini 6B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000d804000086e6000000000000,Sega Multi Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a2,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,\n0300000000050000289b000000000000,Sega Saturn Adapter,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,\n0300000000f000000800000000000000,Sega Saturn Controller,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b7,righttrigger:b3,start:b0,x:b5,y:b6,platform:Windows,\n03000000730700000601000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,\n03000000b40400000a01000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,\n030000003b07000004a1000000000000,SFX,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Windows,\n03000000632500002705000000000000,ShanWan Q36,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Windows,\n03000000f82100001900000000000000,Shogun Bros Chameleon X1,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000120c00001c1e000000000000,SnakeByte 4S PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000140300000918000000000000,SNES Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n0300000081170000960a000000000000,SNES Controller,a:b4,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b5,y:b1,platform:Windows,\n03000000811700009d0a000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows,\n030000008b2800000300000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows,\n03000000921200004653000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows,\n030000008f0e00000910000000000000,Sony DualShock 2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows,\n03000000317300000100000000000000,Sony DualShock 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000666600006706000000000000,Sony PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows,\n03000000e30500009605000000000000,Sony PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000fe1400002a23000000000000,Sony PlayStation Adapter,a:b0,b:b1,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,x:b2,y:b3,platform:Windows,\n030000004c050000da0c000000000000,Sony PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000632500002306000000000000,Sony PlayStation Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,\n03000000f0250000c183000000000000,Sony PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000d9040000160f000000000000,Sony PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000ff000000cb01000000000000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n030000004c0500003713000000000000,Sony PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,\n03000000341a00000208000000000000,Speedlink 6555,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,platform:Windows,\n03000000341a00000908000000000000,Speedlink 6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000380700001722000000000000,Speedlink Competition Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,x:b2,y:b3,platform:Windows,\n030000008f0e00000800000000000000,Speedlink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000c01100000591000000000000,Speedlink Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000de280000fc11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000de280000ff11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000120c0000160e000000000000,Steel Play Metaltech PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,\n03000000110100003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000381000001814000000000000,SteelSeries Stratus XL,a:b0,b:b1,back:b18,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b19,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b2,y:b3,platform:Windows,\n03000000380700003847000000000000,Street Fighter Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows,\n030000001f08000001e4000000000000,Super Famicom Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows,\n03000000790000000418000000000000,Super Famicom Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n03000000341200001300000000000000,Super Racer,a:b2,b:b3,back:b8,leftshoulder:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b7,x:b0,y:b1,platform:Windows,\n03000000457500002211000000000000,Szmy Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000004f0400000ab1000000000000,T16000M,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b10,x:b2,y:b3,platform:Windows,\n030000000d0f00007b00000000000000,TAC GEAR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000e40a00000307000000000000,Taito Egret II Mini Control Panel,a:b4,b:b2,back:b6,guide:b9,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Windows,\n03000000e40a00000207000000000000,Taito Egret II Mini Controller,a:b4,b:b2,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b9,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Windows,\n03000000d814000001a0000000000000,TE Kitty,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000fa1900000706000000000000,Team 5,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000b50700001203000000000000,Techmobility X6-38V,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n03000000ba2200000701000000000000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b2,platform:Windows,\n03000000c61100001000000000000000,Tencent Xianyou Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows,\n03000000790000001c18000000000000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000790000002601000000000000,TGZ Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,\n03000000591c00002400000000000000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n03000000591c00002600000000000000,THEGamepad,a:b2,b:b1,back:b6,leftx:a0,lefty:a1,start:b7,x:b3,y:b0,platform:Windows,\n030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n030000004f04000023b3000000000000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000004f0400000ed0000000000000,Thrustmaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000004f04000008d0000000000000,Thrustmaster Ferrari 150 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows,\n030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,\n030000004f04000003d0000000000000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000004f04000009d0000000000000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n030000006d04000088ca000000000000,Thunderpad,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000666600000288000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n03000000666600000488000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n030000004f04000007d0000000000000,TMini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000571d00002100000000000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Windows,\n03000000571d00002000000000000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n03000000d62000006000000000000000,Tournament PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000c01100000055000000000000,Tronsmart,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000005f140000c501000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000b80500000210000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows,\n03000000411200000450000000000000,Twin Shock,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows,\n03000000d90400000200000000000000,TwinShock PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000151900005678000000000000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n030000000b0400003065000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,\n03000000242f00006e00000000000000,USB Controller,a:b1,b:b4,back:b10,leftshoulder:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b3,platform:Windows,\n03000000300f00000701000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000341a00002308000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000666600000188000000000000,USB Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,\n030000006b1400000203000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000790000000a00000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,\n03000000b404000081c6000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,\n03000000b50700001503000000000000,USB Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b0,y:b1,platform:Windows,\n03000000bd12000012d0000000000000,USB Controller,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,\n03000000ff1100004133000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000632500002305000000000000,USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,\n03000000882800000305000000000000,V5 Game Pad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,x:b2,y:b3,platform:Windows,\n03000000790000001a18000000000000,Venom PS4 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,\n03000000790000001b18000000000000,Venom PS4 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000006f0e00000302000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n030000006f0e00000702000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,\n0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:a3,righty:a4,start:b4,x:b2,y:b3,platform:Windows,\n03000000120c0000ab57000000000000,Warrior Joypad JS083,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n030000007e0500003003000000000000,Wii U Pro,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b6,leftstick:b11,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b12,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,\n0300000032150000030a000000000000,Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n0300000032150000140a000000000000,Wolverine,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000002e160000efbe000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700001647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700002045000000000000,Xbox 360 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n03000000380700002644000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a5,start:b8,x:b2,y:b3,platform:Windows,\n03000000380700002647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000003807000026b7000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700003647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a7,righty:a5,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400001907000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400009102000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000000fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000001fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b000016f0000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000ad1b00008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c62400000053000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c6240000fdfa000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700002847000000000000,Xbox 360 Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000a102000000000000,Xbox 360 Wireless Receiver,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000120c00000a88000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000120c00001088000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2~,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5~,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000002a0600002000000000000000,Xbox Controller,a:b0,b:b1,back:b13,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b5,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b15,righttrigger:b7,rightx:a2,righty:a5,start:b12,x:b2,y:b3,platform:Windows,\n03000000380700001645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000380700002645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000380700003645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n03000000380700008645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400000202000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000005e0400008502000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e0400008702000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000005e0400008902000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b8,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b9,righttrigger:b4,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,\n030000005e0400000c0b000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000fd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000ff02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e0000a802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000006f0e0000c802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000c62400003a54000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000005e040000130b000000000000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n03000000450c00002043000000000000,Xeox SL6556BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,\n030000006f0e00000300000000000000,XGear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows,\n03000000e0ff00000201000000000000,Xiaomi Black Shark (L),back:b0,dpdown:b11,dpleft:b9,dpright:b10,dpup:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,platform:Windows,\n03000000172700004431000000000000,Xiaomi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,\n03000000172700003350000000000000,Xiaomi XMGP01YM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000bc2000005060000000000000,Xiaomi XMGP01YM,+lefty:+a2,+righty:+a5,-lefty:-a1,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows,\n03000000c0160000e105000000000000,XinMo Dual Arcade,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\nxinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,\n030000007d0400000340000000000000,Xterminator Digital Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:-a4,lefttrigger:+a4,leftx:a0,lefty:a1,paddle1:b7,paddle2:b6,rightshoulder:b5,rightstick:b9,righttrigger:b2,rightx:a3,righty:a5,start:b8,x:b3,y:b4,platform:Windows,\n030000002c3600000100000000000000,Yawman Arrow,+rightx:h0.2,+righty:h0.4,-rightx:h0.8,-righty:h0.1,a:b4,b:b5,back:b6,dpdown:b15,dpleft:b14,dpright:b16,dpup:b13,leftshoulder:b10,leftstick:b0,lefttrigger:-a4,leftx:a0,lefty:a1,paddle1:b11,paddle2:b12,rightshoulder:b8,rightstick:b9,righttrigger:+a4,start:b3,x:b1,y:b2,platform:Windows,\n03000000790000004f18000000000000,ZDT Android Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,\n03000000073500000400000000000000,Zenaim Arcade Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,\n03000000120c00000500000000000000,Zeroplus Adapter,a:b2,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows,\n03000000120c0000101e000000000000,Zeroplus P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,\n\n# Mac OS X\n030000008f0e00000300000009010000,2 In 1 Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000c82d00001930000000000000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Mac OS X,\n03000000c82d00001930000000020000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Mac OS X,\n03000000c82d00001930000001000000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Mac OS X,\n03000000c82d00000031000001000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00000531000000020000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X,\n03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00006a28000000010000,8BitDo GameCube,a:b0,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b9,paddle2:b8,rightshoulder:b10,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b1,y:b4,platform:Mac OS X,\n03000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001251000000020000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001151000000020000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000a30c00002400000006020000,8BitDo M30,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,guide:b9,leftshoulder:b6,lefttrigger:b5,rightshoulder:b4,righttrigger:b7,start:b8,x:b3,y:b0,platform:Mac OS X,\n03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00005106000000010000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,lefttrigger:a5,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00002090000000010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X,\n03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00006928000000010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Mac OS X,\n03000000c82d00002590000000010000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00002590000001000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00002690000000010000,8BitDo NEOGEO,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b10,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000003512000012ab000001000000,8BitDo NES30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d000012ab000001000000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00002028000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000022000000090000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000190000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000660000000020000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000960000000000000,8BitDo Pro 3,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000131000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000231000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000331000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000431000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00003028000000010000,8Bitdo SFC30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000102800000900000000000000,8BitDo SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001290000001000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00004028000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000260000001000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001b30000001000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001d30000001000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001530000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001630000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001730000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001330000000020000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001330000001000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000a00500003232000009010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a31,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000491900001904000001010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Mac OS X,\n03000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X,\n0300000008100000e501000019040000,Anbernic Handheld,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a4,start:b11,x:b4,y:b3,platform:Mac OS X,\n03000000373500004610000001000000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000a30c00002700000003030000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000a30c00002800000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000050b00000579000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b42,paddle1:b9,paddle2:b11,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,\n03000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b23,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,\n03000000503200000110000045010000,Atari VCS Classic,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b3,start:b2,platform:Mac OS X,\n03000000503200000110000047010000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b3,start:b2,platform:Mac OS X,\n03000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000008a3500000102000000010000,Backbone One,a:b0,b:b1,back:b16,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b17,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b15,x:b2,y:b3,platform:Mac OS X,\n030000008a3500000201000000010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000008a3500000202000000010000,Backbone One,a:b0,b:b1,back:b16,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b17,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b15,x:b2,y:b3,platform:Mac OS X,\n030000008a3500000402000000010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000008a3500000302000000010000,Backbone One PlayStation Edition,a:b0,b:b1,back:b16,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b17,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b15,x:b2,y:b3,platform:Mac OS X,\n03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,\n03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n03000000120c0000200e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n03000000120c0000210e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000d8140000cecf000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X,\n03000000a306000022f6000001030000,Cyborg V3 Rumble Pad PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000791d00000103000009010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000006e0500000720000010020000,Elecom JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Mac OS X,\n030000006f0e00008401000003010000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000151900004000000001000000,Flydigi Vader 2,a:b14,b:b15,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Mac OS X,\n03000000b40400001124000001040000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000b40400001224000003030000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000790000004618000000010000,GameCube Controller Adapter,a:b4,b:b0,dpdown:b56,dpleft:b60,dpright:b52,dpup:b48,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X,\n03000000ac0500001a06000002020000,GameSir T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000373500000411000023000000,GameSir X4A Xbox Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000006f0e00000102000000000000,GameStop Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000ff1100003133000007010000,GameWare PC Control Pad,a:b2,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Mac OS X,\n03000000d11800000094000000010000,Google Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,\n030000007d0400000540000001010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000280400000140000000020000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000008f0e00000300000007010000,GreenAsia Joystick,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Mac OS X,\n030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00005f00000000010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00008400000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00008500000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000341a00000302000014010000,Hori Fighting Stick Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00008800000000010000,Hori Fighting Stick mini 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00008700000000010000,Hori Fighting Stick mini 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X,\n030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f0000aa00000072050000,Hori Real Arcade Pro for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000000d0f00000002000017010000,Hori Split Pad Fit,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00000002000015010000,Hori Switch Split Pad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00006e00000000010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000000d0f00006600000000000000,Horipad FPS Plus 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000000d0f0000c100000072050000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000242e0000ff0b000000010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Mac OS X,\n03000000790000004e95000000010000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Mac OS X,\n03000000830500006020000000000000,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X,\n03000000ef0500000300000000020000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X,\n03000000fd0500000030000010010000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Mac OS X,\n030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000242f00002d00000007010000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000006d04000019c2000000000000,Logitech Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000019c2000000020000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000016c2000000020000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000016c2000000030000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000016c2000014040000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000016c2000000000000,Logitech F310,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000018c2000000000000,Logitech F510,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d04000019c2000005030000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000006d04000018c2000000010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000380700005032000000010000,Mad Catz PS3 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n0300000049190000020400001b010000,Manba One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b22,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000790000000600000007010000,Marvo GT-004,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000008f0e00001330000011010000,Mayflash Controller Adapter,a:b2,b:b4,back:b16,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b12,lefttrigger:b16,leftx:a0,lefty:a2,rightshoulder:b14,rightx:a6~,righty:a4,start:b18,x:b0,y:b6,platform:Mac OS X,\n03000000790000004318000000010000,Mayflash GameCube Adapter,a:b4,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X,\n03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X,\n0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000008f0e00001030000011010000,Mayflash Saturn Adapter,a:b0,b:b2,dpdown:b28,dpleft:b30,dpright:b26,dpup:b24,leftshoulder:b10,lefttrigger:b14,rightshoulder:b12,righttrigger:b4,start:b18,x:b6,y:b8,platform:Mac OS X,\n0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X,\n03000000790000000318000000010000,Mayflash Wii DolphinBar,a:b8,b:b12,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b44,leftshoulder:b16,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b4,platform:Mac OS X,\n03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X,\n03000000790000000018000000010000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X,\n030000005e0400002800000002010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Mac OS X,\n030000005e0400000300000006010000,Microsoft SideWinder,a:b0,b:b1,back:b9,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Mac OS X,\n030000005e0400000700000006010000,Microsoft SideWinder,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Mac OS X,\n030000005e0400002700000001010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Mac OS X,\n030000004523000015e0000072050000,Mobapad Chitu HD,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X,\n03000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c62400002b89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000853200008906000000010000,Nacon Revolution X Unlimited,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000632500007505000000020000,NeoGeo mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000921200004b46000003020000,NES 2-port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Mac OS X,\n030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000ec110000e1a7000001010000,Nintendo Switch,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n030000007e0500006920000001010000,Nintendo Switch 2 Pro Controller,a:b0,b:b1,back:b14,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b12,leftstick:b15,lefttrigger:b13,leftx:a0,lefty:a1~,misc1:b17,misc2:b20,paddle1:b18,paddle2:b19,rightshoulder:b4,rightstick:b7,righttrigger:b5,rightx:a2,righty:a3~,start:b6,x:b2,y:b3,platform:Mac OS X,\n030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n030000007e0500000920000010020000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:Mac OS X,\n050000007e05000009200000ff070000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:Mac OS X,\n030000007e0500007320000001010000,NSO GameCube Controller,a:b1,b:b3,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b13,lefttrigger:b12,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b4,rightx:a2,righty:a3~,start:b6,x:b0,y:b2,platform:Mac OS X,\n030000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Mac OS X,\n030000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000550900001472000025050000,NVIDIA Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Mac OS X,\n030000004b120000014d000000010000,Nyko Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Mac OS X,\n0300000009120000072f000000010000,OrangeFox86 DreamPicoPort,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a2,leftx:a0,lefty:a1,righttrigger:a5,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000006f0e00000901000002010000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000008f0e00000300000000000000,Piranha Xtreme PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000d620000011a7000000020000,PowerA Core Plus Gamecube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000d620000011a7000010050000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000100800000300000006010000,PS2 Adapter,a:b2,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,\n030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,\n030000004c0500006802000072050000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,\n030000004c050000a00b000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n0300004b4c0500005f0e000000010000,PS5 Access Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000005e040000e002000001000000,PXN P30 Pro Mobile,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X,\n03000000222c00000225000000010000,Qanba Dragon Arcade Joystick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000222c00000020000000010000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000009b2800005600000020020000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Mac OS X,\n030000009b2800008000000022020000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Mac OS X,\n030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000321500000204000000010000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000321500000104000000010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n03000000321500000010000000010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000321500000011000000010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,\n030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,\n0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000632500008005000000010000,Redgear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000632500002305000000010000,Redragon Saturn,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000921200004547000000020000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b2,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,lefttrigger:b14,rightshoulder:b10,righttrigger:b4,start:b12,x:b6,y:b8,platform:Mac OS X,\n03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000790000001100000005010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000830500006020000000010000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Mac OS X,\n0300000003040000c197000000000000,Retrode Adapter,a:b0,b:b4,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Mac OS X,\n03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Mac OS X,\n030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000004c0500006802000002100000,Rii RK707,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b3,righttrigger:b9,rightx:a2,righty:a3,start:b1,x:b15,y:b12,platform:Mac OS X,\n030000006f0e00008701000005010000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000c6240000fefa000000000000,Rock Candy PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000e804000000a000001b010000,Samsung EIGP20,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b11,leftx:a1,lefty:a3,rightshoulder:b12,rightx:a4,righty:a5,start:b16,x:b7,y:b9,platform:Mac OS X,\n03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Mac OS X,\n03000000a30c00002500000006020000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Mac OS X,\n03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X,\n03000000b40400000a01000000000000,Sega Saturn,a:b0,b:b1,back:b5,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X,\n030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,\n0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X,\n030000004c050000a00b000000000000,Sony DualShock 4 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n03000000666600006706000088020000,Sony PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Mac OS X,\n030000004c050000da0c000000010000,Sony PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n030000004c0500003713000000010000,Sony PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000110100002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X,\n03000000110100002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X,\n03000000381000002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X,\n05000000484944204465766963650000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X,\n050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X,\n03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000110100001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X,\n03000000110100001714000020010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X,\n030000000d0f0000f600000000010000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,\n03000000457500002211000000010000,SZMY Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000e40a00000307000001000000,Taito Egret II Mini Control Panel,a:b4,b:b2,back:b6,guide:b9,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Mac OS X,\n03000000e40a00000207000001000000,Taito Egret II Mini Controller,a:b4,b:b2,back:b6,guide:b9,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Mac OS X,\n03000000790000001c18000000010000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000790000001c18000003100000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000591c00002400000021000000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X,\n03000000591c00002600000021000000,THEGamepad,a:b2,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Mac OS X,\n030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X,\n030000004f0400000ed0000000020000,Thrustmaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X,\n03000000571d00002100000021000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Mac OS X,\n03000000bd12000015d0000000010000,Tomee Retro Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000bd12000015d0000000000000,Tomee SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000571d00002000000021000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X,\n030000005f140000c501000000020000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,\n03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X,\n03000000632500002605000000010000,Uberwith Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000c0160000e105000000040000,Ultimate Atari Fight Stick,a:b2,b:b4,back:b18,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,rightshoulder:b8,righttrigger:b10,start:b16,x:b0,y:b6,platform:Mac OS X,\n03000000151900005678000010010000,Uniplay U6,a:b3,b:b6,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,leftstick:b31,lefttrigger:b21,leftx:a1,lefty:a3,rightshoulder:b19,rightstick:b33,righttrigger:b23,rightx:a4,righty:a5,start:b27,x:b11,y:b13,platform:Mac OS X,\n030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,\n050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X,\n050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X,\n030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e0400008e02000010010000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4~,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000006f0e00000104000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n03000000c6240000045d000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000050b000003090000,Xbox Elite Controller Series 2,a:b0,b:b1,back:b31,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b53,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000200b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000200b000013050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000200b000015050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X,\n030000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X,\n030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000220b000013050000,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X,\n03000000c62400003a54000000000000,Xbox One PowerA Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,\n030000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000007050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000130b000022050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000220b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n030000005e040000220b000021050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X,\n03000000120c0000100e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n03000000120c0000101e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,\n\n# Linux\n03000000c82d00001930000011010000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux,\n05000000c82d00001930000001000000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux,\n03000000c82d00000031000011010000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000631000000010000,8BitDo Adapter 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux,\n03000000021000000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00006a28000000010000,8BitDo GameCube,a:b0,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b9,paddle2:b8,rightshoulder:b10,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b1,y:b4,platform:Linux,\n03000000c82d00001251000011010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00001151000011010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000a20000000020000,8BitDo M30 Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux,\n03000000c82d00002090000011010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00002090000000010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux,\n03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00006928000011010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux,\n05000000c82d00006928000000010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux,\n05000000c82d00002590000001000000,8BitDo NEOGEO,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,\n05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux,\n03000000022000000090000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000190000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00002038000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00001030000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000020000000000000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n06000000c82d00000020000006010000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c82d00000960000011010000,8BitDo Pro 3,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000431000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Linux,\n03000000c82d00000060000011010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00000061000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n030000003512000012ab000010010000,8BitDo SFC30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux,\n030000003512000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n05000000102800000900000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00003028000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00000260000011010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000a31000014010000,8BitDo Ultimate 2C,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c82d00001d30000011010000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000c82d00001b30000001000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001530000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001630000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001730000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000631000010010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c82d00000631000014010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c82d00000760000011010000,8BitDo Ultimate Wireless,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c82d00001230000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001330000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00000121000011010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000c82d00000121000000010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,\n05000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,\n03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux,\n05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,\n03000000c01100000355000011010000,Acrux Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00008801000011010000,Afterglow Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00003901000013020000,Afterglow Prismatic Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00001302000000010000,Afterglow Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00003901000020060000,Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000100000008200000011010000,Akishop Customs PS360,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000007c1800000006000010010000,Alienware Dual Compatible Game PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Linux,\n05000000491900000204000021000000,Amazon Fire Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000491900001904000011010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux,\n05000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,\n0300000008100000e501000001010000,Anbernic Handheld,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a4,start:b11,x:b3,y:b4,platform:Linux,\n03000000020500000913000010010000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000373500000710000010010000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000373500004610000001000000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000190e00000110000010010000,Aquaplus Piece,a:b1,b:b0,back:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b2,platform:Linux,\n03000000790000003018000011010000,Arcade Fightstick F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000a30c00002700000011010000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,\n03000000a30c00002800000011010000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,\n05000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux,\n05000000050b00000045000040000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux,\n03000000050b00000579000011010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b36,paddle1:b52,paddle2:b53,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b21,paddle1:b22,paddle2:b23,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000503200000110000000000000,Atari VCS Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux,\n03000000503200000110000011010000,Atari VCS Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux,\n05000000503200000110000000000000,Atari VCS Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux,\n05000000503200000110000044010000,Atari VCS Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux,\n05000000503200000110000046010000,Atari VCS Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux,\n03000000503200000210000000000000,Atari VCS Modern Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux,\n03000000503200000210000011010000,Atari VCS Modern Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,\n05000000503200000210000000000000,Atari VCS Modern Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,\n05000000503200000210000045010000,Atari VCS Modern Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,\n05000000503200000210000046010000,Atari VCS Modern Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,\n05000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:-a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux,\n030000008a3500000201000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000008a3500000202000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000008a3500000302000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000008a3500000402000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000c62400001b89000011010000,BDA MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000c21100000791000011010000,Be1 GC101 Controller 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000c31100000791000011010000,Be1 GC101 Controller 1.03,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000005e0400008e02000003030000,Be1 GC101 Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000bc2000004d50000011010000,Beitong A1T2 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000bc2000000055000001000000,Betop AX1 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000bc2000006412000011010000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b30,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000006b1400000209000011010000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000120c0000300e000011010000,Brook Audio Fighting Board PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000120c0000310e000011010000,Brook Audio Fighting Board PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000120c0000200e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000120c0000210e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000120c0000f70e000011010000,Brook Universal Fighting Board,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000d81d00000b00000010010000,Buffalo BSGP1601,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Linux,\n03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000af1e00002400000010010000,Clockwork Pi DevTerm,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b9,x:b3,y:b0,platform:Linux,\n030000000b0400003365000000010000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Linux,\n03000000632500007a05000001020000,Cosmic Byte Ares Wired Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000260900008888000000010000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Linux,\n03000000a306000022f6000011010000,Cyborg V3 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,\n03000000791d00000103000010010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000c11100000191000011010000,EasySMX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000242f00009100000000010000,EasySMX ESM-9101,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006e0500000320000010010000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux,\n030000006e0500000720000010010000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,\n030000007d0400000640000010010000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Linux,\n03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n030000006f0e00008401000011010000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00008101000011010000,Faceoff Deluxe Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00008001000011010000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000852100000201000010010000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n05000000b40400001224000001010000,Flydigi APEX 4,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b20,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000b40400001224000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000007e0500003703000000000000,GameCube Adapter,a:b0,b:b1,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,\n19000000030000000300000002030000,GameForce Controller,a:b1,b:b0,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n03000000373500000b10000019010000,GameSir Cyclone 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000ac0500005b05000010010000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000558500001b06000010010000,GameSir G4 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000ac0500002d0200001b010000,GameSir G4s,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b33,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000ac0500007a05000011010000,GameSir G5,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000373500009710000001020000,GameSir Kaleid Flux,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000ac0500001a06000011010000,GameSir T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000bc2000005656000011010000,GameSir T4w,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000373500009410000010010000,GameSir Tegenaria Lite,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n03000000f025000021c1000010010000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000f0250000c283000010010000,Gioteck VX2 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n190000004b4800000010000000010000,GO-Advance Controller,a:b1,b:b0,back:b10,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,leftshoulder:b4,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b13,start:b15,x:b2,y:b3,platform:Linux,\n190000004b4800000010000001010000,GO-Advance Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b13,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b16,righttrigger:b15,start:b17,x:b2,y:b3,platform:Linux,\n190000004b4800000011000000010000,GO-Super Gamepad,a:b0,b:b1,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b3,y:b2,platform:Linux,\n03000000f0250000c183000010010000,Goodbetterbest Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000d11800000094000011010000,Google Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n05000000d11800000094000000010000,Google Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000001010000,GPD Win Max 2 6800U Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000007d0400000540000000010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000280400000140000000010000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000008f0e00000610000000010000,GreenAsia Electronics Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux,\n030000008f0e00001200000010010000,GreenAsia Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n0500000047532067616d657061640000,GS Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n03000000f0250000c383000010010000,GT VX2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000008a2e0000dd10000011010000,Hand Held Legend GC Ultimate,a:b0,b:b2,back:b17,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,guide:b18,leftshoulder:b10,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b19,misc2:b24,paddle1:b13,paddle2:b12,rightshoulder:b11,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b1,y:b3,platform:Linux,\n030000008a2e0000df10000011010000,Hand Held Legend ProGCC,a:b1,b:b0,back:b17,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,guide:b18,leftshoulder:b10,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b19,paddle1:b13,paddle2:b12,rightshoulder:b11,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b3,y:b2,platform:Linux,\n06000000adde0000efbe000002010000,Hidromancer Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d81400000862000011010000,HitBox PS3 PC Analog Mode,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux,\n03000000c9110000f055000011010000,HJC Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000000d0f00006d00000020010000,Hori EDGE 301,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:+a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f00008400000011010000,Hori Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00005f00000011010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00005e00000011010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000000d0f00005001000009040000,Hori Fighting Commander Octa Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f00008500000010010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00008600000002010000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000000d0f00003701000013010000,Hori Fighting Stick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b3,y:b2,platform:Linux,\n030000000d0f00008800000011010000,Hori Fighting Stick mini 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00008700000011010000,Hori Fighting Stick mini 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000000d0f00001000000011010000,Hori Fightstick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000ad1b000003f5000033050000,Hori Fightstick VX,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b8,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux,\n030000000d0f00004d00000011010000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f00003801000011010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Linux,\n030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00001100000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00002200000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00006a00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00006b00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00001600000000010000,Hori Real Arcade Pro EXSE,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux,\n030000000d0f0000aa00000011010000,Hori Real Arcade Pro for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000000d0f00008501000017010000,Hori Split Pad Fit,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f00008501000015010000,Hori Switch Split Pad Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f00006e00000011010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00006600000011010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f0000c100000011010000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f0000ab01000011010000,Horipad Steam,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc2:b2,paddle1:b19,paddle2:b18,paddle3:b15,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000000d0f00009601000091000000,Horipad Steam,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc2:b2,paddle1:b19,paddle2:b18,paddle3:b15,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000000d0f0000f600000001000000,Horipad Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux,\n05000000242e00000b20000001000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Linux,\n03000000242e0000ff0b000011010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Linux,\n03000000242e00006a38000010010000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Linux,\n03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000f00300008d03000011010000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000f00300008d04000000010000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000830500006020000010010000,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,\n03000000d80400004aea000011010000,icedragon.io STAC Dance Pad,a:b0,b:b1,back:b4,x:b2,y:b3,platform:Linux,\n03000000d80400004bea000011010000,icedragon.io STAC Dance Pad,a:b0,b:b1,back:b4,x:b2,y:b3,platform:Linux,\n030000008a2e0000d910000011010000,icedragon.io STAC2 Dance Pad,a:b0,b:b1,back:b4,x:b2,y:b3,platform:Linux,\n030000008a2e0000e910000011010000,icedragon.io STAC2 Dance Pad,a:b8,b:b9,back:b12,x:b10,y:b11,platform:Linux,\n030000008f0e00001330000001010000,iCode Retro Adapter,b:b3,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b1,start:b7,x:b2,y:b0,platform:Linux,\n050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000b50700001503000010010000,Impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,\n03000000d80400008200000003000000,IMS PCU0,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux,\n03000000120c00000500000010010000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux,\n03000000ef0500000300000000010000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux,\n03000000fd0500000030000000010000,InterAct GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Linux,\n03000000fd0500002a26000000010000,InterAct HammerHead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux,\n0500000049190000020400001b010000,Ipega PG 9069,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b161,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000632500007505000011010000,Ipega PG 9099,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n0500000049190000030400001b010000,Ipega PG9099,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000491900000204000000000000,Ipega PG9118,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000300f00001101000010010000,Jess Tech Colour Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,\n03000000300f00001001000010010000,Jess Tech Dual Analog Rumble,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,\n03000000300f00000b01000010010000,Jess Tech GGE909 PC Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n03000000ba2200002010000001010000,Jess Technology Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux,\n050000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux,\n030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux,\n050000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux,\n03000000bd12000003c0000010010000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000242f00002d00000011010000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000242f00008a00000011010000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux,\n030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d040000d1ca000000000000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d040000d1ca000011010000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d0400001dc2000014400000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d0400001ec2000019200000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d0400001ec2000020200000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d04000019c2000011010000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d0400001fc2000005030000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux,\n030000006d0400000ac2000010010000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Linux,\n05000000380700006652000025010000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700008532000010010000,Mad Catz Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700005032000011010000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700005082000011010000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux,\n03000000380700008031000011010000,Mad Catz FightStick Alpha PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700008081000011010000,Mad Catz FightStick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700008034000011010000,Mad Catz Fightstick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700008084000011010000,Mad Catz Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000380700008433000011010000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700008483000011010000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000380700001888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700003888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000380700001647000010040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000380700003847000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000120c00000500000000010000,Manta DualShock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n030000008f0e00001330000010010000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Linux,\n03000000790000004318000010010000,Mayflash GameCube Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux,\n0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000242f0000f700000001010000,Mayflash Magic S Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000008f0e00001030000010010000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux,\n0300000025090000e803000001010000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,\n03000000790000000318000011010000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,\n03000000790000000018000011010000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000b50700001203000010010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,\n03000000b50700004f00000000010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux,\n03000000780000000600000010010000,Microntek Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,\n030000005e0400002800000000010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Linux,\n030000005e0400000300000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux,\n030000005e0400000700000000010000,Microsoft SideWinder,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux,\n030000005e0400000e00000000010000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux,\n030000005e0400002700000000010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Linux,\n030000005e0400008502000000010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,\n030000005e0400008902000021010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,\n030000005e0400008e02000001000000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.1,dpleft:h0.2,dpright:h0.8,dpup:h0.4,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000004010000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000056210000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000062230000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000d102000001010000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000d102000003020000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000dd02000003020000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000ea02000008040000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000ea0200000f050000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000120b000009050000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000120b000014050000,Microsoft Xbox One,a:b0,b:b1,x:b2,y:b3,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux\n030000005e040000e302000003020000,Microsoft Xbox One Elite,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000000b000007040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b12,paddle2:b14,paddle3:b13,paddle4:b15,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000000b000008040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b12,paddle2:b14,paddle3:b13,paddle4:b15,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000005e040000050b000003090000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e0400008e02000030110000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b00000b050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000016050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000017050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000120b000001050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,\n03000000790000001c18000010010000,Mobapad Chitu HD,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000004d4f435554452d3035335800,Mocute 053X,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n05000000e80400006e0400001b010000,Mocute 053X M59,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000004d4f435554452d3035305800,Mocute 054X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000d6200000e589000001000000,Moga 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,\n05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,\n05000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux,\n03000000c62400002b89000011010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b22,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000c62400001a89000000010000,MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000250900006688000000010000,MP8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,\n030000005e0400008e02000010020000,MSI GC20 V2,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000f70600000100000000010000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Linux,\n030000006b1400000906000014010000,Nacon Asymmetric Wireless PS4 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n0300000085320000030c000011010000,Nacon GC100,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000853200000706000012010000,Nacon GC100,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006b140000010c000010010000,Nacon GC400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n05000000853200000503000000010000,Nacon MGX Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n0300000085320000170d000011010000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n0300000085320000190d000011010000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000000d0f00000900000010010000,Natec Genesis P44,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000004f1f00000800000011010000,NeoGeo PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n0300000092120000474e000000010000,NeoGeo X Arcade Stick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b3,y:b2,platform:Linux,\n03000000790000004518000010010000,Nexilux GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Linux,\n060000007e0500003713000000000000,Nintendo 3DS,a:b0,b:b1,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,\n03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux,\n03000000ec110000e1a7000010010000,Nintendo Switch,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000007e0500006920000011010000,Nintendo Switch 2 Pro Controller,a:b0,b:b1,back:b14,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b12,leftstick:b15,lefttrigger:b13,leftx:a0,lefty:a1~,misc1:b17,misc2:b20,paddle1:b18,paddle2:b19,rightshoulder:b4,rightstick:b7,righttrigger:b5,rightx:a2,righty:a3~,start:b6,x:b2,y:b3,platform:Linux,\n060000004e696e74656e646f20537700,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,\n060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,\n060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,\n050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b16,b:b15,back:b4,leftshoulder:b6,leftstick:b12,leftx:a1,lefty:a0~,rightshoulder:b8,start:b9,x:b14,y:b17,platform:Linux,\n030000007e0500000920000000026803,Nintendo Switch Pro Controller,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Linux,\n030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,\n050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,\n050000007e0500000720000001800000,Nintendo Switch Right Joy-Con,a:b1,b:b2,back:b9,leftshoulder:b4,leftstick:b10,leftx:a1~,lefty:a0,rightshoulder:b6,start:b8,x:b0,y:b3,platform:Linux,\n05000000010000000100000003000000,Nintendo Wii Remote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n050000007e0500003003000001000000,Nintendo Wii U Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,\n050000005a1d00000218000003000000,Nokia GC 5000,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000000d0500000308000010010000,Nostromo n45 Dual Analog,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux,\n030000007e0500007320000011010000,NSO GameCube Controller,a:b1,b:b3,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b13,lefttrigger:b12,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b4,rightx:a2,righty:a3~,start:b6,x:b0,y:b2,platform:Linux,\n030000007e0500001920000011810000,NSO N64 Controller,+rightx:b2,+righty:b3,-rightx:b4,-righty:b10,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b5,rightshoulder:b7,righttrigger:b9,start:b11,platform:Linux,\n050000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Linux,\n050000007e0500001920000001800000,NSO N64 Controller,+rightx:b2,+righty:b3,-rightx:b4,-righty:b10,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b5,rightshoulder:b7,righttrigger:b9,start:b11,platform:Linux,\n030000007e0500001e20000011810000,NSO Sega Genesis Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,misc1:b3,rightshoulder:b2,righttrigger:b4,start:b5,platform:Linux,\n030000007e0500001720000011810000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux,\n050000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b8,start:b10,x:b3,y:b2,platform:Linux,\n050000007e0500001720000001800000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux,\n03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n03000000550900001472000011010000,NVIDIA Controller,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,\n05000000550900001472000001000000,NVIDIA Controller,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,\n030000004b120000014d000000010000,NYKO Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n19000000010000000100000001010000,ODROID Go 2,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux,\n19000000010000000200000011000000,ODROID Go 2,a:b1,b:b0,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b12,leftshoulder:b4,leftstick:b14,lefttrigger:b13,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b16,start:b17,x:b2,y:b3,platform:Linux,\n05000000362800000100000002010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux,\n05000000362800000100000003010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux,\n05000000362800000100000004010000,OUYA Controller,a:b0,b:b3,back:b14,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,start:b16,x:b1,y:b2,platform:Linux,\n03000000830500005020000010010000,Padix Rockfire PlayStation Bridge,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Linux,\n03000000ff1100003133000010010000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000006f0e0000b802000001010000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e0000b802000013020000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e0000d702000006640000,PDP Black Camo Wired Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b13,dpup:b14,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00003101000000010000,PDP EA Sports Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00008501000011010000,PDP Fightpad Pro Gamecube Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00002801000011010000,PDP PS3 Rock Candy Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00000901000011010000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00002f01000011010000,PDP Wired PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000ad1b000004f9000000010000,PDP Xbox 360 Versus Fighting,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e0000f102000000000000,PDP Xbox Atomic,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e0000a802000023020000,PDP Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e0000d802000006640000,PDP Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e0000ef02000007640000,PDP Xbox Series Kinetic Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d62000000540000001010000,PowerA Advantage Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d620000011a7000011010000,PowerA Core Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000dd62000015a7000011010000,PowerA Fusion Nintendo Switch Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000d620000012a7000011010000,PowerA Fusion Nintendo Switch Fight Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000d62000000140000001010000,PowerA Fusion Pro 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000dd62000016a7000000000000,PowerA Fusion Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000c62400001a53000000010000,PowerA Mini Pro Ex,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d620000013a7000011010000,PowerA Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000d620000014a7000011010000,PowerA Spectra Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000c62400001a58000001010000,PowerA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d62000000220000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux,\n03000000d62000000228000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c62400001a54000001010000,PowerA Xbox One Mini Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d62000000520000050010000,PowerA Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d62000000b20000001010000,PowerA Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000d62000000f20000001010000,PowerA Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000250900000017000010010000,PS/SS/N64 Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b5,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2~,righty:a3,start:b8,platform:Linux,\n03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,\n03000000120c0000160e000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n030000004c0500006802000010810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n030000004c0500006802000011810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000005f1400003102000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000006f0e00001402000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000008f0e00000300000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n050000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n050000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,\n030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000004c050000a00b000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000004c050000c405000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n050000004c050000c405000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n0300004b4c0500005f0e000011010000,PS5 Access Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000004c050000e60c000011810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n030000004c050000f20d000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000004c050000f20d000011810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n050000004c050000e60c000000810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n050000004c050000f20d000000810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,\n03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux,\n03000000222c00000225000011010000,Qanba Dragon Arcade Joystick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000222c00000025000011010000,Qanba Dragon Arcade Joystick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000222c00001220000011010000,Qanba Drone 2 Arcade Joystick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000222c00001020000011010000,Qanba Drone 2 Arcade Joystick PS5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000222c00000020000011010000,Qanba Drone Arcade PS4 Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000300f00001210000010010000,Qanba Joystick Plus,a:b0,b:b1,back:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,start:b9,x:b2,y:b3,platform:Linux,\n03000000222c00000223000011010000,Qanba Obsidian Arcade Joystick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000222c00000023000011010000,Qanba Obsidian Arcade Joystick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000009b2800000300000001010000,Raphnet 4nes4snes,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux,\n030000009b2800004200000001010000,Raphnet Dual NES Adapter,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Linux,\n0300132d9b2800006500000000000000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,\n0300132d9b2800006500000001010000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,\n030000009b2800003200000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,\n030000009b2800006000000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,\n030000009b2800003c00000001010000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Linux,\n030000009b2800006100000001010000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Linux,\n030000009b2800006300000001010000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Linux,\n030000009b2800006400000001010000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Linux,\n030000009b2800008000000020020000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux,\n030000009b2800008000000001010000,Raphnet Wii Classic Adapter V3,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux,\n03000000f8270000bf0b000011010000,Razer Kishi,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000321500000810000011010000,Razer Panthera PS4 Evo Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000321500000010000011010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000321500000a10000001000000,Razer Raiju Tournament Edition,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000321500000011000011010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000321500000b10000011010000,Razer Wolverine PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n0300000032150000140a000001010000,Razer Wolverine Ultimate Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000000d0f0000c100000010010000,Retro Bit Legacy16,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b12,leftshoulder:b4,lefttrigger:b6,misc1:b13,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,\n03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux,\n0300000003040000c197000011010000,Retrode Adapter,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux,\n190000004b4800000111000000010000,RetroGame Joypad,a:b1,b:b0,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux,\n0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux,\n00000000526574726f53746f6e653200,RetroStone 2 Controller,a:b1,b:b0,back:b10,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,platform:Linux,\n03000000341200000400000000010000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Linux,\n030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00008701000011010000,Rock Candy Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000c6240000fefa000000010000,Rock Candy Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00001311000011010000,Saffun Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Linux,\n03000000a306000023f6000011010000,Saitek Cyborg PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,\n03000000a30600001005000000010000,Saitek P150,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b2,righttrigger:b5,x:b3,y:b4,platform:Linux,\n03000000a30600000701000000010000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Linux,\n03000000a30600000cff000010010000,Saitek P2500 Force Rumble,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b0,y:b1,platform:Linux,\n03000000a30600000d5f000010010000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux,\n03000000a30600000c04000011010000,Saitek P2900,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux,\n03000000a306000018f5000010010000,Saitek P3200 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux,\n03000000300f00001201000010010000,Saitek P380,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux,\n03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux,\n03000000a30600000b04000000010000,Saitek P990 Dual Analog,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux,\n03000000a306000020f6000011010000,Saitek PS2700 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux,\n05000000e804000000a000001b010000,Samsung EIGP20,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000d81d00000e00000010010000,Savior,a:b0,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b9,x:b4,y:b5,platform:Linux,\n03000000952e00004b43000011010000,Scuf Envision,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux,\n03000000952e00004d43000011010000,Scuf Envision,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux,\n03000000952e00004e43000011010000,Scuf Envision,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux,\n03000000a30c00002500000011010000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Linux,\n03000000790000001100000011010000,Sega Saturn,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Linux,\n03000000b40400000a01000000010000,Sega Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux,\n03000000632500002305000010010000,ShanWan Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000632500002605000010010000,ShanWan Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000632500007505000010010000,ShanWan Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000bc2000000055000010010000,ShanWan Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000341a00000908000010010000,SL6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n030000004b2900000430000011000000,Snakebyte Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000004c050000cc09000001000000,Sony DualShock 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n03000000666600006706000000010000,Sony PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux,\n030000004c050000da0c000011010000,Sony PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,\n03000000d9040000160f000000010000,Sony PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n03000000ff000000cb01000010010000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,\n030000004c0500003713000011010000,Sony PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux,\n03000000250900000500000000010000,Sony PS2 pad with SmartJoy Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,\n030000005e0400008e02000073050000,Speedlink Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000020200000,SpeedLink Xeox Pro Analog,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n03000000de2800000112000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:+a5,dpleft:-a4,dpright:+a4,dpup:-a5,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux,\n03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n03000000de2800000211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b16,paddle2:b15,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux,\n03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n03000000de2800004211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b16,paddle2:b15,rightshoulder:b7,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux,\n03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux,\n03000000de2800000512000010010000,Steam Deck,a:b3,b:b4,back:b11,dpdown:b17,dpleft:b18,dpright:b19,dpup:b16,guide:b13,leftshoulder:b7,leftstick:b14,lefttrigger:a9,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b15,righttrigger:a8,rightx:a2,righty:a3,start:b12,x:b5,y:b6,platform:Linux,\n03000000de2800000512000011010000,Steam Deck,a:b3,b:b4,back:b11,dpdown:b17,dpleft:b18,dpright:b19,dpup:b16,guide:b13,leftshoulder:b7,leftstick:b14,lefttrigger:a9,leftx:a0,lefty:a1,misc1:b2,paddle1:b21,paddle2:b20,paddle3:b23,paddle4:b22,rightshoulder:b8,rightstick:b15,righttrigger:a8,rightx:a2,righty:a3,start:b12,x:b5,y:b6,platform:Linux,\n03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b10,guide:b11,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Linux,\n03000000381000003014000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000381000003114000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000ad1b000038f0000090040000,Street Fighter IV Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000003b07000004a1000000010000,Suncom SFX Plus,a:b0,b:b2,back:b7,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Linux,\n030000001f08000001e4000010010000,Super Famicom Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux,\n03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,\n0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux,\n030000008f0e00000d31000010010000,SZMY Power 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000457500000401000011010000,SZMY Power DS4 Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000457500002211000010010000,SZMY Power Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n030000008f0e00001431000010010000,SZMY Power PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000e40a00000307000011010000,Taito Egret II Mini Control Panel,a:b4,b:b2,back:b6,guide:b9,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Linux,\n03000000e40a00000207000011010000,Taito Egret II Mini Controller,a:b4,b:b2,back:b6,guide:b9,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Linux,\n03000000ba2200000701000001010000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Linux,\n03000000790000001c18000011010000,TGZ Controller,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b15,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux,\n03000000591c00002400000010010000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,\n03000000591c00002600000010010000,THEGamepad,a:b2,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux,\n030000004f04000015b3000001010000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,\n030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,\n030000004f04000020b3000010010000,Thrustmaster Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,\n030000004f04000023b3000000010000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000004f0400000ed0000011010000,Thrustmaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000b50700000399000000010000,Thrustmaster Firestorm Digital 2,a:b2,b:b4,back:b11,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b0,righttrigger:b9,start:b1,x:b3,y:b5,platform:Linux,\n030000004f04000003b3000010010000,Thrustmaster Firestorm Dual Analog 2,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b9,rightx:a2,righty:a3,x:b1,y:b3,platform:Linux,\n030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Linux,\n030000004f04000004b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,\n030000004f04000026b3000002040000,Thrustmaster GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c6240000025b000002020000,Thrustmaster GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000004f04000008d0000000010000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000004f04000009d0000000010000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000004f04000007d0000000010000,Thrustmaster T Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n030000004f04000012b3000010010000,Thrustmaster Vibrating Gamepad,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux,\n03000000571d00002000000010010000,Tomee SNES Adapter,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,\n03000000bd12000015d0000010010000,Tomee SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux,\n03000000d814000007cd000011010000,Toodles 2008 Chimp PC PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux,\n030000005e0400008e02000070050000,Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000c01100000591000011010000,Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n03000000680a00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,\n03000000780300000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,\n03000000e00d00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,\n03000000f00600000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux,\n030000005f140000c501000010010000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,\n06000000f51000000870000003010000,Turtle Beach Recon,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000100800000100000010010000,Twin PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n03000000c0160000e105000010010000,Ultimate Atari Fight Stick,a:b1,b:b2,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b8,x:b0,y:b3,platform:Linux,\n03000000790000002601000011010000,SNES Controller,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:-a1,dpdown:+a1,dpleft:-a0,dpright:+a0,platform:Linux,\n03000000151900005678000010010000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,\n03000000790000000600000007010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux,\n03000000790000001100000000010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux,\n03000000790000001a18000011010000,Venom PS4 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,\n03000000790000001b18000011010000,Venom PS4 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n030000006f0e00000302000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n030000006f0e00000702000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,\n05000000ac0500003232000001000000,VR Box Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,\n05000000434f4d4d414e440000000000,VX Gaming Command Series,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n0000000058626f782033363020576900,Xbox 360 Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux,\n030000005e0400001907000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000002010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000010010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000014010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000047010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400008e02000072050000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400009102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000a102000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000a102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000a102000030060000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000006f0e00001503000000020000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000a102000014010000,Xbox 360 Receiver,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n0000000058626f782047616d65706100,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux,\n030000005e0400000202000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,\n030000006f0e00001304000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000ffff0000ffff000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux,\n030000005e0400000a0b000005040000,Xbox One Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,\n030000005e040000d102000002010000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000ea02000001030000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000fd02000030110000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000dd02000003020000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000005e040000e302000002090000,Xbox One Elite,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000220b000013050000,Xbox One Elite 2 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n030000005e040000ea02000011050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000ea02000015050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000ea02000017050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000ea0200000b050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000ea0200000d050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000ea02000016050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000001050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000005050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000007050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000009050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b00000d050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000011050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000014050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000120b000015050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000007050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000011050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000130b000017050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n060000005e040000120b000007050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000120b00000d050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n060000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000005e040000130b000022050000,Xbox Series X Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n060000005e040000120b000011050000,Xbox Series X Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n050000005e040000200b000013050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000200b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000200b000023050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n050000005e040000220b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\n03000000450c00002043000010010000,XEOX SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n05000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux,\n03000000c0160000e105000001010000,XinMo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux,\n030000005e0400008e02000020010000,XInput Adapter,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\nxinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\n03000000120c0000100e000011010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000120c0000101e000011010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000120c0000182e000011010000,Zeroplus PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\n03000000790000002201000011010000,ZhiXu GuliKit D,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,\n\n# Android\n38653964633230666463343334313533,8BitDo Adapter,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n36666264316630653965636634386234,8BitDo Adapter 2,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38426974446f20417263616465205374,8BitDo Arcade Stick,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b5,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n61393962646434393836356631636132,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,\n64323139346131306233636562663738,8BitDo Arcade Stick,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,\n64643565386136613265663236636564,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,\n33313433353539306634656436353432,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38426974446f20446f67626f6e65204d,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,\n34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android,\n38426974446f204e4743204d6f646b69,8BitDo GameCube,a:b0,b:b2,back:b4,dpdown:b12,dpleft:b13,dpright:b14,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b18,paddle2:b17,rightshoulder:b15,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b1,y:b3,platform:Android,\n38426974446f2038426974446f204c69,8BitDo Lite,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n30643332373663313263316637356631,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f204c6974652032000000,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n62656331626461363634633735353032,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38393936616436383062666232653338,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f204c6974652053450000,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n39356430616562366466646636643435,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000006500000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a5,rightshoulder:b10,righttrigger:a4,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000051060000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,start:b6,x:b3,y:b2,platform:Android,\n32323161363037623637326438643634,8BitDo M30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android,\n38426974446f204d3330204d6f646b69,8BitDo M30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android,\n64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android,\n66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android,\n66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android,\n38426974446f204d6963726f2067616d,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,\n61653365323561356263373333643266,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,\n62613137616239666338343866326336,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,\n33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,\n38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,\n05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38323035343766666239373834336637,8BitDo N64,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android,\n38426974446f204e3634204d6f646b69,8BitDo N64,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android,\n32363135613966656338666638666237,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n35363534633333373639386466346631,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38426974446f204e454f47454f204750,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n39383963623932353561633733306334,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38326536643339353865323063616339,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38426974446f2050333020636c617373,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n35376664343164386333616535333434,8BitDo Pro 2,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,start:b10,x:b19,y:b2,platform:Android,\n38426974446f2038426974446f205072,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f2050726f203200000000,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n61333362366131643730353063616330,8BitDo Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n62373739366537363166326238653463,8BitDo Pro 2,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b3,y:b2,platform:Android,\n38386464613034326435626130396565,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f2038426974446f205265,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n66303230343038613365623964393766,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f20533330204d6f646b69,8BitDo S30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n66316462353561376330346462316137,8BitDo S30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n05000000c82d000000600000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000000610000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android,\n61623334636338643233383735326439,8BitDo SFC30,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b31,start:b5,x:b30,y:b2,platform:Android,\n05000000c82d000012900000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000062280000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n38316230613931613964356666353839,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f20534e3330204d6f646b,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n65323563303231646531383162646335,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n05000000c82d000001600000ffff3f00,8BitDo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000002600000ffff0f00,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,\n38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,\n38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38426974446f20534e33302050726f2b,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n536f6e7920436f6d707574657220456e,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n050000002028000009000000ffff3f00,8BitDo SNES30,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n050000003512000020ab000000780f00,8BitDo SNES30,a:b21,b:b20,back:b30,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b26,rightshoulder:b27,start:b31,x:b24,y:b23,platform:Android,\n33666663316164653937326237613331,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,\n38426974646f205a65726f2047616d65,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,\n05000000c82d000018900000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n33663434393362303033616630346337,8BitDo Zero 2,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n34656330626361666438323266633963,8BitDo Zero 2,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,\n63396666386564393334393236386630,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,\n32333634613735616163326165323731,Amazon Luna Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,\n4c696e757820342e31392e3137322077,Anbernic Handheld,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n417374726f2063697479206d696e6920,Astro City Mini,a:b23,b:b22,back:b29,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android,\n35643263313264386134376362363435,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,start:b6,platform:Android,\n32353831643566306563643065356239,Atari VCS Modern Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n4f64696e20436f6e74726f6c6c657200,AYN Odin,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b14,dpright:b13,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:+a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,\n4875694a6961204a432d573031550000,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,\n30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android,\n05000000b404000011240000dfff3f00,Flydigi Vader 2,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n476f6f676c65204c4c43205374616469,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n5374616469614e3848532d6532633400,Google Stadia Controller,a:b0,b:b1,back:b15,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,\n05000000d6020000e5890000dfff3f80,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android,\n66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n484f524920434f2e2c4c544420205041,Hori Gem Pad 3,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android,\n65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b18,platform:Android,\n31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n32656664353964393561366362333636,Hori Switch Split Pad Pro,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,\n48797065726b696e2050616400000000,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android,\n62333331353131353034386136626636,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android,\n31306635363562663834633739396333,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,\n5368616e57616e202020202048797065,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,\n0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android,\n5553422c322d6178697320382d627574,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,rightshoulder:b18,start:b10,x:b3,y:b2,platform:Android,\n64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android,\n532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android,\n65346535636333663931613264643164,Joy-Con,a:b21,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android,\n33346566643039343630376565326335,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,\n35313531613435623366313835326238,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,\n4a6f792d436f6e20284c290000000000,Joy-Con (L),a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,\n38383665633039363066383334653465,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n39363561613936303237333537383931,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n39373064396565646338333134303131,Joy-Con (R),a:b1,b:b2,back:b5,leftstick:b8,leftx:a1~,lefty:a0,start:b6,x:b0,y:b3,platform:Android,\n4a6f792d436f6e202852290000000000,Joy-Con (R),a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n39656136363638323036303865326464,JYS Aapter,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n63316564383539663166353034616434,JYS Adapter,a:b1,b:b3,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android,\n64623163333561643339623235373232,Logitech F310,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n39653365373864633935383236363438,Logitech G Cloud,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n31353762393935386662336365626334,Magic NS,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n39623565346366623931666633323530,Magic NS,a:b1,b:b3,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android,\n6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android,\n436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,\n65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,\n37316565396364386635383230353365,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,\n4875694a696120205553422047616d65,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,\n535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,\n30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,\n39346131396233376535393665363161,Mayflash Wii U Pro Adapter,a:b22,b:b23,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,leftstick:b31,lefttrigger:b27,rightshoulder:b26,rightstick:b0,righttrigger:b28,rightx:a0,righty:a1,start:b30,x:b21,y:b24,platform:Android,\n31323564663862633234646330373138,Mega Drive,a:b23,b:b22,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android,\n37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,\n64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b9,x:b2,y:b3,platform:Android,\n33323763323132376537376266393366,Microsoft Dual Strike,a:b24,b:b23,back:b25,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b29,rightshoulder:b78,rightx:a0,righty:a1~,start:b26,x:b22,y:b21,platform:Android,\n30306461613834333439303734316539,Microsoft SideWinder Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b20,lefttrigger:b9,rightshoulder:b19,righttrigger:b10,start:b17,x:b2,y:b3,platform:Android,\n32386235353630393033393135613831,Microsoft Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n4d4f42415041442050726f2d48440000,Mobapad Chitu HD,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n4d4f435554452d303533582d4d35312d,Mocute 053X,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n33343361376163623438613466616531,Mocute M053,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n39306635663061636563316166303966,Mocute M053,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n7573622067616d657061642020202020,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Android,\n050000007e05000009200000ffff0f00,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b17,y:b2,platform:Android,\n31316661666466633938376335383661,Nintendo Switch Pro Controller,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,misc1:b5,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,start:b6,x:b3,y:b2,platform:Android,\n34323437396534643531326161633738,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,misc1:b5,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n50726f20436f6e74726f6c6c65720000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b2,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b10,rightx:a2,righty:a3,start:b18,y:b3,platform:Android,\n36326533353166323965623661303933,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android,\n4e363420436f6e74726f6c6c65720000,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android,\n534e455320436f6e74726f6c6c657200,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n64623863346133633561626136366634,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,\n050000005509000003720000cf7f3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005509000010720000ffff3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005509000014720000df7f3f00,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,\n050000005509000014720000df7f3f80,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android,\n37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n39383335313438623439373538343266,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b16,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,x:b1,y:b19,platform:Android,\n4f5559412047616d6520436f6e74726f,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b6,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b19,platform:Android,\n506572666f726d616e63652044657369,PDP PS3 Rock Candy Controller,a:b1,b:b17,back:h0.2,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android,\n61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android,\n32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android,\n050000004c05000068020000dfff3f00,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n536f6e7920504c415953544154494f4e,PS3 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n61363034663839376638653463633865,PS3 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n66366539656564653432353139356536,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n66383132326164626636313737373037,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000004c050000c405000000783f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000004c050000c4050000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,\n050000004c050000c4050000fffe3f80,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a3,rightx:a4,righty:a5,start:b16,x:b0,y:b2,platform:Android,\n050000004c050000c4050000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000004c050000cc090000fffe3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000004c050000cc090000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n30303839663330346632363232623138,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,\n31326235383662333266633463653332,PS4 Controller,a:b1,b:b16,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b17,x:b0,y:b2,platform:Android,\n31373231336561636235613666323035,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n31663838336334393132303338353963,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n34613139376634626133336530386430,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,\n37626233336235343937333961353732,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n37626464343430636562316661643863,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38393161636261653636653532386639,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n63313733393535663339656564343962,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n63393662363836383439353064663939,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,\n050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,\n050000004c050000e60c0000fffe3f80,PS5 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a3,rightx:a4,righty:a5,start:b16,x:b2,y:b17,platform:Android,\n050000004c050000e60c0000ffff3f00,PS5 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,\n37363764353731323963323639666565,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,\n61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,\n64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,\n36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n05000000f8270000bf0b0000ffff3f00,Razer Kishi,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,\n5a6869587520526574726f2042697420,Retro Bit Saturn Controller,a:b21,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b26,rightshoulder:b27,righttrigger:b28,start:b30,x:b23,y:b24,platform:Android,\n32417865732031314b6579732047616d,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,\n36313938306539326233393732613361,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,\n526574726f466c616720576972656420,Retro Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,rightshoulder:b18,start:b10,x:b2,y:b3,platform:Android,\n61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android,\n526574726f696420506f636b65742043,Retroid Pocket,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n582d426f7820436f6e74726f6c6c6572,Retroid Pocket,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n64633735616665613536653363336132,Retroid Pocket,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b19,paddle2:b20,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b6,platform:Android,\n37393234373533633333323633646531,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android,\n5365616c6965436f6d707574696e6720,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android,\n526574726f5553422e636f6d20534e45,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android,\n64643037633038386238303966376137,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android,\n37656564346533643138636436356230,Rock Candy Switch Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,\n33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android,\n36363537303435333566386638366333,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n53616d73756e672047616d6520506164,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n66386565396238363534313863353065,Sanwa PlayOnline Mobile,a:b21,b:b22,back:b23,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b24,platform:Android,\n32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android,\n38613865396530353338373763623431,Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b10,rightshoulder:b20,righttrigger:b19,start:b17,x:b2,y:b3,platform:Android,\n61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android,\n30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,\n66386262366536653765333235343634,SG H510,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,\n66633132393363353531373465633064,SG H510,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,\n62653761636366393366613135366338,SN30 PP,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,\n38376662666661636265313264613039,SNES,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,\n5346432f555342205061640000000000,SNES Adapter,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,\n5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,\n62653335326261303663356263626339,Sony PlayStation Classic Controller,a:b19,b:b1,back:b17,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b3,rightshoulder:b10,righttrigger:b20,start:b18,x:b2,y:b0,platform:Android,\n536f6e7920496e746572616374697665,Sony PlayStation Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n576972656c65737320436f6e74726f6c,Sony PlayStation Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android,\n63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android,\n05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android,\n05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android,\n0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android,\n35306436396437373135383665646464,SteelSeries Nimbus Plus,a:b0,b:b1,leftshoulder:b3,leftstick:b17,lefttrigger:b9,leftx:a0,rightshoulder:b20,rightstick:b18,righttrigger:b10,rightx:a2,x:b19,y:b2,platform:Android,\n33313930373536613937326534303931,Taito Egret II Mini Control Panel,a:b25,b:b23,back:b27,guide:b30,leftx:a0,lefty:a1,rightshoulder:b21,righttrigger:b22,start:b28,x:b29,y:b24,platform:Android,\n54475a20436f6e74726f6c6c65720000,TGZ Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n62363434353532386238336663643836,TGZ Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n37323236633763666465316365313236,THEC64 Joystick,a:b21,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b27,x:b23,y:b24,platform:Android,\n38346162326232346533316164363336,THEGamepad,a:b23,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b24,y:b21,platform:Android,\n050000004f0400000ed00000fffe3f00,Thrustmaster eSwap Pro Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android,\n30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n31643365666432386133346639383937,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n30386438313564306161393537333663,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,\n33333034646336346339646538643633,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,\n050000005e0400008e02000000783f00,Xbox 360 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n30396232393162346330326334636566,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n38313038323730383864666463383533,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n58626f782033363020576972656c6573,Xbox 360 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n65353331386662343338643939643636,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n65613532386633373963616462363038,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n47656e6572696320582d426f78207061,Xbox Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n4d6963726f736f667420582d426f7820,Xbox Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n64633436313965656664373634323364,Xbox Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e04000091020000ff073f00,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n050000005e04000091020000ff073f80,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000e00200000ffe3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android,\n050000005e040000e00200000ffe3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android,\n050000005e040000e0020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android,\n050000005e040000e0020000ffff3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android,\n050000005e040000fd020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n34356136633366613530316338376136,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android,\n35623965373264386238353433656138,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n36616131643361333337396261666433,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n58626f7820576972656c65737320436f,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n65316262316265373335666131623538,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000000b000000783f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000000b000000783f80,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000050b0000ffff3f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000e002000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000ea02000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000120b000000783f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000120b000000783f80,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,\n050000001727000044310000ffff3f00,XiaoMi Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,\n\n# iOS\n05000000ac0500000100000000006d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS,\n05000000ac050000010000004f066d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS,\n05000000ac05000001000000cf076d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS,\n05000000ac05000001000000df076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n05000000ac05000001000000ff076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n05000000ac0500000200000000006d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS,\n05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS,\n05000000ac05000004000000a8986d04,8BitDo Micro,a:b1,b:b0,back:b4,dpdown:b7,dpleft:b8,dpright:b9,dpup:b10,guide:b2,leftshoulder:b11,lefttrigger:b12,rightshoulder:b13,righttrigger:b14,start:b3,x:b6,y:b5,platform:iOS,\n05000000ac05000004000000fd216d04,8BitDo Pro 2,a:b3,b:b2,back:b6,dpdown:b9,dpleft:b10,dpright:b11,dpup:b12,guide:b4,leftshoulder:b13,leftstick:b14,lefttrigger:+a2,leftx:a0,lefty:a1~,paddle1:b1,paddle2:b0,rightshoulder:b16,rightstick:b17,righttrigger:+a5,rightx:a3,righty:a4~,start:b5,x:b8,y:b7,platform:iOS,\n05000000ac05000004000000209f6d04,8Bitdo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b7,dpleft:b8,dpright:b9,dpup:b10,guide:b2,leftshoulder:b11,leftstick:b12,lefttrigger:b13,leftx:a0,lefty:a1~,rightshoulder:b14,rightstick:b15,righttrigger:b16,rightx:a2,righty:a3~,start:b3,x:b6,y:b5,platform:iOS,\n05000000ac050000040000003b8a6d04,8BitDo SN30 Pro+,a:b1,b:b0,back:b4,dpdown:b7,dpleft:b8,dpright:b9,dpup:b10,guide:b2,leftshoulder:b11,leftstick:b12,lefttrigger:b13,leftx:a0,lefty:a1~,rightshoulder:b14,rightstick:b15,righttrigger:b16,rightx:a2,righty:a3~,start:b3,x:b6,y:b5,platform:iOS,\n050000008a35000003010000ff070000,Backbone One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n050000008a35000004010000ff070000,Backbone One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS,\n4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS,\n050000007e050000062000000f060000,Nintendo Switch Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b2,leftshoulder:b4,rightshoulder:b5,x:b1,y:b3,platform:iOS,\n050000007e050000062000004f060000,Nintendo Switch Joy-Con (L),+leftx:h0.1,+lefty:h0.2,-leftx:h0.4,-lefty:h0.8,dpdown:b2,dpleft:b0,dpright:b3,dpup:b1,leftshoulder:b4,misc1:b6,rightshoulder:b5,platform:iOS,\n050000007e05000008200000df070000,Nintendo Switch Joy-Con (L/R),a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS,\n050000007e0500000e200000df070000,Nintendo Switch Joy-Con (L/R),a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS,\n050000007e050000072000000f060000,Nintendo Switch Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b2,leftshoulder:b4,rightshoulder:b5,x:b1,y:b3,platform:iOS,\n050000007e050000072000004f060000,Nintendo Switch Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b2,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b1,y:b3,platform:iOS,\n050000007e05000009200000df870000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS,\n050000007e05000009200000ff870000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b3,y:b2,platform:iOS,\n05000000ac050000040000008e586d04,PlayStation VR2 Sense Controller (L),+leftx:+a3,+lefty:+a1,-leftx:+a2,-lefty:+a4,back:b2,leftstick:b4,lefttrigger:+a7,paddle2:b3,x:b0,y:b1,platform:iOS,\n05000000ac050000040000000eb86d04,PlayStation VR2 Sense Controller (R),+rightx:+a3,+righty:+a1,-rightx:+a2,-righty:+a4,a:b0,b:b1,paddle1:b3,rightstick:b4,righttrigger:+a7,start:b2,platform:iOS,\n050000004c050000cc090000df070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n050000004c050000cc090000df870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n050000004c050000cc090000ff070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n050000004c050000cc090000ff870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS,\n050000004c050000cc090000ff876d01,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n050000004c050000e60c0000df870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,touchpad:b10,x:b2,y:b3,platform:iOS,\n050000004c050000e60c0000ff870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS,\n05000000ac0500000300000000006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS,\n05000000ac0500000300000043006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS,\n05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS,\n05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS,\n050000005e040000050b0000df070001,Xbox Elite Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b10,paddle2:b12,paddle3:b11,paddle4:b13,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n050000005e040000050b0000ff070001,Xbox Elite Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n050000005e040000130b0000df870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n050000005e040000130b0000ff870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n050000005e040000e0020000df070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS,\n050000005e040000e0020000ff070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS,\n"
  },
  {
    "path": "source/Playnite/license.txt",
    "content": "----------------------------------------------------------------------------------------\r\nPlaynite / Playnite.SDK\r\n\r\nMIT License\r\n\r\nCopyright (c) 2020 Josef Nemec\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n\r\n\r\n\r\n----------------------------------------------------------------------------------------\r\nAudio\r\n\r\nBackground music for default Fullscreen theme obtained from https://www.zapsplat.com (Attribution license)\r\nMavigation sounds for default Fullscreen theme obtained from https://www.kenney.nl (CC0 license)\r\n\r\n----------------------------------------------------------------------------------------\r\ncorefx\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) .NET Foundation and Contributors\r\n\r\nAll rights reserved.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nYamlDotNet\r\n\r\nCopyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Antoine Aubry and contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the \"Software\"), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r\nof the Software, and to permit persons to whom the Software is furnished to do\r\nso, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nWindowsAPICodePack\r\n\r\nLicense: Custom License\r\nMICROSOFT SOFTWARE LICENSE TERMS\r\nMICROSOFT WINDOWS API CODE PACK FOR MICROSOFT .NET FRAMEWORK\r\n___________________________________________________\r\nThese license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft\r\n• updates,\r\n• supplements,\r\n• Internet-based services, and\r\n• support services\r\nfor this software, unless other terms accompany those items. If so, those terms apply.\r\n_______________________________________________________________________________________\r\nBY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.\r\nIf you comply with these license terms, you have the rights below.\r\n1. INSTALLATION AND USE RIGHTS.\r\n• You may use any number of copies of the software to design, develop and test your programs that run on a Microsoft Windows operating system.\r\n• This agreement gives you rights to the software only. Any rights to a Microsoft Windows operating system (such as testing pre-release versions of Windows in a live operating environment) are provided separately by the license terms for Windows.\r\n2. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS.\r\na. Distributable Code. You may modify, copy, and distribute the software, in source or compiled form, to run on a Microsoft Windows operating system.\r\nii. Distribution Requirements. If you distribute the software, you must\r\n• require distributors and external end users to agree to terms that protect it at least as much as this agreement;\r\n• if you modify the software and distribute such modified files, include prominent notices in such modified files so that recipients know that they are not receiving the original software;\r\n• display your valid copyright notice on your programs; and\r\n• indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, related to the distribution or use of your programs or to your modifications to the software.\r\niii. Distribution Restrictions. You may not\r\n• alter any copyright, trademark or patent notice in the software;\r\n• use Microsoft’s trademarks in your programs’ names or in a way that suggests your programs come from or are endorsed by Microsoft;\r\n• include the software in malicious, deceptive or unlawful programs; or\r\n• modify or distribute the source code of the software so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that\r\n• the code be disclosed or distributed in source code form; or\r\n• others have the right to modify it.\r\n3. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement.\r\n4. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see <http://www.microsoft.com/exporting>.\r\n5. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it.\r\n6. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.\r\n7. APPLICABLE LAW.\r\na. United States. If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.\r\nb. Outside the United States. If you acquired the software in any other country, the laws of that country apply.\r\n8. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.\r\n9. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\r\n10. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.\r\nThis limitation applies to\r\n• anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and\r\n• claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.\r\nIt also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.\r\nPlease note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French.\r\nRemarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français.\r\nEXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues.\r\nLIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices.\r\nCette limitation concerne :\r\n• tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et\r\n• les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur.\r\nElle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard.\r\nEFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas.\r\n\r\n----------------------------------------------------------------------------------------\r\nSystem.IO.Abstractions\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) Tatham Oddie and Contributors\r\n\r\nAll rights reserved.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nSteamKit\r\n\r\n                  GNU LESSER GENERAL PUBLIC LICENSE\r\n                       Version 2.1, February 1999\r\n\r\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\r\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.\r\n\r\n[This is the first released version of the Lesser GPL.  It also counts\r\n as the successor of the GNU Library Public License, version 2, hence\r\n the version number 2.1.]\r\n\r\n                            Preamble\r\n\r\n  The licenses for most software are designed to take away your\r\nfreedom to share and change it.  By contrast, the GNU General Public\r\nLicenses are intended to guarantee your freedom to share and change\r\nfree software--to make sure the software is free for all its users.\r\n\r\n  This license, the Lesser General Public License, applies to some\r\nspecially designated software packages--typically libraries--of the\r\nFree Software Foundation and other authors who decide to use it.  You\r\ncan use it too, but we suggest you first think carefully about whether\r\nthis license or the ordinary General Public License is the better\r\nstrategy to use in any particular case, based on the explanations below.\r\n\r\n  When we speak of free software, we are referring to freedom of use,\r\nnot price.  Our General Public Licenses are designed to make sure that\r\nyou have the freedom to distribute copies of free software (and charge\r\nfor this service if you wish); that you receive source code or can get\r\nit if you want it; that you can change the software and use pieces of\r\nit in new free programs; and that you are informed that you can do\r\nthese things.\r\n\r\n  To protect your rights, we need to make restrictions that forbid\r\ndistributors to deny you these rights or to ask you to surrender these\r\nrights.  These restrictions translate to certain responsibilities for\r\nyou if you distribute copies of the library or if you modify it.\r\n\r\n  For example, if you distribute copies of the library, whether gratis\r\nor for a fee, you must give the recipients all the rights that we gave\r\nyou.  You must make sure that they, too, receive or can get the source\r\ncode.  If you link other code with the library, you must provide\r\ncomplete object files to the recipients, so that they can relink them\r\nwith the library after making changes to the library and recompiling\r\nit.  And you must show them these terms so they know their rights.\r\n\r\n  We protect your rights with a two-step method: (1) we copyright the\r\nlibrary, and (2) we offer you this license, which gives you legal\r\npermission to copy, distribute and/or modify the library.\r\n\r\n  To protect each distributor, we want to make it very clear that\r\nthere is no warranty for the free library.  Also, if the library is\r\nmodified by someone else and passed on, the recipients should know\r\nthat what they have is not the original version, so that the original\r\nauthor's reputation will not be affected by problems that might be\r\nintroduced by others.\r\n\r\n  Finally, software patents pose a constant threat to the existence of\r\nany free program.  We wish to make sure that a company cannot\r\neffectively restrict the users of a free program by obtaining a\r\nrestrictive license from a patent holder.  Therefore, we insist that\r\nany patent license obtained for a version of the library must be\r\nconsistent with the full freedom of use specified in this license.\r\n\r\n  Most GNU software, including some libraries, is covered by the\r\nordinary GNU General Public License.  This license, the GNU Lesser\r\nGeneral Public License, applies to certain designated libraries, and\r\nis quite different from the ordinary General Public License.  We use\r\nthis license for certain libraries in order to permit linking those\r\nlibraries into non-free programs.\r\n\r\n  When a program is linked with a library, whether statically or using\r\na shared library, the combination of the two is legally speaking a\r\ncombined work, a derivative of the original library.  The ordinary\r\nGeneral Public License therefore permits such linking only if the\r\nentire combination fits its criteria of freedom.  The Lesser General\r\nPublic License permits more lax criteria for linking other code with\r\nthe library.\r\n\r\n  We call this license the \"Lesser\" General Public License because it\r\ndoes Less to protect the user's freedom than the ordinary General\r\nPublic License.  It also provides other free software developers Less\r\nof an advantage over competing non-free programs.  These disadvantages\r\nare the reason we use the ordinary General Public License for many\r\nlibraries.  However, the Lesser license provides advantages in certain\r\nspecial circumstances.\r\n\r\n  For example, on rare occasions, there may be a special need to\r\nencourage the widest possible use of a certain library, so that it becomes\r\na de-facto standard.  To achieve this, non-free programs must be\r\nallowed to use the library.  A more frequent case is that a free\r\nlibrary does the same job as widely used non-free libraries.  In this\r\ncase, there is little to gain by limiting the free library to free\r\nsoftware only, so we use the Lesser General Public License.\r\n\r\n  In other cases, permission to use a particular library in non-free\r\nprograms enables a greater number of people to use a large body of\r\nfree software.  For example, permission to use the GNU C Library in\r\nnon-free programs enables many more people to use the whole GNU\r\noperating system, as well as its variant, the GNU/Linux operating\r\nsystem.\r\n\r\n  Although the Lesser General Public License is Less protective of the\r\nusers' freedom, it does ensure that the user of a program that is\r\nlinked with the Library has the freedom and the wherewithal to run\r\nthat program using a modified version of the Library.\r\n\r\n  The precise terms and conditions for copying, distribution and\r\nmodification follow.  Pay close attention to the difference between a\r\n\"work based on the library\" and a \"work that uses the library\".  The\r\nformer contains code derived from the library, whereas the latter must\r\nbe combined with the library in order to run.\r\n\r\n                  GNU LESSER GENERAL PUBLIC LICENSE\r\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r\n\r\n  0. This License Agreement applies to any software library or other\r\nprogram which contains a notice placed by the copyright holder or\r\nother authorized party saying it may be distributed under the terms of\r\nthis Lesser General Public License (also called \"this License\").\r\nEach licensee is addressed as \"you\".\r\n\r\n  A \"library\" means a collection of software functions and/or data\r\nprepared so as to be conveniently linked with application programs\r\n(which use some of those functions and data) to form executables.\r\n\r\n  The \"Library\", below, refers to any such software library or work\r\nwhich has been distributed under these terms.  A \"work based on the\r\nLibrary\" means either the Library or any derivative work under\r\ncopyright law: that is to say, a work containing the Library or a\r\nportion of it, either verbatim or with modifications and/or translated\r\nstraightforwardly into another language.  (Hereinafter, translation is\r\nincluded without limitation in the term \"modification\".)\r\n\r\n  \"Source code\" for a work means the preferred form of the work for\r\nmaking modifications to it.  For a library, complete source code means\r\nall the source code for all modules it contains, plus any associated\r\ninterface definition files, plus the scripts used to control compilation\r\nand installation of the library.\r\n\r\n  Activities other than copying, distribution and modification are not\r\ncovered by this License; they are outside its scope.  The act of\r\nrunning a program using the Library is not restricted, and output from\r\nsuch a program is covered only if its contents constitute a work based\r\non the Library (independent of the use of the Library in a tool for\r\nwriting it).  Whether that is true depends on what the Library does\r\nand what the program that uses the Library does.\r\n\r\n  1. You may copy and distribute verbatim copies of the Library's\r\ncomplete source code as you receive it, in any medium, provided that\r\nyou conspicuously and appropriately publish on each copy an\r\nappropriate copyright notice and disclaimer of warranty; keep intact\r\nall the notices that refer to this License and to the absence of any\r\nwarranty; and distribute a copy of this License along with the\r\nLibrary.\r\n\r\n  You may charge a fee for the physical act of transferring a copy,\r\nand you may at your option offer warranty protection in exchange for a\r\nfee.\r\n\r\n  2. You may modify your copy or copies of the Library or any portion\r\nof it, thus forming a work based on the Library, and copy and\r\ndistribute such modifications or work under the terms of Section 1\r\nabove, provided that you also meet all of these conditions:\r\n\r\n    a) The modified work must itself be a software library.\r\n\r\n    b) You must cause the files modified to carry prominent notices\r\n    stating that you changed the files and the date of any change.\r\n\r\n    c) You must cause the whole of the work to be licensed at no\r\n    charge to all third parties under the terms of this License.\r\n\r\n    d) If a facility in the modified Library refers to a function or a\r\n    table of data to be supplied by an application program that uses\r\n    the facility, other than as an argument passed when the facility\r\n    is invoked, then you must make a good faith effort to ensure that,\r\n    in the event an application does not supply such function or\r\n    table, the facility still operates, and performs whatever part of\r\n    its purpose remains meaningful.\r\n\r\n    (For example, a function in a library to compute square roots has\r\n    a purpose that is entirely well-defined independent of the\r\n    application.  Therefore, Subsection 2d requires that any\r\n    application-supplied function or table used by this function must\r\n    be optional: if the application does not supply it, the square\r\n    root function must still compute square roots.)\r\n\r\nThese requirements apply to the modified work as a whole.  If\r\nidentifiable sections of that work are not derived from the Library,\r\nand can be reasonably considered independent and separate works in\r\nthemselves, then this License, and its terms, do not apply to those\r\nsections when you distribute them as separate works.  But when you\r\ndistribute the same sections as part of a whole which is a work based\r\non the Library, the distribution of the whole must be on the terms of\r\nthis License, whose permissions for other licensees extend to the\r\nentire whole, and thus to each and every part regardless of who wrote\r\nit.\r\n\r\nThus, it is not the intent of this section to claim rights or contest\r\nyour rights to work written entirely by you; rather, the intent is to\r\nexercise the right to control the distribution of derivative or\r\ncollective works based on the Library.\r\n\r\nIn addition, mere aggregation of another work not based on the Library\r\nwith the Library (or with a work based on the Library) on a volume of\r\na storage or distribution medium does not bring the other work under\r\nthe scope of this License.\r\n\r\n  3. You may opt to apply the terms of the ordinary GNU General Public\r\nLicense instead of this License to a given copy of the Library.  To do\r\nthis, you must alter all the notices that refer to this License, so\r\nthat they refer to the ordinary GNU General Public License, version 2,\r\ninstead of to this License.  (If a newer version than version 2 of the\r\nordinary GNU General Public License has appeared, then you can specify\r\nthat version instead if you wish.)  Do not make any other change in\r\nthese notices.\r\n\r\n  Once this change is made in a given copy, it is irreversible for\r\nthat copy, so the ordinary GNU General Public License applies to all\r\nsubsequent copies and derivative works made from that copy.\r\n\r\n  This option is useful when you wish to copy part of the code of\r\nthe Library into a program that is not a library.\r\n\r\n  4. You may copy and distribute the Library (or a portion or\r\nderivative of it, under Section 2) in object code or executable form\r\nunder the terms of Sections 1 and 2 above provided that you accompany\r\nit with the complete corresponding machine-readable source code, which\r\nmust be distributed under the terms of Sections 1 and 2 above on a\r\nmedium customarily used for software interchange.\r\n\r\n  If distribution of object code is made by offering access to copy\r\nfrom a designated place, then offering equivalent access to copy the\r\nsource code from the same place satisfies the requirement to\r\ndistribute the source code, even though third parties are not\r\ncompelled to copy the source along with the object code.\r\n\r\n  5. A program that contains no derivative of any portion of the\r\nLibrary, but is designed to work with the Library by being compiled or\r\nlinked with it, is called a \"work that uses the Library\".  Such a\r\nwork, in isolation, is not a derivative work of the Library, and\r\ntherefore falls outside the scope of this License.\r\n\r\n  However, linking a \"work that uses the Library\" with the Library\r\ncreates an executable that is a derivative of the Library (because it\r\ncontains portions of the Library), rather than a \"work that uses the\r\nlibrary\".  The executable is therefore covered by this License.\r\nSection 6 states terms for distribution of such executables.\r\n\r\n  When a \"work that uses the Library\" uses material from a header file\r\nthat is part of the Library, the object code for the work may be a\r\nderivative work of the Library even though the source code is not.\r\nWhether this is true is especially significant if the work can be\r\nlinked without the Library, or if the work is itself a library.  The\r\nthreshold for this to be true is not precisely defined by law.\r\n\r\n  If such an object file uses only numerical parameters, data\r\nstructure layouts and accessors, and small macros and small inline\r\nfunctions (ten lines or less in length), then the use of the object\r\nfile is unrestricted, regardless of whether it is legally a derivative\r\nwork.  (Executables containing this object code plus portions of the\r\nLibrary will still fall under Section 6.)\r\n\r\n  Otherwise, if the work is a derivative of the Library, you may\r\ndistribute the object code for the work under the terms of Section 6.\r\nAny executables containing that work also fall under Section 6,\r\nwhether or not they are linked directly with the Library itself.\r\n\r\n  6. As an exception to the Sections above, you may also combine or\r\nlink a \"work that uses the Library\" with the Library to produce a\r\nwork containing portions of the Library, and distribute that work\r\nunder terms of your choice, provided that the terms permit\r\nmodification of the work for the customer's own use and reverse\r\nengineering for debugging such modifications.\r\n\r\n  You must give prominent notice with each copy of the work that the\r\nLibrary is used in it and that the Library and its use are covered by\r\nthis License.  You must supply a copy of this License.  If the work\r\nduring execution displays copyright notices, you must include the\r\ncopyright notice for the Library among them, as well as a reference\r\ndirecting the user to the copy of this License.  Also, you must do one\r\nof these things:\r\n\r\n    a) Accompany the work with the complete corresponding\r\n    machine-readable source code for the Library including whatever\r\n    changes were used in the work (which must be distributed under\r\n    Sections 1 and 2 above); and, if the work is an executable linked\r\n    with the Library, with the complete machine-readable \"work that\r\n    uses the Library\", as object code and/or source code, so that the\r\n    user can modify the Library and then relink to produce a modified\r\n    executable containing the modified Library.  (It is understood\r\n    that the user who changes the contents of definitions files in the\r\n    Library will not necessarily be able to recompile the application\r\n    to use the modified definitions.)\r\n\r\n    b) Use a suitable shared library mechanism for linking with the\r\n    Library.  A suitable mechanism is one that (1) uses at run time a\r\n    copy of the library already present on the user's computer system,\r\n    rather than copying library functions into the executable, and (2)\r\n    will operate properly with a modified version of the library, if\r\n    the user installs one, as long as the modified version is\r\n    interface-compatible with the version that the work was made with.\r\n\r\n    c) Accompany the work with a written offer, valid for at\r\n    least three years, to give the same user the materials\r\n    specified in Subsection 6a, above, for a charge no more\r\n    than the cost of performing this distribution.\r\n\r\n    d) If distribution of the work is made by offering access to copy\r\n    from a designated place, offer equivalent access to copy the above\r\n    specified materials from the same place.\r\n\r\n    e) Verify that the user has already received a copy of these\r\n    materials or that you have already sent this user a copy.\r\n\r\n  For an executable, the required form of the \"work that uses the\r\nLibrary\" must include any data and utility programs needed for\r\nreproducing the executable from it.  However, as a special exception,\r\nthe materials to be distributed need not include anything that is\r\nnormally distributed (in either source or binary form) with the major\r\ncomponents (compiler, kernel, and so on) of the operating system on\r\nwhich the executable runs, unless that component itself accompanies\r\nthe executable.\r\n\r\n  It may happen that this requirement contradicts the license\r\nrestrictions of other proprietary libraries that do not normally\r\naccompany the operating system.  Such a contradiction means you cannot\r\nuse both them and the Library together in an executable that you\r\ndistribute.\r\n\r\n  7. You may place library facilities that are a work based on the\r\nLibrary side-by-side in a single library together with other library\r\nfacilities not covered by this License, and distribute such a combined\r\nlibrary, provided that the separate distribution of the work based on\r\nthe Library and of the other library facilities is otherwise\r\npermitted, and provided that you do these two things:\r\n\r\n    a) Accompany the combined library with a copy of the same work\r\n    based on the Library, uncombined with any other library\r\n    facilities.  This must be distributed under the terms of the\r\n    Sections above.\r\n\r\n    b) Give prominent notice with the combined library of the fact\r\n    that part of it is a work based on the Library, and explaining\r\n    where to find the accompanying uncombined form of the same work.\r\n\r\n  8. You may not copy, modify, sublicense, link with, or distribute\r\nthe Library except as expressly provided under this License.  Any\r\nattempt otherwise to copy, modify, sublicense, link with, or\r\ndistribute the Library is void, and will automatically terminate your\r\nrights under this License.  However, parties who have received copies,\r\nor rights, from you under this License will not have their licenses\r\nterminated so long as such parties remain in full compliance.\r\n\r\n  9. You are not required to accept this License, since you have not\r\nsigned it.  However, nothing else grants you permission to modify or\r\ndistribute the Library or its derivative works.  These actions are\r\nprohibited by law if you do not accept this License.  Therefore, by\r\nmodifying or distributing the Library (or any work based on the\r\nLibrary), you indicate your acceptance of this License to do so, and\r\nall its terms and conditions for copying, distributing or modifying\r\nthe Library or works based on it.\r\n\r\n  10. Each time you redistribute the Library (or any work based on the\r\nLibrary), the recipient automatically receives a license from the\r\noriginal licensor to copy, distribute, link with or modify the Library\r\nsubject to these terms and conditions.  You may not impose any further\r\nrestrictions on the recipients' exercise of the rights granted herein.\r\nYou are not responsible for enforcing compliance by third parties with\r\nthis License.\r\n\r\n  11. If, as a consequence of a court judgment or allegation of patent\r\ninfringement or for any other reason (not limited to patent issues),\r\nconditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot\r\ndistribute so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you\r\nmay not distribute the Library at all.  For example, if a patent\r\nlicense would not permit royalty-free redistribution of the Library by\r\nall those who receive copies directly or indirectly through you, then\r\nthe only way you could satisfy both it and this License would be to\r\nrefrain entirely from distribution of the Library.\r\n\r\nIf any portion of this section is held invalid or unenforceable under any\r\nparticular circumstance, the balance of the section is intended to apply,\r\nand the section as a whole is intended to apply in other circumstances.\r\n\r\nIt is not the purpose of this section to induce you to infringe any\r\npatents or other property right claims or to contest validity of any\r\nsuch claims; this section has the sole purpose of protecting the\r\nintegrity of the free software distribution system which is\r\nimplemented by public license practices.  Many people have made\r\ngenerous contributions to the wide range of software distributed\r\nthrough that system in reliance on consistent application of that\r\nsystem; it is up to the author/donor to decide if he or she is willing\r\nto distribute software through any other system and a licensee cannot\r\nimpose that choice.\r\n\r\nThis section is intended to make thoroughly clear what is believed to\r\nbe a consequence of the rest of this License.\r\n\r\n  12. If the distribution and/or use of the Library is restricted in\r\ncertain countries either by patents or by copyrighted interfaces, the\r\noriginal copyright holder who places the Library under this License may add\r\nan explicit geographical distribution limitation excluding those countries,\r\nso that distribution is permitted only in or among countries not thus\r\nexcluded.  In such case, this License incorporates the limitation as if\r\nwritten in the body of this License.\r\n\r\n  13. The Free Software Foundation may publish revised and/or new\r\nversions of the Lesser General Public License from time to time.\r\nSuch new versions will be similar in spirit to the present version,\r\nbut may differ in detail to address new problems or concerns.\r\n\r\nEach version is given a distinguishing version number.  If the Library\r\nspecifies a version number of this License which applies to it and\r\n\"any later version\", you have the option of following the terms and\r\nconditions either of that version or of any later version published by\r\nthe Free Software Foundation.  If the Library does not specify a\r\nlicense version number, you may choose any version ever published by\r\nthe Free Software Foundation.\r\n\r\n  14. If you wish to incorporate parts of the Library into other free\r\nprograms whose distribution conditions are incompatible with these,\r\nwrite to the author to ask for permission.  For software which is\r\ncopyrighted by the Free Software Foundation, write to the Free\r\nSoftware Foundation; we sometimes make exceptions for this.  Our\r\ndecision will be guided by the two goals of preserving the free status\r\nof all derivatives of our free software and of promoting the sharing\r\nand reuse of software generally.\r\n\r\n                            NO WARRANTY\r\n\r\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\r\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\r\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\r\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\r\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\r\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\r\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r\n\r\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\r\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\r\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\r\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\r\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\r\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\r\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\r\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\r\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\r\nDAMAGES.\r\n\r\n                     END OF TERMS AND CONDITIONS\r\n\r\n----------------------------------------------------------------------------------------\r\nSQLNado\r\n\r\nMIT License\r\n\r\nCopyright (c) 2017-2023 Simon Mourier\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nprotobuf-net\r\n\r\nThe core Protocol Buffers technology is provided courtesy of Google.\r\nAt the time of writing, this is released under the BSD license.\r\nFull details can be found here:\r\n\r\nhttp://code.google.com/p/protobuf/\r\n\r\n\r\nThis .NET implementation is Copyright 2008 Marc Gravell\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License.\r\n\r\n----------------------------------------------------------------------------------------\r\nPrism\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) .NET Foundation\r\n\r\nAll rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nPolly\r\n\r\nNew BSD License\r\n=\r\nCopyright (c) 2015-2020, App vNext\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n    * Redistributions of source code must retain the above copyright\r\n      notice, this list of conditions and the following disclaimer.\r\n    * Redistributions in binary form must reproduce the above copyright\r\n      notice, this list of conditions and the following disclaimer in the\r\n      documentation and/or other materials provided with the distribution.\r\n    * Neither the name of App vNext nor the\r\n      names of its contributors may be used to endorse or promote products\r\n      derived from this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\nDISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\r\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n----------------------------------------------------------------------------------------\r\nNUnit\r\n\r\nCopyright (c) 2019 Charlie Poole, Rob Prouse\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nNLog\r\n\r\n\r\nCopyright (c) 2004-2020 Jaroslaw Kowalski <jaak@jkowalski.net>, Kim Christensen, Julian Verdurmen\r\n\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions\r\nare met:\r\n\r\n* Redistributions of source code must retain the above copyright notice,\r\n  this list of conditions and the following disclaimer.\r\n\r\n* Redistributions in binary form must reproduce the above copyright notice,\r\n  this list of conditions and the following disclaimer in the documentation\r\n  and/or other materials provided with the distribution.\r\n\r\n* Neither the name of Jaroslaw Kowalski nor the names of its\r\n  contributors may be used to endorse or promote products derived from this\r\n  software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\nTHE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n----------------------------------------------------------------------------------------\r\nNewtonsoft.Json\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2007 James Newton-King\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the \"Software\"), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\nthe Software, and to permit persons to whom the Software is furnished to do so,\r\nsubject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nNett\r\n\r\nCopyright (c) 2015 paiden@outlook.com.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of this software and associated documentation files (the\r\n\"Software\"), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be\r\nincluded in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nmoq\r\n\r\nBSD 3-Clause License\r\n\r\nCopyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD,\r\nand Contributors. All rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without\r\nmodification, are permitted provided that the following conditions are met:\r\n\r\n    * Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions and the following disclaimer.\r\n\r\n    * Redistributions in binary form must reproduce the above copyright\r\n    notice, this list of conditions and the following disclaimer in the\r\n    documentation and/or other materials provided with the distribution.\r\n\r\n    * Neither the names of the copyright holders nor the names of its\r\n    contributors may be used to endorse or promote products derived from this\r\n    software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\r\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n----------------------------------------------------------------------------------------\r\nmarkdig\r\n\r\nCopyright (c) 2018-2019, Alexandre Mutel\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without modification\r\n, are permitted provided that the following conditions are met:\r\n\r\n1. Redistributions of source code must retain the above copyright notice, this\r\n   list of conditions and the following disclaimer.\r\n\r\n2. Redistributions in binary form must reproduce the above copyright notice,\r\n   this list of conditions and the following disclaimer in the documentation\r\n   and/or other materials provided with the distribution.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n----------------------------------------------------------------------------------------\r\nInputSimulatorPlus\r\n\r\nMs-PL\r\nMicrosoft Public License (Ms-PL)\r\n\r\nThis license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.\r\n\r\n1. Definitions\r\n\r\nThe terms \"reproduce,\" \"reproduction,\" \"derivative works,\" and \"distribution\" have the same meaning here as under U.S. copyright law.\r\n\r\nA \"contribution\" is the original software, or any additions or changes to the software.\r\n\r\nA \"contributor\" is any person that distributes its contribution under this license.\r\n\r\n\"Licensed patents\" are a contributor's patent claims that read directly on its contribution.\r\n\r\n2. Grant of Rights\r\n\r\n(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.\r\n\r\n(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.\r\n\r\n3. Conditions and Limitations\r\n\r\n(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.\r\n\r\n(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.\r\n\r\n(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.\r\n\r\n(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.\r\n\r\n(E) The software is licensed \"as-is.\" You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.\r\n\r\n----------------------------------------------------------------------------------------\r\nwpf-notifyicon\r\n\r\nThe Code Project Open License (CPOL)\r\n\r\nPreamble\r\n\r\n\tThis License governs Your use of the Work. This License is intended to allow developers\r\n\tto use the Source Code and Executable Files provided as part of the Work in any\r\n\tapplication in any form.\r\n\r\n\tThe main points subject to the terms of the License are:\r\n\r\n\t\t- Source Code and Executable Files can be used in commercial applications;\r\n\t\t- Source Code and Executable Files can be redistributed; and\r\n\t\t- Source Code can be modified to create derivative works.\r\n\t\t- No claim of suitability, guarantee, or any warranty whatsoever is provided. The software is\r\n\t\t\tprovided \"as-is\".\r\n\t\t- The Article(s) accompanying the Work may not be distributed or republished without the\r\n\t\t\tAuthor's consent\r\n\r\n\tThis License is entered between You, the individual or other entity reading or otherwise\r\n\tmaking use of the Work licensed pursuant to this License and the individual or other\r\n\tentity which offers the Work under the terms of this License (\"Author\").\r\n\r\nLicense\r\n\tTHE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CODE PROJECT OPEN\r\n\tLICENSE (\"LICENSE\"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE\r\n\tLAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT\r\n\tLAW IS PROHIBITED.\r\n\r\n\tBY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE TO BE\r\n\tBOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS CONTAINED HEREIN\r\n\tIN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. IF YOU DO NOT\r\n\tAGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS LICENSE, YOU CANNOT MAKE ANY\r\n\tUSE OF THE WORK.\r\n\r\n\t1.\tDefinitions.\r\n\r\n\t\t\ta.\t\"Articles\" means, collectively, all articles written by Author\r\n\t\t\t\twhich describes how the Source Code and Executable Files for the Work may be used\r\n\t\t\t\tby a user.\r\n\t\t\tb.\t\"Author\" means the individual or entity that offers the Work under the terms\r\n\t\t\t\tof this License.\r\n\t\t\tc.\t\"Derivative Work\" means a work based upon the Work or upon the\r\n\t\t\t\tWork and other pre-existing works.\r\n\t\t\td.\t\"Executable Files\" refer to the executables, binary files, configuration\r\n\t\t\t\tand any required data files included in the Work.\r\n\t\t\te.\t\"Publisher\" means the provider of the website, magazine, CD-ROM, DVD or other\r\n\t\t\t\tmedium from or by which the Work is obtained by You.\r\n\t\t\tf.\t\"Source Code\" refers to the collection of source code and configuration files\r\n\t\t\t\tused to create the Executable Files.\r\n\t\t\tg.\t\"Standard Version\" refers to such a Work if it has not been modified, or\r\n\t\t\t\thas been modified in accordance with the consent of the Author, such consent being\r\n\t\t\t\tin the full discretion of the Author.\r\n\t\t\th.\t\"Work\" refers to the collection of files distributed by the Publisher, including\r\n\t\t\t\tthe Source Code, Executable Files, binaries, data files, documentation, whitepapers\r\n\t\t\t\tand the Articles.\r\n\t\t\ti.\t\"You\" is you, an individual or entity wishing to use the Work and exercise\r\n\t\t\t\tyour rights under this License.\r\n\t2. \tFair Use/Fair Use Rights. Nothing in this License is intended to\r\n\t\t\treduce, limit, or restrict any rights arising from fair use, fair dealing, first\r\n\t\t\tsale or other limitations on the exclusive rights of the copyright owner under copyright\r\n\t\t\tlaw or other applicable laws.\r\n\r\n\t3.\tLicense Grant. Subject to the terms and conditions of this License,\r\n\t\tthe Author hereby grants You a worldwide, royalty-free, non-exclusive, perpetual\r\n\t\t(for the duration of the applicable copyright) license to exercise the rights in\r\n\t\tthe Work as stated below:\r\n\r\n\t\t\ta.\tYou may use the standard version of the Source Code or Executable Files in Your\r\n\t\t\t\town applications.\r\n\t\t\tb.\tYou may apply bug fixes, portability fixes and other modifications obtained from\r\n\t\t\t\tthe Public Domain or from the Author. A Work modified in such a way shall still\r\n\t\t\t\tbe considered the standard version and will be subject to this License.\r\n\t\t\tc.\tYou may otherwise modify Your copy of this Work (excluding the Articles) in any\r\n\t\t\t\tway to create a Derivative Work, provided that You insert a prominent notice in\r\n\t\t\t\teach changed file stating how, when and where You changed that file.\r\n\t\t\td.\tYou may distribute the standard version of the Executable Files and Source Code\r\n\t\t\t\tor Derivative Work in aggregate with other (possibly commercial) programs as part\r\n\t\t\t\tof a larger (possibly commercial) software distribution.\r\n\t\t\te.\tThe Articles discussing the Work published in any form by the author may not be\r\n\t\t\t\tdistributed or republished without the Author&#39;s consent. The author retains\r\n\t\t\t\tcopyright to any such Articles. You may use the Executable Files and Source Code\r\n\t\t\t\tpursuant to this License but you may not repost or republish or otherwise distribute\r\n\t\t\t\tor make available the Articles, without the prior written consent of the Author.\r\n\r\n\t\tAny subroutines or modules supplied by You and linked into the Source Code or Executable\r\n\t\tFiles of this Work shall not be considered part of this Work and will not be subject\r\n\t\tto the terms of this License.\r\n\r\n\r\n\t4.\tPatent License. Subject to the terms and conditions of this License,\r\n\teach Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,\r\n\tirrevocable (except as stated in this section) patent license to make, have made, use, import,\r\n\tand otherwise transfer the Work.\r\n\r\n\t5.\tRestrictions. The license granted in Section 3 above is expressly\r\n\t\tmade subject to and limited by the following restrictions:\r\n\r\n\t\ta.\tYou agree not to remove any of the original copyright, patent, trademark, and\r\n\t\t\tattribution notices and associated disclaimers that may appear in the Source Code\r\n\t\t\tor Executable Files.\r\n\t\tb.\tYou agree not to advertise or in any way imply that this Work is a product of Your\r\n\t\t\town.\r\n\t\tc.\tThe name of the Author may not be used to endorse or promote products derived from\r\n\t\t\tthe Work without the prior written consent of the Author.\r\n\t\td.\tYou agree not to sell, lease, or rent any part of the Work. This does not restrict\r\n\t\t\tyou from including the Work or any part of the Work inside a larger software\r\n\t\t\tdistribution that itself is being sold. The Work by itself, though, cannot be sold,\r\n\t\t\tleased or rented.\r\n\t\te.\tYou may distribute the Executable Files and Source Code only under the terms of\r\n\t\t\tthis License, and You must include a copy of, or the Uniform Resource Identifier\r\n\t\t\tfor, this License with every copy of the Executable Files or Source Code You distribute\r\n\t\t\tand ensure that anyone receiving such Executable Files and Source Code agrees that\r\n\t\t\tthe terms of this License apply to such Executable Files and/or Source Code. You\r\n\t\t\tmay not offer or impose any terms on the Work that alter or restrict the terms of\r\n\t\t\tthis License or the recipients&#39; exercise of the rights granted hereunder. You\r\n\t\t\tmay not sublicense the Work. You must keep intact all notices that refer to this\r\n\t\t\tLicense and to the disclaimer of warranties. You may not distribute the Executable\r\n\t\t\tFiles or Source Code with any technological measures that control access or use\r\n\t\t\tof the Work in a manner inconsistent with the terms of this License.\r\n\t\tf.\tYou agree not to use the Work for illegal, immoral or improper purposes, or on pages\r\n\t\t\tcontaining illegal, immoral or improper material. The Work is subject to applicable\r\n\t\t\texport laws. You agree to comply with all such laws and regulations that may apply\r\n\t\t\tto the Work after Your receipt of the Work.\r\n\r\n\t6.\tRepresentations, Warranties and Disclaimer. THIS WORK IS PROVIDED\r\n\t\t\"AS IS\", \"WHERE IS\" AND \"AS AVAILABLE\", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES\r\n\t\tOR CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, INCLUDING\r\n\t\tCOPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. AUTHOR EXPRESSLY\r\n\t\tDISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES OR CONDITIONS, INCLUDING\r\n\t\tWITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF MERCHANTABILITY, MERCHANTABLE QUALITY\r\n\t\tOR FITNESS FOR A PARTICULAR PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT,\r\n\t\tOR THAT THE WORK (OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF\r\n\t\tVIRUSES. YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE\r\n\t\tWORKS.\r\n\r\n\t7.\tIndemnity. You agree to defend, indemnify and hold harmless the Author and\r\n\t\tthe Publisher from and against any claims, suits, losses, damages, liabilities,\r\n\t\tcosts, and expenses (including reasonable legal or attorneys’ fees) resulting from\r\n\t\tor relating to any use of the Work by You.\r\n\r\n\t8.\tLimitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE\r\n\t\tLAW, IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL\r\n\t\tTHEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES\r\n\t\tARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, EVEN IF THE AUTHOR\r\n\t\tOR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\r\n\r\n\t9. Termination.\r\n\r\n\t\ta.\tThis License and the rights granted hereunder will terminate automatically upon\r\n\t\t\tany breach by You of any term of this License. Individuals or entities who have\r\n\t\t\treceived Derivative Works from You under this License, however, will not have their\r\n\t\t\tlicenses terminated provided such individuals or entities remain in full compliance\r\n\t\t\twith those licenses. Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination\r\n\t\t\tof this License.\r\n\r\n\t\tb.\tIf You bring a copyright, trademark, patent or any other infringement claim against\r\n\t\t\tany contributor over infringements You claim are made by the Work, your License\r\n\t\t\tfrom such contributor to the Work ends automatically.\r\n\r\n\t\tc.\tSubject to the above terms and conditions, this License is perpetual (for the duration\r\n\t\t\tof the applicable copyright in the Work). Notwithstanding the above, the Author\r\n\t\t\treserves the right to release the Work under different license terms or to stop\r\n\t\t\tdistributing the Work at any time; provided, however that any such election will\r\n\t\t\tnot serve to withdraw this License (or any other license that has been, or is required\r\n\t\t\tto be, granted under the terms of this License), and this License will continue\r\n\t\t\tin full force and effect unless terminated as stated above.\r\n\r\n\t10. Publisher. The parties hereby confirm that the Publisher shall\r\n\t\tnot, under any circumstances, be responsible for and shall not have any liability\r\n\t\tin respect of the subject matter of this License. The Publisher makes no warranty\r\n\t\twhatsoever in connection with the Work and shall not be liable to You or any party\r\n\t\ton any legal theory for any damages whatsoever, including without limitation any\r\n\t\tgeneral, special, incidental or consequential damages arising in connection to this\r\n\t\tlicense. The Publisher reserves the right to cease making the Work available to\r\n\t\tYou at any time without notice\r\n\r\n\t11.\tMiscellaneous\r\n\r\n\t\ta.\tThis License shall be governed by the laws of the location of the head office of\r\n\t\t\tthe Author or if the Author is an individual, the laws of location of the principal\r\n\t\t\tplace of residence of the Author.\r\n\t\tb.\tIf any provision of this License is invalid or unenforceable under applicable law,\r\n\t\t\t\tit shall not affect the validity or enforceability of the remainder of the terms\r\n\t\t\t\tof this License, and without further action by the parties to this License, such\r\n\t\t\t\tprovision shall be reformed to the minimum extent necessary to make such provision\r\n\t\t\t\tvalid and enforceable.\r\n\t\tc.\tNo term or provision of this License shall be deemed waived and no breach consented\r\n\t\t\tto unless such waiver or consent shall be in writing and signed by the party to\r\n\t\t\tbe charged with such waiver or consent.\r\n\t\td.\tThis License constitutes the entire agreement between the parties with respect to\r\n\t\t\tthe Work licensed herein. There are no understandings, agreements or representations\r\n\t\t\twith respect to the Work not specified herein. The Author shall not be bound by\r\n\t\t\tany additional provisions that may appear in any communication from You. This License\r\n\t\t\tmay not be modified without the mutual written agreement of the Author and You.\r\n\r\n----------------------------------------------------------------------------------------\r\nFlurl\r\n\r\nMIT License\r\n\r\nCopyright (c) 2018 Todd Menier\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nDynamicLanguageRuntime\r\n\r\nSPDX identifier\r\n\r\nApache-2.0\r\nLicense text\r\n\r\n Apache License\r\n\r\nVersion 2.0, January 2004\r\n\r\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n   1. Definitions.\r\n\r\n\r\n\r\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n\r\n\r\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\r\n\r\n\r\n\r\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n\r\n\r\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\r\n\r\n\r\n\r\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\r\n\r\n\r\n\r\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\r\n\r\n\r\n\r\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\r\n\r\n\r\n\r\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\r\n\r\n\r\n\r\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n\r\n\r\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\r\n\r\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\r\n\r\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\r\n\r\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\r\n\r\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\r\n\r\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\r\n\r\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\r\n\r\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\r\n\r\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\r\n\r\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\r\n\r\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\r\n\r\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\r\n\r\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\r\n\r\nAPPENDIX: How to apply the Apache License to your work.\r\n\r\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\r\n\r\nCopyright _____\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\nhttp://www.apache.org/licenses/LICENSE-2.0\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n----------------------------------------------------------------------------------------\r\nCommonServiceLocator\r\n\r\nMicrosoft Public License (MS-PL)\r\nThis license governs use of the accompanying software. If you use the software, you\r\naccept this license. If you do not accept the license, do not use the software.\r\n\r\n1. Definitions\r\nThe terms \"reproduce,\" \"reproduction,\" \"derivative works,\" and \"distribution\" have the\r\nsame meaning here as under U.S. copyright law.\r\nA \"contribution\" is the original software, or any additions or changes to the software.\r\nA \"contributor\" is any person that distributes its contribution under this license.\r\n\"Licensed patents\" are a contributor's patent claims that read directly on its contribution.\r\n\r\n2. Grant of Rights\r\n(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.\r\n(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.\r\n\r\n3. Conditions and Limitations\r\n(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.\r\n(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.\r\n(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.\r\n(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.\r\n(E) The software is licensed \"as-is.\" You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.\r\n\r\n----------------------------------------------------------------------------------------\r\nCommandLineParser\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2005 - 2015 Giacomo Stelluti Scala & Contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nCefSharp\r\n\r\n// Copyright © The CefSharp Authors. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without\r\n// modification, are permitted provided that the following conditions are\r\n// met:\r\n//\r\n//    * Redistributions of source code must retain the above copyright\r\n//      notice, this list of conditions and the following disclaimer.\r\n//\r\n//    * Redistributions in binary form must reproduce the above\r\n//      copyright notice, this list of conditions and the following disclaimer\r\n//      in the documentation and/or other materials provided with the\r\n//      distribution.\r\n//\r\n//    * Neither the name of Google Inc. nor the name Chromium Embedded\r\n//      Framework nor the name CefSharp nor the names of its contributors\r\n//      may be used to endorse or promote products derived from this software\r\n//      without specific prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n----------------------------------------------------------------------------------------\r\nCEF\r\n// Copyright (c) 2008-2020 Marshall A. Greenblatt. Portions Copyright (c)\r\n// 2006-2009 Google Inc. All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without\r\n// modification, are permitted provided that the following conditions are\r\n// met:\r\n//\r\n//    * Redistributions of source code must retain the above copyright\r\n// notice, this list of conditions and the following disclaimer.\r\n//    * Redistributions in binary form must reproduce the above\r\n// copyright notice, this list of conditions and the following disclaimer\r\n// in the documentation and/or other materials provided with the\r\n// distribution.\r\n//    * Neither the name of Google Inc. nor the name Chromium Embedded\r\n// Framework nor the names of its contributors may be used to endorse\r\n// or promote products derived from this software without specific prior\r\n// written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n\r\n----------------------------------------------------------------------------------------\r\nCastle.Core\r\n\r\nCopyright 2004-2016 Castle Project - http://www.castleproject.org/\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n     http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n\r\n----------------------------------------------------------------------------------------\r\nAngleSharp\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2013 - 2019 AngleSharp\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nHTML-Renderer\r\n\r\nCopyright (c) 2009, José Manuel Menéndez Poo\r\nCopyright (c) 2013, Arthur Teplitzki\r\nAll rights reserved.\r\n\r\nRedistribution and use in source and binary forms, with or without modification,\r\nare permitted provided that the following conditions are met:\r\n\r\n  Redistributions of source code must retain the above copyright notice, this\r\n  list of conditions and the following disclaimer.\r\n\r\n  Redistributions in binary form must reproduce the above copyright notice, this\r\n  list of conditions and the following disclaimer in the documentation and/or\r\n  other materials provided with the distribution.\r\n\r\n  Neither the name of the menendezpoo.com, ArthurHub nor the names of its\r\n  contributors may be used to endorse or promote products derived from\r\n  this software without specific prior written permission.\r\n\r\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\r\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\r\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\r\n----------------------------------------------------------------------------------------\r\nLiteDB\r\n\r\nThe MIT License (MIT)\r\n\r\nCopyright (c) 2014-2020 Mauricio David\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n\r\n----------------------------------------------------------------------------------------\r\nSDL2\r\n\r\nCopyright (C) 1997-2023 Sam Lantinga <slouken@libsdl.org>\r\n\r\nThis software is provided 'as-is', without any express or implied\r\nwarranty.  In no event will the authors be held liable for any damages\r\narising from the use of this software.\r\n\r\nPermission is granted to anyone to use this software for any purpose,\r\nincluding commercial applications, and to alter it and redistribute it\r\nfreely, subject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\n   claim that you wrote the original software. If you use this software\r\n   in a product, an acknowledgment in the product documentation would be\r\n   appreciated but is not required.\r\n2. Altered source versions must be plainly marked as such, and must not be\r\n   misrepresented as being the original software.\r\n3. This notice may not be removed or altered from any source distribution.\r\n\r\n----------------------------------------------------------------------------------------\r\nSDL2-CS\r\n\r\n/* SDL2# - C# Wrapper for SDL2\r\n *\r\n * Copyright (c) 2013-2021 Ethan Lee.\r\n *\r\n * This software is provided 'as-is', without any express or implied warranty.\r\n * In no event will the authors be held liable for any damages arising from\r\n * the use of this software.\r\n *\r\n * Permission is granted to anyone to use this software for any purpose,\r\n * including commercial applications, and to alter it and redistribute it\r\n * freely, subject to the following restrictions:\r\n *\r\n * 1. The origin of this software must not be misrepresented; you must not\r\n * claim that you wrote the original software. If you use this software in a\r\n * product, an acknowledgment in the product documentation would be\r\n * appreciated but is not required.\r\n *\r\n * 2. Altered source versions must be plainly marked as such, and must not be\r\n * misrepresented as being the original software.\r\n *\r\n * 3. This notice may not be removed or altered from any source distribution.\r\n *\r\n * Ethan \"flibitijibibo\" Lee <flibitijibibo@flibitijibibo.com>\r\n *\r\n */\r\n\r\n----------------------------------------------------------------------------------------\r\nSDL_mixer\r\n\r\nCopyright (C) 1997-2023 Sam Lantinga <slouken@libsdl.org>\r\n\r\nThis software is provided 'as-is', without any express or implied\r\nwarranty.  In no event will the authors be held liable for any damages\r\narising from the use of this software.\r\n\r\nPermission is granted to anyone to use this software for any purpose,\r\nincluding commercial applications, and to alter it and redistribute it\r\nfreely, subject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\n   claim that you wrote the original software. If you use this software\r\n   in a product, an acknowledgment in the product documentation would be\r\n   appreciated but is not required.\r\n2. Altered source versions must be plainly marked as such, and must not be\r\n   misrepresented as being the original software.\r\n3. This notice may not be removed or altered from any source distribution.\r\n\r\n----------------------------------------------------------------------------------------\r\nMagick.NET\r\n\r\nApache License\r\n                           Version 2.0, January 2004\r\n                        http://www.apache.org/licenses/\r\n\r\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\r\n\r\n   1. Definitions.\r\n\r\n      \"License\" shall mean the terms and conditions for use, reproduction,\r\n      and distribution as defined by Sections 1 through 9 of this document.\r\n\r\n      \"Licensor\" shall mean the copyright owner or entity authorized by\r\n      the copyright owner that is granting the License.\r\n\r\n      \"Legal Entity\" shall mean the union of the acting entity and all\r\n      other entities that control, are controlled by, or are under common\r\n      control with that entity. For the purposes of this definition,\r\n      \"control\" means (i) the power, direct or indirect, to cause the\r\n      direction or management of such entity, whether by contract or\r\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\r\n      outstanding shares, or (iii) beneficial ownership of such entity.\r\n\r\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\r\n      exercising permissions granted by this License.\r\n\r\n      \"Source\" form shall mean the preferred form for making modifications,\r\n      including but not limited to software source code, documentation\r\n      source, and configuration files.\r\n\r\n      \"Object\" form shall mean any form resulting from mechanical\r\n      transformation or translation of a Source form, including but\r\n      not limited to compiled object code, generated documentation,\r\n      and conversions to other media types.\r\n\r\n      \"Work\" shall mean the work of authorship, whether in Source or\r\n      Object form, made available under the License, as indicated by a\r\n      copyright notice that is included in or attached to the work\r\n      (an example is provided in the Appendix below).\r\n\r\n      \"Derivative Works\" shall mean any work, whether in Source or Object\r\n      form, that is based on (or derived from) the Work and for which the\r\n      editorial revisions, annotations, elaborations, or other modifications\r\n      represent, as a whole, an original work of authorship. For the purposes\r\n      of this License, Derivative Works shall not include works that remain\r\n      separable from, or merely link (or bind by name) to the interfaces of,\r\n      the Work and Derivative Works thereof.\r\n\r\n      \"Contribution\" shall mean any work of authorship, including\r\n      the original version of the Work and any modifications or additions\r\n      to that Work or Derivative Works thereof, that is intentionally\r\n      submitted to Licensor for inclusion in the Work by the copyright owner\r\n      or by an individual or Legal Entity authorized to submit on behalf of\r\n      the copyright owner. For the purposes of this definition, \"submitted\"\r\n      means any form of electronic, verbal, or written communication sent\r\n      to the Licensor or its representatives, including but not limited to\r\n      communication on electronic mailing lists, source code control systems,\r\n      and issue tracking systems that are managed by, or on behalf of, the\r\n      Licensor for the purpose of discussing and improving the Work, but\r\n      excluding communication that is conspicuously marked or otherwise\r\n      designated in writing by the copyright owner as \"Not a Contribution.\"\r\n\r\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\r\n      on behalf of whom a Contribution has been received by Licensor and\r\n      subsequently incorporated within the Work.\r\n\r\n   2. Grant of Copyright License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      copyright license to reproduce, prepare Derivative Works of,\r\n      publicly display, publicly perform, sublicense, and distribute the\r\n      Work and such Derivative Works in Source or Object form.\r\n\r\n   3. Grant of Patent License. Subject to the terms and conditions of\r\n      this License, each Contributor hereby grants to You a perpetual,\r\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\r\n      (except as stated in this section) patent license to make, have made,\r\n      use, offer to sell, sell, import, and otherwise transfer the Work,\r\n      where such license applies only to those patent claims licensable\r\n      by such Contributor that are necessarily infringed by their\r\n      Contribution(s) alone or by combination of their Contribution(s)\r\n      with the Work to which such Contribution(s) was submitted. If You\r\n      institute patent litigation against any entity (including a\r\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\r\n      or a Contribution incorporated within the Work constitutes direct\r\n      or contributory patent infringement, then any patent licenses\r\n      granted to You under this License for that Work shall terminate\r\n      as of the date such litigation is filed.\r\n\r\n   4. Redistribution. You may reproduce and distribute copies of the\r\n      Work or Derivative Works thereof in any medium, with or without\r\n      modifications, and in Source or Object form, provided that You\r\n      meet the following conditions:\r\n\r\n      (a) You must give any other recipients of the Work or\r\n          Derivative Works a copy of this License; and\r\n\r\n      (b) You must cause any modified files to carry prominent notices\r\n          stating that You changed the files; and\r\n\r\n      (c) You must retain, in the Source form of any Derivative Works\r\n          that You distribute, all copyright, patent, trademark, and\r\n          attribution notices from the Source form of the Work,\r\n          excluding those notices that do not pertain to any part of\r\n          the Derivative Works; and\r\n\r\n      (d) If the Work includes a \"NOTICE\" text file as part of its\r\n          distribution, then any Derivative Works that You distribute must\r\n          include a readable copy of the attribution notices contained\r\n          within such NOTICE file, excluding those notices that do not\r\n          pertain to any part of the Derivative Works, in at least one\r\n          of the following places: within a NOTICE text file distributed\r\n          as part of the Derivative Works; within the Source form or\r\n          documentation, if provided along with the Derivative Works; or,\r\n          within a display generated by the Derivative Works, if and\r\n          wherever such third-party notices normally appear. The contents\r\n          of the NOTICE file are for informational purposes only and\r\n          do not modify the License. You may add Your own attribution\r\n          notices within Derivative Works that You distribute, alongside\r\n          or as an addendum to the NOTICE text from the Work, provided\r\n          that such additional attribution notices cannot be construed\r\n          as modifying the License.\r\n\r\n      You may add Your own copyright statement to Your modifications and\r\n      may provide additional or different license terms and conditions\r\n      for use, reproduction, or distribution of Your modifications, or\r\n      for any such Derivative Works as a whole, provided Your use,\r\n      reproduction, and distribution of the Work otherwise complies with\r\n      the conditions stated in this License.\r\n\r\n   5. Submission of Contributions. Unless You explicitly state otherwise,\r\n      any Contribution intentionally submitted for inclusion in the Work\r\n      by You to the Licensor shall be under the terms and conditions of\r\n      this License, without any additional terms or conditions.\r\n      Notwithstanding the above, nothing herein shall supersede or modify\r\n      the terms of any separate license agreement you may have executed\r\n      with Licensor regarding such Contributions.\r\n\r\n   6. Trademarks. This License does not grant permission to use the trade\r\n      names, trademarks, service marks, or product names of the Licensor,\r\n      except as required for reasonable and customary use in describing the\r\n      origin of the Work and reproducing the content of the NOTICE file.\r\n\r\n   7. Disclaimer of Warranty. Unless required by applicable law or\r\n      agreed to in writing, Licensor provides the Work (and each\r\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\r\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\r\n      implied, including, without limitation, any warranties or conditions\r\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\r\n      PARTICULAR PURPOSE. You are solely responsible for determining the\r\n      appropriateness of using or redistributing the Work and assume any\r\n      risks associated with Your exercise of permissions under this License.\r\n\r\n   8. Limitation of Liability. In no event and under no legal theory,\r\n      whether in tort (including negligence), contract, or otherwise,\r\n      unless required by applicable law (such as deliberate and grossly\r\n      negligent acts) or agreed to in writing, shall any Contributor be\r\n      liable to You for damages, including any direct, indirect, special,\r\n      incidental, or consequential damages of any character arising as a\r\n      result of this License or out of the use or inability to use the\r\n      Work (including but not limited to damages for loss of goodwill,\r\n      work stoppage, computer failure or malfunction, or any and all\r\n      other commercial damages or losses), even if such Contributor\r\n      has been advised of the possibility of such damages.\r\n\r\n   9. Accepting Warranty or Additional Liability. While redistributing\r\n      the Work or Derivative Works thereof, You may choose to offer,\r\n      and charge a fee for, acceptance of support, warranty, indemnity,\r\n      or other liability obligations and/or rights consistent with this\r\n      License. However, in accepting such obligations, You may act only\r\n      on Your own behalf and on Your sole responsibility, not on behalf\r\n      of any other Contributor, and only if You agree to indemnify,\r\n      defend, and hold each Contributor harmless for any liability\r\n      incurred by, or claims asserted against, such Contributor by reason\r\n      of your accepting any such warranty or additional liability.\r\n\r\n   END OF TERMS AND CONDITIONS\r\n\r\n   APPENDIX: How to apply the Apache License to your work.\r\n\r\n      To apply the Apache License to your work, attach the following\r\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\r\n      replaced with your own identifying information. (Don't include\r\n      the brackets!)  The text should be enclosed in the appropriate\r\n      comment syntax for the file format. We also recommend that a\r\n      file or class name and description of purpose be included on the\r\n      same \"printed page\" as the copyright notice for easier\r\n      identification within third-party archives.\r\n\r\n   Copyright [yyyy] [name of copyright owner]\r\n\r\n   Licensed under the Apache License, Version 2.0 (the \"License\");\r\n   you may not use this file except in compliance with the License.\r\n   You may obtain a copy of the License at\r\n\r\n       http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n   Unless required by applicable law or agreed to in writing, software\r\n   distributed under the License is distributed on an \"AS IS\" BASIS,\r\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n   See the License for the specific language governing permissions and\r\n   limitations under the License."
  },
  {
    "path": "source/Playnite/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"AngleSharp\" version=\"0.9.9\" targetFramework=\"net452\" />\r\n  <package id=\"CefSharp.Common\" version=\"144.0.120\" targetFramework=\"net462\" />\r\n  <package id=\"CefSharp.OffScreen\" version=\"144.0.120\" targetFramework=\"net462\" />\r\n  <package id=\"CefSharp.Wpf\" version=\"144.0.120\" targetFramework=\"net462\" />\r\n  <package id=\"CommandLineParser\" version=\"2.8.0\" targetFramework=\"net462\" />\r\n  <package id=\"CommonServiceLocator\" version=\"1.3\" targetFramework=\"net462\" />\r\n  <package id=\"Crc32.NET\" version=\"1.2.0\" targetFramework=\"net462\" />\r\n  <package id=\"DynamicLanguageRuntime\" version=\"1.2.1\" targetFramework=\"net462\" />\r\n  <package id=\"Expression.Blend.Sdk\" version=\"1.0.2\" targetFramework=\"net462\" />\r\n  <package id=\"Flurl\" version=\"2.7.1\" targetFramework=\"net462\" />\r\n  <package id=\"chromiumembeddedframework.runtime.win-x64\" version=\"144.0.12\" targetFramework=\"net462\" />\r\n  <package id=\"chromiumembeddedframework.runtime.win-x86\" version=\"144.0.12\" targetFramework=\"net462\" />\r\n  <package id=\"LiteDB\" version=\"4.1.4\" targetFramework=\"net462\" />\r\n  <package id=\"Magick.NET.Core\" version=\"14.10.2\" targetFramework=\"net462\" />\r\n  <package id=\"Magick.NET.SystemWindowsMedia\" version=\"8.0.15\" targetFramework=\"net462\" />\r\n  <package id=\"Magick.NET-Q8-x86\" version=\"14.10.2\" targetFramework=\"net462\" />\r\n  <package id=\"Markdig\" version=\"0.18.0\" targetFramework=\"net462\" />\r\n  <package id=\"Microsoft.Xaml.Behaviors.Wpf\" version=\"1.1.39\" targetFramework=\"net462\" />\r\n  <package id=\"Nett\" version=\"0.10.1\" targetFramework=\"net462\" />\r\n  <package id=\"Newtonsoft.Json\" version=\"10.0.3\" targetFramework=\"net462\" />\r\n  <package id=\"NLog\" version=\"4.7.6\" targetFramework=\"net462\" />\r\n  <package id=\"PhotoSauce.MagicScaler\" version=\"0.11.2\" targetFramework=\"net462\" />\r\n  <package id=\"Polly\" version=\"5.1.0\" targetFramework=\"net462\" />\r\n  <package id=\"Prism.Core\" version=\"6.3.0\" targetFramework=\"net462\" />\r\n  <package id=\"Prism.Wpf\" version=\"6.3.0\" targetFramework=\"net462\" />\r\n  <package id=\"protobuf-net\" version=\"2.0.0.668\" targetFramework=\"net452\" />\r\n  <package id=\"System.Buffers\" version=\"4.5.1\" targetFramework=\"net462\" />\r\n  <package id=\"System.IO.Abstractions\" version=\"2.1.0.227\" targetFramework=\"net462\" />\r\n  <package id=\"System.Memory\" version=\"4.5.4\" targetFramework=\"net462\" />\r\n  <package id=\"System.Numerics.Vectors\" version=\"4.5.0\" targetFramework=\"net462\" />\r\n  <package id=\"System.Runtime.CompilerServices.Unsafe\" version=\"4.5.3\" targetFramework=\"net462\" />\r\n  <package id=\"System.Runtime.InteropServices.RuntimeInformation\" version=\"4.3.0\" targetFramework=\"net462\" />\r\n  <package id=\"System.ValueTuple\" version=\"4.5.0\" targetFramework=\"net462\" />\r\n  <package id=\"WindowsAPICodePack\" version=\"1.1.0\" targetFramework=\"net452\" />\r\n  <package id=\"YamlDotNet\" version=\"5.4.0\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Playnite.DesktopApp/Api/MainViewAPI.cs",
    "content": "﻿using Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Threading;\r\n\r\nnamespace Playnite.DesktopApp.API\r\n{\r\n    public class MainViewAPI : IMainViewAPI\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private DesktopAppViewModel mainModel;\r\n\r\n        public IEnumerable<Game> SelectedGames\r\n        {\r\n            get\r\n            {\r\n                return UIDispatcher.Invoke(() =>\r\n                {\r\n                    if (mainModel.SelectedGames == null && mainModel.SelectedGame != null)\r\n                    {\r\n                        return new List<Game>() { mainModel.SelectedGame.Game };\r\n                    }\r\n                    else\r\n                    {\r\n                        return mainModel.SelectedGames?.Select(a => a.Game).ToList();\r\n                    }\r\n                });\r\n            }\r\n        }\r\n\r\n        public DesktopView ActiveDesktopView\r\n        {\r\n            get => mainModel.AppSettings.ViewSettings.GamesViewType;\r\n            set => mainModel.AppSettings.ViewSettings.GamesViewType = value;\r\n        }\r\n\r\n        public FullscreenView ActiveFullscreenView { get; } = FullscreenView.List;\r\n\r\n        public SortOrder SortOrder\r\n        {\r\n            get => mainModel.AppSettings.ViewSettings.SortingOrder;\r\n            set => mainModel.AppSettings.ViewSettings.SortingOrder = value;\r\n        }\r\n\r\n        public SortOrderDirection SortOrderDirection\r\n        {\r\n            get => mainModel.AppSettings.ViewSettings.SortingOrderDirection;\r\n            set => mainModel.AppSettings.ViewSettings.SortingOrderDirection = value;\r\n        }\r\n\r\n        public GroupableField Grouping\r\n        {\r\n            get => mainModel.AppSettings.ViewSettings.GroupingOrder;\r\n            set => mainModel.AppSettings.ViewSettings.GroupingOrder = value;\r\n        }\r\n\r\n        public List<Game> FilteredGames => UIDispatcher.Invoke(() => mainModel.GamesView.CollectionView.Cast<GamesCollectionViewEntry>().Select(a => a.Game).Distinct().ToList());\r\n\r\n        public Dispatcher UIDispatcher => PlayniteApplication.CurrentNative.Dispatcher;\r\n\r\n        public MainViewAPI(DesktopAppViewModel mainModel)\r\n        {\r\n            this.mainModel = mainModel;\r\n        }\r\n\r\n        public bool OpenPluginSettings(Guid pluginId)\r\n        {\r\n            return mainModel.OpenPluginSettings(pluginId);\r\n        }\r\n\r\n        public void SwitchToLibraryView()\r\n        {\r\n            mainModel.SwitchToLibraryView();\r\n        }\r\n\r\n        public void SelectGame(Guid gameId)\r\n        {\r\n            var game = mainModel.Database.Games.Get(gameId);\r\n            if (game == null)\r\n            {\r\n                logger.Error($\"Can't select game, game ID {gameId} not found.\");\r\n            }\r\n            else\r\n            {\r\n                mainModel.SelectGame(game.Id);\r\n            }\r\n        }\r\n\r\n        public void SelectGames(IEnumerable<Guid> gameIds)\r\n        {\r\n            mainModel.SelectGames(gameIds);\r\n        }\r\n\r\n        public void ApplyFilterPreset(Guid filterId)\r\n        {\r\n            mainModel.ApplyFilterPreset(filterId);\r\n        }\r\n\r\n        public void ApplyFilterPreset(FilterPreset preset)\r\n        {\r\n            mainModel.ActiveFilterPreset = preset;\r\n        }\r\n\r\n        public Guid GetActiveFilterPreset()\r\n        {\r\n            return mainModel.AppSettings.SelectedFilterPreset;\r\n        }\r\n\r\n        public FilterPresetSettings GetCurrentFilterSettings()\r\n        {\r\n            return mainModel.AppSettings.FilterSettings.AsPresetSettings();\r\n        }\r\n\r\n        public void OpenSearch(string searchTerm)\r\n        {\r\n            mainModel.OpenSearch(searchTerm);\r\n        }\r\n\r\n        public void OpenSearch(SearchContext context, string searchTerm)\r\n        {\r\n            mainModel.OpenSearch(context, searchTerm);\r\n        }\r\n\r\n        public bool? OpenEditDialog(Guid gameId)\r\n        {\r\n            var game = mainModel.Database.Games.Get(gameId);\r\n            if (game is null)\r\n                return null;\r\n\r\n            return mainModel.GamesEditor.EditGame(game);\r\n        }\r\n\r\n        public bool? OpenEditDialog(List<Guid> gameIds)\r\n        {\r\n            var games = mainModel.Database.Games.Get(gameIds);\r\n            if (!games.HasItems())\r\n                return null;\r\n\r\n            return mainModel.GamesEditor.EditGames(games);\r\n        }\r\n\r\n        public List<FilterPreset> GetSortedFilterPresets()\r\n        {\r\n            return mainModel.SortedFilterPresets.ToList();\r\n        }\r\n\r\n        public List<FilterPreset> GetSortedFilterFullscreenPresets()\r\n        {\r\n            return mainModel.SortedFilterFullscreenPresets.ToList();\r\n        }\r\n\r\n        public void ToggleFullscreenView()\r\n        {\r\n            throw new NotSupportedInDesktopException();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n  <startup> \r\n      <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\" />\r\n  </startup>\r\n  <appSettings file=\"Common.config\">\r\n  </appSettings>\r\n  <runtime>\r\n    <enforceFIPSPolicy enabled=\"false\" />\r\n    <loadFromRemoteSources enabled=\"True\" />\r\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.4.0\" newVersion=\"4.1.4.0\" />\r\n      </dependentAssembly>\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Runtime.InteropServices.RuntimeInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.2.0\" newVersion=\"4.0.2.0\" />\r\n      </dependentAssembly>\r\n    </assemblyBinding>\r\n  </runtime>\r\n</configuration>"
  },
  {
    "path": "source/Playnite.DesktopApp/App.xaml",
    "content": "﻿<Application x:Class=\"Playnite.DesktopApp.App\"            \r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"             \r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    \r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n    \r\n    <Application.Resources>\r\n        <ResourceDictionary>\r\n            <ResourceDictionary.MergedDictionaries>\r\n                <ResourceDictionary Source=\"/Playnite;component/Localization/LocSource.xaml\"/>\r\n                <ResourceDictionary Source=\"GlobalResources.xaml\" />\r\n                <ResourceDictionary Source=\"ControlGalleryView.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Constants.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Common.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Media.xaml\" />\r\n\r\n                <!--Default Controls-->\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/Border.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/TextBlock.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/TextBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/Button.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/ComboBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/ContextMenu.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/DatePicker.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/Expander.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/GridSplitter.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/GroupBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/Hyperlink.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/CheckBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/Label.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/ListBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/ListView.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/Menu.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/PasswordBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/Popup.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/ProgressBar.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/RadioButton.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/RepeatButton.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/RichTextBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/ScrollViewer.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/Slider.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/TabControl.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/Thumb.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/ToggleButton.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/ToolTip.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/TreeView.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DefaultControls/DataGrid.xaml\" />\r\n\r\n                <!--Custom Controls-->\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/ExtendedListBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/ExtendedListView.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/ExtendedDataGrid.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/GameMenu.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/GameGroupMenu.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/HtmlTextView.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/TrayContextMenu.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/NumericBoxes.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/SliderEx.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/ExpanderEx.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/WindowBase.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/SidebarItem.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/ComboBoxList.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/FilterSelectionBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/SearchBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/TopPanelItem.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/PathSelectionBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/CustomControls/HotKeyBox.xaml\" />\r\n\r\n                <!--Derived Styles-->\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/TextBlockGameScore.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/PropertyItemButton.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/DetailsScrollViewer.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/Simplebutton.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/GridViewGroupStyle.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/GridViewItemStyle.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/GridViewItemTemplate.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/DetailsViewItemTemplate.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/DetailsViewGroupStyle.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/DetailsViewItemStyle.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/ListViewGroupStyle.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/StandardWindowStyle.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/WindowBarButton.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/BottomButton.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/DetailsHyperlink.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/HighlightBorder.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/ImageHighlightButton.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/MainWindowStyle.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/PlayButton.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/DerivedStyles/NotificationMessage.xaml\" />\r\n\r\n                <!--Views-->\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/Sidebar.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/ExplorerPanel.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/FilterPanelView.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/TopPanel.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/NotificationPanel.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/DetailsViewGameOverview.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/GridViewGameOverview.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/LibraryDetailsView.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/LibraryGridView.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/LibraryListView.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/Library.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/MainWindow.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Desktop/Default/Views/SearchView.xaml\" />\r\n            </ResourceDictionary.MergedDictionaries>\r\n        </ResourceDictionary>\r\n    </Application.Resources>\r\n</Application>"
  },
  {
    "path": "source/Playnite.DesktopApp/App.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Configuration;\r\nusing System.Data;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.DesktopApp\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for App.xaml\r\n    /// </summary>\r\n    public partial class App : Application\r\n    {\r\n        public App()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ControlGalleryView.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"ControlGalleryContentStyle\" TargetType=\"{x:Type ContentControl}\">        \r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ContentControl}\">\r\n                    <DockPanel Background=\"{DynamicResource WindowBackgourndBrush}\"\r\n                               d:DesignWidth=\"800\" d:DesignHeight=\"700\">\r\n                        <Menu DockPanel.Dock=\"Top\">\r\n                            <MenuItem Header=\"_File\">\r\n                                <MenuItem Header=\"_New\" />\r\n                                <MenuItem Header=\"Open\" IsEnabled=\"False\" />\r\n                                <MenuItem Header=\"Save\" IsChecked=\"True\" IsCheckable=\"True\"/>\r\n                                <Separator />\r\n                                <MenuItem Header=\"Exit\">\r\n                                    <MenuItem Header=\"Test\" />\r\n                                    <MenuItem Header=\"Test2\" />\r\n                                </MenuItem>\r\n                            </MenuItem>\r\n\r\n                            <MenuItem Header=\"Test\" IsEnabled=\"False\">\r\n                                <MenuItem Header=\"_New\" />\r\n                            </MenuItem>\r\n\r\n                            <MenuItem Header=\"Test2\" >\r\n                                <MenuItem Header=\"New\" />\r\n                            </MenuItem>\r\n                        </Menu>\r\n\r\n                        <TabControl TabStripPlacement=\"Top\">\r\n                            <TabItem Header=\"Test\">\r\n                                <Grid>\r\n                                    <Grid.ColumnDefinitions>\r\n                                        <ColumnDefinition />\r\n                                        <ColumnDefinition />\r\n                                    </Grid.ColumnDefinitions>\r\n                                    <StackPanel Margin=\"10\" Grid.Column=\"0\">\r\n                                        <StackPanel Orientation=\"Horizontal\">\r\n                                            <Button Content=\"Button\" HorizontalAlignment=\"Left\" Margin=\"5\">\r\n                                                <Button.ContextMenu>\r\n                                                    <ContextMenu>\r\n                                                        <MenuItem Header=\"Test1\" />\r\n                                                        <Separator />\r\n                                                        <MenuItem Header=\"Test2\">\r\n                                                            <MenuItem Header=\"Test1\" />\r\n                                                        </MenuItem>\r\n                                                    </ContextMenu>\r\n                                                </Button.ContextMenu>\r\n                                            </Button>\r\n                                            <RepeatButton Content=\"RepeatButton\" HorizontalAlignment=\"Left\" Margin=\"5\"\r\n                                    ToolTip=\"Testing tooltip for a button\"/>\r\n                                            <ToggleButton Content=\"ToggleButton\"\r\n                                HorizontalAlignment=\"Left\" Margin=\"5\" />\r\n                                        </StackPanel>\r\n\r\n                                        <UniformGrid Columns=\"2\">\r\n                                            <CheckBox Content=\"TestCheckbox\" IsChecked=\"True\" HorizontalAlignment=\"Left\" IsThreeState=\"True\" Margin=\"5\"/>\r\n                                            <TextBlock VerticalAlignment=\"Center\">           \r\n                        <Hyperlink>\r\n                            Hyperlink Click here\r\n                        </Hyperlink>\r\n                                            </TextBlock>\r\n                                        </UniformGrid>\r\n                                        <UniformGrid Columns=\"2\">\r\n                                            <ComboBox IsEditable=\"True\" Text=\"Test2\" Margin=\"5\"\r\n                                HorizontalAlignment=\"Stretch\"/>\r\n                                            <ComboBox SelectedIndex=\"1\" Margin=\"5\"\r\n                                HorizontalAlignment=\"Stretch\">\r\n                                                <ComboBoxItem Content=\"Test1\"/>\r\n                                                <ComboBoxItem Content=\"Test2\"/>\r\n                                                <ComboBoxItem Content=\"Test3\"/>\r\n                                                <ComboBoxItem Content=\"Test1\"/>\r\n                                                <ComboBoxItem Content=\"Test2\"/>\r\n                                                <ComboBoxItem Content=\"Test3\"/>\r\n                                                <ComboBoxItem Content=\"Test1\"/>\r\n                                                <ComboBoxItem Content=\"Test2\"/>\r\n                                                <ComboBoxItem Content=\"Test3\"/>\r\n                                                <ComboBoxItem Content=\"Test1\"/>\r\n                                                <ComboBoxItem Content=\"Test2\"/>\r\n                                                <ComboBoxItem Content=\"Test3\"/>\r\n                                                <ComboBoxItem Content=\"Test1\"/>\r\n                                                <ComboBoxItem Content=\"Test2\"/>\r\n                                                <ComboBoxItem Content=\"Test3\"/>\r\n                                                <ComboBoxItem Content=\"Test1\"/>\r\n                                                <ComboBoxItem Content=\"Test2\"/>\r\n                                                <ComboBoxItem Content=\"Test3\"/>\r\n                                                <ComboBoxItem Content=\"Test3\"/>\r\n                                                <ComboBoxItem Content=\"Test1\"/>\r\n                                                <ComboBoxItem Content=\"Test2\"/>\r\n                                                <ComboBoxItem Content=\"Test3\"/>\r\n                                                <ComboBoxItem Content=\"Test1\"/>\r\n                                                <ComboBoxItem Content=\"Test2\"/>\r\n                                                <ComboBoxItem Content=\"Test3\"/>\r\n                                                <ComboBoxItem Content=\"Test3\"/>\r\n                                                <ComboBoxItem Content=\"Test1\"/>\r\n                                            </ComboBox>\r\n                                        </UniformGrid>\r\n                                        <TextBlock Text=\"Test text just test text\" Margin=\"5\"/>\r\n                                        <TextBox Text=\"Test text just test text\" Margin=\"5\" />\r\n                                        <TextBox Height=\"50\" TextWrapping=\"Wrap\"  AcceptsReturn=\"True\" Text=\"This TextBox will allow the user to enter multiple lines of text.  When the RETURN key is pressed, \r\nor when typed text reaches the edge of the text box, a new line is automatically inserted.\" VerticalScrollBarVisibility=\"Auto\" Margin=\"5\"/>\r\n                                        <PasswordBox Password=\"test\" Margin=\"5\"/>\r\n                                        <Expander Header=\"TestExpander\" IsExpanded=\"True\" Margin=\"5\">\r\n                                            <ListView Height=\"100\"\r\n                                Name=\"listview\"\r\n                                SelectedIndex=\"1\"  Margin=\"5\">\r\n                                                <ListView.View>\r\n                                                    <GridView>\r\n                                                        <GridViewColumn Header=\"Name\" Width=\"120\" DisplayMemberBinding=\"{Binding Name}\" />\r\n                                                        <GridViewColumn Header=\"Age\" Width=\"50\" DisplayMemberBinding=\"{Binding Age}\" />\r\n                                                        <GridViewColumn Header=\"Mail\" Width=\"150\" DisplayMemberBinding=\"{Binding Mail}\" />\r\n                                                    </GridView>\r\n                                                </ListView.View>\r\n                                                <ListViewItem Content=\"Tea\"></ListViewItem>\r\n                                                <ListViewItem Content=\"Test\"></ListViewItem>\r\n                                            </ListView>\r\n                                        </Expander>\r\n                                        <ListBox SelectedIndex=\"1\" Margin=\"5\" Height=\"100\">\r\n                                            <ListBoxItem Content=\"ListItem 1\" />\r\n                                            <ListBoxItem Content=\"ListItem 2\" />\r\n                                            <ListBoxItem Content=\"ListItem 3\" />\r\n                                            <ListBoxItem Content=\"ListItem 1\" />\r\n                                            <ListBoxItem Content=\"ListItem 2\" />\r\n                                            <ListBoxItem Content=\"ListItem 3\" />\r\n                                            <ListBoxItem Content=\"ListItem 1\" />\r\n                                            <ListBoxItem Content=\"ListItem 2\" />\r\n                                            <ListBoxItem Content=\"ListItem 3\" />\r\n                                        </ListBox>\r\n\r\n                                    </StackPanel>\r\n                                    <StackPanel Grid.Column=\"1\">\r\n                                        <pctrls:NullIntNumericBox Margin=\"5\" />\r\n                                        <pctrls:LongNumericBox Margin=\"5\" />\r\n                                        <pctrls:SearchBox Margin=\"5\" />\r\n                                        <pctrls:FilterSelectionBox Margin=\"5\" />\r\n                                        <pctrls:DdItemListSelectionBox Margin=\"5\" />\r\n\r\n                                        <GroupBox Header=\"Test Groubox\" Margin=\"5\">\r\n                                            <StackPanel>\r\n                                                <ProgressBar Value=\"30\" Margin=\"5\" Width=\"342\" Height=\"20\" />\r\n                                                <RadioButton Content=\"RadioButton1\" IsChecked=\"True\" GroupName=\"test\"  Margin=\"5\"/>\r\n                                                <RadioButton Content=\"RadioButton2\" GroupName=\"test\" Margin=\"5\" />\r\n                                            </StackPanel>\r\n                                        </GroupBox>\r\n\r\n                                        <TreeView Margin=\"5\">\r\n                                            <TreeViewItem Header=\"Level 1\" IsExpanded=\"True\">\r\n                                                <TreeViewItem Header=\"Level 2.1\" IsSelected=\"True\" />\r\n                                                <TreeViewItem Header=\"Level 2.2\" IsExpanded=\"True\" >\r\n                                                    <TreeViewItem Header=\"Level 3.1\" />\r\n                                                    <TreeViewItem Header=\"Level 3.2\" />\r\n                                                </TreeViewItem>\r\n                                                <TreeViewItem Header=\"Level 2.2\" IsExpanded=\"False\" >\r\n                                                    <TreeViewItem Header=\"Level 3.1\" />\r\n                                                    <TreeViewItem Header=\"Level 3.2\" />\r\n                                                </TreeViewItem>\r\n                                            </TreeViewItem>\r\n                                        </TreeView>\r\n\r\n                                        <ScrollViewer Width=\"100\" Height=\"100\"\r\n                                HorizontalScrollBarVisibility=\"Auto\" Margin=\"5\">\r\n                                            <Viewbox Width=\"200\" Height=\"200\">\r\n                                                <TextBlock Text=\"R\" />\r\n                                            </Viewbox>\r\n                                        </ScrollViewer>\r\n                                    </StackPanel>\r\n                                </Grid>\r\n                            </TabItem>\r\n                            <TabItem Header=\"Test2\">\r\n                            </TabItem>\r\n                        </TabControl>\r\n                    </DockPanel>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/AddonsSections/AddonUpdates.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.AddonsSections.AddonUpdates\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"500\" d:DesignWidth=\"700\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n        \r\n        <p:BindingProxy x:Key=\"RootDataContext\" Data=\"{Binding}\" />\r\n    </UserControl.Resources>\r\n\r\n    <Grid Margin=\"5\">\r\n        <DockPanel Visibility=\"{Binding IsUpdateListLoading, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\">\r\n            <StackPanel DockPanel.Dock=\"Bottom\" HorizontalAlignment=\"Left\">\r\n                <Button Content=\"{DynamicResource LOCAddonUpdateAddons}\" Margin=\"0,5,0,0\"\r\n                        Visibility=\"{Binding IsUpdateAvailable, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                        Command=\"{Binding UpdateAddonsCommand}\"/>\r\n            </StackPanel>\r\n            <ScrollViewer DockPanel.Dock=\"Top\"\r\n                          HorizontalScrollBarVisibility=\"Disabled\"\r\n                          VerticalScrollBarVisibility=\"Auto\">\r\n                <ItemsControl ItemsSource=\"{Binding UpdateAddonList}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <Border Margin=\"2\"\r\n                                    BorderThickness=\"{DynamicResource ControlBorderThickness}\"\r\n                                    CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                                    BorderBrush=\"{DynamicResource NormalBorderBrush}\">\r\n                                <DockPanel>\r\n                                    <CheckBox DockPanel.Dock=\"Left\" VerticalAlignment=\"Top\" Margin=\"5,5,0,0\"\r\n                                              IsChecked=\"{Binding Selected}\"/>\r\n                                    <Expander DockPanel.Dock=\"Right\" Background=\"Transparent\" IsExpanded=\"True\">\r\n                                        <Expander.Header>\r\n                                            <DockPanel>\r\n                                                <TextBlock Text=\"{Binding Status, Converter={StaticResource ObjectToStringConverter}}\" DockPanel.Dock=\"Right\"\r\n                                                           ToolTip=\"{Binding StatusMessage}\" ToolTipService.InitialShowDelay=\"0\"\r\n                                                           VerticalAlignment=\"Center\" Margin=\"5,5,15,5\">\r\n                                                    <TextBlock.Style>\r\n                                                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                                            <Style.Triggers>\r\n                                                                <DataTrigger Binding=\"{Binding Status}\" Value=\"2\">\r\n                                                                    <Setter Property=\"Foreground\" Value=\"{DynamicResource WarningBrush}\" />\r\n                                                                </DataTrigger>\r\n                                                                <DataTrigger Binding=\"{Binding Status}\" Value=\"3\">\r\n                                                                    <Setter Property=\"Foreground\" Value=\"{DynamicResource WarningBrush}\" />\r\n                                                                </DataTrigger>\r\n                                                            </Style.Triggers>\r\n                                                        </Style>\r\n                                                    </TextBlock.Style>\r\n                                                </TextBlock>\r\n                                                <StackPanel DockPanel.Dock=\"Left\">\r\n                                                    <TextBlock Text=\"{Binding Item.Name}\" Margin=\"0,5,5,5\"\r\n                                                       Style=\"{StaticResource BaseTextBlockStyle}\"/>\r\n                                                    <TextBlock Text=\"{Binding UpdateInfo}\" Margin=\"0,0,5,5\"\r\n                                                       Style=\"{StaticResource BaseTextBlockStyle}\" />\r\n                                                </StackPanel>\r\n                                            </DockPanel>\r\n                                        </Expander.Header>\r\n                                        <TextBlock Text=\"{Binding Changelog}\" Margin=\"5,5,5,5\" TextWrapping=\"Wrap\"\r\n                                               Style=\"{StaticResource BaseTextBlockStyle}\"/>\r\n                                    </Expander>\r\n                                </DockPanel>\r\n                            </Border>                            \r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n            </ScrollViewer>\r\n        </DockPanel>\r\n        \r\n        <TextBlock Visibility=\"{Binding IsUpdateListLoading, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                   Text=\"{DynamicResource LOCAddonLookingForUpdates}\"\r\n                   HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n\r\n        <TextBlock Text=\"{DynamicResource LOCAddonNoAddonsAvailable}\"\r\n                   HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\r\n            <TextBlock.Style>\r\n                <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                    <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                    <Style.Triggers>\r\n                        <MultiDataTrigger>\r\n                            <MultiDataTrigger.Conditions>\r\n                                <Condition Binding=\"{Binding IsUpdateAvailable}\" Value=\"False\" />\r\n                                <Condition Binding=\"{Binding IsUpdateListLoading}\" Value=\"False\" />\r\n                            </MultiDataTrigger.Conditions>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                        </MultiDataTrigger>\r\n                    </Style.Triggers>\r\n                </Style>\r\n            </TextBlock.Style>\r\n        </TextBlock>\r\n    </Grid>    \r\n</UserControl>"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/AddonsSections/AddonUpdates.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.AddonsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Extensions.xaml\r\n    /// </summary>\r\n    public partial class AddonUpdates : UserControl\r\n    {\r\n        public AddonUpdates()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/AddonsSections/BrowseAddons.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.AddonsSections.BrowseAddons\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n             xmlns:mkr=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"500\" d:DesignWidth=\"700\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n\r\n        <p:BindingProxy x:Key=\"RootDataContext\" Data=\"{Binding}\" />\r\n        <BitmapImage x:Key=\"FallbackIcon\" UriSource=\"{mkr:ThemeFile 'Images/applogo_dark.png'}\" />\r\n    </UserControl.Resources>\r\n\r\n    <Grid Margin=\"5\">\r\n        <Grid Visibility=\"{Binding IsOnlineListLoading, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"5*\" />\r\n                <ColumnDefinition Width=\"4\" />\r\n                <ColumnDefinition Width=\"4*\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"Auto\" />\r\n                <RowDefinition Height=\"*\" />\r\n            </Grid.RowDefinitions>\r\n\r\n            <DockPanel Grid.Column=\"0\" Margin=\"0,0,0,4\">\r\n                <Button Content=\"{DynamicResource LOCSearchLabel}\"\r\n                        Command=\"{Binding SearchAddonCommand}\"\r\n                        Margin=\"5,0,0,0\" DockPanel.Dock=\"Right\"/>\r\n                <TextBox Text=\"{Binding AddonSearchText, UpdateSourceTrigger=PropertyChanged, Delay=500}\"\r\n                         pbeh:FocusBahaviors.OnVisibilityFocus=\"True\"\r\n                         DockPanel.Dock=\"Left\">\r\n                    <TextBox.InputBindings>\r\n                        <KeyBinding Command=\"{Binding SearchAddonCommand}\" Key=\"Return\" />\r\n                    </TextBox.InputBindings>\r\n                </TextBox>\r\n            </DockPanel>\r\n\r\n            <ListBox ItemsSource=\"{Binding OnlineAddonList}\"\r\n                     SelectedItem=\"{Binding SelectedOnlineAddon}\"\r\n                     Name=\"ListOnlineAddons\" Grid.Column=\"0\" Grid.Row=\"1\"\r\n                     VirtualizingPanel.IsVirtualizing=\"True\"\r\n                     VirtualizingPanel.VirtualizationMode=\"Recycling\"\r\n                     VirtualizingPanel.ScrollUnit=\"Pixel\"\r\n                     ScrollViewer.CanContentScroll=\"True\"\r\n                     ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\">\r\n                <ListBox.ItemTemplate>\r\n                    <DataTemplate>\r\n                        <DockPanel>\r\n                            <Image Source=\"{Binding IconUrl, FallbackValue={StaticResource FallbackIcon}, TargetNullValue={StaticResource FallbackIcon}}\"\r\n                                   DockPanel.Dock=\"Left\" VerticalAlignment=\"Center\"\r\n                                   Width=\"32\" Height=\"32\" RenderOptions.BitmapScalingMode=\"Fant\" />\r\n                            <TextBlock Text=\"{Binding Name}\" FontWeight=\"Bold\" TextWrapping=\"Wrap\" DockPanel.Dock=\"Top\" Margin=\"5\" />\r\n                            <TextBlock Text=\"{Binding ShortDescription}\" TextWrapping=\"Wrap\" DockPanel.Dock=\"Top\"\r\n                                       Margin=\"5,0,5,5\"\r\n                                       FontSize=\"{DynamicResource FontSizeSmall}\"/>\r\n                        </DockPanel>\r\n                    </DataTemplate>\r\n                </ListBox.ItemTemplate>\r\n            </ListBox>\r\n\r\n            <GridSplitter Grid.Column=\"1\" Grid.Row=\"1\" Width=\"4\" HorizontalAlignment=\"Stretch\" />\r\n\r\n            <ScrollViewer Grid.Column=\"2\" Grid.Row=\"1\" Margin=\"15,0,5,0\"\r\n                          HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\">\r\n                <StackPanel DataContext=\"{Binding SelectedOnlineAddon}\"\r\n                            Visibility=\"{Binding SelectedItem, ElementName=ListOnlineAddons, Converter={StaticResource NullToVisibilityConverter}}\">\r\n                    <StackPanel Orientation=\"Horizontal\">\r\n                        <TextBlock Text=\"{DynamicResource LOCExtensionCreatedBy}\" />\r\n                        <TextBlock Text=\"{Binding Author}\" FontWeight=\"Bold\" Margin=\"5,0,0,0\" />\r\n                    </StackPanel>\r\n\r\n                    <StackPanel Orientation=\"Horizontal\" Margin=\"0,5,0,0\">\r\n                        <TextBlock Text=\"{DynamicResource LOCExtensionVersion}\" />\r\n                        <TextBlock Text=\"{Binding LatestPackage.Version}\" FontWeight=\"Bold\" Margin=\"5,0,0,0\" />\r\n                    </StackPanel>\r\n\r\n                    <StackPanel Orientation=\"Horizontal\" Margin=\"0,5,0,0\">\r\n                        <TextBlock Text=\"{DynamicResource LOCExtensionUpdated}\" />\r\n                        <TextBlock Text=\"{Binding LatestPackage.ReleaseDate, Converter={StaticResource NullableDateToStringConverter}}\" FontWeight=\"Bold\" Margin=\"5,0,0,0\" />\r\n                    </StackPanel>\r\n\r\n                    <ItemsControl Margin=\"0,10,0,0\" ItemsSource=\"{Binding Links}\">\r\n                        <ItemsControl.ItemTemplate>\r\n                            <DataTemplate>\r\n                                <TextBlock Margin=\"0,5,0,0\" ToolTip=\"{Binding Value, Mode=OneWay}\">\r\n                                    <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                                               CommandParameter=\"{Binding Value, Mode=OneWay}\">\r\n                                        <Run Text=\"{Binding Key, Mode=OneWay}\" />\r\n                                    </Hyperlink>\r\n                                </TextBlock>\r\n                            </DataTemplate>\r\n                        </ItemsControl.ItemTemplate>\r\n                    </ItemsControl>\r\n\r\n                    <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\">\r\n                        <Button Margin=\"0,0,10,0\"\r\n                            Command=\"{Binding Data.InstallAddonCommand, Source={StaticResource RootDataContext}}\"\r\n                            CommandParameter=\"{Binding}\"\r\n                            IsEnabled=\"{Binding IsQueuedForInstall, Converter={StaticResource NegateConverter}}\">\r\n                            <Button.Style>\r\n                                <Style TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n                                    <Setter Property=\"Content\" Value=\"{DynamicResource LOCAddonInstall}\" />\r\n                                    <Style.Triggers>\r\n                                        <DataTrigger Binding=\"{Binding IsInstalled}\" Value=\"True\">\r\n                                            <Setter Property=\"Content\" Value=\"{DynamicResource LOCAddonReinstall}\" />\r\n                                        </DataTrigger>\r\n                                    </Style.Triggers>\r\n                                </Style>\r\n                            </Button.Style>\r\n                        </Button>\r\n                        \r\n                        <ComboBox MinWidth=\"100\"\r\n                                  ItemsSource=\"{Binding Data.AvailablePackages, Source={StaticResource RootDataContext}}\"\r\n                                  SelectedValue=\"{Binding Data.SelectedInstallPackage, Source={StaticResource RootDataContext}}\"                                  \r\n                                  DisplayMemberPath=\"Version\" />\r\n                    </StackPanel>\r\n\r\n                    <TextBlock Text=\"{DynamicResource LOCAddonQueuedForInstall}\"\r\n                               Margin=\"0,10,0,0\" TextWrapping=\"Wrap\"\r\n                               Foreground=\"{DynamicResource WarningBrush}\"\r\n                               Visibility=\"{Binding IsQueuedForInstall, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n\r\n                    <TextBlock TextWrapping=\"Wrap\" Margin=\"0,10,0,10\"\r\n                               Text=\"{Binding Description}\"\r\n                               FontSize=\"{DynamicResource FontSizeSmall}\" />\r\n                    \r\n                    <ItemsControl ItemsSource=\"{Binding Screenshots}\">\r\n                        <ItemsControl.ItemTemplate>\r\n                            <DataTemplate>\r\n                                <TextBlock Margin=\"3\" ToolTip=\"{Binding Image, Mode=OneWay}\">\r\n                                    <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                                               CommandParameter=\"{Binding Image, Mode=OneWay}\">\r\n                                        <Image Source=\"{Binding Thumbnail}\"\r\n                                               RenderOptions.BitmapScalingMode=\"Fant\" MaxWidth=\"240\" />\r\n                                    </Hyperlink>\r\n                                </TextBlock>\r\n                            </DataTemplate>\r\n                        </ItemsControl.ItemTemplate>\r\n                        <ItemsControl.ItemsPanel>\r\n                            <ItemsPanelTemplate>\r\n                                <WrapPanel />\r\n                            </ItemsPanelTemplate>\r\n                        </ItemsControl.ItemsPanel>\r\n                    </ItemsControl>\r\n                </StackPanel>\r\n            </ScrollViewer>\r\n            \r\n        </Grid>\r\n\r\n        <TextBlock Visibility=\"{Binding IsOnlineListLoading, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                   Text=\"{DynamicResource LOCAddonsSearching}\"\r\n                   HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n    </Grid>    \r\n</UserControl>"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/AddonsSections/BrowseAddons.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.AddonsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Extensions.xaml\r\n    /// </summary>\r\n    public partial class BrowseAddons : UserControl\r\n    {\r\n        public BrowseAddons()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/AddonsSections/InstalledExtensions.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.AddonsSections.InstalledExtensions\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n        \r\n        <p:BindingProxy x:Key=\"RootDataContext\" Data=\"{Binding}\" />\r\n    </UserControl.Resources>\r\n\r\n    <Grid Margin=\"5\">\r\n        <Grid.ColumnDefinitions>\r\n            <ColumnDefinition Width=\"*\" />\r\n            <ColumnDefinition Width=\"250\" />\r\n        </Grid.ColumnDefinitions>\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition />\r\n        </Grid.RowDefinitions>\r\n\r\n        <DockPanel Grid.Column=\"1\"\r\n                   DataContext=\"{Binding SelectedItem, ElementName=ListPlugins}\"\r\n                   Visibility=\"{Binding SelectedItem, ElementName=ListPlugins, Converter={StaticResource NullToVisibilityConverter}}\"\r\n                   Margin=\"10,5,0,0\" LastChildFill=\"False\">\r\n            <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\">\r\n                <TextBlock Text=\"{DynamicResource LOCExtensionCreatedBy}\" />\r\n                <TextBlock Text=\"{Binding Description.Author}\" FontWeight=\"Bold\" Margin=\"5,0,0,0\" />\r\n            </StackPanel>\r\n            <StackPanel Orientation=\"Horizontal\" Margin=\"0,10,0,0\" DockPanel.Dock=\"Top\">\r\n                <TextBlock Text=\"{DynamicResource LOCExtensionVersion}\" />\r\n                <TextBlock Text=\"{Binding Description.Version}\" FontWeight=\"Bold\" Margin=\"5,0,0,0\" />\r\n            </StackPanel>\r\n            <StackPanel Orientation=\"Horizontal\" Margin=\"0,10,0,0\" DockPanel.Dock=\"Top\">\r\n                <TextBlock Text=\"{DynamicResource LOCExtensionModule}\" />\r\n                <TextBlock Text=\"{Binding Description.Module}\" FontWeight=\"Bold\" Margin=\"5,0,0,0\" />\r\n            </StackPanel>\r\n            <ItemsControl ItemsSource=\"{Binding Description.Links}\"\r\n                          Margin=\"0,10,0,0\" DockPanel.Dock=\"Top\">\r\n                <ItemsControl.ItemTemplate>\r\n                    <DataTemplate>\r\n                        <TextBlock Margin=\"0,0,0,5\"  DockPanel.Dock=\"Bottom\">\r\n                            <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                                       CommandParameter=\"{Binding Url}\"\r\n                                       ToolTip=\"{Binding Url}\">\r\n                                <Run Text=\"{Binding Name}\" />\r\n                            </Hyperlink>\r\n                        </TextBlock>\r\n                    </DataTemplate>\r\n                </ItemsControl.ItemTemplate>\r\n            </ItemsControl>\r\n            <CheckBox Margin=\"0,15,0,0\"\r\n                      Content=\"{DynamicResource LOCEnabledTitle}\"\r\n                      ContentStringFormat=\"{}{0} *\"\r\n                      IsChecked=\"{Binding Selected}\" DockPanel.Dock=\"Top\" />\r\n\r\n            <Button Content=\"{DynamicResource LOCUninstallGame}\" DockPanel.Dock=\"Top\"\r\n                    HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Margin=\"0,15,0,0\"\r\n                    Command=\"{Binding Data.UninstallExtensionCommand, Source={StaticResource RootDataContext}}\"\r\n                    CommandParameter=\"{Binding}\">\r\n                <Button.Style>\r\n                    <Style TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n                        <Style.Triggers>\r\n                            <DataTrigger Binding=\"{Binding Description.IsExternalDev}\" Value=\"True\">\r\n                                <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                            </DataTrigger>\r\n                        </Style.Triggers>\r\n                    </Style>\r\n                </Button.Style>\r\n            </Button>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCAddonDevReferenceLoaded}\" Foreground=\"{DynamicResource WarningBrush}\"\r\n                       Margin=\"0,10,0,0\" DockPanel.Dock=\"Top\" TextWrapping=\"Wrap\"\r\n                       Visibility=\"{Binding Description.IsExternalDev, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCGeneralExtensionLoadError}\" Foreground=\"{DynamicResource WarningBrush}\"\r\n                       Margin=\"0,10,0,0\" DockPanel.Dock=\"Top\" TextWrapping=\"Wrap\"\r\n                       Visibility=\"{Binding FailedLoading, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n\r\n            <TextBlock Margin=\"0,10,0,0\"  DockPanel.Dock=\"Top\">\r\n                <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateDirectoryCommand}\"\r\n                           CommandParameter=\"{Binding Description.DirectoryPath}\">\r\n                    <Run Text=\"{DynamicResource LOCExtensionInstallDir}\" />\r\n                </Hyperlink>\r\n            </TextBlock>\r\n\r\n            <TextBlock Margin=\"0,5,0,0\"  DockPanel.Dock=\"Top\">\r\n                <Hyperlink Command=\"{Binding Data.OpenExtensionDataDirCommand, Source={StaticResource RootDataContext}}\"\r\n                           CommandParameter=\"{Binding}\">\r\n                    <Run Text=\"{DynamicResource LOCExtensionDataDir}\" />\r\n                </Hyperlink>\r\n            </TextBlock>\r\n\r\n            <!--<TextBlock Text=\"{DynamicResource LOCExtensionUnsupported}\" \r\n                               Margin=\"0,10,0,0\" DockPanel.Dock=\"Top\" TextWrapping=\"Wrap\"\r\n                               FontWeight=\"Bold\"\r\n                               Visibility=\"{Binding Description.IsCompatible, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\" />-->\r\n\r\n            <TextBlock Margin=\"5,10,0,10\"  DockPanel.Dock=\"Bottom\">\r\n                <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                            CommandParameter=\"{}{DocsRootUrl}/tutorials/extensions/intro.html\">\r\n                    <Run Text=\"{DynamicResource LOCSettingsCreateExtensions}\" />\r\n                </Hyperlink>\r\n            </TextBlock>\r\n        </DockPanel>\r\n\r\n        <ListBox Grid.Column=\"0\" Name=\"ListPlugins\" SelectedIndex=\"0\"\r\n                 ScrollViewer.CanContentScroll=\"False\"\r\n                 ItemsSource=\"{Binding ActiveInstalledExtensionsList}\">\r\n            <ListBox.ItemContainerStyle>\r\n                <Style TargetType=\"ListBoxItem\" BasedOn=\"{StaticResource {x:Type ListBoxItem}}\">\r\n                    <Setter Property=\"Opacity\" Value=\"1\" />\r\n                    <Style.Triggers>\r\n                        <DataTrigger Binding=\"{Binding Selected}\" Value=\"False\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.7\" />\r\n                        </DataTrigger>\r\n                        <DataTrigger Binding=\"{Binding FailedLoading}\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource WarningBrush}\" />\r\n                        </DataTrigger>\r\n                    </Style.Triggers>\r\n                </Style>\r\n            </ListBox.ItemContainerStyle>\r\n            <ListBox.ItemTemplate>\r\n                <DataTemplate>\r\n                    <StackPanel Orientation=\"Horizontal\">\r\n                        <Image RenderOptions.BitmapScalingMode=\"Fant\"\r\n                               VerticalAlignment=\"Center\" Height=\"24\" Margin=\"5,2,5,2\"\r\n                               Source=\"{Binding PluginIcon}\" />\r\n                        <TextBlock VerticalAlignment=\"Center\"\r\n                                   Margin=\"0,2,5,2\"\r\n                                   Text=\"{Binding Description.Name}\" />\r\n                    </StackPanel>\r\n                </DataTemplate>\r\n            </ListBox.ItemTemplate>\r\n        </ListBox>\r\n    </Grid>\r\n</UserControl>"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/AddonsSections/InstalledExtensions.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.AddonsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Extensions.xaml\r\n    /// </summary>\r\n    public partial class InstalledExtensions : UserControl\r\n    {\r\n        public InstalledExtensions()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/AddonsSections/InstalledThemes.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.AddonsSections.InstalledThemes\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n\r\n        <p:BindingProxy x:Key=\"RootDataContext\" Data=\"{Binding}\" />\r\n    </UserControl.Resources>\r\n\r\n    <Grid Margin=\"5\">\r\n        <Grid.ColumnDefinitions>\r\n            <ColumnDefinition Width=\"*\" />\r\n            <ColumnDefinition Width=\"250\" />\r\n        </Grid.ColumnDefinitions>\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition />\r\n        </Grid.RowDefinitions>\r\n\r\n        <DockPanel Grid.Column=\"1\"\r\n                   DataContext=\"{Binding SelectedItem, ElementName=ListThemeList}\"\r\n                   Visibility=\"{Binding SelectedItem, ElementName=ListThemeList, Converter={StaticResource NullToVisibilityConverter}}\"                   \r\n                   Margin=\"10,5,0,0\" LastChildFill=\"False\">\r\n            <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\">\r\n                <TextBlock Text=\"{DynamicResource LOCExtensionCreatedBy}\" />\r\n                <TextBlock Text=\"{Binding Author}\" FontWeight=\"Bold\" Margin=\"5,0,0,0\" />\r\n            </StackPanel>\r\n            <StackPanel Orientation=\"Horizontal\" Margin=\"0,10,0,0\" DockPanel.Dock=\"Top\">\r\n                <TextBlock Text=\"{DynamicResource LOCExtensionVersion}\" />\r\n                <TextBlock Text=\"{Binding Version}\" FontWeight=\"Bold\" Margin=\"5,0,0,0\" />\r\n            </StackPanel>\r\n\r\n            <ItemsControl ItemsSource=\"{Binding Links}\"\r\n                          Margin=\"0,10,0,0\" DockPanel.Dock=\"Top\">\r\n                <ItemsControl.ItemTemplate>\r\n                    <DataTemplate>\r\n                        <TextBlock Margin=\"0,0,0,5\"  DockPanel.Dock=\"Bottom\">\r\n                            <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                                       CommandParameter=\"{Binding Url}\"\r\n                                       ToolTip=\"{Binding Url}\">\r\n                                <Run Text=\"{Binding Name}\" />\r\n                            </Hyperlink>\r\n                        </TextBlock>\r\n                    </DataTemplate>\r\n                </ItemsControl.ItemTemplate>\r\n            </ItemsControl>\r\n\r\n            <Button Content=\"{DynamicResource LOCUninstallGame}\" DockPanel.Dock=\"Top\"\r\n                            HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Margin=\"0,15,0,0\"\r\n                            Command=\"{Binding Data.UninstallThemeCommand, Source={StaticResource RootDataContext}}\"\r\n                            CommandParameter=\"{Binding}\">\r\n                <Button.Style>\r\n                    <Style TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n                        <Style.Triggers>\r\n                            <DataTrigger Binding=\"{Binding IsBuiltInTheme}\" Value=\"True\">\r\n                                <Setter Property=\"IsEnabled\" Value=\"False\" />\r\n                            </DataTrigger>\r\n                        </Style.Triggers>\r\n                    </Style>\r\n                </Button.Style>\r\n            </Button>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCThemeBuiltInUninstallHint}\" \r\n                               Margin=\"0,10,0,0\" DockPanel.Dock=\"Top\" TextWrapping=\"Wrap\"\r\n                               Visibility=\"{Binding IsBuiltInTheme, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCThemeUnsupported}\" \r\n                               Margin=\"0,10,0,0\" DockPanel.Dock=\"Top\" TextWrapping=\"Wrap\"\r\n                               Foreground=\"{DynamicResource WarningBrush}\"\r\n                               Visibility=\"{Binding IsCompatible, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\" />\r\n\r\n            <TextBlock Margin=\"0,10,0,0\"  DockPanel.Dock=\"Top\">\r\n                        <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateDirectoryCommand}\"\r\n                                   CommandParameter=\"{Binding DirectoryPath}\">\r\n                            <Run Text=\"{DynamicResource LOCExtensionInstallDir}\" />\r\n                        </Hyperlink>\r\n            </TextBlock>\r\n\r\n            <TextBlock Margin=\"5,10,0,10\"  DockPanel.Dock=\"Bottom\">\r\n                        <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                                    CommandParameter=\"{}{DocsRootUrl}/tutorials/themes/introduction.html\">\r\n                            <Run Text=\"{DynamicResource LOCSettingsCreateThemes}\" />\r\n                        </Hyperlink>\r\n            </TextBlock>\r\n        </DockPanel>\r\n\r\n        <ListBox Grid.Column=\"0\" Name=\"ListThemeList\" SelectedIndex=\"0\"\r\n                 ScrollViewer.CanContentScroll=\"False\"\r\n                 ItemsSource=\"{Binding ActiveInstalledThemeList}\">\r\n            <ListBox.ItemContainerStyle>\r\n                <Style TargetType=\"ListBoxItem\" BasedOn=\"{StaticResource {x:Type ListBoxItem}}\">\r\n                    <Setter Property=\"Opacity\" Value=\"1\" />\r\n                    <Style.Triggers>\r\n                        <DataTrigger Binding=\"{Binding IsCompatible}\" Value=\"False\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.7\" />\r\n                        </DataTrigger>\r\n                    </Style.Triggers>\r\n                </Style>\r\n            </ListBox.ItemContainerStyle>\r\n            <ListBox.ItemTemplate>\r\n                <DataTemplate>\r\n                    <StackPanel Orientation=\"Horizontal\">\r\n                        <TextBlock VerticalAlignment=\"Center\" Margin=\"0,2,5,2\"\r\n                                   Text=\"{Binding Name}\" />\r\n                    </StackPanel>\r\n                </DataTemplate>\r\n            </ListBox.ItemTemplate>\r\n        </ListBox>\r\n    </Grid>\r\n</UserControl>"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/AddonsSections/InstalledThemes.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.AddonsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Extensions.xaml\r\n    /// </summary>\r\n    public partial class InstalledThemes : UserControl\r\n    {\r\n        public InstalledThemes()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/ComboBoxList.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Xml.Linq;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class ComboBoxList : ComboBoxListBase\r\n    {\r\n        #region ItemsList\r\n        public SelectableObjectList<object> ItemsList\r\n        {\r\n            get => (SelectableObjectList<object>)GetValue(ItemsListProperty);\r\n            set => SetValue(ItemsListProperty, value);\r\n        }\r\n\r\n        public static readonly DependencyProperty ItemsListProperty = DependencyProperty.Register(\r\n            nameof(ItemsList),\r\n            typeof(SelectableObjectList<object>),\r\n            typeof(ComboBoxList));\r\n        #endregion\r\n\r\n        #region ItemsSource\r\n        public IList ItemsSource\r\n        {\r\n            get => (IList)GetValue(ItemsSourceProperty);\r\n            set => SetValue(ItemsSourceProperty, value);\r\n        }\r\n\r\n        public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(\r\n            nameof(ItemsSource),\r\n            typeof(IList),\r\n            typeof(ComboBoxList),\r\n            new PropertyMetadata(null, ItemsSourcePropertyChangedCallback));\r\n\r\n        private static void ItemsSourcePropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as ComboBoxList;\r\n            var newVal = (IList)e.NewValue;\r\n            if (obj.ItemsList != null)\r\n            {\r\n                obj.ItemsList.SelectionChanged -= obj.List_SelectionChanged;\r\n            }\r\n\r\n            obj.ItemsList = new SelectableObjectList<object>(null);\r\n            obj.ItemsList.SelectionChanged += obj.List_SelectionChanged;\r\n            obj.SetSelectedItem();\r\n        }\r\n        #endregion\r\n\r\n        internal void SetSelectedItem()\r\n        {\r\n            if (ItemsList == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            IgnoreChanges = true;\r\n            ItemsList.SetItems(ItemsSource as IEnumerable<object>, SelectedItems as IEnumerable<object>);\r\n            UpdateTextStatus();\r\n            IgnoreChanges = false;\r\n        }\r\n\r\n        #region SelectedItems\r\n        public IList SelectedItems\r\n        {\r\n            get => (IList)GetValue(SelectedItemsProperty);\r\n            set\r\n            {\r\n                if (value == null)\r\n                {\r\n                    SetValue(SelectedItemsProperty, value);\r\n                    return;\r\n                }\r\n\r\n                // This makes it possible to bind back into generic List collections instead of just IList.\r\n                var binding = BindingOperations.GetBindingExpression(this, SelectedItemsProperty);\r\n                if (binding != null)\r\n                {\r\n                    var targetProp = binding.ResolvedSource.GetType().GetProperty(binding.ResolvedSourcePropertyName);\r\n                    if (targetProp.PropertyType.IsGenericList(out var itemType))\r\n                    {\r\n                        var newList = targetProp.PropertyType.CrateInstance();\r\n                        var addMethod = newList.GetType().GetMethod(\"Add\");\r\n                        foreach (var val in value)\r\n                        {\r\n                            addMethod.Invoke(newList, new object[] { Convert.ChangeType(val, itemType) });\r\n                        }\r\n\r\n                        SetValue(SelectedItemsProperty, newList);\r\n                        return;\r\n                    }\r\n                }\r\n\r\n                SetValue(SelectedItemsProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register(\r\n            nameof(SelectedItems),\r\n            typeof(IList),\r\n            typeof(ComboBoxList),\r\n            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, SelectedItemsPropertyChangedCallback));\r\n\r\n        private static void SelectedItemsPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as ComboBoxList;\r\n            if (!obj.IgnoreChanges)\r\n            {\r\n                obj.SetSelectedItem();\r\n            }\r\n        }\r\n        #endregion\r\n\r\n        static ComboBoxList()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ComboBoxList), new FrameworkPropertyMetadata(typeof(ComboBoxList)));\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            if (ItemsPanel != null)\r\n            {\r\n                XNamespace pns = \"http://schemas.microsoft.com/winfx/2006/xaml/presentation\";\r\n                ItemsPanel.ItemTemplate = Xaml.FromString<DataTemplate>(new XDocument(\r\n                    new XElement(pns + nameof(DataTemplate),\r\n                        new XElement(pns + nameof(CheckBox),\r\n                            new XAttribute(nameof(CheckBox.IsChecked), \"{Binding Selected}\"),\r\n                            new XAttribute(nameof(CheckBox.Content), \"{Binding Item}\"),\r\n                            new XAttribute(nameof(CheckBox.IsThreeState), \"{Binding IsThreeState, Mode=OneWay, RelativeSource={RelativeSource AncestorType=ComboBoxList}}\"),\r\n                            new XAttribute(nameof(CheckBox.Style), $\"{{DynamicResource ComboBoxListItemStyle}}\")))\r\n                ).ToString());\r\n            }\r\n\r\n            UpdateTextStatus();\r\n        }\r\n\r\n        public override void ClearButtonAction(RoutedEventArgs e)\r\n        {\r\n            SelectedItems = null;\r\n        }\r\n\r\n        private void List_SelectionChanged(object sender, EventArgs e)\r\n        {\r\n            if (!IgnoreChanges)\r\n            {\r\n                IgnoreChanges = true;\r\n                var sel = ItemsList.GetSelectedItems();\r\n                SelectedItems = sel;\r\n                IgnoreChanges = false;\r\n                UpdateTextStatus();\r\n            }\r\n        }\r\n\r\n        private void UpdateTextStatus()\r\n        {\r\n            if (TextFilterString != null)\r\n            {\r\n                TextFilterString.Text = ItemsList?.AsString;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/ComboBoxListBase.cs",
    "content": "﻿using Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\nusing System.Xml.Linq;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_ItemsPanel\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ButtonClearFilter\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_TextFilterString\", Type = typeof(TextBlock))]\r\n    public abstract class ComboBoxListBase : Control\r\n    {\r\n        internal ItemsControl ItemsPanel;\r\n        internal Button ButtonClearFilter;\r\n        internal TextBlock TextFilterString;\r\n\r\n        internal bool IgnoreChanges { get; set; }\r\n\r\n        public bool IsThreeState\r\n        {\r\n            get => (bool)GetValue(IsThreeStateProperty);\r\n            set => SetValue(IsThreeStateProperty, value);\r\n        }\r\n\r\n        public static readonly DependencyProperty IsThreeStateProperty = DependencyProperty.Register(\r\n            nameof(IsThreeState),\r\n            typeof(bool),\r\n            typeof(ComboBoxListBase));\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            ButtonClearFilter = Template.FindName(\"PART_ButtonClearFilter\", this) as Button;\r\n            TextFilterString = Template.FindName(\"PART_TextFilterString\", this) as TextBlock;\r\n            ItemsPanel = Template.FindName(\"PART_ItemsPanel\", this) as ItemsControl;\r\n\r\n            if (ButtonClearFilter != null)\r\n            {\r\n                ButtonClearFilter.Click += (_, e) => ClearButtonAction(e);\r\n            }\r\n\r\n            if (ItemsPanel != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    ItemsPanel,\r\n                    ItemsControl.ItemsSourceProperty,\r\n                    this,\r\n                    \"ItemsList\");\r\n\r\n                XNamespace pns = \"http://schemas.microsoft.com/winfx/2006/xaml/presentation\";\r\n\r\n                ItemsPanel.ItemsPanel = Xaml.FromString<ItemsPanelTemplate>(new XDocument(\r\n                    new XElement(pns + nameof(ItemsPanelTemplate),\r\n                        new XElement(pns + nameof(VirtualizingStackPanel)))\r\n                ).ToString());\r\n\r\n                ItemsPanel.Template = Xaml.FromString<ControlTemplate>(new XDocument(\r\n                     new XElement(pns + nameof(ControlTemplate),\r\n                        new XElement(pns + nameof(ScrollViewer),\r\n                            new XAttribute(nameof(ScrollViewer.Focusable), false),\r\n                            new XElement(pns + nameof(ItemsPresenter))))\r\n                ).ToString());\r\n\r\n                ItemsPanel.ItemTemplate = Xaml.FromString<DataTemplate>(new XDocument(\r\n                    new XElement(pns + nameof(DataTemplate),\r\n                        new XElement(pns + nameof(CheckBox),\r\n                            new XAttribute(nameof(CheckBox.IsChecked), \"{Binding Selected}\"),\r\n                            new XAttribute(nameof(CheckBox.Content), \"{Binding Item}\"),\r\n                            new XAttribute(nameof(CheckBox.Style), $\"{{DynamicResource ComboBoxListItemStyle}}\")))\r\n                ).ToString());\r\n\r\n                ScrollViewer.SetCanContentScroll(ItemsPanel, true);\r\n                KeyboardNavigation.SetDirectionalNavigation(ItemsPanel, KeyboardNavigationMode.Contained);\r\n                VirtualizingPanel.SetIsVirtualizing(ItemsPanel, true);\r\n                VirtualizingPanel.SetVirtualizationMode(ItemsPanel, VirtualizationMode.Recycling);\r\n            }\r\n        }\r\n\r\n        public virtual void ClearButtonAction(RoutedEventArgs e)\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/DdItemListSelectionBox.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\nusing System.Xml.Linq;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_ToggleSelectedOnly\", Type = typeof(ToggleButton))]\r\n    [TemplatePart(Name = \"PART_SearchBox\", Type = typeof(SearchBox))]\r\n    [TemplatePart(Name = \"PART_ElemSearchHost\", Type = typeof(FrameworkElement))]\r\n    public class DdItemListSelectionBox : ComboBoxListBase\r\n    {\r\n        internal ToggleButton ToggleSelectedOnly;\r\n        internal SearchBox TextSearchBox;\r\n        internal FrameworkElement ElemSearchHost;\r\n\r\n        public bool ShowSearchBox\r\n        {\r\n            get => (bool)GetValue(ShowSearchBoxProperty);\r\n            set => SetValue(ShowSearchBoxProperty, value);\r\n        }\r\n\r\n        public static readonly DependencyProperty ShowSearchBoxProperty = DependencyProperty.Register(\r\n            nameof(ShowSearchBox),\r\n            typeof(bool),\r\n            typeof(ComboBoxListBase),\r\n            new PropertyMetadata(false));\r\n\r\n        public SelectableDbItemList ItemsList\r\n        {\r\n            get\r\n            {\r\n                return (SelectableDbItemList)GetValue(ItemsListProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ItemsListProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ItemsListProperty = DependencyProperty.Register(\r\n            nameof(ItemsList),\r\n            typeof(SelectableDbItemList),\r\n            typeof(DdItemListSelectionBox),\r\n            new PropertyMetadata(null, ItemsListPropertyChangedCallback));\r\n\r\n        private static void ItemsListPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as DdItemListSelectionBox;\r\n            var oldVal = (SelectableDbItemList)e.NewValue;\r\n            if (oldVal != null)\r\n            {\r\n                oldVal.SelectionChanged -= obj.List_SelectionChanged;\r\n            }\r\n\r\n            var list = (SelectableDbItemList)e.NewValue;\r\n            list.SelectionChanged += obj.List_SelectionChanged;\r\n            obj.UpdateTextStatus();\r\n        }\r\n\r\n        private void List_SelectionChanged(object sender, EventArgs e)\r\n        {\r\n            if (!IgnoreChanges)\r\n            {\r\n                IgnoreChanges = true;\r\n                BoundIds = ItemsList.GetSelectedIds();\r\n                IgnoreChanges = false;\r\n                UpdateTextStatus();\r\n            }\r\n        }\r\n\r\n        public object BoundIds\r\n        {\r\n            get\r\n            {\r\n                return GetValue(BoundIdsProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(BoundIdsProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty BoundIdsProperty = DependencyProperty.Register(\r\n            nameof(BoundIds),\r\n            typeof(object),\r\n            typeof(DdItemListSelectionBox),\r\n            new PropertyMetadata(null, BoundIdsPropertyChangedCallback));\r\n\r\n        private static void BoundIdsPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as DdItemListSelectionBox;\r\n            if (obj.IgnoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            obj.IgnoreChanges = true;\r\n            obj.ItemsList?.SetSelection(obj.BoundIds as IEnumerable<Guid>);\r\n            obj.IgnoreChanges = false;\r\n            obj.UpdateTextStatus();\r\n        }\r\n\r\n        static DdItemListSelectionBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(DdItemListSelectionBox), new FrameworkPropertyMetadata(typeof(DdItemListSelectionBox)));\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n            if (ItemsPanel != null)\r\n            {\r\n                BindingTools.ClearBinding(ItemsPanel, ItemsControl.ItemsSourceProperty);\r\n                BindingTools.SetBinding(\r\n                    ItemsPanel,\r\n                    ItemsControl.ItemsSourceProperty,\r\n                    this,\r\n                    \"ItemsList.CollectionView\");\r\n\r\n                XNamespace pns = \"http://schemas.microsoft.com/winfx/2006/xaml/presentation\";\r\n                ItemsPanel.ItemTemplate = Xaml.FromString<DataTemplate>(new XDocument(\r\n                    new XElement(pns + nameof(DataTemplate),\r\n                        new XElement(pns + nameof(CheckBox),\r\n                            new XAttribute(nameof(CheckBox.IsChecked), \"{Binding Selected}\"),\r\n                            new XAttribute(nameof(CheckBox.Content), \"{Binding Item.Name}\"),\r\n                            new XAttribute(nameof(CheckBox.IsThreeState), \"{Binding IsThreeState, Mode=OneWay, RelativeSource={RelativeSource AncestorType=DdItemListSelectionBox}}\"),\r\n                            new XAttribute(nameof(CheckBox.Style), $\"{{DynamicResource ComboBoxListItemStyle}}\")))\r\n                ).ToString());\r\n            }\r\n\r\n            ToggleSelectedOnly = Template.FindName(\"PART_ToggleSelectedOnly\", this) as ToggleButton;\r\n            if (ToggleSelectedOnly != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                   ToggleSelectedOnly,\r\n                   ToggleButton.IsCheckedProperty,\r\n                   this,\r\n                   nameof(ItemsList) + \".\" + nameof(ItemsList.ShowSelectedOnly),\r\n                   BindingMode.TwoWay);\r\n            }\r\n\r\n            ElemSearchHost = Template.FindName(\"PART_ElemSearchHost\", this) as FrameworkElement;\r\n            if (ElemSearchHost != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    ElemSearchHost,\r\n                    FrameworkElement.VisibilityProperty,\r\n                    this,\r\n                    nameof(ShowSearchBox),\r\n                    converter: new Converters.BooleanToVisibilityConverter());\r\n            }\r\n\r\n            TextSearchBox = Template.FindName(\"PART_SearchBox\", this) as SearchBox;\r\n            if (TextSearchBox != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    TextSearchBox,\r\n                    SearchBox.TextProperty,\r\n                    this,\r\n                    nameof(ItemsList) + \".\" + nameof(ItemsList.SearchText),\r\n                    BindingMode.TwoWay);\r\n            }\r\n\r\n            UpdateTextStatus();\r\n\r\n            if (Template.FindName(\"Popup\", this) is Popup popup)\r\n            {\r\n                popup.Opened += (_, __) =>\r\n                {\r\n                    if (ShowSearchBox && TextSearchBox != null)\r\n                    {\r\n                        TextSearchBox.IsFocused = true;\r\n                    }\r\n                };\r\n\r\n                popup.Closed += (_, __) =>\r\n                {\r\n                    if (ShowSearchBox && TextSearchBox != null)\r\n                    {\r\n                        TextSearchBox.IsFocused = false;\r\n                        TextSearchBox.Text = string.Empty;\r\n                    }\r\n                };\r\n\r\n                popup.PreviewKeyUp += (_, keyArgs) =>\r\n                {\r\n                    if (keyArgs.Key == Key.Escape)\r\n                    {\r\n                        popup.IsOpen = false;\r\n                    }\r\n                };\r\n            }\r\n        }\r\n\r\n        public override void ClearButtonAction(RoutedEventArgs e)\r\n        {\r\n            ItemsList.SetSelection(null);\r\n            BoundIds = null;\r\n        }\r\n\r\n        private void UpdateTextStatus()\r\n        {\r\n            if (TextFilterString != null)\r\n            {\r\n                TextFilterString.Text = ItemsList?.AsString;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/ExpanderEx.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class ExpanderEx : Expander\r\n    {\r\n        private bool ignoreChanges = false;\r\n        private readonly PlayniteSettings settings;\r\n\r\n        public string SaveGameGroupId\r\n        {\r\n            get { return (string)GetValue(SaveGameGroupIdProperty); }\r\n            set { SetValue(SaveGameGroupIdProperty, value); }\r\n        }\r\n\r\n        public static readonly DependencyProperty SaveGameGroupIdProperty =\r\n            DependencyProperty.Register(\r\n                nameof(SaveGameGroupId),\r\n                typeof(string),\r\n                typeof(ExpanderEx),\r\n                new FrameworkPropertyMetadata(null));\r\n\r\n        static ExpanderEx()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ExpanderEx), new FrameworkPropertyMetadata(typeof(ExpanderEx)));\r\n        }\r\n\r\n        public ExpanderEx() : this(PlayniteApplication.Current?.AppSettings)\r\n        {\r\n        }\r\n\r\n        public ExpanderEx(PlayniteSettings settings) : base()\r\n        {\r\n            if (settings == null || DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                return;\r\n            }\r\n\r\n            this.settings = settings;\r\n            Loaded += ExpanderEx_Loaded;\r\n            Unloaded += ExpanderEx_Unloaded;\r\n        }\r\n\r\n        private void ViewSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (ignoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (e.PropertyName == nameof(ViewSettings.CollapsedGroups))\r\n            {\r\n                if (SaveGameGroupId != null && settings != null)\r\n                {\r\n                    ignoreChanges = true;\r\n                    IsExpanded = !settings.ViewSettings.IsGroupCollapsed(settings.ViewSettings.GroupingOrder, SaveGameGroupId);\r\n                    ignoreChanges = false;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void ExpanderEx_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            Expanded += ExpanderEx_Expanded;\r\n            Collapsed += ExpanderEx_Collapsed;\r\n\r\n            if (SaveGameGroupId != null && settings != null)\r\n            {\r\n                settings.ViewSettings.PropertyChanged += ViewSettings_PropertyChanged;\r\n                ignoreChanges = true;\r\n                var newState = !settings.ViewSettings.IsGroupCollapsed(settings.ViewSettings.GroupingOrder, SaveGameGroupId);\r\n                if (newState != IsExpanded)\r\n                {\r\n                    IsExpanded = newState;\r\n                }\r\n\r\n                ignoreChanges = false;\r\n            }\r\n        }\r\n\r\n        private void ExpanderEx_Unloaded(object sender, RoutedEventArgs e)\r\n        {\r\n            Expanded -= ExpanderEx_Expanded;\r\n            Collapsed -= ExpanderEx_Collapsed;\r\n\r\n            if (SaveGameGroupId != null && settings != null)\r\n            {\r\n                settings.ViewSettings.PropertyChanged -= ViewSettings_PropertyChanged;\r\n            }\r\n        }\r\n\r\n        private void ExpanderEx_Collapsed(object sender, RoutedEventArgs e)\r\n        {\r\n            if (ignoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (SaveGameGroupId != null && settings != null)\r\n            {\r\n                ignoreChanges = true;\r\n                settings.ViewSettings.SetGroupCollapseState(settings.ViewSettings.GroupingOrder, SaveGameGroupId, true);\r\n                ignoreChanges = false;\r\n            }\r\n        }\r\n\r\n        private void ExpanderEx_Expanded(object sender, RoutedEventArgs e)\r\n        {\r\n            if (ignoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (SaveGameGroupId != null && settings != null)\r\n            {\r\n                ignoreChanges = true;\r\n                settings.ViewSettings.SetGroupCollapseState(settings.ViewSettings.GroupingOrder, SaveGameGroupId, false);\r\n                ignoreChanges = false;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/FilterEnumSelectionBox.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\nusing System.Xml.Linq;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class FilterEnumSelectionBox : FilterSelectionBoxBase\r\n    {\r\n        public List<SelectableItem<SelectionObject>> ItemsList { get; set; }\r\n\r\n        public class SelectionObject\r\n        {\r\n            public string Name { get; }\r\n            public int Value { get; }\r\n\r\n            public SelectionObject(Enum enumValue)\r\n            {\r\n                Value = Convert.ToInt32(enumValue);\r\n                Name = enumValue.GetDescription();\r\n            }\r\n\r\n            public override string ToString()\r\n            {\r\n                return Name;\r\n            }\r\n        }\r\n\r\n        public Type EnumType\r\n        {\r\n            get\r\n            {\r\n                return (Type)GetValue(EnumTypeProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(EnumTypeProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty EnumTypeProperty = DependencyProperty.Register(\r\n            nameof(EnumType),\r\n            typeof(Type),\r\n            typeof(FilterEnumSelectionBox),\r\n            new PropertyMetadata(null, EnumTypePropertyChangedCallback));\r\n\r\n        private static void EnumTypePropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as FilterEnumSelectionBox;\r\n            var list = (Type)e.NewValue;\r\n            var items = new List<SelectableItem<SelectionObject>>();\r\n\r\n            if (obj.ItemsList.HasItems())\r\n            {\r\n                foreach (var item in obj.ItemsList)\r\n                {\r\n                    item.PropertyChanged -= obj.NewItem_PropertyChanged;\r\n                }\r\n            }\r\n\r\n            foreach (Enum en in list.GetEnumValues())\r\n            {\r\n                var newItem = new SelectableItem<SelectionObject>(new SelectionObject(en));\r\n                if (obj.FilterProperties != null)\r\n                {\r\n                    newItem.Selected = obj.FilterProperties.Values?.Contains(newItem.Item.Value) == true;\r\n                }\r\n\r\n                newItem.PropertyChanged += obj.NewItem_PropertyChanged;\r\n                items.Add(newItem);\r\n            }\r\n\r\n            obj.ItemsList = items;\r\n        }\r\n\r\n        private void NewItem_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (IgnoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (e.PropertyName == nameof(SelectableItem<SelectionObject>.Selected))\r\n            {\r\n                var selected = ItemsList.Where(a => a.Selected == true);\r\n                if (selected.HasItems())\r\n                {\r\n                    FilterProperties = new EnumFilterItemProperties(selected.Select(a => a.Item.Value).ToList());\r\n                }\r\n                else\r\n                {\r\n                    FilterProperties = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        public EnumFilterItemProperties FilterProperties\r\n        {\r\n            get\r\n            {\r\n                return (EnumFilterItemProperties)GetValue(FilterPropertiesProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(FilterPropertiesProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty FilterPropertiesProperty = DependencyProperty.Register(\r\n            nameof(FilterProperties),\r\n            typeof(EnumFilterItemProperties),\r\n            typeof(FilterEnumSelectionBox),\r\n            new PropertyMetadata(null, FilterPropertiesPropertyChangedCallback));\r\n\r\n        private static void FilterPropertiesPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as FilterEnumSelectionBox;\r\n            if (obj.IgnoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            obj.IgnoreChanges = true;\r\n            if (obj.FilterProperties?.IsSet != true)\r\n            {\r\n                obj.ItemsList?.ForEach(a => a.Selected = false);\r\n            }\r\n            else\r\n            {\r\n                obj.ItemsList?.ForEach(a => a.Selected = obj.FilterProperties.Values.Contains(a.Item.Value));\r\n            }\r\n            obj.IgnoreChanges = false;\r\n            obj.UpdateTextStatus();\r\n        }\r\n\r\n        static FilterEnumSelectionBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(FilterEnumSelectionBox), new FrameworkPropertyMetadata(typeof(FilterEnumSelectionBox)));\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n            UpdateTextStatus();\r\n        }\r\n\r\n        private void UpdateTextStatus()\r\n        {\r\n            if (TextFilterString != null)\r\n            {\r\n                if (ItemsList.HasItems())\r\n                {\r\n                    TextFilterString.Text = string.Join(\", \", ItemsList.Where(a => a.Selected == true).Select(a => a.Item.Name).ToArray());\r\n                }\r\n                else\r\n                {\r\n                    TextFilterString.Text = string.Empty;\r\n                }\r\n            }\r\n        }\r\n\r\n        public override void ClearButtonAction(RoutedEventArgs e)\r\n        {\r\n            FilterProperties = null;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/FilterSelectionBox.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Xml.Linq;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_TextFilterInput\", Type = typeof(TextBox))]\r\n    public abstract class FilterSelectionBoxBase : ComboBoxListBase\r\n    {\r\n        internal TextBox TextFilterInput;\r\n\r\n        public bool IsFullTextEnabled\r\n        {\r\n            get => (bool)GetValue(IsFullTextEnabledProperty);\r\n            set => SetValue(IsFullTextEnabledProperty, value);\r\n        }\r\n\r\n        public static readonly DependencyProperty IsFullTextEnabledProperty = DependencyProperty.Register(\r\n            nameof(IsFullTextEnabled),\r\n            typeof(bool),\r\n            typeof(FilterSelectionBoxBase),\r\n            new PropertyMetadata(false));\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n            TextFilterInput = Template.FindName(\"PART_TextFilterInput\", this) as TextBox;\r\n\r\n            if (ItemsPanel != null)\r\n            {\r\n                XNamespace pns = \"http://schemas.microsoft.com/winfx/2006/xaml/presentation\";\r\n                ItemsPanel.ItemTemplate = Xaml.FromString<DataTemplate>(new XDocument(\r\n                    new XElement(pns + nameof(DataTemplate),\r\n                        new XElement(pns + nameof(CheckBox),\r\n                            new XAttribute(nameof(CheckBox.IsChecked), \"{Binding Selected}\"),\r\n                            new XAttribute(nameof(CheckBox.Content), \"{Binding Item}\"),\r\n                            new XAttribute(nameof(CheckBox.Style), $\"{{DynamicResource FilterSelectionBoxItemStyle}}\")))\r\n                ).ToString());\r\n            }\r\n\r\n            if (TextFilterInput != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    TextFilterInput,\r\n                    TextBox.VisibilityProperty,\r\n                    this,\r\n                    nameof(IsFullTextEnabled),\r\n                    converter: new Converters.BooleanToVisibilityConverter());\r\n            }\r\n\r\n            if (TextFilterString != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    TextFilterString,\r\n                    TextBox.VisibilityProperty,\r\n                    this,\r\n                    nameof(IsFullTextEnabled),\r\n                    converter: new InvertedBooleanToVisibilityConverter());\r\n            }\r\n        }\r\n    }\r\n\r\n    public class FilterSelectionBox : FilterSelectionBoxBase\r\n    {\r\n        private BindingExpressionBase textInputBinding;\r\n\r\n        public SelectableIdItemList ItemsList\r\n        {\r\n            get\r\n            {\r\n                return (SelectableIdItemList)GetValue(ItemsListProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ItemsListProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ItemsListProperty = DependencyProperty.Register(\r\n            nameof(ItemsList),\r\n            typeof(SelectableIdItemList),\r\n            typeof(FilterSelectionBox),\r\n            new PropertyMetadata(null, ItemsListPropertyChangedCallback));\r\n\r\n        private static void ItemsListPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var box = sender as FilterSelectionBox;\r\n            if (box.IgnoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var oldVal = (SelectableIdItemList)e.OldValue;\r\n            if (oldVal != null)\r\n            {\r\n                oldVal.SelectionChanged -= box.List_SelectionChanged;\r\n            }\r\n\r\n            var list = (SelectableIdItemList)e.NewValue;\r\n            box.IgnoreChanges = true;\r\n            list.SelectionChanged += box.List_SelectionChanged;\r\n            if (box.FilterProperties != null)\r\n            {\r\n                list.SetSelection(box.FilterProperties.Ids);\r\n            }\r\n\r\n            box.UpdateTextStatus();\r\n            box.IgnoreChanges = false;\r\n        }\r\n\r\n        public void List_SelectionChanged(object sender, EventArgs e)\r\n        {\r\n            if (!IgnoreChanges)\r\n            {\r\n                IgnoreChanges = true;\r\n                FilterProperties = new IdItemFilterItemProperties { Ids = ItemsList.GetSelectedIds() };\r\n                UpdateTextStatus();\r\n                IgnoreChanges = false;\r\n            }\r\n        }\r\n\r\n        public IdItemFilterItemProperties FilterProperties\r\n        {\r\n            get\r\n            {\r\n                return (IdItemFilterItemProperties)GetValue(FilterPropertiesProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(FilterPropertiesProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty FilterPropertiesProperty = DependencyProperty.Register(\r\n            nameof(FilterProperties),\r\n            typeof(IdItemFilterItemProperties),\r\n            typeof(FilterSelectionBox),\r\n            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, FilterPropertiesPropertyChangedCallback));\r\n\r\n        private static void FilterPropertiesPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var box = sender as FilterSelectionBox;\r\n            if (box.IgnoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            box.IgnoreChanges = true;\r\n\r\n            if (box.FilterProperties != null && box.FilterProperties.Text.IsNullOrEmpty())\r\n            {\r\n                box.ItemsList?.SetSelection(box.FilterProperties.Ids);\r\n            }\r\n            else if (box.FilterProperties == null)\r\n            {\r\n                box.ItemsList?.SetSelection(null);\r\n            }\r\n\r\n            box.UpdateTextStatus();\r\n            box.IgnoreChanges = false;\r\n        }\r\n\r\n        public string FullTextText\r\n        {\r\n            get\r\n            {\r\n                if (FilterProperties == null)\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                if (FilterProperties.Text.IsNullOrEmpty())\r\n                {\r\n                    return ItemsList?.AsString;\r\n                }\r\n                else\r\n                {\r\n                    return FilterProperties.Text;\r\n                }\r\n            }\r\n\r\n            set\r\n            {\r\n                if (!IgnoreChanges)\r\n                {\r\n                    FilterProperties = new IdItemFilterItemProperties() { Text = value };\r\n                    if (ItemsList != null)\r\n                    {\r\n                        IgnoreChanges = true;\r\n                        ItemsList.SetSelection(null);\r\n                        IgnoreChanges = false;\r\n                    }\r\n                }\r\n\r\n                UpdateTextStatus();\r\n            }\r\n        }\r\n\r\n        static FilterSelectionBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(FilterSelectionBox), new FrameworkPropertyMetadata(typeof(FilterSelectionBox)));\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n            if (TextFilterInput != null)\r\n            {\r\n                textInputBinding = BindingTools.SetBinding(\r\n                    TextFilterInput,\r\n                    TextBox.TextProperty,\r\n                    this,\r\n                    nameof(FullTextText),\r\n                    delay: 200,\r\n                    trigger: System.Windows.Data.UpdateSourceTrigger.PropertyChanged,\r\n                    mode: BindingMode.TwoWay);\r\n            }\r\n\r\n            UpdateTextStatus();\r\n        }\r\n\r\n        public override void ClearButtonAction(RoutedEventArgs e)\r\n        {\r\n            FilterProperties = null;\r\n            IgnoreChanges = true;\r\n            ItemsList?.SetSelection(null);\r\n            IgnoreChanges = false;\r\n        }\r\n\r\n        private void UpdateTextStatus()\r\n        {\r\n            if (TextFilterString != null)\r\n            {\r\n                TextFilterString.Text = FullTextText;\r\n            }\r\n\r\n            if (textInputBinding != null)\r\n            {\r\n                textInputBinding.UpdateTarget();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/FilterStringSelectionBox.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class FilterStringSelectionBox : FilterSelectionBoxBase\r\n    {\r\n        public SelectableObjectList<NamedObject<string>> ItemsList\r\n        {\r\n            get\r\n            {\r\n                return (SelectableObjectList<NamedObject<string>>)GetValue(ItemsListProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ItemsListProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ItemsListProperty = DependencyProperty.Register(\r\n            nameof(ItemsList),\r\n            typeof(SelectableObjectList<NamedObject<string>>),\r\n            typeof(FilterStringSelectionBox),\r\n            new PropertyMetadata(null, ItemsListPropertyChangedCallback));\r\n\r\n        private static void ItemsListPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as FilterStringSelectionBox;\r\n            var oldVal = (SelectableObjectList<NamedObject<string>>)e.NewValue;\r\n            if (oldVal != null)\r\n            {\r\n                oldVal.SelectionChanged -= obj.List_SelectionChanged;\r\n            }\r\n\r\n            var list = (SelectableObjectList<NamedObject<string>>)e.NewValue;\r\n            obj.IgnoreChanges = true;\r\n            list.SelectionChanged += obj.List_SelectionChanged;\r\n            if (obj.FilterProperties != null)\r\n            {\r\n                list.SetSelection(obj.FilterProperties.Values?.Select(a => new NamedObject<string>(a)));\r\n            }\r\n\r\n            obj.IgnoreChanges = false;\r\n            obj.UpdateTextStatus();\r\n        }\r\n\r\n        private void List_SelectionChanged(object sender, EventArgs e)\r\n        {\r\n            if (!IgnoreChanges)\r\n            {\r\n                IgnoreChanges = true;\r\n                FilterProperties = new StringFilterItemProperties(ItemsList.GetSelectedItems().Select(a => a.Value).ToList());\r\n                IgnoreChanges = false;\r\n                UpdateTextStatus();\r\n            }\r\n        }\r\n\r\n        public StringFilterItemProperties FilterProperties\r\n        {\r\n            get\r\n            {\r\n                return (StringFilterItemProperties)GetValue(FilterPropertiesProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(FilterPropertiesProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty FilterPropertiesProperty = DependencyProperty.Register(\r\n            nameof(FilterProperties),\r\n            typeof(StringFilterItemProperties),\r\n            typeof(FilterStringSelectionBox),\r\n            new PropertyMetadata(null, FilterPropertiesPropertyChangedCallback));\r\n\r\n        private static void FilterPropertiesPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as FilterStringSelectionBox;\r\n            if (obj.IgnoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            obj.IgnoreChanges = true;\r\n            if (obj.FilterProperties?.IsSet != true)\r\n            {\r\n                obj.ItemsList?.SetSelection(null);\r\n            }\r\n            else\r\n            {\r\n                obj.ItemsList?.SetSelection(obj.FilterProperties.Values?.Select(a => new NamedObject<string>(a)));\r\n            }\r\n            obj.IgnoreChanges = false;\r\n            obj.UpdateTextStatus();\r\n        }\r\n\r\n        static FilterStringSelectionBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(FilterStringSelectionBox), new FrameworkPropertyMetadata(typeof(FilterStringSelectionBox)));\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n            UpdateTextStatus();\r\n        }\r\n\r\n        private void UpdateTextStatus()\r\n        {\r\n            if (TextFilterString != null)\r\n            {\r\n                TextFilterString.Text = ItemsList?.AsString;\r\n            }\r\n        }\r\n\r\n        public override void ClearButtonAction(RoutedEventArgs e)\r\n        {\r\n            FilterProperties = null;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/GameListItem.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.Converters;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.Extensions;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\nusing BooleanToVisibilityConverter = Playnite.Converters.BooleanToVisibilityConverter;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_PanelHost\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ImageIcon\", Type = typeof(Image))]\r\n    [TemplatePart(Name = \"PART_ImageCover\", Type = typeof(Image))]\r\n    [TemplatePart(Name = \"PART_ButtonPlay\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_ButtonInfo\", Type = typeof(Button))]\r\n    public class GameListItem : Control\r\n    {\r\n        private readonly DesktopAppViewModel mainModel;\r\n        private FrameworkElement PanelHost;\r\n        private Image ImageIcon;\r\n        private Image ImageCover;\r\n        private Button ButtonPlay;\r\n        private Button ButtonInfo;\r\n\r\n        static GameListItem()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(GameListItem), new FrameworkPropertyMetadata(typeof(GameListItem)));\r\n        }\r\n\r\n        public GameListItem() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public GameListItem(DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            PanelHost = Template.FindName(\"PART_PanelHost\", this) as FrameworkElement;\r\n            if (PanelHost != null)\r\n            {\r\n                if (!DesignerProperties.GetIsInDesignMode(this))\r\n                {\r\n                    var mBinding = new MouseBinding(mainModel.StartGameCommand, new MouseGesture(MouseAction.LeftDoubleClick));\r\n                    BindingTools.SetBinding(mBinding,\r\n                        MouseBinding.CommandParameterProperty,\r\n                        nameof(GamesCollectionViewEntry.Game));\r\n                    PanelHost.InputBindings.Add(mBinding);\r\n\r\n                    PanelHost.ContextMenu = new GameMenu(mainModel) { ShowStartSection = true };\r\n                    BindingTools.SetBinding(PanelHost.ContextMenu,\r\n                        Button.DataContextProperty,\r\n                        mainModel,\r\n                        nameof(DesktopAppViewModel.SelectedGames));\r\n                }\r\n            }\r\n\r\n            ImageIcon = Template.FindName(\"PART_ImageIcon\", this) as Image;\r\n            if (ImageIcon != null)\r\n            {\r\n                BindingTools.SetBinding(ImageIcon,\r\n                    Image.VisibilityProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.ShowIconsOnList),\r\n                    converter: new BooleanToVisibilityConverter());\r\n\r\n                var sourceBinding = new PriorityBinding();\r\n                sourceBinding.Bindings.Add(new Binding()\r\n                {\r\n                    Path = new PropertyPath(nameof(GamesCollectionViewEntry.DetailsListIconObjectCached)),\r\n                    IsAsync = mainModel.AppSettings.AsyncImageLoading,\r\n                    Converter = new NullToDependencyPropertyUnsetConverter(),\r\n                    Mode = BindingMode.OneWay\r\n                });\r\n                sourceBinding.Bindings.Add(new Binding()\r\n                {\r\n                    Path = new PropertyPath(nameof(GamesCollectionViewEntry.DefaultDetailsListIconObjectCached)),\r\n                    Converter = new NullToDependencyPropertyUnsetConverter(),\r\n                    Mode = BindingMode.OneWay\r\n                });\r\n\r\n                BindingOperations.SetBinding(ImageIcon, Image.SourceProperty, sourceBinding);\r\n            }\r\n\r\n            ImageCover = Template.FindName(\"PART_ImageCover\", this) as Image;\r\n            if (ImageCover != null)\r\n            {\r\n                var sourceBinding = new PriorityBinding();\r\n                sourceBinding.Bindings.Add(new Binding()\r\n                {\r\n                    Path = new PropertyPath(nameof(GamesCollectionViewEntry.GridViewCoverObjectCached)),\r\n                    IsAsync = mainModel.AppSettings.AsyncImageLoading,\r\n                    Converter = new NullToDependencyPropertyUnsetConverter(),\r\n                    Mode = BindingMode.OneWay\r\n                });\r\n                sourceBinding.Bindings.Add(new Binding()\r\n                {\r\n                    Path = new PropertyPath(nameof(GamesCollectionViewEntry.DefaultGridViewCoverObjectCached)),\r\n                    Converter = new NullToDependencyPropertyUnsetConverter(),\r\n                    Mode = BindingMode.OneWay\r\n                });\r\n\r\n                BindingOperations.SetBinding(ImageCover, Image.SourceProperty, sourceBinding);\r\n            }\r\n\r\n            ButtonPlay = Template.FindName(\"PART_ButtonPlay\", this) as Button;\r\n            if (ButtonPlay != null)\r\n            {\r\n                ButtonPlay.Command = mainModel.StartGameCommand;\r\n                BindingTools.SetBinding(ButtonPlay,\r\n                    Button.CommandParameterProperty,\r\n                    nameof(GamesCollectionViewEntry.Game));\r\n            }\r\n\r\n            ButtonInfo = Template.FindName(\"PART_ButtonInfo\", this) as Button;\r\n            if (ButtonInfo != null)\r\n            {\r\n                ButtonInfo.Command = mainModel.ShowGameSideBarCommand;\r\n                BindingTools.SetBinding(ButtonInfo,\r\n                    Button.CommandParameterProperty,\r\n                    string.Empty);\r\n            }\r\n\r\n            ControlTemplateTools.InitializePluginControls(\r\n                mainModel.Extensions,\r\n                Template,\r\n                this,\r\n                ApplicationMode.Desktop,\r\n                this,\r\n                $\"DataContext.{nameof(GamesCollectionViewEntry.Game)}\");\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/GameTaskView.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.GameTaskView\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:mods=\"clr-namespace:Playnite.SDK.Models;assembly=Playnite.SDK\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignWidth=\"600\">\r\n    <UserControl.Resources>\r\n        <pcon:BidirectionalEnumAndNumberConverter x:Key=\"BidirectionalEnumAndNumberConverter\" />\r\n        <pcon:BoolToAutoWidthConverter x:Key=\"BoolToAutoWidthConverter\" />       \r\n    </UserControl.Resources>\r\n\r\n    <Grid>\r\n        <Grid.ColumnDefinitions>\r\n            <ColumnDefinition Width=\"2*\"/>\r\n            <ColumnDefinition Width=\"3*\"/>\r\n        </Grid.ColumnDefinitions>\r\n        <Grid.Resources>\r\n            <Style TargetType=\"TextBox\" BasedOn=\"{StaticResource {x:Type TextBox}}\" >\r\n                <Setter Property=\"Margin\" Value=\"3\" />\r\n            </Style>\r\n            <Style TargetType=\"pctrls:NullIntNumericBox\" BasedOn=\"{StaticResource {x:Type pctrls:NullIntNumericBox}}\" >\r\n                <Setter Property=\"Margin\" Value=\"3\" />\r\n            </Style>\r\n            <Style TargetType=\"pctrls:PathSelectionBox\" BasedOn=\"{StaticResource {x:Type pctrls:PathSelectionBox}}\" >\r\n                <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                <Setter Property=\"Margin\" Value=\"3\" />\r\n            </Style>\r\n            <Style TargetType=\"ComboBox\" BasedOn=\"{StaticResource {x:Type ComboBox}}\" >\r\n                <Setter Property=\"Margin\" Value=\"3\" />\r\n                <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n            </Style>\r\n            <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                <Setter Property=\"Margin\" Value=\"0,0,3,0\" />\r\n            </Style>\r\n        </Grid.Resources>\r\n        <Grid Grid.Column=\"0\" Margin=\"0,0,15,0\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"Auto\"/>\r\n                <ColumnDefinition Width=\"*\"/>\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"Auto\"/>\r\n                <RowDefinition Height=\"Auto\"/>\r\n                <RowDefinition Height=\"Auto\"/>\r\n                <RowDefinition Height=\"{Binding ShowTrackingModeRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>\r\n            </Grid.RowDefinitions>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCNameLabel}\" Grid.Column=\"0\" Grid.Row=\"0\"/>\r\n            <TextBox IsEnabled=\"{Binding ShowNameRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay}\"\r\n                     Name=\"TextName\" Grid.Column=\"1\" Grid.Row=\"0\" Text=\"{Binding Name}\"/>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCIsPlayAction}\" Grid.Column=\"0\" Grid.Row=\"1\" />\r\n            <CheckBox Grid.Column=\"1\" Grid.Row=\"1\" Margin=\"3,5,3,5\"\r\n                      Checked=\"CheckBox_Checked\" Unchecked=\"CheckBox_Checked\"\r\n                      IsChecked=\"{Binding IsPlayAction}\" />\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCTypeLabel}\" Grid.Column=\"0\" Grid.Row=\"2\"/>\r\n            <ComboBox Name=\"ComboType\" Grid.Column=\"1\" Grid.Row=\"2\"                      \r\n                      SelectedValue=\"{Binding Type}\"\r\n                      pbeh:SelectorBehaviors.EnumSource=\"{x:Type mods:GameActionType}\"\r\n                      SelectionChanged=\"ComboType_SelectionChanged\" />\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCActionTrackingMode}\" Grid.Column=\"0\" Grid.Row=\"3\" />\r\n            <ComboBox Name=\"ComboTrackingMode\" Grid.Column=\"1\" Grid.Row=\"3\"\r\n                      SelectedValue=\"{Binding TrackingMode}\"\r\n                      pbeh:SelectorBehaviors.EnumSource=\"{x:Type mods:TrackingMode}\"\r\n                      SelectionChanged=\"ComboTrackingMode_SelectionChanged\"/>\r\n        </Grid>\r\n\r\n        <TextBox Grid.Column=\"1\" AcceptsReturn=\"True\" AcceptsTab=\"True\" MaxHeight=\"200\"\r\n                 ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\" ScrollViewer.VerticalScrollBarVisibility=\"Auto\"\r\n                 FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                 Text=\"{Binding Script}\"\r\n                 Visibility=\"{Binding ShowScriptInput, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n\r\n        <Grid Grid.Column=\"1\"\r\n              Visibility=\"{Binding ShowScriptInput, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"Auto\"/>\r\n                <ColumnDefinition Width=\"*\"/>\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Name=\"RowPath\" Height=\"{Binding ShowPathRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>\r\n                <RowDefinition Name=\"RowArguments\" Height=\"{Binding ShowArgumentsRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>\r\n                <RowDefinition Name=\"RowWorkingDir\" Height=\"{Binding ShowWorkingDirRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>                \r\n                <RowDefinition Name=\"RowEmulator\" Height=\"{Binding ShowEmulatorRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>\r\n                <RowDefinition Name=\"RowOverrideArgs\" Height=\"{Binding ShowOverrideArgsRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>                \r\n                <RowDefinition Name=\"RowDefaultArguments\" Height=\"{Binding ShowDefaultArgumentsRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>\r\n                <RowDefinition Name=\"RowAdditionalArgs\" Height=\"{Binding ShowAdditionalArgumentsRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>\r\n                <RowDefinition Name=\"RowCustomEmulatorArgs\" Height=\"{Binding ShowCustomEmulatorArgsRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>\r\n                <RowDefinition Name=\"RowTrackingPath\" Height=\"{Binding ShowTrackingPathRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>\r\n                <RowDefinition Name=\"RowTrackingInitDelay\" Height=\"{Binding ShowTrackingTimeRows, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>\r\n                <RowDefinition Name=\"RowTrackingFrequency\" Height=\"{Binding ShowTrackingTimeRows, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay, Converter={StaticResource BoolToAutoWidthConverter}}\"/>\r\n            </Grid.RowDefinitions>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCPathLabel}\" Grid.Column=\"0\" Grid.Row=\"0\" />            \r\n            <pctrls:PathSelectionBox x:Name=\"TextPath\" Grid.Column=\"1\" Grid.Row=\"0\"\r\n                                     Text=\"{Binding Path, UpdateSourceTrigger=PropertyChanged}\"\r\n                                     IsEnabled=\"{Binding ShowPathRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay}\"\r\n                                     ShowFileSelector=\"True\"/>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCArgumentsTitle}\" Grid.Column=\"0\" Grid.Row=\"1\" />\r\n            <TextBox IsEnabled=\"{Binding ShowArgumentsRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay}\"\r\n                     Name=\"TextArguments\" Grid.Column=\"1\" Grid.Row=\"1\" Text=\"{Binding Arguments}\" />\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCWorkingDirTitle}\" Grid.Column=\"0\" Grid.Row=\"2\" />\r\n            <pctrls:PathSelectionBox IsEnabled=\"{Binding ShowWorkingDirRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay}\"\r\n                                     x:Name=\"TextWorkDir\" Grid.Column=\"1\" Grid.Row=\"2\" Text=\"{Binding WorkingDir}\"\r\n                                     ShowDirectorySelector=\"True\" />\r\n            \r\n            <StackPanel Orientation=\"Horizontal\"\r\n                    IsEnabled=\"{Binding ShowEmulatorRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay}\"\r\n                    Grid.Column=\"0\" Grid.Row=\"3\" Grid.ColumnSpan=\"2\" Margin=\"0,3,0,3\">\r\n                <TextBlock Text=\"{DynamicResource LOCEmulatorTitle}\" />\r\n                <ComboBox Name=\"ComboEmulator\" SelectionChanged=\"ComboEmulator_SelectionChanged\"\r\n                      Margin=\"5,0,10,0\"\r\n                      ItemsSource=\"{Binding Emulators, RelativeSource={RelativeSource AncestorType=UserControl}}\"\r\n                      SelectedValuePath=\"Id\" SelectedValue=\"{Binding EmulatorId}\" DisplayMemberPath=\"Name\" />\r\n                <Label Content=\"{DynamicResource LOCProfileLabel}\" />\r\n                <ComboBox Name=\"ComboEmulatorConfig\" SelectionChanged=\"ComboEmulatorConfig_SelectionChanged\"\r\n                      Margin=\"5,0,5,0\"\r\n                      ItemsSource=\"{Binding SelectedItem.SelectableProfiles, ElementName=ComboEmulator}\"\r\n                      SelectedValuePath=\"Id\" SelectedValue=\"{Binding EmulatorProfileId}\" DisplayMemberPath=\"Name\" />\r\n            </StackPanel>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCOverrideEmulatorArguments}\" Grid.Column=\"0\" Grid.Row=\"4\"  />\r\n            <CheckBox IsEnabled=\"{Binding ShowOverrideArgsRow, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay}\"\r\n                      Name=\"CheckOverrideArgs\" Grid.Column=\"1\" Grid.Row=\"4\" Margin=\"3,5,3,5\"\r\n                  IsChecked=\"{Binding OverrideDefaultArgs}\" Checked=\"CheckOverrideArgs_Checked\" Unchecked=\"CheckOverrideArgs_Checked\"/>\r\n\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCEmulatorArguments}\" Grid.Column=\"0\" Grid.Row=\"5\" />\r\n            <TextBox Name=\"TextEmulatorArguments\" Grid.Column=\"1\" Grid.Row=\"5\" \r\n                     Text=\"{Binding SelectedEmulatorArguments, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneWay}\"\r\n                     IsEnabled=\"False\" />\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCAdditionalEmulatorArguments}\" Grid.Column=\"0\" Grid.Row=\"6\" />\r\n            <TextBox Name=\"TextAdditionalArguments\" Grid.Column=\"1\" Grid.Row=\"6\"\r\n                     Text=\"{Binding AdditionalArguments}\" />\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCEmulatorArguments}\" Grid.Column=\"0\" Grid.Row=\"7\" />\r\n            <TextBox Name=\"EmulatorArguments\" Grid.Column=\"1\" Grid.Row=\"7\" Text=\"{Binding Arguments}\" />\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCActionTrackingPath}\" Grid.Column=\"0\" Grid.Row=\"8\" />\r\n            <pctrls:PathSelectionBox Grid.Column=\"1\" Grid.Row=\"8\" ShowDirectorySelector=\"True\"\r\n                                     Text=\"{Binding TrackingPath}\"/>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCActionTrackingTrackingDelay}\" Grid.Column=\"0\" Grid.Row=\"9\" />\r\n            <pctrls:NullIntNumericBox Grid.Column=\"1\" Grid.Row=\"9\"\r\n                                      Value=\"{Binding InitialTrackingDelay}\"\r\n                                      MinValue=\"0\" />\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCActionTrackingFrequency}\" Grid.Column=\"0\" Grid.Row=\"10\" />\r\n            <pctrls:NullIntNumericBox Grid.Column=\"1\" Grid.Row=\"10\"\r\n                                      Value=\"{Binding TrackingFrequency}\"\r\n                                      MinValue=\"0\" />\r\n        </Grid>\r\n    </Grid>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/GameTaskView.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\nusing Microsoft.Win32;\r\nusing Playnite.SDK.Models;\r\nusing System.ComponentModel;\r\nusing Playnite.Common;\r\nusing Playnite.Emulators;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for GameTaskView.xaml\r\n    /// </summary>\r\n    public partial class GameTaskView : UserControl, INotifyPropertyChanged\r\n    {\r\n        public bool IsCurrentEmulatorProfileCustom => GameTask.EmulatorProfileId?.StartsWith(CustomEmulatorProfile.ProfilePrefix) == true;\r\n\r\n        public bool CanOverrideArgs\r\n        {\r\n            get\r\n            {\r\n                if (GameTask.EmulatorProfileId?.StartsWith(CustomEmulatorProfile.ProfilePrefix) == true)\r\n                {\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    var emu = Emulators.FirstOrDefault(a => a.Id == GameTask.EmulatorId);\r\n                    if (emu == null)\r\n                    {\r\n                        return false;\r\n                    }\r\n\r\n                    var emuProf = emu.BuiltinProfiles?.FirstOrDefault(a => a.Id == GameTask.EmulatorProfileId);\r\n                    if (emuProf != null)\r\n                    {\r\n                        var def = Emulation.GetProfile(emu.BuiltInConfigId, emuProf.BuiltInProfileName);\r\n                        if (def?.ScriptStartup == false)\r\n                        {\r\n                            return true;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public bool ShowCustomEmulatorArgsRow\r\n        {\r\n            get\r\n            {\r\n                if (GameTask == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                return GameTask.Type == GameActionType.Emulator && GameTask.OverrideDefaultArgs && CanOverrideArgs;\r\n            }\r\n        }\r\n\r\n        public bool ShowArgumentsRow\r\n        {\r\n            get\r\n            {\r\n                if (GameTask == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                return GameTask.Type == GameActionType.File;\r\n            }\r\n        }\r\n\r\n        public bool ShowAdditionalArgumentsRow\r\n        {\r\n            get\r\n            {\r\n                if (GameTask == null)\r\n                {\r\n                    return false;\r\n                }\r\n                else if (GameTask.Type == GameActionType.Emulator && !CanOverrideArgs)\r\n                {\r\n                    return false;\r\n                }\r\n                else if (GameTask.Type == GameActionType.Emulator && !GameTask.OverrideDefaultArgs)\r\n                {\r\n                    return true;\r\n                }\r\n\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public bool ShowDefaultArgumentsRow\r\n        {\r\n            get\r\n            {\r\n                if (GameTask == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                if (GameTask.Type == GameActionType.Emulator && !CanOverrideArgs)\r\n                {\r\n                    return false;\r\n                }\r\n                else if (GameTask.Type == GameActionType.Emulator && !GameTask.OverrideDefaultArgs)\r\n                {\r\n                    return true;\r\n                }\r\n\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public bool ShowPathRow\r\n        {\r\n            get\r\n            {\r\n                if (GameTask == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                return GameTask.Type != GameActionType.Emulator;\r\n            }\r\n        }\r\n\r\n        public bool ShowWorkingDirRow\r\n        {\r\n            get\r\n            {\r\n                if (GameTask == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                return GameTask.Type == GameActionType.File;\r\n            }\r\n        }\r\n\r\n        public bool ShowEmulatorRow\r\n        {\r\n            get\r\n            {\r\n                if (GameTask == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                return GameTask.Type == GameActionType.Emulator;\r\n            }\r\n        }\r\n\r\n        public bool ShowOverrideArgsRow\r\n        {\r\n            get\r\n            {\r\n                if (GameTask == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                if (GameTask.Type == GameActionType.Emulator && !CanOverrideArgs)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                return GameTask.Type == GameActionType.Emulator;\r\n            }\r\n        }\r\n\r\n        public bool ShowTrackingPathRow\r\n        {\r\n            get\r\n            {\r\n                if (GameTask == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                return (GameTask.TrackingMode == TrackingMode.Directory || GameTask.TrackingMode == TrackingMode.ProcessName) && GameTask.Type != GameActionType.Emulator;\r\n            }\r\n        }\r\n\r\n        public bool ShowTrackingModeRow\r\n        {\r\n            get\r\n            {\r\n                if (GameTask == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                return (GameTask.Type == GameActionType.File || GameTask.Type == GameActionType.URL) && GameTask.IsPlayAction;\r\n            }\r\n        }\r\n\r\n        public bool ShowTrackingTimeRows\r\n        {\r\n            get\r\n            {\r\n                if (GameTask == null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                return (GameTask.TrackingMode == TrackingMode.Directory || GameTask.TrackingMode == TrackingMode.ProcessName) && GameTask.Type != GameActionType.Emulator;\r\n            }\r\n        }\r\n\r\n        public bool ShowScriptInput\r\n        {\r\n            get\r\n            {\r\n                return GameTask?.Type == GameActionType.Script;\r\n            }\r\n        }\r\n\r\n        public GameAction GameTask\r\n        {\r\n            get\r\n            {\r\n                if (DataContext == null)\r\n                {\r\n                    return null;\r\n                }\r\n                else\r\n                {\r\n                    return ((GameAction)DataContext);\r\n                }\r\n            }\r\n        }\r\n\r\n        private string selectedEmulatorArguments;\r\n        public string SelectedEmulatorArguments\r\n        {\r\n            get => selectedEmulatorArguments;\r\n            set\r\n            {\r\n                selectedEmulatorArguments = value;\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedEmulatorArguments)));\r\n            }\r\n        }\r\n\r\n        public List<Emulator> Emulators\r\n        {\r\n            get\r\n            {\r\n                return (List<Emulator>)GetValue(EmulatorsProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(EmulatorsProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty EmulatorsProperty =\r\n            DependencyProperty.Register(nameof(Emulators), typeof(List<Emulator>), typeof(GameTaskView));\r\n\r\n        public bool ShowNameRow\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(ShowNameRowProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ShowNameRowProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ShowNameRowProperty =\r\n            DependencyProperty.Register(nameof(ShowNameRow), typeof(bool), typeof(GameTaskView));\r\n\r\n        public string DefaultSelectionDir\r\n        {\r\n            get\r\n            {\r\n                return (string)GetValue(DefaultSelectionDirProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(DefaultSelectionDirProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty DefaultSelectionDirProperty =\r\n            DependencyProperty.Register(nameof(DefaultSelectionDir), typeof(string), typeof(GameTaskView));\r\n\r\n        public event PropertyChangedEventHandler PropertyChanged;\r\n\r\n        public GameTaskView()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        public void OnPropertyChanged(string name)\r\n        {\r\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));\r\n        }\r\n\r\n        private void ButtonBrowsePath_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            var path = SystemDialogs.SelectFile(Window.GetWindow(this), \"*.*|*.*\", DefaultSelectionDir);\r\n            if (string.IsNullOrEmpty(path))\r\n            {\r\n                return;\r\n            }\r\n\r\n            TextPath.Text = path;\r\n        }\r\n\r\n        private void ComboType_SelectionChanged(object sender, SelectionChangedEventArgs e)\r\n        {\r\n            NotifyRowChange();\r\n        }\r\n\r\n        private void ComboTrackingMode_SelectionChanged(object sender, SelectionChangedEventArgs e)\r\n        {\r\n            OnPropertyChanged(nameof(ShowTrackingPathRow));\r\n            OnPropertyChanged(nameof(ShowTrackingTimeRows));\r\n        }\r\n\r\n        private void NotifyRowChange()\r\n        {\r\n            OnPropertyChanged(nameof(ShowArgumentsRow));\r\n            OnPropertyChanged(nameof(ShowAdditionalArgumentsRow));\r\n            OnPropertyChanged(nameof(ShowDefaultArgumentsRow));\r\n            OnPropertyChanged(nameof(ShowPathRow));\r\n            OnPropertyChanged(nameof(ShowWorkingDirRow));\r\n            OnPropertyChanged(nameof(ShowEmulatorRow));\r\n            OnPropertyChanged(nameof(ShowOverrideArgsRow));\r\n            OnPropertyChanged(nameof(ShowCustomEmulatorArgsRow));\r\n            OnPropertyChanged(nameof(ShowTrackingModeRow));\r\n            OnPropertyChanged(nameof(ShowScriptInput));\r\n        }\r\n\r\n        private void CheckOverrideArgs_Checked(object sender, RoutedEventArgs e)\r\n        {\r\n            if (GameTask == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            NotifyRowChange();\r\n            if (GameTask.OverrideDefaultArgs && !SelectedEmulatorArguments.IsNullOrEmpty() && GameTask.Arguments.IsNullOrEmpty())\r\n            {\r\n                GameTask.Arguments = $\"{SelectedEmulatorArguments} {GameTask.AdditionalArguments}\".Trim();\r\n            }\r\n        }\r\n\r\n        private void ComboEmulator_SelectionChanged(object sender, SelectionChangedEventArgs e)\r\n        {\r\n            if (GameTask == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (Emulators == null || Emulators.Count == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (GameTask?.EmulatorId != Guid.Empty && Emulators.Any(a => a.Id == GameTask?.EmulatorId))\r\n            {\r\n                ComboEmulatorConfig.SelectedItem = Emulators.First(a => a.Id == GameTask.EmulatorId).CustomProfiles?.FirstOrDefault();\r\n            }\r\n        }\r\n\r\n        private void ComboEmulatorConfig_SelectionChanged(object sender, SelectionChangedEventArgs e)\r\n        {\r\n            if (GameTask == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (Emulators == null || Emulators.Count == 0)\r\n            {\r\n                SelectedEmulatorArguments = string.Empty;\r\n                return;\r\n            }\r\n\r\n            if (GameTask?.EmulatorId != Guid.Empty && Emulators.Any(a => a.Id == GameTask?.EmulatorId))\r\n            {\r\n                var emulator = Emulators.First(a => a.Id == GameTask.EmulatorId);\r\n                var emulatorProfile = emulator.AllProfiles?.FirstOrDefault(a => a.Id == GameTask.EmulatorProfileId);\r\n                if (emulatorProfile == null)\r\n                {\r\n                    SelectedEmulatorArguments = string.Empty;\r\n                }\r\n                else\r\n                {\r\n                    if (emulatorProfile is CustomEmulatorProfile customProfile)\r\n                    {\r\n                        SelectedEmulatorArguments = customProfile.Arguments;\r\n                    }\r\n                    else if (emulatorProfile is BuiltInEmulatorProfile builtInProfile)\r\n                    {\r\n                        if (builtInProfile.OverrideDefaultArgs)\r\n                        {\r\n                            SelectedEmulatorArguments = builtInProfile.CustomArguments;\r\n                        }\r\n                        else\r\n                        {\r\n                            var def = Emulation.GetProfile(emulator.BuiltInConfigId, builtInProfile.BuiltInProfileName);\r\n                            if (def?.ScriptStartup == false)\r\n                            {\r\n                                SelectedEmulatorArguments = def.StartupArguments;\r\n                            }\r\n                            else\r\n                            {\r\n                                SelectedEmulatorArguments = string.Empty;\r\n                            }\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        SelectedEmulatorArguments = string.Empty;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                SelectedEmulatorArguments = string.Empty;\r\n            }\r\n\r\n            NotifyRowChange();\r\n        }\r\n\r\n        private void CheckBox_Checked(object sender, RoutedEventArgs e)\r\n        {\r\n            NotifyRowChange();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/GamesGridView.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.GamesGridView\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:pc=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n             xmlns:sdkm=\"clr-namespace:Playnite.SDK.Models;assembly=Playnite.SDK\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"300\" d:DesignWidth=\"502.764\">\r\n    \r\n    <UserControl.Resources>\r\n        <pcon:NiceListToStringConverter x:Key=\"ListToStringConverter\" />\r\n        <pcon:PlayTimeToStringConverter x:Key=\"PlayTimeToStringConverter\" />\r\n        <pcon:NullableDateToStringConverter x:Key=\"NullableDateToStringConverter\" />\r\n        <pcon:NullableUlongBytesSizeToStringConverter x:Key=\"NullableUlongBytesSizeToStringConverter\" />\r\n        <pcon:DateTimeToLastPlayedConverter x:Key=\"DateTimeToLastPlayedConverter\" />\r\n        <pcon:BoolToYesNoConverter x:Key=\"BoolToYesNoConverter\" />\r\n        <pcon:BoolToAutoWidthConverter x:Key=\"BoolToAutoWidthConverter\" />        \r\n        <BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n        <pcon:InvertableBooleanToVisibilityConverter x:Key=\"InvertableBooleanToVisibilityConverter\" />\r\n        <pcon:NullToDependencyPropertyUnsetConverter x:Key=\"NullToDependencyPropertyUnsetConverter\" />\r\n        <pcon:ObjectToStringConverter x:Key=\"ObjectToStringConverter\" />\r\n        <pcon:ValueConverterGroup x:Key=\"EnumCompVisibilityConverter\">\r\n            <pcon:EnumToBooleanConverter/>\r\n            <pcon:BooleanToHiddenConverter />\r\n        </pcon:ValueConverterGroup>\r\n\r\n        <Style x:Key=\"TextItemStyle\" BasedOn=\"{StaticResource {x:Type TextBlock}}\" TargetType=\"TextBlock\">\r\n            <Setter Property=\"Margin\" Value=\"0,5,0,5\" />\r\n        </Style>\r\n\r\n        <Style x:Key=\"SortIndicator\" TargetType=\"ContentControl\" x:Shared=\"False\">\r\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n            <Setter Property=\"Margin\" Value=\"2,0,0,0\" />\r\n            <Setter Property=\"ContentTemplate\">\r\n                <Setter.Value>\r\n                    <DataTemplate>\r\n                        <Grid>\r\n                            <TextBlock FontFamily=\"Marlett\" Text=\"5\"\r\n                       Visibility=\"{pmrk:Settings ViewSettings.SortingOrderDirection, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrderDirection.Ascending}}\"/>\r\n                            <TextBlock FontFamily=\"Marlett\" Text=\"6\"\r\n                       Visibility=\"{pmrk:Settings ViewSettings.SortingOrderDirection, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrderDirection.Descending}}\"/>\r\n                        </Grid>\r\n                    </DataTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n        \r\n        <p:BindingProxy x:Key=\"MainProxy\" Data=\"{Binding}\" />\r\n\r\n        <DataTemplate x:Key=\"CellTemplateIcon\">\r\n            <Image Width=\"20\" Stretch=\"Uniform\"\r\n                   RenderOptions.BitmapScalingMode=\"HighQuality\">\r\n                <Image.Source>\r\n                    <PriorityBinding>\r\n                        <Binding Path=\"IconObjectCached\" Mode=\"OneWay\" \r\n                                 IsAsync=\"{pmrk:Settings AsyncImageLoading, DirectValue=True}\"\r\n                                 Converter=\"{StaticResource NullToDependencyPropertyUnsetConverter}\" />\r\n                        <Binding Path=\"DefaultIconObjectCached\" Mode=\"OneWay\" />\r\n                    </PriorityBinding>\r\n                </Image.Source>\r\n            </Image>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateName\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGameNameTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Name}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateName\">\r\n            <TextBlock Text=\"{Binding DisplayName, Mode=OneWay}\" Style=\"{StaticResource TextItemStyle}\"/>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplatePlatform\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGamePlatformTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Platforms}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplatePlatform\">\r\n            <TextBlock Text=\"{Binding Platforms, Mode=OneWay, Converter={StaticResource ListToStringConverter}}\" Style=\"{StaticResource TextItemStyle}\"/>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateLibrary\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGameProviderTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Library}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateLibrary\">\r\n            <TextBlock Text=\"{Binding Library, Mode=OneWay}\" Style=\"{StaticResource TextItemStyle}\"/>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateDevelopers\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGameDevelopersTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Developers}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateDevelopers\">\r\n            <TextBlock Text=\"{Binding Developers, Mode=OneWay, Converter={StaticResource ListToStringConverter}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplatePublishers\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGamePublishersTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Publishers}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplatePublishers\">\r\n            <TextBlock Text=\"{Binding Publishers, Mode=OneWay, Converter={StaticResource ListToStringConverter}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateReleaseDate\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGameReleaseDateTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.ReleaseDate}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateReleaseDate\">\r\n            <TextBlock Text=\"{Binding ReleaseDate, Mode=OneWay, Converter={StaticResource ReleaseDateToStringConverter}, ConverterParameter={pmrk:Settings DateTimeFormatReleaseDate, DirectValue=True}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateGenres\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGameGenresTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Genres}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateGenres\">\r\n            <TextBlock Text=\"{Binding Genres, Mode=OneWay, Converter={StaticResource ListToStringConverter}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateCategories\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGameCategoriesTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Categories}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateCategories\">\r\n            <TextBlock Text=\"{Binding Categories, Mode=OneWay, Converter={StaticResource ListToStringConverter}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateFeatures\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCFeaturesLabel}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Features}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateFeatures\">\r\n            <TextBlock Text=\"{Binding Features, Mode=OneWay, Converter={StaticResource ListToStringConverter}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateTags\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGameTagsTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Tags}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateTags\">\r\n            <TextBlock Text=\"{Binding Tags, Mode=OneWay, Converter={StaticResource ListToStringConverter}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateIsInstalled\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGameIsInstalledTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.IsInstalled}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateIsInstalled\">\r\n            <TextBlock Text=\"{Binding IsInstalled, Mode=OneWay, Converter={StaticResource BoolToYesNoConverter}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateInstallDirectory\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGameInstallDirTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.InstallDirectory}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateInstallDirectory\">\r\n            <TextBlock Text=\"{Binding InstallDirectory, Mode=OneWay}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateLastActivity\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGameLastActivityTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.LastActivity}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateLastActivity\">\r\n            <TextBlock Text=\"{Binding LastActivity, Mode=OneWay, Converter={StaticResource DateTimeToLastPlayedConverter}, ConverterParameter={pmrk:Settings DateTimeFormatLastPlayed, DirectValue=True}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateRecentActivity\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCRecentActivityLabel}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.RecentActivity}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateRecentActivity\">\r\n            <TextBlock Text=\"{Binding RecentActivity, Mode=OneWay, Converter={StaticResource NullableDateToStringConverter}, ConverterParameter={pmrk:Settings DateTimeFormatRecentActivity, DirectValue=True}}\" />\r\n        </DataTemplate>\r\n        \r\n        <DataTemplate x:Key=\"HeaderTemplatePlaytime\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCTimePlayed}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Playtime}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplatePlaytime\">\r\n            <TextBlock Text=\"{Binding Playtime, Mode=OneWay, Converter={StaticResource PlayTimeToStringConverter}, ConverterParameter={pmrk:Settings PlaytimeUseDaysFormat, DirectValue=True}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplatePlayCount\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCPlayCountLabel}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.PlayCount}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n        \r\n        <DataTemplate x:Key=\"HeaderTemplateInstallSize\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCInstallSizeLabel}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.InstallSize}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n        \r\n        <DataTemplate x:Key=\"CellTemplateRoms\">\r\n            <TextBlock Text=\"{Binding RomList, Mode=OneWay}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateRoms\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCGameROMTitle}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.InstallSize}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateInstallSize\">\r\n            <TextBlock Text=\"{Binding InstallSize, Mode=OneWay, Converter={StaticResource NullableUlongBytesSizeToStringConverter}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplatePlayCount\">\r\n            <TextBlock Text=\"{Binding PlayCount, Mode=OneWay}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateCompletionStatus\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCCompletionStatus}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.CompletionStatus}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateCompletionStatus\">\r\n            <TextBlock Text=\"{Binding CompletionStatus, Mode=OneWay}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateSeries\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCSeriesLabel}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Series}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateSeries\">\r\n            <TextBlock Text=\"{Binding Series, Mode=OneWay, Converter={StaticResource ListToStringConverter}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateVersion\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCVersionLabel}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Version}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateVersion\">\r\n            <TextBlock Text=\"{Binding Version, Mode=OneWay}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateAgeRating\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCAgeRatingLabel}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.AgeRatings}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateAgeRating\">\r\n            <TextBlock Text=\"{Binding AgeRatings, Mode=OneWay, Converter={StaticResource ListToStringConverter}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateRegion\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCRegionLabel}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Regions}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateRegion\">\r\n            <TextBlock Text=\"{Binding Regions, Mode=OneWay, Converter={StaticResource ListToStringConverter}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateSource\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCSourceLabel}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Source}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateSource\">\r\n            <TextBlock Text=\"{Binding Source, Mode=OneWay}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateAdded\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCAddedLabel}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Added}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n        \r\n        <DataTemplate x:Key=\"CellTemplateAdded\">\r\n            <TextBlock Text=\"{Binding Added, Mode=OneWay, Converter={StaticResource NullableDateToStringConverter}, ConverterParameter={pmrk:Settings DateTimeFormatAdded, DirectValue=True}}\" />\r\n        </DataTemplate>\r\n        \r\n        <DataTemplate x:Key=\"HeaderTemplateModified\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCModifiedLabel}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.Modified}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateModified\">\r\n            <TextBlock Text=\"{Binding Modified, Mode=OneWay, Converter={StaticResource NullableDateToStringConverter}, ConverterParameter={pmrk:Settings DateTimeFormatModified, DirectValue=True}}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateUserScore\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCUserScore}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.UserScore}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateUserScore\">\r\n            <TextBlock Text=\"{Binding UserScore, Mode=OneWay}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateCriticScore\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCCriticScore}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.CriticScore}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateCriticScore\">\r\n            <TextBlock Text=\"{Binding CriticScore, Mode=OneWay}\" />\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"HeaderTemplateCommunityScore\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCCommunityScore}\" />\r\n                <ContentControl Style=\"{StaticResource SortIndicator}\"\r\n                                Visibility=\"{pmrk:Settings ViewSettings.SortingOrder, Converter={StaticResource EnumCompVisibilityConverter}, ConverterParameter={x:Static sdkm:SortOrder.CommunityScore}}\"/>\r\n            </StackPanel>\r\n        </DataTemplate>\r\n\r\n        <DataTemplate x:Key=\"CellTemplateCommunityScore\">\r\n            <TextBlock Text=\"{Binding CommunityScore, Mode=OneWay}\" />\r\n        </DataTemplate>\r\n    </UserControl.Resources>\r\n\r\n    <ListView x:Name=\"GridGames\" SelectionMode=\"Extended\" BorderThickness=\"0\"\r\n              DataContext=\"{Binding AppSettings.ViewSettings, RelativeSource={RelativeSource AncestorType=UserControl}}\"\r\n              ItemsSource=\"{Binding ItemsSource, RelativeSource={RelativeSource AncestorType=UserControl}}\"\r\n              VirtualizingPanel.VirtualizationMode=\"Recycling\" VirtualizingPanel.IsVirtualizingWhenGrouping=\"True\"\r\n              VirtualizingPanel.CacheLengthUnit=\"Item\" VirtualizingPanel.CacheLength=\"5\"\r\n              VirtualizingPanel.ScrollUnit=\"Pixel\"\r\n              pbeh:ScrollToSelectedBehavior.Enabled=\"True\">\r\n        <ListView.Resources>\r\n            <p:BindingProxy x:Key=\"SettingsProxy\" Data=\"{Binding}\" />\r\n            <p:BindingProxy x:Key=\"GridGamesProxy\" Data=\"{Binding ElementName=GridGames}\" />\r\n        </ListView.Resources>\r\n        <ListView.InputBindings>\r\n            <KeyBinding Command=\"{Binding Data.EditSelectedGamesCommand, Source={StaticResource MainProxy}}\"\r\n                        Key =\"{Binding Data.EditSelectedGamesCommand.Gesture.Key, Source={StaticResource MainProxy}}\"\r\n                        Modifiers=\"{Binding Data.EditSelectedGamesCommand.Gesture.Modifiers, Source={StaticResource MainProxy}}\" />\r\n            <KeyBinding Command=\"{Binding Data.RemoveSelectedGamesCommand, Source={StaticResource MainProxy}}\"\r\n                        Key =\"{Binding Data.RemoveSelectedGamesCommand.Gesture.Key, Source={StaticResource MainProxy}}\"\r\n                        Modifiers=\"{Binding Data.RemoveSelectedGamesCommand.Gesture.Modifiers, Source={StaticResource MainProxy}}\" />\r\n            <KeyBinding Command=\"{Binding Data.StartSelectedGameCommand, Source={StaticResource MainProxy}}\"\r\n                        Key =\"{Binding Data.StartSelectedGameCommand.Gesture.Key, Source={StaticResource MainProxy}}\"\r\n                        Modifiers=\"{Binding Data.StartSelectedGameCommand.Gesture.Modifiers, Source={StaticResource MainProxy}}\" />\r\n        </ListView.InputBindings>\r\n        <ListView.ItemContainerStyle>\r\n            <Style TargetType=\"{x:Type ListViewItem}\" BasedOn=\"{StaticResource {x:Type ListViewItem}}\">\r\n                <Setter Property=\"ContextMenu\">\r\n                    <Setter.Value>\r\n                        <pc:GameMenu DataContext=\"{Binding Data.SelectedItems, Source={StaticResource GridGamesProxy}}\"\r\n                                     ShowStartSection=\"True\"/>\r\n                    </Setter.Value>\r\n                </Setter>\r\n                <EventSetter Event=\"MouseDoubleClick\" Handler=\"Grid_MouseDoubleClick\" />\r\n                <Style.Triggers>\r\n                    <MultiDataTrigger>\r\n                        <MultiDataTrigger.Conditions>\r\n                            <Condition Binding=\"{Binding IsInstalled}\" Value=\"False\" />\r\n                            <Condition Binding=\"{Binding IsSelected, RelativeSource={RelativeSource Self}}\" Value=\"False\" />\r\n                        </MultiDataTrigger.Conditions>\r\n                        <Setter Property=\"Foreground\" Value=\"{StaticResource TextBrushDarker}\" />\r\n                    </MultiDataTrigger>\r\n                </Style.Triggers>\r\n            </Style>\r\n        </ListView.ItemContainerStyle>\r\n        <ListView.GroupStyle>\r\n            <GroupStyle ContainerStyle=\"{StaticResource ListViewGroupStyle}\"/>\r\n        </ListView.GroupStyle>\r\n\r\n        <ListView.View>\r\n            <GridView x:Name=\"ActualGridView\">\r\n                <GridView.ColumnHeaderContainerStyle>\r\n                    <Style TargetType=\"GridViewColumnHeader\" BasedOn=\"{StaticResource {x:Type GridViewColumnHeader}}\">                        \r\n                        <EventSetter Event=\"Click\" Handler=\"GridViewColumnHeader_Click\" />\r\n                    </Style>                        \r\n                </GridView.ColumnHeaderContainerStyle>\r\n                <GridView.ColumnHeaderContextMenu>\r\n                    <ContextMenu Name=\"HeaderMenu\"\r\n                                 DataContext=\"{Binding Data, Source={StaticResource SettingsProxy}}\">\r\n                        <MenuItem Header=\"{DynamicResource LOCGameIconTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Icon.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGameNameTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Name.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGamePlatformTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Platform.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGameProviderTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.PluginId.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGameDevelopersTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Developers.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGamePublishersTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Publishers.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGameReleaseDateTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.ReleaseDate.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGameGenresTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Genres.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGameCategoriesTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Categories.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCFeaturesLabel}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Features.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGameTagsTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Tags.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGameIsInstalledTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.IsInstalled.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGameInstallDirTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.InstallDirectory.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCInstallSizeLabel}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.InstallSize.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGameROMTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Roms.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCGameLastActivityTitle}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.LastActivity.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCRecentActivityLabel}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.RecentActivity.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCTimePlayed}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Playtime.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCPlayCountLabel}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.PlayCount.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCCompletionStatus}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.CompletionStatus.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCSeriesLabel}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Series.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCVersionLabel}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Version.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCAgeRatingLabel}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.AgeRating.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCRegionLabel}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Region.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCSourceLabel}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Source.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCAddedLabel}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Added.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCModifiedLabel}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.Modified.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCUserScore}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.UserScore.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCCriticScore}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.CriticScore.Visible}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCCommunityScore}\"\r\n                                    IsCheckable=\"True\" IsChecked=\"{Binding ListViewColumns.CommunityScore.Visible}\" />\r\n                    </ContextMenu>\r\n                </GridView.ColumnHeaderContextMenu>\r\n            </GridView>\r\n        </ListView.View>\r\n    </ListView>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/GamesGridView.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing Playnite;\r\nusing System.ComponentModel;\r\nusing Playnite.Settings;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class GamesGridViewColumn : GridViewColumn\r\n    {\r\n        public GameField Field { get; set; }\r\n\r\n        public SortOrder? SortOrder { get; set; }\r\n\r\n        public GamesGridViewColumn() : base()\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for GamesGridView.xaml\r\n    /// </summary>\r\n    public partial class GamesGridView : UserControl\r\n    {\r\n        internal bool ignoreSelectedItemsListChanges = false;\r\n\r\n        public IList<object> SelectedItemsList\r\n        {\r\n            get\r\n            {\r\n                return (IList<object>)GetValue(SelectedItemsListProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(SelectedItemsListProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty SelectedItemsListProperty =\r\n           DependencyProperty.Register(nameof(SelectedItemsList), typeof(IList<object>), typeof(GamesGridView), new PropertyMetadata(null, SelectedItemsListChanged));\r\n\r\n        public IEnumerable ItemsSource\r\n        {\r\n            get\r\n            {\r\n                return (IEnumerable)GetValue(ItemsSourceProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ItemsSourceProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(nameof(ItemsSource), typeof(IEnumerable), typeof(GamesGridView));\r\n\r\n        public PlayniteSettings AppSettings\r\n        {\r\n            get\r\n            {\r\n                return (PlayniteSettings)GetValue(AppSettingsProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(AppSettingsProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty AppSettingsProperty = DependencyProperty.Register(nameof(AppSettings), typeof(PlayniteSettings), typeof(GamesGridView));\r\n\r\n        private bool ignoreColumnChanges = false;\r\n        private bool initialized = false;\r\n\r\n        public GamesGridView()\r\n        {\r\n            InitializeComponent();\r\n            GridGames.SelectionChanged += GridGames_SelectionChanged;\r\n            ActualGridView.Columns.CollectionChanged += Columns_CollectionChanged;\r\n            Loaded += GamesGridView_Loaded;\r\n        }\r\n\r\n        private void GamesGridView_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            if (initialized)\r\n            {\r\n                return;\r\n            }\r\n\r\n            initialized = true;\r\n            InitializeColumns();\r\n            AppSettings.ViewSettings.ListViewColumns.Added.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.AgeRating.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Categories.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.CommunityScore.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.CompletionStatus.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.CriticScore.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Developers.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Features.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Genres.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Icon.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.InstallDirectory.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.IsInstalled.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.LastActivity.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.RecentActivity.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Modified.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Name.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Platform.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.PlayCount.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.InstallSize.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Playtime.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.PluginId.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Publishers.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Region.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.ReleaseDate.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Series.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Source.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Tags.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.UserScore.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Version.PropertyChanged += ListViewColumn_PropertyChanged;\r\n            AppSettings.ViewSettings.ListViewColumns.Roms.PropertyChanged += ListViewColumn_PropertyChanged;\r\n        }\r\n\r\n        private void ListViewColumn_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(ListViewColumnProperty.Visible))\r\n            {\r\n                var prop = sender as ListViewColumnProperty;\r\n                if (AppSettings.ViewSettings.ListViewColumsOrder.Contains(prop.Field) &&\r\n                    !prop.Visible)\r\n                {\r\n                    var column = ActualGridView.Columns.FirstOrDefault(a => ((GamesGridViewColumn)a).Field == prop.Field);\r\n                    if (column != null)\r\n                    {\r\n                        ActualGridView.Columns.Remove(column);\r\n                    }\r\n                }\r\n                else if (!AppSettings.ViewSettings.ListViewColumsOrder.Contains(prop.Field) &&\r\n                          prop.Visible)\r\n                {\r\n                    var newColumn = GetColumn(prop.Field);\r\n                    if (newColumn != null)\r\n                    {\r\n                        ActualGridView.Columns.Add(newColumn);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void SelectedItemsListChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var list = (GamesGridView)d;\r\n            if (list.ignoreSelectedItemsListChanges || list.GridGames.SelectionMode == SelectionMode.Single)\r\n            {\r\n                return;\r\n            }\r\n\r\n            list.GridGames.SelectedItems.Clear();\r\n            var newValues = e.NewValue as IList<object>;\r\n            if (newValues.HasItems())\r\n            {\r\n                newValues.ForEach(a => list.GridGames.SelectedItems.Add(a));\r\n            }\r\n        }\r\n\r\n        private void InitializeColumns()\r\n        {\r\n            ignoreColumnChanges = true;\r\n\r\n            foreach (var field in AppSettings.ViewSettings.ListViewColumsOrder)\r\n            {\r\n                var newColumn = GetColumn(field);\r\n                if (newColumn != null)\r\n                {\r\n                    ActualGridView.Columns.Add(newColumn);\r\n                }\r\n            }\r\n\r\n            ignoreColumnChanges = false;\r\n        }\r\n\r\n        private void Columns_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)\r\n        {\r\n            if (ignoreColumnChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            AppSettings.ViewSettings.ListViewColumsOrder = ActualGridView.Columns.Select(a => ((GamesGridViewColumn)a).Field).ToList();\r\n        }\r\n\r\n        private GamesGridViewColumn GetColumn(GameField field)\r\n        {\r\n            GamesGridViewColumn newColumn = null;\r\n            if (field == GameField.Icon)\r\n            {\r\n                newColumn = CreateColumn(field, null, \"CellTemplateIcon\", null);\r\n            }\r\n            else if (field == GameField.Name)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Name, \"CellTemplateName\", \"HeaderTemplateName\");\r\n            }\r\n            else if (field == GameField.Platforms)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Platforms, \"CellTemplatePlatform\", \"HeaderTemplatePlatform\", \"Platform\");\r\n            }\r\n            else if (field == GameField.PluginId)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Library, \"CellTemplateLibrary\", \"HeaderTemplateLibrary\");\r\n            }\r\n            else if (field == GameField.Developers)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Developers, \"CellTemplateDevelopers\", \"HeaderTemplateDevelopers\");\r\n            }\r\n            else if (field == GameField.Publishers)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Publishers, \"CellTemplatePublishers\", \"HeaderTemplatePublishers\");\r\n            }\r\n            else if (field == GameField.ReleaseDate)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.ReleaseDate, \"CellTemplateReleaseDate\", \"HeaderTemplateReleaseDate\");\r\n            }\r\n            else if (field == GameField.Genres)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Genres, \"CellTemplateGenres\", \"HeaderTemplateGenres\");\r\n            }\r\n            else if (field == GameField.Categories)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Categories, \"CellTemplateCategories\", \"HeaderTemplateCategories\");\r\n            }\r\n            else if (field == GameField.Features)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Features, \"CellTemplateFeatures\", \"HeaderTemplateFeatures\");\r\n            }\r\n            else if (field == GameField.Tags)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Tags, \"CellTemplateTags\", \"HeaderTemplateTags\");\r\n            }\r\n            else if (field == GameField.IsInstalled)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.IsInstalled, \"CellTemplateIsInstalled\", \"HeaderTemplateIsInstalled\");\r\n            }\r\n            else if (field == GameField.InstallDirectory)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.InstallDirectory, \"CellTemplateInstallDirectory\", \"HeaderTemplateInstallDirectory\");\r\n            }\r\n            else if (field == GameField.LastActivity)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.LastActivity, \"CellTemplateLastActivity\", \"HeaderTemplateLastActivity\");\r\n            }\r\n            else if (field == GameField.Playtime)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Playtime, \"CellTemplatePlaytime\", \"HeaderTemplatePlaytime\");\r\n            }\r\n            else if (field == GameField.PlayCount)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.PlayCount, \"CellTemplatePlayCount\", \"HeaderTemplatePlayCount\");\r\n            }\r\n            else if (field == GameField.InstallSize)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.InstallSize, \"CellTemplateInstallSize\", \"HeaderTemplateInstallSize\");\r\n            }\r\n            else if (field == GameField.CompletionStatus)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.CompletionStatus, \"CellTemplateCompletionStatus\", \"HeaderTemplateCompletionStatus\");\r\n            }\r\n            else if (field == GameField.Series)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Series, \"CellTemplateSeries\", \"HeaderTemplateSeries\");\r\n            }\r\n            else if (field == GameField.Version)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Version, \"CellTemplateVersion\", \"HeaderTemplateVersion\");\r\n            }\r\n            else if (field == GameField.AgeRatings)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.AgeRatings, \"CellTemplateAgeRating\", \"HeaderTemplateAgeRating\", \"AgeRating\");\r\n            }\r\n            else if (field == GameField.Regions)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Regions, \"CellTemplateRegion\", \"HeaderTemplateRegion\", \"Region\");\r\n            }\r\n            else if (field == GameField.Source)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Source, \"CellTemplateSource\", \"HeaderTemplateSource\");\r\n            }\r\n            else if (field == GameField.Added)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Added, \"CellTemplateAdded\", \"HeaderTemplateAdded\");\r\n            }\r\n            else if (field == GameField.Modified)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.Modified, \"CellTemplateModified\", \"HeaderTemplateModified\");\r\n            }\r\n            else if (field == GameField.UserScore)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.UserScore, \"CellTemplateUserScore\", \"HeaderTemplateUserScore\");\r\n            }\r\n            else if (field == GameField.CriticScore)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.CriticScore, \"CellTemplateCriticScore\", \"HeaderTemplateCriticScore\");\r\n            }\r\n            else if (field == GameField.CommunityScore)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.CommunityScore, \"CellTemplateCommunityScore\", \"HeaderTemplateCommunityScore\");\r\n            }\r\n            else if (field == GameField.RecentActivity)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.RecentActivity, \"CellTemplateRecentActivity\", \"HeaderTemplateRecentActivity\");\r\n            }\r\n            else if (field == GameField.Roms)\r\n            {\r\n                newColumn = CreateColumn(field, SortOrder.RomList, \"CellTemplateRoms\", \"HeaderTemplateRoms\");\r\n            }\r\n\r\n            return newColumn;\r\n        }\r\n\r\n        private GamesGridViewColumn CreateColumn(GameField field, SortOrder? sortOrder, string cellTemplateName, string headerTemplateName, string bindingName = null)\r\n        {\r\n            // bindingName is there for backwards compatibility between P8 and P9\r\n            var column = new GamesGridViewColumn\r\n            {\r\n                Field = field,\r\n                SortOrder = sortOrder\r\n            };\r\n\r\n            BindingOperations.SetBinding(\r\n                column,\r\n                GridViewColumn.WidthProperty,\r\n                new Binding($\"{nameof(ViewSettings.ListViewColumns)}.{bindingName ?? field.ToString()}.{nameof(ListViewColumnProperty.Width)}\")\r\n                {\r\n                    Source = AppSettings.ViewSettings,\r\n                    Mode = BindingMode.TwoWay\r\n                });\r\n\r\n            column.CellTemplate = Resources[cellTemplateName] as DataTemplate;\r\n            if (!headerTemplateName.IsNullOrEmpty())\r\n            {\r\n                column.HeaderTemplate = Resources[headerTemplateName] as DataTemplate;\r\n            }\r\n\r\n            return column;\r\n        }\r\n\r\n        private void GridGames_SelectionChanged(object sender, SelectionChangedEventArgs e)\r\n        {\r\n            ignoreSelectedItemsListChanges = true;\r\n            SelectedItemsList = (IList<object>)GridGames.SelectedItems;\r\n            ignoreSelectedItemsListChanges = false;\r\n        }\r\n\r\n        private void Grid_MouseDoubleClick(object sender, MouseButtonEventArgs e)\r\n        {\r\n            if (e.LeftButton != MouseButtonState.Pressed || GridGames.SelectedItems == null || GridGames.SelectedItems.Count == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var entry = (GamesCollectionViewEntry)GridGames.SelectedItems[0];\r\n            var game = entry.Game;\r\n            if (game.IsInstalled)\r\n            {\r\n                PlayniteApplication.Current.GamesEditor.PlayGame(game, true);\r\n            }\r\n            else\r\n            {\r\n                if (game.IsCustomGame)\r\n                {\r\n                    ((DesktopGamesEditor)DesktopApplication.Current.GamesEditor).EditGame(game);\r\n                }\r\n                else\r\n                {\r\n                    DesktopApplication.Current.GamesEditor.InstallGame(game);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            var header = sender as GridViewColumnHeader;\r\n            if (header == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var column = header.Column as GamesGridViewColumn;\r\n            if (column == null || column.SortOrder == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (AppSettings.ViewSettings.SortingOrder == column.SortOrder.Value)\r\n            {\r\n                AppSettings.ViewSettings.SortingOrderDirection = AppSettings.ViewSettings.SortingOrderDirection == SortOrderDirection.Ascending ? SortOrderDirection.Descending : SortOrderDirection.Ascending;\r\n            }\r\n            else\r\n            {\r\n                AppSettings.ViewSettings.SortingOrder = column.SortOrder.Value;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/GridViewPanel.cs",
    "content": "﻿using System.Windows.Controls.Primitives;\r\nusing System.Windows.Controls;\r\nusing System.Windows;\r\nusing System.Windows.Media;\r\nusing System;\r\nusing System.Diagnostics;\r\nusing System.Collections.Specialized;\r\nusing System.ComponentModel;\r\nusing System.Reflection;\r\nusing System.Linq;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class GridViewPanel : VirtualizingPanel, IScrollInfo\r\n    {\r\n        private int computedColumns;\r\n        private double centerMargin;\r\n        private int itemCount => ((ItemContainerGenerator)ItemContainerGenerator).Items.Count;\r\n\r\n        // Important for grouped virtualization to work\r\n        protected override bool CanHierarchicallyScrollAndVirtualizeCore => true;\r\n\r\n        private DependencyObject itemsOwner;\r\n        protected DependencyObject ItemsOwner\r\n        {\r\n            get\r\n            {\r\n                if (itemsOwner is null)\r\n                {\r\n                    var getItemsOwnerInternalMethod = typeof(ItemsControl).GetMethod(\r\n                        \"GetItemsOwnerInternal\",\r\n                        BindingFlags.Static | BindingFlags.NonPublic,\r\n                        null,\r\n                        new Type[] { typeof(DependencyObject) },\r\n                        null\r\n                    );\r\n\r\n                    itemsOwner = (DependencyObject)getItemsOwnerInternalMethod.Invoke(null, new object[] { this });\r\n                }\r\n\r\n                return itemsOwner;\r\n            }\r\n        }\r\n\r\n        private IRecyclingItemContainerGenerator itemContainerGenerator;\r\n        protected new IRecyclingItemContainerGenerator ItemContainerGenerator\r\n        {\r\n            get\r\n            {\r\n                if (itemContainerGenerator is null)\r\n                {\r\n                    /* Because of a bug in the framework the ItemContainerGenerator\r\n                     * is null until InternalChildren accessed at least one time. */\r\n                    var children = InternalChildren;\r\n                    itemContainerGenerator = (IRecyclingItemContainerGenerator)base.ItemContainerGenerator;\r\n                }\r\n                return itemContainerGenerator;\r\n            }\r\n        }\r\n\r\n        private double cachedItemWith;\r\n        public double ItemWidth\r\n        {\r\n            get\r\n            {\r\n                double width = 0;\r\n                if (InternalChildren.Count > 0)\r\n                {\r\n                    width = InternalChildren[0].DesiredSize.Width;\r\n                }\r\n\r\n                if (width > 0)\r\n                {\r\n                    cachedItemWith = width;\r\n                    return width;\r\n                }\r\n                else\r\n                {\r\n                    return cachedItemWith;\r\n                }\r\n            }\r\n        }\r\n\r\n        private double cachedItemHeight;\r\n        public double ItemHeight\r\n        {\r\n            get\r\n            {\r\n                double height = 0;\r\n                if (InternalChildren.Count > 0)\r\n                {\r\n                    height = InternalChildren[0].DesiredSize.Height;\r\n                }\r\n\r\n                if (height > 0)\r\n                {\r\n                    cachedItemHeight = height;\r\n                    return height;\r\n                }\r\n                else\r\n                {\r\n                    return cachedItemHeight;\r\n                }\r\n            }\r\n        }\r\n\r\n        public GridViewPanel() : base()\r\n        {\r\n        }\r\n\r\n        protected override Size MeasureOverride(Size availableSize)\r\n        {\r\n            // This is for weird edge case where Measuring can occur and OnItemsChanged was not called by WPF first\r\n            if (ItemWidth == 0)\r\n            {\r\n                var startPosition = ItemContainerGenerator.GeneratorPositionFromIndex(0);\r\n                using (ItemContainerGenerator.StartAt(startPosition, GeneratorDirection.Forward, true))\r\n                {\r\n                    var child = (UIElement)ItemContainerGenerator.GenerateNext();\r\n                    if (child != null)\r\n                    {\r\n                        AddInternalChild(child);\r\n                        ItemContainerGenerator.PrepareItemContainer(child);\r\n                        child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));\r\n                    }\r\n                }\r\n            }\r\n\r\n            double expanderOffset = 0;\r\n            var groupItem = ItemsOwner as IHierarchicalVirtualizationAndScrollInfo;\r\n            if (groupItem != null)\r\n            {\r\n                // This is a workaround for issues like #2454, caused by some bug in WPF.\r\n                // Collapsed groups are SOMETIMES treated as expandeded and will force initialization of child items.\r\n                var expander = ElementTreeHelper.FindVisualChildren<Expander>(groupItem as GroupItem).FirstOrDefault();\r\n                if (expander != null && expander.IsExpanded == false)\r\n                {\r\n                    UpdateScrollInfo(new Size(0, 0));\r\n                    CleanUpItems();\r\n                    return new Size(0, 0);\r\n                }\r\n                else\r\n                {\r\n                    UpdateScrollInfo(groupItem.Constraints.Viewport.Size);\r\n                }\r\n\r\n                if (expander != null)\r\n                {\r\n                    var toggle = ElementTreeHelper.FindVisualChildren<ToggleButton>(groupItem as GroupItem).FirstOrDefault();\r\n                    if (toggle != null)\r\n                    {\r\n                        expanderOffset = toggle.ActualHeight;\r\n                    }\r\n                }\r\n\r\n                Offset = groupItem.Constraints.Viewport.Location;\r\n            }\r\n            else\r\n            {\r\n                UpdateScrollInfo(availableSize);\r\n            }\r\n\r\n            GetVisibleRange(expanderOffset, out var firstItemIndex, out var lastItemIndex);\r\n            if (lastItemIndex < 0)\r\n            {\r\n                return Extent;\r\n            }\r\n\r\n            var startPos = ItemContainerGenerator.GeneratorPositionFromIndex(firstItemIndex);\r\n            var childIndex = (startPos.Offset == 0) ? startPos.Index : startPos.Index + 1;\r\n            using (ItemContainerGenerator.StartAt(startPos, GeneratorDirection.Forward, true))\r\n            {\r\n                for (int itemIndex = firstItemIndex; itemIndex <= lastItemIndex; ++itemIndex, ++childIndex)\r\n                {\r\n                    UIElement child = ItemContainerGenerator.GenerateNext(out var newlyRealized) as UIElement;\r\n                    if (child == null)\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    if (newlyRealized)\r\n                    {\r\n                        if (childIndex >= InternalChildren.Count)\r\n                        {\r\n                            AddInternalChild(child);\r\n                        }\r\n                        else\r\n                        {\r\n                            InsertInternalChild(childIndex, child);\r\n                        }\r\n\r\n                        ItemContainerGenerator.PrepareItemContainer(child);\r\n                    }\r\n                    else if (!InternalChildren.Contains(child))\r\n                    {\r\n                        InsertInternalChild(childIndex, child);\r\n                        ItemContainerGenerator.PrepareItemContainer(child);\r\n                    }\r\n\r\n                    child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));\r\n                }\r\n            }\r\n\r\n            CleanUpItems(firstItemIndex, lastItemIndex);\r\n            return Extent;\r\n        }\r\n\r\n        protected override Size ArrangeOverride(Size finalSize)\r\n        {\r\n            for (int i = 0; i < InternalChildren.Count; i++)\r\n            {\r\n                var child = InternalChildren[i];\r\n                var itemIndex = ItemContainerGenerator.IndexFromGeneratorPosition(new GeneratorPosition(i, 0));\r\n                // Negative index means that child is disconnected item\r\n                if (itemIndex >= 0)\r\n                {\r\n                    child.Arrange(GetItemRect(itemIndex));\r\n                }\r\n            }\r\n\r\n            return finalSize;\r\n        }\r\n\r\n        private Rect GetItemRect(int itemIndex)\r\n        {\r\n            if (computedColumns == 0)\r\n            {\r\n                return new Rect();\r\n            }\r\n\r\n            var column = itemIndex % computedColumns;\r\n            var row = itemIndex < column ? 0 : (int)Math.Floor(itemIndex / (double)computedColumns);\r\n            var offset = ItemsOwner is IHierarchicalVirtualizationAndScrollInfo ? 0 : Offset.Y;\r\n            return new Rect(\r\n                centerMargin + (column * ItemWidth),\r\n                (row * ItemHeight) - offset,\r\n                ItemWidth,\r\n                ItemHeight);\r\n        }\r\n\r\n        private void GetVisibleRange(double expanderOffset, out int firstIndex, out int lastIndex)\r\n        {\r\n            if (itemCount == 0 || Viewport.Height == 0)\r\n            {\r\n                firstIndex = -1;\r\n                lastIndex = -1;\r\n                return;\r\n            }\r\n\r\n            var startRow = 0;\r\n            double totalHeight = 0;\r\n            while (true)\r\n            {\r\n                if (Offset.Y - expanderOffset > totalHeight + ItemHeight)\r\n                {\r\n                    totalHeight += ItemHeight;\r\n                    startRow++;\r\n                }\r\n                else\r\n                {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            firstIndex = startRow * computedColumns;\r\n            var newRows = (int)Math.Ceiling(Viewport.Height / ItemHeight) + 1;\r\n            lastIndex = firstIndex + (newRows * computedColumns);\r\n            if (lastIndex >= itemCount)\r\n            {\r\n                lastIndex = itemCount - 1;\r\n            }\r\n        }\r\n\r\n        private void CleanUpItems()\r\n        {\r\n            RemoveInternalChildRange(0, InternalChildren.Count - 1);\r\n        }\r\n\r\n        private void CleanUpItems(int firstIndex, int lastIndex)\r\n        {\r\n            for (int i = InternalChildren.Count - 1; i >= 0; i--)\r\n            {\r\n                var childGeneratorPos = new GeneratorPosition(i, 0);\r\n                int itemIndex = ItemContainerGenerator.IndexFromGeneratorPosition(childGeneratorPos);\r\n                var child = InternalChildren[i];\r\n                if ((itemIndex < firstIndex || itemIndex > lastIndex) && itemIndex > 0)\r\n                {\r\n                    try\r\n                    {\r\n                        ItemContainerGenerator.Recycle(childGeneratorPos, 1);\r\n                    }\r\n                    catch\r\n                    {\r\n                        // There are some weird null-reference crash reports from Generator.Recycle\r\n                    }\r\n\r\n                    RemoveInternalChildRange(i, 1);\r\n                }\r\n                else if (child.ToString().Contains(\"{DisconnectedItem}\"))\r\n                {\r\n                    RemoveInternalChildRange(i, 1);\r\n                }\r\n            }\r\n        }\r\n\r\n        protected override void OnItemsChanged(object sender, ItemsChangedEventArgs args)\r\n        {\r\n            switch (args.Action)\r\n            {\r\n                case NotifyCollectionChangedAction.Remove:\r\n                case NotifyCollectionChangedAction.Replace:\r\n                    RemoveInternalChildRange(args.Position.Index, args.ItemUICount);\r\n                    break;\r\n                case NotifyCollectionChangedAction.Move:\r\n                    RemoveInternalChildRange(args.OldPosition.Index, args.ItemUICount);\r\n                    break;\r\n            }\r\n        }\r\n\r\n        internal Size GetExtent()\r\n        {\r\n            if (itemCount == 0)\r\n            {\r\n                return new Size(0, 0);\r\n            }\r\n\r\n            if (computedColumns == 0)\r\n            {\r\n                return new Size(\r\n                    Viewport.Width,\r\n                    itemCount * ItemHeight);\r\n            }\r\n            else\r\n            {\r\n                var totalRows = (int)Math.Ceiling(itemCount / (double)computedColumns);\r\n                return new Size(\r\n                    Viewport.Width,\r\n                    totalRows * ItemHeight);\r\n            }\r\n        }\r\n\r\n        private Size Viewport = new Size(0, 0);\r\n        private Point Offset = new Point(0, 0);\r\n        private Size Extent = new Size(0, 0);\r\n\r\n        public bool CanVerticallyScroll { get; set; }\r\n        public bool CanHorizontallyScroll { get; set; }\r\n        public double ExtentWidth => Extent.Width;\r\n        public double ExtentHeight => Extent.Height;\r\n        public double ViewportWidth => Viewport.Width;\r\n        public double ViewportHeight => Viewport.Height;\r\n        public double HorizontalOffset => Offset.X;\r\n        public double VerticalOffset => Offset.Y;\r\n        public ScrollViewer ScrollOwner { get; set; }\r\n\r\n        internal void UpdateScrollInfo(Size availableSize)\r\n        {\r\n            var invalidate = false;\r\n            if (availableSize != Viewport)\r\n            {\r\n                Viewport = availableSize;\r\n            }\r\n\r\n            var itemWidth = ItemWidth;\r\n            if (ItemWidth > 0)\r\n            {\r\n                computedColumns = (int)Math.Floor(Viewport.Width / itemWidth);\r\n                centerMargin = (Viewport.Width - (computedColumns * itemWidth)) / 2;\r\n            }\r\n            else\r\n            {\r\n                computedColumns = 0;\r\n                centerMargin = 0;\r\n            }\r\n\r\n            var newExtent = GetExtent();\r\n            if (Extent != newExtent)\r\n            {\r\n                Extent = newExtent;\r\n                invalidate = true;\r\n            }\r\n\r\n            if (Offset.Y > Extent.Height)\r\n            {\r\n                Offset.Y = 0;\r\n                invalidate = true;\r\n            }\r\n\r\n            if (Offset.X > Extent.Width)\r\n            {\r\n                Offset.X = 0;\r\n                invalidate = true;\r\n            }\r\n\r\n            if (invalidate)\r\n            {\r\n                ScrollOwner?.InvalidateScrollInfo();\r\n            }\r\n        }\r\n\r\n        public void SetHorizontalOffset(double newOffset)\r\n        {\r\n        }\r\n\r\n        public void SetVerticalOffset(double newOffset)\r\n        {\r\n            if (newOffset < 0 || Viewport.Height >= Extent.Height)\r\n            {\r\n                newOffset = 0;\r\n            }\r\n            else\r\n            {\r\n                if (newOffset + Viewport.Height >= Extent.Height)\r\n                {\r\n                    newOffset = Extent.Height - Viewport.Height;\r\n                }\r\n            }\r\n\r\n            Offset.Y = newOffset;\r\n            ScrollOwner?.InvalidateScrollInfo();\r\n            InvalidateMeasure();\r\n        }\r\n\r\n        protected override void BringIndexIntoView(int index)\r\n        {\r\n            if (index < 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var itemRect = GetItemRect(index);\r\n            if (itemRect.Y > 0 && itemRect.Bottom < Viewport.Height)\r\n            {\r\n                return;\r\n            }\r\n            else if (itemRect.Bottom > Viewport.Height)\r\n            {\r\n                SetVerticalOffset(Offset.Y + (itemRect.Bottom - Viewport.Height));\r\n                return;\r\n            }\r\n            else if (itemRect.Y < 0)\r\n            {\r\n                SetVerticalOffset(Offset.Y + itemRect.Y);\r\n                return;\r\n            }\r\n        }\r\n\r\n        public Rect MakeVisible(Visual visual, Rect rectangle)\r\n        {\r\n            var index = ((ItemContainerGenerator)ItemContainerGenerator).IndexFromContainer(visual);\r\n            if (index < 0)\r\n            {\r\n                return rectangle;\r\n            }\r\n\r\n            var itemRect = GetItemRect(index);\r\n            if (itemRect.Y > 0 && itemRect.Bottom < Viewport.Height)\r\n            {\r\n                return rectangle;\r\n            }\r\n            else if (itemRect.Bottom > Viewport.Height)\r\n            {\r\n                SetVerticalOffset(Offset.Y + (itemRect.Bottom - Viewport.Height));\r\n                return rectangle;\r\n            }\r\n            else if (itemRect.Y < 0)\r\n            {\r\n                SetVerticalOffset(Offset.Y + itemRect.Y);\r\n                return rectangle;\r\n            }\r\n\r\n            return rectangle;\r\n        }\r\n\r\n        public void LineLeft()\r\n        {\r\n        }\r\n\r\n        public void LineRight()\r\n        {\r\n        }\r\n\r\n        public void LineUp()\r\n        {\r\n            SetVerticalOffset(VerticalOffset - ItemHeight);\r\n        }\r\n\r\n        public void LineDown()\r\n        {\r\n            SetVerticalOffset(VerticalOffset + ItemHeight);\r\n        }\r\n\r\n        public void MouseWheelDown()\r\n        {\r\n            SetVerticalOffset(VerticalOffset + (ItemHeight / 2));\r\n        }\r\n\r\n        public void MouseWheelLeft()\r\n        {\r\n            LineLeft();\r\n        }\r\n\r\n        public void MouseWheelRight()\r\n        {\r\n            LineRight();\r\n        }\r\n\r\n        public void MouseWheelUp()\r\n        {\r\n            SetVerticalOffset(VerticalOffset - (ItemHeight / 2));\r\n        }\r\n\r\n        public void PageLeft()\r\n        {\r\n        }\r\n\r\n        public void PageRight()\r\n        {\r\n        }\r\n\r\n        public void PageUp()\r\n        {\r\n            SetVerticalOffset(VerticalOffset - Viewport.Height);\r\n        }\r\n\r\n        public void PageDown()\r\n        {\r\n            SetVerticalOffset(VerticalOffset + Viewport.Height);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/LibraryStatistics.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.LibraryStatistics\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n             xmlns:pdvm=\"clr-namespace:Playnite.DesktopApp.ViewModels\"\r\n             xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"650\" d:DesignWidth=\"900\"\r\n             d:DataContext=\"{x:Static pdvm:StatisticsViewModel.DesignIntance}\">\r\n\r\n    <UserControl.Resources>\r\n        <p:BindingProxy x:Key=\"DCProxy\" Data=\"{Binding}\" />\r\n\r\n        <ControlTemplate x:Key=\"OverallStatsTemplate\">\r\n            <ControlTemplate.Resources>\r\n                <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n            </ControlTemplate.Resources>\r\n            <GroupBox Header=\"{DynamicResource LOCOverviewLabel}\" Margin=\"10\" MaxHeight=\"330\">\r\n                <GridEx GridEx.AutoLayoutColumns=\"3\" GridEx.ColumnCount=\"3\" GridEx.RowCount=\"21\"                        \r\n                        GridEx.StarColumns=\"0\" MinWidth=\"220\" Margin=\"10\">\r\n                    <TextBlock Text=\"{DynamicResource LOCAll}\" Margin=\"0,3,15,3\" />\r\n                    <TextBlock Text=\"{Binding TotalCount}\" Margin=\"0,3,0,3\" TextAlignment=\"Right\" />\r\n                    <Canvas />\r\n\r\n                    <TextBlock Text=\"{DynamicResource LOCGameIsInstalledTitle}\" Margin=\"0,3,15,3\" />\r\n                    <TextBlock Text=\"{Binding Installed.Value}\" Margin=\"0,3,0,3\" TextAlignment=\"Right\" />\r\n                    <TextBlock Text=\"{Binding Installed.Percentage, StringFormat='{}{0}%'}\" Margin=\"15,3,0,3\" TextAlignment=\"Right\" />\r\n\r\n                    <TextBlock Text=\"{DynamicResource LOCGameIsUnInstalledTitle}\" Margin=\"0,3,15,3\" />\r\n                    <TextBlock Text=\"{Binding NotInstalled.Value}\" Margin=\"0,3,0,3\" TextAlignment=\"Right\" />\r\n                    <TextBlock Text=\"{Binding NotInstalled.Percentage, StringFormat='{}{0}%'}\" Margin=\"15,3,0,3\" TextAlignment=\"Right\" />\r\n\r\n                    <TextBlock Text=\"{DynamicResource LOCGameHiddenTitle}\" Margin=\"0,3,15,3\" />\r\n                    <TextBlock Text=\"{Binding Hidden.Value}\" Margin=\"0,3,0,3\" TextAlignment=\"Right\" />\r\n                    <TextBlock Text=\"{Binding Hidden.Percentage, StringFormat='{}{0}%'}\" Margin=\"15,3,0,3\" TextAlignment=\"Right\" />\r\n\r\n                    <TextBlock Text=\"{DynamicResource LOCGameFavoriteTitle}\" Margin=\"0,3,15,3\" />\r\n                    <TextBlock Text=\"{Binding Favorite.Value}\" Margin=\"0,3,0,3\" TextAlignment=\"Right\" />\r\n                    <TextBlock Text=\"{Binding Favorite.Percentage, StringFormat='{}{0}%'}\" Margin=\"15,3,0,3\" TextAlignment=\"Right\" />\r\n\r\n                    <TextBlock Text=\"{DynamicResource LOCStatsTotalPlayTime}\" Margin=\"0,15,15,3\"/>\r\n                    <TextBlock Text=\"{Binding TotalPlayTime, Converter={StaticResource PlayTimeToStringConverter}, ConverterParameter={pmrk:Settings PlaytimeUseDaysFormat, DirectValue=True}}\"\r\n                                       Grid.ColumnSpan=\"2\" Margin=\"0,15,0,3\" />\r\n\r\n                    <TextBlock Text=\"{DynamicResource LOCStatsAvaragePlayTime}\" Margin=\"0,3,15,3\" />\r\n                    <TextBlock Text=\"{Binding AvaragePlayTime, Converter={StaticResource PlayTimeToStringConverter}, ConverterParameter={pmrk:Settings PlaytimeUseDaysFormat, DirectValue=True}}\"\r\n                                       Grid.ColumnSpan=\"2\" Margin=\"0,3,0,3\"/>\r\n\r\n                    <TextBlock Text=\"{DynamicResource LOCStatsTotalInstallSize}\" Margin=\"0,15,15,3\"/>\r\n                    <TextBlock Text=\"{Binding TotalInstallSize, Converter={StaticResource NullableUlongBytesSizeToStringConverter}}\"\r\n                                       Grid.ColumnSpan=\"2\" Margin=\"0,15,0,3\" />\r\n                </GridEx>\r\n            </GroupBox>\r\n        </ControlTemplate>\r\n\r\n        <ControlTemplate x:Key=\"MostPlayedTemplate\">\r\n            <ControlTemplate.Resources>\r\n                <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n            </ControlTemplate.Resources>\r\n            <GroupBox Header=\"{DynamicResource LOCStatsTopPlayTime}\" Margin=\"10\" MaxHeight=\"330\">\r\n                <ItemsControl ItemsSource=\"{Binding TopPlayed}\" Width=\"350\" Margin=\"10\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <DockPanel>\r\n                                <TextBlock Text=\"{Binding Percentage, StringFormat='{}{0}%'}\"\r\n                                            Style=\"{DynamicResource BaseTextBlockStyle}\" Width=\"30\"\r\n                                            DockPanel.Dock=\"Right\" Margin=\"10,3,0,3\"\r\n                                            TextAlignment=\"Right\"/>\r\n                                <TextBlock Text=\"{Binding Value, Converter={StaticResource PlayTimeToStringConverter}, ConverterParameter={pmrk:Settings PlaytimeUseDaysFormat, DirectValue=True}}\"\r\n                                            Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                            DockPanel.Dock=\"Right\" Margin=\"0,3,0,3\"/>\r\n                                <TextBlock Margin=\"0,3,0,3\" ToolTip=\"{Binding Name}\">\r\n                                    <Hyperlink Command=\"{Binding Data.NavigateToGameCommand, Source={StaticResource DCProxy}}\"\r\n                                               CommandParameter=\"{Binding Game}\">\r\n                                        <TextBlock Text=\"{Binding Name}\" Margin=\"0,0,15,0\"                                                   \r\n                                                   TextTrimming=\"CharacterEllipsis\" />\r\n                                    </Hyperlink>\r\n                                </TextBlock>\r\n                            </DockPanel>\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                    <ItemsControl.Template>\r\n                        <ControlTemplate>\r\n                            <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\">\r\n                                <ItemsPresenter />\r\n                            </ScrollViewer>\r\n                        </ControlTemplate>\r\n                    </ItemsControl.Template>\r\n                </ItemsControl>\r\n            </GroupBox>\r\n        </ControlTemplate>\r\n\r\n        <ControlTemplate x:Key=\"CompletionStatusTemplate\">\r\n            <ControlTemplate.Resources>\r\n                <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n            </ControlTemplate.Resources>\r\n            <GroupBox Header=\"{DynamicResource LOCCompletionStatus}\" Margin=\"10\" MaxHeight=\"330\" >\r\n                <ItemsControl ItemsSource=\"{Binding CompletionStates}\"                                      \r\n                              Width=\"250\" Margin=\"10\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <DockPanel>\r\n                                <TextBlock Text=\"{Binding Percentage, StringFormat='{}{0}%'}\"\r\n                                           Style=\"{DynamicResource BaseTextBlockStyle}\" Width=\"30\"\r\n                                           DockPanel.Dock=\"Right\" Margin=\"10,3,0,3\"\r\n                                           TextAlignment=\"Right\"/>\r\n                                <TextBlock Text=\"{Binding Value}\" Margin=\"0,3,0,3\"\r\n                                           Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                           DockPanel.Dock=\"Right\"/>\r\n                                <TextBlock Text=\"{Binding Name}\" Margin=\"0,3,15,3\" DockPanel.Dock=\"Left\"\r\n                                           TextTrimming=\"CharacterEllipsis\"\r\n                                           Style=\"{DynamicResource BaseTextBlockStyle}\"/>\r\n                            </DockPanel>\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n            </GroupBox>\r\n        </ControlTemplate>\r\n\r\n        <ControlTemplate x:Key=\"GameProviderTemplate\">\r\n            <ControlTemplate.Resources>\r\n                <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n            </ControlTemplate.Resources>\r\n            <GroupBox Header=\"{DynamicResource LOCGameProviderTitle}\" Margin=\"10\" MaxHeight=\"330\" >\r\n                <ItemsControl ItemsSource=\"{Binding GameProvider}\"\r\n                              Width=\"250\" Margin=\"10\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <DockPanel>\r\n                                <TextBlock Text=\"{Binding Percentage, StringFormat='{}{0}%'}\"\r\n                                           Style=\"{DynamicResource BaseTextBlockStyle}\" Width=\"30\"\r\n                                           DockPanel.Dock=\"Right\" Margin=\"10,3,0,3\"\r\n                                           TextAlignment=\"Right\"/>\r\n                                <TextBlock Text=\"{Binding Value}\" Margin=\"0,3,0,3\"\r\n                                           Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                           DockPanel.Dock=\"Right\"/>\r\n                                <TextBlock Text=\"{Binding Name}\" Margin=\"0,3,15,3\" DockPanel.Dock=\"Left\"\r\n                                           TextTrimming=\"CharacterEllipsis\"\r\n                                           Style=\"{DynamicResource BaseTextBlockStyle}\"/>\r\n                            </DockPanel>\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n            </GroupBox>\r\n        </ControlTemplate>\r\n    </UserControl.Resources>\r\n\r\n    <DockPanel>\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"10,10,0,0\" DockPanel.Dock=\"Top\">\r\n            <TextBlock VerticalAlignment=\"Center\" WindowChrome.IsHitTestVisibleInChrome=\"True\">\r\n                <Hyperlink Command=\"{Binding NavigateBackCommand}\">\r\n                    <TextBlock Text=\"&#xea5c;\" FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                               FontSize=\"26\" />\r\n                </Hyperlink>\r\n            </TextBlock>\r\n            <TextBlock Text=\"{DynamicResource LOCStatistics}\" VerticalAlignment=\"Center\"\r\n                        Style=\"{StaticResource BaseTextBlockStyle}\"\r\n                       Margin=\"10,0,0,0\" FontSize=\"18\"/>\r\n            <CheckBox IsChecked=\"{Binding IncludeHidden}\" Content=\"{DynamicResource LOCStatsIncludeHidden}\"\r\n                      WindowChrome.IsHitTestVisibleInChrome=\"True\"\r\n                      Margin=\"50,0,0,0\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n        <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\" Margin=\"10\"\r\n                      VerticalScrollBarVisibility=\"Auto\">\r\n            <DockPanel>\r\n                <Expander DockPanel.Dock=\"Top\" Header=\"{DynamicResource LOCStatsGlobal}\" IsExpanded=\"True\"\r\n                          DataContext=\"{Binding GlobalStats}\">\r\n                    <WrapPanel>\r\n                        <ContentControl Template=\"{StaticResource OverallStatsTemplate}\" />\r\n                        <ContentControl Template=\"{StaticResource CompletionStatusTemplate}\" />\r\n                        <ContentControl Template=\"{StaticResource MostPlayedTemplate}\" />\r\n                        <ContentControl Template=\"{StaticResource GameProviderTemplate}\" />\r\n                    </WrapPanel>\r\n                </Expander>\r\n\r\n                <Expander DockPanel.Dock=\"Top\" Header=\"{DynamicResource LOCStatsFiltered}\" IsExpanded=\"True\">\r\n                    <WrapPanel>\r\n                        <ContentControl Template=\"{StaticResource OverallStatsTemplate}\"\r\n                                            DataContext=\"{Binding FilteredStats}\"/>\r\n                        <ContentControl Template=\"{StaticResource CompletionStatusTemplate}\"\r\n                                            DataContext=\"{Binding FilteredStats}\"/>\r\n                        <ContentControl Template=\"{StaticResource MostPlayedTemplate}\"\r\n                                            DataContext=\"{Binding FilteredStats}\"/>\r\n                        <GroupBox Header=\"{DynamicResource LOCFilter}\" Grid.Column=\"0\" Margin=\"10\"\r\n                                  MaxHeight=\"330\">\r\n                            <DockPanel Width=\"220\">\r\n                                <ComboBox SelectedValue=\"{Binding SelectedFilter}\" ItemsSource=\"{Binding Filters}\"\r\n                                          DisplayMemberPath=\"Name\" DockPanel.Dock=\"Top\"/>\r\n                                <ListBox BorderThickness=\"0\" Margin=\"0,5,0,0\" DockPanel.Dock=\"Top\"\r\n                                         ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\r\n                                         SelectedItem=\"{Binding SelectedFilterObject}\" ItemsSource=\"{Binding FilterObjects}\">\r\n                                    <ListBox.ItemTemplate>\r\n                                        <DataTemplate>\r\n                                            <TextBlock Text=\"{Binding Name}\" TextTrimming=\"CharacterEllipsis\" />\r\n                                        </DataTemplate>\r\n                                    </ListBox.ItemTemplate>\r\n                                </ListBox>\r\n                            </DockPanel>\r\n                        </GroupBox>\r\n                    </WrapPanel>\r\n                </Expander>\r\n            </DockPanel>\r\n        </ScrollViewer>\r\n    </DockPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/LibraryStatistics.xaml.cs",
    "content": "﻿using Playnite.DesktopApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for LibraryStatistics.xaml\r\n    /// </summary>\r\n    public partial class LibraryStatistics : UserControl\r\n    {\r\n        public LibraryStatistics()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        public LibraryStatistics(StatisticsViewModel model)\r\n        {\r\n            DataContext = model;\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/LongNumericBox.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class UlongNumericBox : TextBox\r\n    {\r\n        public ulong MinUlongValue\r\n        {\r\n            get\r\n            {\r\n                return (ulong)GetValue(MinUlongValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(MinUlongValueProperty, value);\r\n            }\r\n        }\r\n\r\n        public ulong MaxUlongValue\r\n        {\r\n            get\r\n            {\r\n                return (ulong)GetValue(MaxUlongValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(MaxUlongValueProperty, value);\r\n            }\r\n        }\r\n\r\n        private ulong lastUlongValue;\r\n        public ulong UlongValue\r\n        {\r\n            get\r\n            {\r\n                return (ulong)GetValue(UlongValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                lastUlongValue = value;\r\n                SetValue(UlongValueProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty UlongValueProperty =\r\n            DependencyProperty.Register(nameof(UlongValue), typeof(ulong), typeof(UlongNumericBox),\r\n                new FrameworkPropertyMetadata((ulong)0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, UlongValuePropertyChanged, CoerceUlongValue, false, UpdateSourceTrigger.PropertyChanged));\r\n\r\n        public static readonly DependencyProperty MinUlongValueProperty =\r\n            DependencyProperty.Register(nameof(MinUlongValue), typeof(ulong), typeof(UlongNumericBox),\r\n                new PropertyMetadata((ulong)0, MinUlongValuePropertyChanged));\r\n\r\n        public static readonly DependencyProperty MaxUlongValueProperty =\r\n            DependencyProperty.Register(nameof(MaxUlongValue), typeof(ulong), typeof(UlongNumericBox),\r\n                new PropertyMetadata(ulong.MaxValue, MaxUlongValuePropertyChanged));\r\n\r\n        static UlongNumericBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(UlongNumericBox), new FrameworkPropertyMetadata(typeof(UlongNumericBox)));\r\n        }\r\n\r\n        public UlongNumericBox()\r\n        {\r\n            Text = UlongValue.ToString();\r\n            LostFocus += NumericBox_LostFocus;\r\n            Loaded += NumericBox_Loaded;\r\n            TextChanged += NumericBox_TextChanged;\r\n        }\r\n\r\n        private void NumericBox_TextChanged(object sender, TextChangedEventArgs e)\r\n        {\r\n            NumericBox_LostFocus(sender, e);\r\n        }\r\n\r\n        private void NumericBox_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            lastUlongValue = UlongValue;\r\n        }\r\n\r\n        private void NumericBox_LostFocus(object sender, RoutedEventArgs e)\r\n        {\r\n            if (string.IsNullOrEmpty(Text))\r\n            {\r\n                Text = \"0\";\r\n            }\r\n\r\n            if (!ulong.TryParse(Text, out var result))\r\n            {\r\n                e.Handled = true;\r\n                UlongValue = lastUlongValue;\r\n            }\r\n            else\r\n            {\r\n                if (result >= MinUlongValue && result <= MaxUlongValue)\r\n                {\r\n                    UlongValue = result;\r\n                }\r\n                else\r\n                {\r\n                    e.Handled = true;\r\n                    UlongValue = lastUlongValue;\r\n                }\r\n            }\r\n        }\r\n\r\n        private static object CoerceUlongValue(DependencyObject element, object baseValue)\r\n        {\r\n            var box = (UlongNumericBox)element;\r\n            var value = (ulong)baseValue;\r\n            box.Text = value.ToString();\r\n            return value;\r\n        }\r\n\r\n        private static void UlongValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n        }\r\n\r\n        private static void MinUlongValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n        }\r\n\r\n        private static void MaxUlongValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class LongNumericBox : TextBox\r\n    {\r\n        public long MinLongValue\r\n        {\r\n            get\r\n            {\r\n                return (long)GetValue(MinLongValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(MinLongValueProperty, value);\r\n            }\r\n        }\r\n\r\n        public long MaxLongValue\r\n        {\r\n            get\r\n            {\r\n                return (long)GetValue(MaxLongValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(MaxLongValueProperty, value);\r\n            }\r\n        }\r\n\r\n        private long lastLongValue;\r\n        public long LongValue\r\n        {\r\n            get\r\n            {\r\n                return (long)GetValue(LongValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                lastLongValue = value;\r\n                SetValue(LongValueProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty LongValueProperty =\r\n            DependencyProperty.Register(nameof(LongValue), typeof(long), typeof(LongNumericBox),\r\n                new FrameworkPropertyMetadata((long)0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, LongValuePropertyChanged, CoerceLongValue, false, UpdateSourceTrigger.PropertyChanged));\r\n\r\n        public static readonly DependencyProperty MinLongValueProperty =\r\n            DependencyProperty.Register(nameof(MinLongValue), typeof(long), typeof(LongNumericBox),\r\n                new PropertyMetadata((long)0, MinLongValuePropertyChanged));\r\n\r\n        public static readonly DependencyProperty MaxLongValueProperty =\r\n            DependencyProperty.Register(nameof(MaxLongValue), typeof(long), typeof(LongNumericBox),\r\n                new PropertyMetadata(long.MaxValue, MaxLongValuePropertyChanged));\r\n\r\n        static LongNumericBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(LongNumericBox), new FrameworkPropertyMetadata(typeof(LongNumericBox)));\r\n        }\r\n\r\n        public LongNumericBox()\r\n        {\r\n            Text = LongValue.ToString();\r\n            LostFocus += NumericBox_LostFocus;\r\n            Loaded += NumericBox_Loaded;\r\n            TextChanged += NumericBox_TextChanged;\r\n        }\r\n\r\n        private void NumericBox_TextChanged(object sender, TextChangedEventArgs e)\r\n        {\r\n            NumericBox_LostFocus(sender, e);\r\n        }\r\n\r\n        private void NumericBox_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            lastLongValue = LongValue;\r\n        }\r\n\r\n        private void NumericBox_LostFocus(object sender, RoutedEventArgs e)\r\n        {\r\n            if (string.IsNullOrEmpty(Text))\r\n            {\r\n                Text = \"0\";\r\n            }\r\n\r\n            if (!long.TryParse(Text, out var result))\r\n            {\r\n                e.Handled = true;\r\n                LongValue = lastLongValue;\r\n            }\r\n            else\r\n            {\r\n                if (result >= MinLongValue && result <= MaxLongValue)\r\n                {\r\n                    LongValue = result;\r\n                }\r\n                else\r\n                {\r\n                    e.Handled = true;\r\n                    LongValue = lastLongValue;\r\n                }\r\n            }\r\n        }\r\n\r\n        private static object CoerceLongValue(DependencyObject element, object baseValue)\r\n        {\r\n            var box = (LongNumericBox)element;\r\n            var value = (long)baseValue;\r\n            box.Text = value.ToString();\r\n            return value;\r\n        }\r\n\r\n        private static void LongValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n        }\r\n\r\n        private static void MinLongValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n        }\r\n\r\n        private static void MaxLongValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Menus/FilterPresetsMenu.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class FilterPresetsMenu : ContextMenu\r\n    {\r\n        private readonly DesktopAppViewModel mainModel;\r\n\r\n        static FilterPresetsMenu()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(FilterPresetsMenu), new FrameworkPropertyMetadata(typeof(FilterPresetsMenu)));\r\n        }\r\n\r\n        public FilterPresetsMenu() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public FilterPresetsMenu(DesktopAppViewModel model)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (model != null)\r\n            {\r\n                mainModel = model;\r\n                Opened += FilterPresetsMenu_Opened;\r\n            }\r\n\r\n            Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;\r\n            StaysOpen = false;\r\n        }\r\n\r\n        private void FilterPresetsMenu_Opened(object sender, RoutedEventArgs e)\r\n        {\r\n            Items.Clear();\r\n            foreach (var preset in mainModel.SortedFilterPresets)\r\n            {\r\n                var item = new MenuItem\r\n                {\r\n                    Header = preset.Name,\r\n                    Command = mainModel.ApplyFilterPresetCommand,\r\n                    CommandParameter = preset\r\n                };\r\n\r\n                BindingTools.SetBinding(item,\r\n                    MenuItem.IsCheckedProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.ActiveFilterPreset),\r\n                    converter: new ObjectEqualityToBoolConverter(),\r\n                    converterParameter: preset,\r\n                    mode: System.Windows.Data.BindingMode.OneWay);\r\n                Items.Add(item);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Menus/GameGroupMenu.cs",
    "content": "﻿using Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class GameGroupMenu : ContextMenu\r\n    {\r\n        private RelayCommand<object> CollapseCommand { get; }\r\n        private RelayCommand<object> CollapseAllCommand { get; }\r\n        private RelayCommand<object> ExpandCommand { get; }\r\n        private RelayCommand<object> ExpandAllCommand { get; }\r\n\r\n        private readonly PlayniteSettings settings;\r\n        private readonly DesktopAppViewModel mainModel;\r\n\r\n        static GameGroupMenu()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(GameGroupMenu), new FrameworkPropertyMetadata(typeof(GameGroupMenu)));\r\n        }\r\n\r\n        public GameGroupMenu() : this(PlayniteApplication.Current?.AppSettings, DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public GameGroupMenu(PlayniteSettings settings, DesktopAppViewModel mainModel)\r\n        {\r\n            this.settings = settings;\r\n            this.mainModel = mainModel;\r\n            CollapseCommand = new RelayCommand<object>((a) => Collapse());\r\n            CollapseAllCommand = new RelayCommand<object>((a) => CollapseAll());\r\n            ExpandCommand = new RelayCommand<object>((a) => Expand());\r\n            ExpandAllCommand = new RelayCommand<object>((a) => ExpandAll());\r\n            Opened += GameGroupMenu_Opened;\r\n        }\r\n\r\n        private void GameGroupMenu_Opened(object sender, RoutedEventArgs e)\r\n        {\r\n            InitializeItems();\r\n        }\r\n\r\n        public void InitializeItems()\r\n        {\r\n            if (settings == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            Items.Clear();\r\n            if (DataContext is CollectionViewGroup group)\r\n            {\r\n                if (settings.ViewSettings.IsGroupCollapsed(settings.ViewSettings.GroupingOrder, group.Name?.ToString()))\r\n                {\r\n                    Items.Add(new MenuItem\r\n                    {\r\n                        Command = ExpandCommand,\r\n                        Header = ResourceProvider.GetResource(\"LOCExpand\")\r\n                    });\r\n                }\r\n                else\r\n                {\r\n                    Items.Add(new MenuItem\r\n                    {\r\n                        Command = CollapseCommand,\r\n                        Header = ResourceProvider.GetResource(\"LOCCollapse\")\r\n                    });\r\n                }\r\n\r\n                Items.Add(new Separator());\r\n\r\n                Items.Add(new MenuItem\r\n                {\r\n                    Command = CollapseAllCommand,\r\n                    Header = ResourceProvider.GetResource(\"LOCCollapseAll\")\r\n                });\r\n\r\n                Items.Add(new MenuItem\r\n                {\r\n                    Command = ExpandAllCommand,\r\n                    Header = ResourceProvider.GetResource(\"LOCExpandAll\")\r\n                });\r\n            }\r\n        }\r\n\r\n        private void Collapse()\r\n        {\r\n            if (DataContext is CollectionViewGroup group)\r\n            {\r\n                settings.ViewSettings.SetGroupCollapseState(settings.ViewSettings.GroupingOrder, group.Name?.ToString(), true);\r\n            }\r\n        }\r\n\r\n        private void Expand()\r\n        {\r\n            if (DataContext is CollectionViewGroup group)\r\n            {\r\n                settings.ViewSettings.SetGroupCollapseState(settings.ViewSettings.GroupingOrder, group.Name?.ToString(), false);\r\n            }\r\n        }\r\n\r\n        private void CollapseAll()\r\n        {\r\n            if (mainModel?.GamesView != null)\r\n            {\r\n                var groups = mainModel.GamesView.CollectionView.Groups.Select(a => ((CollectionViewGroup)a).Name?.ToString()).ToList();\r\n                settings.ViewSettings.CollapseGroups(settings.ViewSettings.GroupingOrder, groups);\r\n            }\r\n        }\r\n\r\n        private void ExpandAll()\r\n        {\r\n            settings.ViewSettings.ExpandAllGroups(settings.ViewSettings.GroupingOrder);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Menus/GameMenu.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.DesktopApp.Markup;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class GameMenu : ContextMenu\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        public bool ShowStartSection\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(ShowStartSectionProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ShowStartSectionProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ShowStartSectionProperty =\r\n            DependencyProperty.Register(\r\n                nameof(ShowStartSection),\r\n                typeof(bool),\r\n                typeof(GameMenu));\r\n\r\n        private DesktopAppViewModel model;\r\n\r\n        private static object startIcon;\r\n        private static object removeIcon;\r\n        private static object linksIcon;\r\n        private static object favoriteIcon;\r\n        private static object unFavoriteIcon;\r\n        private static object hideIcon;\r\n        private static object unHideIcon;\r\n        private static object browseIcon;\r\n        private static object installSizeIcon;\r\n        private static object shortcutIcon;\r\n        private static object installIcon;\r\n        private static object editIcon;\r\n        private static object manualIcon;\r\n        private static bool iconsLoaded = false;\r\n\r\n        static GameMenu()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(GameMenu), new FrameworkPropertyMetadata(typeof(GameMenu)));\r\n        }\r\n\r\n        public GameMenu() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public GameMenu(DesktopAppViewModel model)\r\n        {\r\n            if (model == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            this.model = model;\r\n            Opened += GameMenu_Opened;\r\n            Closed += GameMenu_Closed;\r\n        }\r\n\r\n        private void GameMenu_Closed(object sender, RoutedEventArgs e)\r\n        {\r\n            Deinitialize();\r\n        }\r\n\r\n        private void GameMenu_Opened(object sender, RoutedEventArgs e)\r\n        {\r\n            InitializeItems();\r\n        }\r\n\r\n        public void Deinitialize()\r\n        {\r\n            Items.Clear();\r\n        }\r\n\r\n        private void InitializeItems(Game game)\r\n        {\r\n            // Play / Install\r\n            if (ShowStartSection)\r\n            {\r\n                bool added = false;\r\n                if (game.IsInstalled)\r\n                {\r\n                    var playItem = new MenuItem()\r\n                    {\r\n                        Header = ResourceProvider.GetString(LOC.PlayGame),\r\n                        Icon = startIcon,\r\n                        FontWeight = FontWeights.Bold,\r\n                        Command = model.StartGameCommand,\r\n                        CommandParameter = game,\r\n                        InputGestureText = model.StartSelectedGameCommand.GestureText\r\n                    };\r\n\r\n                    Items.Add(playItem);\r\n                    added = true;\r\n                }\r\n                else if (!game.IsCustomGame)\r\n                {\r\n                    var installItem = new MenuItem()\r\n                    {\r\n                        Header = ResourceProvider.GetString(LOC.InstallGame),\r\n                        Icon = installIcon,\r\n                        FontWeight = FontWeights.Bold,\r\n                        Command = model.InstallGameCommand,\r\n                        CommandParameter = game\r\n                    };\r\n\r\n                    Items.Add(installItem);\r\n                    added = true;\r\n                }\r\n\r\n                if (added)\r\n                {\r\n                    Items.Add(new Separator());\r\n                }\r\n            }\r\n\r\n            // Custom Actions\r\n            var customAdded = false;\r\n            foreach (var task in game.GameActions?.Where(a => !a.IsPlayAction) ?? Enumerable.Empty<GameAction>())\r\n            {\r\n                var taskItem = new MenuItem { Header = task.Name };\r\n                taskItem.Click += (s, e) => model.GamesEditor.ActivateAction(game, task);\r\n                Items.Add(taskItem);\r\n                customAdded = true;\r\n            }\r\n\r\n            if (customAdded)\r\n            {\r\n                Items.Add(new Separator());\r\n            }\r\n\r\n            // Links\r\n            if (game.Links?.Any() == true)\r\n            {\r\n                var linksItem = new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.LinksLabel),\r\n                    Icon = linksIcon\r\n                };\r\n\r\n                foreach (var link in game.Links)\r\n                {\r\n                    if (link != null)\r\n                    {\r\n                        linksItem.Items.Add(new MenuItem()\r\n                        {\r\n                            Header = link.Name,\r\n                            Command = new RelayCommand<Link>((_) =>\r\n                            {\r\n                                try\r\n                                {\r\n                                    GlobalCommands.NavigateUrl(game.ExpandVariables(link.Url));\r\n                                }\r\n                                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                                {\r\n                                    logger.Error(e, \"Failed to open url.\");\r\n                                }\r\n                            })\r\n                        });\r\n                    }\r\n                }\r\n\r\n                Items.Add(linksItem);\r\n                Items.Add(new Separator());\r\n            }\r\n\r\n            // Open Game Location\r\n            if (game.IsInstalled)\r\n            {\r\n                var locationItem = new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.OpenGameLocation),\r\n                    Icon = browseIcon,\r\n                    Command = model.OpenGameLocationCommand,\r\n                    CommandParameter = game\r\n                };\r\n\r\n                Items.Add(locationItem);\r\n            }\r\n\r\n            // Create Desktop Shortcut\r\n            var shortcutItem = new MenuItem()\r\n            {\r\n                Header = ResourceProvider.GetString(LOC.CreateDesktopShortcut),\r\n                Icon = shortcutIcon,\r\n                Command = model.CreateDesktopShortcutCommand,\r\n                CommandParameter = game\r\n            };\r\n\r\n            Items.Add(shortcutItem);\r\n\r\n            // InstallSize\r\n            if (game.IsInstalled)\r\n            {\r\n                Items.Add(new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.CalculateInstallSize),\r\n                    Icon = installSizeIcon,\r\n                    Command = model.UpdateGameInstallSizeWithDialogCommand,\r\n                    CommandParameter = game\r\n                });\r\n            }\r\n\r\n            // Manual\r\n            if (!game.Manual.IsNullOrEmpty())\r\n            {\r\n                Items.Add(new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.OpenGameManual),\r\n                    Icon = manualIcon,\r\n                    Command = model.OpenManualCommand,\r\n                    CommandParameter = game\r\n                });\r\n            }\r\n\r\n            Items.Add(new Separator());\r\n\r\n            // Toggle Favorites\r\n            var favoriteItem = new MenuItem()\r\n            {\r\n                Header = game.Favorite ? ResourceProvider.GetString(LOC.RemoveFavoriteGame) : ResourceProvider.GetString(LOC.FavoriteGame),\r\n                Icon = game.Favorite ? unFavoriteIcon : favoriteIcon,\r\n                Command = model.ToggleFavoritesCommand,\r\n                CommandParameter = game\r\n            };\r\n\r\n            Items.Add(favoriteItem);\r\n\r\n            // Toggle Hide\r\n            var hideItem = new MenuItem()\r\n            {\r\n                Header = game.Hidden ? ResourceProvider.GetString(LOC.UnHideGame) : ResourceProvider.GetString(LOC.HideGame),\r\n                Icon = game.Hidden ? unHideIcon : hideIcon,\r\n                Command = model.ToggleVisibilityCommand,\r\n                CommandParameter = game\r\n            };\r\n\r\n            Items.Add(hideItem);\r\n\r\n            // Edit\r\n            var editItem = new MenuItem()\r\n            {\r\n                Header = ResourceProvider.GetString(LOC.EditGame),\r\n                Icon = editIcon,\r\n                Command = model.EditGameCommand,\r\n                CommandParameter = game,\r\n                InputGestureText = model.EditSelectedGamesCommand.GestureText\r\n            };\r\n\r\n            Items.Add(editItem);\r\n\r\n            // Set Category\r\n            var categoryItem = new MenuItem()\r\n            {\r\n                Header = ResourceProvider.GetString(LOC.SetGameCategory),\r\n                //Icon = Images.GetEmptyImage(),\r\n                Command = model.AssignGameCategoryCommand,\r\n                CommandParameter = game\r\n            };\r\n\r\n            Items.Add(categoryItem);\r\n\r\n            // Set Completion Status\r\n            Items.Add(LoadCompletionStatusItem(game));\r\n\r\n            // Extensions items\r\n            AddExtensionItems(new List<Game>(1) { game });\r\n            Items.Add(new Separator());\r\n\r\n            // Remove\r\n            var removeItem = new MenuItem()\r\n            {\r\n                Header = ResourceProvider.GetString(LOC.RemoveGame),\r\n                Icon = removeIcon,\r\n                Command = model.RemoveGameCommand,\r\n                CommandParameter = game,\r\n                InputGestureText = model.RemoveGameCommand.GestureText\r\n            };\r\n\r\n            Items.Add(removeItem);\r\n\r\n            // Uninstall\r\n            if (!game.IsCustomGame && game.IsInstalled)\r\n            {\r\n                var uninstallItem = new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.UninstallGame),\r\n                    //Icon = Images.GetEmptyImage(),\r\n                    Command = model.UninstallGameCommand,\r\n                    CommandParameter = game\r\n                };\r\n\r\n                Items.Add(uninstallItem);\r\n            }\r\n        }\r\n\r\n        private void InitializeItems(List<Game> games)\r\n        {\r\n            // Create Desktop Shortcut\r\n            var shortcutItem = new MenuItem()\r\n            {\r\n                Header = ResourceProvider.GetString(LOC.CreateDesktopShortcut),\r\n                Icon = shortcutIcon,\r\n                Command = model.CreateDesktopShortcutsCommand,\r\n                CommandParameter = games\r\n            };\r\n\r\n            Items.Add(shortcutItem);\r\n\r\n            if (!games.All(a => a.Favorite))\r\n            {\r\n                var favoriteItem = new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.FavoriteGame),\r\n                    Icon = favoriteIcon,\r\n                    Command = model.SetAsFavoritesCommand,\r\n                    CommandParameter = games\r\n                };\r\n\r\n                Items.Add(favoriteItem);\r\n            }\r\n\r\n            if (!games.All(a => !a.Favorite))\r\n            {\r\n                var unFavoriteItem = new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.RemoveFavoriteGame),\r\n                    Icon = unFavoriteIcon,\r\n                    Command = model.RemoveAsFavoritesCommand,\r\n                    CommandParameter = games\r\n                };\r\n\r\n                Items.Add(unFavoriteItem);\r\n            }\r\n\r\n            if (!games.All(a => a.Hidden))\r\n            {\r\n                var hideItem = new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.HideGame),\r\n                    Icon = hideIcon,\r\n                    Command = model.SetAsHiddensCommand,\r\n                    CommandParameter = games\r\n                };\r\n\r\n                Items.Add(hideItem);\r\n            }\r\n\r\n            if (!games.All(a => !a.Hidden))\r\n            {\r\n                var unHideItem = new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.UnHideGame),\r\n                    Icon = unHideIcon,\r\n                    Command = model.RemoveAsHiddensCommand,\r\n                    CommandParameter = games\r\n                };\r\n\r\n                Items.Add(unHideItem);\r\n            }\r\n\r\n            // InstallSize\r\n            if (games.Any(x => x.IsInstalled))\r\n            {\r\n                var installSizeItem = new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.InstallSizeMenuLabel),\r\n                    Icon = installSizeIcon\r\n                };\r\n\r\n                installSizeItem.Items.Add(new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.CalculateGamesAllInstallSize),\r\n                    Command = model.UpdateGamesAllInstallSizeWithDialogCommand,\r\n                    CommandParameter = games\r\n                });\r\n\r\n                installSizeItem.Items.Add(new MenuItem()\r\n                {\r\n                    Header = ResourceProvider.GetString(LOC.CalculateGamesMissingInstallSize),\r\n                    Command = model.UpdateGamesMissingInstallSizeWithDialogCommand,\r\n                    CommandParameter = games\r\n                });\r\n\r\n                Items.Add(installSizeItem);\r\n            }\r\n\r\n            // Edit\r\n            var editItem = new MenuItem()\r\n            {\r\n                Header = ResourceProvider.GetString(LOC.EditGame),\r\n                Icon = editIcon,\r\n                Command = model.EditGamesCommand,\r\n                CommandParameter = games,\r\n                InputGestureText = model.EditSelectedGamesCommand.GestureText\r\n            };\r\n\r\n            Items.Add(editItem);\r\n\r\n            // Set Category\r\n            var categoryItem = new MenuItem()\r\n            {\r\n                Header = ResourceProvider.GetString(LOC.SetGameCategory),\r\n                //Icon = Images.GetEmptyImage(),\r\n                Command = model.AssignGamesCategoryCommand,\r\n                CommandParameter = games\r\n            };\r\n\r\n            Items.Add(categoryItem);\r\n\r\n            // Set Completion Status\r\n            Items.Add(LoadCompletionStatusItem(games));\r\n\r\n            // Extensions items\r\n            AddExtensionItems(games);\r\n            Items.Add(new Separator());\r\n\r\n            // Remove\r\n            var removeItem = new MenuItem()\r\n            {\r\n                Header = ResourceProvider.GetString(LOC.RemoveGame),\r\n                Icon = removeIcon,\r\n                Command = model.RemoveGamesCommand,\r\n                CommandParameter = games,\r\n                InputGestureText = model.RemoveSelectedGamesCommand.GestureText\r\n            };\r\n\r\n            Items.Add(removeItem);\r\n        }\r\n\r\n        public void InitializeItems()\r\n        {\r\n            // Have to load icons as late as possible to make sure ovewritten theme resources are loaded.\r\n            if (!iconsLoaded)\r\n            {\r\n                startIcon = MenuHelpers.GetIcon(\"PlayIcon\");\r\n                removeIcon = MenuHelpers.GetIcon(\"RemoveGameIcon\");\r\n                linksIcon = MenuHelpers.GetIcon(\"LinksIcon\");\r\n                favoriteIcon = MenuHelpers.GetIcon(\"AddFavoritesIcon\");\r\n                unFavoriteIcon = MenuHelpers.GetIcon(\"RemoveFavoritesIcon\");\r\n                hideIcon = MenuHelpers.GetIcon(\"HideIcon\");\r\n                unHideIcon = MenuHelpers.GetIcon(\"UnHideIcon\");\r\n                browseIcon = MenuHelpers.GetIcon(\"OpenFolderIcon\");\r\n                installSizeIcon = MenuHelpers.GetIcon(\"InstallSizeIcon\");\r\n                shortcutIcon = MenuHelpers.GetIcon(\"DesktopShortcutIcon\");\r\n                installIcon = MenuHelpers.GetIcon(\"InstallIcon\");\r\n                editIcon = MenuHelpers.GetIcon(\"EditGameIcon\");\r\n                manualIcon = MenuHelpers.GetIcon(\"ManualIcon\");\r\n                iconsLoaded = true;\r\n            }\r\n\r\n            Items.Clear();\r\n\r\n            Game game = null;\r\n            List<Game> games = null;\r\n\r\n            if (DataContext is GamesCollectionViewEntry entry)\r\n            {\r\n                game = entry.Game;\r\n            }\r\n            else if (DataContext is IEnumerable<GamesCollectionViewEntry> entries)\r\n            {\r\n                if (entries.Count() > 0)\r\n                {\r\n                    game = (entries.First() as GamesCollectionViewEntry).Game;\r\n                }\r\n\r\n                if (entries.Count() == 1)\r\n                {\r\n                    games = null;\r\n                }\r\n                else\r\n                {\r\n                    games = entries.Select(a => (a as GamesCollectionViewEntry).Game).ToList();\r\n                }\r\n            }\r\n            else if (DataContext is IList<object> entries2)\r\n            {\r\n                if (entries2.Count() > 0)\r\n                {\r\n                    game = (entries2.First() as GamesCollectionViewEntry).Game;\r\n                }\r\n\r\n                if (entries2.Count() == 1)\r\n                {\r\n                    games = null;\r\n                }\r\n                else\r\n                {\r\n                    games = entries2.Select(a => (a as GamesCollectionViewEntry).Game).ToList();\r\n                }\r\n            }\r\n\r\n            if (games?.Count == 0 && game == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (games != null)\r\n            {\r\n                InitializeItems(games);\r\n            }\r\n            else if (game != null)\r\n            {\r\n                InitializeItems(game);\r\n            }\r\n        }\r\n\r\n        private MenuItem LoadCompletionStatusItem(List<Game> games)\r\n        {\r\n            var completionItem = new MenuItem()\r\n            {\r\n                Header = ResourceProvider.GetString(LOC.SetCompletionStatus)\r\n            };\r\n\r\n            foreach (var status in model.Database.CompletionStatuses.OrderBy(a => a.Name))\r\n            {\r\n                completionItem.Items.Add(new MenuItem\r\n                {\r\n                    Header = status.Name,\r\n                    Command = model.SetGamesCompletionStatusCommand,\r\n                    CommandParameter = new Tuple<IEnumerable<Game>, CompletionStatus>(games, status)\r\n                });\r\n            }\r\n\r\n            return completionItem;\r\n        }\r\n\r\n        private MenuItem LoadCompletionStatusItem(Game game)\r\n        {\r\n            var completionItem = new MenuItem()\r\n            {\r\n                Header = ResourceProvider.GetString(LOC.SetCompletionStatus)\r\n            };\r\n\r\n            foreach (var status in model.Database.CompletionStatuses.OrderBy(a => a.Name))\r\n            {\r\n                completionItem.Items.Add(new MenuItem\r\n                {\r\n                    Header = status.Name,\r\n                    Command = model.SetGameCompletionStatusCommand,\r\n                    CommandParameter = new Tuple<Game, CompletionStatus>(game, status),\r\n                    IsChecked = game.CompletionStatusId == status.Id\r\n                });\r\n            }\r\n\r\n            return completionItem;\r\n        }\r\n\r\n        private void AddExtensionItems(List<Game> games)\r\n        {\r\n            var args = new GetGameMenuItemsArgs();\r\n            var toAdd = new List<GameMenuItem>();\r\n            args.Games = games;\r\n\r\n            foreach (var plugin in model.Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    var items = plugin.Plugin.GetGameMenuItems(args);\r\n                    if (items.HasItems())\r\n                    {\r\n                        toAdd.AddRange(items);\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get menu items from plugin {plugin.Description.Name}\");\r\n                }\r\n            }\r\n\r\n            foreach (var script in model.Extensions.Scripts)\r\n            {\r\n                if (script.SupportedMenus.Contains(Scripting.SupportedMenuMethods.GameMenu))\r\n                {\r\n                    try\r\n                    {\r\n                        var items = script.GetGameMenuItems(args);\r\n                        if (items.HasItems())\r\n                        {\r\n                            foreach (var item in items)\r\n                            {\r\n                                var newItem = GameMenuItem.FromScriptGameMenuItem(item);\r\n                                newItem.Action = (a) =>\r\n                                {\r\n                                    script.InvokeFunction(item.FunctionName, new List<object>\r\n                                    {\r\n                                        new ScriptGameMenuItemActionArgs\r\n                                        {\r\n                                            Games = a.Games,\r\n                                            SourceItem = item\r\n                                        }\r\n                                    });\r\n                                };\r\n\r\n                                toAdd.Add(newItem);\r\n                            }\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to get menu items from script {script.Name}\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (toAdd.Count > 0)\r\n            {\r\n                Items.Add(new Separator());\r\n                var menuItems = new Dictionary<string, MenuItem>();\r\n                foreach (var item in toAdd)\r\n                {\r\n                    object newItem = null;\r\n                    if (item.Description == \"-\")\r\n                    {\r\n                        newItem = new Separator();\r\n                    }\r\n                    else\r\n                    {\r\n                        newItem = new MenuItem()\r\n                        {\r\n                            Header = item.Description,\r\n                            Icon = MenuHelpers.GetIcon(item.Icon)\r\n                        };\r\n\r\n                        if (item.Action != null)\r\n                        {\r\n                            ((MenuItem)newItem).Click += (_, __) =>\r\n                            {\r\n                                try\r\n                                {\r\n                                    item.Action(new GameMenuItemActionArgs\r\n                                    {\r\n                                        Games = args.Games,\r\n                                        SourceItem = item\r\n                                    });\r\n                                }\r\n                                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                                {\r\n                                    logger.Error(e, \"Game menu extension action failed.\");\r\n                                    Dialogs.ShowErrorMessage(\r\n                                        ResourceProvider.GetString(LOC.MenuActionExecError) +\r\n                                        Environment.NewLine + Environment.NewLine +\r\n                                        e.Message, \"\");\r\n                                }\r\n                            };\r\n                        }\r\n                    }\r\n\r\n                    if (item.MenuSection.IsNullOrEmpty())\r\n                    {\r\n                        Items.Add(newItem);\r\n                    }\r\n                    else\r\n                    {\r\n                        var parent = MenuHelpers.GenerateMenuParents(menuItems, item.MenuSection, Items);\r\n                        parent?.Items.Add(newItem);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Menus/GroupSettingsMenu.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.Extensions.Markup;\r\nusing Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class GroupSettingsMenu : ContextMenu\r\n    {\r\n        private readonly PlayniteSettings settings;\r\n\r\n        static GroupSettingsMenu()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(GroupSettingsMenu), new FrameworkPropertyMetadata(typeof(GroupSettingsMenu)));\r\n        }\r\n\r\n        public GroupSettingsMenu() : this(PlayniteApplication.Current?.AppSettings)\r\n        {\r\n        }\r\n\r\n        public GroupSettingsMenu(PlayniteSettings settings)\r\n        {\r\n            this.settings = settings;\r\n            InitializeItems();\r\n            Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;\r\n            StaysOpen = false;\r\n        }\r\n\r\n        public void InitializeItems()\r\n        {\r\n            if (settings == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            ViewSettingsMenu.GenerateGroupMenu(Items, settings);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Menus/MainMenu.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.Extensions.Markup;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Drawing.Imaging;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class MainMenu : ContextMenu\r\n    {\r\n        private readonly DesktopAppViewModel mainModel;\r\n        private MenuItem extensionsItem;\r\n        private MenuItem toolsItem;\r\n        private MenuItem viewItem;\r\n        private MenuItem emulationUpdateItem;\r\n        private Separator extensionsEndItem;\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        static MainMenu()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(MainMenu), new FrameworkPropertyMetadata(typeof(MainMenu)));\r\n        }\r\n\r\n        public MainMenu() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public MainMenu(DesktopAppViewModel model)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (model != null)\r\n            {\r\n                mainModel = model;\r\n                InitializeItems();\r\n                Opened += MainMenu_Opened;\r\n            }\r\n\r\n            Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;\r\n            StaysOpen = false;\r\n        }\r\n\r\n        public static MenuItem AddMenuChild(\r\n            ItemCollection parent,\r\n            string locString,\r\n            RelayCommandBase command,\r\n            object commandParameter = null,\r\n            string icon = null)\r\n        {\r\n            var item = new MenuItem\r\n            {\r\n                Command = command,\r\n                CommandParameter = commandParameter,\r\n                InputGestureText = command?.GestureText\r\n            };\r\n\r\n            if (locString?.StartsWith(\"LOC\", StringComparison.Ordinal) == true)\r\n            {\r\n                item.SetResourceReference(MenuItem.HeaderProperty, locString);\r\n            }\r\n            else\r\n            {\r\n                item.Header = locString;\r\n            }\r\n\r\n            var iconObj = MenuHelpers.GetIcon(icon);\r\n            if (iconObj != null)\r\n            {\r\n                item.Icon = iconObj;\r\n            }\r\n\r\n            parent.Add(item);\r\n            return item;\r\n        }\r\n\r\n        public void InitializeItems()\r\n        {\r\n            // Add Game\r\n            var addGameItem = AddMenuChild(Items, \"LOCMenuAddGame\", null, null, \"AddGameIcon\");\r\n            AddMenuChild(addGameItem.Items, \"LOCMenuAddGameManual\", mainModel.AddCustomGameCommand);\r\n            AddMenuChild(addGameItem.Items, \"LOCMenuAddGameInstalled\", mainModel.AddInstalledGamesCommand);\r\n            AddMenuChild(addGameItem.Items, \"LOCMenuAddGameEmulated\", mainModel.AddEmulatedGamesCommand);\r\n            if (Computer.WindowsVersion == WindowsVersion.Win10 || Computer.WindowsVersion == WindowsVersion.Win11)\r\n            {\r\n                AddMenuChild(addGameItem.Items, \"LOCMenuAddWindowsStore\", mainModel.AddWindowsStoreGamesCommand);\r\n            }\r\n\r\n            Items.Add(new Separator());\r\n\r\n            // Library\r\n            var libraryItem = AddMenuChild(Items, \"LOCLibrary\", null);\r\n            AddMenuChild(libraryItem.Items, \"LOCMenuConfigureIntegrations\", mainModel.OpenLibraryIntegrationsConfigCommand);\r\n            AddMenuChild(libraryItem.Items, \"LOCMenuLibraryManagerTitle\", mainModel.OpenDbFieldsManagerCommand);\r\n            AddMenuChild(libraryItem.Items, \"LOCMenuConfigureEmulatorsMenuTitle\", mainModel.OpenEmulatorsCommand);\r\n            AddMenuChild(libraryItem.Items, \"LOCMenuDownloadMetadata\", mainModel.DownloadMetadataCommand);\r\n            AddMenuChild(libraryItem.Items, \"LOCMenuSoftwareTools\", mainModel.OpenSoftwareToolsCommand);\r\n            libraryItem.Items.Add(new Separator());\r\n            AddMenuChild(libraryItem.Items, \"LOCMenuBackupData\", mainModel.BackupDataCommand, null, \"BackupIcon\");\r\n            AddMenuChild(libraryItem.Items, \"LOCMenuRestoreBackup\", mainModel.RestoreDataBackupCommand, null, \"RestoreBackupIcon\");\r\n\r\n            // Update Library\r\n            var updateItem = AddMenuChild(Items, \"LOCMenuReloadLibrary\", null, null, \"UpdateDbIcon\");\r\n            AddMenuChild(updateItem.Items, \"LOCUpdateAll\", mainModel.UpdateGamesCommand);\r\n            emulationUpdateItem = AddMenuChild(updateItem.Items, \"LOCMenuUpdateEmulatedDirs\", null);\r\n            updateItem.Items.Add(new Separator());\r\n            foreach (var plugin in mainModel.Extensions.LibraryPlugins.OrderBy(a => a.Name))\r\n            {\r\n                AddMenuChild(updateItem.Items, plugin.Name, mainModel.UpdateLibraryCommand, plugin, plugin.LibraryIcon);\r\n            }\r\n\r\n            // Random game select\r\n            AddMenuChild(Items, \"LOCMenuSelectRandomGame\", mainModel.SelectRandomGameCommand, null, \"DiceIcon\");\r\n\r\n            // Addons\r\n            AddMenuChild(Items, \"LOCMenuAddons\", mainModel.OpenAddonsCommand, null, \"AddonsIcon\");\r\n\r\n            // Settings\r\n            AddMenuChild(Items, \"LOCMenuPlayniteSettingsTitle\", mainModel.OpenSettingsCommand, null, \"SettingsIcon\");\r\n\r\n            // View\r\n            viewItem = AddMenuChild(Items, LOC.MenuView, null, null, null);\r\n            var sideBarItem = AddMenuChild(viewItem.Items, LOC.Sidebar, null, null, null);\r\n            var sideBarEnableItem = AddMenuChild(sideBarItem.Items, LOC.EnabledTitle, null);\r\n            sideBarEnableItem.IsCheckable = true;\r\n            BindingOperations.SetBinding(sideBarEnableItem, MenuItem.IsCheckedProperty,\r\n                new Binding\r\n                {\r\n                    Source = mainModel.AppSettings,\r\n                    Path = new PropertyPath(nameof(PlayniteSettings.ShowSidebar))\r\n                });\r\n\r\n            sideBarItem.Items.Add(new Separator());\r\n            MenuHelpers.PopulateEnumOptions<Dock>(sideBarItem.Items, nameof(PlayniteSettings.SidebarPosition), mainModel.AppSettings);\r\n            viewItem.Items.Add(new Separator());\r\n\r\n            Items.Add(new Separator());\r\n\r\n            // Open Client\r\n            var openClientItem = AddMenuChild(Items, \"LOCMenuClients\", null);\r\n            foreach (var tool in mainModel.ThirdPartyTools)\r\n            {\r\n                var item = new MenuItem\r\n                {\r\n                    Header = tool.Name,\r\n                    Command = mainModel.ThirdPartyToolOpenCommand,\r\n                    CommandParameter = tool,\r\n                    Icon = tool.Icon\r\n                };\r\n\r\n                openClientItem.Items.Add(item);\r\n            }\r\n\r\n            // Tools\r\n            toolsItem = AddMenuChild(Items, \"LOCMenuTools\", null);\r\n\r\n            // Extensions\r\n            extensionsItem = AddMenuChild(Items, \"LOCExtensions\", null);\r\n\r\n            // FullScreen\r\n            extensionsEndItem = new Separator();\r\n            Items.Add(extensionsEndItem);\r\n            AddMenuChild(Items, \"LOCMenuOpenFullscreen\", mainModel.OpenFullScreenCommand, null, \"FullscreenModeIcon\");\r\n            Items.Add(new Separator());\r\n\r\n            // Links\r\n            var linksItem = AddMenuChild(Items, \"LOCMenuLinksTitle\", null);\r\n            AddMenuChild(linksItem.Items, \"Discord\", GlobalCommands.NavigateUrlCommand, UrlConstants.Discord, \"Images/discord.png\");\r\n            AddMenuChild(linksItem.Items, \"Reddit\", GlobalCommands.NavigateUrlCommand, UrlConstants.Reddit, \"Images/reddit.png\");\r\n\r\n            // Help\r\n            var helpItem = AddMenuChild(Items, \"LOCMenuHelpTitle\", null);\r\n            AddMenuChild(helpItem.Items, \"LOCUserManual\", GlobalCommands.NavigateUrlCommand, UrlConstants.SdkDocs);\r\n            AddMenuChild(helpItem.Items, \"LOCMenuIssues\", mainModel.ReportIssueCommand);\r\n            AddMenuChild(helpItem.Items, \"LOCSDKDocumentation\", GlobalCommands.NavigateUrlCommand, UrlConstants.SdkDocs);\r\n            helpItem.Items.Add(new Separator());\r\n            AddMenuChild(helpItem.Items, \"LOCCrashRestartPlaynite\", mainModel.RestartApp);\r\n            AddMenuChild(helpItem.Items, \"LOCCrashRestartSafe\", mainModel.RestartInSafeMode);\r\n\r\n            // About\r\n            AddMenuChild(Items, \"LOCMenuAbout\", mainModel.OpenAboutCommand, null, \"AboutPlayniteIcon\");\r\n            AddMenuChild(Items, \"LOCCheckForUpdates\", mainModel.CheckForUpdateCommand);\r\n            Items.Add(new Separator());\r\n\r\n            // Patreon\r\n            AddMenuChild(Items, \"LOCMenuPatreonSupport\", GlobalCommands.NavigateUrlCommand, UrlConstants.Patreon, \"Images/patreon.png\");\r\n            AddMenuChild(Items, \"LOCMenuKofiSupport\", GlobalCommands.NavigateUrlCommand, UrlConstants.Kofi, \"Images/kofi.png\");\r\n            Items.Add(new Separator());\r\n\r\n            // Exit\r\n            AddMenuChild(Items, \"LOCExitAppLabel\", mainModel.ShutdownCommand, null, \"ExitIcon\");\r\n        }\r\n\r\n        private void MainMenu_Opened(object sender, RoutedEventArgs e)\r\n        {\r\n            ClearExtensionItems();\r\n            AddExtensionItems();\r\n            AddToolsItems();\r\n            AddSidebarViewItems();\r\n            AddEmulationUpdateItems();\r\n        }\r\n\r\n        private void AddEmulationUpdateItems()\r\n        {\r\n            emulationUpdateItem.Items.Clear();\r\n            AddMenuChild(emulationUpdateItem.Items, \"LOCUpdateAll\", mainModel.UpdateEmulationDirsCommand);\r\n            emulationUpdateItem.Items.Add(new Separator());\r\n            foreach (var config in mainModel.Database.GameScanners.OrderBy(a => a.Name))\r\n            {\r\n                var item = new MenuItem\r\n                {\r\n                    Header = config.Name,\r\n                    Command = mainModel.UpdateEmulationDirCommand,\r\n                    CommandParameter = config\r\n                };\r\n\r\n                emulationUpdateItem.Items.Add(item);\r\n            }\r\n        }\r\n\r\n        private void AddSidebarViewItems()\r\n        {\r\n            while (viewItem.Items.Count > 2)\r\n            {\r\n                viewItem.Items.RemoveAt(2);\r\n            }\r\n\r\n            foreach (var sideItem in mainModel.SidebarItems.Where(a => a.SideItem.Type == SiderbarItemType.View))\r\n            {\r\n                AddMenuChild(viewItem.Items, sideItem.SideItem.Title, mainModel.SelectSidebarViewCommand, sideItem);\r\n            }\r\n        }\r\n\r\n        private void AddToolsItems()\r\n        {\r\n            toolsItem.Items.Clear();\r\n            if (mainModel.Database.SoftwareApps.HasItems())\r\n            {\r\n                foreach (var tool in mainModel.Database.SoftwareApps.OrderBy(a => a.Name))\r\n                {\r\n                    string icon = null;\r\n                    if (!tool.Icon.IsNullOrEmpty())\r\n                    {\r\n                        icon = mainModel.Database.GetFullFilePath(tool.Icon);\r\n                    }\r\n\r\n                    AddMenuChild(\r\n                        toolsItem.Items,\r\n                        tool.Name,\r\n                        mainModel.StartSoftwareToolCommand,\r\n                        tool,\r\n                        icon);\r\n                }\r\n\r\n                toolsItem.Visibility = Visibility.Visible;\r\n            }\r\n            else\r\n            {\r\n                toolsItem.Visibility = Visibility.Collapsed;\r\n            }\r\n        }\r\n\r\n        private void ClearExtensionItems()\r\n        {\r\n            if (extensionsEndItem == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var startIndex = Items.IndexOf(extensionsItem);\r\n            var endIndex = Items.IndexOf(extensionsEndItem);\r\n            if (endIndex > startIndex + 1)\r\n            {\r\n                for (int i = 0; i < endIndex - startIndex - 1; i++)\r\n                {\r\n                    Items.RemoveAt(startIndex + 1);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void AddExtensionItems()\r\n        {\r\n            extensionsItem.Items.Clear();\r\n            AddMenuChild(extensionsItem.Items, LOC.ReloadScripts, mainModel.ReloadScriptsCommand);\r\n            AddMenuChild(extensionsItem.Items, LOC.StartInteractivePowerShell, mainModel.StartInteractivePowerShellCommand);\r\n            extensionsItem.Items.Add(new Separator());\r\n            var args = new GetMainMenuItemsArgs();\r\n            var toAdd = new List<MainMenuItem>();\r\n\r\n            foreach (var plugin in mainModel.Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    var items = plugin.Plugin.GetMainMenuItems(args);\r\n                    if (items.HasItems())\r\n                    {\r\n                        toAdd.AddRange(items);\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get menu items from plugin {plugin.Description.Name}\");\r\n                }\r\n            }\r\n\r\n            foreach (var script in mainModel.Extensions.Scripts)\r\n            {\r\n                if (script.SupportedMenus.Contains(Scripting.SupportedMenuMethods.MainMenu))\r\n                {\r\n                    try\r\n                    {\r\n                        var items = script.GetMainMenuItems(args);\r\n                        if (items.HasItems())\r\n                        {\r\n                            foreach (var item in items)\r\n                            {\r\n                                var newItem = MainMenuItem.FromScriptMainMenuItem(item);\r\n                                newItem.Action = (a) =>\r\n                                {\r\n                                    script.InvokeFunction(item.FunctionName, new List<object>\r\n                                    {\r\n                                        new ScriptMainMenuItemActionArgs()\r\n                                    });\r\n                                };\r\n\r\n                                toAdd.Add(newItem);\r\n                            }\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to get menu items from script {script.Name}\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (toAdd.Count > 0)\r\n            {\r\n                var menuItems = new Dictionary<string, MenuItem>();\r\n                var menuExtensionItems = new Dictionary<string, MenuItem>();\r\n                foreach (var item in toAdd)\r\n                {\r\n                    object newItem = null;\r\n                    if (item.Description == \"-\")\r\n                    {\r\n                        newItem = new Separator();\r\n                    }\r\n                    else\r\n                    {\r\n                        newItem = new MenuItem()\r\n                        {\r\n                            Header = item.Description,\r\n                            Icon = MenuHelpers.GetIcon(item.Icon)\r\n                        };\r\n\r\n                        if (item.Action != null)\r\n                        {\r\n                            ((MenuItem)newItem).Click += (_, __) =>\r\n                            {\r\n                                try\r\n                                {\r\n                                    item.Action(new MainMenuItemActionArgs());\r\n                                }\r\n                                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                                {\r\n                                    logger.Error(e, \"Main menu extension action failed.\");\r\n                                    Dialogs.ShowErrorMessage(\r\n                                        ResourceProvider.GetString(\"LOCMenuActionExecError\") +\r\n                                        Environment.NewLine + Environment.NewLine +\r\n                                        e.Message, \"\");\r\n                                }\r\n                            };\r\n                        }\r\n                    }\r\n\r\n                    var startIndex = Items.IndexOf(extensionsItem) + 1;\r\n                    if (item.MenuSection.IsNullOrEmpty())\r\n                    {\r\n                        Items.Insert(startIndex, newItem);\r\n                    }\r\n                    else\r\n                    {\r\n                        if (item.MenuSection == \"@\")\r\n                        {\r\n                            extensionsItem.Items.Add(newItem);\r\n                        }\r\n                        else if (item.MenuSection.StartsWith(\"@\"))\r\n                        {\r\n                            var parent = MenuHelpers.GenerateMenuParents(menuExtensionItems, item.MenuSection.Substring(1), extensionsItem.Items);\r\n                            parent?.Items.Add(newItem);\r\n                        }\r\n                        else\r\n                        {\r\n                            var parent = MenuHelpers.GenerateMenuParents(menuItems, item.MenuSection, Items, startIndex);\r\n                            parent?.Items.Add(newItem);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Menus/SortSettingsMenu.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.Extensions.Markup;\r\nusing Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class SortSettingsMenu : ContextMenu\r\n    {\r\n        private readonly PlayniteSettings settings;\r\n\r\n        static SortSettingsMenu()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(SortSettingsMenu), new FrameworkPropertyMetadata(typeof(SortSettingsMenu)));\r\n        }\r\n\r\n        public SortSettingsMenu() : this(PlayniteApplication.Current?.AppSettings)\r\n        {\r\n        }\r\n\r\n        public SortSettingsMenu(PlayniteSettings settings)\r\n        {\r\n            this.settings = settings;\r\n            InitializeItems();\r\n            Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;\r\n            StaysOpen = false;\r\n        }\r\n\r\n        public void InitializeItems()\r\n        {\r\n            if (settings == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            ViewSettingsMenu.GenerateSortMenu(Items, settings);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Menus/TrayContextMenu.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.DesktopApp.Markup;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class TrayContextMenu : ContextMenu\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private DesktopAppViewModel mainModel;\r\n\r\n        static TrayContextMenu()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(TrayContextMenu), new FrameworkPropertyMetadata(typeof(TrayContextMenu)));\r\n        }\r\n\r\n        public TrayContextMenu()\r\n        {\r\n        }\r\n\r\n        public TrayContextMenu(DesktopAppViewModel model)\r\n        {\r\n            mainModel = model;\r\n            Opened += TrayContextMenu_Opened;\r\n        }\r\n\r\n        private void TrayContextMenu_Opened(object sender, RoutedEventArgs e)\r\n        {\r\n            InitializeItems();\r\n        }\r\n\r\n        private MenuItem AddMenuChild(\r\n            ItemCollection parent,\r\n            string locString,\r\n            RelayCommandBase command,\r\n            object commandParameter = null,\r\n            object icon = null)\r\n        {\r\n            var item = new MenuItem\r\n            {\r\n                Command = command,\r\n                CommandParameter = commandParameter\r\n            };\r\n\r\n            if (locString.IsNullOrEmpty())\r\n            {\r\n                item.Header = \"<NO_STRING>\";\r\n            }\r\n            else if (locString.StartsWith(\"LOC\", StringComparison.Ordinal))\r\n            {\r\n                item.SetResourceReference(MenuItem.HeaderProperty, locString);\r\n            }\r\n            else\r\n            {\r\n                item.Header = locString;\r\n            }\r\n\r\n            if (icon != null)\r\n            {\r\n                item.Icon = icon;\r\n            }\r\n\r\n            parent.Add(item);\r\n            return item;\r\n        }\r\n\r\n        private void InitializeItems()\r\n        {\r\n            Items.Clear();\r\n\r\n            foreach (var game in mainModel.GamesEditor.QuickLaunchItems)\r\n            {\r\n                AddMenuChild(Items, game.Name, mainModel.StartGameFromTrayCommand, game, GetGameIcon(game));\r\n            }\r\n\r\n            var favoriteGames = mainModel.GamesEditor.FavoriteQuickLaunchItems;\r\n            if (favoriteGames.HasItems())\r\n            {\r\n                Items.Add(new Separator());\r\n                var favoritesItem = AddMenuChild(Items, \"LOCQuickFilterFavorites\", null);\r\n                foreach (var game in favoriteGames)\r\n                {\r\n                    AddMenuChild(favoritesItem.Items, game.Name, mainModel.StartGameFromTrayCommand, game, GetGameIcon(game));\r\n                }\r\n            }\r\n\r\n            Items.Add(new Separator());\r\n            AddMenuChild(Items, \"LOCOpenPlaynite\", mainModel.ShowWindowCommand);\r\n            AddMenuChild(Items, \"LOCMenuOpenFullscreen\", mainModel.OpenFullScreenCommand);\r\n\r\n            var openClientItem = AddMenuChild(Items, \"LOCMenuClients\", null);\r\n            foreach (var tool in mainModel.ThirdPartyTools)\r\n            {\r\n                openClientItem.Items.Add(new MenuItem\r\n                {\r\n                    Header = tool.Name,\r\n                    Command = mainModel.ThirdPartyToolOpenCommand,\r\n                    CommandParameter = tool,\r\n                    Icon = tool.Icon\r\n                });\r\n            }\r\n\r\n            if (mainModel.Database.SoftwareApps.HasItems())\r\n            {\r\n                var toolsItem = AddMenuChild(Items, \"LOCMenuTools\", null);\r\n                foreach (var tool in mainModel.Database.SoftwareApps.OrderBy(a => a.Name))\r\n                {\r\n                    object icon = null;\r\n                    if (!tool.Icon.IsNullOrEmpty())\r\n                    {\r\n                        var path = mainModel.Database.GetFullFilePath(tool.Icon);\r\n                        if (File.Exists(path))\r\n                        {\r\n                            icon = Images.GetImageFromFile(path);\r\n                        }\r\n                    }\r\n\r\n                    AddMenuChild(toolsItem.Items, tool.Name, mainModel.StartSoftwareToolCommand, tool, icon);\r\n                }\r\n            }\r\n\r\n            Items.Add(new Separator());\r\n            AddMenuChild(Items, \"LOCExitAppLabel\", mainModel.ShutdownCommand);\r\n        }\r\n\r\n        private object GetGameIcon(Game game)\r\n        {\r\n            object icon = null;\r\n            if (!game.Icon.IsNullOrEmpty())\r\n            {\r\n                var path = mainModel.Database.GetFullFilePath(game.Icon);\r\n                if (File.Exists(path))\r\n                {\r\n                    icon = Images.GetImageFromFile(path);\r\n                }\r\n            }\r\n\r\n            if (icon == null)\r\n            {\r\n                var resourceIcon = ResourceProvider.GetResource(\"DefaultGameIcon\") as BitmapImage;\r\n                var image = new Image() { Source = resourceIcon };\r\n                RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.HighQuality);\r\n                icon = image;\r\n            }\r\n\r\n            return icon;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Menus/ViewSelectionMenu.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.Extensions.Markup;\r\nusing Playnite.SDK;\r\nusing Playnite.Settings;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class ViewSelectionMenu : ContextMenu\r\n    {\r\n        private readonly PlayniteSettings settings;\r\n\r\n        static ViewSelectionMenu()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ViewSelectionMenu), new FrameworkPropertyMetadata(typeof(ViewSelectionMenu)));\r\n        }\r\n\r\n        public ViewSelectionMenu() : this(PlayniteApplication.Current?.AppSettings)\r\n        {\r\n        }\r\n\r\n        public ViewSelectionMenu(PlayniteSettings settings)\r\n        {\r\n            this.settings = settings;\r\n            InitializeItems();\r\n            Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;\r\n            StaysOpen = false;\r\n        }\r\n\r\n        public void InitializeItems()\r\n        {\r\n            if (settings == null)\r\n            {\r\n                return;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Menus/ViewSettingsMenu.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.Extensions.Markup;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Settings;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class ViewSettingsMenu : ContextMenu\r\n    {\r\n        private readonly PlayniteSettings settings;\r\n\r\n        static ViewSettingsMenu()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ViewSettingsMenu), new FrameworkPropertyMetadata(typeof(ViewSettingsMenu)));\r\n        }\r\n\r\n        public ViewSettingsMenu() : this(PlayniteApplication.Current?.AppSettings)\r\n        {\r\n        }\r\n\r\n        public ViewSettingsMenu(PlayniteSettings settings)\r\n        {\r\n            this.settings = settings;\r\n            InitializeItems();\r\n            Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;\r\n            StaysOpen = false;\r\n        }\r\n\r\n        public static void GenerateSortMenu(ItemCollection itemsRoot, PlayniteSettings settings)\r\n        {\r\n            MenuHelpers.PopulateEnumOptions<SortOrderDirection>(itemsRoot, nameof(settings.ViewSettings.SortingOrderDirection), settings.ViewSettings);\r\n            itemsRoot.Add(new Separator());\r\n            MenuHelpers.PopulateEnumOptions<SortOrder>(itemsRoot, nameof(settings.ViewSettings.SortingOrder), settings.ViewSettings, true);\r\n        }\r\n\r\n        public static void GenerateGroupMenu(ItemCollection itemsRoot, PlayniteSettings settings)\r\n        {\r\n            var dontGroupItem = MainMenu.AddMenuChild(itemsRoot, GroupableField.None.GetDescription(), null);\r\n            dontGroupItem.IsCheckable = true;\r\n            MenuHelpers.SetEnumBinding(dontGroupItem, nameof(settings.ViewSettings.GroupingOrder), settings.ViewSettings, GroupableField.None);\r\n            itemsRoot.Add(new Separator());\r\n            MenuHelpers.PopulateEnumOptions<GroupableField>(itemsRoot, nameof(settings.ViewSettings.GroupingOrder), settings.ViewSettings, true,\r\n                new List<GroupableField> { GroupableField.None });\r\n        }\r\n\r\n        public void InitializeItems()\r\n        {\r\n            if (settings == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            Items.Clear();\r\n\r\n            // Sort By\r\n            var sortItem = new MenuItem\r\n            {\r\n                Header = ResourceProvider.GetString(\"LOCMenuSortByTitle\")\r\n            };\r\n            GenerateSortMenu(sortItem.Items, settings);\r\n\r\n            // Group By\r\n            var groupItem = new MenuItem\r\n            {\r\n                Header = ResourceProvider.GetString(\"LOCMenuGroupByTitle\")\r\n            };\r\n            GenerateGroupMenu(groupItem.Items, settings);\r\n            Items.Add(sortItem);\r\n            Items.Add(groupItem);\r\n            Items.Add(new Separator());\r\n\r\n            // View Type\r\n            MenuHelpers.PopulateEnumOptions<DesktopView>(Items, nameof(settings.ViewSettings.GamesViewType), settings.ViewSettings);\r\n            Items.Add(new Separator());\r\n\r\n            // View\r\n            var filterItem = MainMenu.AddMenuChild(Items, \"LOCMenuViewFilterPanel\", null);\r\n            filterItem.IsCheckable = true;\r\n            BindingOperations.SetBinding(filterItem, MenuItem.IsCheckedProperty,\r\n                new Binding\r\n                {\r\n                    Source = settings,\r\n                    Path = new PropertyPath(nameof(PlayniteSettings.FilterPanelVisible))\r\n                });\r\n\r\n            var explorerItem = MainMenu.AddMenuChild(Items, \"LOCMenuViewExplorerPanel\", null);\r\n            explorerItem.IsCheckable = true;\r\n            BindingOperations.SetBinding(explorerItem, MenuItem.IsCheckedProperty,\r\n                new Binding\r\n                {\r\n                    Source = settings,\r\n                    Path = new PropertyPath(nameof(PlayniteSettings.ExplorerPanelVisible))\r\n                });\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/MetadataDownloadSettings.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.MetadataDownloadSettings\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:pmp=\"clr-namespace:Playnite.Metadata;assembly=Playnite\"\r\n             xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignWidth=\"600\">\r\n\r\n    <DockPanel DataContext=\"{Binding RelativeSource={RelativeSource AncestorType=UserControl}}\">\r\n        <DockPanel.Resources>\r\n            <ControlTemplate TargetType=\"ContentControl\" x:Key=\"SourceSelector\">\r\n                <ToggleButton Name=\"Toggle\" HorizontalContentAlignment=\"Stretch\"\r\n                              Focusable=\"False\" Padding=\"0\"\r\n                              Foreground=\"{DynamicResource TextBrush}\">\r\n                    <ToggleButton.Content>\r\n                        <Grid>\r\n                            <Grid.ColumnDefinitions>\r\n                                <ColumnDefinition Width=\"*\" />\r\n                                <ColumnDefinition Width=\"Auto\"/>\r\n                            </Grid.ColumnDefinitions>\r\n                            <Grid.RowDefinitions>\r\n                                <RowDefinition Height=\"Auto\" />\r\n                            </Grid.RowDefinitions>\r\n                            <TextBlock Text=\"{Binding SelectionText}\" TextTrimming=\"CharacterEllipsis\"\r\n                                       Grid.Column=\"0\" VerticalAlignment=\"Center\" Margin=\"4,0,2,0\"/>\r\n                            <Viewbox Grid.Column=\"1\" Width=\"20\">\r\n                                <TextBlock Text=\"6\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                           VerticalAlignment=\"Center\"/>\r\n                            </Viewbox>\r\n                            <Popup Placement=\"Bottom\" Focusable=\"False\" AllowsTransparency=\"True\" Name=\"Popup\"\r\n                                   IsOpen=\"{Binding IsChecked, ElementName=Toggle, Mode=TwoWay, Delay=100}\" StaysOpen=\"False\"\r\n                                   MaxHeight=\"300\">\r\n                                <Border Background=\"{DynamicResource PopupBackgroundBrush}\"\r\n                                        BorderThickness=\"{DynamicResource PopupBorderThickness}\"\r\n                                        BorderBrush=\"{DynamicResource PopupBorderBrush}\">\r\n                                    <ItemsControl ItemsSource=\"{Binding Sources}\"\r\n                                                  ScrollViewer.CanContentScroll=\"True\"\r\n                                                  KeyboardNavigation.DirectionalNavigation=\"Contained\"\r\n                                                  VirtualizingPanel.IsVirtualizing=\"True\"\r\n                                                  VirtualizingPanel.VirtualizationMode=\"Recycling\">\r\n                                        <ItemsControl.ItemTemplate>\r\n                                            <DataTemplate>\r\n                                                <DockPanel>\r\n                                                    <Button Content=\"6\" FontFamily=\"Marlett\" Margin=\"2,0,2,0\"\r\n                                                            DockPanel.Dock=\"Right\" Padding=\"2\" VerticalAlignment=\"Center\"\r\n                                                            Command=\"{Binding DataContext.MoveSourceDownCommand, RelativeSource={RelativeSource AncestorType=ToggleButton}}\"\r\n                                                            CommandParameter=\"{Binding}\" />\r\n                                                    <Button Content=\"5\" FontFamily=\"Marlett\"\r\n                                                            DockPanel.Dock=\"Right\" Padding=\"2\" VerticalAlignment=\"Center\"\r\n                                                            Command=\"{Binding DataContext.MoveSourceUpCommand, RelativeSource={RelativeSource AncestorType=ToggleButton}}\"\r\n                                                            CommandParameter=\"{Binding}\" />\r\n                                                    <CheckBox IsChecked=\"{Binding Enabled}\" DockPanel.Dock=\"Left\"\r\n                                                              Content=\"{Binding Name}\"\r\n                                                              Margin=\"3,2,3,2\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Stretch\"/>\r\n                                                </DockPanel>\r\n                                            </DataTemplate>\r\n                                        </ItemsControl.ItemTemplate>\r\n                                        <ItemsControl.ItemsPanel>\r\n                                            <ItemsPanelTemplate>\r\n                                                <VirtualizingStackPanel />\r\n                                            </ItemsPanelTemplate>\r\n                                        </ItemsControl.ItemsPanel>\r\n                                        <ItemsControl.Template>\r\n                                            <ControlTemplate>\r\n                                                <ScrollViewer Focusable=\"False\" VerticalScrollBarVisibility=\"Auto\">\r\n                                                    <ItemsPresenter />\r\n                                                </ScrollViewer>\r\n                                            </ControlTemplate>\r\n                                        </ItemsControl.Template>\r\n                                    </ItemsControl>\r\n                                </Border>\r\n                            </Popup>\r\n                        </Grid>\r\n                    </ToggleButton.Content>\r\n                </ToggleButton>\r\n            </ControlTemplate>\r\n        </DockPanel.Resources>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\" Margin=\"0,0,0,10\">\r\n            <ContentControl DataContext=\"{Binding AllSettings}\"\r\n                            VerticalAlignment=\"Center\" Width=\"200\"\r\n                            Template=\"{StaticResource SourceSelector}\"\r\n                            Margin=\"00,0,10,0\" />\r\n            <Button Content=\"{DynamicResource LOCMetadatSetAllFieldsToValue}\"\r\n                    Command=\"{Binding SetAllPropertiesCommmand}\"/>\r\n            <Button Content=\"{DynamicResource LOCSelectAll}\"\r\n                    Command=\"{Binding SelectAllToImportCommand}\" Margin=\"10,0,0,0\"/>\r\n            <Button Content=\"{DynamicResource LOCDeselectAll}\"\r\n                    Command=\"{Binding DeselectAllToImportCommand}\" Margin=\"10,0,0,0\"/>\r\n        </StackPanel>\r\n\r\n        <GridEx AutoLayoutColumns=\"3\" RowCount=\"22\" ColumnCount=\"3\"\r\n                DockPanel.Dock=\"Top\">\r\n            <Grid.Resources>\r\n                <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                    <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                    <Setter Property=\"Margin\" Value=\"0,5,5,5\" />\r\n                </Style>\r\n                <Style x:Key=\"CheckImportStyle\" TargetType=\"CheckBox\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\r\n                    <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                    <Setter Property=\"HorizontalAlignment\" Value=\"Center\" />\r\n                    <Setter Property=\"Margin\" Value=\"5\" />\r\n                </Style>\r\n                <Style TargetType=\"ContentControl\">\r\n                    <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                    <Setter Property=\"HorizontalAlignment\" Value=\"Left\" />\r\n                    <Setter Property=\"Focusable\" Value=\"False\" />\r\n                </Style>\r\n            </Grid.Resources>\r\n\r\n            <!--Name-->\r\n            <TextBlock Text=\"{DynamicResource LOCNameLabel}\"/>\r\n            <CheckBox IsChecked=\"{Binding Settings.Name.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding NameSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n            <!--Genres-->\r\n            <TextBlock Text=\"{DynamicResource LOCGameGenresTitle}\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.Genre.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding GenresSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--Release Date-->\r\n            <TextBlock Text=\"{DynamicResource LOCGameReleaseDateTitle}\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ReleaseDate.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding ReleaseDateSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--Developers-->\r\n            <TextBlock Text=\"{DynamicResource LOCGameDevelopersTitle}\"  />\r\n            <CheckBox IsChecked=\"{Binding Settings.Developer.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding DevelopersSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--Publishers-->\r\n            <TextBlock Text=\"{DynamicResource LOCGamePublishersTitle}\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.Publisher.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding PublishersSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--Features-->\r\n            <TextBlock Text=\"{DynamicResource LOCFeaturesLabel}\"  />\r\n            <CheckBox IsChecked=\"{Binding Settings.Feature.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding FeaturesSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--Tags-->\r\n            <TextBlock Text=\"{DynamicResource LOCTagsLabel}\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.Tag.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding TagsSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--Description-->\r\n            <TextBlock Text=\"{DynamicResource LOCGameDescriptionTitle}\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.Description.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding DescriptionSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--Links-->\r\n            <TextBlock Text=\"{DynamicResource LOCGameLinksTitle}\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.Links.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding LinksSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--CriticScore-->\r\n            <TextBlock Text=\"{DynamicResource LOCCriticScore}\"  />\r\n            <CheckBox IsChecked=\"{Binding Settings.CriticScore.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding CriticScoreSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--CommunityScore-->\r\n            <TextBlock Text=\"{DynamicResource LOCCommunityScore}\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.CommunityScore.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding CommunityScoreSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--Age rating-->\r\n            <TextBlock Text=\"{DynamicResource LOCAgeRatingLabel}\"  />\r\n            <CheckBox IsChecked=\"{Binding Settings.AgeRating.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding AgeRatingSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n            \r\n            <!--Series-->\r\n            <TextBlock Text=\"{DynamicResource LOCSeriesLabel}\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.Series.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding SeriesSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n            <!--Region-->\r\n            <TextBlock Text=\"{DynamicResource LOCRegionLabel}\"  />\r\n            <CheckBox IsChecked=\"{Binding Settings.Region.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding RegionSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--Platform-->\r\n            <TextBlock Text=\"{DynamicResource LOCGamePlatformTitle}\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.Platform.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding PlatformSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--Cover-->\r\n            <TextBlock Text=\"{DynamicResource LOCGameCoverTitle}\"  />\r\n            <CheckBox IsChecked=\"{Binding Settings.CoverImage.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding CoverSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--Icon-->\r\n            <TextBlock Text=\"{DynamicResource LOCGameIconTitle}\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.Icon.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding IconSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--BackgroundImage-->\r\n            <TextBlock Text=\"{DynamicResource LOCGameBackgroundTitle}\"  />\r\n            <CheckBox IsChecked=\"{Binding Settings.BackgroundImage.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding BackgroundImageSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n\r\n            <!--InstallSize-->\r\n            <TextBlock Text=\"{DynamicResource LOCInstallSizeLabel}\"  />\r\n            <CheckBox IsChecked=\"{Binding Settings.InstallSize.Import}\" Style=\"{StaticResource CheckImportStyle}\"/>\r\n            <ContentControl DataContext=\"{Binding InstallSizeSettings}\" IsTabStop=\"False\"\r\n                            Template=\"{StaticResource SourceSelector}\" />\r\n        </GridEx>\r\n    </DockPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/MetadataDownloadSettings.xaml.cs",
    "content": "﻿using Playnite.Metadata;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for MetadataDownloadSettings.xaml\r\n    /// </summary>\r\n    public partial class MetadataDownloadSettings : UserControl, INotifyPropertyChanged\r\n    {\r\n        public class MetadataSource : ObservableObject\r\n        {\r\n            private bool enabled = true;\r\n            public bool Enabled\r\n            {\r\n                get => enabled;\r\n                set\r\n                {\r\n                    enabled = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n\r\n            private Guid id = Guid.Empty;\r\n            public Guid Id\r\n            {\r\n                get => id;\r\n                set\r\n                {\r\n                    id = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n\r\n            private string name;\r\n            public string Name\r\n            {\r\n                get => name;\r\n                set\r\n                {\r\n                    name = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n        }\r\n\r\n        public class FieldsSelectionSettings : ObservableObject\r\n        {\r\n            public RelayCommand<MetadataSource> MoveSourceUpCommand\r\n            {\r\n                get => new RelayCommand<MetadataSource>((a) =>\r\n                {\r\n                    var index = Sources.IndexOf(a);\r\n                    if (Sources.Count > 1 && (index - 1) >= 0)\r\n                    {\r\n                        Sources.Remove(a);\r\n                        Sources.Insert(index - 1, a);\r\n                    }\r\n                });\r\n            }\r\n\r\n            public RelayCommand<MetadataSource> MoveSourceDownCommand\r\n            {\r\n                get => new RelayCommand<MetadataSource>((a) =>\r\n                {\r\n                    var index = Sources.IndexOf(a);\r\n                    if (Sources.Count > 1 && (index + 1) < Sources.Count)\r\n                    {\r\n                        Sources.Remove(a);\r\n                        Sources.Insert(index + 1, a);\r\n                    }\r\n                });\r\n            }\r\n\r\n            public ObservableCollection<MetadataSource> Sources\r\n            {\r\n                get; set;\r\n            }\r\n\r\n            public string SelectionText\r\n            {\r\n                get => string.Join(\", \", Sources.Where(a => a.Enabled).Select(a => a.Name).ToArray());\r\n            }\r\n\r\n            public event EventHandler SettingsChanged;\r\n\r\n            public FieldsSelectionSettings(ObservableCollection<MetadataSource> sources)\r\n            {\r\n                Sources = sources;\r\n                Sources.CollectionChanged += (s, e) =>\r\n                {\r\n                    OnSettingsChanged();\r\n                };\r\n\r\n                foreach (var source in Sources)\r\n                {\r\n                    source.PropertyChanged += (s, e) =>\r\n                    {\r\n                        OnSettingsChanged();\r\n                    };\r\n                }\r\n            }\r\n\r\n            private void OnSettingsChanged()\r\n            {\r\n                OnPropertyChanged(nameof(SelectionText));\r\n                SettingsChanged?.Invoke(this, EventArgs.Empty);\r\n            }\r\n        }\r\n\r\n        #region Setting fields\r\n\r\n        private FieldsSelectionSettings nameSettings;\r\n        public FieldsSelectionSettings NameSettings\r\n        {\r\n            get => nameSettings;\r\n            set\r\n            {\r\n                nameSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings genresSettings;\r\n        public FieldsSelectionSettings GenresSettings\r\n        {\r\n            get => genresSettings;\r\n            set\r\n            {\r\n                genresSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings releaseDateSettings;\r\n        public FieldsSelectionSettings ReleaseDateSettings\r\n        {\r\n            get => releaseDateSettings;\r\n            set\r\n            {\r\n                releaseDateSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings developersSettings;\r\n        public FieldsSelectionSettings DevelopersSettings\r\n        {\r\n            get => developersSettings;\r\n            set\r\n            {\r\n                developersSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings publishersSettings;\r\n        public FieldsSelectionSettings PublishersSettings\r\n        {\r\n            get => publishersSettings;\r\n            set\r\n            {\r\n                publishersSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings tagsSettings;\r\n        public FieldsSelectionSettings TagsSettings\r\n        {\r\n            get => tagsSettings;\r\n            set\r\n            {\r\n                tagsSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings featuresSettings;\r\n        public FieldsSelectionSettings FeaturesSettings\r\n        {\r\n            get => featuresSettings;\r\n            set\r\n            {\r\n                featuresSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings descriptionSettings;\r\n        public FieldsSelectionSettings DescriptionSettings\r\n        {\r\n            get => descriptionSettings;\r\n            set\r\n            {\r\n                descriptionSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings linksSettings;\r\n        public FieldsSelectionSettings LinksSettings\r\n        {\r\n            get => linksSettings;\r\n            set\r\n            {\r\n                linksSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings communityScoreSettings;\r\n        public FieldsSelectionSettings CommunityScoreSettings\r\n        {\r\n            get => communityScoreSettings;\r\n            set\r\n            {\r\n                communityScoreSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings criticScoreSettings;\r\n        public FieldsSelectionSettings CriticScoreSettings\r\n        {\r\n            get => criticScoreSettings;\r\n            set\r\n            {\r\n                criticScoreSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings coverSettings;\r\n        public FieldsSelectionSettings CoverSettings\r\n        {\r\n            get => coverSettings;\r\n            set\r\n            {\r\n                coverSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings iconSettings;\r\n        public FieldsSelectionSettings IconSettings\r\n        {\r\n            get => iconSettings;\r\n            set\r\n            {\r\n                iconSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings backgroundImageSettings;\r\n        public FieldsSelectionSettings BackgroundImageSettings\r\n        {\r\n            get => backgroundImageSettings;\r\n            set\r\n            {\r\n                backgroundImageSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings ageRatingSettings;\r\n        public FieldsSelectionSettings AgeRatingSettings\r\n        {\r\n            get => ageRatingSettings;\r\n            set\r\n            {\r\n                ageRatingSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings seriesSettings;\r\n        public FieldsSelectionSettings SeriesSettings\r\n        {\r\n            get => seriesSettings;\r\n            set\r\n            {\r\n                seriesSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings regionSettings;\r\n        public FieldsSelectionSettings RegionSettings\r\n        {\r\n            get => regionSettings;\r\n            set\r\n            {\r\n                regionSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings platformSettings;\r\n        public FieldsSelectionSettings PlatformSettings\r\n        {\r\n            get => platformSettings;\r\n            set\r\n            {\r\n                platformSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private FieldsSelectionSettings installSizeSettings;\r\n        public FieldsSelectionSettings InstallSizeSettings\r\n        {\r\n            get => installSizeSettings;\r\n            set\r\n            {\r\n                installSizeSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        #endregion Setting fields\r\n\r\n        #region Properties\r\n\r\n        public MetadataDownloaderSettings Settings\r\n        {\r\n            get\r\n            {\r\n                return (MetadataDownloaderSettings)GetValue(SettingsProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(SettingsProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty SettingsProperty = DependencyProperty.Register(\r\n            nameof(Settings),\r\n            typeof(MetadataDownloaderSettings),\r\n            typeof(MetadataDownloadSettings),\r\n            new PropertyMetadata(new MetadataDownloaderSettings(), SettingsPropertyChangedCallback));\r\n\r\n        private static void SettingsPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            if (e.NewValue == null || PlayniteApplication.Current == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var control = (MetadataDownloadSettings)sender;\r\n            var settings = e.NewValue as MetadataDownloaderSettings;\r\n            var plugins = PlayniteApplication.Current.Extensions.MetadataPlugins;\r\n\r\n            control.NameSettings = control.SetupField(settings.Name, MetadataField.Name, plugins);\r\n            control.NameSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Name.Sources = control.NameSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.GenresSettings = control.SetupField(settings.Genre, MetadataField.Genres, plugins);\r\n            control.GenresSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Genre.Sources = control.GenresSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.ReleaseDateSettings = control.SetupField(settings.ReleaseDate, MetadataField.ReleaseDate, plugins);\r\n            control.ReleaseDateSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.ReleaseDate.Sources = control.ReleaseDateSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.DevelopersSettings = control.SetupField(settings.Developer, MetadataField.Developers, plugins);\r\n            control.DevelopersSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Developer.Sources = control.DevelopersSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.PublishersSettings = control.SetupField(settings.Publisher, MetadataField.Publishers, plugins);\r\n            control.PublishersSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Publisher.Sources = control.PublishersSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.TagsSettings = control.SetupField(settings.Tag, MetadataField.Tags, plugins);\r\n            control.TagsSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Tag.Sources = control.TagsSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.FeaturesSettings = control.SetupField(settings.Feature, MetadataField.Features, plugins);\r\n            control.FeaturesSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Feature.Sources = control.FeaturesSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.DescriptionSettings = control.SetupField(settings.Description, MetadataField.Description, plugins);\r\n            control.DescriptionSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Description.Sources = control.DescriptionSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.LinksSettings = control.SetupField(settings.Links, MetadataField.Links, plugins);\r\n            control.LinksSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Links.Sources = control.LinksSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.CriticScoreSettings = control.SetupField(settings.CriticScore, MetadataField.CriticScore, plugins);\r\n            control.CriticScoreSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.CriticScore.Sources = control.CriticScoreSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.CommunityScoreSettings = control.SetupField(settings.CommunityScore, MetadataField.CommunityScore, plugins);\r\n            control.CommunityScoreSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.CommunityScore.Sources = control.CommunityScoreSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.CoverSettings = control.SetupField(settings.CoverImage, MetadataField.CoverImage, plugins);\r\n            control.CoverSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.CoverImage.Sources = control.CoverSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.IconSettings = control.SetupField(settings.Icon, MetadataField.Icon, plugins);\r\n            control.IconSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Icon.Sources = control.IconSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.BackgroundImageSettings = control.SetupField(settings.BackgroundImage, MetadataField.BackgroundImage, plugins);\r\n            control.BackgroundImageSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.BackgroundImage.Sources = control.BackgroundImageSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.AgeRatingSettings = control.SetupField(settings.AgeRating, MetadataField.AgeRating, plugins);\r\n            control.AgeRatingSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.AgeRating.Sources = control.AgeRatingSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.RegionSettings = control.SetupField(settings.Region, MetadataField.Region, plugins);\r\n            control.RegionSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Region.Sources = control.RegionSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.SeriesSettings = control.SetupField(settings.Series, MetadataField.Series, plugins);\r\n            control.SeriesSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Series.Sources = control.SeriesSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.PlatformSettings = control.SetupField(settings.Platform, MetadataField.Platform, plugins);\r\n            control.PlatformSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.Platform.Sources = control.PlatformSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n\r\n            control.InstallSizeSettings = control.SetupField(settings.InstallSize, MetadataField.InstallSize, plugins);\r\n            control.InstallSizeSettings.SettingsChanged += (_, __) =>\r\n            {\r\n                control.Settings.InstallSize.Sources = control.InstallSizeSettings.Sources.Where(a => a.Enabled).Select(a => a.Id).ToList();\r\n            };\r\n        }\r\n\r\n        #endregion Properties\r\n\r\n        private FieldsSelectionSettings allSettings;\r\n        public FieldsSelectionSettings AllSettings\r\n        {\r\n            get => allSettings;\r\n            set\r\n            {\r\n                allSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand SetAllPropertiesCommmand => new RelayCommand(() => SetAllProperties());\r\n        public RelayCommand SelectAllToImportCommand => new RelayCommand(() => SelectAllSelectionImport(true));\r\n        public RelayCommand DeselectAllToImportCommand => new RelayCommand(() => SelectAllSelectionImport(false));\r\n\r\n        public event PropertyChangedEventHandler PropertyChanged;\r\n\r\n        public void OnPropertyChanged([CallerMemberName]string name = null)\r\n        {\r\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));\r\n        }\r\n\r\n        public MetadataDownloadSettings()\r\n        {\r\n            InitializeComponent();\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var allSources = new ObservableCollection<MetadataSource> { new MetadataSource\r\n            {\r\n                Id = Guid.Empty,\r\n                Enabled = false,\r\n                Name = ResourceProvider.GetString(LOC.MetaSourceStore)\r\n            }};\r\n\r\n            foreach (var plugin in PlayniteApplication.Current.Extensions.MetadataPlugins)\r\n            {\r\n                allSources.Add(new MetadataSource\r\n                {\r\n                    Id = plugin.Id,\r\n                    Enabled = false,\r\n                    Name = plugin.Name\r\n                });\r\n            }\r\n\r\n            AllSettings = new FieldsSelectionSettings(allSources);\r\n        }\r\n\r\n        internal FieldsSelectionSettings SetupField(\r\n            MetadataFieldSettings settings,\r\n            MetadataField field,\r\n            List<MetadataPlugin> plugins)\r\n        {\r\n            var sources = new ObservableCollection<MetadataSource>();\r\n            var storeAdded = false;\r\n            foreach (var src in settings.Sources)\r\n            {\r\n                if (src == Guid.Empty)\r\n                {\r\n                    storeAdded = true;\r\n                    sources.Add(new MetadataSource\r\n                    {\r\n                        Id = Guid.Empty,\r\n                        Enabled = true,\r\n                        Name = ResourceProvider.GetString(LOC.MetaSourceStore)\r\n                    });\r\n                }\r\n                else\r\n                {\r\n                    var plugin = plugins.FirstOrDefault(a => a.Id == src);\r\n                    if (plugin?.SupportedFields.Contains(field) == true)\r\n                    {\r\n                        sources.Add(new MetadataSource\r\n                        {\r\n                            Id = plugin.Id,\r\n                            Enabled = true,\r\n                            Name = plugin.Name\r\n                        });\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (!storeAdded)\r\n            {\r\n                sources.Add(new MetadataSource\r\n                {\r\n                    Id = Guid.Empty,\r\n                    Enabled = false,\r\n                    Name = ResourceProvider.GetString(\"LOCMetaSourceStore\")\r\n                });\r\n            }\r\n\r\n            foreach (var plugin in plugins)\r\n            {\r\n                if (plugin.SupportedFields.Contains(field) && sources.Any(a => a.Id == plugin.Id) == false)\r\n                {\r\n                    sources.Add(new MetadataSource\r\n                    {\r\n                        Id = plugin.Id,\r\n                        Enabled = false,\r\n                        Name = plugin.Name\r\n                    });\r\n                }\r\n            }\r\n\r\n            return new FieldsSelectionSettings(sources);\r\n        }\r\n\r\n        private void SetAllProperties()\r\n        {\r\n            void setSources(FieldsSelectionSettings settings)\r\n            {\r\n                settings.Sources.ForEach(a => a.Enabled = AllSettings.Sources.FirstOrDefault(b => a.Id == b.Id)?.Enabled ?? false);\r\n                foreach (var allSource in AllSettings.Sources.Reverse())\r\n                {\r\n                    var toMove = settings.Sources.FirstOrDefault(a => a.Id == allSource.Id);\r\n                    if (toMove != null)\r\n                    {\r\n                        var oldIndex = settings.Sources.IndexOf(toMove);\r\n                        if (oldIndex != 0)\r\n                        {\r\n                            settings.Sources.Move(oldIndex, 0);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            foreach (var prop in GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(a => a.PropertyType == typeof(FieldsSelectionSettings) && a.Name != nameof(AllSettings)))\r\n            {\r\n                setSources((FieldsSelectionSettings)prop.GetValue(this));\r\n            }\r\n        }\r\n\r\n        private void SelectAllSelectionImport(bool select)\r\n        {\r\n            foreach (var prop in Settings.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(a => a.PropertyType == typeof(MetadataFieldSettings)))\r\n            {\r\n                ((MetadataFieldSettings)prop.GetValue(Settings)).Import = select;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/NullableIntBox.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class NullIntNumericBox : TextBox\r\n    {\r\n        public int MinValue\r\n        {\r\n            get\r\n            {\r\n                return (int)GetValue(MinValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(MinValueProperty, value);\r\n            }\r\n        }\r\n\r\n        public int MaxValue\r\n        {\r\n            get\r\n            {\r\n                return (int)GetValue(MaxValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(MaxValueProperty, value);\r\n            }\r\n        }\r\n\r\n        private int? lastValue;\r\n        public int? Value\r\n        {\r\n            get\r\n            {\r\n                return (int?)GetValue(ValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                lastValue = value;\r\n                SetValue(ValueProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ValueProperty =\r\n            DependencyProperty.Register(nameof(Value), typeof(int?), typeof(NullIntNumericBox),\r\n                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, ValuePropertyChanged, CoerceValue, false, UpdateSourceTrigger.PropertyChanged));\r\n\r\n        public static readonly DependencyProperty MinValueProperty =\r\n            DependencyProperty.Register(nameof(MinValue), typeof(int?), typeof(NullIntNumericBox),\r\n                new PropertyMetadata(0, MinValuePropertyChanged));\r\n\r\n        public static readonly DependencyProperty MaxValueProperty =\r\n            DependencyProperty.Register(nameof(MaxValue), typeof(int?), typeof(NullIntNumericBox),\r\n                new PropertyMetadata(int.MaxValue, MaxValuePropertyChanged));\r\n\r\n        static NullIntNumericBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(NullIntNumericBox), new FrameworkPropertyMetadata(typeof(NullIntNumericBox)));\r\n        }\r\n\r\n        public NullIntNumericBox()\r\n        {\r\n            Text = Value.ToString();\r\n            LostFocus += NumericBox_LostFocus;\r\n            Loaded += NumericBox_Loaded;\r\n        }\r\n\r\n        private void NumericBox_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            lastValue = Value;\r\n        }\r\n\r\n        private void NumericBox_LostFocus(object sender, RoutedEventArgs e)\r\n        {\r\n            if (string.IsNullOrEmpty(Text))\r\n            {\r\n                Value = null;\r\n            }\r\n            else\r\n            {\r\n                if (!int.TryParse(Text, out var result))\r\n                {\r\n                    Value = lastValue;\r\n                }\r\n                else\r\n                {\r\n                    if (result >= MinValue && result <= MaxValue)\r\n                    {\r\n                        Value = result;\r\n                    }\r\n                    else\r\n                    {\r\n                        Value = lastValue;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private static object CoerceValue(DependencyObject element, object baseValue)\r\n        {\r\n            var box = (NullIntNumericBox)element;\r\n            var value = (int?)baseValue;\r\n            if (value == null)\r\n            {\r\n                box.Text = string.Empty;\r\n            }\r\n            else\r\n            {\r\n                box.Text = value.ToString();\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        private static void ValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n        }\r\n\r\n        private static void MinValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n        }\r\n\r\n        private static void MaxValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/NumericDoubleBox.cs",
    "content": "﻿using Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Globalization;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class DoubleNumericBox : TextBox\r\n    {\r\n        public double MinValue\r\n        {\r\n            get\r\n            {\r\n                return (double)GetValue(MinValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(MinValueProperty, value);\r\n            }\r\n        }\r\n\r\n        public double MaxValue\r\n        {\r\n            get\r\n            {\r\n                return (double)GetValue(MaxValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(MaxValueProperty, value);\r\n            }\r\n        }\r\n\r\n        private double lastValue;\r\n        public double Value\r\n        {\r\n            get\r\n            {\r\n                return (double)GetValue(ValueProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                lastValue = value;\r\n                SetValue(ValueProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ValueProperty =\r\n            DependencyProperty.Register(nameof(Value), typeof(double), typeof(DoubleNumericBox),\r\n                new FrameworkPropertyMetadata(\r\n                    (double)0,\r\n                    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,\r\n                    DoubleValuePropertyChanged,\r\n                    CoerceDoubleValue,\r\n                    false,\r\n                    UpdateSourceTrigger.PropertyChanged));\r\n\r\n        public static readonly DependencyProperty MinValueProperty =\r\n            DependencyProperty.Register(nameof(MinValue), typeof(double), typeof(DoubleNumericBox),\r\n                new PropertyMetadata((double)0, MinDoubleValuePropertyChanged));\r\n\r\n        public static readonly DependencyProperty MaxValueProperty =\r\n            DependencyProperty.Register(nameof(MaxValue), typeof(double), typeof(DoubleNumericBox),\r\n                new PropertyMetadata(double.MaxValue, MaxDoubleValuePropertyChanged));\r\n\r\n        static DoubleNumericBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(DoubleNumericBox), new FrameworkPropertyMetadata(typeof(DoubleNumericBox)));\r\n        }\r\n\r\n        public DoubleNumericBox()\r\n        {\r\n            Text = Value.ToString();\r\n            LostFocus += NumericDoubleBox_LostFocus;\r\n            Loaded += NumericDoubleBox_Loaded;\r\n            TextChanged += NumericDoubleBox_TextChanged;\r\n            PreviewKeyDown += NumericDoubleBox_PreviewKeyDown;\r\n        }\r\n\r\n        private void NumericDoubleBox_PreviewKeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            if (e.Key.IsNumericKey() || e.Key == Key.OemPeriod || e.Key == Key.OemComma || e.Key == Key.Delete ||\r\n                e.Key == Key.Back || e.Key == Key.Left || e.Key == Key.Right)\r\n            {\r\n                e.Handled = false;\r\n            }\r\n            else\r\n            {\r\n                e.Handled = true;\r\n            }\r\n        }\r\n\r\n        private void NumericDoubleBox_TextChanged(object sender, TextChangedEventArgs e)\r\n        {\r\n            NumericDoubleBox_LostFocus(sender, e);\r\n        }\r\n\r\n        private void NumericDoubleBox_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            lastValue = Value;\r\n        }\r\n\r\n        private void NumericDoubleBox_LostFocus(object sender, RoutedEventArgs e)\r\n        {\r\n            if (string.IsNullOrEmpty(Text))\r\n            {\r\n                Text = \"0\";\r\n            }\r\n\r\n\r\n            if (!TryParseForCurrentCulture(Text, out var result))\r\n            {\r\n                e.Handled = true;\r\n                Value = lastValue;\r\n            }\r\n            else\r\n            {\r\n                if (result >= MinValue && result <= MaxValue)\r\n                {\r\n                    Value = result;\r\n                }\r\n                else\r\n                {\r\n                    e.Handled = true;\r\n                    Value = lastValue;\r\n                    Text = lastValue.ToString();\r\n                }\r\n            }\r\n        }\r\n\r\n        private static object CoerceDoubleValue(DependencyObject element, object baseValue)\r\n        {\r\n            var box = (DoubleNumericBox)element;\r\n            var current = (double)baseValue;\r\n            if (current < box.MinValue)\r\n            {\r\n                current = box.MinValue;\r\n            }\r\n\r\n            if (current > box.MaxValue)\r\n            {\r\n                current = box.MaxValue;\r\n            }\r\n\r\n            return current;\r\n        }\r\n\r\n        private static void DoubleValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = (DoubleNumericBox)sender;\r\n            if (obj.Text.IsNullOrEmpty())\r\n            {\r\n                obj.Text = e.NewValue.ToString();\r\n            }\r\n            else\r\n            {\r\n                if (TryParseForCurrentCulture(obj.Text.Replace(\".\", \",\"), out var result) && result == (double)e.NewValue)\r\n                {\r\n                }\r\n                else\r\n                {\r\n                    obj.Text = e.NewValue.ToString();\r\n                }\r\n            }\r\n        }\r\n\r\n        private static void MinDoubleValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n        }\r\n\r\n        private static void MaxDoubleValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n        }\r\n\r\n        private static bool TryParseForCurrentCulture(string text, out double result)\r\n        {\r\n            var numberFormat = CultureInfo.CurrentCulture.NumberFormat;\r\n            var parsedText = text.Replace(\",\", numberFormat.NumberDecimalSeparator)\r\n                .Replace(\".\", numberFormat.NumberDecimalSeparator);\r\n\r\n            return double.TryParse(parsedText, out result);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/PathSelectionBox.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_ButtonDirectorySelect\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_ButtonFileSelect\", Type = typeof(Button))]\r\n    public class PathSelectionBox : TextBox\r\n    {\r\n        private Button ButtonDirectorySelect;\r\n        private Button ButtonFileSelect;\r\n\r\n        public string FileSelectorFilter { get; set; } = \"Any file|*.*\";\r\n\r\n        private bool showFileSelector = false;\r\n        public bool ShowFileSelector\r\n        {\r\n            get => showFileSelector;\r\n            set\r\n            {\r\n                showFileSelector = value;\r\n                SetButtonVisibility();\r\n            }\r\n        }\r\n\r\n        private bool showDirectorySelector = false;\r\n        public bool ShowDirectorySelector\r\n        {\r\n            get => showDirectorySelector;\r\n            set\r\n            {\r\n                showDirectorySelector = value;\r\n                SetButtonVisibility();\r\n            }\r\n        }\r\n\r\n        static PathSelectionBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(PathSelectionBox), new FrameworkPropertyMetadata(typeof(PathSelectionBox)));\r\n        }\r\n\r\n        public PathSelectionBox()\r\n        {\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            ButtonDirectorySelect = Template.FindName(\"PART_ButtonDirectorySelect\", this) as Button;\r\n            if (ButtonDirectorySelect != null)\r\n            {\r\n                ButtonDirectorySelect.Click += (_, __) =>\r\n                {\r\n                    var path = Dialogs.SelectFolder();\r\n                    if (!path.IsNullOrWhiteSpace())\r\n                    {\r\n                        Clear();\r\n                        AppendText(path);\r\n                    }\r\n                };\r\n            }\r\n\r\n            ButtonFileSelect = Template.FindName(\"PART_ButtonFileSelect\", this) as Button;\r\n            if (ButtonFileSelect != null)\r\n            {\r\n                ButtonFileSelect.Click += (_, __) =>\r\n                {\r\n                    var path = Dialogs.SelectFile(FileSelectorFilter);\r\n                    if (!path.IsNullOrWhiteSpace())\r\n                    {\r\n                        Clear();\r\n                        AppendText(path);\r\n                    }\r\n                };\r\n            }\r\n\r\n            SetButtonVisibility();\r\n        }\r\n\r\n        private void SetButtonVisibility()\r\n        {\r\n            if (ButtonDirectorySelect != null)\r\n            {\r\n                ButtonDirectorySelect.Visibility = ShowDirectorySelector == true ? Visibility.Visible : Visibility.Collapsed;\r\n            }\r\n\r\n            if (ButtonFileSelect != null)\r\n            {\r\n                ButtonFileSelect.Visibility = ShowFileSelector == true ? Visibility.Visible : Visibility.Collapsed;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SearchBox.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_SeachIcon\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ClearTextIcon\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_TextInpuText\", Type = typeof(TextBox))]\r\n    public class SearchBox : Control\r\n    {\r\n        private FrameworkElement ElemSeachIcon;\r\n        private FrameworkElement ElemClearTextIcon;\r\n        private TextBox TextInputText;\r\n\r\n        private int oldCarret;\r\n        private bool ignoreTextCallback;\r\n        internal IInputElement previousFocus;\r\n\r\n        public string Text\r\n        {\r\n            get\r\n            {\r\n                return (string)GetValue(TextProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(TextProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty TextProperty = DependencyProperty.Register(nameof(Text), typeof(string), typeof(SearchBox), new PropertyMetadata(string.Empty, TextPropertyChangedCallback));\r\n\r\n        public bool ShowImage\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(ShowImageProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ShowImageProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ShowImageProperty = DependencyProperty.Register(nameof(ShowImage), typeof(bool), typeof(SearchBox), new PropertyMetadata(true, ShowImagePropertyChangedCallback));\r\n\r\n        public new bool IsFocused\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(IsFocusedProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(IsFocusedProperty, value);\r\n            }\r\n        }\r\n\r\n        public new static readonly DependencyProperty IsFocusedProperty = DependencyProperty.Register(nameof(IsFocused), typeof(bool), typeof(SearchBox), new PropertyMetadata(false, IsFocusedPropertyChangedCallback));\r\n\r\n        static SearchBox()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(SearchBox), new FrameworkPropertyMetadata(typeof(SearchBox)));\r\n        }\r\n\r\n        public SearchBox()\r\n        {\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            ElemSeachIcon = Template.FindName(\"PART_SeachIcon\", this) as FrameworkElement;\r\n            if (ElemSeachIcon != null)\r\n            {\r\n            }\r\n\r\n            ElemClearTextIcon = Template.FindName(\"PART_ClearTextIcon\", this) as FrameworkElement;\r\n            if (ElemClearTextIcon != null)\r\n            {\r\n                ElemClearTextIcon.MouseUp += ClearImage_MouseUp;\r\n            }\r\n\r\n            TextInputText = Template.FindName(\"PART_TextInpuText\", this) as TextBox;\r\n            if (TextInputText != null)\r\n            {\r\n                TextInputText.TextChanged += TextFilter_TextChanged;\r\n                TextInputText.KeyUp += TextFilter_KeyUp;\r\n                TextInputText.GotFocus += TextInputText_GotFocus;\r\n                TextInputText.LostFocus += TextInputText_GotFocus;\r\n\r\n                BindingTools.SetBinding(\r\n                    TextInputText,\r\n                    TextBox.TextProperty,\r\n                    this,\r\n                    nameof(Text),\r\n                    mode: System.Windows.Data.BindingMode.OneWay,\r\n                    trigger: System.Windows.Data.UpdateSourceTrigger.PropertyChanged);\r\n            }\r\n\r\n            UpdateIconStates();\r\n        }\r\n\r\n        private void TextInputText_GotFocus(object sender, RoutedEventArgs e)\r\n        {\r\n            UpdateIconStates();\r\n        }\r\n\r\n        private void UpdateIconStates()\r\n        {\r\n            if (TextInputText.IsFocused)\r\n            {\r\n                ElemSeachIcon.Visibility = Visibility.Collapsed;\r\n            }\r\n\r\n            if (Text.IsNullOrEmpty())\r\n            {\r\n                ElemClearTextIcon.Visibility = Visibility.Collapsed;\r\n                if (!TextInputText.IsFocused)\r\n                {\r\n                    ElemSeachIcon.Visibility = ShowImage ? Visibility.Visible : Visibility.Collapsed;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                ElemClearTextIcon.Visibility = Visibility.Visible;\r\n                if (!TextInputText.IsFocused)\r\n                {\r\n                    ElemSeachIcon.Visibility = Visibility.Collapsed;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ClearFocus()\r\n        {\r\n            if (previousFocus != null)\r\n            {\r\n                Keyboard.Focus(previousFocus);\r\n            }\r\n            else\r\n            {\r\n                TextInputText.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));\r\n            }\r\n\r\n            previousFocus = null;\r\n            IsFocused = false;\r\n        }\r\n\r\n        private void TextFilter_KeyUp(object sender, KeyEventArgs e)\r\n        {\r\n            if (e.Key == Key.Escape || e.Key == Key.Enter)\r\n            {\r\n                ClearFocus();\r\n            }\r\n        }\r\n\r\n        private void ClearImage_MouseUp(object sender, MouseButtonEventArgs e)\r\n        {\r\n            TextInputText.Clear();\r\n        }\r\n\r\n        private void TextFilter_TextChanged(object sender, TextChangedEventArgs e)\r\n        {\r\n            if (ignoreTextCallback)\r\n            {\r\n                return;\r\n            }\r\n\r\n            ignoreTextCallback = true;\r\n            Text = TextInputText.Text;\r\n            ignoreTextCallback = false;\r\n            UpdateIconStates();\r\n        }\r\n\r\n        private static void TextPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as SearchBox;\r\n            if (obj.ignoreTextCallback)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (obj.TextInputText != null)\r\n            {\r\n                var currentCurret = obj.TextInputText.CaretIndex;\r\n                if (currentCurret == 0 && obj.TextInputText.Text.Length > 0 && obj.oldCarret != obj.TextInputText.Text.Length)\r\n                {\r\n                    obj.TextInputText.CaretIndex = obj.oldCarret;\r\n                }\r\n\r\n                obj.oldCarret = obj.TextInputText.CaretIndex;\r\n            }\r\n        }\r\n\r\n        private static void ShowImagePropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as SearchBox;\r\n            obj.ShowImage = (bool)e.NewValue;\r\n        }\r\n\r\n        private static void IsFocusedPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as SearchBox;\r\n            var shouldFocus = (bool)e.NewValue;\r\n\r\n            if (!shouldFocus && !obj.TextInputText.IsFocused)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (shouldFocus == true)\r\n            {\r\n                obj.previousFocus = Keyboard.FocusedElement;\r\n                obj.TextInputText.Focus();\r\n            }\r\n            else\r\n            {\r\n                obj.ClearFocus();\r\n            }\r\n\r\n            obj.UpdateIconStates();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceAdvanced.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.AppearanceAdvanced\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n             xmlns:sm=\"clr-namespace:System.Windows.Media;assembly=PresentationCore\"\r\n             xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\" \r\n             xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"1000\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n    </UserControl.Resources>\r\n\r\n    <ScrollViewer VerticalScrollBarVisibility=\"Auto\" HorizontalScrollBarVisibility=\"Disabled\">\r\n        <StackPanel Margin=\"20\">\r\n            <controls:GridEx ColumnCount=\"2\" RowCount=\"3\">\r\n                <ContentControl Content=\"{DynamicResource LOCSettingsDefaulIconSource}\"\r\n                                ContentStringFormat=\"{}{0} *\"\r\n                                Grid.Column=\"0\" Grid.Row=\"0\"\r\n                                Margin=\"0,10,10,10\" VerticalAlignment=\"Center\" />\r\n                <ComboBox SelectedValue=\"{Binding Settings.DefaultIconSource}\"\r\n                          VerticalAlignment=\"Center\" MinWidth=\"110\"\r\n                          Grid.Column=\"1\" Grid.Row=\"0\">\r\n                    <ComboBox.ItemsSource>\r\n                        <x:Array Type=\"{x:Type sys:Enum}\">\r\n                            <p:DefaultIconSourceOptions>Library</p:DefaultIconSourceOptions>\r\n                            <p:DefaultIconSourceOptions>Platform</p:DefaultIconSourceOptions>\r\n                            <p:DefaultIconSourceOptions>General</p:DefaultIconSourceOptions>\r\n                            <p:DefaultIconSourceOptions>None</p:DefaultIconSourceOptions>\r\n                        </x:Array>\r\n                    </ComboBox.ItemsSource>\r\n                    <ComboBox.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <TextBlock Text=\"{Binding Converter={pcon:ObjectToStringConverter}}\"/>\r\n                        </DataTemplate>\r\n                    </ComboBox.ItemTemplate>\r\n                </ComboBox>\r\n\r\n                <ContentControl Content=\"{DynamicResource LOCSettingsDefaulCoverSource}\"\r\n                                ContentStringFormat=\"{}{0} *\"\r\n                                Grid.Column=\"0\" Grid.Row=\"1\"\r\n                                Margin=\"0,10,10,10\" VerticalAlignment=\"Center\" />\r\n                <ComboBox SelectedValue=\"{Binding Settings.DefaultCoverSource}\"\r\n                          VerticalAlignment=\"Center\"\r\n                          Grid.Column=\"1\" Grid.Row=\"1\">\r\n                    <ComboBox.ItemsSource>\r\n                        <x:Array Type=\"{x:Type sys:Enum}\">\r\n                            <p:DefaultCoverSourceOptions>Platform</p:DefaultCoverSourceOptions>\r\n                            <p:DefaultCoverSourceOptions>General</p:DefaultCoverSourceOptions>\r\n                            <p:DefaultCoverSourceOptions>None</p:DefaultCoverSourceOptions>\r\n                        </x:Array>\r\n                    </ComboBox.ItemsSource>\r\n                    <ComboBox.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <TextBlock Text=\"{Binding Converter={pcon:ObjectToStringConverter}}\"/>\r\n                        </DataTemplate>\r\n                    </ComboBox.ItemTemplate>\r\n                </ComboBox>\r\n\r\n                <ContentControl Content=\"{DynamicResource LOCSettingsDefaulBackgroundSource}\"\r\n                                ContentStringFormat=\"{}{0} *\"\r\n                                Grid.Column=\"0\" Grid.Row=\"2\"\r\n                                Margin=\"0,10,10,10\" VerticalAlignment=\"Center\" />\r\n                <ComboBox SelectedValue=\"{Binding Settings.DefaultBackgroundSource}\"\r\n                          VerticalAlignment=\"Center\"\r\n                          Grid.Column=\"1\" Grid.Row=\"2\">\r\n                    <ComboBox.ItemsSource>\r\n                        <x:Array Type=\"{x:Type sys:Enum}\">\r\n                            <p:DefaultBackgroundSourceOptions>Library</p:DefaultBackgroundSourceOptions>\r\n                            <p:DefaultBackgroundSourceOptions>Platform</p:DefaultBackgroundSourceOptions>\r\n                            <p:DefaultBackgroundSourceOptions>Cover</p:DefaultBackgroundSourceOptions>\r\n                            <p:DefaultBackgroundSourceOptions>None</p:DefaultBackgroundSourceOptions>\r\n                        </x:Array>\r\n                    </ComboBox.ItemsSource>\r\n                    <ComboBox.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <TextBlock Text=\"{Binding Converter={pcon:ObjectToStringConverter}}\"/>\r\n                        </DataTemplate>\r\n                    </ComboBox.ItemTemplate>\r\n                </ComboBox>\r\n            </controls:GridEx>\r\n\r\n            <CheckBox Content=\"{DynamicResource LOCSettingsHiddenInQuickLaunch}\" Margin=\"0,15,0,0\"\r\n                      ToolTip=\"{DynamicResource LOCSettingsHiddenInQuickLaunchTooltip}\"\r\n                      IsChecked=\"{Binding Settings.ShowHiddenInQuickLaunch}\"/>\r\n\r\n            <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\">\r\n                <TextBlock Text=\"{DynamicResource LOCSettingsQuicLaunchItems}\"\r\n                           VerticalAlignment=\"Center\" Margin=\"0,0,5,0\"/>\r\n                <pctrls:NullIntNumericBox MinValue=\"0\" MaxValue=\"99\" Width=\"50\"\r\n                                       Value=\"{Binding Settings.QuickLaunchItems}\"/>\r\n            </StackPanel>\r\n\r\n            <StackPanel Orientation=\"Horizontal\"  Margin=\"0,25,0,0\">\r\n                <ContentControl Content=\"{DynamicResource LOCSettingsFontSizes}\" Margin=\"0,0,10,0\"\r\n                                ContentStringFormat=\"{}{0} *\" VerticalAlignment=\"Top\" />\r\n                <UniformGrid Rows=\"2\">\r\n                    <UniformGrid.Resources>\r\n                        <Style TargetType=\"pctrls:NullIntNumericBox\" BasedOn=\"{StaticResource {x:Type pctrls:NullIntNumericBox}}\">\r\n                            <Setter Property=\"Margin\" Value=\"5,0,5,0\" />\r\n                            <Setter Property=\"Width\" Value=\"50\" />\r\n                            <Setter Property=\"MinValue\" Value=\"9\" />\r\n                            <Setter Property=\"MaxValue\" Value=\"100\" />\r\n                        </Style>\r\n                    </UniformGrid.Resources>\r\n                    <TextBlock Text=\"{DynamicResource LOCFontSmall}\" Margin=\"5,0,5,0\"/>\r\n                    <TextBlock Text=\"{DynamicResource LOCFontNormal}\" Margin=\"5,0,5,0\"/>\r\n                    <TextBlock Text=\"{DynamicResource LOCFontLarge}\" Margin=\"5,0,5,0\"/>\r\n                    <TextBlock Text=\"{DynamicResource LOCFontLarger}\" Margin=\"5,0,5,0\"/>\r\n                    <TextBlock Text=\"{DynamicResource LOCFontLargest}\" Margin=\"5,0,5,0\"/>\r\n\r\n                    <pctrls:NullIntNumericBox Value=\"{Binding Settings.FontSizeSmall}\"/>\r\n                    <pctrls:NullIntNumericBox Value=\"{Binding Settings.FontSize}\"/>\r\n                    <pctrls:NullIntNumericBox Value=\"{Binding Settings.FontSizeLarge}\"/>\r\n                    <pctrls:NullIntNumericBox Value=\"{Binding Settings.FontSizeLarger}\"/>\r\n                    <pctrls:NullIntNumericBox Value=\"{Binding Settings.FontSizeLargest}\"/>\r\n                </UniformGrid>\r\n\r\n                <Button Content=\"{DynamicResource LOCDefault}\" VerticalAlignment=\"Bottom\"\r\n                        Margin=\"10,0,0,0\" Command=\"{Binding SetDefaultFontSizes}\"/>\r\n            </StackPanel>\r\n\r\n            <GridEx ColumnCount=\"2\" RowCount=\"2\" Margin=\"0,20,0,0\">\r\n                <ContentControl Content=\"{DynamicResource LOCSettingsTextRenderingMode}\" Grid.Column=\"0\" Grid.Row=\"0\"\r\n                                Margin=\"0,10,10,10\" VerticalAlignment=\"Center\"\r\n                                ContentStringFormat=\"{}{0} *\"/>\r\n                <ComboBox Grid.Column=\"1\" Grid.Row=\"0\" VerticalAlignment=\"Center\" MinWidth=\"100\"\r\n                          SelectedValue=\"{Binding Settings.TextRenderingMode}\">\r\n                    <ComboBox.ItemsSource>\r\n                        <x:Array Type=\"{x:Type sys:Enum}\">\r\n                            <p:TextRenderingModeOptions>Auto</p:TextRenderingModeOptions>\r\n                            <p:TextRenderingModeOptions>Aliased</p:TextRenderingModeOptions>\r\n                            <p:TextRenderingModeOptions>Grayscale</p:TextRenderingModeOptions>\r\n                            <p:TextRenderingModeOptions>ClearType</p:TextRenderingModeOptions>\r\n                        </x:Array>\r\n                    </ComboBox.ItemsSource>\r\n                    <ComboBox.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <TextBlock Text=\"{Binding Converter={pcon:ObjectToStringConverter}}\"/>\r\n                        </DataTemplate>\r\n                    </ComboBox.ItemTemplate>\r\n                </ComboBox>\r\n\r\n                <ContentControl Content=\"{DynamicResource LOCSettingsTextFormattingMode}\" Grid.Column=\"0\" Grid.Row=\"1\"\r\n                                Margin=\"0,10,10,10\" VerticalAlignment=\"Center\"\r\n                                ContentStringFormat=\"{}{0} *\"/>\r\n                <ComboBox Grid.Column=\"1\" Grid.Row=\"1\" VerticalAlignment=\"Center\" MinWidth=\"100\"\r\n                          SelectedValue=\"{Binding Settings.TextFormattingMode}\">\r\n                    <ComboBox.ItemsSource>\r\n                        <x:Array Type=\"{x:Type sys:Enum}\">\r\n                            <p:TextFormattingModeOptions>Ideal</p:TextFormattingModeOptions>\r\n                            <p:TextFormattingModeOptions>Display</p:TextFormattingModeOptions>\r\n                        </x:Array>\r\n                    </ComboBox.ItemsSource>\r\n                    <ComboBox.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <TextBlock Text=\"{Binding Converter={pcon:ObjectToStringConverter}}\"/>\r\n                        </DataTemplate>\r\n                    </ComboBox.ItemTemplate>\r\n                </ComboBox>\r\n            </GridEx>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsTextRenderingNotice}\"\r\n                       TextWrapping=\"Wrap\" Margin=\"0,10,0,0\"/>\r\n            \r\n            <CheckBox Content=\"{DynamicResource LOCSettingsPlaytimeUseDaysFormatLabel}\"\r\n                      ContentStringFormat=\"{}{0} *\" Margin=\"0,15,0,0\"\r\n                      IsChecked=\"{Binding Settings.PlaytimeUseDaysFormat}\"/>\r\n            \r\n            <ContentControl Content=\"{DynamicResource LOCSettingsDatesFormatsLabel}\" Margin=\"0,15,0,5\" \r\n                            ContentStringFormat=\"{}{0} *\"/>\r\n            \r\n            <GridEx ColumnCount=\"4\" StarColumns=\"3\" RowCount=\"5\" AutoLayoutColumns=\"4\">            \r\n                <!--Added-->\r\n                <TextBlock Text=\"{DynamicResource LOCAddedLabel}\"\r\n                           Margin=\"0,10,0,0\" VerticalAlignment=\"Top\" />\r\n                <StackPanel Margin=\"10,5,0,0\" MinWidth=\"150\" VerticalAlignment=\"Top\">\r\n                    <TextBox>\r\n                        <TextBox.Text>\r\n                            <Binding Path=\"Settings.DateTimeFormatAdded.Format\"\r\n                                     UpdateSourceTrigger=\"PropertyChanged\" \r\n                                     ValidatesOnDataErrors=\"True\"\r\n                                     NotifyOnValidationError=\"True\">\r\n                                <Binding.ValidationRules>\r\n                                    <pcon:DateTimeFormatToStringValidation />\r\n                                </Binding.ValidationRules>\r\n                            </Binding>\r\n                        </TextBox.Text>\r\n                    </TextBox>\r\n                    <CheckBox Content=\"{DynamicResource LOCSettingsPastWeekRelativeFormat}\" Margin=\"0,5,0,0\"\r\n                              ToolTip=\"{DynamicResource LOCSettingsPastWeekRelativeFormatTooltip}\"\r\n                              IsChecked=\"{Binding Settings.DateTimeFormatAdded.PastWeekRelativeFormat}\" />\r\n                </StackPanel>\r\n\r\n                <Button Content=\"{DynamicResource LOCResetLabel}\" Margin=\"10,5,0,0\" VerticalAlignment=\"Top\"\r\n                        Command=\"{Binding ResetDateTimeFormatAddedCommand}\" />\r\n\r\n                <TextBlock Margin=\"10,10,0,0\" VerticalAlignment=\"Top\" Text=\"{Binding DateTimeFormatAddedExample}\" />\r\n\r\n                <!--Modified-->\r\n                <TextBlock Text=\"{DynamicResource LOCModifiedLabel}\"\r\n                           Margin=\"0,15,0,0\" VerticalAlignment=\"Top\" />\r\n                <StackPanel Margin=\"10,10,0,0\" MinWidth=\"150\" VerticalAlignment=\"Top\">\r\n                    <TextBox>\r\n                        <TextBox.Text>\r\n                            <Binding Path=\"Settings.DateTimeFormatModified.Format\"\r\n                                     UpdateSourceTrigger=\"PropertyChanged\" \r\n                                     ValidatesOnDataErrors=\"True\"\r\n                                     NotifyOnValidationError=\"True\">\r\n                                <Binding.ValidationRules>\r\n                                    <pcon:DateTimeFormatToStringValidation />\r\n                                </Binding.ValidationRules>\r\n                            </Binding>\r\n                        </TextBox.Text>\r\n                    </TextBox>\r\n                    <CheckBox Content=\"{DynamicResource LOCSettingsPastWeekRelativeFormat}\" Margin=\"0,5,0,0\"\r\n                              ToolTip=\"{DynamicResource LOCSettingsPastWeekRelativeFormatTooltip}\"\r\n                              IsChecked=\"{Binding Settings.DateTimeFormatModified.PastWeekRelativeFormat}\" />\r\n                </StackPanel>\r\n                <Button Content=\"{DynamicResource LOCResetLabel}\" Margin=\"10,10,0,0\" VerticalAlignment=\"Top\"\r\n                        Command=\"{Binding ResetDateTimeFormatModifiedCommand}\" />\r\n\r\n                <TextBlock Margin=\"10,10,0,0\" VerticalAlignment=\"Top\" Text=\"{Binding DateTimeFormatModifiedExample}\" />\r\n\r\n                <!--ReleaseDate-->\r\n                <TextBlock Text=\"{DynamicResource LOCGameReleaseDateTitle}\"\r\n                           Margin=\"0,15,0,0\" VerticalAlignment=\"Top\" />\r\n                <StackPanel Margin=\"10,10,0,0\" MinWidth=\"150\" VerticalAlignment=\"Top\">\r\n                    <TextBox>\r\n                        <TextBox.Text>\r\n                            <Binding Path=\"Settings.DateTimeFormatReleaseDate.Format\"\r\n                                 UpdateSourceTrigger=\"PropertyChanged\" \r\n                                 ValidatesOnDataErrors=\"True\"\r\n                                 NotifyOnValidationError=\"True\">\r\n                                <Binding.ValidationRules>\r\n                                    <pcon:DateTimeFormatToStringValidation />\r\n                                </Binding.ValidationRules>\r\n                            </Binding>\r\n                        </TextBox.Text>\r\n                    </TextBox>\r\n                    <TextBox Margin=\"0,5,0,0\">\r\n                        <TextBox.Text>\r\n                            <Binding Path=\"Settings.DateTimeFormatReleaseDate.PartialFormat\"\r\n                                     UpdateSourceTrigger=\"PropertyChanged\" \r\n                                     ValidatesOnDataErrors=\"True\"\r\n                                     NotifyOnValidationError=\"True\">\r\n                                <Binding.ValidationRules>\r\n                                    <pcon:DateTimeFormatToStringValidation />\r\n                                </Binding.ValidationRules>\r\n                            </Binding>\r\n                        </TextBox.Text>\r\n                    </TextBox>\r\n                    <CheckBox Content=\"{DynamicResource LOCSettingsPastWeekRelativeFormat}\" Margin=\"0,5,0,0\"\r\n                              ToolTip=\"{DynamicResource LOCSettingsPastWeekRelativeFormatTooltip}\"\r\n                              IsChecked=\"{Binding Settings.DateTimeFormatReleaseDate.PastWeekRelativeFormat}\" />\r\n                </StackPanel>\r\n                <Button Content=\"{DynamicResource LOCResetLabel}\" Margin=\"10,10,0,0\" VerticalAlignment=\"Top\"\r\n                        Command=\"{Binding ResetDateTimeFormatReleaseDateCommand}\" />\r\n\r\n                <StackPanel Margin=\"10,10,0,0\" VerticalAlignment=\"Top\">\r\n                    <TextBlock  Text=\"{Binding DateTimeFormatReleaseDateExample}\" />\r\n                    <TextBlock  Text=\"{Binding DateTimeFormatPartialReleaseDateExample}\" Margin=\"0,15,0,0\" />\r\n                </StackPanel>\r\n\r\n                <!--RecentActivity-->\r\n                <TextBlock Text=\"{DynamicResource LOCRecentActivityLabel}\"\r\n                           Margin=\"0,15,0,0\" VerticalAlignment=\"Top\" />\r\n                <StackPanel Margin=\"10,10,0,0\" MinWidth=\"150\" VerticalAlignment=\"Top\">\r\n                    <TextBox>\r\n                        <TextBox.Text>\r\n                            <Binding Path=\"Settings.DateTimeFormatRecentActivity.Format\"\r\n                                     UpdateSourceTrigger=\"PropertyChanged\" \r\n                                     ValidatesOnDataErrors=\"True\"\r\n                                     NotifyOnValidationError=\"True\">\r\n                                <Binding.ValidationRules>\r\n                                    <pcon:DateTimeFormatToStringValidation />\r\n                                </Binding.ValidationRules>\r\n                            </Binding>\r\n                        </TextBox.Text>\r\n                    </TextBox>\r\n                    <CheckBox Content=\"{DynamicResource LOCSettingsPastWeekRelativeFormat}\" Margin=\"0,5,0,0\"\r\n                              ToolTip=\"{DynamicResource LOCSettingsPastWeekRelativeFormatTooltip}\"\r\n                              IsChecked=\"{Binding Settings.DateTimeFormatRecentActivity.PastWeekRelativeFormat}\" />\r\n                </StackPanel>\r\n                <Button Content=\"{DynamicResource LOCResetLabel}\" Margin=\"10,10,0,0\" VerticalAlignment=\"Top\"\r\n                        Command=\"{Binding ResetDateTimeFormatRecentActivityCommand}\" />\r\n\r\n                <TextBlock Margin=\"10,10,0,0\" VerticalAlignment=\"Top\" Text=\"{Binding DateTimeFormatRecentActivityExample}\" />\r\n\r\n\r\n                <!--LastActivity-->\r\n                <TextBlock Text=\"{DynamicResource LOCLastPlayedLabel}\"\r\n                           Margin=\"0,15,0,0\" VerticalAlignment=\"Top\" />\r\n                <StackPanel Margin=\"10,10,0,0\" MinWidth=\"150\" VerticalAlignment=\"Top\">\r\n                    <TextBox>\r\n                        <TextBox.Text>\r\n                            <Binding Path=\"Settings.DateTimeFormatLastPlayed.Format\"\r\n                                 UpdateSourceTrigger=\"PropertyChanged\" \r\n                                 ValidatesOnDataErrors=\"True\"\r\n                                 NotifyOnValidationError=\"True\">\r\n                                <Binding.ValidationRules>\r\n                                    <pcon:DateTimeFormatToStringValidation />\r\n                                </Binding.ValidationRules>\r\n                            </Binding>\r\n                        </TextBox.Text>\r\n                    </TextBox>\r\n                    <CheckBox Content=\"{DynamicResource LOCSettingsPastWeekRelativeFormat}\" Margin=\"0,5,0,0\"\r\n                              ToolTip=\"{DynamicResource LOCSettingsPastWeekRelativeFormatTooltip}\"\r\n                              IsChecked=\"{Binding Settings.DateTimeFormatLastPlayed.PastWeekRelativeFormat}\" />\r\n                </StackPanel>\r\n                <Button Content=\"{DynamicResource LOCResetLabel}\" Margin=\"10,10,0,0\" VerticalAlignment=\"Top\"\r\n                        Command=\"{Binding ResetDateTimeFormatLastPlayedCommand}\" />\r\n\r\n                <TextBlock Margin=\"10,10,0,0\" VerticalAlignment=\"Top\" Text=\"{Binding DateTimeFormatLastPlayedExample}\" />\r\n            </GridEx>\r\n\r\n            <Button Content=\"{DynamicResource LOCMenuHelpTitle}\"\r\n                    Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                    CommandParameter=\"https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings\"\r\n                    HorizontalAlignment=\"Left\" Margin=\"0,10,0,0\" />\r\n        </StackPanel>\r\n    </ScrollViewer>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceAdvanced.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for AppearanceAdvanced.xaml\r\n    /// </summary>\r\n    public partial class AppearanceAdvanced : UserControl\r\n    {\r\n        public AppearanceAdvanced()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceDetailsView.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.AppearanceDetailsView\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"600\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n    </UserControl.Resources>\r\n\r\n    <ScrollViewer VerticalScrollBarVisibility=\"Auto\" HorizontalScrollBarVisibility=\"Disabled\">\r\n        <StackPanel Margin=\"20\">\r\n            <CheckBox Content=\"{DynamicResource LOCSettingsShowIconList}\"\r\n                  Name=\"CheckShowIcons\" IsChecked=\"{Binding Settings.ShowIconsOnList}\"/>\r\n\r\n            <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,15\">\r\n                <CheckBox IsChecked=\"{Binding Settings.IndentGameDetails}\" VerticalAlignment=\"Center\"\r\n                      Content=\"{DynamicResource LOCSettingsIndentGameDetails}\" />\r\n                <pctrls:NullIntNumericBox MinValue=\"0\" MaxValue=\"4096\" Width=\"60\" Margin=\"10,0,0,0\"\r\n                                   Value=\"{Binding Settings.GameDetailsIndentation}\"\r\n                                   IsEnabled=\"{Binding Settings.IndentGameDetails}\" />\r\n            </StackPanel>\r\n\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCScrollingSensitivity}\" />\r\n                <Slider Width=\"200\" Minimum=\"0.5\" Maximum=\"10\" SmallChange=\"0.5\" LargeChange=\"0.5\"\r\n                    IsSnapToTickEnabled=\"True\" TickFrequency=\"0.5\"\r\n                    HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Margin=\"10,0,10,0\"\r\n                    Value=\"{Binding Settings.DetailsViewScrollSensitivity}\" />\r\n            </StackPanel>\r\n\r\n            <CheckBox Content=\"{DynamicResource LOCSmoothScrolling}\" Margin=\"0,10,0,0\"\r\n                  Name=\"CheckSmoothScroll\"\r\n                  IsChecked=\"{Binding Settings.DetailsViewSmoothScrollEnabled}\"/>\r\n\r\n            <StackPanel Orientation=\"Horizontal\" Margin=\"25,10,0,0\"\r\n                    IsEnabled=\"{Binding IsChecked, ElementName=CheckSmoothScroll}\">\r\n                <TextBlock Text=\"{DynamicResource LOCSmoothScrollingSpeed}\" />\r\n                <Slider Width=\"200\" Minimum=\"1000000\" Maximum=\"10000000\" SmallChange=\"500000\" LargeChange=\"500000\"\r\n                    IsSnapToTickEnabled=\"True\" TickFrequency=\"500000\"\r\n                    HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Margin=\"10,0,10,0\"\r\n                    Value=\"{Binding Settings.DetailsViewScrollSpeed}\" />\r\n            </StackPanel>\r\n\r\n            <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,15\">\r\n                <TextBlock VerticalAlignment=\"Center\"\r\n                       Text=\"{DynamicResource LOCSettingsGameDetailsCoverHeight}\"/>\r\n                <pctrls:NullIntNumericBox MinValue=\"0\" MaxValue=\"4096\" Width=\"60\" Margin=\"10,0,0,0\"\r\n                                   Value=\"{Binding Settings.GameDetailsCoverHeight}\" />\r\n            </StackPanel>\r\n\r\n            <StackPanel Orientation=\"Horizontal\" Margin=\"0,0,0,15\">\r\n                <TextBlock VerticalAlignment=\"Center\"\r\n                       Text=\"{DynamicResource LOCSettingsGameDetailsListIconSize}\"/>\r\n                <pctrls:NullIntNumericBox MinValue=\"0\" MaxValue=\"4096\" Width=\"60\" Margin=\"10,0,0,0\"\r\n                                   Value=\"{Binding Settings.DetailsViewListIconSize}\" />\r\n            </StackPanel>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsDetailsPanelItems}\" />\r\n            <UniformGrid Columns=\"3\" VerticalAlignment=\"Top\">\r\n                <CheckBox Content=\"{DynamicResource LOCGameIconTitle}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Icon}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCGameCoverTitle}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.CoverImage}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCGameBackgroundTitle}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.BackgroundImage}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCTimePlayed}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.PlayTime}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCGameLastActivityTitle}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.LastPlayed}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCDateAddedLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Added}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCRecentActivityLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.RecentActivity}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCCompletionStatus}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.CompletionStatus}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCPlatformTitle}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Platform}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCGameProviderTitle}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Library}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCGameGenresTitle}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Genres}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCDeveloperLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Developers}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCPublisherLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Publishers}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCGameReleaseDateTitle}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.ReleaseDate}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCCategoryLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Categories}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCFeaturesLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Features}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCTagsLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Tags}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCAgeRatingLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.AgeRating}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCSeriesLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Series}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCRegionLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Region}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCSourceLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Source}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCVersionLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Version}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCCommunityScore}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.CommunityScore}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCCriticScore}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.CriticScore}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCUserScore}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.UserScore}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCLinksLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Links}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCGameDescriptionTitle}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Description}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCNotesLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Notes}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCNameLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.Name}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCInstallSizeLabel}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.InstallSize}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n                <CheckBox Content=\"{DynamicResource LOCGameInstallDirTitle}\"\r\n                                              IsChecked=\"{Binding Settings.DetailsVisibility.InstallDirectory}\"\r\n                                              Margin=\"0,10,0,0\"/>\r\n            </UniformGrid>\r\n        </StackPanel>\r\n    </ScrollViewer>    \r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceDetailsView.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for AppearanceDetailsView.xaml\r\n    /// </summary>\r\n    public partial class AppearanceDetailsView : UserControl\r\n    {\r\n        public AppearanceDetailsView()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceGeneral.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.AppearanceGeneral\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n    </UserControl.Resources>\r\n\r\n    <StackPanel Margin=\"20\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <ContentControl VerticalAlignment=\"Center\"\r\n                            Content=\"{DynamicResource LOCSettingsSkin}\"\r\n                            ContentStringFormat=\"{}{0} *\"/>\r\n            <ComboBox Margin=\"10,0,0,0\" MinWidth=\"150\"\r\n                    ItemsSource=\"{Binding AvailableThemes}\"\r\n                    SelectedValue=\"{Binding Settings.Theme}\"\r\n                    SelectedValuePath=\"Id\"\r\n                    DisplayMemberPath=\"Name\" />\r\n            <!--TODO update links -->\r\n            <TextBlock Margin=\"20,0,0,0\" VerticalAlignment=\"Center\">\r\n                <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                            CommandParameter=\"https://playnite.link/addons.html#themesDesktop\">\r\n                    <Run Text=\"{DynamicResource LOCSettingsGetThemes}\" />\r\n                </Hyperlink>\r\n            </TextBlock>\r\n            <TextBlock Margin=\"20,0,0,0\" VerticalAlignment=\"Center\">\r\n                <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                            CommandParameter=\"{}{DocsRootUrl}/tutorials/themes/introduction.html\">\r\n                    <Run Text=\"{DynamicResource LOCSettingsCreateThemes}\" />\r\n                </Hyperlink>\r\n            </TextBlock>\r\n        </StackPanel>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"0,20,0,5\">\r\n            <ContentControl Content=\"{DynamicResource LOCSettingsInterfaceFont}\" VerticalAlignment=\"Center\"\r\n                            ContentStringFormat=\"{}{0} *\" />\r\n            <ComboBox ItemsSource=\"{Binding AvailableFonts}\" Width=\"180\" Margin=\"10,0,0,0\"\r\n                      SelectedValue=\"{Binding Settings.FontFamilyName}\">\r\n                <ComboBox.ItemTemplate>\r\n                    <DataTemplate>\r\n                        <TextBlock  Text=\"{Binding Path='',Mode=OneWay}\" FontFamily=\"{Binding  Path='',Mode=OneWay}\" />\r\n                    </DataTemplate>\r\n                </ComboBox.ItemTemplate>\r\n                <ComboBox.ItemsPanel>\r\n                    <ItemsPanelTemplate >\r\n                        <VirtualizingStackPanel VirtualizationMode=\"Recycling\"/>\r\n                    </ItemsPanelTemplate>\r\n                </ComboBox.ItemsPanel>\r\n            </ComboBox>\r\n        </StackPanel>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"0,5,0,5\">\r\n            <ContentControl Content=\"{DynamicResource LOCSettingsInterfaceMonoFont}\" VerticalAlignment=\"Center\"\r\n                            ContentStringFormat=\"{}{0} *\" />\r\n            <ComboBox ItemsSource=\"{Binding AvailableFonts}\" Width=\"180\" Margin=\"10,0,0,0\"\r\n                      SelectedValue=\"{Binding Settings.MonospaceFontFamilyName}\">\r\n                <ComboBox.ItemTemplate>\r\n                    <DataTemplate>\r\n                        <TextBlock  Text=\"{Binding Path='',Mode=OneWay}\" FontFamily=\"{Binding  Path='',Mode=OneWay}\" />\r\n                    </DataTemplate>\r\n                </ComboBox.ItemTemplate>\r\n                <ComboBox.ItemsPanel>\r\n                    <ItemsPanelTemplate >\r\n                        <VirtualizingStackPanel VirtualizationMode=\"Recycling\"/>\r\n                    </ItemsPanelTemplate>\r\n                </ComboBox.ItemsPanel>\r\n            </ComboBox>\r\n        </StackPanel>\r\n\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsShowGroupCount}\" Margin=\"0,15,0,0\"\r\n                  Name=\"CheckShowGroupCount\" IsChecked=\"{Binding Settings.ShowGroupCount}\"/>\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsUsedFieldsOnlyOnFilterLists}\" Margin=\"0,15,0,0\"\r\n                  IsChecked=\"{Binding Settings.UsedFieldsOnlyOnFilterLists}\"/>\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsShowBackgroundWindowImage}\" Margin=\"0,15,0,0\"\r\n                  Name=\"CheckShowBackgroundImage\" IsChecked=\"{Binding Settings.ShowBackgroundImageOnWindow}\"/>\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"25,15,0,0\"\r\n                    IsEnabled=\"{Binding Settings.ShowBackgroundImageOnWindow}\">\r\n            <CheckBox Content=\"{DynamicResource LOCSettingsBlurWindowBackgrounImage}\" \r\n                      IsChecked=\"{Binding Settings.BlurWindowBackgroundImage}\"/>\r\n            <Slider Minimum=\"0\" Maximum=\"100\" TickFrequency=\"1\" IsSnapToTickEnabled=\"True\"\r\n                    Value=\"{Binding Settings.BackgroundImageBlurAmount}\"\r\n                    VerticalAlignment=\"Center\" Margin=\"15,0,0,0\" Width=\"200\"\r\n                    IsEnabled=\"{Binding Settings.BlurWindowBackgroundImage}\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.HighQualityBackgroundBlur}\"\r\n                      IsEnabled=\"{Binding Settings.BlurWindowBackgroundImage}\"\r\n                      Content=\"{DynamicResource LOCSettingsBlurHighQuality}\" Margin=\"15,0,0,0\"/>\r\n        </StackPanel>\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"25,15,0,0\"\r\n                    IsEnabled=\"{Binding Settings.ShowBackgroundImageOnWindow}\">\r\n            <CheckBox Content=\"{DynamicResource LOCSettingsDarkenWindowBackghrounImage}\" \r\n                      IsChecked=\"{Binding Settings.DarkenWindowBackgroundImage}\"/>\r\n            <Slider Minimum=\"0\" Maximum=\"1\"\r\n                    Value=\"{Binding Settings.BackgroundImageDarkAmount}\"\r\n                    VerticalAlignment=\"Center\" Margin=\"15,0,0,0\" Width=\"200\"\r\n                    IsEnabled=\"{Binding Settings.DarkenWindowBackgroundImage}\" />\r\n        </StackPanel>\r\n\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsShowBackImageOnGridView}\" Margin=\"25,15,0,0\"\r\n                IsChecked=\"{Binding Settings.ShowBackImageOnGridView}\"\r\n                IsEnabled=\"{Binding Settings.ShowBackgroundImageOnWindow}\"/>\r\n\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsBackgroundImageAnimation}\" Margin=\"0,15,0,0\"\r\n                  IsChecked=\"{Binding Settings.BackgroundImageAnimation}\"/>\r\n    </StackPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceGeneral.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for AppearanceGeneral.xaml\r\n    /// </summary>\r\n    public partial class AppearanceGeneral : UserControl\r\n    {\r\n        public AppearanceGeneral()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceGridView.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.AppearanceGridView\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:playnite=\"clr-namespace:Playnite;assembly=Playnite\"\r\n            xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n            xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n            xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n            xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n            xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n            xmlns:winMedia=\"clr-namespace:System.Windows.Media;assembly=PresentationCore\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n    </UserControl.Resources>\r\n\r\n    <StackPanel Margin=\"20\">\r\n        <StackPanel.Resources>\r\n            <ObjectDataProvider MethodName=\"GetValues\" ObjectType=\"{x:Type sys:Enum}\"\r\n                                                        x:Key=\"CoverArtStretchValues\">\r\n                <ObjectDataProvider.MethodParameters>\r\n                    <x:Type TypeName=\"winMedia:Stretch\" />\r\n                </ObjectDataProvider.MethodParameters>\r\n            </ObjectDataProvider>\r\n            <ComboBox x:Key=\"ComboStrechOptions\" x:Shared=\"False\"\r\n                    SelectedValue=\"{Binding CoverArtStretch}\"\r\n                    ItemsSource=\"{Binding Source={StaticResource CoverArtStretchValues}}\">\r\n                <ComboBox.ItemTemplate>\r\n                    <DataTemplate>\r\n                        <TextBlock Text=\"{Binding Converter={pcon:StrechToStringConverter}}\"/>\r\n                    </DataTemplate>\r\n                </ComboBox.ItemTemplate>\r\n            </ComboBox>\r\n        </StackPanel.Resources>\r\n\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsShowNameEmptyCover}\"\r\n                  Name=\"CheckNameEmptyCover\" IsChecked=\"{Binding Settings.ShowNameEmptyCover}\"/>\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsShowNamesUnderCover}\" Margin=\"0,15,0,0\"\r\n                  Name=\"CheckNameUnderCover\" IsChecked=\"{Binding Settings.ShowNamesUnderCovers}\"/>\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsDarkenUninstalledGridCovers}\" Margin=\"0,15,0,0\"\r\n                  Name=\"CheckDarkenUninstalledCovers\" IsChecked=\"{Binding Settings.DarkenUninstalledGamesGrid}\"/>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\">\r\n            <TextBlock Text=\"{DynamicResource LOCScrollingSensitivity}\" />\r\n            <Slider Width=\"200\" Minimum=\"0.5\" Maximum=\"10\" SmallChange=\"0.5\" LargeChange=\"0.5\"\r\n                    IsSnapToTickEnabled=\"True\" TickFrequency=\"0.5\"\r\n                    HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Margin=\"10,0,10,0\"\r\n                    Value=\"{Binding Settings.GridViewScrollSensitivity}\" />\r\n        </StackPanel>\r\n\r\n        <CheckBox Content=\"{DynamicResource LOCSmoothScrolling}\" Margin=\"0,10,0,0\"\r\n                  Name=\"CheckSmoothScroll\"\r\n                  IsChecked=\"{Binding Settings.GridViewSmoothScrollEnabled}\"/>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"25,10,0,0\"\r\n                    IsEnabled=\"{Binding IsChecked, ElementName=CheckSmoothScroll}\">\r\n            <TextBlock Text=\"{DynamicResource LOCSmoothScrollingSpeed}\" />\r\n            <Slider Width=\"200\" Minimum=\"1000000\" Maximum=\"10000000\" SmallChange=\"500000\" LargeChange=\"500000\"\r\n                    IsSnapToTickEnabled=\"True\" TickFrequency=\"500000\"\r\n                    HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Margin=\"10,0,10,0\"\r\n                    Value=\"{Binding Settings.GridViewScrollSpeed}\" />\r\n        </StackPanel>\r\n\r\n        <TextBlock Text=\"{DynamicResource LOCSettingsCoverArtRenderingLabel}\" Margin=\"0,15,0,0\" />        \r\n        <Separator />\r\n\r\n        <controls:GridEx ColumnCount=\"2\" RowCount=\"6\" AutoLayoutColumns=\"2\"\r\n                         Margin=\"0,10,0,0\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsGridTileLayoutFSNote}\"\r\n                       FontStyle=\"Italic\"\r\n                       Grid.ColumnSpan=\"2\" TextWrapping=\"Wrap\" Margin=\"0,0,0,5\" />\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsTargetAspectRatioLabel}\"\r\n                       VerticalAlignment=\"Center\" Margin=\"0,10,0,10\" />\r\n            <StackPanel Orientation=\"Horizontal\" VerticalAlignment=\"Center\">\r\n                <pctrls:NullIntNumericBox MinValue=\"1\" MaxValue=\"999\" Width=\"30\"\r\n                                        Margin=\"10,0,0,0\"\r\n                                        Value=\"{Binding Settings.GridItemWidthRatio}\"/>\r\n                <TextBlock Text=\":\" VerticalAlignment=\"Center\"\r\n                           Margin=\"2,0,2,0\"/>\r\n                <pctrls:NullIntNumericBox MinValue=\"1\" MaxValue=\"999\" Width=\"30\"\r\n                                       Value=\"{Binding Settings.GridItemHeightRatio}\"/>\r\n\r\n                <Button Content=\"{DynamicResource LOCPresets}\" Margin=\"15,0,0,0\" Padding=\"2\"\r\n                        pbeh:LeftClickContextMenuBehavior.Enabled=\"True\">\r\n                    <Button.ContextMenu>\r\n                        <ContextMenu Placement=\"Bottom\">\r\n                            <MenuItem Header=\"{DynamicResource LOCSettingsCovertAspectDVD}\"\r\n                                    Command=\"{Binding SetCoverArtAspectRatioCommand}\"\r\n                                    CommandParameter=\"27:38\"/>\r\n                            <MenuItem Header=\"{DynamicResource LOCSettingsCovertAspectEpicGamesStore}\"\r\n                                    Command=\"{Binding SetCoverArtAspectRatioCommand}\"\r\n                                    CommandParameter=\"3:4\"/>\r\n                            <MenuItem Header=\"{DynamicResource LOCSettingsCovertAspectGogGalaxy2}\"\r\n                                    Command=\"{Binding SetCoverArtAspectRatioCommand}\"\r\n                                    CommandParameter=\"22:31\"/>\r\n                            <MenuItem Header=\"{DynamicResource LOCSettingsCovertAspectIgdb}\"\r\n                                    Command=\"{Binding SetCoverArtAspectRatioCommand}\"\r\n                                    CommandParameter=\"3:4\"/>\r\n                            <MenuItem Header=\"{DynamicResource LOCSettingsCovertAspectSquare}\"\r\n                                    Command=\"{Binding SetCoverArtAspectRatioCommand}\"\r\n                                    CommandParameter=\"1:1\"/>\r\n                            <MenuItem Header=\"{DynamicResource LOCSettingsCovertAspectSteam}\"\r\n                                    Command=\"{Binding SetCoverArtAspectRatioCommand}\"\r\n                                    CommandParameter=\"92:43\"/>\r\n                            <MenuItem Header=\"{DynamicResource LOCSettingsCovertAspectSteamVertical}\"\r\n                                    Command=\"{Binding SetCoverArtAspectRatioCommand}\"\r\n                                    CommandParameter=\"2:3\"/>\r\n                            <MenuItem Header=\"{DynamicResource LOCSettingsCovertAspectTwitch}\"\r\n                                    Command=\"{Binding SetCoverArtAspectRatioCommand}\"\r\n                                    CommandParameter=\"3:4\"/>\r\n                        </ContextMenu>\r\n                    </Button.ContextMenu>\r\n                </Button>\r\n            </StackPanel>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsStrechModeLabel}\"\r\n                        VerticalAlignment=\"Center\" Margin=\"0,10,0,10\" />\r\n            <ContentControl DataContext=\"{Binding Settings}\"\r\n                            Content=\"{StaticResource ComboStrechOptions}\"\r\n                            MinWidth=\"140\" Margin=\"10,0,0,0\"\r\n                            VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"/>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsGridItemSpacing}\"\r\n                        VerticalAlignment=\"Center\" Margin=\"0,10,0,10\"/>\r\n            <pctrls:NullIntNumericBox MinValue=\"0\" MaxValue=\"4096\" Margin=\"10,0,0,0\" Width=\"40\"\r\n                                HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\"\r\n                                Value=\"{Binding Settings.GridItemSpacing}\" />\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsGridItemCoverMargin}\"\r\n                        VerticalAlignment=\"Center\" Margin=\"0,10,0,10\" />\r\n            <pctrls:NullIntNumericBox MinValue=\"0\" MaxValue=\"4096\" Margin=\"10,0,0,0\" Width=\"40\"\r\n                                    HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\"\r\n                                    Value=\"{Binding Settings.GridItemMargin}\" />\r\n\r\n            <CheckBox Content=\"{DynamicResource LOCSettingsGridItemDrawBackground}\"\r\n                      Grid.ColumnSpan=\"2\" Margin=\"0,10,0,0\"\r\n                    IsChecked=\"{Binding Settings.ShowGridItemBackground}\"/>\r\n        </controls:GridEx>\r\n    </StackPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceGridView.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for AppearanceGridView.xaml\r\n    /// </summary>\r\n    public partial class AppearanceGridView : UserControl\r\n    {\r\n        public AppearanceGridView()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceLayout.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.AppearanceLayout\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n        xmlns:sysCtrls=\"clr-namespace:System.Windows.Controls;assembly=PresentationFramework\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n\r\n        <x:Array x:Key=\"LeftRightDockOptions\" Type=\"{x:Type sys:Enum}\">\r\n            <sysCtrls:Dock>Left</sysCtrls:Dock>\r\n            <sysCtrls:Dock>Right</sysCtrls:Dock>\r\n        </x:Array>\r\n        <DataTemplate x:Key=\"LeftRightComboTemplate\">\r\n            <TextBlock Text=\"{Binding Converter={pcon:DockToStringConverter}}\"/>\r\n        </DataTemplate>        \r\n    </UserControl.Resources>\r\n\r\n    <StackPanel Margin=\"20\">\r\n        <Grid>\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"Auto\" />\r\n                <ColumnDefinition Width=\"Auto\" />\r\n                <ColumnDefinition Width=\"Auto\" />\r\n                <ColumnDefinition Width=\"Auto\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition />\r\n                <RowDefinition />\r\n                <RowDefinition />\r\n                <RowDefinition />\r\n            </Grid.RowDefinitions>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsFilterPanelPosition}\"\r\n                        VerticalAlignment=\"Center\"\r\n                        Grid.Column=\"0\" Grid.Row=\"0\" />\r\n            <ComboBox ItemTemplate=\"{StaticResource LeftRightComboTemplate}\"\r\n                    ItemsSource=\"{StaticResource LeftRightDockOptions}\"\r\n                    SelectedValue=\"{Binding Settings.FilterPanelPosition}\"\r\n                    Margin=\"5\" Grid.Column=\"1\" Grid.Row=\"0\" />\r\n            <TextBlock Text=\"{DynamicResource LOCWidth}\" Grid.Column=\"2\" Grid.Row=\"0\"\r\n                       VerticalAlignment=\"Center\" Margin=\"15,0,5,0\"/>\r\n            <pctrls:NullIntNumericBox MinValue=\"50\" MaxValue=\"4096\" Width=\"50\"\r\n                                    Grid.Column=\"3\" Grid.Row=\"0\"\r\n                                    Value=\"{Binding Settings.FilterPanelWitdh}\"\r\n                                    VerticalAlignment=\"Center\"/>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsExplorerPanelPosition}\"\r\n                        VerticalAlignment=\"Center\"\r\n                        Grid.Column=\"0\" Grid.Row=\"1\"  />\r\n            <ComboBox ItemTemplate=\"{StaticResource LeftRightComboTemplate}\"\r\n                    ItemsSource=\"{StaticResource LeftRightDockOptions}\"\r\n                    SelectedValue=\"{Binding Settings.ExplorerPanelPosition}\"\r\n                    Margin=\"5\" Grid.Column=\"1\" Grid.Row=\"1\" />\r\n            <TextBlock Text=\"{DynamicResource LOCWidth}\" Grid.Column=\"2\" Grid.Row=\"1\"\r\n                       VerticalAlignment=\"Center\" Margin=\"15,0,5,0\"/>\r\n            <pctrls:NullIntNumericBox MinValue=\"50\" MaxValue=\"4096\" Width=\"50\"\r\n                                Grid.Column=\"3\" Grid.Row=\"1\"\r\n                                Value=\"{Binding Settings.ExplorerPanelWitdh}\"\r\n                                VerticalAlignment=\"Center\"/>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsGridViewDetailsPosition}\"\r\n                    VerticalAlignment=\"Center\"\r\n                    Grid.Column=\"0\" Grid.Row=\"2\"  />\r\n            <ComboBox ItemTemplate=\"{StaticResource LeftRightComboTemplate}\"\r\n                    ItemsSource=\"{StaticResource LeftRightDockOptions}\"\r\n                    SelectedValue=\"{Binding Settings.GridViewDetailsPosition}\"\r\n                    Margin=\"5\" Grid.Column=\"1\" Grid.Row=\"2\" />\r\n            <TextBlock Text=\"{DynamicResource LOCWidth}\" Grid.Column=\"2\" Grid.Row=\"2\"\r\n                       VerticalAlignment=\"Center\" Margin=\"15,0,5,0\"/>\r\n            <pctrls:NullIntNumericBox MinValue=\"50\" MaxValue=\"4096\" Width=\"50\"\r\n                                    Grid.Column=\"3\" Grid.Row=\"2\"\r\n                                    Value=\"{Binding Settings.GrdiDetailsWitdh}\"\r\n                                    VerticalAlignment=\"Center\"/>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsDetailsGameListPosition}\"\r\n                        VerticalAlignment=\"Center\"\r\n                        Grid.Column=\"0\" Grid.Row=\"3\"  />\r\n            <ComboBox ItemTemplate=\"{StaticResource LeftRightComboTemplate}\"\r\n                    ItemsSource=\"{StaticResource LeftRightDockOptions}\"\r\n                    SelectedValue=\"{Binding Settings.DetailsListPosition}\"\r\n                    Margin=\"5\" Grid.Column=\"1\" Grid.Row=\"3\" />\r\n            <TextBlock Text=\"{DynamicResource LOCWidth}\" Grid.Column=\"2\" Grid.Row=\"3\"\r\n                       VerticalAlignment=\"Center\" Margin=\"15,0,5,0\"/>\r\n            <pctrls:NullIntNumericBox MinValue=\"50\" MaxValue=\"4096\" Width=\"50\"\r\n                                Grid.Column=\"3\" Grid.Row=\"3\"\r\n                                Value=\"{Binding Settings.DetailsListWitdh}\"\r\n                                VerticalAlignment=\"Center\"/>\r\n        </Grid>\r\n\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsDrawPanelSeparators}\" Margin=\"0,15,0,0\"\r\n                  IsChecked=\"{Binding Settings.ShowPanelSeparators}\" />\r\n    </StackPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceLayout.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for AppearanceLayout.xaml\r\n    /// </summary>\r\n    public partial class AppearanceLayout : UserControl\r\n    {\r\n        public AppearanceLayout()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceListView.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.AppearanceListView\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n    </UserControl.Resources>\r\n\r\n    <StackPanel Margin=\"20\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"{DynamicResource LOCScrollingSensitivity}\" />\r\n            <Slider Width=\"200\" Minimum=\"0.5\" Maximum=\"10\" SmallChange=\"0.5\" LargeChange=\"0.5\"\r\n                    IsSnapToTickEnabled=\"True\" TickFrequency=\"0.5\"\r\n                    HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Margin=\"10,0,10,0\"\r\n                    Value=\"{Binding Settings.ListViewScrollSensitivity}\" />\r\n        </StackPanel>\r\n\r\n        <CheckBox Content=\"{DynamicResource LOCSmoothScrolling}\" Margin=\"0,10,0,0\"\r\n                  Name=\"CheckSmoothScroll\"\r\n                  IsChecked=\"{Binding Settings.ListViewSmoothScrollEnabled}\"/>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"25,10,0,0\"\r\n                    IsEnabled=\"{Binding IsChecked, ElementName=CheckSmoothScroll}\">\r\n            <TextBlock Text=\"{DynamicResource LOCSmoothScrollingSpeed}\" />\r\n            <Slider Width=\"200\" Minimum=\"1000000\" Maximum=\"10000000\" SmallChange=\"500000\" LargeChange=\"500000\"\r\n                    IsSnapToTickEnabled=\"True\" TickFrequency=\"500000\"\r\n                    HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Margin=\"10,0,10,0\"\r\n                    Value=\"{Binding Settings.ListViewScrollSpeed}\" />\r\n        </StackPanel>\r\n    </StackPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceListView.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for AppearanceDetailsView.xaml\r\n    /// </summary>\r\n    public partial class AppearanceListView : UserControl\r\n    {\r\n        public AppearanceListView()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceTopPanel.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.AppearanceTopPanel\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             xmlns:sysCtrls=\"clr-namespace:System.Windows.Controls;assembly=PresentationFramework\"\r\n             xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n             xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\r\n\r\n    <UserControl.Resources>\r\n        <x:Array x:Key=\"LeftRightDockOptions\" Type=\"{x:Type sys:Enum}\">\r\n            <sysCtrls:Dock>Left</sysCtrls:Dock>\r\n            <sysCtrls:Dock>Right</sysCtrls:Dock>\r\n        </x:Array>\r\n        <DataTemplate x:Key=\"LeftRightComboTemplate\">\r\n            <TextBlock Text=\"{Binding Converter={pcon:DockToStringConverter}}\"/>\r\n        </DataTemplate>\r\n    </UserControl.Resources>\r\n    \r\n    <StackPanel Margin=\"20\">\r\n        <TextBlock Text=\"{DynamicResource LOCSettingsTopPanelItems}\" Style=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <UniformGrid Columns=\"3\">\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelGeneralViewItem}\"\r\n                  Content=\"{DynamicResource LOCSettingsTopPanelGeneralViewItem}\" Margin=\"5\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelGroupingItem}\"\r\n                  Content=\"{DynamicResource LOCSettingsTopPanelGroupingItem}\" Margin=\"5\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelSortingItem}\"\r\n                  Content=\"{DynamicResource LOCSettingsTopPanelSortingItem}\" Margin=\"5\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelFilterPresetsItem}\"\r\n                  Content=\"{DynamicResource LOCSettingsTopPanelFilterPresetsItem}\" Margin=\"5\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelDetailsViewSwitch}\"\r\n                  Content=\"{DynamicResource LOCDetailsViewLabel}\" Margin=\"5\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelGridViewSwitch}\"\r\n                  Content=\"{DynamicResource LOCGridViewLabel}\" Margin=\"5\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelListViewSwitch}\"\r\n                  Content=\"{DynamicResource LOCListViewLabel}\" Margin=\"5\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelExplorerSwitch}\"\r\n                  Content=\"{DynamicResource LOCTopPanelExplorerSwitch}\" Margin=\"5\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelSelectRandomGameButton}\"\r\n                  Content=\"{DynamicResource LOCTopPanelSelectRandomGameButton}\" Margin=\"5\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelSearchBox}\"\r\n                  Content=\"{DynamicResource LOCTopPanelSearchBox}\" Margin=\"5\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelSearchButton}\"\r\n                  Content=\"{DynamicResource LOCTopPanelSearchButton}\" Margin=\"5\" />\r\n            <CheckBox IsChecked=\"{Binding Settings.ShowTopPanelViewSelectRandomGameButton}\"\r\n                  Content=\"{DynamicResource LOCTopPanelViewSelectRandomGameButton}\" Margin=\"5\" />\r\n        </UniformGrid>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\">\r\n            <TextBlock Text=\"{DynamicResource LOCTopPanelPluginPanelPosition}\"\r\n                       Margin=\"0,0,5,0\" Style=\"{StaticResource BaseTextBlockStyle}\" VerticalAlignment=\"Center\"  />\r\n            <ComboBox ItemTemplate=\"{StaticResource LeftRightComboTemplate}\"\r\n                  ItemsSource=\"{StaticResource LeftRightDockOptions}\"\r\n                  SelectedValue=\"{Binding Settings.PluginTopPanelAlignment}\"\r\n                  HorizontalAlignment=\"Left\" />\r\n        </StackPanel>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\">\r\n            <TextBlock Text=\"{DynamicResource LOCTopPanelSeparatorWidth}\"\r\n                       Margin=\"0,0,5,0\" Style=\"{StaticResource BaseTextBlockStyle}\" VerticalAlignment=\"Center\"  />\r\n            <pctrls:DoubleNumericBox MinValue=\"0\" MaxValue=\"9999\" \r\n                                     Value=\"{Binding Settings.TopPanelSectionSeparatorWidth}\"\r\n                                     VerticalAlignment=\"Center\" Width=\"50\"/>\r\n        </StackPanel>\r\n\r\n        <CheckBox Content=\"{DynamicResource LOCTopPanelMainButtonMove}\" Margin=\"0,15,0,0\"\r\n                  IsChecked=\"{Binding Settings.MainMenuButtonSidebarMove}\" />\r\n    </StackPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/AppearanceTopPanel.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for EmptyParent.xaml\r\n    /// </summary>\r\n    public partial class AppearanceTopPanel : UserControl\r\n    {\r\n        public AppearanceTopPanel()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Backup.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.Backup\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\" \r\n             xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"       \r\n             xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"     \r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </UserControl.Resources>\r\n\r\n    <StackPanel Margin=\"15\">\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsEnableAutomaticBackup}\" \r\n                  Name=\"CheckAutomaticBackup\"\r\n                  IsChecked=\"{Binding Settings.AutoBackupEnabled}\"/>\r\n        <StackPanel Margin=\"25,10,0,0\" IsEnabled=\"{Binding IsChecked, ElementName=CheckAutomaticBackup}\">\r\n\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\"{DynamicResource LOCSettingsAutoBackupFrequency}\" VerticalAlignment=\"Center\" />\r\n                <ComboBox pbeh:SelectorBehaviors.EnumSource=\"{x:Type p:AutoBackupFrequency}\"\r\n                          SelectedValue=\"{Binding Settings.AutoBackupFrequency}\"\r\n                          VerticalAlignment=\"Center\" Margin=\"10,0,0,0\"/>\r\n            </StackPanel>\r\n\r\n            <StackPanel Orientation=\"Horizontal\" Margin=\"0,10,0,0\">\r\n                <TextBlock Text=\"{DynamicResource LOCSettingsBackupFolder}\" VerticalAlignment=\"Center\" />\r\n                <pctrls:PathSelectionBox Width=\"400\" Margin=\"10,0,0,0\"\r\n                                         ShowDirectorySelector=\"True\" VerticalAlignment=\"Center\"\r\n                                         Text=\"{Binding Settings.AutoBackupDir}\"/>\r\n            </StackPanel>\r\n\r\n            <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,10\">\r\n                <TextBlock Text=\"{DynamicResource LOCSettingsRotatingBackups}\" VerticalAlignment=\"Center\" />\r\n                <TextBlock Text=\"{Binding Value, ElementName=SliderRotatingBackup}\"\r\n                           Margin=\"10,0,10,0\" Width=\"20\" VerticalAlignment=\"Center\"/>\r\n                <Slider Minimum=\"0\" Maximum=\"10\" IsSnapToTickEnabled=\"True\" TickFrequency=\"1\"\r\n                        Width=\"200\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\"\r\n                        Name=\"SliderRotatingBackup\"\r\n                        Value=\"{Binding Settings.RotatingBackups}\"/>\r\n            </StackPanel>\r\n\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsAutoBackupIncludeItems}\" Margin=\"0,5,0,10\" />\r\n            <CheckBox Content=\"{DynamicResource LOCBackupOptionGameMedia}\" Margin=\"20,0,0,10\"\r\n                      IsChecked=\"{Binding Settings.AutoBackupIncludeLibFiles}\"/>\r\n            <CheckBox Content=\"{DynamicResource LOCBackupOptionExtensions}\" Margin=\"20,0,0,10\"\r\n                      IsChecked=\"{Binding Settings.AutoBackupIncludeExtensions}\"/>\r\n            <CheckBox Content=\"{DynamicResource LOCBackupOptionThemes}\" Margin=\"20,0,0,10\"\r\n                      IsChecked=\"{Binding Settings.AutoBackupIncludeThemes}\"/>\r\n            <CheckBox Content=\"{DynamicResource LOCBackupOptionExtensionsData}\" Margin=\"20,0,0,10\"\r\n                      IsChecked=\"{Binding Settings.AutoBackupIncludeExtensionsData}\"/>\r\n        </StackPanel>\r\n\r\n        <Button Content=\"{DynamicResource LOCMenuHelpTitle}\"\r\n                Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                CommandParameter=\"{}{DocsRootUrl}/manual/backup.html\"\r\n                HorizontalAlignment=\"Left\" Margin=\"0,20,0,0\" MinWidth=\"80\" />\r\n    </StackPanel>\r\n</UserControl>"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Backup.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace Playnite.DesktopApp.Controls.SettingsSections\n{\n    /// <summary>\n    /// Interaction logic for Sorting.xaml\n    /// </summary>\n    public partial class Backup : UserControl\n    {\n        public Backup()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/ClientShutdown.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.ClientShutdown\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n    \r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n    </UserControl.Resources>\r\n\r\n    <StackPanel Margin=\"20\">\r\n        <CheckBox Name=\"CheckShutDownClients\"\r\n                  Content=\"{DynamicResource LOCSettingsAutoCloseLauncherOption}\"\r\n                  IsChecked=\"{Binding Settings.ClientAutoShutdown.ShutdownClients}\"/>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\"\r\n                    IsEnabled=\"{Binding IsChecked, ElementName=CheckShutDownClients}\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsAutoCloseGracePeriod}\"\r\n                       VerticalAlignment=\"Center\"/>\r\n            <pctrls:NullIntNumericBox MinValue=\"0\" MaxValue=\"4096\" Margin=\"10,0,0,0\" Width=\"40\"\r\n                                   HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\"\r\n                                   Value=\"{Binding Settings.ClientAutoShutdown.GraceTimeout}\"/>\r\n        </StackPanel>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\"\r\n                    IsEnabled=\"{Binding IsChecked, ElementName=CheckShutDownClients}\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsAutoCloseMinimalSessionTime}\"\r\n                       VerticalAlignment=\"Center\"/>\r\n            <pctrls:NullIntNumericBox MinValue=\"0\" MaxValue=\"4096\" Margin=\"10,0,0,0\" Width=\"40\"\r\n                                   HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\"\r\n                                   Value=\"{Binding Settings.ClientAutoShutdown.MinimalSessionTime}\"/>\r\n        </StackPanel>\r\n\r\n        <TextBlock Text=\"{DynamicResource LOCSettingsAutoCloseSpecificClients}\" Margin=\"0,20,0,0\"\r\n                   IsEnabled=\"{Binding IsChecked, ElementName=CheckShutDownClients}\"/>\r\n\r\n        <ItemsControl Margin=\"2,10,0,0\" HorizontalAlignment=\"Left\"\r\n                      ItemsSource=\"{Binding AutoCloseClientsList}\"\r\n                      IsEnabled=\"{Binding IsChecked, ElementName=CheckShutDownClients}\">\r\n            <ItemsControl.ItemTemplate>\r\n                <DataTemplate>\r\n                    <CheckBox Content=\"{Binding Item.Name}\" IsChecked=\"{Binding Selected}\"\r\n                              Margin=\"0,0,0,7\" />\r\n                </DataTemplate>\r\n            </ItemsControl.ItemTemplate>\r\n        </ItemsControl>\r\n    </StackPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/ClientShutdown.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for EmptyParent.xaml\r\n    /// </summary>\r\n    public partial class ClientShutdown : UserControl\r\n    {\r\n        public ClientShutdown()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Development.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.Development\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             xmlns:scm=\"clr-namespace:System.ComponentModel;assembly=WindowsBase\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <StackPanel Margin=\"5\">\r\n        <StackPanel.Resources>\r\n            <p:BindingProxy x:Key=\"Proxy\" Data=\"{Binding}\" />\r\n            <CollectionViewSource x:Key=\"DevelExtenionsSource\" Source=\"{Binding Settings.DevelExtenions}\">\r\n                <CollectionViewSource.SortDescriptions>\r\n                    <scm:SortDescription PropertyName=\"Item\" />\r\n                </CollectionViewSource.SortDescriptions>\r\n            </CollectionViewSource>\r\n        </StackPanel.Resources>\r\n        <TextBlock Margin=\"0,0,0,5\" Text=\"{DynamicResource LOCSettingsExternalExtensions}\" Style=\"{DynamicResource BaseTextBlockStyle}\" />\r\n        <ListView DockPanel.Dock=\"Top\" Name=\"ListDevelExtensions\" Height=\"300\"\r\n                  ItemsSource=\"{Binding Source={StaticResource DevelExtenionsSource}}\">\r\n            <ListView.ItemContainerStyle>\r\n                <Style TargetType=\"{x:Type ListViewItem}\" BasedOn=\"{StaticResource {x:Type ListViewItem}}\">\r\n                    <Setter Property=\"Focusable\" Value=\"False\"/>\r\n                </Style>\r\n            </ListView.ItemContainerStyle>\r\n            <ListView.View>\r\n                <GridView>\r\n                    <GridViewColumn Width=\"70\" Header=\"{DynamicResource LOCEnabledTitle}\">\r\n                        <GridViewColumn.CellTemplate>\r\n                            <DataTemplate>\r\n                                <CheckBox IsChecked=\"{Binding Selected}\" />\r\n                            </DataTemplate>\r\n                        </GridViewColumn.CellTemplate>\r\n                    </GridViewColumn>\r\n                    <GridViewColumn Width=\"400\" Header=\"{DynamicResource LOCPathLabel}\">\r\n                        <GridViewColumn.CellTemplate>\r\n                            <DataTemplate>\r\n                                <pctrls:PathSelectionBox Text=\"{Binding Item}\" ShowDirectorySelector=\"True\" />\r\n                            </DataTemplate>\r\n                        </GridViewColumn.CellTemplate>\r\n                    </GridViewColumn>\r\n                    <GridViewColumn>\r\n                        <GridViewColumn.CellTemplate>\r\n                            <DataTemplate>\r\n                                <Button FontFamily=\"Marlett\" Content=\"r\"\r\n                                        Command=\"{Binding Data.RemoveDevelExtensionCommand, Source={StaticResource Proxy}}\"\r\n                                        CommandParameter=\"{Binding}\" />\r\n                            </DataTemplate>\r\n                        </GridViewColumn.CellTemplate>\r\n                    </GridViewColumn>\r\n                </GridView>\r\n            </ListView.View>\r\n        </ListView>\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"0,5,0,0\" MinWidth=\"80\"\r\n                    Command=\"{Binding AddDevelExtensionCommand}\" />\r\n        </StackPanel>\r\n        <CheckBox Content=\"{DynamicResource LOCDevelTraceLogEnable}\" Margin=\"0,15,0,0\"\r\n                  IsChecked=\"{Binding Settings.TraceLogEnabled}\" />\r\n    </StackPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Development.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Input.xaml\r\n    /// </summary>\r\n    public partial class Development : UserControl\r\n    {\r\n        public Development()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/EmptyParent.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.EmptyParent\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\r\n    <Grid>\r\n        <TextBlock Text=\"{DynamicResource LOCSettingsSelectChildSection}\"\r\n                   Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />\r\n    </Grid>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/EmptyParent.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for EmptyParent.xaml\r\n    /// </summary>\r\n    public partial class EmptyParent : UserControl\r\n    {\r\n        public EmptyParent()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/ErrorLoading.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.ErrorLoading\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\r\n    <Grid>\r\n        <TextBlock Text=\"{DynamicResource LOCSettingsErrorLoadingSettings}\"\r\n                   Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" TextWrapping=\"Wrap\" />\r\n    </Grid>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/ErrorLoading.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for EmptyParent.xaml\r\n    /// </summary>\r\n    public partial class ErrorLoading : UserControl\r\n    {\r\n        public ErrorLoading()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/General.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.General\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n             xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n             xmlns:sdk=\"clr-namespace:Playnite.SDK;assembly=Playnite.SDK\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"600\" d:DesignWidth=\"600\">\r\n    \r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n    </UserControl.Resources>\r\n\r\n    <ScrollViewer VerticalScrollBarVisibility=\"Auto\" HorizontalScrollBarVisibility=\"Disabled\">\r\n    <StackPanel Margin=\"20\">\r\n        <DockPanel Margin=\"0,0,0,10\" LastChildFill=\"False\">\r\n            <ContentControl Content=\"{DynamicResource LOCLanguageSettingsLabel}\" \r\n                            ContentStringFormat=\"{}{0} *\"\r\n                            VerticalAlignment=\"Center\" Margin=\"5,0,10,0\" />\r\n            <ComboBox Name=\"ComboLanguage\" VerticalAlignment=\"Center\"\r\n                      SelectedValue=\"{Binding Settings.Language}\"\r\n                      SelectedValuePath=\"Id\" DisplayMemberPath=\"DisplayString\"\r\n                      ItemsSource=\"{Binding AvailableLanguages}\"/>\r\n            <TextBlock Margin=\"20,0,0,0\" VerticalAlignment=\"Center\">\r\n                <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                            CommandParameter=\"https://crowdin.com/project/playnite\">\r\n                    <Run Text=\"{DynamicResource LOCSettingsCreateLocalization}\" />\r\n                </Hyperlink>\r\n            </TextBlock>\r\n        </DockPanel>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"5,15,5,0\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsAfterGameStart}\" Margin=\"0,0,5,0\"\r\n                       VerticalAlignment=\"Center\" />\r\n                <ComboBox ToolTipService.InitialShowDelay=\"0\" VerticalAlignment=\"Center\"\r\n                          ToolTip=\"{DynamicResource LOCSettingsClosePlaytimeNotif}\"\r\n                          SelectedValue=\"{Binding Settings.AfterLaunch}\"\r\n                          pbeh:SelectorBehaviors.EnumSource=\"{x:Type p:AfterLaunchOptions}\"/>\r\n            </StackPanel>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"5,10,5,5\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsAfterGameClose}\" Margin=\"0,0,5,0\"\r\n                       VerticalAlignment=\"Center\" />\r\n                <ComboBox SelectedValue=\"{Binding Settings.AfterGameClose}\"\r\n                          pbeh:SelectorBehaviors.EnumSource=\"{x:Type p:AfterGameCloseOptions}\"/>\r\n        </StackPanel>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"5,20,0,0\" >\r\n            <CheckBox Name=\"CheckEnableTray\" VerticalAlignment=\"Center\"\r\n                    IsChecked=\"{Binding Settings.EnableTray}\"\r\n                    Content=\"{DynamicResource LOCSettingsShowTray}\"\r\n                    ContentStringFormat=\"{}{0} *\" />\r\n            <ComboBox Margin=\"5,0,0,0\" VerticalAlignment=\"Center\"\r\n                    ItemsSource=\"{Binding AvailableTrayIcons}\"\r\n                    SelectedValue=\"{Binding Settings.TrayIcon}\"\r\n                    SelectedValuePath=\"TrayIcon\"\r\n                    IsEnabled=\"{Binding Settings.EnableTray}\">\r\n                <ComboBox.ItemTemplate>\r\n                    <DataTemplate>\r\n                        <Image RenderOptions.BitmapScalingMode=\"Fant\"\r\n                                VerticalAlignment=\"Center\" Height=\"16\" Margin=\"5\"\r\n                                Source=\"{Binding ImageSource}\" />\r\n                    </DataTemplate>\r\n                </ComboBox.ItemTemplate>\r\n            </ComboBox>\r\n        </StackPanel>\r\n        <CheckBox Name=\"CheckMinimizeToTray\" Content=\"{DynamicResource LOCSettingsMinimizeToTray}\" Margin=\"25,10,5,5\"\r\n                IsChecked=\"{Binding Settings.MinimizeToTray}\"\r\n                IsEnabled=\"{Binding IsChecked, ElementName=CheckEnableTray}\" />\r\n        <CheckBox Name=\"CheckCloseToTray\" Content=\"{DynamicResource LOCSettingsCloseToTray}\" Margin=\"25,5,5,5\"\r\n                IsChecked=\"{Binding Settings.CloseToTray}\"\r\n                IsEnabled=\"{Binding IsChecked, ElementName=CheckEnableTray}\" />\r\n\r\n        <CheckBox Name=\"CheckDownloadMetadataOnImport\" Margin=\"5,15,5,5\"\r\n                Content=\"{DynamicResource LOCSettingsDownloadMetadataOnImport}\" \r\n                IsChecked=\"{Binding Settings.DownloadMetadataOnImport}\"/>\r\n\r\n        <CheckBox Name=\"CheckStartFullscreen\" Margin=\"5,15,5,5\"\r\n                Content=\"{DynamicResource LOCSettingsStartInFullscreen}\"\r\n                IsChecked=\"{Binding Settings.StartInFullscreen}\"/>\r\n\r\n        <CheckBox Name=\"CheckStartOnBoot\" Margin=\"5,15,5,5\"\r\n                Content=\"{DynamicResource LOCSettingsStartOnBoot}\"\r\n                IsChecked=\"{Binding Settings.StartOnBoot}\"/>\r\n        \r\n        <CheckBox Name=\"CheckStartOnBootClosedToTray\" Margin=\"25,15,5,5\"\r\n                  IsEnabled=\"{Binding IsChecked, ElementName=CheckStartOnBoot}\"\r\n                  Content=\"{DynamicResource LOCSettingsStartOnBootClosedToTray}\"\r\n                  IsChecked=\"{Binding Settings.StartOnBootClosedToTray}\"/>\r\n\r\n        <CheckBox Name=\"CheckStartMinimized\" Margin=\"5,15,5,5\"\r\n                Content=\"{DynamicResource LOCSettingsStartMinimized}\"\r\n                IsChecked=\"{Binding Settings.StartMinimized}\"/>\r\n\r\n        <CheckBox Name=\"CheckScanLibInstallSizeOnLibUpdate\" Margin=\"5,15,5,5\"\r\n                Content=\"{DynamicResource LOCSettingsScanLibInstallSizeOnLibUpdate}\"\r\n                ToolTip=\"{DynamicResource LOCSettingsScanLibInstallSizeOnLibUpdateTooltip}\"\r\n                IsChecked=\"{Binding Settings.ScanLibInstallSizeOnLibUpdate}\"/>\r\n\r\n        <CheckBox Name=\"CheckFuzzyMatchingInNameFilter\" Margin=\"5,15,5,5\"\r\n                Content=\"{DynamicResource NameFilterUseFuzzyMatching}\"\r\n                ToolTip=\"{DynamicResource NameFilterUseFuzzyMatchingTooltip}\"\r\n                IsChecked=\"{Binding Settings.FuzzyMatchingInNameFilter}\"/>\r\n        \r\n        <TextBlock Text=\"{DynamicResource LOCSettingsPlaytimeImportMode}\" Margin=\"5,15,5,0\"\r\n                   ToolTip=\"{DynamicResource LOCSettingsPlaytimeImportModeTooltip}\"\r\n                   VerticalAlignment=\"Center\" />\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"5,10,5,0\">\r\n            <ComboBox MinWidth=\"100\" VerticalAlignment=\"Center\"\r\n                  SelectedValue=\"{Binding Settings.PlaytimeImportMode}\"\r\n                  pbeh:SelectorBehaviors.EnumSource=\"{x:Type sdk:PlaytimeImportMode}\" />\r\n            <TextBlock Margin=\"20,0,0,0\" VerticalAlignment=\"Center\">\r\n                <Hyperlink Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                           CommandParameter=\"{}{DocsRootUrl}/manual/playtimeImport.html\">\r\n                    <Run Text=\"{DynamicResource LOCMenuHelpTitle}\" />\r\n                </Hyperlink>\r\n            </TextBlock>\r\n        </StackPanel>\r\n    </StackPanel>\r\n    </ScrollViewer>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/General.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for General.xaml\r\n    /// </summary>\r\n    public partial class General : UserControl\r\n    {\r\n        public General()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/GeneralAdvanced.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.GeneralAdvanced\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n    </UserControl.Resources>\r\n\r\n    <StackPanel Margin=\"20\">\r\n        <CheckBox Content=\"Discord Rich Presence\"\r\n                  IsChecked=\"{Binding Settings.DiscordPresenceEnabled}\" />\r\n        <CheckBox IsChecked=\"{Binding Settings.ShowElevatedRightsWarning}\" Margin=\"0,15,0,0\"\r\n                  Content=\"{DynamicResource LOCElevatedProcessWarningShowOption}\"/>\r\n        <CheckBox IsChecked=\"{Binding Settings.InstallSizeScanUseSizeOnDisk}\" Margin=\"0,15,0,0\"\r\n                  Content=\"{DynamicResource LOCInstallSizeScanUseSizeOnDiskOption}\"\r\n                  ToolTip=\"{DynamicResource LOCInstallSizeScanUseSizeOnDiskOptionTooltip}\"/>\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\">\r\n            <TextBlock Text=\"{DynamicResource LOCOpenDirectoryCommand}\" VerticalAlignment=\"Center\"/>\r\n            <TextBox Text=\"{Binding Settings.DirectoryOpenCommand}\"\r\n                     Margin=\"10,0,0,0\" Width=\"250\"/>\r\n            <TextBlock VerticalAlignment=\"Center\" Margin=\"10,0,0,0\">\r\n                <Hyperlink NavigateUri=\"https://github.com/JosefNemec/Playnite/wiki/Custom-directory-open-command\"\r\n                           Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                           CommandParameter=\"{Binding NavigateUri, RelativeSource={RelativeSource Self}}\">\r\n                    <Run Text=\"{DynamicResource LOCWhatIsThis}\" />\r\n                </Hyperlink>\r\n            </TextBlock>\r\n        </StackPanel>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\">            \r\n            <ContentControl Content=\"{DynamicResource LOCSettingsAccessibilityInterface}\"\r\n                            ContentStringFormat=\"{}{0} *\" VerticalAlignment=\"Center\"/>\r\n            <ComboBox Margin=\"10,0,0,0\" MinWidth=\"100\"\r\n                      SelectedValue=\"{Binding Settings.AccessibilityInterface}\"\r\n                      pbeh:SelectorBehaviors.EnumSource=\"{x:Type p:AccessibilityInterfaceOptions}\" />\r\n        </StackPanel>\r\n\r\n        <Button Name=\"ButtonClearWebCace\" Content=\"{DynamicResource LOCSettingsClearWebCache}\"\r\n                HorizontalAlignment=\"Left\" Margin=\"0,45,0,0\"\r\n                ToolTip=\"{DynamicResource LOCSettingsClearWebCacheTooltip}\" ToolTipService.InitialShowDelay=\"0\"\r\n                Command=\"{Binding ClearWebCacheCommand}\"/>\r\n\r\n        <Button Content=\"{DynamicResource LOCSettingsReset}\" Margin=\"0,10,0,0\"\r\n                HorizontalAlignment=\"Left\" Command=\"{Binding SetDefaultsCommand}\"/>\r\n        \r\n        <DockPanel Margin=\"0,20,0,0\">\r\n            <ContentControl Content=\"{DynamicResource LOCSettingsDBLocation}\"\r\n                            ContentStringFormat=\"{}{0} *\" \r\n                            DockPanel.Dock=\"Left\" VerticalAlignment=\"Center\"/>\r\n            <Button Name=\"ButtonBrowserDbFile\" Content=\"{DynamicResource LOCChange}\"\r\n                    DockPanel.Dock=\"Right\" Padding=\"5,0,5,0\"\r\n                    Command=\"{Binding SelectDbFileCommand}\"/>\r\n            <TextBox Name=\"TextDatabase\" Text=\"{Binding Settings.DatabasePath}\"\r\n                    DockPanel.Dock=\"Left\" Margin=\"10,0,10,0\"\r\n                    IsReadOnly=\"True\"/>\r\n        </DockPanel>\r\n    </StackPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/GeneralAdvanced.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for GeneralAdvanced.xaml\r\n    /// </summary>\r\n    public partial class GeneralAdvanced : UserControl\r\n    {\r\n        public GeneralAdvanced()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/ImportExlusionList.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.ImportExlusionList\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <DockPanel Margin=\"5\">\r\n        <StackPanel DockPanel.Dock=\"Bottom\" Orientation=\"Horizontal\">\r\n            <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"0,5,0,0\"\r\n                    Command=\"{Binding RemoveImportExclusionItemCommand}\" \r\n                    CommandParameter=\"{Binding SelectedItems, ElementName=ListImportExclusionList}\"/>\r\n        </StackPanel>\r\n        <DataGrid SelectionMode=\"Extended\" ItemsSource=\"{Binding ImportExclusionList}\"\r\n                  CanUserAddRows=\"False\" AutoGenerateColumns=\"False\" CanUserResizeRows=\"False\" CanUserSortColumns=\"True\"   \r\n                  GridLinesVisibility=\"None\" BorderThickness=\"0\"\r\n                  Name=\"ListImportExclusionList\" DockPanel.Dock=\"Top\">\r\n            <DataGrid.Columns>\r\n                <DataGridTextColumn Header=\"{DynamicResource LOCNameLabel}\" Binding=\"{Binding Name}\" IsReadOnly=\"True\" />\r\n                <DataGridTextColumn Header=\"{DynamicResource LOCGameId}\" Binding=\"{Binding GameId}\" IsReadOnly=\"True\" />\r\n                <DataGridTextColumn Header=\"{DynamicResource LOCGameProviderTitle}\" Binding=\"{Binding LibraryName}\" IsReadOnly=\"True\" />\r\n                <DataGridTextColumn Header=\"{DynamicResource LOCExtensionID}\" Binding=\"{Binding LibraryId}\" IsReadOnly=\"True\" />\r\n            </DataGrid.Columns>\r\n        </DataGrid>\r\n    </DockPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/ImportExlusionList.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Input.xaml\r\n    /// </summary>\r\n    public partial class ImportExlusionList : UserControl\r\n    {\r\n        public ImportExlusionList()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Input.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.Input\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n    </UserControl.Resources>\r\n\r\n    <StackPanel Margin=\"20\">\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsControllerApi}\"\r\n                ContentStringFormat=\"{}{0} *\"\r\n                Name=\"CheckXInputEnabled\"\r\n                IsChecked=\"{Binding Settings.EnableGameControllerSupport}\"/>\r\n        <ItemsControl Margin=\"25,15,0,0\" ItemsSource=\"{Binding Controllers}\">\r\n            <ItemsControl.ItemTemplate>\r\n                <DataTemplate>\r\n                    <CheckBox IsChecked=\"{Binding Enabled}\" Content=\"{Binding Name}\" />\r\n                </DataTemplate>\r\n            </ItemsControl.ItemTemplate>\r\n        </ItemsControl>\r\n    </StackPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Input.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Input.xaml\r\n    /// </summary>\r\n    public partial class Input : UserControl\r\n    {\r\n        public Input()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/LibrariesConfigWindowInfo.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.LibrariesConfigWindowInfo\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\r\n    <Grid>\r\n        <TextBlock Text=\"{DynamicResource LOCLibrariesConfigWindowDescription}\"\r\n                   Style=\"{DynamicResource BaseTextBlockStyle}\" Margin=\"30\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" TextWrapping=\"Wrap\" />\r\n    </Grid>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/LibrariesConfigWindowInfo.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for EmptyParent.xaml\r\n    /// </summary>\r\n    public partial class LibrariesConfigWindowInfo : UserControl\r\n    {\r\n        public LibrariesConfigWindowInfo()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Metadata.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.Metadata\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n             xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n             xmlns:pm=\"clr-namespace:Playnite.SDK.Models;assembly=Playnite.SDK\"\r\n             xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n        <ObjectDataProvider MethodName=\"GetValues\" ObjectType=\"{x:Type sys:Enum}\"\r\n                            x:Key=\"AgeRatingOrgValues\">\r\n            <ObjectDataProvider.MethodParameters>\r\n                <x:Type TypeName=\"pm:AgeRatingOrg\" />\r\n            </ObjectDataProvider.MethodParameters>\r\n        </ObjectDataProvider>\r\n    </UserControl.Resources>\r\n\r\n    <TabControl>\r\n        <TabItem Header=\"{DynamicResource LOCGeneralLabel}\">\r\n            <DockPanel Margin=\"10\">\r\n                <TextBlock Text=\"{DynamicResource LOCSettingsDefaultMetadataDescription}\"\r\n                           DockPanel.Dock=\"Top\" TextWrapping=\"Wrap\" Margin=\"0,0,0,10\" />\r\n                <CheckBox Content=\"{DynamicResource LOCSettingsImmediateBackgroundDownload}\"\r\n                          ToolTipService.InitialShowDelay=\"0\"\r\n                          ToolTipService.ShowDuration=\"30000\"\r\n                          IsChecked=\"{Binding Settings.DownloadBackgroundsImmediately}\"\r\n                          DockPanel.Dock=\"Top\">\r\n                    <CheckBox.ToolTip>\r\n                        <TextBlock MaxWidth=\"600\" TextWrapping=\"Wrap\"\r\n                                   Text=\"{DynamicResource LOCSettingsImmediateBackgroundDownloadTooltip}\" />\r\n                    </CheckBox.ToolTip>\r\n                </CheckBox>\r\n\r\n                <StackPanel Margin=\"0,10,0,0\" Orientation=\"Horizontal\"\r\n                            DockPanel.Dock=\"Top\">\r\n                    <TextBlock Text=\"{DynamicResource LOCSettingsPreferredAgeRatingOrg}\" Margin=\"0,0,5,0\" \r\n                               VerticalAlignment=\"Center\"/>\r\n                    <ComboBox SelectedValue=\"{Binding Settings.AgeRatingOrgPriority}\"\r\n                              ItemsSource=\"{Binding Source={StaticResource AgeRatingOrgValues}}\" />\r\n                </StackPanel>\r\n\r\n                <ScrollViewer DockPanel.Dock=\"Top\" Margin=\"0,10,0,0\">\r\n                    <pctrls:MetadataDownloadSettings Settings=\"{Binding Settings.MetadataSettings}\" />\r\n                </ScrollViewer>\r\n            </DockPanel>\r\n        </TabItem>\r\n\r\n        <TabItem Header=\"{DynamicResource LOCSettingsWebImageSearch}\">\r\n            <StackPanel>\r\n                <GridEx ColumnCount=\"2\" RowCount=\"3\" AutoLayoutColumns=\"2\" StarColumns=\"1\"\r\n                        Margin=\"10\">\r\n                    <TextBlock Margin=\"5\" VerticalAlignment=\"Center\" Text=\"{DynamicResource LOCSettingsWebImageSearchIconTerm}\" />\r\n                    <TextBox Margin=\"5\" Text=\"{Binding Settings.WebImageSarchIconTerm}\" />\r\n                    <TextBlock Margin=\"5\" VerticalAlignment=\"Center\" Text=\"{DynamicResource LOCSettingsWebImageSearchCoverTerm}\" />\r\n                    <TextBox Margin=\"5\" Text=\"{Binding Settings.WebImageSarchCoverTerm}\" />\r\n                    <TextBlock Margin=\"5\" VerticalAlignment=\"Center\" Text=\"{DynamicResource LOCSettingsWebImageSearchBackground}\" />\r\n                    <TextBox Margin=\"5\" Text=\"{Binding Settings.WebImageSarchBackgroundTerm}\" />\r\n                </GridEx>\r\n                <Button Content=\"{DynamicResource LOCMenuHelpTitle}\"\r\n                        Margin=\"15,10,0,0\" HorizontalAlignment=\"Left\"\r\n                        Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                        CommandParameter=\"{}{DocsRootUrl}/manual/metadata.html#media-web-image-search\" />\r\n            </StackPanel>\r\n        </TabItem>\r\n    </TabControl>\r\n</UserControl>"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Metadata.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Metadata.xaml\r\n    /// </summary>\r\n    public partial class Metadata : UserControl\r\n    {\r\n        public Metadata()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/NoSettingsAvailable.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.NoSettingsAvailable\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.DesktopApp.Controls.SettingsSections\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\r\n    <Grid>\r\n        <TextBlock Text=\"{DynamicResource LOCSettingsNoSettingsAvailable}\"\r\n                   Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />\r\n    </Grid>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/NoSettingsAvailable.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for EmptyParent.xaml\r\n    /// </summary>\r\n    public partial class NoSettingsAvailable : UserControl\r\n    {\r\n        public NoSettingsAvailable()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Performance.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.Performance\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:playnite=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Style TargetType=\"ContentControl\">\r\n            <Setter Property=\"Template\">\r\n                <Setter.Value>\r\n                    <ControlTemplate TargetType=\"ContentControl\">\r\n                        <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n                    </ControlTemplate>\r\n                </Setter.Value>\r\n            </Setter>\r\n        </Style>\r\n    </UserControl.Resources>\r\n\r\n    <StackPanel Margin=\"15\">\r\n        <CheckBox IsChecked=\"{Binding Settings.ShowImagePerformanceWarning}\"\r\n                  Content=\"{DynamicResource LOCSettingsShowMediaSizeWarning}\"/>\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsAsyncImageLoading}\"\r\n                  ContentStringFormat=\"{}{0} *\"\r\n                  ToolTip=\"{DynamicResource LOCSettingsAsyncImageLoadingTooltip}\"\r\n                  Margin=\"0,15,0,0\"\r\n                  Name=\"CheckAsyncImages\" IsChecked=\"{Binding Settings.AsyncImageLoading}\"/>\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsDisableAcceleration}\"\r\n                  ContentStringFormat=\"{}{0} *\"\r\n                  ToolTip=\"{DynamicResource LOCSettingsDisableAccelerationTooltip}\"\r\n                  Name=\"CheckDisableAcceleration\" IsChecked=\"{Binding Settings.DisableHwAcceleration}\"\r\n                  Margin=\"0,15,0,0\"/>\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsAltWebViewRendering}\"\r\n                  ToolTip=\"{DynamicResource LOCSettingsAltWebViewRenderingTooltip}\"\r\n                  IsChecked=\"{Binding Settings.UseCompositionWebViewRenderer}\"\r\n                  Margin=\"0,15,0,0\"/>\r\n        <CheckBox Content=\"{DynamicResource LOCSettingsPartialDescriptionLoading}\"\r\n                  ToolTip=\"{DynamicResource LOCSettingsPartialDescriptionLoadingTooltip}\"\r\n                  IsChecked=\"{Binding Settings.PartialDescriptionLoading}\"\r\n                  Margin=\"0,15,0,0\"/>\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\"\r\n                    ToolTip=\"{DynamicResource LOCSettingsImageScalerModeTooltip}\"\r\n                    ToolTipService.InitialShowDelay=\"0\">\r\n            <TextBlock VerticalAlignment=\"Center\" Text=\"{DynamicResource LOCSettingsImageScalerMode}\" />\r\n            <ComboBox Margin=\"10,0,0,0\" MinWidth=\"100\"\r\n                      SelectedValue=\"{Binding Settings.ImageScalerMode}\"\r\n                      pbeh:SelectorBehaviors.EnumSource=\"{x:Type playnite:ImageLoadScaling}\" />\r\n        </StackPanel>\r\n    </StackPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Performance.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Input.xaml\r\n    /// </summary>\r\n    public partial class Performance : UserControl\r\n    {\r\n        public Performance()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Scripting.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.Scripting\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n             xmlns:psdk=\"clr-namespace:Playnite.SDK;assembly=Playnite.SDK\"\r\n             xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\" \r\n             xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"          \r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"450\" d:DesignWidth=\"500\">\r\n    \r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </UserControl.Resources>\r\n\r\n    <TabControl>\r\n        <TabItem Header=\"{DynamicResource LOCGameScripts}\">\r\n            <GridEx Margin=\"10\" RowCount=\"7\" StarRows=\"2,4,6\" AutoLayoutColumns=\"1\">\r\n                <DockPanel Margin=\"0,0,0,10\" LastChildFill=\"False\">\r\n                    <Button Content=\"{DynamicResource LOCMenuHelpTitle}\" DockPanel.Dock=\"Right\"\r\n                            VerticalAlignment=\"Center\" Margin=\"10,0,0,0\"\r\n                            Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                            CommandParameter=\"{}{DocsRootUrl}/manual/gameScripts.html\" />\r\n                    <TextBlock Text=\"{DynamicResource LOCSettingsScriptingNotice}\" VerticalAlignment=\"Center\"\r\n                               TextWrapping=\"Wrap\" DockPanel.Dock=\"Left\" />\r\n                </DockPanel>\r\n\r\n                <DockPanel Margin=\"0,5,0,5\" LastChildFill=\"False\">\r\n                    <TextBlock Text=\"{DynamicResource LOCPreScriptDescription}\" VerticalAlignment=\"Center\" />\r\n                    <Button Content=\"{DynamicResource LOCTestScript}\" DockPanel.Dock=\"Right\"\r\n                            Command=\"{Binding TestScriptCommand}\"\r\n                            CommandParameter=\"{Binding Settings.PreScript}\"/>\r\n                </DockPanel>\r\n                <TextBox AcceptsReturn=\"True\"\r\n                         FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                         HorizontalScrollBarVisibility=\"Auto\"\r\n                         VerticalScrollBarVisibility=\"Visible\"\r\n                         Text=\"{Binding Settings.PreScript, UpdateSourceTrigger=PropertyChanged}\" />\r\n\r\n                <DockPanel Margin=\"0,5,0,5\" LastChildFill=\"False\">\r\n                    <TextBlock Text=\"{DynamicResource LOCGameStartedScriptDescription}\" VerticalAlignment=\"Center\" />\r\n                    <Button Content=\"{DynamicResource LOCTestScript}\" DockPanel.Dock=\"Right\"\r\n                    Command=\"{Binding TestScriptCommand}\"\r\n                    CommandParameter=\"{Binding Settings.GameStartedScript}\"/>\r\n                </DockPanel>\r\n                <TextBox AcceptsReturn=\"True\"\r\n                         FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                         HorizontalScrollBarVisibility=\"Auto\"\r\n                         VerticalScrollBarVisibility=\"Visible\"\r\n                         Text=\"{Binding Settings.GameStartedScript, UpdateSourceTrigger=PropertyChanged}\"/>\r\n\r\n                <DockPanel Margin=\"0,5,0,5\" LastChildFill=\"False\">\r\n                    <TextBlock Text=\"{DynamicResource LOCPostScriptDescription}\" VerticalAlignment=\"Center\" />\r\n                    <Button Content=\"{DynamicResource LOCTestScript}\" DockPanel.Dock=\"Right\"\r\n                            Command=\"{Binding TestScriptCommand}\"\r\n                            CommandParameter=\"{Binding Settings.PostScript}\"/>\r\n                </DockPanel>\r\n                <TextBox AcceptsReturn=\"True\"\r\n                         FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                         HorizontalScrollBarVisibility=\"Auto\"\r\n                         VerticalScrollBarVisibility=\"Visible\"\r\n                         Text=\"{Binding Settings.PostScript, UpdateSourceTrigger=PropertyChanged}\"/>\r\n            </GridEx>\r\n        </TabItem>\r\n        <TabItem Header=\"{DynamicResource LOCApplicationScripts}\">\r\n            <GridEx Margin=\"10\" RowCount=\"4\" StarRows=\"1,3\" AutoLayoutColumns=\"1\">\r\n                <DockPanel Margin=\"0,5,0,5\" LastChildFill=\"False\">\r\n                    <TextBlock Text=\"{DynamicResource LOCAppScriptStartupDescription}\" VerticalAlignment=\"Center\" />\r\n                    <Button Content=\"{DynamicResource LOCTestScript}\" DockPanel.Dock=\"Right\"\r\n                            Command=\"{Binding TestScriptCommand}\"\r\n                            CommandParameter=\"{Binding Settings.AppStartupScript}\"/>\r\n                </DockPanel>\r\n                <TextBox AcceptsReturn=\"True\"\r\n                         FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                         HorizontalScrollBarVisibility=\"Auto\"\r\n                         VerticalScrollBarVisibility=\"Visible\"\r\n                         Text=\"{Binding Settings.AppStartupScript, UpdateSourceTrigger=PropertyChanged}\" />\r\n\r\n                <DockPanel Margin=\"0,5,0,5\" LastChildFill=\"False\">\r\n                    <TextBlock Text=\"{DynamicResource LOCAppScriptShutdownDescription}\" VerticalAlignment=\"Center\" />\r\n                    <Button Content=\"{DynamicResource LOCTestScript}\" DockPanel.Dock=\"Right\"\r\n                            Command=\"{Binding TestScriptCommand}\"\r\n                            CommandParameter=\"{Binding Settings.AppShutdownScript}\"/>\r\n                </DockPanel>\r\n                <TextBox AcceptsReturn=\"True\"\r\n                         FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                         HorizontalScrollBarVisibility=\"Auto\"\r\n                         VerticalScrollBarVisibility=\"Visible\"\r\n                         Text=\"{Binding Settings.AppShutdownScript, UpdateSourceTrigger=PropertyChanged}\"/>\r\n\r\n                \r\n            </GridEx>\r\n        </TabItem>\r\n    </TabControl>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Scripting.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Scripting.xaml\r\n    /// </summary>\r\n    public partial class Scripting : UserControl\r\n    {\r\n        public Scripting()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Search.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.Search\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"             \r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </UserControl.Resources>\r\n\r\n    <TabControl>\r\n        <TabItem Header=\"{DynamicResource LOCGeneralLabel}\">\r\n            <DockPanel Margin=\"15\">\r\n                <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\">\r\n                    <TextBlock Text=\"{DynamicResource LOCSearchSettingsPrimaryAction}\" VerticalAlignment=\"Center\" Margin=\"0,0,15,0\" />\r\n                    <ComboBox pbeh:SelectorBehaviors.EnumSource=\"{x:Type p:GameSearchItemAction}\"\r\n                              SelectedValue=\"{Binding Settings.PrimaryGameSearchItemAction}\" />\r\n                </StackPanel>\r\n\r\n                <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\" Margin=\"0,10,0,0\">\r\n                    <TextBlock Text=\"{DynamicResource LOCSearchSettingsSecondaryAction}\" VerticalAlignment=\"Center\" Margin=\"0,0,15,0\" />\r\n                    <ComboBox pbeh:SelectorBehaviors.EnumSource=\"{x:Type p:GameSearchItemAction}\"\r\n                              SelectedValue=\"{Binding Settings.SecondaryGameSearchItemAction}\" />\r\n                </StackPanel>\r\n\r\n                <CheckBox Content=\"{DynamicResource LOCSearchSettingsKeyboardOpenSearch}\"\r\n                          DockPanel.Dock=\"Top\" Margin=\"0,10,0,0\"\r\n                          IsChecked=\"{Binding Settings.GlobalSearchOpenWithLegacySearch}\"  />\r\n\r\n                <CheckBox Content=\"{DynamicResource LOCSearchSettingsSaveFilter}\"\r\n                          DockPanel.Dock=\"Top\" Margin=\"0,15,0,0\"\r\n                          IsChecked=\"{Binding Settings.SaveGlobalSearchFilterSettings}\"  />\r\n\r\n                <CheckBox Content=\"{DynamicResource LOCSearchIncludeCommandsInDefault}\"\r\n                          ToolTip=\"{DynamicResource LOCSearchIncludeCommandsInDefaultTooltip}\"\r\n                          DockPanel.Dock=\"Top\" Margin=\"0,15,0,0\"\r\n                          IsChecked=\"{Binding Settings.IncludeCommandsInDefaultSearch}\" />\r\n                \r\n                <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\" DockPanel.Dock=\"Top\" >\r\n                    <TextBlock VerticalAlignment=\"Center\" Margin=\"0,0,10,0\"\r\n                               Text=\"{DynamicResource LOCSearchSettingsSystemWideShortcut}\"/>\r\n                    <HotKeyBox Width=\"150\" HorizontalAlignment=\"Left\"\r\n                               Hotkey=\"{Binding Settings.SystemSearchHotkey}\" />\r\n                </StackPanel>\r\n\r\n                <TextBlock Text=\"{DynamicResource LOCSearchSettingsSearchProviders}\" DockPanel.Dock=\"Top\" Margin=\"0,15,0,0\"/>\r\n                <ListView DockPanel.Dock=\"Top\" Margin=\"0,10,0,0\"\r\n                          ItemsSource=\"{Binding Searches}\">\r\n                    <ListView.View>\r\n                        <GridView>\r\n                            <GridViewColumn Header=\"{DynamicResource LOCNameLabel}\" Width=\"220\" DisplayMemberBinding=\"{Binding Name}\" />\r\n                            <GridViewColumn Header=\"{DynamicResource LOCSearchSettingsDefaultKeyword}\" Width=\"150\" DisplayMemberBinding=\"{Binding DefaultKeyword}\" />\r\n                            <GridViewColumn Header=\"{DynamicResource LOCSearchSettingsCustomKeyword}\" Width=\"150\">\r\n                                <GridViewColumn.CellTemplate>\r\n                                    <DataTemplate>\r\n                                        <TextBox Text=\"{Binding Keyword}\" />\r\n                                    </DataTemplate>\r\n                                </GridViewColumn.CellTemplate>\r\n                            </GridViewColumn>\r\n                        </GridView>\r\n                    </ListView.View>\r\n                    <ListView.ItemContainerStyle>\r\n                        <Style TargetType=\"{x:Type ListViewItem}\" BasedOn=\"{StaticResource {x:Type ListViewItem}}\">\r\n                            <Setter Property=\"Focusable\" Value=\"False\"/>\r\n                        </Style>\r\n                    </ListView.ItemContainerStyle>\r\n                </ListView>\r\n            </DockPanel>\r\n        </TabItem>\r\n        <TabItem Header=\"{DynamicResource LOCSettingsAppearanceLabel}\">\r\n            <StackPanel Margin=\"15\">\r\n                <TextBlock Text=\"{DynamicResource LOCSearchViewGameFieldOptions}\" Margin=\"0,0,0,5\" />\r\n                <CheckBox Margin=\"0,7,0,0\" Content=\"{DynamicResource LOCPlatformTitle}\"\r\n                          IsChecked=\"{Binding Settings.SearchWindowVisibility.Platform}\"/>\r\n                <CheckBox Margin=\"0,7,0,0\" Content=\"{DynamicResource LOCTimePlayed}\"\r\n                          IsChecked=\"{Binding Settings.SearchWindowVisibility.PlayTime}\"/>\r\n                <CheckBox Margin=\"0,7,0,0\" Content=\"{DynamicResource LOCCompletionStatus}\"\r\n                          IsChecked=\"{Binding Settings.SearchWindowVisibility.CompletionStatus}\"/>\r\n                <CheckBox Margin=\"0,7,0,0\" Content=\"{DynamicResource LOCGameReleaseDateTitle}\"\r\n                          IsChecked=\"{Binding Settings.SearchWindowVisibility.ReleaseDate}\"/>\r\n                <CheckBox Margin=\"0,7,0,0\" Content=\"{DynamicResource LOCGameIconTitle}\"\r\n                          IsChecked=\"{Binding Settings.SearchWindowVisibility.GameIcon}\"/>\r\n                <CheckBox Margin=\"0,7,0,0\" Content=\"{DynamicResource LOCLibraryIconTitle}\"\r\n                          IsChecked=\"{Binding Settings.SearchWindowVisibility.LibraryIcon}\"/>\r\n                <CheckBox Margin=\"0,7,0,0\" Content=\"{DynamicResource LOCHiddenStatus}\"\r\n                          IsChecked=\"{Binding Settings.SearchWindowVisibility.HiddenStatus}\"/>\r\n            </StackPanel>\r\n        </TabItem>\r\n    </TabControl>\r\n</UserControl>"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Search.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace Playnite.DesktopApp.Controls.SettingsSections\n{\n    /// <summary>\n    /// Interaction logic for Sorting.xaml\n    /// </summary>\n    public partial class Search : UserControl\n    {\n        public Search()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Sorting.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.Sorting\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"500\" d:DesignWidth=\"500\">\n\n    <UserControl.Resources>\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\n    </UserControl.Resources>\n\n    <StackPanel Margin=\"15\">\n        <CheckBox Content=\"{DynamicResource LOCSortingNameAutofill}\"\n                ToolTip=\"{DynamicResource LOCSortingNameAutofillTooltip}\"\n                Name=\"CheckAsyncImages\" IsChecked=\"{Binding Settings.GameSortingNameAutofill}\"/>\n        <TextBlock Margin=\"0,15,0,5\" Text=\"{DynamicResource LOCSortingNameRemovedArticles}\"\n                   TextWrapping=\"Wrap\" ToolTip=\"{DynamicResource LOCSortingNameRemovedArticlesTooltip}\" />\n        <ListBox Name=\"ListSortingNameRemovedArticles\"\n                SelectionMode=\"Extended\" MinHeight=\"250\"\n                ItemsSource=\"{Binding SortingNameRemovedArticles}\"/>\n        <DockPanel LastChildFill=\"False\">\n            <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"0,5,0,0\" MinWidth=\"80\" DockPanel.Dock=\"Left\"\n                Command=\"{Binding AddSortingNameRemovedArticle}\" />\n            <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"5,5,0,0\" MinWidth=\"80\" DockPanel.Dock=\"Left\"\n                Command=\"{Binding RemoveSortingNameRemovedArticle}\" \n                CommandParameter=\"{Binding SelectedItems, ElementName=ListSortingNameRemovedArticles}\"/>\n            <Button Content=\"{DynamicResource LOCSortingNameAutofillButton}\" Margin=\"0,5,0,0\" DockPanel.Dock=\"Right\"\n                Command=\"{Binding FillSortingNameForAllGames}\" />\n        </DockPanel>\n    </StackPanel>\n</UserControl>\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Sorting.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace Playnite.DesktopApp.Controls.SettingsSections\n{\n    /// <summary>\n    /// Interaction logic for Sorting.xaml\n    /// </summary>\n    public partial class Sorting : UserControl\n    {\n        public Sorting()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Updates.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SettingsSections.Updates\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"500\" d:DesignWidth=\"600\">\r\n\r\n    <UserControl.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </UserControl.Resources>\r\n\r\n    <GridEx Margin=\"15\"\r\n            AutoLayoutColumns=\"2\" ColumnCount=\"2\" RowCount=\"5\" StarRows=\"5\">\r\n        <GridEx.Resources>\r\n            <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                <Setter Property=\"Margin\" Value=\"0,10,10,10\" />\r\n            </Style>\r\n            <Style TargetType=\"ComboBox\" BasedOn=\"{StaticResource {x:Type ComboBox}}\">\r\n                <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                <Setter Property=\"HorizontalAlignment\" Value=\"Left\" />\r\n                <Setter Property=\"MinWidth\" Value=\"200\" />\r\n            </Style>\r\n        </GridEx.Resources>\r\n\r\n        <TextBlock Text=\"{DynamicResource LOCCheckLibraryUpdates}\" />\r\n        <ComboBox pbeh:SelectorBehaviors.EnumSource=\"{x:Type p:LibraryUpdateCheckFrequency}\"\r\n                  SelectedValue=\"{Binding Settings.CheckForLibraryUpdates}\" />\r\n\r\n        <TextBlock Text=\"{DynamicResource LOCCheckEmulatedLibraryUpdates}\" />\r\n        <ComboBox pbeh:SelectorBehaviors.EnumSource=\"{x:Type p:LibraryUpdateCheckFrequency}\"\r\n                  SelectedValue=\"{Binding Settings.CheckForEmulatedLibraryUpdates}\" />\r\n\r\n        <TextBlock Text=\"{DynamicResource LOCCheckAddonUpdates}\" />\r\n        <ComboBox pbeh:SelectorBehaviors.EnumSource=\"{x:Type p:UpdateCheckFrequency}\"\r\n                  SelectedValue=\"{Binding Settings.CheckForAddonUpdates}\" />\r\n\r\n        <TextBlock Text=\"{DynamicResource LOCCheckProgramUpdates}\" />\r\n        <ComboBox pbeh:SelectorBehaviors.EnumSource=\"{x:Type p:UpdateCheckFrequency}\"\r\n                  SelectedValue=\"{Binding Settings.CheckForProgramUpdates}\" />\r\n\r\n        <CheckBox Content=\"{DynamicResource LOCUpdateNotifyOnlyPatches}\"\r\n                  ToolTip=\"{DynamicResource LOCUpdateNotifyOnlyPatchesToolip}\"\r\n                  IsChecked=\"{Binding Settings.UpdateNotificationOnPatchesOnly}\"\r\n                  Grid.ColumnSpan=\"2\" Margin=\"0,10,0,0\"/>\r\n    </GridEx>\r\n</UserControl>"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SettingsSections/Updates.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace Playnite.DesktopApp.Controls.SettingsSections\n{\n    /// <summary>\n    /// Interaction logic for Sorting.xaml\n    /// </summary>\n    public partial class Updates : UserControl\n    {\n        public Updates()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SidebarItem.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_ProgressStatus\", Type = typeof(ProgressBar))]\r\n    public class SidebarItem : Button\r\n    {\r\n        private ProgressBar ProgressStatus;\r\n\r\n        static SidebarItem()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(SidebarItem), new FrameworkPropertyMetadata(typeof(SidebarItem)));\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            BindingTools.SetBinding(this,\r\n                Button.CommandProperty,\r\n                nameof(SidebarWrapperItem.Command));\r\n            BindingTools.SetBinding(this,\r\n                ContentPresenter.ContentProperty,\r\n                nameof(SidebarWrapperItem.IconObject));\r\n            BindingTools.SetBinding(this,\r\n                ContentPresenter.VisibilityProperty,\r\n                nameof(SidebarWrapperItem.Visible),\r\n                converter: new BooleanToVisibilityConverter());\r\n            BindingTools.SetBinding(this,\r\n                ContentPresenter.ToolTipProperty,\r\n                nameof(SidebarWrapperItem.Title));\r\n\r\n            ProgressStatus = Template.FindName(\"PART_ProgressStatus\", this) as ProgressBar;\r\n            if (ProgressStatus != null)\r\n            {\r\n                BindingTools.SetBinding(ProgressStatus,\r\n                    ProgressBar.MaximumProperty,\r\n                    nameof(SidebarWrapperItem.ProgressMaximum));\r\n                BindingTools.SetBinding(ProgressStatus,\r\n                    ProgressBar.ValueProperty,\r\n                    nameof(SidebarWrapperItem.ProgressValue));\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SliderEx.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class SliderEx : Slider\r\n    {\r\n        internal bool IgnoreChanges { get; set; } = false;\r\n\r\n        public SliderEx() : base()\r\n        {\r\n            KeyUp += SliderEx_KeyUp;\r\n        }\r\n\r\n        private void SliderEx_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)\r\n        {\r\n            if (e.Key == System.Windows.Input.Key.Left ||\r\n                e.Key == System.Windows.Input.Key.Right ||\r\n                e.Key == System.Windows.Input.Key.Up ||\r\n                e.Key == System.Windows.Input.Key.Down)\r\n            {\r\n                UpdateFinalValue();\r\n            }\r\n        }\r\n\r\n        public double FinalValue\r\n        {\r\n            get { return (double)GetValue(FinalValueProperty); }\r\n            set { SetValue(FinalValueProperty, value); }\r\n        }\r\n\r\n        public static readonly DependencyProperty FinalValueProperty =\r\n            DependencyProperty.Register(\r\n                nameof(FinalValue),\r\n                typeof(double),\r\n                typeof(SliderEx),\r\n                new FrameworkPropertyMetadata(0d,\r\n                    FinalValueChangedCallback));\r\n\r\n        protected override void OnThumbDragCompleted(DragCompletedEventArgs e)\r\n        {\r\n            base.OnThumbDragCompleted(e);\r\n            UpdateFinalValue();\r\n        }\r\n\r\n        private static void FinalValueChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as SliderEx;\r\n            if (!obj.IgnoreChanges)\r\n            {\r\n                var value = (double)e.NewValue;\r\n                obj.Value = value;\r\n                obj.FinalValue = value;\r\n            }\r\n        }\r\n\r\n        private void UpdateFinalValue()\r\n        {\r\n            IgnoreChanges = false;\r\n            FinalValue = Value;\r\n            IgnoreChanges = true;\r\n        }\r\n\r\n        protected override void OnIncreaseLarge()\r\n        {\r\n            base.OnIncreaseLarge();\r\n            UpdateFinalValue();\r\n        }\r\n\r\n        protected override void OnIncreaseSmall()\r\n        {\r\n            base.OnIncreaseSmall();\r\n            UpdateFinalValue();\r\n        }\r\n\r\n        protected override void OnDecreaseLarge()\r\n        {\r\n            base.OnDecreaseLarge();\r\n            UpdateFinalValue();\r\n        }\r\n\r\n        protected override void OnDecreaseSmall()\r\n        {\r\n            base.OnDecreaseSmall();\r\n            UpdateFinalValue();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SliderWithPopup.xaml",
    "content": "﻿<UserControl x:Class=\"Playnite.DesktopApp.Controls.SliderWithPopup\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:ctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\n             mc:Ignorable=\"d\" MinWidth=\"150\"\n             d:DesignHeight=\"100\" d:DesignWidth=\"150\"> \n\n    <ctrls:SliderEx x:Name=\"Slider\" SmallChange=\"1\" LargeChange=\"10\"\n                FinalValue=\"{Binding SliderValue, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=TwoWay}\" \n                Maximum=\"{Binding SliderMaximumValue, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneTime}\"\n                Minimum=\"{Binding SliderMinimumValue, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=OneTime}\"\n                IsSnapToTickEnabled=\"True\" DockPanel.Dock=\"Right\" VerticalAlignment=\"Center\"\n                HorizontalAlignment=\"Stretch\"\n                MouseMove=\"Slider_MouseMove\" MouseLeave=\"Slider_MouseLeave\">\n    </ctrls:SliderEx>\n</UserControl>\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/SliderWithPopup.xaml.cs",
    "content": "﻿using System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Input;\n\nnamespace Playnite.DesktopApp.Controls\n{\n    /// <summary>\n    /// Interaction logic for SliderWithPopup.xaml\n    /// </summary>\n    public partial class SliderWithPopup : UserControl\n    {\n        public SliderWithPopup()\n        {\n            InitializeComponent();\n        }\n\n        public double SliderValue\n        {\n            get => (double) GetValue(SliderValueProperty);\n            set => SetValue(SliderValueProperty, value);\n        }\n        public static readonly DependencyProperty SliderValueProperty = DependencyProperty.Register(nameof(SliderValue), typeof(double), typeof(SliderWithPopup));\n        public double SliderMaximumValue\n        {\n            get => (double)GetValue(SliderMaximumValueProperty);\n            set => SetValue(SliderMaximumValueProperty, value);\n        }\n        public static readonly DependencyProperty SliderMaximumValueProperty = DependencyProperty.Register(nameof(SliderMaximumValue), typeof(double), typeof(SliderWithPopup));\n        public double SliderMinimumValue\n        {\n            get => (double)GetValue(SliderMinimumValueProperty);\n            set => SetValue(SliderMinimumValueProperty, value);\n        }\n        public static readonly DependencyProperty SliderMinimumValueProperty = DependencyProperty.Register(nameof(SliderMinimumValue), typeof(double), typeof(SliderWithPopup));\n        public string PopupLabel\n        {\n            get => (string)GetValue(PopupLabelProperty);\n            set => SetValue(PopupLabelProperty, value);\n        }\n        public static readonly DependencyProperty PopupLabelProperty = DependencyProperty.Register(nameof(PopupLabel), typeof(string), typeof(SliderWithPopup));\n\n        private void Slider_MouseMove(object sender, MouseEventArgs e)\n        {\n            //if (!Popup.IsOpen)\n            //{\n            //    Popup.IsOpen = true;\n            //}\n\n            //PositionPopupBelowTheEndOfTheSlider();\n        }\n\n        private void PositionPopupBelowTheEndOfTheSlider()\n        {\n            //Popup.HorizontalOffset = Slider.Width - PopupGrid.ActualWidth;\n            //Popup.VerticalOffset = 0f;\n        }\n\n        private void Slider_MouseLeave(object sender, MouseEventArgs e)\n        {\n            //if (Popup.IsOpen)\n            //{\n            //    Popup.IsOpen = false;\n            //}\n        }\n    }\n}\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/TopPanelItem.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.Controls\r\n{\r\n    public class TopPanelItem : Button\r\n    {\r\n        public bool IsToggled\r\n        {\r\n            get => (bool)GetValue(IsToggledProperty);\r\n            set => SetValue(IsToggledProperty, value);\r\n        }\r\n\r\n        public static readonly DependencyProperty IsToggledProperty = DependencyProperty.Register(\r\n            nameof(IsToggled),\r\n            typeof(bool),\r\n            typeof(TopPanelItem));\r\n\r\n        static TopPanelItem()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(TopPanelItem), new FrameworkPropertyMetadata(typeof(TopPanelItem)));\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            BindingTools.SetBinding(this,\r\n                Button.CommandProperty,\r\n                nameof(TopPanelWrapperItem.Command));\r\n            BindingTools.SetBinding(this,\r\n                ContentPresenter.ContentProperty,\r\n                nameof(TopPanelWrapperItem.IconObject));\r\n            BindingTools.SetBinding(this,\r\n                ContentPresenter.VisibilityProperty,\r\n                nameof(TopPanelWrapperItem.Visible),\r\n                converter: new BooleanToVisibilityConverter());\r\n            BindingTools.SetBinding(this,\r\n                ContentPresenter.ToolTipProperty,\r\n                nameof(TopPanelWrapperItem.Title));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/BaseGamesView.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ListGames\", Type = typeof(ExtendedListBox))]\r\n    [TemplatePart(Name = \"PART_ControlGameView\", Type = typeof(Control))]\r\n    public abstract class BaseGamesView : Control\r\n    {\r\n        internal readonly DesktopView viewType;\r\n        internal readonly DesktopAppViewModel mainModel;\r\n\r\n        internal Control ControlGameView;\r\n        internal ExtendedListBox ListGames;\r\n\r\n        public BaseGamesView(DesktopView viewType) : this(viewType, DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public BaseGamesView(DesktopView viewType, DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n\r\n            this.viewType = viewType;\r\n            Loaded += BaseGamesView_Loaded;\r\n            Unloaded += BaseGamesView_Unloaded;\r\n        }\r\n\r\n        private void BaseGamesView_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            mainModel.AppSettings.ViewSettings.PropertyChanged += ViewSettings_PropertyChanged;\r\n        }\r\n\r\n        private void BaseGamesView_Unloaded(object sender, RoutedEventArgs e)\r\n        {\r\n            mainModel.AppSettings.ViewSettings.PropertyChanged -= ViewSettings_PropertyChanged;\r\n        }\r\n\r\n        private void ViewSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(ViewSettings.GamesViewType))\r\n            {\r\n                SetViewActiveBindings();\r\n            }\r\n        }\r\n\r\n        private void SetViewActiveBindings()\r\n        {\r\n            if (mainModel.AppSettings.ViewSettings.GamesViewType == viewType ||\r\n                DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                if (ListGames != null)\r\n                {\r\n                    BindingTools.SetBinding(ListGames,\r\n                        ExtendedListBox.ItemsSourceProperty,\r\n                        mainModel,\r\n                        $\"{nameof(mainModel.GamesView)}.{nameof(DesktopCollectionView.CollectionView)}\");\r\n                    BindingTools.SetBinding(ListGames,\r\n                        ExtendedListBox.SelectedItemsListProperty,\r\n                        mainModel,\r\n                        nameof(DesktopAppViewModel.SelectedGamesBinder),\r\n                        BindingMode.TwoWay);\r\n                }\r\n\r\n                if (ControlGameView != null)\r\n                {\r\n                    BindingTools.SetBinding(ControlGameView,\r\n                        Control.DataContextProperty,\r\n                        mainModel,\r\n                        nameof(DesktopAppViewModel.SelectedGameDetails),\r\n                        mode: BindingMode.OneWay);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (ListGames != null)\r\n                {\r\n                    BindingTools.ClearBinding(ListGames, ExtendedListBox.SelectedItemsListProperty);\r\n                    ListGames.ItemsSource = null;\r\n                }\r\n\r\n                if (ControlGameView != null)\r\n                {\r\n                    ControlGameView.DataContext = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            ControlGameView = Template.FindName(\"PART_ControlGameView\", this) as Control;\r\n\r\n            ListGames = Template.FindName(\"PART_ListGames\", this) as ExtendedListBox;\r\n            if (ListGames != null)\r\n            {\r\n                ScrollToSelectedBehavior.SetEnabled(ListGames, true);\r\n\r\n                if (!DesignerProperties.GetIsInDesignMode(this))\r\n                {\r\n                    ListGames.InputBindings.Add(new KeyBinding(mainModel.EditSelectedGamesCommand, mainModel.EditSelectedGamesCommand.Gesture));\r\n                    ListGames.InputBindings.Add(new KeyBinding(mainModel.RemoveSelectedGamesCommand, mainModel.RemoveSelectedGamesCommand.Gesture));\r\n                    ListGames.InputBindings.Add(new KeyBinding(mainModel.StartSelectedGameCommand, mainModel.StartSelectedGameCommand.Gesture));\r\n                }\r\n\r\n                ListGames.SelectionMode = SelectionMode.Extended;\r\n                VirtualizingPanel.SetCacheLengthUnit(ListGames, VirtualizationCacheLengthUnit.Item);\r\n                VirtualizingPanel.SetCacheLength(ListGames, new VirtualizationCacheLength(5));\r\n                VirtualizingPanel.SetScrollUnit(ListGames, ScrollUnit.Pixel);\r\n                VirtualizingPanel.SetIsVirtualizingWhenGrouping(ListGames, true);\r\n                VirtualizingPanel.SetVirtualizationMode(ListGames, VirtualizationMode.Recycling);\r\n\r\n                SetViewActiveBindings();\r\n            }\r\n\r\n            ControlTemplateTools.InitializePluginControls(\r\n                mainModel.Extensions,\r\n                Template,\r\n                this,\r\n                SDK.ApplicationMode.Desktop,\r\n                mainModel,\r\n                $\"{nameof(DesktopAppViewModel.SelectedGameDetails)}.{nameof(GameDetailsViewModel.Game)}.{nameof(GameDetailsViewModel.Game.Game)}\");\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/DetailsViewGameOverview.cs",
    "content": "﻿using Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    public class DetailsViewGameOverview : GameOverview\r\n    {\r\n        static DetailsViewGameOverview()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(DetailsViewGameOverview), new FrameworkPropertyMetadata(typeof(DetailsViewGameOverview)));\r\n        }\r\n\r\n        public DetailsViewGameOverview() : base(DesktopView.Details)\r\n        {\r\n        }\r\n\r\n        public DetailsViewGameOverview(DesktopAppViewModel mainModel) : base(DesktopView.Details, mainModel)\r\n        {\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/ExplorerPanel.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.Extensions;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_SelectFields\", Type = typeof(Selector))]\r\n    [TemplatePart(Name = \"PART_SelectItems\", Type = typeof(Selector))]\r\n    [TemplatePart(Name = \"PART_ButtonClose\", Type = typeof(ButtonBase))]\r\n    public class ExplorerPanel : Control\r\n    {\r\n        private readonly DesktopAppViewModel mainModel;\r\n        private Selector SelectFields;\r\n        private Selector SelectItems;\r\n        private ButtonBase ButtonClose;\r\n        static ExplorerPanel()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ExplorerPanel), new FrameworkPropertyMetadata(typeof(ExplorerPanel)));\r\n        }\r\n\r\n        public ExplorerPanel() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public ExplorerPanel(DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            SelectFields = Template.FindName(\"PART_SelectFields\", this) as Selector;\r\n            if (SelectFields != null)\r\n            {\r\n                BindingTools.SetBinding(SelectFields,\r\n                    Selector.SelectedValueProperty,\r\n                    mainModel.DatabaseExplorer,\r\n                    nameof(DatabaseExplorer.SelectedField),\r\n                    BindingMode.TwoWay);\r\n                BindingTools.SetBinding(SelectFields,\r\n                    Selector.ItemsSourceProperty,\r\n                    mainModel.DatabaseExplorer,\r\n                    nameof(DatabaseExplorer.Fields));\r\n            }\r\n\r\n            SelectItems = Template.FindName(\"PART_SelectItems\", this) as Selector;\r\n            if (SelectItems != null)\r\n            {\r\n                SelectItems.DisplayMemberPath = nameof(DatabaseExplorer.SelectionObject.Name);\r\n                BindingTools.SetBinding(SelectItems,\r\n                    Selector.SelectedItemProperty,\r\n                    mainModel.DatabaseExplorer,\r\n                    nameof(DatabaseExplorer.SelectedFieldObject),\r\n                    BindingMode.TwoWay);\r\n                BindingTools.SetBinding(SelectItems,\r\n                    Selector.ItemsSourceProperty,\r\n                    mainModel.DatabaseExplorer,\r\n                    nameof(DatabaseExplorer.FieldValues));\r\n            }\r\n\r\n            ButtonClose = Template.FindName(\"PART_ButtonClose\", this) as ButtonBase;\r\n            if (ButtonClose != null)\r\n            {\r\n                ButtonClose.Command = mainModel.ToggleExplorerPanelCommand;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/FilterPanel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.Database;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ButtonClear\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ButtonClose\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_PanelItemsHost\", Type = typeof(Panel))]\r\n    [TemplatePart(Name = \"PART_ButtonDeleteFilter\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ButtonRenameFilter\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ButtonSaveFilter\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ComboFilterPresets\", Type = typeof(ComboBox))]\r\n    public class FilterPanel : Control\r\n    {\r\n        private readonly DesktopAppViewModel mainModel;\r\n        private ButtonBase ButtonClear;\r\n        private ButtonBase ButtonClose;\r\n        private Panel PanelItemsHost;\r\n        private ButtonBase ButtonDeleteFilter;\r\n        private ButtonBase ButtonRenameFilter;\r\n        private ButtonBase ButtonSaveFilter;\r\n        private ComboBox ComboFilterPresets;\r\n\r\n        static FilterPanel()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(FilterPanel), new FrameworkPropertyMetadata(typeof(FilterPanel)));\r\n        }\r\n\r\n        public FilterPanel() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public FilterPanel(DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            PanelItemsHost = Template.FindName(\"PART_PanelItemsHost\", this) as Panel;\r\n            ButtonClear = Template.FindName(\"PART_ButtonClear\", this) as ButtonBase;\r\n            if (ButtonClear != null)\r\n            {\r\n                ButtonClear.Command = mainModel.ClearFiltersCommand;\r\n            }\r\n\r\n            ButtonClose = Template.FindName(\"PART_ButtonClose\", this) as ButtonBase;\r\n            if (ButtonClose != null)\r\n            {\r\n                ButtonClose.Command = mainModel.CloseFilterPanelCommand;\r\n            }\r\n\r\n            ButtonDeleteFilter = Template.FindName(\"PART_ButtonDeleteFilter\", this) as ButtonBase;\r\n            if (ButtonDeleteFilter != null)\r\n            {\r\n                BindingTools.SetBinding(ButtonDeleteFilter,\r\n                    ButtonBase.CommandProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.RemoveFilterPresetCommand));\r\n                BindingTools.SetBinding(ButtonDeleteFilter,\r\n                    ButtonBase.CommandParameterProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.ActiveFilterPreset));\r\n            }\r\n\r\n            ButtonRenameFilter = Template.FindName(\"PART_ButtonRenameFilter\", this) as ButtonBase;\r\n            if (ButtonRenameFilter != null)\r\n            {\r\n                BindingTools.SetBinding(ButtonRenameFilter,\r\n                    ButtonBase.CommandProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.RenameFilterPresetCommand));\r\n                BindingTools.SetBinding(ButtonRenameFilter,\r\n                    ButtonBase.CommandParameterProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.ActiveFilterPreset));\r\n            }\r\n\r\n            ButtonSaveFilter = Template.FindName(\"PART_ButtonSaveFilter\", this) as ButtonBase;\r\n            if (ButtonSaveFilter != null)\r\n            {\r\n                BindingTools.SetBinding(ButtonSaveFilter,\r\n                    ButtonBase.CommandProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.AddFilterPresetCommand));\r\n            }\r\n\r\n            ComboFilterPresets = Template.FindName(\"PART_ComboFilterPresets\", this) as ComboBox;\r\n            if (ComboFilterPresets != null)\r\n            {\r\n                BindingTools.SetBinding(ComboFilterPresets,\r\n                    ComboBox.ItemsSourceProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.SortedFilterPresets));\r\n                BindingTools.SetBinding(ComboFilterPresets,\r\n                    ComboBox.SelectedItemProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.ActiveFilterPreset),\r\n                    mode: BindingMode.TwoWay);\r\n                ComboFilterPresets.DisplayMemberPath = nameof(FilterPreset.Name);\r\n            }\r\n\r\n            SetToggleFilter(nameof(FilterSettings.IsInstalled), nameof(DatabaseStats.Installed), LOC.GameIsInstalledTitle);\r\n            SetToggleFilter(nameof(FilterSettings.IsUnInstalled), nameof(DatabaseStats.UnInstalled), LOC.GameIsUnInstalledTitle);\r\n            SetToggleFilter(nameof(FilterSettings.Hidden), nameof(DatabaseStats.Hidden), LOC.GameHiddenTitle);\r\n            SetToggleFilter(nameof(FilterSettings.Favorite), nameof(DatabaseStats.Favorite), LOC.GameFavoriteTitle);\r\n            SetToggleFilterWithTooltip(nameof(FilterSettings.UseAndFilteringStyle), LOC.UseFilterStyleAndTitle, LOC.UseFilterStyleAndTooltip);\r\n\r\n            SetLabelTag(nameof(FilterSettings.Platform), LOC.PlatformTitle);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.Platforms), nameof(FilterSettings.Platform));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Library), LOC.Library);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.Libraries), nameof(FilterSettings.Library), false);\r\n\r\n            SetLabelTag(nameof(FilterSettings.Name), LOC.NameLabel, new StringNullOrEmptyToBoolConverter(), nameof(FilterSettings.Name));\r\n            SetFilterSearchBoxFilter(nameof(FilterSettings.Name));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Genre), LOC.GenreLabel);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.Genres), nameof(FilterSettings.Genre));\r\n\r\n            SetLabelTag(nameof(FilterSettings.ReleaseYear), LOC.GameReleaseYearTitle);\r\n            SetFilterStringSelectionBoxFilter(nameof(DatabaseFilter.ReleaseYears), nameof(FilterSettings.ReleaseYear));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Developer), LOC.DeveloperLabel);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.Developers), nameof(FilterSettings.Developer));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Publisher), LOC.PublisherLabel);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.Publishers), nameof(FilterSettings.Publisher));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Category), LOC.CategoryLabel);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.Categories), nameof(FilterSettings.Category));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Tag), LOC.TagLabel);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.Tags), nameof(FilterSettings.Tag));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Feature), LOC.FeatureLabel);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.Features), nameof(FilterSettings.Feature));\r\n\r\n            SetLabelTag(nameof(FilterSettings.PlayTime), LOC.TimePlayed);\r\n            SetFilterEnumSelectionBoxFilter(nameof(FilterSettings.PlayTime), typeof(PlaytimeCategory));\r\n\r\n            SetLabelTag(nameof(FilterSettings.InstallSize), LOC.InstallSizeLabel);\r\n            SetFilterEnumSelectionBoxFilter(nameof(FilterSettings.InstallSize), typeof(InstallSizeGroup));\r\n\r\n            SetLabelTag(nameof(FilterSettings.CompletionStatuses), LOC.CompletionStatus);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.CompletionStatuses), nameof(FilterSettings.CompletionStatuses));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Series), LOC.SeriesLabel);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.Series), nameof(FilterSettings.Series));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Region), LOC.RegionLabel);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.Regions), nameof(FilterSettings.Region));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Source), LOC.SourceLabel);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.Sources), nameof(FilterSettings.Source));\r\n\r\n            SetLabelTag(nameof(FilterSettings.AgeRating), LOC.AgeRatingLabel);\r\n            SetFilterSelectionBoxFilter(nameof(DatabaseFilter.AgeRatings), nameof(FilterSettings.AgeRating));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Version), LOC.VersionLabel, new StringNullOrEmptyToBoolConverter(), nameof(FilterSettings.Version));\r\n            SetFilterSearchBoxFilter(nameof(FilterSettings.Version));\r\n\r\n            SetLabelTag(nameof(FilterSettings.UserScore), LOC.UserScore);\r\n            SetFilterEnumSelectionBoxFilter(nameof(FilterSettings.UserScore), typeof(ScoreGroup));\r\n\r\n            SetLabelTag(nameof(FilterSettings.CommunityScore), LOC.CommunityScore);\r\n            SetFilterEnumSelectionBoxFilter(nameof(FilterSettings.CommunityScore), typeof(ScoreGroup));\r\n\r\n            SetLabelTag(nameof(FilterSettings.CriticScore), LOC.CriticScore);\r\n            SetFilterEnumSelectionBoxFilter(nameof(FilterSettings.CriticScore), typeof(ScoreGroup));\r\n\r\n            SetLabelTag(nameof(FilterSettings.LastActivity), LOC.GameLastActivityTitle);\r\n            SetFilterEnumSelectionBoxFilter(nameof(FilterSettings.LastActivity), typeof(PastTimeSegment));\r\n\r\n            SetLabelTag(nameof(FilterSettings.RecentActivity), LOC.RecentActivityLabel);\r\n            SetFilterEnumSelectionBoxFilter(nameof(FilterSettings.RecentActivity), typeof(PastTimeSegment));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Added), LOC.DateAddedLabel);\r\n            SetFilterEnumSelectionBoxFilter(nameof(FilterSettings.Added), typeof(PastTimeSegment));\r\n\r\n            SetLabelTag(nameof(FilterSettings.Modified), LOC.DateModifiedLabel);\r\n            SetFilterEnumSelectionBoxFilter(nameof(FilterSettings.Modified), typeof(PastTimeSegment));\r\n        }\r\n\r\n        private void SetToggleFilterWithTooltip(string binding, string text, string tooltip)\r\n        {\r\n            var elem = new CheckBox();\r\n            elem.SetResourceReference(CheckBox.StyleProperty, \"FilterPanelCheckBox\");\r\n            BindingTools.SetBinding(elem,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.FilterSettings,\r\n                binding,\r\n                BindingMode.TwoWay);\r\n            elem.Content = ResourceProvider.GetString(text);\r\n            elem.ToolTip = ResourceProvider.GetString(tooltip);\r\n            PanelItemsHost.Children.Add(elem);\r\n        }\r\n\r\n        private void SetToggleFilter(string binding, string countBinding, string text)\r\n        {\r\n            var elem = new CheckBox();\r\n            elem.SetResourceReference(CheckBox.StyleProperty, \"FilterPanelCheckBox\");\r\n            BindingTools.SetBinding(elem,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.FilterSettings,\r\n                binding,\r\n                BindingMode.TwoWay);\r\n            BindingTools.SetBinding(elem,\r\n                ContentControl.ContentProperty,\r\n                mainModel.GamesStats,\r\n                countBinding);\r\n            elem.ContentStringFormat = ResourceProvider.GetString(text) + \" ({0})\";\r\n            PanelItemsHost.Children.Add(elem);\r\n        }\r\n\r\n        private void SetLabelTag(string binding, string text, IValueConverter converter = null, string bindingName = null)\r\n        {\r\n            if (PanelItemsHost == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var elem = new Label();\r\n            elem.SetResourceReference(Label.StyleProperty, \"FilterPanelLabel\");\r\n            BindingTools.SetBinding(elem,\r\n                FrameworkElement.TagProperty,\r\n                mainModel.AppSettings.FilterSettings,\r\n                bindingName ?? $\"{binding}.{nameof(IdItemFilterItemProperties.IsSet)}\",\r\n                fallBackValue: false,\r\n                converter: converter);\r\n            elem.Content = ResourceProvider.GetString(text);\r\n            PanelItemsHost.Children.Add(elem);\r\n        }\r\n\r\n        private void SetFilterSearchBoxFilter(string filterBinding)\r\n        {\r\n            if (PanelItemsHost == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var elem = new SearchBox();\r\n            elem.SetResourceReference(SearchBox.StyleProperty, \"FilterPanelFilterSearchBox\");\r\n            BindingTools.SetBinding(elem,\r\n                SearchBox.TextProperty,\r\n                mainModel.AppSettings.FilterSettings,\r\n                filterBinding,\r\n                BindingMode.TwoWay,\r\n                delay: 100);\r\n            PanelItemsHost.Children.Add(elem);\r\n        }\r\n\r\n        private void SetFilterSelectionBoxFilter(string listBinding, string filterBinding, bool isFullext = true)\r\n        {\r\n            if (PanelItemsHost == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var elem = new FilterSelectionBox();\r\n            elem.SetResourceReference(FilterSelectionBox.StyleProperty, \"FilterPanelFilterSelectionBox\");\r\n            BindingTools.SetBinding(elem,\r\n                FilterSelectionBox.ItemsListProperty,\r\n                mainModel.DatabaseFilters,\r\n                listBinding);\r\n            BindingTools.SetBinding(elem,\r\n                FilterSelectionBox.FilterPropertiesProperty,\r\n                mainModel.AppSettings.FilterSettings,\r\n                filterBinding,\r\n                BindingMode.TwoWay);\r\n            elem.IsFullTextEnabled = isFullext;\r\n            PanelItemsHost.Children.Add(elem);\r\n        }\r\n\r\n        private void SetFilterEnumSelectionBoxFilter(string filterBinding, Type enumType)\r\n        {\r\n            if (PanelItemsHost == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var elem = new FilterEnumSelectionBox();\r\n            elem.SetResourceReference(FilterEnumSelectionBox.StyleProperty, \"FilterPanelFilterEnumSelectionBox\");\r\n            elem.EnumType = enumType;\r\n            BindingTools.SetBinding(elem,\r\n                FilterEnumSelectionBox.FilterPropertiesProperty,\r\n                mainModel.AppSettings.FilterSettings,\r\n                filterBinding,\r\n                BindingMode.TwoWay);\r\n            PanelItemsHost.Children.Add(elem);\r\n        }\r\n\r\n        private void SetFilterStringSelectionBoxFilter(string listBinding, string filterBinding)\r\n        {\r\n            if (PanelItemsHost == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var elem = new FilterStringSelectionBox();\r\n            elem.SetResourceReference(FilterStringSelectionBox.StyleProperty, \"FilterPanelFilterStringSelectionBox\");\r\n            BindingTools.SetBinding(elem,\r\n                FilterStringSelectionBox.ItemsListProperty,\r\n                mainModel.DatabaseFilters,\r\n                listBinding);\r\n            BindingTools.SetBinding(elem,\r\n                FilterStringSelectionBox.FilterPropertiesProperty,\r\n                mainModel.AppSettings.FilterSettings,\r\n                filterBinding,\r\n                BindingMode.TwoWay);\r\n            PanelItemsHost.Children.Add(elem);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/GameOverview.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.Converters;\r\nusing Playnite.DesktopApp.Markup;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Controls;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Automation;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Xml.Linq;\r\nusing BooleanToVisibilityConverter = Playnite.Converters.BooleanToVisibilityConverter;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ElemPlayTime\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemLastPlayed\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemAdded\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemRecentActivity\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemCompletionStatus\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemLibrary\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemPlatform\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemGenres\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemDevelopers\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemPublishers\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemReleaseDate\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemCategories\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemTags\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemFeatures\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemLinks\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemDescription\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemNotes\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemAgeRating\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemSeries\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemRegion\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemSource\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemVersion\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemCommunityScore\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemCriticScore\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemUserScore\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_TextPlayTime\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_TextLastActivity\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_TextRecentActivity\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_ButtonCompletionStatus\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_TextNotes\", Type = typeof(TextBox))]\r\n    [TemplatePart(Name = \"PART_TextCommunityScore\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_TextCriticScore\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_TextUserScore\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_ButtonLibrary\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_ButtonReleaseDate\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_ButtonSource\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_ButtonVersion\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_ItemsPlatforms\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ItemsAgeRatings\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ItemsSeries\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ItemsRegions\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ItemsGenres\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ItemsDevelopers\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ItemsPublishers\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ItemsCategories\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ItemsTags\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ItemsFeatures\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ItemsLinks\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ButtonPlayAction\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_ButtonContextAction\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_ButtonMoreActions\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_ButtonEditGame\", Type = typeof(Button))]\r\n    [TemplatePart(Name = \"PART_HtmlDescription\", Type = typeof(HtmlTextView))]\r\n    [TemplatePart(Name = \"PART_ImageCover\", Type = typeof(Image))]\r\n    [TemplatePart(Name = \"PART_ImageIcon\", Type = typeof(Image))]\r\n    [TemplatePart(Name = \"PART_ImageBackground\", Type = typeof(FadeImage))]\r\n    [TemplatePart(Name = \"PART_TextDisplayName\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_ScrollViewHost\", Type = typeof(ScrollViewer))]\r\n    public abstract class GameOverview : Control\r\n    {\r\n        internal readonly DesktopView viewType;\r\n        internal readonly DesktopAppViewModel mainModel;\r\n\r\n        private FrameworkElement ElemPlayTime;\r\n        private FrameworkElement ElemInstallSize;\r\n        private FrameworkElement ElemInstallDirectory;\r\n        private FrameworkElement ElemLastPlayed;\r\n        private FrameworkElement ElemAdded;\r\n        private FrameworkElement ElemRecentActivity;\r\n        private FrameworkElement ElemCompletionStatus;\r\n        private FrameworkElement ElemLibrary;\r\n        private FrameworkElement ElemPlatform;\r\n        private FrameworkElement ElemGenres;\r\n        private FrameworkElement ElemDevelopers;\r\n        private FrameworkElement ElemPublishers;\r\n        private FrameworkElement ElemReleaseDate;\r\n        private FrameworkElement ElemCategories;\r\n        private FrameworkElement ElemTags;\r\n        private FrameworkElement ElemFeatures;\r\n        private FrameworkElement ElemLinks;\r\n        private FrameworkElement ElemDescription;\r\n        private FrameworkElement ElemNotes;\r\n        private FrameworkElement ElemAgeRating;\r\n        private FrameworkElement ElemSeries;\r\n        private FrameworkElement ElemRegion;\r\n        private FrameworkElement ElemSource;\r\n        private FrameworkElement ElemVersion;\r\n        private FrameworkElement ElemCommunityScore;\r\n        private FrameworkElement ElemCriticScore;\r\n        private FrameworkElement ElemUserScore;\r\n\r\n        private TextBlock TextDisplayName;\r\n        private TextBlock TextPlayTime;\r\n        private TextBlock TextLastActivity;\r\n        private TextBlock TextAdded;\r\n        private TextBlock TextInstallSize;\r\n        private TextBlock TextCommunityScore;\r\n        private TextBlock TextCriticScore;\r\n        private TextBlock TextUserScore;\r\n        private TextBox TextNotes;\r\n        private Button ButtonLibrary;\r\n        private Button ButtonReleaseDate;\r\n        private Button ButtonVersion;\r\n        private Button ButtonSource;\r\n        private Button ButtonCompletionStatus;\r\n        private Button ButtonInstallDirectory;\r\n        private ItemsControl ItemsGenres;\r\n        private ItemsControl ItemsDevelopers;\r\n        private ItemsControl ItemsPublishers;\r\n        private ItemsControl ItemsCategories;\r\n        private ItemsControl ItemsTags;\r\n        private ItemsControl ItemsFeatures;\r\n        private ItemsControl ItemsLinks;\r\n        private ItemsControl ItemsAgeRatings;\r\n        private ItemsControl ItemsSeries;\r\n        private ItemsControl ItemsRegions;\r\n        private ItemsControl ItemsPlatforms;\r\n\r\n        private Button ButtonPlayAction;\r\n        private Button ButtonContextAction;\r\n        private Button ButtonMoreActions;\r\n        private Button ButtonEditGame;\r\n        private HtmlTextView HtmlDescription;\r\n        private Image ImageCover;\r\n        private Image ImageIcon;\r\n        private FadeImage ImageBackground;\r\n        private ScrollViewer ScrollViewHost;\r\n\r\n        static GameOverview()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(GameOverview), new FrameworkPropertyMetadata(typeof(GameOverview)));\r\n        }\r\n\r\n        public GameOverview(DesktopView viewType) : this(viewType, DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public GameOverview(DesktopView viewType, DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n                DataContext = this.mainModel.SelectedGameDetails;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n\r\n            this.viewType = viewType;\r\n            Loaded += GameOverview_Loaded;\r\n            Unloaded += GameOverview_Unloaded;\r\n            DataContextChanged += GameOverview_DataContextChanged;\r\n        }\r\n\r\n        private void GameOverview_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            ScrollViewHost?.ScrollToTop();\r\n        }\r\n\r\n        private void GameOverview_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            mainModel.AppSettings.PropertyChanged += AppSettings_PropertyChanged;\r\n            mainModel.AppSettings.ViewSettings.PropertyChanged += ViewSettings_PropertyChanged;\r\n        }\r\n\r\n        private void GameOverview_Unloaded(object sender, RoutedEventArgs e)\r\n        {\r\n            mainModel.AppSettings.PropertyChanged -= AppSettings_PropertyChanged;\r\n            mainModel.AppSettings.ViewSettings.PropertyChanged -= ViewSettings_PropertyChanged;\r\n        }\r\n\r\n        private void ViewSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(ViewSettings.GamesViewType))\r\n            {\r\n                if (ImageBackground != null)\r\n                {\r\n                    SetBackgroundBinding();\r\n                }\r\n            }\r\n        }\r\n\r\n        private void AppSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(PlayniteSettings.DetailsVisibility))\r\n            {\r\n                if (ImageBackground != null)\r\n                {\r\n                    SetBackgroundBinding();\r\n                }\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            ButtonPlayAction = Template.FindName(\"PART_ButtonPlayAction\", this) as Button;\r\n            if (ButtonPlayAction != null)\r\n            {\r\n                BindingTools.SetBinding(ButtonPlayAction,\r\n                    Button.CommandProperty,\r\n                    nameof(GameDetailsViewModel.PlayCommand));\r\n                BindingTools.SetBinding(ButtonPlayAction,\r\n                    Button.ContentProperty,\r\n                    nameof(GameDetailsViewModel.ContextActionDescription));\r\n                BindingTools.SetBinding(ButtonPlayAction,\r\n                    Button.VisibilityProperty,\r\n                    nameof(GameDetailsViewModel.IsPlayAvailable),\r\n                    converter: new BooleanToVisibilityConverter());\r\n            }\r\n\r\n            ButtonContextAction = Template.FindName(\"PART_ButtonContextAction\", this) as Button;\r\n            if (ButtonContextAction != null)\r\n            {\r\n                BindingTools.SetBinding(ButtonContextAction,\r\n                    Button.CommandProperty,\r\n                    nameof(GameDetailsViewModel.ContextActionCommand));\r\n                BindingTools.SetBinding(ButtonContextAction,\r\n                    Button.ContentProperty,\r\n                    nameof(GameDetailsViewModel.ContextActionDescription));\r\n                BindingTools.SetBinding(ButtonContextAction,\r\n                    Button.VisibilityProperty,\r\n                    nameof(GameDetailsViewModel.IsContextAvailable),\r\n                    converter: new BooleanToVisibilityConverter());\r\n            }\r\n\r\n            ButtonMoreActions = Template.FindName(\"PART_ButtonMoreActions\", this) as Button;\r\n            if (ButtonMoreActions != null)\r\n            {\r\n                LeftClickContextMenuBehavior.SetEnabled(ButtonMoreActions, true);\r\n\r\n                if (!DesignerProperties.GetIsInDesignMode(this))\r\n                {\r\n                    ButtonMoreActions.ContextMenu = new GameMenu(mainModel)\r\n                    {\r\n                        ShowStartSection = false,\r\n                        Placement = PlacementMode.Relative\r\n                    };\r\n                    BindingTools.SetBinding(ButtonMoreActions.ContextMenu,\r\n                        Button.DataContextProperty,\r\n                        mainModel,\r\n                        nameof(DesktopAppViewModel.SelectedGame));\r\n                }\r\n            }\r\n\r\n            ButtonEditGame = Template.FindName(\"PART_ButtonEditGame\", this) as Button;\r\n            if (ButtonEditGame != null)\r\n            {\r\n                BindingTools.SetBinding(ButtonEditGame,\r\n                    Button.CommandProperty,\r\n                    nameof(GameDetailsViewModel.EditGameCommand));\r\n                AutomationProperties.SetName(ButtonEditGame, LOC.EditGame.GetLocalized());\r\n            }\r\n\r\n            HtmlDescription = Template.FindName(\"PART_HtmlDescription\", this) as HtmlTextView;\r\n            if (HtmlDescription != null)\r\n            {\r\n                BindingTools.SetBinding(HtmlDescription,\r\n                    HtmlTextView.HtmlTextProperty,\r\n                    GetGameBindingPath(nameof(GamesCollectionViewEntry.Description)));\r\n                BindingTools.SetBinding(HtmlDescription,\r\n                    HtmlTextView.VisibilityProperty,\r\n                    nameof(GameDetailsViewModel.DescriptionVisibility));\r\n                HtmlDescription.TemplatePath = ThemeFile.GetFilePath(\"DescriptionView.html\");\r\n                BindingTools.SetBinding(HtmlDescription,\r\n                    HtmlTextView.PartialLoadEnabledProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.PartialDescriptionLoading),\r\n                    mode: BindingMode.OneWay);\r\n            }\r\n\r\n            TextNotes = Template.FindName(\"PART_TextNotes\", this) as TextBox;\r\n            if (TextNotes != null)\r\n            {\r\n                BindingTools.SetBinding(TextNotes,\r\n                    TextBox.TextProperty,\r\n                    GetGameBindingPath(nameof(GamesCollectionViewEntry.Notes)));\r\n                BindingTools.SetBinding(TextNotes,\r\n                    TextBox.VisibilityProperty,\r\n                    nameof(GameDetailsViewModel.NotesVisibility));\r\n            }\r\n\r\n            ImageCover = Template.FindName(\"PART_ImageCover\", this) as Image;\r\n            if (ImageCover != null)\r\n            {\r\n                BindingTools.SetBinding(ImageCover,\r\n                    Image.SourceProperty,\r\n                    GetGameBindingPath(nameof(GamesCollectionViewEntry.CoverImageObject)),\r\n                    converter: new NullToDependencyPropertyUnsetConverter(),\r\n                    mode: BindingMode.OneWay);\r\n                BindingTools.SetBinding(ImageCover,\r\n                    Image.VisibilityProperty,\r\n                    nameof(GameDetailsViewModel.CoverVisibility),\r\n                    mode: BindingMode.OneWay);\r\n            }\r\n\r\n            ImageIcon = Template.FindName(\"PART_ImageIcon\", this) as Image;\r\n            if (ImageIcon != null)\r\n            {\r\n                var sourceBinding = new PriorityBinding();\r\n                sourceBinding.Bindings.Add(new Binding()\r\n                {\r\n                    Path = new PropertyPath(GetGameBindingPath(nameof(GamesCollectionViewEntry.IconObject))),\r\n                    Converter = new NullToDependencyPropertyUnsetConverter(),\r\n                    Mode = BindingMode.OneWay\r\n                });\r\n                sourceBinding.Bindings.Add(new Binding()\r\n                {\r\n                    Path = new PropertyPath(GetGameBindingPath(nameof(GamesCollectionViewEntry.DefaultIconObject))),\r\n                    Converter = new NullToDependencyPropertyUnsetConverter(),\r\n                    Mode = BindingMode.OneWay\r\n                });\r\n\r\n                BindingOperations.SetBinding(ImageIcon, Image.SourceProperty, sourceBinding);\r\n                BindingTools.SetBinding(ImageIcon,\r\n                    Image.VisibilityProperty,\r\n                    nameof(GameDetailsViewModel.IconVisibility),\r\n                    mode: BindingMode.OneWay);\r\n            }\r\n\r\n            ImageBackground = Template.FindName(\"PART_ImageBackground\", this) as FadeImage;\r\n            if (ImageBackground != null)\r\n            {\r\n                SetBackgroundBinding();\r\n                BindingTools.SetBinding(ImageBackground,\r\n                    Image.VisibilityProperty,\r\n                    nameof(GameDetailsViewModel.BackgroundVisibility),\r\n                    mode: BindingMode.OneWay);\r\n                BindingTools.SetBinding(ImageBackground,\r\n                    FadeImage.AnimationEnabledProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.BackgroundImageAnimation),\r\n                    mode: BindingMode.OneWay);\r\n            }\r\n\r\n            SetElemVisibility(ref ElemPlayTime, \"PART_ElemPlayTime\", nameof(GameDetailsViewModel.PlayTimeVisibility));\r\n            SetElemVisibility(ref ElemInstallSize, \"PART_ElemInstallSize\", nameof(GameDetailsViewModel.InstallSizeVisibility));\r\n            SetElemVisibility(ref ElemInstallDirectory, \"PART_ElemInstallDirectory\", nameof(GameDetailsViewModel.InstallDirectoryVisibility));\r\n            SetElemVisibility(ref ElemLastPlayed, \"PART_ElemLastPlayed\", nameof(GameDetailsViewModel.LastPlayedVisibility));\r\n            SetElemVisibility(ref ElemAdded, \"PART_ElemAdded\", nameof(GameDetailsViewModel.AddedVisibility));\r\n            SetElemVisibility(ref ElemRecentActivity, \"PART_ElemRecentActivity\", nameof(GameDetailsViewModel.RecentActivityVisibility));\r\n            SetElemVisibility(ref ElemCompletionStatus, \"PART_ElemCompletionStatus\", nameof(GameDetailsViewModel.CompletionStatusVisibility));\r\n            SetElemVisibility(ref ElemLibrary, \"PART_ElemLibrary\", nameof(GameDetailsViewModel.SourceLibraryVisibility));\r\n            SetElemVisibility(ref ElemPlatform, \"PART_ElemPlatform\", nameof(GameDetailsViewModel.PlatformVisibility));\r\n            SetElemVisibility(ref ElemGenres, \"PART_ElemGenres\", nameof(GameDetailsViewModel.GenreVisibility));\r\n            SetElemVisibility(ref ElemDevelopers, \"PART_ElemDevelopers\", nameof(GameDetailsViewModel.DeveloperVisibility));\r\n            SetElemVisibility(ref ElemPublishers, \"PART_ElemPublishers\", nameof(GameDetailsViewModel.PublisherVisibility));\r\n            SetElemVisibility(ref ElemReleaseDate, \"PART_ElemReleaseDate\", nameof(GameDetailsViewModel.ReleaseDateVisibility));\r\n            SetElemVisibility(ref ElemTags, \"PART_ElemTags\", nameof(GameDetailsViewModel.TagVisibility));\r\n            SetElemVisibility(ref ElemFeatures, \"PART_ElemFeatures\", nameof(GameDetailsViewModel.FeatureVisibility));\r\n            SetElemVisibility(ref ElemCategories, \"PART_ElemCategories\", nameof(GameDetailsViewModel.CategoryVisibility));\r\n            SetElemVisibility(ref ElemLinks, \"PART_ElemLinks\", nameof(GameDetailsViewModel.LinkVisibility));\r\n            SetElemVisibility(ref ElemDescription, \"PART_ElemDescription\", nameof(GameDetailsViewModel.DescriptionVisibility));\r\n            SetElemVisibility(ref ElemAgeRating, \"PART_ElemAgeRating\", nameof(GameDetailsViewModel.AgeRatingVisibility));\r\n            SetElemVisibility(ref ElemSeries, \"PART_ElemSeries\", nameof(GameDetailsViewModel.SeriesVisibility));\r\n            SetElemVisibility(ref ElemRegion, \"PART_ElemRegion\", nameof(GameDetailsViewModel.RegionVisibility));\r\n            SetElemVisibility(ref ElemSource, \"PART_ElemSource\", nameof(GameDetailsViewModel.SourceVisibility));\r\n            SetElemVisibility(ref ElemVersion, \"PART_ElemVersion\", nameof(GameDetailsViewModel.VersionVisibility));\r\n            SetElemVisibility(ref ElemCommunityScore, \"PART_ElemCommunityScore\", nameof(GameDetailsViewModel.CommunityScoreVisibility));\r\n            SetElemVisibility(ref ElemCriticScore, \"PART_ElemCriticScore\", nameof(GameDetailsViewModel.CriticScoreVisibility));\r\n            SetElemVisibility(ref ElemUserScore, \"PART_ElemUserScore\", nameof(GameDetailsViewModel.UserScoreVisibility));\r\n            SetElemVisibility(ref ElemNotes, \"PART_ElemNotes\", nameof(GameDetailsViewModel.NotesVisibility));\r\n\r\n            SetGameItemButtonBinding(ref ButtonLibrary, \"PART_ButtonLibrary\",\r\n                nameof(GameDetailsViewModel.SetLibraryFilterCommand),\r\n                GetGameBindingPath(nameof(GamesCollectionViewEntry.PluginId)),\r\n                GetGameBindingPath($\"{nameof(GamesCollectionViewEntry.LibraryPlugin)}.{nameof(GamesCollectionViewEntry.LibraryPlugin.Name)}\"),\r\n                nameof(GameDetailsViewModel.SourceLibraryVisibility));\r\n\r\n            SetGameItemButtonBinding(ref ButtonReleaseDate, \"PART_ButtonReleaseDate\",\r\n                nameof(GameDetailsViewModel.SetReleaseDateFilterCommand),\r\n                GetGameBindingPath(nameof(GamesCollectionViewEntry.ReleaseDate)),\r\n                GetGameBindingPath(nameof(GamesCollectionViewEntry.ReleaseDate)),\r\n                nameof(GameDetailsViewModel.ReleaseDateVisibility),\r\n                new ReleaseDateToStringConverter(),\r\n                mainModel.AppSettings.DateTimeFormatReleaseDate);\r\n\r\n            SetGameItemButtonBinding(ref ButtonVersion, \"PART_ButtonVersion\",\r\n                nameof(GameDetailsViewModel.SetVersionFilterCommand),\r\n                GetGameBindingPath(nameof(GamesCollectionViewEntry.Version)),\r\n                GetGameBindingPath(nameof(GamesCollectionViewEntry.Version)),\r\n                nameof(GameDetailsViewModel.VersionVisibility));\r\n\r\n            SetGameItemButtonBinding(ref ButtonSource, \"PART_ButtonSource\",\r\n                nameof(GameDetailsViewModel.SetSourceFilterCommand),\r\n                GetGameBindingPath(nameof(GamesCollectionViewEntry.Source)),\r\n                GetGameBindingPath($\"{nameof(GamesCollectionViewEntry.Source)}.{nameof(GamesCollectionViewEntry.Source.Name)}\"),\r\n                nameof(GameDetailsViewModel.SourceVisibility));\r\n\r\n            SetGameItemTextBinding(ref TextPlayTime, \"PART_TextPlayTime\",\r\n                nameof(GameDetailsViewModel.Game.Playtime),\r\n                nameof(GameDetailsViewModel.PlayTimeVisibility),\r\n                new PlayTimeToStringConverter(),\r\n                mainModel.AppSettings.PlaytimeUseDaysFormat);\r\n\r\n            SetGameItemTextBinding(ref TextInstallSize, \"PART_TextInstallSize\",\r\n                nameof(GameDetailsViewModel.Game.InstallSize),\r\n                nameof(GameDetailsViewModel.InstallSizeVisibility),\r\n                new NullableUlongBytesSizeToStringConverter());\r\n\r\n            SetGameItemButtonBinding(ref ButtonInstallDirectory, \"PART_ButtonInstallDirectory\",\r\n                nameof(GameDetailsViewModel.OpenGameLocationCommand),\r\n                GetGameBindingPath(nameof(GameDetailsViewModel.Game)),\r\n                GetGameBindingPath(nameof(GamesCollectionViewEntry.InstallDirectory)),\r\n                nameof(GameDetailsViewModel.InstallDirectoryVisibility));\r\n\r\n            SetGameItemTextBinding(ref TextLastActivity, \"PART_TextLastActivity\",\r\n                nameof(GameDetailsViewModel.Game.LastActivity),\r\n                nameof(GameDetailsViewModel.LastPlayedVisibility),\r\n                new DateTimeToLastPlayedConverter(),\r\n                mainModel.AppSettings.DateTimeFormatLastPlayed);\r\n\r\n            SetGameItemTextBinding(ref TextAdded, \"PART_TextAdded\",\r\n                nameof(GameDetailsViewModel.Game.Added),\r\n                nameof(GameDetailsViewModel.AddedVisibility),\r\n                new NullableDateToStringConverter(),\r\n                mainModel.AppSettings.DateTimeFormatAdded);\r\n\r\n            SetGameItemTextBinding(ref TextLastActivity, \"PART_TextRecentActivity\",\r\n                nameof(GameDetailsViewModel.Game.RecentActivity),\r\n                nameof(GameDetailsViewModel.RecentActivityVisibility),\r\n                new NullableDateToStringConverter(),\r\n                mainModel.AppSettings.DateTimeFormatRecentActivity);\r\n\r\n            SetGameItemButtonBinding(ref ButtonCompletionStatus, \"PART_ButtonCompletionStatus\",\r\n                nameof(GameDetailsViewModel.SetCompletionStatusFilterCommand),\r\n                GetGameBindingPath(nameof(GamesCollectionViewEntry.CompletionStatus)),\r\n                GetGameBindingPath($\"{nameof(GamesCollectionViewEntry.CompletionStatus)}.{nameof(GamesCollectionViewEntry.CompletionStatus.Name)}\"),\r\n                nameof(GameDetailsViewModel.CompletionStatusVisibility));\r\n\r\n            SetGameItemTextBinding(ref TextCommunityScore, \"PART_TextCommunityScore\",\r\n                nameof(GameDetailsViewModel.Game.CommunityScore),\r\n                nameof(GameDetailsViewModel.CommunityScoreVisibility));\r\n            if (TextCommunityScore != null)\r\n            {\r\n                BindingTools.SetBinding(TextCommunityScore,\r\n                    TextBlock.TagProperty,\r\n                    GetGameBindingPath(nameof(GamesCollectionViewEntry.CommunityScoreRating)));\r\n            }\r\n\r\n            SetGameItemTextBinding(ref TextCriticScore, \"PART_TextCriticScore\",\r\n                nameof(GameDetailsViewModel.Game.CriticScore),\r\n                nameof(GameDetailsViewModel.CriticScoreVisibility));\r\n            if (TextCriticScore != null)\r\n            {\r\n                BindingTools.SetBinding(TextCriticScore,\r\n                    TextBlock.TagProperty,\r\n                    GetGameBindingPath(nameof(GamesCollectionViewEntry.CriticScoreRating)));\r\n            }\r\n\r\n            SetGameItemTextBinding(ref TextUserScore, \"PART_TextUserScore\",\r\n                nameof(GameDetailsViewModel.Game.UserScore),\r\n                nameof(GameDetailsViewModel.UserScoreVisibility));\r\n            if (TextUserScore != null)\r\n            {\r\n                BindingTools.SetBinding(TextUserScore,\r\n                    TextBlock.TagProperty,\r\n                    GetGameBindingPath(nameof(GamesCollectionViewEntry.UserScoreRating)));\r\n            }\r\n\r\n            SetGameItemTextBinding(ref TextDisplayName, \"PART_TextDisplayName\",\r\n                nameof(GameDetailsViewModel.Game.DisplayName),\r\n                nameof(GameDetailsViewModel.NameVisibility));\r\n\r\n            SetItemsControlBinding(ref ItemsGenres, \"PART_ItemsGenres\",\r\n                nameof(GameDetailsViewModel.SetGenreFilterCommand),\r\n                nameof(GamesCollectionViewEntry.Genres),\r\n                nameof(GameDetailsViewModel.GenreVisibility));\r\n\r\n            SetItemsControlBinding(ref ItemsDevelopers, \"PART_ItemsDevelopers\",\r\n                nameof(GameDetailsViewModel.SetDeveloperFilterCommand),\r\n                nameof(GamesCollectionViewEntry.Developers),\r\n                nameof(GameDetailsViewModel.DeveloperVisibility));\r\n\r\n            SetItemsControlBinding(ref ItemsPublishers, \"PART_ItemsPublishers\",\r\n                nameof(GameDetailsViewModel.SetPublisherFilterCommand),\r\n                nameof(GamesCollectionViewEntry.Publishers),\r\n                nameof(GameDetailsViewModel.PublisherVisibility));\r\n\r\n            SetItemsControlBinding(ref ItemsCategories, \"PART_ItemsCategories\",\r\n                nameof(GameDetailsViewModel.SetCategoryFilterCommand),\r\n                nameof(GamesCollectionViewEntry.Categories),\r\n                nameof(GameDetailsViewModel.CategoryVisibility));\r\n\r\n            SetItemsControlBinding(ref ItemsTags, \"PART_ItemsTags\",\r\n                nameof(GameDetailsViewModel.SetTagFilterCommand),\r\n                nameof(GamesCollectionViewEntry.Tags),\r\n                nameof(GameDetailsViewModel.TagVisibility));\r\n\r\n            SetItemsControlBinding(ref ItemsFeatures, \"PART_ItemsFeatures\",\r\n                nameof(GameDetailsViewModel.SetFeatureFilterCommand),\r\n                nameof(GamesCollectionViewEntry.Features),\r\n                nameof(GameDetailsViewModel.FeatureVisibility));\r\n\r\n            SetItemsControlBinding(ref ItemsLinks, \"PART_ItemsLinks\",\r\n                nameof(GameDetailsViewModel.OpenLinkCommand),\r\n                nameof(GamesCollectionViewEntry.Links),\r\n                nameof(GameDetailsViewModel.LinkVisibility),\r\n                nameof(Link.Url));\r\n\r\n            SetItemsControlBinding(ref ItemsPlatforms, \"PART_ItemsPlatforms\",\r\n                nameof(GameDetailsViewModel.SetPlatformFilterCommand),\r\n                nameof(GamesCollectionViewEntry.Platforms),\r\n                nameof(GameDetailsViewModel.PlatformVisibility));\r\n\r\n            SetItemsControlBinding(ref ItemsAgeRatings, \"PART_ItemsAgeRatings\",\r\n                nameof(GameDetailsViewModel.SetAgeRatingFilterCommand),\r\n                nameof(GamesCollectionViewEntry.AgeRatings),\r\n                nameof(GameDetailsViewModel.AgeRatingVisibility));\r\n\r\n            SetItemsControlBinding(ref ItemsSeries, \"PART_ItemsSeries\",\r\n                nameof(GameDetailsViewModel.SetSeriesFilterCommand),\r\n                nameof(GamesCollectionViewEntry.Series),\r\n                nameof(GameDetailsViewModel.SeriesVisibility));\r\n\r\n            SetItemsControlBinding(ref ItemsRegions, \"PART_ItemsRegions\",\r\n                nameof(GameDetailsViewModel.SetRegionFilterCommand),\r\n                nameof(GamesCollectionViewEntry.Regions),\r\n                nameof(GameDetailsViewModel.RegionVisibility));\r\n\r\n            ControlTemplateTools.InitializePluginControls(\r\n                mainModel.Extensions,\r\n                Template,\r\n                this,\r\n                ApplicationMode.Desktop,\r\n                mainModel,\r\n                $\"{nameof(DesktopAppViewModel.SelectedGameDetails)}.{nameof(GameDetailsViewModel.Game)}.{nameof(GameDetailsViewModel.Game.Game)}\");\r\n\r\n            ScrollViewHost = Template.FindName(\"PART_ScrollViewHost\", this) as ScrollViewer;\r\n        }\r\n\r\n        private void SetBackgroundBinding()\r\n        {\r\n            if (mainModel.AppSettings.DetailsVisibility.BackgroundImage &&\r\n                mainModel.AppSettings.ViewSettings.GamesViewType == viewType)\r\n            {\r\n                ImageBackground.SourceUpdateDelay = 150;\r\n                BindingTools.SetBinding(ImageBackground,\r\n                    FadeImage.SourceProperty,\r\n                    mainModel,\r\n                    $\"{nameof(mainModel.SelectedGame)}.{nameof(GamesCollectionViewEntry.DisplayBackgroundImageObject)}\");\r\n            }\r\n            else\r\n            {\r\n                ImageBackground.Source = null;\r\n            }\r\n        }\r\n\r\n        private void SetItemsControlBinding(ref ItemsControl elem, string partId, string command, string listSource, string visibility, string tooltip = null)\r\n        {\r\n            elem = Template.FindName(partId, this) as ItemsControl;\r\n            if (elem != null)\r\n            {\r\n                elem.ItemTemplate = GetFieldItemTemplate(command, tooltip);\r\n                BindingTools.SetBinding(elem,\r\n                    ItemsControl.ItemsSourceProperty,\r\n                    GetGameBindingPath(listSource));\r\n                BindingTools.SetBinding(elem,\r\n                    TextBlock.VisibilityProperty,\r\n                    visibility);\r\n            }\r\n        }\r\n\r\n        private void SetElemVisibility(ref FrameworkElement elem, string partId, string binding)\r\n        {\r\n            elem = Template.FindName(partId, this) as FrameworkElement;\r\n            if (elem != null)\r\n            {\r\n                BindingTools.SetBinding(elem,\r\n                    FrameworkElement.VisibilityProperty,\r\n                    binding);\r\n            }\r\n        }\r\n\r\n        private void SetGameItemTextBinding(ref TextBlock text, string partId, string textContent, string visibility, IValueConverter converter = null, object converterParameter = null)\r\n        {\r\n            text = Template.FindName(partId, this) as TextBlock;\r\n            if (text != null)\r\n            {\r\n                BindingTools.SetBinding(text,\r\n                    TextBlock.TextProperty,\r\n                    GetGameBindingPath(textContent),\r\n                    converter: converter,\r\n                    converterParameter: converterParameter);\r\n                BindingTools.SetBinding(text,\r\n                    TextBlock.VisibilityProperty,\r\n                    visibility);\r\n            }\r\n        }\r\n\r\n        private void SetGameItemButtonBinding(ref Button button, string partId, string command, string commandParameter, string content, string visibility, IValueConverter contentConverter = null, object contentConverterParameter = null)\r\n        {\r\n            button = Template.FindName(partId, this) as Button;\r\n            if (button != null)\r\n            {\r\n                BindingTools.SetBinding(button,\r\n                    Button.CommandProperty,\r\n                    command);\r\n                BindingTools.SetBinding(button,\r\n                    Button.CommandParameterProperty,\r\n                    commandParameter);\r\n                BindingTools.SetBinding(button,\r\n                    Button.ContentProperty,\r\n                    content,\r\n                    converter: contentConverter,\r\n                    converterParameter: contentConverterParameter);\r\n                BindingTools.SetBinding(button,\r\n                    Button.VisibilityProperty,\r\n                    visibility);\r\n            }\r\n        }\r\n\r\n        private string GetGameBindingPath(string path)\r\n        {\r\n            return $\"{nameof(GameDetailsViewModel.Game)}.{path}\";\r\n        }\r\n\r\n        private DataTemplate GetFieldItemTemplate(string command, string tooltip = null)\r\n        {\r\n            XNamespace pns = \"http://schemas.microsoft.com/winfx/2006/xaml/presentation\";\r\n            var buttonElem = new XElement(pns + nameof(Button),\r\n                new XAttribute(\"Command\", $\"{{Binding DataContext.{command}, RelativeSource={{RelativeSource AncestorType=ItemsControl}}}}\"),\r\n                new XAttribute(\"CommandParameter\", \"{Binding}\"),\r\n                new XAttribute(\"Content\", \"{Binding Name}\"),\r\n                new XAttribute(\"Style\", \"{StaticResource PropertyItemButton}\"));\r\n\r\n            if (!tooltip.IsNullOrEmpty())\r\n            {\r\n                buttonElem.Add(new XAttribute(\"ToolTip\", $\"{{Binding {tooltip}}}\"));\r\n            }\r\n\r\n            var templateDoc = new XDocument(\r\n                new XElement(pns + nameof(DataTemplate), buttonElem)\r\n            );\r\n\r\n            return Xaml.FromString<DataTemplate>(templateDoc.ToString());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/GridViewGameOverview.cs",
    "content": "﻿using Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    public class GridViewGameOverview : GameOverview\r\n    {\r\n        static GridViewGameOverview()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(GridViewGameOverview), new FrameworkPropertyMetadata(typeof(GridViewGameOverview)));\r\n        }\r\n\r\n        public GridViewGameOverview() : base(DesktopView.Grid)\r\n        {\r\n        }\r\n\r\n        public GridViewGameOverview(DesktopAppViewModel mainModel) : base(DesktopView.Grid, mainModel)\r\n        {\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/Library.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.Converters;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.Extensions;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Effects;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ImageBackground\", Type = typeof(FadeImage))]\r\n    [TemplatePart(Name = \"PART_ViewDetails\", Type = typeof(Control))]\r\n    [TemplatePart(Name = \"PART_ViewGrid\", Type = typeof(Control))]\r\n    [TemplatePart(Name = \"PART_ViewList\", Type = typeof(Control))]\r\n    [TemplatePart(Name = \"PART_ElemNoGamesNotif\", Type = typeof(FrameworkElement))]\r\n    public class Library : Control\r\n    {\r\n        private readonly DesktopAppViewModel mainModel;\r\n        private FadeImage ImageBackground;\r\n        private Control ViewDetails;\r\n        private Control ViewGrid;\r\n        private Control ViewList;\r\n        private FrameworkElement ElemNoGamesNotif;\r\n\r\n        static Library()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(Library), new FrameworkPropertyMetadata(typeof(Library)));\r\n        }\r\n\r\n        public Library() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public Library(DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n\r\n            this.mainModel.AppSettings.PropertyChanged += AppSettings_PropertyChanged;\r\n            this.mainModel.AppSettings.ViewSettings.PropertyChanged += ViewSettings_PropertyChanged;\r\n        }\r\n\r\n        private void ViewSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(ViewSettings.GamesViewType))\r\n            {\r\n                SetBackgroundBinding();\r\n            }\r\n        }\r\n\r\n        private void AppSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(PlayniteSettings.ShowBackgroundImageOnWindow) ||\r\n                e.PropertyName == nameof(PlayniteSettings.ShowBackImageOnGridView))\r\n            {\r\n                SetBackgroundBinding();\r\n            }\r\n            else if (e.PropertyName == nameof(PlayniteSettings.DarkenWindowBackgroundImage) ||\r\n                     e.PropertyName == nameof(PlayniteSettings.BackgroundImageDarkAmount))\r\n            {\r\n                SetBackgroundEffect();\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            ImageBackground = Template.FindName(\"PART_ImageBackground\", this) as FadeImage;\r\n            if (ImageBackground != null)\r\n            {\r\n                BindingTools.SetBinding(ImageBackground,\r\n                    FadeImage.IsBlurEnabledProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.BlurWindowBackgroundImage),\r\n                    mode: BindingMode.OneWay);\r\n                BindingTools.SetBinding(ImageBackground,\r\n                    FadeImage.BlurAmountProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.BackgroundImageBlurAmount),\r\n                    mode: BindingMode.OneWay);\r\n                BindingTools.SetBinding(ImageBackground,\r\n                    FadeImage.HighQualityBlurProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.HighQualityBackgroundBlur),\r\n                    mode: BindingMode.OneWay);\r\n                BindingTools.SetBinding(ImageBackground,\r\n                    FadeImage.AnimationEnabledProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.BackgroundImageAnimation),\r\n                    mode: BindingMode.OneWay);\r\n            }\r\n\r\n            ElemNoGamesNotif = Template.FindName(\"PART_ElemNoGamesNotif\", this) as FrameworkElement;\r\n            if (ElemNoGamesNotif != null)\r\n            {\r\n                BindingTools.SetBinding(ElemNoGamesNotif,\r\n                    Control.VisibilityProperty,\r\n                    mainModel,\r\n                    $\"{nameof(mainModel.GamesView)}.{nameof(mainModel.GamesView.CollectionView)}.{nameof(mainModel.GamesView.Items.Count)}\",\r\n                    converter: new IntToVisibilityConverter(),\r\n                    converterParameter: 0);\r\n            }\r\n\r\n            SetBackgroundBinding();\r\n            SetBackgroundEffect();\r\n\r\n            SetViewBinding(ref ViewDetails, \"PART_ViewDetails\", DesktopView.Details);\r\n            SetViewBinding(ref ViewGrid, \"PART_ViewGrid\", DesktopView.Grid);\r\n            SetViewBinding(ref ViewList, \"PART_ViewList\", DesktopView.List);\r\n\r\n            ControlTemplateTools.InitializePluginControls(\r\n                mainModel.Extensions,\r\n                Template,\r\n                this,\r\n                SDK.ApplicationMode.Desktop,\r\n                mainModel,\r\n                $\"{nameof(DesktopAppViewModel.SelectedGameDetails)}.{nameof(GameDetailsViewModel.Game)}.{nameof(GameDetailsViewModel.Game.Game)}\");\r\n        }\r\n\r\n        private void SetViewBinding(ref Control elem, string partId, DesktopView type)\r\n        {\r\n            elem = Template.FindName(partId, this) as Control;\r\n            if (elem != null)\r\n            {\r\n                BindingTools.SetBinding(elem,\r\n                    Control.VisibilityProperty,\r\n                    mainModel.AppSettings.ViewSettings,\r\n                    nameof(ViewSettings.GamesViewType),\r\n                    converter: new EnumToVisibilityConverter(),\r\n                    converterParameter: type);\r\n                BindingTools.SetBinding(elem,\r\n                    Control.IsEnabledProperty,\r\n                    mainModel.AppSettings.ViewSettings,\r\n                    nameof(ViewSettings.GamesViewType),\r\n                    converter: new EnumToBooleanConverter(),\r\n                    converterParameter: type);\r\n            }\r\n        }\r\n\r\n        private void SetBackgroundBinding()\r\n        {\r\n            if (ImageBackground == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (mainModel.AppSettings.ShowBackgroundImageOnWindow &&\r\n                ((mainModel.AppSettings.ShowBackImageOnGridView && mainModel.AppSettings.ViewSettings.GamesViewType == DesktopView.Grid) ||\r\n                mainModel.AppSettings.ViewSettings.GamesViewType == DesktopView.Details))\r\n            {\r\n                ImageBackground.SourceUpdateDelay = 150;\r\n                BindingTools.SetBinding(ImageBackground,\r\n                    FadeImage.SourceProperty,\r\n                    mainModel,\r\n                    $\"{nameof(mainModel.SelectedGame)}.{nameof(GamesCollectionViewEntry.DisplayBackgroundImageObject)}\");\r\n            }\r\n            else\r\n            {\r\n                ImageBackground.Source = null;\r\n            }\r\n        }\r\n\r\n        private void SetBackgroundEffect()\r\n        {\r\n            if (ImageBackground != null)\r\n            {\r\n                if (mainModel.AppSettings.DarkenWindowBackgroundImage)\r\n                {\r\n                    ImageBackground.ImageDarkeningBrush = null;\r\n                    ImageBackground.ImageDarkeningBrush = new SolidColorBrush(new Color()\r\n                    {\r\n                        ScA = mainModel.AppSettings.BackgroundImageDarkAmount,\r\n                        ScR = 0,\r\n                        ScG = 0,\r\n                        ScB = 0\r\n                    });\r\n                }\r\n                else\r\n                {\r\n                    ImageBackground.ImageDarkeningBrush = null;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/LibraryDetailsView.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.Converters;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    public class LibraryDetailsView : BaseGamesView\r\n    {\r\n        static LibraryDetailsView()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(LibraryDetailsView), new FrameworkPropertyMetadata(typeof(LibraryDetailsView)));\r\n        }\r\n\r\n        public LibraryDetailsView() : base(DesktopView.Details)\r\n        {\r\n        }\r\n\r\n        public LibraryDetailsView(DesktopAppViewModel mainModel) : base (DesktopView.Details, mainModel)\r\n        {\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            if (ListGames != null)\r\n            {\r\n                ScrollViewerBehaviours.SetCustomScrollEnabled(ListGames, true);\r\n                BindingTools.SetBinding(ListGames,\r\n                    ScrollViewerBehaviours.SensitivityProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.DetailsViewScrollSensitivity));\r\n                BindingTools.SetBinding(ListGames,\r\n                    ScrollViewerBehaviours.SpeedProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.DetailsViewScrollSpeed),\r\n                    converter: new TicksToTimeSpanConverter());\r\n                BindingTools.SetBinding(ListGames,\r\n                    ScrollViewerBehaviours.SmoothScrollEnabledProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.DetailsViewSmoothScrollEnabled));\r\n            }\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/LibraryGridView.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.Converters;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Xml.Linq;\r\nusing BooleanToVisibilityConverter = Playnite.Converters.BooleanToVisibilityConverter;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_SliderZoom\", Type = typeof(SliderWithPopup))]\r\n    public class LibraryGridView : BaseGamesView\r\n    {\r\n        private SliderWithPopup SliderZoom;\r\n\r\n        private readonly ItemsPanelTemplate groupItemsPanel;\r\n        private readonly ItemsPanelTemplate standardItemsPanel;\r\n\r\n        static LibraryGridView()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(LibraryGridView), new FrameworkPropertyMetadata(typeof(LibraryGridView)));\r\n        }\r\n\r\n        public LibraryGridView() : base(DesktopView.Grid)\r\n        {\r\n            Loaded += LibraryGridView_Loaded;\r\n            Unloaded += LibraryGridView_Unloaded;\r\n            groupItemsPanel = GetItemsPanelTemplate();\r\n            standardItemsPanel = GetItemsPanelTemplate();\r\n        }\r\n\r\n        public LibraryGridView(DesktopAppViewModel mainModel) : base(DesktopView.Grid, mainModel)\r\n        {\r\n            Loaded += LibraryGridView_Loaded;\r\n            Unloaded += LibraryGridView_Unloaded;\r\n        }\r\n\r\n        private void LibraryGridView_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            mainModel.AppSettings.ViewSettings.PropertyChanged += ViewSettings_PropertyChanged;\r\n            mainModel.AppSettings.FilterSettings.FilterChanged += FilterSettings_FilterChanged;\r\n        }\r\n\r\n        private void LibraryGridView_Unloaded(object sender, RoutedEventArgs e)\r\n        {\r\n            mainModel.AppSettings.ViewSettings.PropertyChanged -= ViewSettings_PropertyChanged;\r\n            mainModel.AppSettings.FilterSettings.FilterChanged -= FilterSettings_FilterChanged;\r\n        }\r\n\r\n        private void ViewSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (mainModel.AppSettings.ViewSettings.GamesViewType != viewType)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (e.PropertyName == nameof(ViewSettings.GroupingOrder))\r\n            {\r\n                ListGames.ItemsPanel = GetItemsPanelTemplateCache();\r\n                var scrollViewer = ElementTreeHelper.FindVisualChildren< ScrollViewer>(ListGames).FirstOrDefault();\r\n                scrollViewer?.ScrollToTop();\r\n            }\r\n        }\r\n\r\n        private void FilterSettings_FilterChanged(object sender, FilterChangedEventArgs e)\r\n        {\r\n            if (mainModel.AppSettings.ViewSettings.GamesViewType != viewType)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var scrollViewer = ElementTreeHelper.FindVisualChildren<ScrollViewer>(ListGames).FirstOrDefault();\r\n            scrollViewer?.ScrollToTop();\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            if (ListGames != null)\r\n            {\r\n                ListGames.ItemsPanel = GetItemsPanelTemplateCache();\r\n                ScrollViewerBehaviours.SetCustomScrollEnabled(ListGames, true);\r\n                BindingTools.SetBinding(ListGames,\r\n                    ScrollViewerBehaviours.SensitivityProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.GridViewScrollSensitivity));\r\n                BindingTools.SetBinding(ListGames,\r\n                    ScrollViewerBehaviours.SpeedProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.GridViewScrollSpeed),\r\n                    converter: new TicksToTimeSpanConverter());\r\n                BindingTools.SetBinding(ListGames,\r\n                    ScrollViewerBehaviours.SmoothScrollEnabledProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.GridViewSmoothScrollEnabled));\r\n            }\r\n\r\n            if (ControlGameView != null)\r\n            {\r\n                BindingTools.SetBinding(ControlGameView,\r\n                    Control.VisibilityProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.GridViewSideBarVisible),\r\n                    converter: new BooleanToVisibilityConverter());\r\n            }\r\n\r\n            SliderZoom = Template.FindName(\"PART_SliderZoom\", this) as SliderWithPopup;\r\n            if (SliderZoom != null)\r\n            {\r\n                SliderZoom.SliderMaximumValue = ViewSettings.MaxGridItemWidth;\r\n                SliderZoom.SliderMinimumValue = ViewSettings.MinGridItemWidth;\r\n                BindingTools.SetBinding(SliderZoom,\r\n                    SliderWithPopup.SliderValueProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.GridItemWidth),\r\n                    BindingMode.TwoWay);\r\n                BindingTools.SetBinding(SliderZoom,\r\n                    SliderWithPopup.PopupLabelProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.GridItemWidth),\r\n                    converter: new CoversZoomToPercentageConverter(),\r\n                    stringFormat: \"{0}%\");\r\n            }\r\n        }\r\n\r\n        private ItemsPanelTemplate GetItemsPanelTemplateCache()\r\n        {\r\n            // This fixes an issue where WPF incorrectly sets parent virtualizing panel\r\n            // when switching from standard to gourping views.\r\n            return mainModel.AppSettings.ViewSettings.GroupingOrder == GroupableField.None ? standardItemsPanel : groupItemsPanel;\r\n        }\r\n\r\n        private ItemsPanelTemplate GetItemsPanelTemplate()\r\n        {\r\n            XNamespace pns = \"http://schemas.microsoft.com/winfx/2006/xaml/presentation\";\r\n            XNamespace pctrls = \"clr-namespace:Playnite.DesktopApp.Controls;assembly=Playnite.DesktopApp\";\r\n            var templateDoc = new XDocument(\r\n                new XElement(pns + nameof(ItemsPanelTemplate),\r\n                    new XElement(pctrls + nameof(GridViewPanel))));\r\n\r\n            return Xaml.FromString<ItemsPanelTemplate>(templateDoc.ToString());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/LibraryListView.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ListGames\", Type = typeof(GamesGridView))]\r\n    public class LibraryListView : Control\r\n    {\r\n        internal readonly DesktopAppViewModel mainModel;\r\n        internal GamesGridView ListGames;\r\n\r\n        static LibraryListView()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(LibraryListView), new FrameworkPropertyMetadata(typeof(LibraryListView)));\r\n        }\r\n\r\n        public LibraryListView() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public LibraryListView(DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n\r\n            this.mainModel.AppSettings.ViewSettings.PropertyChanged += ViewSettings_PropertyChanged;\r\n        }\r\n\r\n        private void ViewSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(ViewSettings.GamesViewType))\r\n            {\r\n                if (ListGames != null)\r\n                {\r\n                    SetListGamesBinding();\r\n                }\r\n            }\r\n        }\r\n\r\n        private void SetListGamesBinding()\r\n        {\r\n            if (mainModel.AppSettings.ViewSettings.GamesViewType == DesktopView.List)\r\n            {\r\n                BindingTools.SetBinding(ListGames,\r\n                    GamesGridView.ItemsSourceProperty,\r\n                    mainModel,\r\n                    $\"{nameof(mainModel.GamesView)}.{nameof(DesktopCollectionView.CollectionView)}\");\r\n                BindingTools.SetBinding(ListGames,\r\n                    GamesGridView.SelectedItemsListProperty,\r\n                    mainModel,\r\n                    nameof(DesktopAppViewModel.SelectedGamesBinder),\r\n                    BindingMode.TwoWay);\r\n            }\r\n            else\r\n            {\r\n                BindingTools.ClearBinding(ListGames, GamesGridView.SelectedItemsListProperty);\r\n                ListGames.ItemsSource = null;\r\n            }\r\n        }\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            ListGames = Template.FindName(\"PART_ListGames\", this) as GamesGridView;\r\n            if (ListGames != null)\r\n            {\r\n                SetListGamesBinding();\r\n                ListGames.AppSettings = mainModel.AppSettings;\r\n                ScrollViewerBehaviours.SetCustomScrollEnabled(ListGames.GridGames, true);\r\n                BindingTools.SetBinding(ListGames.GridGames,\r\n                    ScrollViewerBehaviours.SensitivityProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.ListViewScrollSensitivity));\r\n                BindingTools.SetBinding(ListGames.GridGames,\r\n                    ScrollViewerBehaviours.SpeedProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.ListViewScrollSpeed),\r\n                    converter: new Converters.TicksToTimeSpanConverter());\r\n                BindingTools.SetBinding(ListGames.GridGames,\r\n                    ScrollViewerBehaviours.SmoothScrollEnabledProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.ListViewSmoothScrollEnabled));\r\n            }\r\n\r\n            ControlTemplateTools.InitializePluginControls(\r\n                mainModel.Extensions,\r\n                Template,\r\n                this,\r\n                SDK.ApplicationMode.Desktop,\r\n                mainModel,\r\n                $\"{nameof(DesktopAppViewModel.SelectedGameDetails)}.{nameof(GameDetailsViewModel.Game)}.{nameof(GameDetailsViewModel.Game.Game)}\");\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/MainWindow.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_Sidebar\", Type = typeof(Sidebar))]\r\n    [TemplatePart(Name = \"PART_ContentView\", Type = typeof(ContentControl))]\r\n    public class MainWindow : Control\r\n    {\r\n        private readonly DesktopAppViewModel mainModel;\r\n        private Sidebar Sidebar;\r\n        private ContentControl ContentView;\r\n\r\n        static MainWindow()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(MainWindow), new FrameworkPropertyMetadata(typeof(MainWindow)));\r\n        }\r\n\r\n        public MainWindow() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public MainWindow(DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n\r\n            DataContext = this.mainModel;\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            Sidebar = Template.FindName(\"PART_Sidebar\", this) as Sidebar;\r\n            if (Sidebar != null)\r\n            {\r\n                BindingTools.SetBinding(Sidebar,\r\n                    Sidebar.VisibilityProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.ShowSidebar),\r\n                    converter: new BooleanToVisibilityConverter());\r\n            }\r\n\r\n            ContentView = Template.FindName(\"PART_ContentView\", this) as ContentControl;\r\n            if (ContentView != null)\r\n            {\r\n                BindingTools.SetBinding(ContentView,\r\n                    ContentControl.ContentProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.ActiveView));\r\n            }\r\n\r\n            ControlTemplateTools.InitializePluginControls(\r\n                mainModel.Extensions,\r\n                Template,\r\n                this,\r\n                SDK.ApplicationMode.Desktop,\r\n                mainModel,\r\n                $\"{nameof(DesktopAppViewModel.SelectedGameDetails)}.{nameof(GameDetailsViewModel.Game)}.{nameof(GameDetailsViewModel.Game.Game)}\");\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/NotificationPanel.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.API.DesignData;\r\nusing Playnite.Common;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ButtonClose\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ButtonDismissAll\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ItemsMessages\", Type = typeof(ItemsControl))]\r\n    public class NotificationPanel : Control\r\n    {\r\n        private readonly DesktopAppViewModel mainModel;\r\n        private ButtonBase ButtonClose;\r\n        private ButtonBase ButtonDismissAll;\r\n        private ItemsControl ItemsMessages;\r\n\r\n        static NotificationPanel()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(NotificationPanel), new FrameworkPropertyMetadata(typeof(NotificationPanel)));\r\n        }\r\n\r\n        public NotificationPanel() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public NotificationPanel(DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            ButtonClose = Template.FindName(\"PART_ButtonClose\", this) as ButtonBase;\r\n            if (ButtonClose != null)\r\n            {\r\n                ButtonClose.Command = mainModel.CloseNotificationPanelCommand;\r\n            }\r\n\r\n            ButtonDismissAll = Template.FindName(\"PART_ButtonDismissAll\", this) as ButtonBase;\r\n            if (ButtonDismissAll != null)\r\n            {\r\n                ButtonDismissAll.Command = mainModel.ClearMessagesCommand;\r\n            }\r\n\r\n            ItemsMessages = Template.FindName(\"PART_ItemsMessages\", this) as ItemsControl;\r\n            if (ItemsMessages != null)\r\n            {\r\n                if (!DesignerProperties.GetIsInDesignMode(this)) // Because of mainModel.App reference\r\n                {\r\n                    BindingTools.SetBinding(ItemsMessages,\r\n                        ItemsControl.ItemsSourceProperty,\r\n                        mainModel.App.Notifications,\r\n                        nameof(INotificationsAPI.Messages));\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/SearchWindow.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ImageGameIcon\", Type = typeof(Image))]\r\n    [TemplatePart(Name = \"PART_ImageLibraryIcon\", Type = typeof(Image))]\r\n    [TemplatePart(Name = \"PART_TextName\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_ItemsAdditionalInfo\", Type = typeof(ItemsControl))]\r\n    [TemplatePart(Name = \"PART_ElemHiddenStatus\", Type = typeof(FrameworkElement))]\r\n    public class SearchWindowGameItem : Control\r\n    {\r\n        private readonly DesktopAppViewModel mainModel;\r\n\r\n        private Image ImageGameIcon;\r\n        private Image ImageLibraryIcon;\r\n        private TextBlock TextName;\r\n        private ItemsControl ItemsAdditionalInfo;\r\n        private FrameworkElement ElemHiddenStatus;\r\n\r\n        static SearchWindowGameItem()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(SearchWindowGameItem), new FrameworkPropertyMetadata(typeof(SearchWindowGameItem)));\r\n        }\r\n\r\n        public SearchWindowGameItem() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public SearchWindowGameItem(DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerTools.IsInDesignMode)\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n        }\r\n\r\n        private string GetBindingPath(string targetName)\r\n        {\r\n            return $\"{nameof(GameSearchItemWrapper.GameView)}.{targetName}\";\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            ImageGameIcon = Template.FindName(\"PART_ImageGameIcon\", this) as Image;\r\n            if (ImageGameIcon != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    ImageGameIcon,\r\n                    Image.VisibilityProperty,\r\n                    mainModel.AppSettings.SearchWindowVisibility,\r\n                    nameof(SearchWindowVisibilitySettings.GameIcon),\r\n                    converter: Converters.BooleanToVisibilityConverter.Instance);\r\n\r\n                var sourceBinding = new PriorityBinding();\r\n                sourceBinding.Bindings.Add(new Binding\r\n                {\r\n                    Path = new PropertyPath(GetBindingPath(nameof(GamesCollectionViewEntry.IconObject))),\r\n                    Converter = new NullToDependencyPropertyUnsetConverter(),\r\n                    Mode = BindingMode.OneTime\r\n                });\r\n                sourceBinding.Bindings.Add(new Binding\r\n                {\r\n                    Path = new PropertyPath(GetBindingPath(nameof(GamesCollectionViewEntry.DefaultIconObject))),\r\n                    Mode = BindingMode.OneTime\r\n                });\r\n\r\n                BindingOperations.SetBinding(ImageGameIcon, Image.SourceProperty, sourceBinding);\r\n            }\r\n\r\n            ImageLibraryIcon = Template.FindName(\"PART_ImageLibraryIcon\", this) as Image;\r\n            if (ImageLibraryIcon != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    ImageLibraryIcon,\r\n                    Image.SourceProperty,\r\n                    GetBindingPath(nameof(GamesCollectionViewEntry.LibraryIcon)),\r\n                    BindingMode.OneTime);\r\n\r\n                var visibilityBinding = new MultiBinding();\r\n                visibilityBinding.Converter = Converters.MultiBooleanToVisibilityConverter.Instance;\r\n                visibilityBinding.Bindings.Add(new Binding\r\n                {\r\n                    Path = new PropertyPath(GetBindingPath(nameof(GamesCollectionViewEntry.LibraryIcon))),\r\n                    Mode = BindingMode.OneTime,\r\n                    Converter = NullToBoolConverter.Instance\r\n                });\r\n                visibilityBinding.Bindings.Add(new Binding\r\n                {\r\n                    Path = new PropertyPath(nameof(SearchWindowVisibilitySettings.LibraryIcon)),\r\n                    Source = mainModel.AppSettings.SearchWindowVisibility,\r\n                    Mode = BindingMode.OneTime\r\n                });\r\n\r\n                BindingTools.SetBinding(\r\n                    ImageLibraryIcon,\r\n                    Image.VisibilityProperty,\r\n                    visibilityBinding);\r\n            }\r\n\r\n            TextName = Template.FindName(\"PART_TextName\", this) as TextBlock;\r\n            if (TextName != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    TextName,\r\n                    TextBlock.TextProperty,\r\n                    GetBindingPath(nameof(GamesCollectionViewEntry.DisplayName)),\r\n                    BindingMode.OneTime);\r\n            }\r\n\r\n            ElemHiddenStatus = Template.FindName(\"PART_ElemHiddenStatus\", this) as FrameworkElement;\r\n            if (ElemHiddenStatus != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    ElemHiddenStatus,\r\n                    FrameworkElement.VisibilityProperty,\r\n                    mainModel.AppSettings.SearchWindowVisibility,\r\n                    nameof(SearchWindowVisibilitySettings.HiddenStatus),\r\n                    converter: Converters.BooleanToVisibilityConverter.Instance);\r\n\r\n                BindingTools.SetBinding(\r\n                    ElemHiddenStatus,\r\n                    FrameworkElement.VisibilityProperty,\r\n                    GetBindingPath(nameof(GamesCollectionViewEntry.Hidden)),\r\n                    mode: BindingMode.OneTime,\r\n                    converter: Converters.BooleanToVisibilityConverter.Instance);\r\n            }\r\n\r\n            ItemsAdditionalInfo = Template.FindName(\"PART_ItemsAdditionalInfo\", this) as ItemsControl;\r\n            if (ItemsAdditionalInfo != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    ItemsAdditionalInfo,\r\n                    ItemsControl.ItemsSourceProperty,\r\n                    nameof(GameSearchItemWrapper.AdditionalInfo),\r\n                    BindingMode.OneTime);\r\n            }\r\n        }\r\n    }\r\n\r\n    [TemplatePart(Name = \"PART_ContentIcon\", Type = typeof(ContentControl))]\r\n    [TemplatePart(Name = \"PART_TextName\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_TextDescription\", Type = typeof(TextBlock))]\r\n    public class SearchWindowSearchItem : Control\r\n    {\r\n        private ContentControl ContentIcon;\r\n        private TextBlock TextName;\r\n        private TextBlock TextDescription;\r\n\r\n        static SearchWindowSearchItem()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(SearchWindowSearchItem), new FrameworkPropertyMetadata(typeof(SearchWindowSearchItem)));\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            ContentIcon = Template.FindName(\"PART_ContentIcon\", this) as ContentControl;\r\n            if (ContentIcon != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    ContentIcon,\r\n                    ContentControl.ContentProperty,\r\n                    nameof(SearchItemWrapper.ItemIcon));\r\n            }\r\n\r\n            TextName = Template.FindName(\"PART_TextName\", this) as TextBlock;\r\n            if (TextName != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    TextName,\r\n                    TextBlock.TextProperty,\r\n                    nameof(SearchItemWrapper.Item.Name),\r\n                    BindingMode.OneTime);\r\n            }\r\n\r\n            TextDescription = Template.FindName(\"PART_TextDescription\", this) as TextBlock;\r\n            if (TextDescription != null)\r\n            {\r\n                BindingTools.SetBinding(\r\n                    TextDescription,\r\n                    TextBlock.TextProperty,\r\n                    nameof(SearchItemWrapper.Item.Description),\r\n                    mode: BindingMode.OneTime);\r\n                BindingTools.SetBinding(\r\n                    TextDescription,\r\n                    TextBlock.VisibilityProperty,\r\n                    nameof(SearchItemWrapper.Item.Description),\r\n                    mode: BindingMode.OneTime,\r\n                    converter: StringNullOrEmptyToVisibilityConverter.Instance);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/Sidebar.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ElemMainMenu\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_PanelSideBarItems\", Type = typeof(Panel))]\r\n    public class Sidebar : Control\r\n    {\r\n        private readonly DesktopAppViewModel mainModel;\r\n        private Panel PanelSideBarItems;\r\n        private FrameworkElement ElemMainMenu;\r\n\r\n        static Sidebar()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(Sidebar), new FrameworkPropertyMetadata(typeof(Sidebar)));\r\n        }\r\n\r\n        public Sidebar() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public Sidebar(DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n\r\n            DataContext = this.mainModel;\r\n            Loaded += Sidebar_Loaded;\r\n            Unloaded += Sidebar_Unloaded;\r\n        }\r\n\r\n        private void Sidebar_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            mainModel.SidebarItems.CollectionChanged += SidebarItems_CollectionChanged;\r\n        }\r\n\r\n        private void Sidebar_Unloaded(object sender, RoutedEventArgs e)\r\n        {\r\n            mainModel.SidebarItems.CollectionChanged -= SidebarItems_CollectionChanged;\r\n        }\r\n\r\n        private void SidebarItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)\r\n        {\r\n            LoadSidebarItems();\r\n        }\r\n\r\n        public void LoadSidebarItems()\r\n        {\r\n            if (PanelSideBarItems == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            PanelSideBarItems.Children.Clear();\r\n            foreach (var sideItem in mainModel.SidebarItems)\r\n            {\r\n                PanelSideBarItems.Children.Add(new SidebarItem { DataContext = sideItem });\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            PanelSideBarItems = Template.FindName(\"PART_PanelSideBarItems\", this) as Panel;\r\n            if (PanelSideBarItems != null)\r\n            {\r\n                LoadSidebarItems();\r\n            }\r\n\r\n            ElemMainMenu = Template.FindName(\"PART_ElemMainMenu\", this) as FrameworkElement;\r\n            if (ElemMainMenu != null)\r\n            {\r\n                LeftClickContextMenuBehavior.SetEnabled(ElemMainMenu, true);\r\n                ElemMainMenu.ContextMenu = new MainMenu(mainModel)\r\n                {\r\n                    StaysOpen = false,\r\n                    Placement = PlacementMode.Bottom\r\n                };\r\n                ElemMainMenu.ContextMenu.SetResourceReference(ContextMenu.StyleProperty, \"TopPanelMenu\");\r\n                BindingTools.SetBinding(ElemMainMenu,\r\n                    FrameworkElement.VisibilityProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.ShowMainMenuOnTopPanel),\r\n                    converter: new InvertedBooleanToVisibilityConverter());\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Controls/Views/TopPanel.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\nusing BooleanToVisibilityConverter = System.Windows.Controls.BooleanToVisibilityConverter;\r\n\r\nnamespace Playnite.DesktopApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ElemMainMenu\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_TextMainSearch\", Type = typeof(SearchBox))]\r\n    [TemplatePart(Name = \"PART_ToggleFilter\", Type = typeof(ToggleButton))]\r\n    [TemplatePart(Name = \"PART_ToggleNotifications\", Type = typeof(ToggleButton))]\r\n    [TemplatePart(Name = \"PART_ProgressGlobal\", Type = typeof(ProgressBar))]\r\n    [TemplatePart(Name = \"PART_TextProgressText\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_ButtonProgressCancel\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_PanelMainItems\", Type = typeof(Panel))]\r\n    [TemplatePart(Name = \"PART_PanelMainPluginItems\", Type = typeof(Panel))]\r\n    public class TopPanel : Control\r\n    {\r\n        private readonly DesktopAppViewModel mainModel;\r\n        private FrameworkElement ElemMainMenu;\r\n        private SearchBox TextMainSearch;\r\n        private ToggleButton ToggleFilter;\r\n        private ToggleButton ToggleNotifications;\r\n        private ProgressBar ProgressGlobal;\r\n        private TextBlock TextProgressText;\r\n        private ButtonBase ButtonProgressCancel;\r\n        private Panel PanelMainItems;\r\n        private Panel PanelMainPluginItems;\r\n\r\n        private TopPanelWrapperItem ButtonViewSettings;\r\n        private TopPanelWrapperItem ButtonGroupSettings;\r\n        private TopPanelWrapperItem ButtonSortSettings;\r\n        private TopPanelWrapperItem ButtonFilterPresets;\r\n        private TopPanelWrapperItem ButtonExplorerSwitch;\r\n        private TopPanelWrapperItem ButtonSearch;\r\n\r\n        private TopPanelWrapperItem ButtonSwitchDetailsView;\r\n        private TopPanelWrapperItem ButtonSwitchGridView;\r\n        private TopPanelWrapperItem ButtonSwitchListView;\r\n        private TopPanelWrapperItem ButtonSelectRandomGame;\r\n        private TopPanelWrapperItem ButtonViewSelectRandomGame;\r\n\r\n        private Canvas LeftViewSeparator = new Canvas();\r\n        private Canvas RightViewSeparator = new Canvas();\r\n\r\n        static TopPanel()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(TopPanel), new FrameworkPropertyMetadata(typeof(TopPanel)));\r\n        }\r\n\r\n        public TopPanel() : this(DesktopApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public TopPanel(DesktopAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n\r\n            Loaded += TopPanel_Loaded;\r\n            Unloaded += TopPanel_Unloaded;\r\n        }\r\n\r\n        private void TopPanel_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            mainModel.AppSettings.PropertyChanged += AppSettings_PropertyChanged;\r\n        }\r\n\r\n        private void TopPanel_Unloaded(object sender, RoutedEventArgs e)\r\n        {\r\n            mainModel.AppSettings.PropertyChanged -= AppSettings_PropertyChanged;\r\n        }\r\n\r\n        private void AppSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName.StartsWith(\"ShowTopPanel\"))\r\n            {\r\n                SetButtonVisibility();\r\n            }\r\n            else if (e.PropertyName == nameof(PlayniteSettings.TopPanelSectionSeparatorWidth))\r\n            {\r\n                LeftViewSeparator.Width = mainModel.AppSettings.TopPanelSectionSeparatorWidth;\r\n                RightViewSeparator.Width = mainModel.AppSettings.TopPanelSectionSeparatorWidth;\r\n            }\r\n        }\r\n\r\n        private void SetButtonVisibility()\r\n        {\r\n            ButtonViewSettings.PanelItem.Visible = mainModel.AppSettings.ShowTopPanelGeneralViewItem;\r\n            ButtonGroupSettings.PanelItem.Visible = mainModel.AppSettings.ShowTopPanelGroupingItem;\r\n            ButtonSortSettings.PanelItem.Visible = mainModel.AppSettings.ShowTopPanelSortingItem;\r\n            ButtonFilterPresets.PanelItem.Visible = mainModel.AppSettings.ShowTopPanelFilterPresetsItem;\r\n            ButtonExplorerSwitch.PanelItem.Visible = mainModel.AppSettings.ShowTopPanelExplorerSwitch;\r\n            ButtonSearch.PanelItem.Visible = mainModel.AppSettings.ShowTopPanelSearchButton;\r\n\r\n            ButtonSwitchDetailsView.PanelItem.Visible = mainModel.AppSettings.ShowTopPanelDetailsViewSwitch;\r\n            ButtonSwitchGridView.PanelItem.Visible = mainModel.AppSettings.ShowTopPanelGridViewSwitch;\r\n            ButtonSwitchListView.PanelItem.Visible = mainModel.AppSettings.ShowTopPanelListViewSwitch;\r\n            ButtonSelectRandomGame.PanelItem.Visible = mainModel.AppSettings.ShowTopPanelSelectRandomGameButton;\r\n            ButtonViewSelectRandomGame.PanelItem.Visible = mainModel.AppSettings.ShowTopPanelViewSelectRandomGameButton;\r\n\r\n            var showSeparators = ButtonSwitchDetailsView.Visible || ButtonSwitchGridView.Visible || ButtonSwitchListView.Visible;\r\n            LeftViewSeparator.Visibility = showSeparators ? Visibility.Visible : Visibility.Collapsed;\r\n            RightViewSeparator.Visibility = showSeparators ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        private TopPanelItem AssignPanelButton(string contentTemplate, ContextMenu menu, string tooltip, out TopPanelWrapperItem panelItem)\r\n        {\r\n            tooltip = tooltip.StartsWith(\"LOC\", StringComparison.Ordinal) ? ResourceProvider.GetString(tooltip) : tooltip;\r\n            panelItem = new TopPanelWrapperItem(new SDK.Plugins.TopPanelItem { Title = tooltip }, mainModel);\r\n            var item = new TopPanelItem() { DataContext = panelItem };\r\n            item.SetResourceReference(TopPanelItem.ContentTemplateProperty, contentTemplate);\r\n            LeftClickContextMenuBehavior.SetEnabled(item, true);\r\n            menu.SetResourceReference(ContextMenu.StyleProperty, \"TopPanelMenu\");\r\n            item.ContextMenu = menu;\r\n            return item;\r\n        }\r\n\r\n        private TopPanelItem AssignPanelButton(string contentTemplate, RelayCommandBase command, string tooltip, out TopPanelWrapperItem panelItem)\r\n        {\r\n            tooltip = tooltip.StartsWith(\"LOC\", StringComparison.Ordinal) ? ResourceProvider.GetString(tooltip) : tooltip;\r\n            panelItem = new TopPanelWrapperItem(new SDK.Plugins.TopPanelItem { Title = tooltip }, mainModel)\r\n            {\r\n                Command = command\r\n            };\r\n\r\n            var item = new TopPanelItem() { DataContext = panelItem };\r\n            item.SetResourceReference(TopPanelItem.ContentTemplateProperty, contentTemplate);\r\n            return item;\r\n        }\r\n\r\n        private TopPanelItem AssignPluginButton(TopPanelWrapperItem item)\r\n        {\r\n            var button = new TopPanelItem() { DataContext = item };\r\n            return button;\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            PanelMainItems = Template.FindName(\"PART_PanelMainItems\", this) as Panel;\r\n            if (PanelMainItems != null)\r\n            {\r\n                PanelMainItems.Children.Add(AssignPanelButton(\"TopPanelSearchButtonTemplate\", mainModel.OpenGlobalSearchCommand, LOC.OpenSearch, out ButtonSearch));\r\n                PanelMainItems.Children.Add(AssignPanelButton(\"TopPanelGeneralViewSettingsTemplate\", new ViewSettingsMenu(mainModel.AppSettings), LOC.SettingsTopPanelGeneralViewItem, out ButtonViewSettings));\r\n                PanelMainItems.Children.Add(AssignPanelButton(\"TopPanelFilterPresetsSelectionTemplate\", new FilterPresetsMenu(mainModel), LOC.SettingsTopPanelFilterPresetsItem, out ButtonFilterPresets));\r\n                PanelMainItems.Children.Add(AssignPanelButton(\"TopPanelGroupSettingsTemplate\", new GroupSettingsMenu(mainModel.AppSettings), LOC.SettingsTopPanelGroupingItem, out ButtonGroupSettings));\r\n                PanelMainItems.Children.Add(AssignPanelButton(\"TopPanelSortSettingsTemplate\", new SortSettingsMenu(mainModel.AppSettings), LOC.SettingsTopPanelSortingItem, out ButtonSortSettings));\r\n\r\n                LeftViewSeparator.Width = mainModel.AppSettings.TopPanelSectionSeparatorWidth;\r\n                RightViewSeparator.Width = mainModel.AppSettings.TopPanelSectionSeparatorWidth;\r\n                PanelMainItems.Children.Add(LeftViewSeparator);\r\n\r\n                var detailsButton = AssignPanelButton(\"TopPanelSwitchDetailsViewTemplate\", mainModel.SwitchDetailsViewCommand, DesktopView.Details.GetDescription(), out ButtonSwitchDetailsView);\r\n                BindingTools.SetBinding(detailsButton,\r\n                    TopPanelItem.IsToggledProperty,\r\n                    mainModel.AppSettings.ViewSettings,\r\n                    nameof(ViewSettings.GamesViewType),\r\n                    converter: new EnumToBooleanConverter(),\r\n                    converterParameter: DesktopView.Details);\r\n                PanelMainItems.Children.Add(detailsButton);\r\n\r\n                var gridButton = AssignPanelButton(\"TopPanelSwitchGridViewTemplate\", mainModel.SwitchGridViewCommand, DesktopView.Grid.GetDescription(), out ButtonSwitchGridView);\r\n                BindingTools.SetBinding(gridButton,\r\n                    TopPanelItem.IsToggledProperty,\r\n                    mainModel.AppSettings.ViewSettings,\r\n                    nameof(ViewSettings.GamesViewType),\r\n                    converter: new EnumToBooleanConverter(),\r\n                    converterParameter: DesktopView.Grid);\r\n                PanelMainItems.Children.Add(gridButton);\r\n\r\n                var listButton = AssignPanelButton(\"TopPanelSwitchListViewTemplate\", mainModel.SwitchListViewCommand, DesktopView.List.GetDescription(), out ButtonSwitchListView);\r\n                BindingTools.SetBinding(listButton,\r\n                    TopPanelItem.IsToggledProperty,\r\n                    mainModel.AppSettings.ViewSettings,\r\n                    nameof(ViewSettings.GamesViewType),\r\n                    converter: new EnumToBooleanConverter(),\r\n                    converterParameter: DesktopView.List);\r\n                PanelMainItems.Children.Add(listButton);\r\n                PanelMainItems.Children.Add(RightViewSeparator);\r\n\r\n                var updatesButton = AssignPanelButton(\"TopPanelUpdateButtonTemplate\", mainModel.OpenUpdatesCommand, ResourceProvider.GetString(LOC.UpdateIsAvailableNotificationBody), out _);\r\n                BindingTools.SetBinding(updatesButton,\r\n                    Button.VisibilityProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.UpdatesAvailable),\r\n                    converter: new BooleanToVisibilityConverter());\r\n                PanelMainItems.Children.Add(updatesButton);\r\n                PanelMainItems.Children.Add(AssignPanelButton(\"TopPanelSelectRandomGameButtonTemplate\", mainModel.SelectRandomGameCommand, ResourceProvider.GetString(LOC.TopPanelSelectRandomGameButton), out ButtonSelectRandomGame));\r\n                PanelMainItems.Children.Add(AssignPanelButton(\"TopPanelViewSelectRandomGameButtonTemplate\", mainModel.ViewSelectRandomGameCommand, ResourceProvider.GetString(LOC.TopPanelViewSelectRandomGameButtonTooltip), out ButtonViewSelectRandomGame));\r\n\r\n                var explorerButton = AssignPanelButton(\"TopPanelExplorerSwitchTemplate\", mainModel.ToggleExplorerPanelCommand, ResourceProvider.GetString(LOC.TopPanelExplorerSwitch), out ButtonExplorerSwitch);\r\n                BindingTools.SetBinding(explorerButton,\r\n                    TopPanelItem.IsToggledProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.ExplorerPanelVisible));\r\n                PanelMainItems.Children.Add(explorerButton);\r\n                SetButtonVisibility();\r\n            }\r\n\r\n            PanelMainPluginItems = Template.FindName(\"PART_PanelMainPluginItems\", this) as Panel;\r\n            if (PanelMainPluginItems != null)\r\n            {\r\n                PanelMainPluginItems.Children.Clear();\r\n                foreach (var item in mainModel.GetTopPanelPluginItems())\r\n                {\r\n                    PanelMainPluginItems.Children.Add(AssignPluginButton(item));\r\n                }\r\n            }\r\n\r\n            ElemMainMenu = Template.FindName(\"PART_ElemMainMenu\", this) as FrameworkElement;\r\n            if (ElemMainMenu != null)\r\n            {\r\n                LeftClickContextMenuBehavior.SetEnabled(ElemMainMenu, true);\r\n                ElemMainMenu.ContextMenu = new MainMenu(mainModel);\r\n                ElemMainMenu.ContextMenu.SetResourceReference(ContextMenu.StyleProperty, \"TopPanelMenu\");\r\n\r\n                BindingTools.SetBinding(ElemMainMenu,\r\n                    FrameworkElement.VisibilityProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.ShowMainMenuOnTopPanel),\r\n                    converter: new BooleanToVisibilityConverter());\r\n            }\r\n\r\n            TextMainSearch = Template.FindName(\"PART_TextMainSearch\", this) as SearchBox;\r\n            if (TextMainSearch != null)\r\n            {\r\n                BindingTools.SetBinding(TextMainSearch,\r\n                    SearchBox.TextProperty,\r\n                    mainModel.AppSettings.FilterSettings,\r\n                    nameof(FilterSettings.Name),\r\n                    BindingMode.TwoWay,\r\n                    delay: 100);\r\n                BindingTools.SetBinding(TextMainSearch,\r\n                    SearchBox.VisibilityProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.ShowTopPanelSearchBox),\r\n                    converter: new BooleanToVisibilityConverter());\r\n                BindingTools.SetBinding(TextMainSearch,\r\n                    SearchBox.IsFocusedProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.SearchOpened),\r\n                    BindingMode.TwoWay);\r\n            }\r\n\r\n            ToggleFilter = Template.FindName(\"PART_ToggleFilter\", this) as ToggleButton;\r\n            if (ToggleFilter != null)\r\n            {\r\n                BindingTools.SetBinding(ToggleFilter,\r\n                    ToggleButton.IsCheckedProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.FilterPanelVisible),\r\n                    BindingMode.TwoWay);\r\n                BindingTools.SetBinding(ToggleFilter,\r\n                    ToggleButton.TagProperty,\r\n                    mainModel.AppSettings.FilterSettings,\r\n                    nameof(FilterSettings.IsActive));\r\n                ToggleFilter.MouseRightButtonUp += (_, __) => mainModel.ClearFilters();\r\n            }\r\n\r\n            ToggleNotifications = Template.FindName(\"PART_ToggleNotifications\", this) as ToggleButton;\r\n            if (ToggleNotifications != null)\r\n            {\r\n                BindingTools.SetBinding(ToggleNotifications,\r\n                    ToggleButton.IsCheckedProperty,\r\n                    mainModel.AppSettings,\r\n                    nameof(PlayniteSettings.NotificationPanelVisible),\r\n                    BindingMode.TwoWay);\r\n            }\r\n\r\n            ProgressGlobal = Template.FindName(\"PART_ProgressGlobal\", this) as ProgressBar;\r\n            if (ProgressGlobal != null)\r\n            {\r\n                BindingTools.SetBinding(ProgressGlobal,\r\n                    ProgressBar.MaximumProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.ProgressTotal));\r\n                BindingTools.SetBinding(ProgressGlobal,\r\n                    ProgressBar.ValueProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.ProgressValue));\r\n                BindingTools.SetBinding(ProgressGlobal,\r\n                    ProgressBar.VisibilityProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.ProgressActive),\r\n                    converter: new BooleanToVisibilityConverter());\r\n            }\r\n\r\n            TextProgressText = Template.FindName(\"PART_TextProgressText\", this) as TextBlock;\r\n            if (TextProgressText != null)\r\n            {\r\n                BindingTools.SetBinding(TextProgressText,\r\n                    TextBlock.TextProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.ProgressStatus));\r\n                BindingTools.SetBinding(TextProgressText,\r\n                    TextBlock.VisibilityProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.ProgressActive),\r\n                    converter: new BooleanToVisibilityConverter());\r\n            }\r\n\r\n            ButtonProgressCancel = Template.FindName(\"PART_ButtonProgressCancel\", this) as ButtonBase;\r\n            if (ButtonProgressCancel != null)\r\n            {\r\n                ButtonProgressCancel.Command = mainModel.CancelProgressCommand;\r\n                BindingTools.SetBinding(ButtonProgressCancel,\r\n                    ButtonBase.VisibilityProperty,\r\n                    mainModel,\r\n                    nameof(mainModel.ProgressActive),\r\n                    converter: new BooleanToVisibilityConverter());\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/DesktopActionSelector.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.DesktopApp.Windows;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\n\r\nnamespace Playnite.DesktopApp\r\n{\r\n    public class DesktopActionSelector : IActionSelector\r\n    {\r\n        public object SelectPlayAction(List<PlayController> controllers, List<GameAction> actions)\r\n        {\r\n            return new ActionSelectionViewModel(new ActionSelectionWindowFactory()).SelectPlayAction(controllers, actions);\r\n        }\r\n\r\n        public InstallController SelectInstallAction(List<InstallController> pluginActions)\r\n        {\r\n            return new ActionSelectionViewModel(new ActionSelectionWindowFactory()).SelectInstallAction(pluginActions);\r\n        }\r\n\r\n        public UninstallController SelectUninstallAction(List<UninstallController> pluginActions)\r\n        {\r\n            return new ActionSelectionViewModel(new ActionSelectionWindowFactory()).SelectUninstallAction(pluginActions);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/DesktopApplication.cs",
    "content": "﻿using Hardcodet.Wpf.TaskbarNotification;\r\nusing Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Controllers;\r\nusing Playnite.Controls;\r\nusing Playnite.Database;\r\nusing Playnite.DesktopApp.API;\r\nusing Playnite.DesktopApp.Controls;\r\nusing Playnite.DesktopApp.Markup;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.DesktopApp.Windows;\r\nusing Playnite.Metadata;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Events;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Settings;\r\nusing Playnite.ViewModels;\r\nusing Playnite.WebView;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Drawing;\r\nusing System.Drawing.Imaging;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media.Imaging;\r\nusing Playnite.Input;\r\nusing static SDL2.SDL;\r\n\r\nnamespace Playnite.DesktopApp\r\n{\r\n    public class DesktopApplication : PlayniteApplication\r\n    {\r\n        private ILogger logger = LogManager.GetLogger();\r\n        private TaskbarIcon trayIcon;\r\n        private SplashScreen splashScreen;\r\n        private bool sdlInitialized = false;\r\n        private bool exitSDLEventLoop = false;\r\n\r\n        private DesktopAppViewModel mainModel;\r\n        public DesktopAppViewModel MainModel\r\n        {\r\n            get => mainModel;\r\n            set\r\n            {\r\n                mainModel = value;\r\n                MainModelBase = value;\r\n            }\r\n        }\r\n\r\n        public new static DesktopApplication Current\r\n        {\r\n            get => PlayniteApplication.Current == null ? null : (DesktopApplication)PlayniteApplication.Current;\r\n        }\r\n\r\n        public DesktopApplication(Func<Application> appInitializer, SplashScreen splashScreen, CmdLineOptions cmdLine)\r\n            : base(appInitializer, ApplicationMode.Desktop, cmdLine)\r\n        {\r\n            this.splashScreen = splashScreen;\r\n        }\r\n\r\n        public override void ConfigureViews()\r\n        {\r\n            ProgressWindowFactory.SetWindowType<ProgressWindow>();\r\n            CrashHandlerWindowFactory.SetWindowType<CrashHandlerWindow>();\r\n            ExtensionCrashHandlerWindowFactory.SetWindowType<ExtensionCrashHandlerWindow>();\r\n            UpdateWindowFactory.SetWindowType<UpdateWindow>();\r\n            LicenseAgreementWindowFactory.SetWindowType<LicenseAgreementWindow>();\r\n            SingleItemSelectionWindowFactory.SetWindowType<SingleItemSelectionWindow>();\r\n            MultiItemSelectionWindowFactory.SetWindowType<MultiItemSelectionWindow>();\r\n            Dialogs = new DesktopDialogs();\r\n            Playnite.Dialogs.SetHandler(Dialogs);\r\n        }\r\n\r\n        public override bool Startup()\r\n        {\r\n            if (!ConfigureApplication())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            InstantiateApp();\r\n            AppUriHandler = MainModel.ProcessUriRequest;\r\n            var isFirstStart = ProcessStartupWizard();\r\n            MigrateDatabase();\r\n#pragma warning disable CS4014\r\n            if (AppSettings.EnableGameControllerSupport)\r\n            {\r\n                InitSDL();\r\n                SetupInputs();\r\n            }\r\n            OpenMainViewAsync(isFirstStart);\r\n            LoadTrayIcon();\r\n            StartUpdateCheckerAsync();\r\n#pragma warning restore CS4014\r\n            ProcessArguments();\r\n            splashScreen?.Close(new TimeSpan(0));\r\n            return true;\r\n        }\r\n\r\n        public override void InitializeNative()\r\n        {\r\n            ((App)CurrentNative).InitializeComponent();\r\n        }\r\n\r\n        public override void Restore()\r\n        {\r\n            MainModel?.RestoreWindow();\r\n        }\r\n\r\n        public override void Minimize()\r\n        {\r\n            MainModel.WindowState = WindowState.Minimized;\r\n        }\r\n\r\n        public override void ReleaseResources(bool releaseCefSharp = true)\r\n        {\r\n            trayIcon?.Dispose();\r\n            MainModel?.UnregisterSystemSearchHotkey();\r\n            exitSDLEventLoop = true;\r\n            GameController?.Dispose();\r\n            if (sdlInitialized) SDL_Quit();\r\n            base.ReleaseResources(releaseCefSharp);\r\n        }\r\n\r\n        public override void Restart(bool saveSettings)\r\n        {\r\n            Restart(new CmdLineOptions { MasterInstance = true }, saveSettings);\r\n        }\r\n\r\n        public override void Restart(CmdLineOptions options, bool saveSettings)\r\n        {\r\n            options.MasterInstance = true;\r\n            options.UserDataDir = CmdLine.UserDataDir;\r\n            QuitAndStart(PlaynitePaths.DesktopExecutablePath, options.ToString(), saveSettings: saveSettings);\r\n        }\r\n\r\n        public override void InstantiateApp()\r\n        {\r\n            Database = new GameDatabase();\r\n            Database.SetAsSingletonInstance();\r\n            Controllers = new GameControllerFactory(Database);\r\n            Extensions = new ExtensionFactory(Database, Controllers, GetApiInstance);\r\n            GamesEditor = new DesktopGamesEditor(\r\n                Database,\r\n                Controllers,\r\n                AppSettings,\r\n                Dialogs,\r\n                Extensions,\r\n                this,\r\n                new DesktopActionSelector());\r\n            Game.DatabaseReference = Database;\r\n            ImageSourceManager.SetDatabase(Database);\r\n            MainModel = new DesktopAppViewModel(\r\n                Database,\r\n                new MainWindowFactory(),\r\n                Dialogs,\r\n                new ResourceProvider(),\r\n                AppSettings,\r\n                (DesktopGamesEditor)GamesEditor,\r\n                Extensions,\r\n                this);\r\n            PlayniteApiGlobal = GetApiInstance();\r\n            SDK.API.Instance = PlayniteApiGlobal;\r\n        }\r\n\r\n        private void LoadTrayIcon()\r\n        {\r\n            if (AppSettings.EnableTray)\r\n            {\r\n                try\r\n                {\r\n                    trayIcon = new TaskbarIcon\r\n                    {\r\n                        MenuActivation = PopupActivationMode.LeftOrRightClick,\r\n                        DoubleClickCommand = MainModel.ShowWindowCommand,\r\n                        Icon = GetTrayIcon(),\r\n                        Visibility = Visibility.Visible,\r\n                        ContextMenu = new TrayContextMenu(MainModel)\r\n                    };\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, \"Failed to initialize tray icon.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private async void OpenMainViewAsync(bool isFirstStart)\r\n        {\r\n            if (!isFirstStart)\r\n            {\r\n                Extensions.LoadPlugins(\r\n                    AppSettings.DisabledPlugins,\r\n                    CmdLine.SafeStartup,\r\n                    AppSettings.DevelExtenions.Where(a => a.Selected == true).Select(a => a.Item).ToList());\r\n            }\r\n\r\n            Extensions.LoadScripts(\r\n                AppSettings.DisabledPlugins,\r\n                CmdLine.SafeStartup,\r\n                AppSettings.DevelExtenions.Where(a => a.Selected == true).Select(a => a.Item).ToList());\r\n            OnExtensionsLoaded();\r\n\r\n            try\r\n            {\r\n                MainModel.ThirdPartyTools = ThirdPartyToolsList.GetTools(Extensions.LibraryPlugins);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to load third party tools.\");\r\n            }\r\n\r\n            MainModel.OpenView();\r\n            CurrentNative.MainWindow = MainModel.Window.Window;\r\n\r\n            if (isFirstStart)\r\n            {\r\n                await MainModel.UpdateLibrary(false, true, false);\r\n                await MainModel.DownloadMetadata(AppSettings.MetadataSettings);\r\n            }\r\n            else\r\n            {\r\n                await MainModel.ProcessStartupLibUpdate();\r\n            }\r\n\r\n            // This is most likely safe place to consider application to be started properly\r\n            FileSystem.DeleteFile(PlaynitePaths.SafeStartupFlagFile);\r\n        }\r\n\r\n        private bool ProcessStartupWizard()\r\n        {\r\n            // TODO test db path recovery\r\n            var firstStartup = true;\r\n            var defaultDbDir = GameDatabase.GetDefaultPath(\r\n                PlayniteSettings.IsPortable,\r\n                CmdLine.UserDataDir.IsNullOrWhiteSpace() ? null : PlaynitePaths.ConfigRootPath);\r\n\r\n            if (!AppSettings.DatabasePath.IsNullOrEmpty())\r\n            {\r\n                AppSettings.FirstTimeWizardComplete = true;\r\n                firstStartup = false;\r\n            }\r\n            else if (AppSettings.DatabasePath.IsNullOrEmpty() && Directory.Exists(GameDatabase.GetFullDbPath(defaultDbDir)))\r\n            {\r\n                AppSettings.DatabasePath = defaultDbDir;\r\n                AppSettings.FirstTimeWizardComplete = true;\r\n                firstStartup = false;\r\n            }\r\n\r\n            if (firstStartup)\r\n            {\r\n                AppSettings.DatabasePath = defaultDbDir;\r\n                AppSettings.SaveSettings();\r\n                Database.SetDatabasePath(AppSettings.DatabasePath);\r\n                Database.OpenDatabase();\r\n\r\n                var wizardWindow = new FirstTimeStartupWindowFactory();\r\n                var wizardModel = new FirstTimeStartupViewModel(\r\n                    wizardWindow,\r\n                    Dialogs,\r\n                    new ResourceProvider(),\r\n                    Extensions,\r\n                    ServicesClient);\r\n                if (wizardModel.OpenView() == true)\r\n                {\r\n                    var settings = wizardModel.Settings;\r\n                    AppSettings.DisabledPlugins = settings.DisabledPlugins;\r\n                }\r\n\r\n                AppSettings.AutoBackupEnabled = true;\r\n                AppSettings.LastAutoBackup = DateTime.Now.AddDays(1); // Postpone first backup to not interrupt initial user experience\r\n                AppSettings.RotatingBackups = 3;\r\n                AppSettings.AutoBackupDir = Path.Combine(PlaynitePaths.ConfigRootPath, \"Backup\");\r\n                AppSettings.AutoBackupFrequency = AutoBackupFrequency.OnceADay;\r\n                AppSettings.AutoBackupIncludeExtensions = false;\r\n                AppSettings.AutoBackupIncludeExtensionsData = false;\r\n                AppSettings.AutoBackupIncludeLibFiles = false;\r\n                AppSettings.AutoBackupIncludeThemes = false;\r\n\r\n                AppSettings.FirstTimeWizardComplete = true;\r\n                AppSettings.SaveSettings();\r\n            }\r\n            else\r\n            {\r\n                Database.SetDatabasePath(AppSettings.DatabasePath);\r\n            }\r\n\r\n            return firstStartup;\r\n        }\r\n\r\n        public override void ShowWindowsNotification(string title, string body, Action action)\r\n        {\r\n            var icon = GetTrayIcon();\r\n            if (AppSettings.EnableTray)\r\n            {\r\n                trayIcon.ShowBalloonTip(title, body, icon, true);\r\n            }\r\n            else\r\n            {\r\n                WindowsNotifyIconManager.Notify(icon, title, body, action);\r\n            }\r\n        }\r\n\r\n        private Icon GetTrayIcon()\r\n        {\r\n            var trayIconImage =\r\n                ResourceProvider.GetResource(AppSettings.TrayIcon.GetDescription()) as BitmapImage ??\r\n                ResourceProvider.GetResource(\"TrayIcon\") as BitmapImage;\r\n            return new Icon(trayIconImage.UriSource.LocalPath);\r\n        }\r\n\r\n        public override void SwitchAppMode(ApplicationMode mode)\r\n        {\r\n            if (mode == ApplicationMode.Fullscreen)\r\n            {\r\n                MainModel?.SwitchToFullscreenMode();\r\n            }\r\n            else\r\n            {\r\n                Restore();\r\n            }\r\n        }\r\n\r\n        public override PlayniteAPI GetApiInstance(ExtensionManifest pluginOwner)\r\n        {\r\n            return new PlayniteAPI\r\n            {\r\n                Addons = new AddonsAPI(Extensions, AppSettings),\r\n                ApplicationInfo = new PlayniteInfoAPI(),\r\n                ApplicationSettings = new PlayniteSettingsAPI(AppSettings, Database),\r\n                Database = new DatabaseAPI(Database),\r\n                Dialogs = Dialogs,\r\n                Emulation = new Emulators.Emulation(),\r\n                MainView = new MainViewAPI(MainModel),\r\n                Notifications = Notifications,\r\n                Paths = new PlaynitePathsAPI(),\r\n                Resources = new ResourceProvider(),\r\n                RootApi = new PlayniteApiRoot(GamesEditor, Extensions, Database, MainModel),\r\n                UriHandler = UriHandler,\r\n                WebViews = new WebViewFactory(AppSettings)\r\n            };\r\n        }\r\n\r\n        public override PlayniteAPI GetApiInstance()\r\n        {\r\n            return new PlayniteAPI\r\n            {\r\n                Addons = new AddonsAPI(Extensions, AppSettings),\r\n                ApplicationInfo = new PlayniteInfoAPI(),\r\n                ApplicationSettings = new PlayniteSettingsAPI(AppSettings, Database),\r\n                Database = new DatabaseAPI(Database),\r\n                Dialogs = Dialogs,\r\n                Emulation = new Emulators.Emulation(),\r\n                MainView = new MainViewAPI(MainModel),\r\n                Notifications = Notifications,\r\n                Paths = new PlaynitePathsAPI(),\r\n                Resources = new ResourceProvider(),\r\n                RootApi = new PlayniteApiRoot(GamesEditor, Extensions, Database, MainModel),\r\n                UriHandler = UriHandler,\r\n                WebViews = new WebViewFactory(AppSettings)\r\n            };\r\n        }\r\n\r\n\r\n        private void InitSDL()\r\n        {\r\n            if (SDL_Init(SDL_INIT_GAMECONTROLLER) < 0)\r\n            {\r\n                logger.Error(\"SDL2 failed to initialize:\");\r\n                logger.Error(SDL_GetError());\r\n                return;\r\n            }\r\n\r\n            if (SDL_GameControllerAddMappingsFromFile(\"gamecontrollerdb.txt\") == -1)\r\n            {\r\n                logger.Error(\"Failed to load game controller mappings:\");\r\n                logger.Error(SDL_GetError());\r\n            }\r\n\r\n            // This should fix some random XInput controller issues\r\n            // https://github.com/libsdl-org/SDL/issues/13047\r\n            // https://github.com/JosefNemec/Playnite/issues/3794\r\n            SDL_SetHint(SDL_HINT_JOYSTICK_RAWINPUT, \"0\");\r\n            SDL_GameControllerEventState(SDL_IGNORE);\r\n            SDLEventLoop();\r\n            sdlInitialized = true;\r\n        }\r\n\r\n        private void SDLEventLoop()\r\n        {\r\n            Task.Run(async () =>\r\n            {\r\n                while (!exitSDLEventLoop)\r\n                {\r\n                    while (SDL_PollEvent(out var sdlEvent) == 1)\r\n                    {\r\n                        if (sdlEvent.type == SDL_EventType.SDL_CONTROLLERDEVICEADDED)\r\n                        {\r\n                            GameController?.AddController(sdlEvent.cdevice.which, AppSettings.DisabledGameControllers);\r\n                        }\r\n\r\n                        if (sdlEvent.type == SDL_EventType.SDL_CONTROLLERDEVICEREMOVED)\r\n                        {\r\n                            GameController?.RemoveController(sdlEvent.cdevice.which);\r\n                        }\r\n                    }\r\n\r\n                    GameController?.ProcessInputs();\r\n                    await Task.Delay(16);\r\n                }\r\n            });\r\n        }\r\n\r\n        public void SetupInputs()\r\n        {\r\n            if (!sdlInitialized)\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                if (GameController == null)\r\n                {\r\n                    GameController = new GameControllerManager(InputManager.Current, AppSettings.DisabledGameControllers)\r\n                    {\r\n                        SimulateAllKeys = false,\r\n                        SimulateNavigationKeys = false,\r\n                        StandardProcessingEnabled = false\r\n                    };\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed intitialize game controller devices.\");\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/DesktopCollectionView.cs",
    "content": "﻿using Playnite.Database;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.Specialized;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.DesktopApp\r\n{\r\n    public class DesktopCollectionView : BaseCollectionView\r\n    {\r\n        public enum GamesViewType\r\n        {\r\n            Standard,\r\n            ListGrouped\r\n        }\r\n\r\n        private readonly PlayniteSettings settings;\r\n        private ViewSettings viewSettings;\r\n        private GroupableField? currentGrouping = null;\r\n\r\n        private Dictionary<GroupableField, string> groupFields = new Dictionary<GroupableField, string>()\r\n        {\r\n            { GroupableField.Library, nameof(GamesCollectionViewEntry.Library) },\r\n            { GroupableField.Category, nameof(GamesCollectionViewEntry.Category) },\r\n            { GroupableField.Genre, nameof(GamesCollectionViewEntry.Genre) },\r\n            { GroupableField.Developer, nameof(GamesCollectionViewEntry.Developer) },\r\n            { GroupableField.Publisher, nameof(GamesCollectionViewEntry.Publisher) },\r\n            { GroupableField.Tag, nameof(GamesCollectionViewEntry.Tag) },\r\n            { GroupableField.Platform, nameof(GamesCollectionViewEntry.Platform) },\r\n            { GroupableField.Series, nameof(GamesCollectionViewEntry.Serie) },\r\n            { GroupableField.AgeRating, nameof(GamesCollectionViewEntry.AgeRating) },\r\n            { GroupableField.Region, nameof(GamesCollectionViewEntry.Region) },\r\n            { GroupableField.Source, nameof(GamesCollectionViewEntry.Source) },\r\n            { GroupableField.ReleaseYear, nameof(GamesCollectionViewEntry.ReleaseYear) },\r\n            { GroupableField.CompletionStatus, nameof(GamesCollectionViewEntry.CompletionStatus) },\r\n            { GroupableField.UserScore, nameof(GamesCollectionViewEntry.UserScoreGroup) },\r\n            { GroupableField.CommunityScore, nameof(GamesCollectionViewEntry.CommunityScoreGroup) },\r\n            { GroupableField.CriticScore, nameof(GamesCollectionViewEntry.CriticScoreGroup) },\r\n            { GroupableField.LastActivity, nameof(GamesCollectionViewEntry.LastActivitySegment) },\r\n            { GroupableField.RecentActivity, nameof(GamesCollectionViewEntry.RecentActivitySegment) },\r\n            { GroupableField.Added, nameof(GamesCollectionViewEntry.AddedSegment) },\r\n            { GroupableField.Modified, nameof(GamesCollectionViewEntry.ModifiedSegment) },\r\n            { GroupableField.PlayTime, nameof(GamesCollectionViewEntry.PlaytimeCategory) },\r\n            { GroupableField.Feature, nameof(GamesCollectionViewEntry.Feature) },\r\n            { GroupableField.InstallationStatus, nameof(GamesCollectionViewEntry.InstallationState) },\r\n            { GroupableField.Name, nameof(GamesCollectionViewEntry.NameGroup) },\r\n            { GroupableField.InstallDrive, nameof(GamesCollectionViewEntry.InstallDriveGroup) },\r\n            { GroupableField.InstallSize, nameof(GamesCollectionViewEntry.InstallSizeGroup) }\r\n        };\r\n\r\n        private Dictionary<GroupableField, Type> groupTypes = new Dictionary<GroupableField, Type>()\r\n        {\r\n            { GroupableField.Category, typeof(Category) },\r\n            { GroupableField.Genre, typeof(Genre) },\r\n            { GroupableField.Developer, typeof(Developer) },\r\n            { GroupableField.Publisher, typeof(Publisher) },\r\n            { GroupableField.Tag, typeof(Tag) },\r\n            { GroupableField.Feature, typeof(GameFeature) },\r\n            { GroupableField.AgeRating, typeof(AgeRating) },\r\n            { GroupableField.Region, typeof(Region) },\r\n            { GroupableField.Platform, typeof(Platform) },\r\n            { GroupableField.Series, typeof(Series) }\r\n        };\r\n\r\n        private GamesViewType? viewType = null;\r\n        public GamesViewType? ViewType\r\n        {\r\n            get => viewType;\r\n            set\r\n            {\r\n                SetViewType(value);\r\n                viewType = value;\r\n            }\r\n        }\r\n\r\n        public DesktopCollectionView(\r\n            IGameDatabaseMain database,\r\n            PlayniteSettings settings,\r\n            ExtensionFactory extensions) : base(database, extensions, settings.FilterSettings, settings)\r\n        {\r\n            this.settings = settings;\r\n            Database.Games.ItemCollectionChanged += Database_GamesCollectionChanged;\r\n            Database.Games.ItemUpdated += Database_GameUpdated;\r\n            Database.Platforms.ItemUpdated += Database_PlatformUpdated;\r\n            Database.Genres.ItemUpdated += Genres_ItemUpdated;\r\n            Database.Categories.ItemUpdated += Categories_ItemUpdated;\r\n            Database.AgeRatings.ItemUpdated += AgeRatings_ItemUpdated;\r\n            Database.Companies.ItemUpdated += Companies_ItemUpdated;\r\n            Database.Regions.ItemUpdated += Regions_ItemUpdated;\r\n            Database.Series.ItemUpdated += Series_ItemUpdated;\r\n            Database.Sources.ItemUpdated += Sources_ItemUpdated;\r\n            Database.Tags.ItemUpdated += Tags_ItemUpdated;\r\n            Database.Features.ItemUpdated += Features_ItemUpdated;\r\n            Database.CompletionStatuses.ItemUpdated += CompletionStatuses_ItemUpdated;\r\n            viewSettings = settings.ViewSettings;\r\n            viewSettings.PropertyChanged += ViewSettings_PropertyChanged;\r\n            settings.PropertyChanged += Settings_PropertyChanged;\r\n            using (CollectionView.DeferRefresh())\r\n            {\r\n                SetViewDescriptions();\r\n            };\r\n        }\r\n\r\n        public override void Dispose()\r\n        {\r\n            Database.Games.ItemCollectionChanged -= Database_GamesCollectionChanged;\r\n            Database.Games.ItemUpdated -= Database_GameUpdated;\r\n            Database.Platforms.ItemUpdated -= Database_PlatformUpdated;\r\n            Database.Platforms.ItemUpdated -= Database_PlatformUpdated;\r\n            Database.Genres.ItemUpdated -= Genres_ItemUpdated;\r\n            Database.Categories.ItemUpdated -= Categories_ItemUpdated;\r\n            Database.AgeRatings.ItemUpdated -= AgeRatings_ItemUpdated;\r\n            Database.Companies.ItemUpdated -= Companies_ItemUpdated;\r\n            Database.Regions.ItemUpdated -= Regions_ItemUpdated;\r\n            Database.Series.ItemUpdated -= Series_ItemUpdated;\r\n            Database.Sources.ItemUpdated -= Sources_ItemUpdated;\r\n            Database.Tags.ItemUpdated -= Tags_ItemUpdated;\r\n            Database.Features.ItemUpdated -= Features_ItemUpdated;\r\n            Database.CompletionStatuses.ItemUpdated -= CompletionStatuses_ItemUpdated;\r\n            viewSettings.PropertyChanged -= ViewSettings_PropertyChanged;\r\n            settings.PropertyChanged -= Settings_PropertyChanged;\r\n            if (Items.HasItems())\r\n            {\r\n                foreach (var item in Items)\r\n                {\r\n                    item.Dispose();\r\n                }\r\n            }\r\n\r\n            base.Dispose();\r\n        }\r\n\r\n        private void Settings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(PlayniteSettings.FuzzyMatchingInNameFilter))\r\n            {\r\n                Logger.Debug(\"Refreshing collection view filter.\");\r\n                CollectionView.Refresh();\r\n            }\r\n        }\r\n\r\n        private void ViewSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if ((new string[]\r\n            {\r\n                nameof(ViewSettings.SortingOrder),\r\n                nameof(ViewSettings.GroupingOrder),\r\n                nameof(ViewSettings.SortingOrderDirection)\r\n            }).Contains(e.PropertyName))\r\n            {\r\n                RefreshView();\r\n            }\r\n        }\r\n\r\n        public override void RefreshView()\r\n        {\r\n            if (IgnoreViewConfigChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            Logger.Debug(\"Updating collection view settings.\");\r\n\r\n            try\r\n            {\r\n                using (CollectionView.DeferRefresh())\r\n                {\r\n                    CollectionView.SortDescriptions.Clear();\r\n                    CollectionView.GroupDescriptions.Clear();\r\n                    SetViewDescriptions();\r\n                }\r\n            }\r\n            // DeferRefresh very rarely blows up with connection to VirtualizingStackPanel.ExtendViewport\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(e, \"CollectionView.DeferRefresh failed.\");\r\n            }\r\n        }\r\n\r\n        private void SetViewDescriptions()\r\n        {\r\n            var sortDirection = viewSettings.SortingOrderDirection == SortOrderDirection.Ascending ? ListSortDirection.Ascending : ListSortDirection.Descending;\r\n            switch (viewSettings.GroupingOrder)\r\n            {\r\n                case GroupableField.Category:\r\n                case GroupableField.Genre:\r\n                case GroupableField.Developer:\r\n                case GroupableField.Publisher:\r\n                case GroupableField.Tag:\r\n                case GroupableField.Feature:\r\n                case GroupableField.Platform:\r\n                case GroupableField.Series:\r\n                case GroupableField.AgeRating:\r\n                case GroupableField.Region:\r\n                    ViewType = GamesViewType.ListGrouped;\r\n                    break;\r\n                case GroupableField.None:\r\n                case GroupableField.Library:\r\n                case GroupableField.Source:\r\n                case GroupableField.ReleaseYear:\r\n                case GroupableField.CompletionStatus:\r\n                case GroupableField.UserScore:\r\n                case GroupableField.CriticScore:\r\n                case GroupableField.CommunityScore:\r\n                case GroupableField.LastActivity:\r\n                case GroupableField.RecentActivity:\r\n                case GroupableField.Added:\r\n                case GroupableField.Modified:\r\n                case GroupableField.PlayTime:\r\n                case GroupableField.InstallationStatus:\r\n                case GroupableField.InstallSize:\r\n                case GroupableField.Name:\r\n                    ViewType = GamesViewType.Standard;\r\n                    break;\r\n                case GroupableField.InstallDrive:\r\n                    ViewType = GamesViewType.Standard;\r\n                    break;\r\n                default:\r\n                    throw new Exception(\"Unknown GroupingOrder\");\r\n            }\r\n\r\n            currentGrouping = viewSettings.GroupingOrder;\r\n            CollectionView.SortDescriptions.Add(new SortDescription(viewSettings.SortingOrder.ToString(), sortDirection));\r\n            if (viewSettings.SortingOrder != SortOrder.Name)\r\n            {\r\n                CollectionView.SortDescriptions.Add(new SortDescription(\"Name\", ListSortDirection.Ascending));\r\n            }\r\n\r\n            if (viewSettings.GroupingOrder != GroupableField.None)\r\n            {\r\n                CollectionView.GroupDescriptions.Add(new PropertyGroupDescription(groupFields[viewSettings.GroupingOrder]));\r\n                if (CollectionView.SortDescriptions.First().PropertyName != groupFields[viewSettings.GroupingOrder])\r\n                {\r\n                    var order = ListSortDirection.Ascending;\r\n                    if (viewSettings.GroupingOrder == GroupableField.PlayTime ||\r\n                        viewSettings.GroupingOrder == GroupableField.CommunityScore ||\r\n                        viewSettings.GroupingOrder == GroupableField.CriticScore ||\r\n                        viewSettings.GroupingOrder == GroupableField.UserScore ||\r\n                        viewSettings.GroupingOrder == GroupableField.ReleaseYear)\r\n                    {\r\n                        order = ListSortDirection.Descending;\r\n                    }\r\n\r\n                    CollectionView.SortDescriptions.Insert(0, new SortDescription(groupFields[viewSettings.GroupingOrder], order));\r\n                }\r\n            }\r\n        }\r\n\r\n        private Guid GetGroupingId(GroupableField orderField, Game sourceGame)\r\n        {\r\n            switch (orderField)\r\n            {\r\n                case GroupableField.Source:\r\n                    return sourceGame.SourceId;\r\n                case GroupableField.CompletionStatus:\r\n                    return sourceGame.CompletionStatusId;\r\n                case GroupableField.None:\r\n                    return Guid.Empty;\r\n                default:\r\n                    throw new Exception(\"Wrong grouping configuration.\");\r\n            }\r\n        }\r\n\r\n        private List<Guid> GetGroupingIds(GroupableField orderField, Game sourceGame)\r\n        {\r\n            switch (orderField)\r\n            {\r\n                case GroupableField.Category:\r\n                    return sourceGame.CategoryIds;\r\n                case GroupableField.Genre:\r\n                    return sourceGame.GenreIds;\r\n                case GroupableField.Developer:\r\n                    return sourceGame.DeveloperIds;\r\n                case GroupableField.Publisher:\r\n                    return sourceGame.PublisherIds;\r\n                case GroupableField.Tag:\r\n                    return sourceGame.TagIds;\r\n                case GroupableField.Feature:\r\n                    return sourceGame.FeatureIds;\r\n                case GroupableField.AgeRating:\r\n                    return sourceGame.AgeRatingIds;\r\n                case GroupableField.Platform:\r\n                    return sourceGame.PlatformIds;\r\n                case GroupableField.Region:\r\n                    return sourceGame.RegionIds;\r\n                case GroupableField.Series:\r\n                    return sourceGame.SeriesIds;\r\n                case GroupableField.None:\r\n                    return null;\r\n                default:\r\n                    throw new Exception(\"Wrong grouping configuration.\");\r\n            }\r\n        }\r\n\r\n        public void SetViewType(GamesViewType? viewType)\r\n        {\r\n            if (currentGrouping == viewSettings.GroupingOrder)\r\n            {\r\n                return;\r\n            }\r\n\r\n            ClearItems();\r\n            switch (viewType)\r\n            {\r\n                case GamesViewType.Standard:\r\n                    Items.AddRange(Database.Games.Select(x => new GamesCollectionViewEntry(x, GetLibraryPlugin(x), settings)));\r\n                    break;\r\n\r\n                case GamesViewType.ListGrouped:\r\n                    Items.AddRange(Database.Games.SelectMany(x =>\r\n                    {\r\n                        var entries = new List<GamesCollectionViewEntry>();\r\n                        var ids = GetGroupingIds(viewSettings.GroupingOrder, x);\r\n                        if (ids.HasItems())\r\n                        {\r\n                            foreach (var id in ids)\r\n                            {\r\n                                var newItem = GamesCollectionViewEntry.GetAdvancedGroupedEntry(x, GetLibraryPlugin(x), groupTypes[viewSettings.GroupingOrder], id, Database, settings);\r\n                                if (newItem != null)\r\n                                {\r\n                                    entries.Add(newItem);\r\n                                }\r\n                            }\r\n\r\n                            if (entries.Count == 0)\r\n                            {\r\n                                entries.Add(new GamesCollectionViewEntry(x, GetLibraryPlugin(x), settings));\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            entries.Add(new GamesCollectionViewEntry(x, GetLibraryPlugin(x), settings));\r\n                        }\r\n\r\n                        return entries;\r\n                    }));\r\n\r\n                    break;\r\n            }\r\n\r\n            this.viewType = viewType;\r\n        }\r\n\r\n        private void ClearItems()\r\n        {\r\n            if (Items.HasItems())\r\n            {\r\n                foreach (var item in Items)\r\n                {\r\n                    item.Dispose();\r\n                }\r\n\r\n                Items.Clear();\r\n            }\r\n        }\r\n\r\n        private void Database_PlatformUpdated(object sender, ItemUpdatedEventArgs<Platform> e)\r\n        {\r\n            DoGroupDbObjectsUpdate(\r\n                GroupableField.Platform, e,\r\n                (a, b) => a.PlatformIds?.Any() == true && b.Intersect(a.PlatformIds).Any(),\r\n                nameof(Game.Platforms));\r\n        }\r\n\r\n        private void Genres_ItemUpdated(object sender, ItemUpdatedEventArgs<Genre> e)\r\n        {\r\n            DoGroupDbObjectsUpdate(\r\n                GroupableField.Genre, e,\r\n                (a, b) => a.GenreIds?.Any() == true && b.Intersect(a.GenreIds).Any(),\r\n                nameof(Game.Genres));\r\n        }\r\n\r\n        private void Tags_ItemUpdated(object sender, ItemUpdatedEventArgs<Tag> e)\r\n        {\r\n            DoGroupDbObjectsUpdate(\r\n                GroupableField.Tag, e,\r\n                (a, b) => a.TagIds?.Any() == true && b.Intersect(a.TagIds).Any(),\r\n                nameof(Game.Tags));\r\n        }\r\n\r\n        private void Sources_ItemUpdated(object sender, ItemUpdatedEventArgs<GameSource> e)\r\n        {\r\n            DoGroupDbObjectsUpdate(\r\n               GroupableField.Source, e,\r\n               (a, b) => a.SourceId != Guid.Empty && b.Contains(a.SourceId));\r\n        }\r\n\r\n        private void Series_ItemUpdated(object sender, ItemUpdatedEventArgs<Series> e)\r\n        {\r\n            DoGroupDbObjectsUpdate(\r\n                GroupableField.Series, e,\r\n                (a, b) => a.SeriesIds?.Any() == true && b.Intersect(a.SeriesIds).Any(),\r\n                nameof(Game.Series));\r\n        }\r\n\r\n        private void Regions_ItemUpdated(object sender, ItemUpdatedEventArgs<Region> e)\r\n        {\r\n            DoGroupDbObjectsUpdate(\r\n                GroupableField.Region, e,\r\n                (a, b) => a.RegionIds?.Any() == true && b.Intersect(a.RegionIds).Any(),\r\n                nameof(Game.Regions));\r\n        }\r\n\r\n        private void Companies_ItemUpdated(object sender, ItemUpdatedEventArgs<Company> e)\r\n        {\r\n            DoGroupDbObjectsUpdate(\r\n                GroupableField.Developer, e,\r\n                (a, b) => a.DeveloperIds?.Any() == true && b.Intersect(a.DeveloperIds).Any(),\r\n                nameof(Game.Developers));\r\n\r\n            DoGroupDbObjectsUpdate(\r\n                GroupableField.Publisher, e,\r\n                (a, b) => a.PublisherIds?.Any() == true && b.Intersect(a.PublisherIds).Any(),\r\n                nameof(Game.Publishers));\r\n        }\r\n\r\n        private void AgeRatings_ItemUpdated(object sender, ItemUpdatedEventArgs<AgeRating> e)\r\n        {\r\n            DoGroupDbObjectsUpdate(\r\n                GroupableField.AgeRating, e,\r\n                (a, b) => a.AgeRatingIds?.Any() == true && b.Intersect(a.AgeRatingIds).Any(),\r\n                nameof(Game.AgeRatings));\r\n        }\r\n\r\n        private void Categories_ItemUpdated(object sender, ItemUpdatedEventArgs<Category> e)\r\n        {\r\n            DoGroupDbObjectsUpdate(\r\n                GroupableField.Category, e,\r\n                (a, b) => a.CategoryIds?.Any() == true && b.Intersect(a.CategoryIds).Any(),\r\n                nameof(Game.Categories));\r\n        }\r\n\r\n        private void Features_ItemUpdated(object sender, ItemUpdatedEventArgs<GameFeature> e)\r\n        {\r\n            DoGroupDbObjectsUpdate(\r\n                GroupableField.Feature, e,\r\n                (a, b) => a.FeatureIds?.Any() == true && b.Intersect(a.FeatureIds).Any(),\r\n                nameof(Game.Features));\r\n        }\r\n\r\n        private void CompletionStatuses_ItemUpdated(object sender, ItemUpdatedEventArgs<CompletionStatus> e)\r\n        {\r\n            DoGroupDbObjectsUpdate(\r\n               GroupableField.CompletionStatus, e,\r\n               (a, b) => a.CompletionStatusId != Guid.Empty && b.Contains(a.CompletionStatusId));\r\n        }\r\n\r\n        private void DoGroupDbObjectsUpdate<TItem>(\r\n            GroupableField order,\r\n            ItemUpdatedEventArgs<TItem> updatedItems,\r\n            Func<GamesCollectionViewEntry, List<Guid>, bool> condition,\r\n            string extraPropNotify = null) where TItem : DatabaseObject\r\n        {\r\n            var updatedIds = new List<Guid>(updatedItems.UpdatedItems.Select(a => a.NewData.Id));\r\n            var doUpdate = false;\r\n            foreach (var item in Items.Where(a => condition(a, updatedIds)))\r\n            {\r\n                doUpdate = true;\r\n                item.OnPropertyChanged(groupFields[order]);\r\n                if (!extraPropNotify.IsNullOrEmpty())\r\n                {\r\n                    item.OnPropertyChanged(extraPropNotify);\r\n                }\r\n            }\r\n\r\n            if (doUpdate && viewSettings.GroupingOrder == order)\r\n            {\r\n                Logger.Debug(\"Refreshing collection view filter.\");\r\n                CollectionView.Refresh();\r\n            }\r\n        }\r\n\r\n        private bool GetRelevantDataDiffer(Game oldData, Game newData)\r\n        {\r\n            switch (viewSettings.GroupingOrder)\r\n            {\r\n                case GroupableField.None:\r\n                case GroupableField.Library:\r\n                    return false;\r\n                case GroupableField.Category:\r\n                case GroupableField.Genre:\r\n                case GroupableField.Developer:\r\n                case GroupableField.Publisher:\r\n                case GroupableField.Tag:\r\n                case GroupableField.Feature:\r\n                case GroupableField.Platform:\r\n                case GroupableField.Series:\r\n                case GroupableField.AgeRating:\r\n                case GroupableField.Region:\r\n                    return ViewType == GamesViewType.ListGrouped && !GetGroupingIds(viewSettings.GroupingOrder, oldData).IsListEqual(GetGroupingIds(viewSettings.GroupingOrder, newData));\r\n                case GroupableField.Source:\r\n                    return ViewType == GamesViewType.Standard && !GetGroupingId(viewSettings.GroupingOrder, oldData).Equals(GetGroupingId(viewSettings.GroupingOrder, newData));\r\n                case GroupableField.ReleaseYear:\r\n                    return oldData.ReleaseYear != newData.ReleaseYear;\r\n                case GroupableField.CompletionStatus:\r\n                    return ViewType == GamesViewType.Standard && !GetGroupingId(viewSettings.GroupingOrder, oldData).Equals(GetGroupingId(viewSettings.GroupingOrder, newData));\r\n                case GroupableField.UserScore:\r\n                    return oldData.UserScore != newData.UserScore;\r\n                case GroupableField.CriticScore:\r\n                    return oldData.CriticScore != newData.CriticScore;\r\n                case GroupableField.CommunityScore:\r\n                    return oldData.CommunityScore != newData.CommunityScore;\r\n                case GroupableField.LastActivity:\r\n                    return oldData.LastActivity != newData.LastActivity;\r\n                case GroupableField.RecentActivity:\r\n                    return oldData.RecentActivity != newData.RecentActivity;\r\n                case GroupableField.Added:\r\n                    return oldData.Added != newData.Added;\r\n                case GroupableField.Modified:\r\n                    return oldData.Modified != newData.Modified;\r\n                case GroupableField.PlayTime:\r\n                    return oldData.Playtime != newData.Playtime;\r\n                case GroupableField.InstallationStatus:\r\n                    return oldData.IsInstalled != newData.IsInstalled;\r\n                case GroupableField.Name:\r\n                    return oldData.Name != newData.Name || oldData.SortingName != newData.SortingName;\r\n                case GroupableField.InstallDrive:\r\n                    return oldData.IsInstalled != newData.IsInstalled || oldData.InstallDirectory != newData.InstallDirectory;\r\n                case GroupableField.InstallSize:\r\n                    return oldData.InstallSize != newData.InstallSize;\r\n                default:\r\n                    throw new Exception(\"Unknown GroupableField\");\r\n            }\r\n        }\r\n\r\n        private void Database_GameUpdated(object sender, ItemUpdatedEventArgs<Game> args)\r\n        {\r\n            var refreshList = new List<Game>();\r\n            foreach (var update in args.UpdatedItems)\r\n            {\r\n                var existingItem = Items.FirstOrDefault(a => a.Game.Id == update.NewData.Id);\r\n                if (existingItem != null)\r\n                {\r\n                    if (GetRelevantDataDiffer(update.OldData, update.NewData))\r\n                    {\r\n                        refreshList.Add(update.NewData);\r\n                    }\r\n                    else\r\n                    {\r\n                        // Forces CollectionView to re-sort items without full list refresh.\r\n                        try\r\n                        {\r\n                            Items.OnItemMoved(existingItem, 0, 0);\r\n                        }\r\n                        catch (Exception e)\r\n                        {\r\n                            // Another weird and rare \"out of range\" bug in System.Windows.Data.CollectionView.OnCollectionChanged.\r\n                            // No idea why it's happening.\r\n                            Logger.Error(e, \"Items.OnItemMoved failed.\");\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (refreshList.Count > 0)\r\n            {\r\n                Database_GamesCollectionChanged(this, new ItemCollectionChangedEventArgs<Game>(refreshList, refreshList));\r\n            }\r\n        }\r\n\r\n        private void Database_GamesCollectionChanged(object sender, ItemCollectionChangedEventArgs<Game> args)\r\n        {\r\n            // DO NOT use *Range methods for \"Items\" object.\r\n            // It can throw weird exceptions in virtualization panel, directly in WPF (without known fix from MS).\r\n            // https://github.com/JosefNemec/Playnite/issues/796\r\n\r\n            if (args.RemovedItems.Count > 0)\r\n            {\r\n                var removeIds = new HashSet<Guid>(args.RemovedItems.Select(a => a.Id));\r\n                var toRemove = Items.Where(a => removeIds.Contains(a.Id))?.ToList();\r\n                if (toRemove != null)\r\n                {\r\n                    foreach (var item in toRemove)\r\n                    {\r\n                        item.Dispose();\r\n                        Items.Remove(item);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var addList = new List<GamesCollectionViewEntry>();\r\n            foreach (var game in args.AddedItems)\r\n            {\r\n                switch (ViewType)\r\n                {\r\n                    case GamesViewType.Standard:\r\n                        addList.Add(new GamesCollectionViewEntry(game, GetLibraryPlugin(game), settings));\r\n                        break;\r\n\r\n                    case GamesViewType.ListGrouped:\r\n                        var entries = new List<GamesCollectionViewEntry>();\r\n                        var ids = GetGroupingIds(viewSettings.GroupingOrder, game);\r\n                        if (ids.HasItems())\r\n                        {\r\n                            foreach (var id in ids)\r\n                            {\r\n                                var newItem = GamesCollectionViewEntry.GetAdvancedGroupedEntry(game, GetLibraryPlugin(game), groupTypes[viewSettings.GroupingOrder], id, Database, settings);\r\n                                if (newItem != null)\r\n                                {\r\n                                    entries.Add(newItem);\r\n                                }\r\n                            }\r\n\r\n                            if (entries.Count == 0)\r\n                            {\r\n                                entries.Add(new GamesCollectionViewEntry(game, GetLibraryPlugin(game), settings));\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            entries.Add(new GamesCollectionViewEntry(game, GetLibraryPlugin(game), settings));\r\n                        }\r\n\r\n                        addList.AddRange(entries);\r\n                        break;\r\n                }\r\n            }\r\n\r\n            if (addList.Count > 0)\r\n            {\r\n                foreach (var item in addList)\r\n                {\r\n                    Items.Add(item);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/DesktopDialogs.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.DesktopApp.Windows;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.DesktopApp\r\n{\r\n    public class DesktopDialogs : IDialogsFactory\r\n    {\r\n        private readonly SynchronizationContext context;\r\n\r\n        public DesktopDialogs()\r\n        {\r\n            context = SynchronizationContext.Current;\r\n        }\r\n\r\n        private T Invoke<T>(Func<T> action)\r\n        {\r\n            T result = default(T);\r\n            context.Send((a) =>\r\n            {\r\n                result = action();\r\n            }, null);\r\n\r\n            return result;\r\n        }\r\n\r\n        private void Invoke(Action action)\r\n        {\r\n            context.Send((a) =>\r\n            {\r\n                action();\r\n            }, null);\r\n        }\r\n\r\n        public string SaveFile(string filter)\r\n        {\r\n            return Invoke(() => SystemDialogs.SaveFile(WindowManager.CurrentWindow, filter));\r\n        }\r\n\r\n        public string SaveFile(string filter, string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SaveFile(WindowManager.CurrentWindow, filter, initialDir));\r\n        }\r\n\r\n        public string SaveFile(string filter, bool promptOverwrite)\r\n        {\r\n            return Invoke(() => SystemDialogs.SaveFile(WindowManager.CurrentWindow, filter, promptOverwrite));\r\n        }\r\n\r\n        public string SaveFile(string filter, bool promptOverwrite, string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SaveFile(WindowManager.CurrentWindow, filter, promptOverwrite, initialDir));\r\n        }\r\n\r\n        public string SelectFile(string filter)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFile(WindowManager.CurrentWindow, filter));\r\n        }\r\n\r\n        public string SelectFile(string filter, string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFile(WindowManager.CurrentWindow, filter, initialDir));\r\n        }\r\n\r\n        public List<string> SelectFiles(string filter)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFiles(WindowManager.CurrentWindow, filter));\r\n        }\r\n\r\n        public List<string> SelectFiles(string filter, string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFiles(WindowManager.CurrentWindow, filter, initialDir));\r\n        }\r\n\r\n        public string SelectFolder()\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFolder(WindowManager.CurrentWindow));\r\n        }\r\n\r\n        public string SelectFolder(string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFolder(WindowManager.CurrentWindow, initialDir));\r\n        }\r\n\r\n        public string SelectIconFile()\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectIconFile(WindowManager.CurrentWindow));\r\n        }\r\n\r\n        public string SelectIconFile(string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectIconFile(WindowManager.CurrentWindow, initialDir));\r\n        }\r\n\r\n        public string SelectImagefile()\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectImageFile(WindowManager.CurrentWindow));\r\n        }\r\n\r\n        public string SelectImagefile(string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectImageFile(WindowManager.CurrentWindow, initialDir));\r\n        }\r\n\r\n        public StringSelectionDialogResult SelectString(string messageBoxText, string caption, string defaultInput)\r\n        {\r\n            return Invoke(() => new MessageBoxWindow().ShowInput(WindowManager.CurrentWindow, messageBoxText, caption, defaultInput));\r\n        }\r\n\r\n        public StringSelectionDialogResult SelectString(string messageBoxText, string caption, string defaultInput, List<MessageBoxToggle> options)\r\n        {\r\n            return Invoke(() => new MessageBoxWindow().ShowInput(WindowManager.CurrentWindow, messageBoxText, caption, defaultInput, options));\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options)\r\n        {\r\n            return Invoke(() => new MessageBoxWindow().Show(WindowManager.CurrentWindow, messageBoxText, caption, button, icon, defaultResult, options));\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)\r\n        {\r\n            return ShowMessage(messageBoxText, caption, button, icon, defaultResult, MessageBoxOptions.None);\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon)\r\n        {\r\n            return ShowMessage(messageBoxText, caption, button, icon, MessageBoxResult.None, MessageBoxOptions.None);\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button)\r\n        {\r\n            return ShowMessage(messageBoxText, caption, button, MessageBoxImage.None, MessageBoxResult.None, MessageBoxOptions.None);\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText, string caption)\r\n        {\r\n            return ShowMessage(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxOptions.None);\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText)\r\n        {\r\n            return ShowMessage(messageBoxText, string.Empty, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxOptions.None);\r\n        }\r\n\r\n        public void ShowSelectableString(string messageBoxText, string caption, string inputText)\r\n        {\r\n            Invoke(() => new MessageBoxWindow().ShowInputReadOnly(WindowManager.CurrentWindow, messageBoxText, caption, inputText));\r\n        }\r\n\r\n        public MessageBoxResult ShowErrorMessage(string messageBoxText, string caption)\r\n        {\r\n            return ShowMessage(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Error);\r\n        }\r\n\r\n        public MessageBoxResult ShowErrorMessage(string messageBoxText)\r\n        {\r\n            return ShowMessage(messageBoxText, string.Empty, MessageBoxButton.OK, MessageBoxImage.Error);\r\n        }\r\n\r\n        public MessageBoxOption ShowMessage(string messageBoxText, string caption, MessageBoxImage icon, List<MessageBoxOption> options)\r\n        {\r\n            return Invoke(() => new MessageBoxWindow().ShowCustom(WindowManager.CurrentWindow, messageBoxText, caption, icon, options));\r\n        }\r\n\r\n        public ImageFileOption ChooseImageFile(List<ImageFileOption> files, string caption = null, double itemWidth = 240, double itemHeight = 180)\r\n        {\r\n            return Invoke(() =>\r\n            {\r\n                var model = new ImageSelectionViewModel(files, new ImageSelectionWindowFactory(), caption, itemWidth, itemHeight);\r\n                if (model.OpenView() == true)\r\n                {\r\n                    return model.SelectedImage;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            });\r\n        }\r\n\r\n        public GenericItemOption ChooseItemWithSearch(List<GenericItemOption> items, Func<string, List<GenericItemOption>> searchFunction, string defaultSearch = null, string caption = null)\r\n        {\r\n            return Invoke(() =>\r\n            {\r\n                var model = new ItemSelectionWithSearchViewModel(new ItemSelectionWithSearchWindowFactory(), searchFunction, defaultSearch, caption);\r\n                if (model.OpenView() == true)\r\n                {\r\n                    return model.SelectedResult;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            });\r\n        }\r\n\r\n        public GlobalProgressResult ActivateGlobalProgress(Action<GlobalProgressActionArgs> progresAction, GlobalProgressOptions progressArgs)\r\n        {\r\n            return Invoke(() => GlobalProgress.ActivateProgress(progresAction, progressArgs));\r\n        }\r\n\r\n        public GlobalProgressResult ActivateGlobalProgress(Func<GlobalProgressActionArgs, Task> progresAction, GlobalProgressOptions progressArgs)\r\n        {\r\n            return Invoke(() => GlobalProgress.ActivateProgress(progresAction, progressArgs));\r\n        }\r\n\r\n        public Window CreateWindow(WindowCreationOptions options)\r\n        {\r\n            return new WindowBase()\r\n            {\r\n                ShowMaximizeButton = options.ShowMaximizeButton,\r\n                ShowMinimizeButton = options.ShowMinimizeButton,\r\n                ShowCloseButton = options.ShowCloseButton,\r\n                Style = ResourceProvider.GetResource(\"StandardWindowStyle\") as Style\r\n            };\r\n        }\r\n\r\n        public Window GetCurrentAppWindow()\r\n        {\r\n            return WindowManager.CurrentWindow;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/DesktopGamesEditor.cs",
    "content": "﻿using Playnite.Controllers;\r\nusing Playnite.Database;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.DesktopApp.Windows;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Settings;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp\r\n{\r\n    public class DesktopGamesEditor : GamesEditor\r\n    {\r\n        public DesktopGamesEditor(\r\n            GameDatabase database,\r\n            GameControllerFactory controllerFactory,\r\n            PlayniteSettings appSettings,\r\n            IDialogsFactory dialogs,\r\n            ExtensionFactory extensions,\r\n            PlayniteApplication app,\r\n            IActionSelector actionSelector) : base(\r\n                database,\r\n                controllerFactory,\r\n                appSettings,\r\n                dialogs,\r\n                extensions,\r\n                app,\r\n                actionSelector)\r\n        {\r\n        }\r\n\r\n        public bool? SetGameCategories(Game game)\r\n        {\r\n            var model = new CategoryConfigViewModel(new CategoryConfigWindowFactory(), Database, game);\r\n            return model.OpenView();\r\n        }\r\n\r\n        public bool? SetGamesCategories(List<Game> games)\r\n        {\r\n            var model = new CategoryConfigViewModel(new CategoryConfigWindowFactory(), Database, games);\r\n            return model.OpenView();\r\n        }\r\n\r\n        public bool? EditGame(Game game)\r\n        {\r\n            var model = new GameEditViewModel(\r\n                            game,\r\n                            Database,\r\n                            new GameEditWindowFactory(),\r\n                            Dialogs,\r\n                            new ResourceProvider(),\r\n                            Extensions,\r\n                            AppSettings);\r\n            return model.OpenView();\r\n        }\r\n\r\n        public bool? EditGames(List<Game> games)\r\n        {\r\n            var model = new GameEditViewModel(\r\n                            games,\r\n                            Database,\r\n                            new GameEditWindowFactory(),\r\n                            Dialogs,\r\n                            new ResourceProvider(),\r\n                            Extensions,\r\n                            AppSettings);\r\n            return model.OpenView();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/GlobalResources.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n\r\n    <sys:Double x:Key=\"DesignWidth\">1920</sys:Double>\r\n    <sys:Double x:Key=\"DesignHeight\">1080</sys:Double>\r\n    \r\n    <sys:Boolean x:Key=\"True\">True</sys:Boolean>\r\n    <sys:Boolean x:Key=\"False\">False</sys:Boolean>\r\n    \r\n    <FontFamily x:Key=\"FontIcoFont\">/Fonts/icofont.ttf#icofont</FontFamily>\r\n    \r\n    <pcon:BidirectionalEnumAndNumberConverter x:Key=\"BidirectionalEnumAndNumberConverter\" />\r\n    <pcon:BooleanToHiddenConverter x:Key=\"BooleanToHiddenConverter\" />\r\n    <pcon:BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n    <pcon:BoolToAutoWidthConverter x:Key=\"BoolToAutoWidthConverter\" />\r\n    <pcon:BoolToYesNoConverter x:Key=\"BoolToYesNoConverter\" />\r\n    <pcon:CoversZoomToPercentageConverter x:Key=\"CoversZoomToPercentageConverter\" />\r\n    <pcon:DateTimeToLastPlayedConverter x:Key=\"DateTimeToLastPlayedConverter\" />\r\n    <pcon:DockToStringConverter x:Key=\"DockToStringConverter\" />\r\n    <pcon:EnumToBooleanConverter x:Key=\"EnumToBooleanConverter\" />\r\n    <pcon:EnumToVisibilityConverter x:Key=\"EnumToVisibilityConverter\" />\r\n    <pcon:ICollectionNullOrEmptyToVisibilityConverter x:Key=\"ICollectionNullOrEmptyToVisibilityConverter\" />\r\n    <pcon:IconToImageSourceConverter x:Key=\"IconToImageSourceConverter\" />\r\n    <pcon:ImageStringToImageConverter x:Key=\"ImageStringToImageConverter\" />\r\n    <pcon:ImageStringToImageConverter x:Key=\"ImageStringToImageConverterCached\" Cached=\"True\" />\r\n    <pcon:InvertableBooleanToVisibilityConverter x:Key=\"InvertableBooleanToVisibilityConverter\" />\r\n    <pcon:InvertedBooleanToVisibilityConverter x:Key=\"InvertedBooleanToVisibilityConverter\" />\r\n    <pcon:InvertedBoolenConverter x:Key=\"InvertedBoolenConverter\" />\r\n    <pcon:ListToStringConverter x:Key=\"ListToStringConverter\" />\r\n    <pcon:PlayTimeToStringConverter x:Key=\"PlayTimeToStringConverter\" />\r\n    <pcon:NegateConverter x:Key=\"NegateConverter\" />\r\n    <pcon:NotificationIconConverter x:Key=\"NotificationIconConverter\" />\r\n    <pcon:NullableDateToStringConverter x:Key=\"NullableDateToStringConverter\" />\r\n    <pcon:NullableUlongBytesSizeToStringConverter x:Key=\"NullableUlongBytesSizeToStringConverter\" />\r\n    <pcon:NullToBoolConverter x:Key=\"NullToBoolConverter\" />\r\n    <pcon:NullToDependencyPropertyUnsetConverter x:Key=\"NullToDependencyPropertyUnsetConverter\" />\r\n    <pcon:NullToVisibilityConverter x:Key=\"NullToVisibilityConverter\" />\r\n    <pcon:ObjectToStringConverter x:Key=\"ObjectToStringConverter\" />\r\n    <pcon:OpacityBoolConverter x:Key=\"OpacityBoolConverter\" />\r\n    <pcon:ReleaseDateToStringConverter x:Key=\"ReleaseDateToStringConverter\" />\r\n    <pcon:SortingOrderToStringConverter x:Key=\"SortingOrderToStringConverter\" />\r\n    <pcon:StrechToStringConverter x:Key=\"StrechToStringConverter\" />\r\n    <pcon:StringNullOrEmptyToBoolConverter x:Key=\"StringNullOrEmptyToBoolConverter\" />\r\n    <pcon:StringNullOrEmptyToVisibilityConverter x:Key=\"StringNullOrEmptyToVisibilityConverter\" />\r\n    <pcon:StringToUpperCaseConverter x:Key=\"StringToUpperCaseConverter\" />\r\n    <pcon:ValueConverterGroup x:Key=\"ValueConverterGroup\" />\r\n    <pcon:WidthToFontSizeConverter x:Key=\"WidthToFontSizeConverter\" />\r\n    <pcon:IntToVisibilityConverter x:Key=\"IntToVisibilityConverter\" />\r\n    <pcon:InvertedIntToVisibilityConverter x:Key=\"InvertedIntToVisibilityConverter\" />\r\n    <pcon:ObjectEqualityToBoolConverter x:Key=\"ObjectEqualityToBoolConverter\" />\r\n    <pcon:ObjectEqualityToVisibilityConverter x:Key=\"ObjectEqualityToVisibilityConverter\" />\r\n    <pcon:InvertedObjectEqualityToBoolConverter x:Key=\"InvertedObjectEqualityToBoolConverter\" />\r\n    <pcon:InvertedObjectEqualityToVisibilityConverter x:Key=\"InvertedObjectEqualityToVisibilityConverter\" />\r\n    <pcon:PluginIconSourceToElementConverter x:Key=\"PluginIconSourceToElementConverter\" />\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Markups.cs",
    "content": "﻿using Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp.Markup\r\n{\r\n    public class Api : Extensions.Markup.Api\r\n    {\r\n        public Api() : base()\r\n        {\r\n        }\r\n\r\n        public Api(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class MainViewModel : Extensions.Markup.MainViewModel<DesktopAppViewModel, DesignMainViewModel, DesktopApplication>\r\n    {\r\n        public MainViewModel() : base()\r\n        {\r\n        }\r\n\r\n        public MainViewModel(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class PluginSettings : Extensions.Markup.PluginSettings\r\n    {\r\n        public PluginSettings() : base()\r\n        {\r\n        }\r\n\r\n        public PluginSettings(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class Settings : Extensions.Markup.Settings\r\n    {\r\n        public Settings() : base()\r\n        {\r\n        }\r\n\r\n        public Settings(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class SettingsBinding : Extensions.Markup.SettingsBinding\r\n    {\r\n        public SettingsBinding() : base()\r\n        {\r\n        }\r\n\r\n        public SettingsBinding(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class ThemeFile : Extensions.Markup.ThemeFile\r\n    {\r\n        public ThemeFile() : base(ApplicationMode.Desktop)\r\n        {\r\n        }\r\n\r\n        public ThemeFile(string path) : base(path, ApplicationMode.Desktop)\r\n        {\r\n        }\r\n\r\n        public static ThemeManifest GetDesignTimeDefaultTheme()\r\n        {\r\n            return GetDesignTimeDefaultTheme(ApplicationMode.Desktop);\r\n        }\r\n    }\r\n\r\n    public class ThemeFileBinding : Extensions.Markup.ThemeFileBinding\r\n    {\r\n        public ThemeFileBinding() : base()\r\n        {\r\n        }\r\n\r\n        public ThemeFileBinding(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class PluginStatus : Extensions.Markup.PluginStatus\r\n    {\r\n    }\r\n\r\n    public class PluginConverter : Extensions.Markup.PluginConverter\r\n    {\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Playnite.DesktopApp.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}</ProjectGuid>\r\n    <OutputType>WinExe</OutputType>\r\n    <RootNamespace>Playnite.DesktopApp</RootNamespace>\r\n    <AssemblyName>Playnite.DesktopApp</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r\n    <WarningLevel>4</WarningLevel>\r\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\r\n    <Deterministic>true</Deterministic>\r\n    <NuGetPackageImportStamp>\r\n    </NuGetPackageImportStamp>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <LangVersion>7.3</LangVersion>\r\n    <DebugSymbols>true</DebugSymbols>\r\n  </PropertyGroup>\r\n  <PropertyGroup />\r\n  <PropertyGroup>\r\n    <ApplicationManifest>app.manifest</ApplicationManifest>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <StartupObject>Playnite.DesktopApp.ProgramEntry</StartupObject>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <ApplicationIcon>Themes\\Desktop\\Default\\Images\\applogo.ico</ApplicationIcon>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n    <LangVersion>7.3</LangVersion>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n    <DebugType>pdbonly</DebugType>\r\n    <DebugSymbols>true</DebugSymbols>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"CommandLine, Version=2.8.0.0, Culture=neutral, PublicKeyToken=5a870481e358d379, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\CommandLineParser.2.8.0\\lib\\net461\\CommandLine.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Hardcodet.Wpf.TaskbarNotification, Version=1.0.5.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Hardcodet.NotifyIcon.Wpf.1.0.8\\lib\\net451\\Hardcodet.Wpf.TaskbarNotification.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"HtmlRenderer, Version=1.5.1.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\references\\HtmlRenderer.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"HtmlRenderer.WPF, Version=1.5.1.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\references\\HtmlRenderer.WPF.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\CommonServiceLocator.1.3\\lib\\portable-net4+sl5+netcore45+wpa81+wp8\\Microsoft.Practices.ServiceLocation.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.Xaml.Behaviors, Version=1.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Microsoft.Xaml.Behaviors.Wpf.1.1.39\\lib\\net45\\Microsoft.Xaml.Behaviors.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Prism, Version=6.3.0.0, Culture=neutral, PublicKeyToken=40ee6c3a2184dc59, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Prism.Core.6.3.0\\lib\\net45\\Prism.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Prism.Wpf, Version=6.3.0.0, Culture=neutral, PublicKeyToken=40ee6c3a2184dc59, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Prism.Wpf.6.3.0\\lib\\net45\\Prism.Wpf.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Drawing\" />\r\n    <Reference Include=\"System.IO.Abstractions, Version=2.1.0.227, Culture=neutral, PublicKeyToken=96bf224d23c43e59, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\System.IO.Abstractions.2.1.0.227\\lib\\net40\\System.IO.Abstractions.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\System.ValueTuple.4.5.0\\lib\\net461\\System.ValueTuple.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Prism.Wpf.6.3.0\\lib\\net45\\System.Windows.Interactivity.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"System.Xaml\">\r\n      <RequiredTargetFramework>4.0</RequiredTargetFramework>\r\n    </Reference>\r\n    <Reference Include=\"WindowsBase\" />\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ApplicationDefinition Include=\"App.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </ApplicationDefinition>\r\n    <Compile Include=\"Api\\MainViewAPI.cs\" />\r\n    <Compile Include=\"App.xaml.cs\">\r\n      <DependentUpon>App.xaml</DependentUpon>\r\n      <SubType>Code</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\AddonsSections\\AddonUpdates.xaml.cs\">\r\n      <DependentUpon>AddonUpdates.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\AddonsSections\\BrowseAddons.xaml.cs\">\r\n      <DependentUpon>BrowseAddons.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\AddonsSections\\InstalledExtensions.xaml.cs\">\r\n      <DependentUpon>InstalledExtensions.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\ComboBoxList.cs\" />\r\n    <Compile Include=\"Controls\\ExpanderEx.cs\" />\r\n    <Compile Include=\"Controls\\Menus\\FilterPresetsMenu.cs\" />\r\n    <Compile Include=\"Controls\\ComboBoxListBase.cs\" />\r\n    <Compile Include=\"Controls\\Menus\\GameGroupMenu.cs\" />\r\n    <Compile Include=\"Controls\\Menus\\GameMenu.cs\" />\r\n    <Compile Include=\"Controls\\GamesGridView.xaml.cs\">\r\n      <DependentUpon>GamesGridView.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\GameTaskView.xaml.cs\">\r\n      <DependentUpon>GameTaskView.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\GameListItem.cs\" />\r\n    <Compile Include=\"Controls\\LibraryStatistics.xaml.cs\">\r\n      <DependentUpon>LibraryStatistics.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\Menus\\ViewSelectionMenu.cs\" />\r\n    <Compile Include=\"Controls\\Menus\\SortSettingsMenu.cs\" />\r\n    <Compile Include=\"Controls\\Menus\\GroupSettingsMenu.cs\" />\r\n    <Compile Include=\"Controls\\MetadataDownloadSettings.xaml.cs\">\r\n      <DependentUpon>MetadataDownloadSettings.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\NullableIntBox.cs\" />\r\n    <Compile Include=\"Controls\\NumericDoubleBox.cs\" />\r\n    <Compile Include=\"Controls\\LongNumericBox.cs\" />\r\n    <Compile Include=\"Controls\\PathSelectionBox.cs\" />\r\n    <Compile Include=\"Controls\\SettingsSections\\AppearanceListView.xaml.cs\">\r\n      <DependentUpon>AppearanceListView.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\LibrariesConfigWindowInfo.xaml.cs\">\r\n      <DependentUpon>LibrariesConfigWindowInfo.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\AppearanceTopPanel.xaml.cs\">\r\n      <DependentUpon>AppearanceTopPanel.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\AppearanceAdvanced.xaml.cs\">\r\n      <DependentUpon>AppearanceAdvanced.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\AppearanceDetailsView.xaml.cs\">\r\n      <DependentUpon>AppearanceDetailsView.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\AppearanceGeneral.xaml.cs\">\r\n      <DependentUpon>AppearanceGeneral.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\AppearanceGridView.xaml.cs\">\r\n      <DependentUpon>AppearanceGridView.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\AppearanceLayout.xaml.cs\">\r\n      <DependentUpon>AppearanceLayout.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\ClientShutdown.xaml.cs\">\r\n      <DependentUpon>ClientShutdown.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\AddonsSections\\InstalledThemes.xaml.cs\">\r\n      <DependentUpon>InstalledThemes.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Development.xaml.cs\">\r\n      <DependentUpon>Development.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\ImportExlusionList.xaml.cs\">\r\n      <DependentUpon>ImportExlusionList.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\ErrorLoading.xaml.cs\">\r\n      <DependentUpon>ErrorLoading.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Performance.xaml.cs\">\r\n      <DependentUpon>Performance.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\NoSettingsAvailable.xaml.cs\">\r\n      <DependentUpon>NoSettingsAvailable.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\EmptyParent.xaml.cs\">\r\n      <DependentUpon>EmptyParent.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\General.xaml.cs\">\r\n      <DependentUpon>General.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\GeneralAdvanced.xaml.cs\">\r\n      <DependentUpon>GeneralAdvanced.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Input.xaml.cs\">\r\n      <DependentUpon>Input.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Metadata.xaml.cs\">\r\n      <DependentUpon>Metadata.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Scripting.xaml.cs\">\r\n      <DependentUpon>Scripting.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SearchBox.cs\" />\r\n    <Compile Include=\"Controls\\DdItemListSelectionBox.cs\" />\r\n    <Compile Include=\"Controls\\FilterEnumSelectionBox.cs\" />\r\n    <Compile Include=\"Controls\\FilterSelectionBox.cs\" />\r\n    <Compile Include=\"Controls\\FilterStringSelectionBox.cs\" />\r\n    <Compile Include=\"Controls\\SettingsSections\\Backup.xaml.cs\">\r\n      <DependentUpon>Backup.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Search.xaml.cs\">\r\n      <DependentUpon>Search.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Updates.xaml.cs\">\r\n      <DependentUpon>Updates.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Sorting.xaml.cs\">\r\n      <DependentUpon>Sorting.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\TopPanelItem.cs\" />\r\n    <Compile Include=\"Controls\\SidebarItem.cs\" />\r\n    <Compile Include=\"Controls\\SliderWithPopup.xaml.cs\">\r\n      <DependentUpon>SliderWithPopup.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\Menus\\TrayContextMenu.cs\" />\r\n    <Compile Include=\"Controls\\Menus\\ViewSettingsMenu.cs\" />\r\n    <Compile Include=\"Controls\\Menus\\MainMenu.cs\" />\r\n    <Compile Include=\"Controls\\Views\\ExplorerPanel.cs\" />\r\n    <Compile Include=\"Controls\\Views\\Library.cs\" />\r\n    <Compile Include=\"Controls\\Views\\GameOverview.cs\" />\r\n    <Compile Include=\"Controls\\Views\\BaseGamesView.cs\" />\r\n    <Compile Include=\"Controls\\Views\\DetailsViewGameOverview.cs\" />\r\n    <Compile Include=\"Controls\\Views\\GridViewGameOverview.cs\" />\r\n    <Compile Include=\"Controls\\Views\\LibraryGridView.cs\" />\r\n    <Compile Include=\"Controls\\Views\\FilterPanel.cs\" />\r\n    <Compile Include=\"Controls\\Views\\LibraryDetailsView.cs\" />\r\n    <Compile Include=\"Controls\\Views\\LibraryListView.cs\" />\r\n    <Compile Include=\"Controls\\Views\\NotificationPanel.cs\" />\r\n    <Compile Include=\"Controls\\Views\\SearchWindow.cs\" />\r\n    <Compile Include=\"Controls\\Views\\Sidebar.cs\" />\r\n    <Compile Include=\"Controls\\Views\\MainWindow.cs\" />\r\n    <Compile Include=\"Controls\\Views\\TopPanel.cs\" />\r\n    <Compile Include=\"Controls\\SliderEx.cs\" />\r\n    <Compile Include=\"Controls\\GridViewPanel.cs\" />\r\n    <Compile Include=\"DesktopActionSelector.cs\" />\r\n    <Compile Include=\"DesktopApplication.cs\" />\r\n    <Compile Include=\"DesktopCollectionView.cs\" />\r\n    <Compile Include=\"DesktopDialogs.cs\" />\r\n    <Compile Include=\"DesktopGamesEditor.cs\" />\r\n    <Compile Include=\"Markups.cs\" />\r\n    <Compile Include=\"ViewModels\\AboutViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\ActionSelectionViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\AddonsViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\AddonsViewModel_Installed.cs\" />\r\n    <Compile Include=\"ViewModels\\AddonsViewModel_Online.cs\" />\r\n    <Compile Include=\"ViewModels\\CategoryConfigViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\DatabaseFieldsManagerViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\DesignData\\DesignMainViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\DesktopAppViewModel_Sidebar.cs\" />\r\n    <Compile Include=\"ViewModels\\DesktopAppViewModel_Commands.cs\" />\r\n    <Compile Include=\"ViewModels\\DesktopAppViewModel_TopPanel.cs\" />\r\n    <Compile Include=\"ViewModels\\EmulatedGamesImportViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\EmulatorImportViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\EmulatorsViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\FirstTimeStartupViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\GameDetailsViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\GameEditViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\GameEditViewModelCommands.cs\" />\r\n    <Compile Include=\"ViewModels\\GameEditViewModelFieldChecks.cs\" />\r\n    <Compile Include=\"ViewModels\\GameEditViewModelMetadata.cs\" />\r\n    <Compile Include=\"ViewModels\\GoogleImageDownloadViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\InstalledGamesViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\DesktopAppViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\LibraryIntegrationsViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\MetadataDownloadViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\ImageSelectionViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\ItemSelectionWithSearchViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\PluginSettingsViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\SettingsViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\MetadataComparisonViewModel.cs\" />\r\n    <Compile Include=\"PluginSettingsHelper.cs\" />\r\n    <Compile Include=\"ViewModels\\StatisticsViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\ToolsConfigViewModel.cs\" />\r\n    <Compile Include=\"Windows\\SingleItemSelectionWindow.xaml.cs\">\r\n      <DependentUpon>SingleItemSelectionWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\MultiItemSelectionWindow.xaml.cs\">\r\n      <DependentUpon>MultiItemSelectionWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\ActionSelectionWindow.xaml.cs\">\r\n      <DependentUpon>ActionSelectionWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\EmulatedGameImportWindow.xaml.cs\">\r\n      <DependentUpon>EmulatedGameImportWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\EmulatorDownloadWindow.xaml.cs\">\r\n      <DependentUpon>EmulatorDownloadWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\LicenseAgreementWindow.xaml.cs\">\r\n      <DependentUpon>LicenseAgreementWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\AddonsWindow.xaml.cs\">\r\n      <DependentUpon>AddonsWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\ExtensionCrashHandlerWindow.xaml.cs\">\r\n      <DependentUpon>ExtensionCrashHandlerWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\MetadataComparisonWindow.xaml.cs\">\r\n      <DependentUpon>MetadataComparisonWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\LibraryIntegrationsWindow.xaml.cs\">\r\n      <DependentUpon>LibraryIntegrationsWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\SearchWindow.xaml.cs\">\r\n      <DependentUpon>SearchWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\ToolsConfigWindow.xaml.cs\">\r\n      <DependentUpon>ToolsConfigWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\AboutWindow.xaml.cs\">\r\n      <DependentUpon>AboutWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\CategoryConfigWindow.xaml.cs\">\r\n      <DependentUpon>CategoryConfigWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\ControlGallery.xaml.cs\">\r\n      <DependentUpon>ControlGallery.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\CrashHandlerWindow.xaml.cs\">\r\n      <DependentUpon>CrashHandlerWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\DatabaseFieldsManagerWindow.xaml.cs\">\r\n      <DependentUpon>DatabaseFieldsManagerWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\EmulatorImportWindow.xaml.cs\">\r\n      <DependentUpon>EmulatorImportWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\EmulatorsWindow.xaml.cs\">\r\n      <DependentUpon>EmulatorsWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\FirstTimeStartupWindow.xaml.cs\">\r\n      <DependentUpon>FirstTimeStartupWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\GameEditWindow.xaml.cs\">\r\n      <DependentUpon>GameEditWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\GoogleImageDownloadWindow.xaml.cs\">\r\n      <DependentUpon>GoogleImageDownloadWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\InstalledGamesWindow.xaml.cs\">\r\n      <DependentUpon>InstalledGamesWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\MainWindow.xaml.cs\">\r\n      <DependentUpon>MainWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\MessageBoxWindow.xaml.cs\">\r\n      <DependentUpon>MessageBoxWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\MetadataDownloadWindow.xaml.cs\">\r\n      <DependentUpon>MetadataDownloadWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\ImageSelectionWindow.xaml.cs\">\r\n      <DependentUpon>ImageSelectionWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\ItemSelectionWithSearchWindow.xaml.cs\">\r\n      <DependentUpon>ItemSelectionWithSearchWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\PluginSettingsWindow.xaml.cs\">\r\n      <DependentUpon>PluginSettingsWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\ProgressWindow.xaml.cs\">\r\n      <DependentUpon>ProgressWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\RandomGameSelectWindow.xaml.cs\">\r\n      <DependentUpon>RandomGameSelectWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\SettingsWindow.xaml.cs\">\r\n      <DependentUpon>SettingsWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\UpdateWindow.xaml.cs\">\r\n      <DependentUpon>UpdateWindow.xaml</DependentUpon>\r\n    </Compile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"ProgramEntry.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\r\n      <SubType>Code</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DesignTime>True</DesignTime>\r\n      <DependentUpon>Resources.resx</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DependentUpon>Settings.settings</DependentUpon>\r\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\r\n    </Compile>\r\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\r\n      <Generator>ResXFileCodeGenerator</Generator>\r\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\r\n    </EmbeddedResource>\r\n    <Resource Include=\"..\\..\\references\\Fonts\\icofont.ttf\">\r\n      <Link>Fonts\\icofont.ttf</Link>\r\n    </Resource>\r\n    <None Include=\"app.manifest\" />\r\n    <None Include=\"packages.config\" />\r\n    <None Include=\"Properties\\Settings.settings\">\r\n      <Generator>SettingsSingleFileGenerator</Generator>\r\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\r\n    </None>\r\n    <Resource Include=\"Resources\\igdbicon.png\" />\r\n    <None Include=\"Themes\\Desktop\\Default\\theme.yaml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"App.config\">\r\n      <SubType>Designer</SubType>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\PlayniteSDK\\Playnite.SDK.csproj\">\r\n      <Project>{19bc9097-5705-4352-90e2-99f0c63230d0}</Project>\r\n      <Name>Playnite.SDK</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\Playnite\\Playnite.csproj\">\r\n      <Project>{ad271e73-8a13-4c4e-bfdc-3076646b59e3}</Project>\r\n      <Name>Playnite</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <EmbeddedResource Include=\"Resources\\contributors.txt\" />\r\n    <SplashScreen Include=\"SplashScreen.png\" />\r\n    <None Include=\"..\\Playnite\\license.txt\">\r\n      <Link>license.txt</Link>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Constants.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\WindowBase.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\Button.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\applogo.ico\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\applogo.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\csharp.ico\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\custom_cover_background.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\discord.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\patreon.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\kofi.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\powershell.ico\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\python.ico\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\reddit.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\applogo_black.ico\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\applogo_white.ico\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\Images\\applogo_dark.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Desktop\\Default\\DescriptionView.html\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\MainWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\FilterPanelView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\TopPanel.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\LibraryListView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\LibraryDetailsView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\LibraryGridView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\Sidebar.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Page Include=\"Controls\\AddonsSections\\AddonUpdates.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\AddonsSections\\BrowseAddons.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\AddonsSections\\InstalledExtensions.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"ControlGalleryView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\GamesGridView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\GameTaskView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\LibraryStatistics.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\MetadataDownloadSettings.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\AppearanceListView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\LibrariesConfigWindowInfo.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\AppearanceTopPanel.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\AppearanceAdvanced.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\AppearanceDetailsView.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\AppearanceGeneral.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\AppearanceGridView.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\AppearanceLayout.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\ClientShutdown.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\AddonsSections\\InstalledThemes.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Development.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\ImportExlusionList.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\ErrorLoading.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Performance.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\NoSettingsAvailable.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\EmptyParent.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\General.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\GeneralAdvanced.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Input.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Metadata.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Scripting.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Backup.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Search.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Updates.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Sorting.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Controls\\SliderWithPopup.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"GlobalResources.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\HighlightBorder.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\Border.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\NotificationPanel.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\CheckBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\ComboBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\ContextMenu.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\DatePicker.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\Expander.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\GridSplitter.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\GroupBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\Hyperlink.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\Label.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\ListBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\ListView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\Menu.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\PasswordBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\Popup.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\ProgressBar.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\RadioButton.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\RepeatButton.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\RichTextBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\ScrollViewer.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\Slider.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\TabControl.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\TextBlock.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\TextBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\Thumb.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\ToggleButton.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\ToolTip.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\TreeView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Common.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\ExtendedListBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\ExtendedListView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\GameMenu.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\HtmlTextView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\NumericBoxes.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\BottomButton.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\DetailsHyperlink.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\ImageHighlightButton.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\MainWindowStyle.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\PlayButton.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\StandardWindowStyle.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\WindowBarButton.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\DetailsViewGameOverview.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\PropertyItemButton.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\GridViewGameOverview.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\TrayContextMenu.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Media.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\Library.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\ExplorerPanel.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\DetailsViewItemStyle.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\NotificationMessage.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\DetailsViewGroupStyle.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\DetailsViewItemTemplate.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\GridViewItemStyle.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\GridViewItemTemplate.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\SimpleButton.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\DetailsScrollViewer.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\TextBlockGameScore.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\SliderEx.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\GameGroupMenu.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\ExpanderEx.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\SidebarItem.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\GridViewGroupStyle.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\SearchBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\ComboBoxList.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\FilterSelectionBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DefaultControls\\DataGrid.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\ExtendedDataGrid.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\TopPanelItem.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\PathSelectionBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\DerivedStyles\\ListViewGroupStyle.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\Views\\SearchView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Desktop\\Default\\CustomControls\\HotKeyBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Page Include=\"Themes\\Generic.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\SingleItemSelectionWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\MultiItemSelectionWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\ActionSelectionWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\EmulatedGameImportWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\EmulatorDownloadWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\LicenseAgreementWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\AddonsWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\ExtensionCrashHandlerWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\MetadataComparisonWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\LibraryIntegrationsWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\SearchWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\ToolsConfigWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\AboutWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\CategoryConfigWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\ControlGallery.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Windows\\CrashHandlerWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\DatabaseFieldsManagerWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\EmulatorImportWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\EmulatorsWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\FirstTimeStartupWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\GameEditWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\GoogleImageDownloadWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\InstalledGamesWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\MainWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\MessageBoxWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\MetadataDownloadWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\ImageSelectionWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\ItemSelectionWithSearchWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\PluginSettingsWindow.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Windows\\ProgressWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\RandomGameSelectWindow.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Windows\\SettingsWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\UpdateWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n  </ItemGroup>\r\n  <ItemGroup />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>SETX PLAYNITE_SLN $(SolutionDir)</PostBuildEvent>\r\n    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>\r\n  </PropertyGroup>\r\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\r\n    <PropertyGroup>\r\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\r\n    </PropertyGroup>\r\n    <Error Condition=\"!Exists('..\\packages\\LargeAddressAware.1.0.5\\build\\LargeAddressAware.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\LargeAddressAware.1.0.5\\build\\LargeAddressAware.targets'))\" />\r\n  </Target>\r\n  <Import Project=\"..\\packages\\LargeAddressAware.1.0.5\\build\\LargeAddressAware.targets\" Condition=\"Exists('..\\packages\\LargeAddressAware.1.0.5\\build\\LargeAddressAware.targets')\" />\r\n  <PropertyGroup>\r\n    <LargeAddressAware>true</LargeAddressAware>\r\n  </PropertyGroup>\r\n</Project>"
  },
  {
    "path": "source/Playnite.DesktopApp/PluginSettingsHelper.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class PluginSettingsItem\r\n    {\r\n        public ISettings Settings { get; set; }\r\n        public UserControl View { get; set; }\r\n        public string Name { get; set; }\r\n        public string Icon { get; set; }\r\n    }\r\n\r\n    public abstract class PluginSettingsHelper\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public static UserControl GetPluginSettingsView(Guid pluginId, ExtensionFactory extensions, Dictionary<Guid, PluginSettingsItem> loadedPluginSettings)\r\n        {\r\n            if (loadedPluginSettings.TryGetValue(pluginId, out var settings))\r\n            {\r\n                return settings.View;\r\n            }\r\n\r\n            try\r\n            {\r\n                var plugin = extensions.Plugins.Values.First(a => a.Plugin.Id == pluginId);\r\n                var provSetting = plugin.Plugin.GetSettings(false);\r\n                var provView = plugin.Plugin.GetSettingsView(false);\r\n                if (provSetting != null && provView != null)\r\n                {\r\n                    provView.DataContext = provSetting;\r\n                    provSetting.BeginEdit();\r\n                    var plugSetting = new PluginSettingsItem()\r\n                    {\r\n                        Name = plugin.Description.Name,\r\n                        Settings = provSetting,\r\n                        View = provView\r\n                    };\r\n\r\n                    loadedPluginSettings.Add(pluginId, plugSetting);\r\n                    return provView;\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to load plugin settings, {pluginId}\");\r\n                return new Controls.SettingsSections.ErrorLoading();\r\n            }\r\n\r\n            return new Controls.SettingsSections.NoSettingsAvailable();\r\n        }\r\n\r\n        public static Tuple<bool, List<string>> VerifyPluginSettings(Dictionary<Guid, PluginSettingsItem> loadedPluginSettings)\r\n        {\r\n            foreach (var plugin in loadedPluginSettings.Values)\r\n            {\r\n                if (!plugin.Settings.VerifySettings(out var errors))\r\n                {\r\n                    logger.Error($\"Plugin settings verification errors {plugin.Name}.\");\r\n                    errors?.ForEach(a => logger.Error(a));\r\n                    if (errors == null)\r\n                    {\r\n                        errors = new List<string>();\r\n                    }\r\n\r\n                    return new Tuple<bool, List<string>>(false, errors);\r\n                }\r\n            }\r\n\r\n            return new Tuple<bool, List<string>>(true, null);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ProgramEntry.cs",
    "content": "﻿using CommandLine;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Runtime;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.DesktopApp\r\n{\r\n    public class ProgramEntry\r\n    {\r\n        [STAThread]\r\n        public static void Main(string[] args)\r\n        {\r\n            var cmdLine = new CmdLineOptions();\r\n            var parsed = Parser.Default.ParseArguments<CmdLineOptions>(Environment.GetCommandLineArgs());\r\n            if (parsed is Parsed<CmdLineOptions> options)\r\n            {\r\n                cmdLine = options.Value;\r\n            }\r\n\r\n            if (!cmdLine.UserDataDir.IsNullOrWhiteSpace())\r\n            {\r\n                try\r\n                {\r\n                    cmdLine.UserDataDir = cmdLine.UserDataDir.TrimEnd(new char[] { '/', '\\\\', '\"' });\r\n                    FileSystem.CreateDirectory(cmdLine.UserDataDir, false);\r\n                    PlaynitePaths.UpdateUserDataDir(cmdLine.UserDataDir);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    MessageBox.Show(\r\n                        $\"Failed to initialize in specified user data folder:\\n{e.Message}\",\r\n                        \"Startup Error\",\r\n                        MessageBoxButton.OK,\r\n                        MessageBoxImage.Error);\r\n                    return;\r\n                }\r\n            }\r\n\r\n            FileSystem.CreateDirectory(PlaynitePaths.JitProfilesPath);\r\n            ProfileOptimization.SetProfileRoot(PlaynitePaths.JitProfilesPath);\r\n            ProfileOptimization.StartProfile(\"desktop\");\r\n\r\n            if (Computer.WindowsVersion == WindowsVersion.Win7 || Computer.WindowsVersion == WindowsVersion.Win8)\r\n            {\r\n                MessageBox.Show(\r\n                     \"Windows 7 and Windows 8 are no longer supported. Please update your operating system or downgrade to older Playnite version.\",\r\n                     \"Startup Error\",\r\n                     MessageBoxButton.OK,\r\n                     MessageBoxImage.Error);\r\n                return;\r\n            }\r\n\r\n            if (PlaynitePaths.ProgramPath.Contains(@\"temp\\rar$\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                MessageBox.Show(\r\n                    \"Playnite is not allowed to run from temporary extracted archive.\\rInstall/Extract application properly before starting it.\",\r\n                    \"Startup Error\",\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n                return;\r\n            }\r\n            else if (PlaynitePaths.ProgramPath.Contains(\"#\"))\r\n            {\r\n                MessageBox.Show(\r\n                    \"Playnite is unable to run from current directory due to illegal character '#' in the path. Please use different directory.\",\r\n                    \"Startup Error\",\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n                return;\r\n            }\r\n\r\n            SplashScreen splash = null;\r\n            var procCount = Process.GetProcesses().Where(a => PlayniteApplication.IsProcessPlayniteProcess(a)).Count();\r\n            if (cmdLine.Start.IsNullOrEmpty() && !cmdLine.HideSplashScreen && procCount == 1)\r\n            {\r\n                splash = new SplashScreen(\"SplashScreen.png\");\r\n                splash.Show(false);\r\n            }\r\n\r\n            PlayniteSettings.ConfigureLogger();\r\n            LogManager.GetLogger().Info($\"App arguments: '{string.Join(\",\", args)}'\");\r\n            var app = new DesktopApplication(() => new App(), splash, cmdLine);\r\n            app.Run();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Resources;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\nusing System.Windows;\r\nusing System.Windows.Markup;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"Playnite Desktop Application\")]\r\n[assembly: AssemblyDescription(\"Playnite Desktop Application\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"Josef Nemec\")]\r\n[assembly: AssemblyProduct(\"Playnite\")]\r\n[assembly: AssemblyCopyright(\"Copyright © Josef Nemec 2019\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n//In order to begin building localizable applications, set\r\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\r\n//inside a <PropertyGroup>.  For example, if you are using US english\r\n//in your source files, set the <UICulture> to en-US.  Then uncomment\r\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\r\n//the line below to match the UICulture setting in the project file.\r\n\r\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\r\n\r\n\r\n[assembly: ThemeInfo(\r\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\r\n                                     //(used if a resource is not found in the page,\r\n                                     // or application resource dictionaries)\r\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\r\n                                              //(used if a resource is not found in the page,\r\n                                              // app, or any theme specific resource dictionaries)\r\n)]\r\n\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: InternalsVisibleTo(\"Playnite.DesktopApp.Tests\")]\r\n\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.DesktopApp.Controls\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.DesktopApp.Controls.Views\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.DesktopApp.Markup\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.DesktopApp.ViewModels\")]\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace Playnite.DesktopApp.Properties\r\n{\r\n\r\n\r\n    /// <summary>\r\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\r\n    /// </summary>\r\n    // This class was auto-generated by the StronglyTypedResourceBuilder\r\n    // class via a tool like ResGen or Visual Studio.\r\n    // To add or remove a member, edit your .ResX file then rerun ResGen\r\n    // with the /str option, or rebuild your VS project.\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\r\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    internal class Resources\r\n    {\r\n\r\n        private static global::System.Resources.ResourceManager resourceMan;\r\n\r\n        private static global::System.Globalization.CultureInfo resourceCulture;\r\n\r\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        internal Resources()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///   Returns the cached ResourceManager instance used by this class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Resources.ResourceManager ResourceManager\r\n        {\r\n            get\r\n            {\r\n                if ((resourceMan == null))\r\n                {\r\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"Playnite.DesktopApp.Properties.Resources\", typeof(Resources).Assembly);\r\n                    resourceMan = temp;\r\n                }\r\n                return resourceMan;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///   Overrides the current thread's CurrentUICulture property for all\r\n        ///   resource lookups using this strongly typed resource class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Globalization.CultureInfo Culture\r\n        {\r\n            get\r\n            {\r\n                return resourceCulture;\r\n            }\r\n            set\r\n            {\r\n                resourceCulture = value;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "source/Playnite.DesktopApp/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace Playnite.DesktopApp.Properties\r\n{\r\n\r\n\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"11.0.0.0\")]\r\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase\r\n    {\r\n\r\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\r\n\r\n        public static Settings Default\r\n        {\r\n            get\r\n            {\r\n                return defaultInstance;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\r\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\r\n  <Profiles>\r\n    <Profile Name=\"(Default)\" />\r\n  </Profiles>\r\n  <Settings />\r\n</SettingsFile>"
  },
  {
    "path": "source/Playnite.DesktopApp/Resources/contributors.txt",
    "content": "﻿PhrozenByte\r\ninondle\r\nL1cardo\r\nArtexJay\r\nRubeensVinicius\r\nsekuka925\r\nEvene174\r\ndarklinkpower\r\nWarmaster\r\nclintonbale\r\nBy6r9\r\nMrCraigen\r\nwilco375\r\nzygzak\r\nWargzaxk\r\nRatox00\r\nVuelos\r\nspektor56\r\nClearStrelok\r\nStarFang208\r\nmetallic77\r\nt-miller\r\nkkjdroid\r\nDonkeyfumbler\r\npsychonic\r\ntesivo\r\njharmer95\r\nKorjam\r\nMates1500\r\nTheCakeIsNaOH\r\nFalsen123\r\nbburky\r\nromgerman\r\nYamaha373\r\nJanStefanski\r\nawdavis\r\nstnzbass\r\nfasterthanlime\r\nTyler Szabo\r\nelisherer\r\nawbooze\r\nerri120\r\ngreggameplayer\r\nfelixkmh\r\nCurt Grimes\r\nJeshibu\r\nUrbanCMC\r\nWLTD\r\nLemmusLemmus\r\nRioluu\r\nNekuSoul\r\nLiam Scholte\r\nColoradohusky"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Common.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"BaseStyle\" TargetType=\"Control\">\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n\r\n    <Style x:Key=\"BaseTextBlockStyle\" TargetType=\"TextBlock\">\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n\r\n    <Style x:Key=\"PopupBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource PopupBackgroundBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource PopupBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource PopupBorderThickness}\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Constants.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n\r\n    <sys:Double x:Key=\"FontSizeSmall\">12</sys:Double>\r\n    <sys:Double x:Key=\"FontSize\">14</sys:Double>\r\n    <sys:Double x:Key=\"FontSizeLarge\">15</sys:Double>\r\n    <sys:Double x:Key=\"FontSizeLarger\">20</sys:Double>\r\n    <sys:Double x:Key=\"FontSizeLargest\">29</sys:Double>\r\n    <FontFamily x:Key=\"FontFamily\">Trebuchet MS</FontFamily>\r\n    <FontFamily x:Key=\"MonospaceFontFamily\">Consolas</FontFamily>\r\n    <Thickness x:Key=\"PopupBorderThickness\">1</Thickness>\r\n    <Thickness x:Key=\"ControlBorderThickness\">1</Thickness>\r\n    <sys:Double x:Key=\"EllipseBorderThickness\">1</sys:Double>\r\n    <CornerRadius x:Key=\"ControlCornerRadius\">1</CornerRadius>\r\n    <Thickness x:Key=\"SidebarItemPadding\">8</Thickness>\r\n\r\n    <Color x:Key=\"BlackColor\">#FF000000</Color>\r\n    <Color x:Key=\"WhiteColor\">#FFFFFFFF</Color>\r\n    <Color x:Key=\"TextColor\">#f2f2f2</Color>\r\n    <Color x:Key=\"TextColorDarker\">#a3a3a3</Color>\r\n    <Color x:Key=\"TextColorDark\">#FF000000</Color>\r\n    <Color x:Key=\"MainColor\">#2C3A67</Color>\r\n    <Color x:Key=\"MainColorDark\">#0D1225</Color>\r\n    <Color x:Key=\"HoverColor\">#247BA0</Color>\r\n    <Color x:Key=\"GlyphColor\">#55CDFF</Color>\r\n    <Color x:Key=\"HighlightGlyphColor\">#8855CDFF</Color>\r\n    <Color x:Key=\"PopupBackgroundColor\">#171e26</Color>\r\n    <Color x:Key=\"PopupBorderColor\">#3e6184</Color>\r\n    <Color x:Key=\"BackgroundToneColor\">#2C3A67</Color>\r\n    <Color x:Key=\"GridItemBackgroundColor\">#151e3d</Color>\r\n    <Color x:Key=\"PanelSeparatorColor\">#662C3A67</Color>\r\n    <Color x:Key=\"WindowPanelSeparatorColor\">#3355CDFF</Color>\r\n    <Color x:Key=\"DataChangeNotifColor\">#ffa500</Color>\r\n\r\n    <SolidColorBrush x:Key=\"ControlBackgroundBrush\" Color=\"Transparent\" />\r\n    <SolidColorBrush x:Key=\"TextBrush\" Color=\"{DynamicResource TextColor}\" />\r\n    <SolidColorBrush x:Key=\"TextBrushDarker\" Color=\"{DynamicResource TextColorDarker}\" />\r\n    <SolidColorBrush x:Key=\"TextBrushDark\" Color=\"{DynamicResource TextColorDark}\" />\r\n    <SolidColorBrush x:Key=\"NormalBrush\" Color=\"{DynamicResource MainColor}\" />\r\n    <SolidColorBrush x:Key=\"NormalBrushDark\" Color=\"{DynamicResource MainColorDark}\" />\r\n    <SolidColorBrush x:Key=\"NormalBorderBrush\" Color=\"#5555CDFF\" />\r\n    <SolidColorBrush x:Key=\"HoverBrush\" Color=\"{DynamicResource HighlightGlyphColor}\" />\r\n    <SolidColorBrush x:Key=\"GlyphBrush\" Color=\"{DynamicResource GlyphColor}\" />\r\n    <SolidColorBrush x:Key=\"HighlightGlyphBrush\" Color=\"{DynamicResource HighlightGlyphColor}\" />\r\n    <SolidColorBrush x:Key=\"PopupBorderBrush\" Color=\"{DynamicResource PopupBorderColor}\" />\r\n    <SolidColorBrush x:Key=\"TooltipBackgroundBrush\" Color=\"{DynamicResource BackgroundToneColor}\" />\r\n    <SolidColorBrush x:Key=\"ButtonBackgroundBrush\" Color=\"#0a0e1e\" />\r\n    <SolidColorBrush x:Key=\"GridItemBackgroundBrush\" Color=\"{DynamicResource GridItemBackgroundColor}\" />\r\n    <SolidColorBrush x:Key=\"PanelSeparatorBrush\" Color=\"{DynamicResource PanelSeparatorColor}\" />\r\n    <SolidColorBrush x:Key=\"WindowPanelSeparatorBrush\" Color=\"{DynamicResource WindowPanelSeparatorColor}\" />\r\n    <SolidColorBrush x:Key=\"PopupBackgroundBrush\" Color=\"#1f2847\" />\r\n    <SolidColorBrush x:Key=\"CheckBoxCheckMarkBkBrush\" Color=\"{DynamicResource MainColorDark}\" />\r\n    <SolidColorBrush x:Key=\"DataChangeNotifBrush\" Color=\"{DynamicResource DataChangeNotifColor}\" />\r\n\r\n    <SolidColorBrush x:Key=\"PositiveRatingBrush\" Color=\"#78ffa0\" />\r\n    <SolidColorBrush x:Key=\"NegativeRatingBrush\" Color=\"#ff6b6b\" />\r\n    <SolidColorBrush x:Key=\"MixedRatingBrush\" Color=\"#fffca1\" />\r\n\r\n    <SolidColorBrush x:Key=\"WarningBrush\" Color=\"#ff6b6b\" />\r\n\r\n    <LinearGradientBrush x:Key=\"ExpanderBackgroundBrush\" StartPoint=\"-0.1,0.5\" EndPoint=\"1.2,1\" >\r\n        <GradientStop Color=\"#FF2C3A67\" Offset=\"0\"/>\r\n        <GradientStop Color=\"#002C3A67\" Offset=\"0.7\"/>\r\n    </LinearGradientBrush>\r\n\r\n    <LinearGradientBrush x:Key=\"WindowBackgourndBrush\" StartPoint=\"0.5,-0.2\" EndPoint=\"0.4,1\" >\r\n        <GradientStop Color=\"#202b4d\" Offset=\"0\"/>\r\n        <GradientStop Color=\"{DynamicResource MainColorDark}\" Offset=\"0.4\"/>\r\n    </LinearGradientBrush>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/ComboBoxList.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" \r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n\r\n    <ControlTemplate x:Key=\"ComboBoxListBaseTemplate\" TargetType=\"{x:Type ComboBoxListBase}\">\r\n        <Border BorderThickness=\"{DynamicResource ControlBorderThickness}\"\r\n                CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                Style=\"{DynamicResource HighlightBorder}\"\r\n                Background=\"{TemplateBinding Background}\"\r\n                x:Name=\"Root\">\r\n            <Grid>\r\n                <DockPanel>\r\n                    <Viewbox Margin=\"0,0,2,0\" DockPanel.Dock=\"Right\">\r\n                        <TextBlock Text=\"6\" FontFamily=\"Marlett\"\r\n                                   Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                   VerticalAlignment=\"Center\"/>\r\n                    </Viewbox>\r\n                    <TextBlock x:Name=\"PART_TextFilterString\"\r\n                               Style=\"{StaticResource BaseTextBlockStyle}\"\r\n                               TextTrimming=\"CharacterEllipsis\" HorizontalAlignment=\"Stretch\" \r\n                               VerticalAlignment=\"Center\" DockPanel.Dock=\"Left\"\r\n                               Margin=\"5,0,0,0\"/>\r\n                </DockPanel>\r\n                <ToggleButton x:Name=\"MainToggle\"\r\n                              BorderThickness=\"0\" Focusable=\"False\"\r\n                              HorizontalContentAlignment=\"Stretch\"\r\n                              Background=\"Transparent\">\r\n                    <ToggleButton.Style>\r\n                        <Style TargetType=\"ToggleButton\">\r\n                            <Setter Property=\"Template\">\r\n                                <Setter.Value>\r\n                                    <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\r\n                                        <Border Background=\"Transparent\">\r\n                                            <ContentPresenter />\r\n                                        </Border>\r\n                                    </ControlTemplate>\r\n                                </Setter.Value>\r\n                            </Setter>\r\n                        </Style>\r\n                    </ToggleButton.Style>\r\n                </ToggleButton>\r\n                <Button x:Name=\"PART_ButtonClearFilter\"\r\n                        Margin=\"0,0,20,0\" FontSize=\"18\"\r\n                        Background=\"Transparent\" HorizontalAlignment=\"Right\"\r\n                        BorderThickness=\"0\" Padding=\"3,0,3,0\"\r\n                        ContentTemplate=\"{DynamicResource ClearTextIconTemplate}\">\r\n                    <Button.Style>\r\n                        <Style TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                            <Style.Triggers>\r\n                                <DataTrigger Binding=\"{Binding IsMouseOver, ElementName=Root}\" Value=\"True\">\r\n                                    <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                                </DataTrigger>\r\n                            </Style.Triggers>\r\n                        </Style>\r\n                    </Button.Style>\r\n                </Button>\r\n                <Popup Placement=\"Bottom\" Focusable=\"False\" AllowsTransparency=\"True\" Name=\"Popup\"\r\n                       IsOpen=\"{Binding IsChecked, ElementName=MainToggle, Mode=TwoWay, Delay=100}\" StaysOpen=\"False\"\r\n                       MaxHeight=\"300\" MinWidth=\"{Binding ActualWidth, ElementName=MainToggle}\">\r\n                    <Border Background=\"{DynamicResource PopupBackgroundBrush}\"\r\n                            BorderThickness=\"{DynamicResource PopupBorderThickness}\"\r\n                            BorderBrush=\"{DynamicResource PopupBorderBrush}\">\r\n                        <ItemsControl x:Name=\"PART_ItemsPanel\" />\r\n                    </Border>\r\n                </Popup>\r\n            </Grid>\r\n        </Border>\r\n    </ControlTemplate>\r\n\r\n    <ControlTemplate x:Key=\"FilterComboBoxListTemplate\" TargetType=\"{x:Type ComboBoxListBase}\">\r\n        <Border BorderThickness=\"{DynamicResource ControlBorderThickness}\"\r\n                CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                Style=\"{DynamicResource HighlightBorder}\"\r\n                Background=\"{TemplateBinding Background}\"\r\n                x:Name=\"Root\">\r\n            <Grid>\r\n                <DockPanel>\r\n                    <Viewbox Margin=\"0,0,2,0\" DockPanel.Dock=\"Right\">\r\n                        <TextBlock Text=\"6\" FontFamily=\"Marlett\"\r\n                                   Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                   VerticalAlignment=\"Center\"/>\r\n                    </Viewbox>\r\n                    <TextBlock x:Name=\"PART_TextFilterString\"\r\n                               Style=\"{StaticResource BaseTextBlockStyle}\"\r\n                               TextTrimming=\"CharacterEllipsis\" HorizontalAlignment=\"Stretch\" \r\n                               VerticalAlignment=\"Center\" DockPanel.Dock=\"Left\"\r\n                               Margin=\"5,0,0,0\"/>\r\n                </DockPanel>\r\n                <ToggleButton x:Name=\"MainToggle\"\r\n                              BorderThickness=\"0\" Focusable=\"False\"\r\n                              HorizontalContentAlignment=\"Stretch\"\r\n                              Background=\"Transparent\">\r\n                    <ToggleButton.Style>\r\n                        <Style TargetType=\"ToggleButton\">\r\n                            <Setter Property=\"Template\">\r\n                                <Setter.Value>\r\n                                    <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\r\n                                        <Border Background=\"Transparent\">\r\n                                            <ContentPresenter />\r\n                                        </Border>\r\n                                    </ControlTemplate>\r\n                                </Setter.Value>\r\n                            </Setter>\r\n                        </Style>\r\n                    </ToggleButton.Style>\r\n                </ToggleButton>\r\n                <Button x:Name=\"PART_ButtonClearFilter\"\r\n                        Margin=\"0,0,20,0\" FontSize=\"18\"\r\n                        Background=\"Transparent\" HorizontalAlignment=\"Right\"\r\n                        BorderThickness=\"0\" Padding=\"3,0,3,0\"\r\n                        ContentTemplate=\"{DynamicResource ClearTextIconTemplate}\">\r\n                    <Button.Style>\r\n                        <Style TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                            <Style.Triggers>\r\n                                <DataTrigger Binding=\"{Binding IsMouseOver, ElementName=Root}\" Value=\"True\">\r\n                                    <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                                </DataTrigger>\r\n                            </Style.Triggers>\r\n                        </Style>\r\n                    </Button.Style>\r\n                </Button>\r\n                <Popup Placement=\"Bottom\" Focusable=\"False\" AllowsTransparency=\"True\" Name=\"Popup\"\r\n                       IsOpen=\"{Binding IsChecked, ElementName=MainToggle, Mode=TwoWay, Delay=100}\" StaysOpen=\"False\"\r\n                       MaxHeight=\"300\" MinWidth=\"{Binding ActualWidth, ElementName=MainToggle}\">\r\n                    <Border Background=\"{DynamicResource PopupBackgroundBrush}\"\r\n                            BorderThickness=\"{DynamicResource PopupBorderThickness}\"\r\n                            BorderBrush=\"{DynamicResource PopupBorderBrush}\">\r\n                        <Grid>\r\n                            <Grid.RowDefinitions>\r\n                                <RowDefinition Height=\"auto\" />\r\n                                <RowDefinition Height=\"*\" />\r\n                            </Grid.RowDefinitions>\r\n                            <DockPanel Grid.Row=\"0\" Margin=\"5\" Name=\"PART_ElemSearchHost\">                                \r\n                                <CheckBox DockPanel.Dock=\"Right\"\r\n                                          x:Name=\"PART_ToggleSelectedOnly\"\r\n                                          ToolTip=\"{DynamicResource LOCOnlyItemsSelectedTooltip}\"\r\n                                          FontFamily=\"{DynamicResource FontIcoFont}\" />\r\n                                <SearchBox DockPanel.Dock=\"Left\" Margin=\"0,0,5,0\" x:Name=\"PART_SearchBox\" />\r\n                            </DockPanel>\r\n                            <ItemsControl x:Name=\"PART_ItemsPanel\" Grid.Row=\"1\" />\r\n                        </Grid>\r\n                    </Border>\r\n                </Popup>\r\n            </Grid>\r\n        </Border>\r\n    </ControlTemplate>\r\n\r\n    <Style x:Key=\"ComboBoxListItemStyle\" TargetType=\"{x:Type CheckBox}\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\r\n        <Setter Property=\"Padding\" Value=\"5\" />\r\n    </Style>\r\n    \r\n    <Style TargetType=\"{x:Type ComboBoxList}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Height\" Value=\"24\" />\r\n        <Setter Property=\"Template\" Value=\"{DynamicResource ComboBoxListBaseTemplate}\" />\r\n    </Style>\r\n    \r\n    <Style TargetType=\"{x:Type DdItemListSelectionBox}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Height\" Value=\"24\" />\r\n        <Setter Property=\"Template\" Value=\"{DynamicResource FilterComboBoxListTemplate}\" />        \r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/ExpanderEx.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type ExpanderEx}\" BasedOn=\"{StaticResource {x:Type Expander}}\">\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/ExtendedDataGrid.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type ExtendedDataGrid}\" BasedOn=\"{StaticResource {x:Type DataGrid}}\">\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/ExtendedListBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type ExtendedListBox}\" BasedOn=\"{StaticResource {x:Type ListBox}}\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/ExtendedListView.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type ExtendedListView}\" BasedOn=\"{StaticResource {x:Type ListView}}\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/FilterSelectionBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" \r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n\r\n    <ControlTemplate x:Key=\"FilterSelectionBoxTemplate\" TargetType=\"{x:Type FilterSelectionBoxBase}\">\r\n        <Border BorderThickness=\"{DynamicResource ControlBorderThickness}\"\r\n                CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                Style=\"{DynamicResource HighlightBorder}\"\r\n                Background=\"{TemplateBinding Background}\"\r\n                x:Name=\"Root\">\r\n            <Grid>\r\n                <DockPanel>\r\n                    <Viewbox Margin=\"0,0,2,0\" DockPanel.Dock=\"Right\">\r\n                        <TextBlock Text=\"6\" FontFamily=\"Marlett\"\r\n                                   Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                   VerticalAlignment=\"Center\"/>\r\n                    </Viewbox>\r\n                    <TextBlock x:Name=\"PART_TextFilterString\"\r\n                               Style=\"{StaticResource BaseTextBlockStyle}\"\r\n                               TextTrimming=\"CharacterEllipsis\" HorizontalAlignment=\"Stretch\" \r\n                               VerticalAlignment=\"Center\" DockPanel.Dock=\"Left\"\r\n                               Margin=\"5,0,0,0\"/>\r\n                </DockPanel>\r\n                <ToggleButton x:Name=\"MainToggle\"\r\n                              BorderThickness=\"0\" Focusable=\"False\"\r\n                              HorizontalContentAlignment=\"Stretch\"\r\n                              Background=\"Transparent\">\r\n                    <ToggleButton.Style>\r\n                        <Style TargetType=\"ToggleButton\">\r\n                            <Setter Property=\"Template\">\r\n                                <Setter.Value>\r\n                                    <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\r\n                                        <Border Background=\"Transparent\">\r\n                                            <ContentPresenter />\r\n                                        </Border>\r\n                                    </ControlTemplate>\r\n                                </Setter.Value>\r\n                            </Setter>\r\n                        </Style>\r\n                    </ToggleButton.Style>\r\n                </ToggleButton>\r\n                <TextBox x:Name=\"PART_TextFilterInput\" BorderThickness=\"0\"\r\n                         VerticalAlignment=\"Center\" Margin=\"1,0,30,0\"/>\r\n                <Button x:Name=\"PART_ButtonClearFilter\"\r\n                        Margin=\"0,0,20,0\" FontSize=\"18\"\r\n                        Background=\"Transparent\" HorizontalAlignment=\"Right\"\r\n                        BorderThickness=\"0\" Padding=\"3,0,3,0\"\r\n                        ContentTemplate=\"{DynamicResource ClearTextIconTemplate}\">\r\n                    <Button.Style>\r\n                        <Style TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                            <Style.Triggers>\r\n                                <DataTrigger Binding=\"{Binding IsMouseOver, ElementName=Root}\" Value=\"True\">\r\n                                    <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                                </DataTrigger>\r\n                            </Style.Triggers>\r\n                        </Style>\r\n                    </Button.Style>\r\n                </Button>\r\n                <Popup Placement=\"Bottom\" Focusable=\"False\" AllowsTransparency=\"True\" Name=\"Popup\"\r\n                       IsOpen=\"{Binding IsChecked, ElementName=MainToggle, Mode=TwoWay, Delay=100}\" StaysOpen=\"False\"\r\n                       MaxHeight=\"300\" MinWidth=\"{Binding ActualWidth, ElementName=MainToggle}\">\r\n                    <Border Background=\"{DynamicResource PopupBackgroundBrush}\"\r\n                            BorderThickness=\"{DynamicResource PopupBorderThickness}\"\r\n                            BorderBrush=\"{DynamicResource PopupBorderBrush}\">\r\n                        <ItemsControl x:Name=\"PART_ItemsPanel\" />\r\n                    </Border>\r\n                </Popup>\r\n            </Grid>\r\n        </Border>\r\n    </ControlTemplate>\r\n\r\n    <Style x:Key=\"FilterSelectionBoxItemStyle\" TargetType=\"{x:Type CheckBox}\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\r\n        <Setter Property=\"Padding\" Value=\"5\" />\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type FilterEnumSelectionBox}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Height\" Value=\"24\" />\r\n        <Setter Property=\"Template\" Value=\"{DynamicResource FilterSelectionBoxTemplate}\" />\r\n    </Style>\r\n    \r\n    <Style TargetType=\"{x:Type FilterStringSelectionBox}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Height\" Value=\"24\" />\r\n        <Setter Property=\"Template\" Value=\"{DynamicResource FilterSelectionBoxTemplate}\" />\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type FilterSelectionBox}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Height\" Value=\"24\" />\r\n        <Setter Property=\"Template\" Value=\"{DynamicResource FilterSelectionBoxTemplate}\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/GameGroupMenu.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type GameGroupMenu}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource PopupBackgroundBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource PopupBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource PopupBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GameGroupMenu}\">\r\n                    <Border BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            Background=\"{TemplateBinding Background}\"\r\n                            Grid.IsSharedSizeScope=\"True\">\r\n                        <ItemsPresenter />\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/GameMenu.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type GameMenu}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource PopupBackgroundBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource PopupBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource PopupBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GameMenu}\">\r\n                    <Border BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            Background=\"{TemplateBinding Background}\"\r\n                            Grid.IsSharedSizeScope=\"True\">\r\n                        <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\">\r\n                            <ItemsPresenter KeyboardNavigation.DirectionalNavigation=\"Cycle\"/>\r\n                        </ScrollViewer>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/HotKeyBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type HotKeyBox}\" BasedOn=\"{StaticResource {x:Type TextBox}}\">        \r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/HtmlTextView.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type HtmlTextView}\" />\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/NumericBoxes.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <ControlTemplate x:Key=\"NumericBoxTemplate\" TargetType=\"{x:Type TextBox}\">\r\n        <Border x:Name=\"Border\" Padding=\"3\"\r\n                Background=\"{TemplateBinding Background}\"\r\n                Style=\"{DynamicResource HighlightBorder}\">\r\n            <ScrollViewer x:Name=\"PART_ContentHost\"\r\n                          VerticalScrollBarVisibility=\"{TemplateBinding VerticalScrollBarVisibility}\"\r\n                          HorizontalScrollBarVisibility=\"{TemplateBinding HorizontalScrollBarVisibility}\"/>\r\n        </Border>\r\n        <ControlTemplate.Triggers>\r\n            <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n            </Trigger>\r\n        </ControlTemplate.Triggers>\r\n    </ControlTemplate>\r\n\r\n    <Style TargetType=\"{x:Type LongNumericBox}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"CaretBrush\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"Template\" Value=\"{DynamicResource NumericBoxTemplate}\" />\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type UlongNumericBox}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"CaretBrush\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"Template\" Value=\"{DynamicResource NumericBoxTemplate}\" />\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type NullIntNumericBox}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"CaretBrush\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"Template\" Value=\"{DynamicResource NumericBoxTemplate}\" />\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type DoubleNumericBox}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"CaretBrush\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"Template\" Value=\"{DynamicResource NumericBoxTemplate}\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/PathSelectionBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type PathSelectionBox}\" BasedOn=\"{StaticResource {x:Type TextBox}}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type TextBox}\">\r\n                    <DockPanel>\r\n                        <Button x:Name=\"PART_ButtonDirectorySelect\" DockPanel.Dock=\"Right\" Margin=\"5,0,0,0\"\r\n                                Content=\"&#xec5b;\" FontFamily=\"{StaticResource FontIcoFont}\" \r\n                                MaxHeight=\"{TemplateBinding ActualHeight}\"\r\n                                ToolTip=\"{DynamicResource LOCSelectDirectoryTooltip}\" />\r\n                        <Button x:Name=\"PART_ButtonFileSelect\" DockPanel.Dock=\"Right\" Margin=\"5,0,0,0\"\r\n                                Content=\"&#xef27;\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                                MaxHeight=\"{TemplateBinding ActualHeight}\"\r\n                                ToolTip=\"{DynamicResource LOCSelectFileTitle}\"/>\r\n                        <Border x:Name=\"Border\" BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                                Background=\"{TemplateBinding Background}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                                Style=\"{DynamicResource HighlightBorder}\" BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                                DockPanel.Dock=\"Left\">\r\n                            <ScrollViewer x:Name=\"PART_ContentHost\"\r\n                                          VerticalScrollBarVisibility=\"{TemplateBinding VerticalScrollBarVisibility}\"\r\n                                          HorizontalScrollBarVisibility=\"{TemplateBinding HorizontalScrollBarVisibility}\"/>\r\n                        </Border>\r\n                    </DockPanel>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/SearchBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" \r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n\r\n    <Style TargetType=\"{x:Type SearchBox}\">\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"MinHeight\" Value=\"24\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type SearchBox}\">\r\n                    <Grid>\r\n                        <ContentControl x:Name=\"PART_SeachIcon\"\r\n                                        ContentTemplate=\"{DynamicResource SearchTextIconTemplate}\"\r\n                                        VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\" Margin=\"5,0,0,0\"\r\n                                        Foreground=\"{DynamicResource TextBrushDarker}\" />\r\n                        <TextBox x:Name=\"PART_TextInpuText\"\r\n                                 VerticalContentAlignment=\"Center\" Padding=\"5,0,25,0\"/>\r\n                        <ContentControl x:Name=\"PART_ClearTextIcon\"\r\n                                        ContentTemplate=\"{DynamicResource ClearTextIconTemplate}\" \r\n                                        FontSize=\"18\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Right\" Margin=\"0,0,5,0\" \r\n                                        Foreground=\"{DynamicResource TextBrushDarker}\" />\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/SidebarItem.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type SidebarItem}\">\r\n        <Setter Property=\"WindowChrome.IsHitTestVisibleInChrome\" Value=\"True\" />\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"Foreground\" Value=\"#dbdbdb\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"3,0,0,0\" />\r\n        <Setter Property=\"Width\" Value=\"44\" />\r\n        <Setter Property=\"Height\" Value=\"44\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type SidebarItem}\">\r\n                    <Grid>\r\n                        <ProgressBar x:Name=\"PART_ProgressStatus\"\r\n                                     BorderThickness=\"0\" Background=\"Transparent\"\r\n                                     HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\" />\r\n                        <Border Background=\"{TemplateBinding Background}\"\r\n                                Padding=\"{Binding IconPadding}\"\r\n                                BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                                BorderBrush=\"{TemplateBinding BorderBrush}\">\r\n                            <Viewbox>\r\n                                <ContentPresenter HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\" />\r\n                            </Viewbox>\r\n                        </Border>\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <DataTrigger Binding=\"{Binding Selected}\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </DataTrigger>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Background\" Value=\"{DynamicResource HoverBrush}\" />\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n            <DataTrigger Binding=\"{Settings SidebarPosition}\" Value=\"Right\">\r\n                <Setter Property=\"BorderThickness\" Value=\"0,0,3,0\" />\r\n            </DataTrigger>\r\n            <DataTrigger Binding=\"{Settings SidebarPosition}\" Value=\"Top\">\r\n                <Setter Property=\"BorderThickness\" Value=\"0,3,0,0\" />\r\n            </DataTrigger>\r\n            <DataTrigger Binding=\"{Settings SidebarPosition}\" Value=\"Bottom\">\r\n                <Setter Property=\"BorderThickness\" Value=\"0,0,0,3\" />\r\n            </DataTrigger>\r\n            <MultiTrigger>\r\n                <MultiTrigger.Conditions>\r\n                    <Condition Property=\"Content\" Value=\"{x:Null}\" />\r\n                    <Condition Property=\"ContentTemplate\" Value=\"{x:Null}\" />\r\n                </MultiTrigger.Conditions>\r\n                <MultiTrigger.Setters>\r\n                    <Setter Property=\"Background\" Value=\"OrangeRed\" />\r\n                </MultiTrigger.Setters>\r\n            </MultiTrigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/SliderEx.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"SliderExTrackButton\" TargetType=\"{x:Type RepeatButton}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"true\" />\r\n        <Setter Property=\"IsTabStop\" Value=\"False\" />\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type RepeatButton}\">\r\n                    <Border Background=\"Transparent\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type SliderEx}\" BasedOn=\"{StaticResource {x:Type Slider}}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Slider}\">\r\n                    <Grid x:Name=\"GridRoot\">\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"Auto\" />\r\n                            <RowDefinition Height=\"Auto\" MinHeight=\"{TemplateBinding MinHeight}\" />\r\n                            <RowDefinition Height=\"Auto\" />\r\n                        </Grid.RowDefinitions>\r\n                        <TickBar x:Name=\"TopTick\" Visibility=\"Collapsed\" Height=\"4\" Placement=\"Top\"\r\n                                 SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"  Fill=\"{DynamicResource GlyphBrush}\" />\r\n                        <Border Grid.Row=\"1\" Margin=\"1\" Height=\"4\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\r\n                                Background=\"{DynamicResource HighlightGlyphBrush}\" \r\n                                Width=\"{Binding ActualWidth, ElementName=ButtonDecrease}\" />\r\n                        <Border x:Name=\"Border\" Grid.Row=\"1\" Margin=\"0\" Height=\"6\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                                Background=\"{TemplateBinding Background}\" BorderBrush=\"{DynamicResource NormalBorderBrush}\"\r\n                                BorderThickness=\"{DynamicResource ControlBorderThickness}\" />\r\n                        <Track Grid.Row=\"1\" x:Name=\"PART_Track\">\r\n                            <Track.Thumb>\r\n                                <Thumb Width=\"10\" />\r\n                            </Track.Thumb>\r\n                            <Track.DecreaseRepeatButton>\r\n                                <RepeatButton x:Name=\"ButtonDecrease\"\r\n                                              Style=\"{StaticResource SliderTrackButton}\"\r\n                                              Command=\"Slider.DecreaseLarge\" />\r\n                            </Track.DecreaseRepeatButton>\r\n                            <Track.IncreaseRepeatButton>\r\n                                <RepeatButton x:Name=\"ButtonIncrease\"\r\n                                              Style=\"{StaticResource SliderTrackButton}\"\r\n                                              Command=\"Slider.IncreaseLarge\" />\r\n                            </Track.IncreaseRepeatButton>\r\n                        </Track>\r\n                        <TickBar x:Name=\"BottomTick\" Visibility=\"Collapsed\" Grid.Row=\"2\" Height=\"4\" Placement=\"Bottom\"\r\n                                 SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" Fill=\"{TemplateBinding Foreground}\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter TargetName=\"PART_Track\" Property=\"FocusManager.FocusedElement\" Value=\"{Binding ElementName=PART_Track}\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"TickPlacement\" Value=\"TopLeft\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"TopTick\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"TickPlacement\" Value=\"BottomRight\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BottomTick\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"TickPlacement\" Value=\"Both\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"TopTick\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BottomTick\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"Orientation\" Value=\"Vertical\">\r\n                            <Setter Property=\"LayoutTransform\" TargetName=\"GridRoot\">\r\n                                <Setter.Value>\r\n                                    <RotateTransform Angle=\"-90\" />\r\n                                </Setter.Value>\r\n                            </Setter>\r\n                            <Setter TargetName=\"PART_Track\" Property=\"Orientation\" Value=\"Horizontal\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/TopPanelItem.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type TopPanelItem}\">\r\n        <Setter Property=\"MinWidth\" Value=\"35\" />\r\n        <Setter Property=\"WindowChrome.IsHitTestVisibleInChrome\" Value=\"True\" />\r\n        <Setter Property=\"Margin\" Value=\"8,0,0,0\" />\r\n        <Setter Property=\"Background\" Value=\"#990a0e1e\" />\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Padding\" Value=\"0\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type TopPanelItem}\">\r\n                    <Border x:Name=\"Border\" BorderThickness=\"0\" Background=\"{TemplateBinding Background}\"\r\n                            CornerRadius=\"3\" BorderBrush=\"{TemplateBinding BorderBrush}\">\r\n                        <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                          VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                          Margin=\"{TemplateBinding Padding}\" RecognizesAccessKey=\"True\" />\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsToggled\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n            <MultiTrigger>\r\n                <MultiTrigger.Conditions>\r\n                    <Condition Property=\"Content\" Value=\"{x:Null}\" />\r\n                    <Condition Property=\"ContentTemplate\" Value=\"{x:Null}\" />\r\n                </MultiTrigger.Conditions>\r\n                <MultiTrigger.Setters>\r\n                    <Setter Property=\"Background\" Value=\"OrangeRed\" />\r\n                </MultiTrigger.Setters>\r\n            </MultiTrigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/TrayContextMenu.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type TrayContextMenu}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource PopupBackgroundBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource PopupBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource PopupBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type TrayContextMenu}\">\r\n                    <Border BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            Background=\"{TemplateBinding Background}\"\r\n                            Grid.IsSharedSizeScope=\"True\">\r\n                        <ItemsPresenter />\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/WindowBase.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"WindowBase\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource WindowBackgourndBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type WindowBase}\">\r\n                    <Border Background=\"{TemplateBinding Background}\">\r\n                        <AdornerDecorator>\r\n                            <ContentPresenter />\r\n                        </AdornerDecorator>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Border.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"Border\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Button.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type Button}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"10,5,10,5\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Button}\">\r\n                    <Border x:Name=\"Border\" BorderThickness=\"{TemplateBinding BorderThickness}\" Background=\"{TemplateBinding Background}\"                            \r\n                            CornerRadius=\"{DynamicResource ControlCornerRadius}\" Style=\"{DynamicResource HighlightBorder}\"\r\n                            BorderBrush=\"{TemplateBinding BorderBrush}\">\r\n                        <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                          VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                          Margin=\"{TemplateBinding Padding}\" RecognizesAccessKey=\"True\" />\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>                  \r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/CheckBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type CheckBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type CheckBox}\">\r\n                    <Border Background=\"{TemplateBinding Background}\"\r\n                            Padding=\"{TemplateBinding Padding}\">\r\n                        <DockPanel>\r\n                            <Border x:Name=\"BulletBorder\" DockPanel.Dock=\"Left\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                                    VerticalAlignment=\"Center\"\r\n                                    BorderThickness=\"{TemplateBinding BorderThickness}\" Background=\"{TemplateBinding Background}\"\r\n                                    BorderBrush=\"{TemplateBinding BorderBrush}\">\r\n                                <Grid Width=\"18\" Height=\"18\" Background=\"{DynamicResource CheckBoxCheckMarkBkBrush}\">\r\n                                    <Viewbox x:Name=\"CheckIcon\" Visibility=\"Collapsed\">\r\n                                        <TextBlock Text=\"b\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                    <Viewbox x:Name=\"IndeterminateIcon\" Visibility=\"Collapsed\" Margin=\"2\">\r\n                                        <TextBlock Text=\"g\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                </Grid>\r\n                            </Border>\r\n                            <ContentPresenter DockPanel.Dock=\"Left\" RecognizesAccessKey=\"True\" Margin=\"5,0,0,0\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\" />\r\n                        </DockPanel>\r\n                    </Border>                    \r\n                    <ControlTemplate.Triggers>\r\n                        <MultiTrigger>\r\n                            <MultiTrigger.Conditions>\r\n                                <Condition Property=\"IsChecked\" Value=\"{x:Null}\" />\r\n                                <Condition Property=\"IsThreeState\" Value=\"True\" />\r\n                            </MultiTrigger.Conditions>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"IndeterminateIcon\"/>\r\n                        </MultiTrigger>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"CheckIcon\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>                  \r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ComboBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type ComboBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBrush}\"/>\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />        \r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ComboBox}\">\r\n                    <Border x:Name=\"Border\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                            Style=\"{DynamicResource HighlightBorder}\">\r\n                        <Grid>\r\n                            <ToggleButton x:Name=\"ToggleButton\" Focusable=\"False\" ClickMode=\"Press\" Margin=\"0,0,2,0\"\r\n                                          IsChecked=\"{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}\">\r\n                                <ToggleButton.Template>\r\n                                    <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\r\n                                        <DockPanel LastChildFill=\"False\" Background=\"Transparent\">\r\n                                            <Viewbox DockPanel.Dock=\"Right\" Width=\"20\" >\r\n                                                <TextBlock Text=\"6\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                           VerticalAlignment=\"Center\"/>\r\n                                            </Viewbox>\r\n                                        </DockPanel>\r\n                                    </ControlTemplate>\r\n                                </ToggleButton.Template>\r\n                            </ToggleButton>\r\n                            <ContentPresenter x:Name=\"ContentSite\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\"\r\n                                              Margin=\"5,0,25,0\" IsHitTestVisible=\"False\" Content=\"{TemplateBinding SelectionBoxItem}\"\r\n                                              ContentTemplate=\"{TemplateBinding SelectionBoxItemTemplate}\"\r\n                                              ContentTemplateSelector=\"{TemplateBinding ItemTemplateSelector}\" />\r\n                            <TextBox x:Name=\"PART_EditableTextBox\" Visibility=\"Hidden\" VerticalAlignment=\"Center\"\r\n                                     HorizontalAlignment=\"Stretch\" Margin=\"0,0,25,0\" Focusable=\"True\"\r\n                                     BorderThickness=\"0\" Background=\"{TemplateBinding Background}\"\r\n                                     IsReadOnly=\"{TemplateBinding IsReadOnly}\" Foreground=\"{DynamicResource TextBrush}\">\r\n                            </TextBox>\r\n                            <Popup x:Name=\"PART_Popup\" IsOpen=\"{TemplateBinding IsDropDownOpen}\"\r\n                                   Placement=\"Bottom\" Focusable=\"False\" AllowsTransparency=\"True\">\r\n                                <Grid MaxHeight=\"{TemplateBinding MaxDropDownHeight}\" MinWidth=\"{TemplateBinding ActualWidth}\"\r\n                                      SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\">\r\n                                    <Border BorderBrush=\"{DynamicResource PopupBorderBrush}\"\r\n                                            BorderThickness=\"{DynamicResource PopupBorderThickness}\"\r\n                                            Background=\"{DynamicResource PopupBackgroundBrush}\">\r\n                                        <ScrollViewer HorizontalScrollBarVisibility=\"Auto\" VerticalScrollBarVisibility=\"Auto\">\r\n                                            <ItemsPresenter Name=\"ItemsPresenter\" KeyboardNavigation.DirectionalNavigation=\"Contained\"\r\n                                                            SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"/>\r\n                                        </ScrollViewer>\r\n                                    </Border>\r\n                                </Grid>\r\n                            </Popup>\r\n                        </Grid>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsEditable\" Value=\"True\">\r\n                            <Setter Property=\"IsTabStop\" Value=\"False\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"PART_EditableTextBox\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"ContentSite\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type ComboBoxItem}\">\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"5\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ComboBoxItem}\">\r\n                    <Grid>\r\n                        <Rectangle x:Name=\"HoverRectangle\" IsHitTestVisible=\"False\" Visibility=\"Collapsed\" Fill=\"{DynamicResource HoverBrush}\" />\r\n                        <Rectangle x:Name=\"SelectedRectangle\" IsHitTestVisible=\"False\" Visibility=\"Collapsed\" Fill=\"{DynamicResource GlyphBrush}\" />\r\n                        <Border Background=\"Transparent\" Padding=\"{TemplateBinding Padding}\">\r\n                            <ContentPresenter VerticalAlignment=\"Center\" />\r\n                        </Border>\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsHighlighted\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"HoverRectangle\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"HoverRectangle\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsSelected\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectedRectangle\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"Selector.IsSelected\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDark}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ContextMenu.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type ContextMenu}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource PopupBackgroundBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource PopupBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource PopupBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ContextMenu}\">\r\n                    <Border BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\" Background=\"{TemplateBinding Background}\">\r\n                        <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\">\r\n                            <ItemsPresenter KeyboardNavigation.DirectionalNavigation=\"Cycle\"/>\r\n                        </ScrollViewer>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/DataGrid.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type Button}\" BasedOn=\"{StaticResource {x:Type Button}}\"\r\n           x:Key=\"{ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}\" />\r\n\r\n    <Style TargetType=\"{x:Type DataGrid}\">\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\r\n        <Setter Property=\"RowDetailsVisibilityMode\" Value=\"VisibleWhenSelected\" />\r\n        <Setter Property=\"ScrollViewer.CanContentScroll\" Value=\"true\" />\r\n        <Setter Property=\"ScrollViewer.PanningMode\" Value=\"Both\" />\r\n        <Setter Property=\"Stylus.IsFlicksEnabled\" Value=\"False\" />\r\n        <Setter Property=\"HorizontalGridLinesBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"VerticalGridLinesBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type DataGrid}\">\r\n                    <Border x:Name=\"border\" SnapsToDevicePixels=\"True\" BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\" Padding=\"{TemplateBinding Padding}\"\r\n                            Background=\"{TemplateBinding Background}\">\r\n                        <ScrollViewer x:Name=\"DG_ScrollViewer\" Focusable=\"false\" Background=\"Black\">\r\n                            <ScrollViewer.Template>\r\n                                <ControlTemplate TargetType=\"{x:Type ScrollViewer}\">\r\n                                    <Grid>\r\n                                        <Grid.ColumnDefinitions>\r\n                                            <ColumnDefinition Width=\"Auto\" />\r\n                                            <ColumnDefinition Width=\"*\" />\r\n                                            <ColumnDefinition Width=\"Auto\" />\r\n                                        </Grid.ColumnDefinitions>\r\n                                        <Grid.RowDefinitions>\r\n                                            <RowDefinition Height=\"Auto\" />\r\n                                            <RowDefinition Height=\"*\" />\r\n                                            <RowDefinition Height=\"Auto\" />\r\n                                        </Grid.RowDefinitions>\r\n\r\n                                        <Button Focusable=\"false\" Command=\"{x:Static DataGrid.SelectAllCommand}\"\r\n                                                Style=\"{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}\" \r\n                                                Visibility=\"{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}\"\r\n                                                Width=\"{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}\" />\r\n                                        <DataGridColumnHeadersPresenter x:Name=\"PART_ColumnHeadersPresenter\" Grid.Column=\"1\" \r\n                                                                        Visibility=\"{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}\" />\r\n                                        <ScrollContentPresenter x:Name=\"PART_ScrollContentPresenter\" Grid.ColumnSpan=\"2\" Grid.Row=\"1\" CanContentScroll=\"{TemplateBinding CanContentScroll}\" />\r\n\r\n                                        <ScrollBar x:Name=\"PART_VerticalScrollBar\" Grid.Column=\"2\" Grid.Row=\"1\" \r\n                                                   Orientation=\"Vertical\" ViewportSize=\"{TemplateBinding ViewportHeight}\"\r\n                                                   Maximum=\"{TemplateBinding ScrollableHeight}\" \r\n                                                   Visibility=\"{TemplateBinding ComputedVerticalScrollBarVisibility}\"\r\n                                                   Value=\"{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}\" />\r\n                                        <Grid Grid.Column=\"1\" Grid.Row=\"2\">\r\n                                            <Grid.ColumnDefinitions>\r\n                                                <ColumnDefinition Width=\"{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}\" />\r\n                                                <ColumnDefinition Width=\"*\" />\r\n                                            </Grid.ColumnDefinitions>\r\n                                            <ScrollBar x:Name=\"PART_HorizontalScrollBar\" Grid.Column=\"1\" Orientation=\"Horizontal\" \r\n                                                       ViewportSize=\"{TemplateBinding ViewportWidth}\" \r\n                                                       Maximum=\"{TemplateBinding ScrollableWidth}\" \r\n                                                       Visibility=\"{TemplateBinding ComputedHorizontalScrollBarVisibility}\" \r\n                                                       Value=\"{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}\" />\r\n                                        </Grid>\r\n                                    </Grid>\r\n                                </ControlTemplate>\r\n                            </ScrollViewer.Template>\r\n                            <ItemsPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" />\r\n                        </ScrollViewer>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsGrouping\" Value=\"true\">\r\n                <Setter Property=\"ScrollViewer.CanContentScroll\" Value=\"false\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n\r\n    <!--Style and template for the DataGridCell.-->\r\n    <Style TargetType=\"{x:Type DataGridCell}\">\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type DataGridCell}\">\r\n                    <Border x:Name=\"border\" Background=\"Transparent\" SnapsToDevicePixels=\"True\" BorderThickness=\"0\" BorderBrush=\"Transparent\" Padding=\"3\"\r\n                            VerticalAlignment=\"Center\">\r\n                        <ContentPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" />\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsSelected\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDark}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type DataGridRow}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\r\n        <Setter Property=\"Validation.ErrorTemplate\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"ValidationErrorTemplate\">\r\n            <Setter.Value>\r\n                <ControlTemplate>\r\n                    <TextBlock Foreground=\"Red\" Margin=\"2,0,0,0\" Text=\"!\" VerticalAlignment=\"Center\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type DataGridRow}\">\r\n                    <Border x:Name=\"DGR_Border\" BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\"                            \r\n                            SnapsToDevicePixels=\"True\">\r\n                        <VisualStateManager.VisualStateGroups>\r\n                            <VisualStateGroup x:Name=\"CommonStates\">\r\n                                <VisualState x:Name=\"Normal\" />\r\n                                <VisualState x:Name=\"Normal_Selected\">\r\n                                    <Storyboard>\r\n                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName=\"BorderCellPresenter\" Storyboard.TargetProperty=\"Background.Color\">\r\n                                            <EasingColorKeyFrame KeyTime=\"0\" Value=\"{DynamicResource GlyphColor}\" />\r\n                                        </ColorAnimationUsingKeyFrames>\r\n                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName=\"BorderRowHeader\" Storyboard.TargetProperty=\"Background.Color\">\r\n                                            <EasingColorKeyFrame KeyTime=\"0\" Value=\"{DynamicResource GlyphColor}\" />\r\n                                        </ColorAnimationUsingKeyFrames>\r\n                                    </Storyboard>\r\n                                </VisualState>\r\n                                <VisualState x:Name=\"Unfocused_Selected\">\r\n                                    <Storyboard>\r\n                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName=\"BorderCellPresenter\" Storyboard.TargetProperty=\"Background.Color\">\r\n                                            <EasingColorKeyFrame KeyTime=\"0\" Value=\"{DynamicResource GlyphColor}\" />\r\n                                        </ColorAnimationUsingKeyFrames>\r\n                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName=\"BorderRowHeader\" Storyboard.TargetProperty=\"Background.Color\">\r\n                                            <EasingColorKeyFrame KeyTime=\"0\" Value=\"{DynamicResource GlyphColor}\" />\r\n                                        </ColorAnimationUsingKeyFrames>\r\n                                    </Storyboard>\r\n                                </VisualState>\r\n                                <VisualState x:Name=\"MouseOver\">\r\n                                    <Storyboard>\r\n                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName=\"BorderCellPresenter\" Storyboard.TargetProperty=\"Background.Color\">\r\n                                            <EasingColorKeyFrame KeyTime=\"0\" Value=\"{DynamicResource HoverColor}\" />\r\n                                        </ColorAnimationUsingKeyFrames>\r\n                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName=\"BorderRowHeader\" Storyboard.TargetProperty=\"Background.Color\">\r\n                                            <EasingColorKeyFrame KeyTime=\"0\" Value=\"{DynamicResource HoverColor}\" />\r\n                                        </ColorAnimationUsingKeyFrames>\r\n                                    </Storyboard>\r\n                                </VisualState>\r\n                                <VisualState x:Name=\"MouseOver_Selected\">\r\n                                    <Storyboard>\r\n                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName=\"BorderCellPresenter\" Storyboard.TargetProperty=\"Background.Color\">\r\n                                            <EasingColorKeyFrame KeyTime=\"0\" Value=\"{DynamicResource GlyphColor}\" />\r\n                                        </ColorAnimationUsingKeyFrames>\r\n                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName=\"BorderRowHeader\" Storyboard.TargetProperty=\"Background.Color\">\r\n                                            <EasingColorKeyFrame KeyTime=\"0\" Value=\"{DynamicResource GlyphColor}\" />\r\n                                        </ColorAnimationUsingKeyFrames>\r\n                                    </Storyboard>\r\n                                </VisualState>\r\n                            </VisualStateGroup>\r\n                        </VisualStateManager.VisualStateGroups>\r\n\r\n                        <SelectiveScrollingGrid>\r\n                            <SelectiveScrollingGrid.ColumnDefinitions>\r\n                                <ColumnDefinition Width=\"Auto\" />\r\n                                <ColumnDefinition Width=\"*\" />\r\n                            </SelectiveScrollingGrid.ColumnDefinitions>\r\n                            <SelectiveScrollingGrid.RowDefinitions>\r\n                                <RowDefinition Height=\"*\" />\r\n                                <RowDefinition Height=\"Auto\" />\r\n                            </SelectiveScrollingGrid.RowDefinitions>\r\n\r\n                            <Border Grid.Column=\"1\" x:Name=\"BorderCellPresenter\">\r\n                                <Border.Background>\r\n                                    <SolidColorBrush Color=\"Transparent\" />\r\n                                </Border.Background>\r\n                                <DataGridCellsPresenter x:Name=\"CellPresenter\"\r\n                                                        ItemsPanel=\"{TemplateBinding ItemsPanel}\" \r\n                                                        SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\">\r\n                                    <DataGridCellsPresenter.Foreground>\r\n                                        <SolidColorBrush Color=\"{StaticResource TextColor}\" />\r\n                                    </DataGridCellsPresenter.Foreground>\r\n                                </DataGridCellsPresenter>\r\n                            </Border>\r\n                            <DataGridDetailsPresenter Grid.Column=\"1\" Grid.Row=\"1\"                                                      \r\n                                                      Visibility=\"{TemplateBinding DetailsVisibility}\"\r\n                                                      SelectiveScrollingGrid.SelectiveScrollingOrientation=\"{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}\" />\r\n                            <Border Grid.RowSpan=\"2\" x:Name=\"BorderRowHeader\">\r\n                                <Border.Background>\r\n                                    <SolidColorBrush Color=\"Transparent\" />\r\n                                </Border.Background>\r\n                                <DataGridRowHeader SelectiveScrollingGrid.SelectiveScrollingOrientation=\"Vertical\" \r\n                                               Visibility=\"{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}\" />\r\n                            </Border>\r\n                        </SelectiveScrollingGrid>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"RowHeaderGripperStyle\" TargetType=\"{x:Type Thumb}\">\r\n        <Setter Property=\"Height\" Value=\"8\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"Cursor\" Value=\"SizeNS\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Thumb}\">\r\n                    <Border Background=\"{TemplateBinding Background}\" Padding=\"{TemplateBinding Padding}\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type DataGridRowHeader}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type DataGridRowHeader}\">\r\n                    <Grid>\r\n                        <Border x:Name=\"rowHeaderBorder\" Width=\"10\" BorderThickness=\"1\"\r\n                                BorderBrush=\"{DynamicResource NormalBorderBrush}\"\r\n                                Background=\"{DynamicResource ControlBackgroundBrush}\">\r\n                            <StackPanel Orientation=\"Horizontal\">\r\n                                <ContentPresenter VerticalAlignment=\"Center\" SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" />\r\n                                <Control SnapsToDevicePixels=\"false\" Template=\"{Binding ValidationErrorTemplate, \r\n                                          RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}\"\r\n                                         Visibility=\"{Binding (Validation.HasError), \r\n                                          Converter={StaticResource BooleanToVisibilityConverter}, \r\n                                          RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}\" />\r\n                            </StackPanel>\r\n                        </Border>\r\n                        <Thumb x:Name=\"PART_TopHeaderGripper\" Style=\"{StaticResource RowHeaderGripperStyle}\" VerticalAlignment=\"Top\" />\r\n                        <Thumb x:Name=\"PART_BottomHeaderGripper\" Style=\"{StaticResource RowHeaderGripperStyle}\" VerticalAlignment=\"Bottom\" />\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"ColumnHeaderGripperStyle\" TargetType=\"{x:Type Thumb}\">\r\n        <Setter Property=\"Width\" Value=\"8\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"Cursor\" Value=\"SizeWE\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Thumb}\">\r\n                    <Border Background=\"{TemplateBinding Background}\" Padding=\"{TemplateBinding Padding}\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type DataGridColumnHeader}\">\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type DataGridColumnHeader}\">\r\n                    <Grid>\r\n                        <Border x:Name=\"columnHeaderBorder\" BorderThickness=\"1\"\r\n                                Padding=\"4\"\r\n                                BorderBrush=\"{DynamicResource NormalBorderBrush}\"\r\n                                Background=\"{DynamicResource ControlBackgroundBrush}\">\r\n                            <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                              SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" \r\n                                              VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" />\r\n                        </Border>\r\n                        <Thumb x:Name=\"PART_LeftHeaderGripper\" HorizontalAlignment=\"Left\" Style=\"{StaticResource ColumnHeaderGripperStyle}\" />\r\n                        <Thumb x:Name=\"PART_RightHeaderGripper\" HorizontalAlignment=\"Right\" Style=\"{StaticResource ColumnHeaderGripperStyle}\" />\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type DataGridColumnHeadersPresenter}\">\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type DataGridColumnHeadersPresenter}\">\r\n                    <Grid>\r\n                        <DataGridColumnHeader x:Name=\"PART_FillerColumnHeader\" IsHitTestVisible=\"False\" />\r\n                        <ItemsPresenter />\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/DatePicker.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"CalendarItemStyle\" TargetType=\"{x:Type CalendarItem}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource PopupBackgroundBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource PopupBorderThickness}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource PopupBorderBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"CalendarItem\">\r\n                    <Border Background=\"{TemplateBinding Background}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            BorderBrush=\"{TemplateBinding BorderBrush}\">\r\n                        <DockPanel Name=\"PART_Root\" LastChildFill=\"True\" >\r\n                            <Button x:Name=\"PART_PreviousButton\" DockPanel.Dock=\"Left\"\r\n                                    FontWeight=\"Bold\" FontFamily=\"Marlett\" Padding=\"4,2,4,2\"\r\n                                    Content=\"3\" Focusable=\"False\" BorderThickness=\"0\"\r\n                                    Background=\"Transparent\"/>\r\n                            <Button x:Name=\"PART_NextButton\" DockPanel.Dock=\"Right\"\r\n                                    FontWeight=\"Bold\" FontFamily=\"Marlett\" Padding=\"4,2,4,2\"\r\n                                    Content=\"4\" BorderThickness=\"0\"\r\n                                    Focusable=\"False\"\r\n                                    Background=\"Transparent\"/>\r\n                            <Button x:Name=\"PART_HeaderButton\" DockPanel.Dock=\"Top\"\r\n                                    Padding=\"2\" Height=\"30\" Focusable=\"False\"\r\n                                    BorderThickness=\"0\" Background=\"Transparent\"/>\r\n                            <Grid>\r\n                                <Grid x:Name=\"PART_MonthView\" Visibility=\"Visible\">\r\n                                    <Grid.RowDefinitions>\r\n                                        <RowDefinition Height=\"Auto\"/>\r\n                                        <RowDefinition Height=\"Auto\"/>\r\n                                        <RowDefinition Height=\"Auto\"/>\r\n                                        <RowDefinition Height=\"Auto\"/>\r\n                                        <RowDefinition Height=\"Auto\"/>\r\n                                        <RowDefinition Height=\"Auto\"/>\r\n                                        <RowDefinition Height=\"Auto\"/>\r\n                                    </Grid.RowDefinitions>\r\n\r\n                                    <Grid.ColumnDefinitions>\r\n                                        <ColumnDefinition Width=\"Auto\"/>\r\n                                        <ColumnDefinition Width=\"Auto\"/>\r\n                                        <ColumnDefinition Width=\"Auto\"/>\r\n                                        <ColumnDefinition Width=\"Auto\"/>\r\n                                        <ColumnDefinition Width=\"Auto\"/>\r\n                                        <ColumnDefinition Width=\"Auto\"/>\r\n                                        <ColumnDefinition Width=\"Auto\"/>\r\n                                    </Grid.ColumnDefinitions>\r\n                                </Grid>\r\n                                <Grid x:Name=\"PART_YearView\"  Visibility=\"Hidden\">\r\n                                    <Grid.RowDefinitions>\r\n                                        <RowDefinition Height=\"*\"/>\r\n                                        <RowDefinition Height=\"*\"/>\r\n                                        <RowDefinition Height=\"*\"/>\r\n                                    </Grid.RowDefinitions>\r\n\r\n                                    <Grid.ColumnDefinitions>\r\n                                        <ColumnDefinition Width=\"*\"/>\r\n                                        <ColumnDefinition Width=\"*\"/>\r\n                                        <ColumnDefinition Width=\"*\"/>\r\n                                        <ColumnDefinition Width=\"*\"/>\r\n                                    </Grid.ColumnDefinitions>\r\n                                </Grid>\r\n                            </Grid>\r\n                        </DockPanel>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <DataTrigger Binding=\"{Binding RelativeSource={RelativeSource AncestorType={x:Type Calendar}}, Path=DisplayMode}\" Value=\"Year\">\r\n                            <Setter TargetName=\"PART_MonthView\" Property=\"Visibility\" Value=\"Hidden\" />\r\n                            <Setter TargetName=\"PART_YearView\" Property=\"Visibility\" Value=\"Visible\" />\r\n                        </DataTrigger>\r\n                        <DataTrigger Binding=\"{Binding RelativeSource={RelativeSource AncestorType={x:Type Calendar}}, Path=DisplayMode}\" Value=\"Decade\">\r\n                            <Setter TargetName=\"PART_MonthView\" Property=\"Visibility\" Value=\"Hidden\" />\r\n                            <Setter TargetName=\"PART_YearView\" Property=\"Visibility\" Value=\"Visible\" />\r\n                        </DataTrigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"CalendarButtonStyle\" TargetType=\"{x:Type CalendarButton}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"Width\" Value=\"40\" />\r\n        <Setter Property=\"Height\" Value=\"40\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type CalendarButton}\">\r\n                    <Border Background=\"Transparent\">\r\n                        <ContentPresenter Content=\"{TemplateBinding ContentControl.Content}\"\r\n                                          ContentTemplate=\"{TemplateBinding ContentControl.ContentTemplate}\"\r\n                                          ContentStringFormat=\"{TemplateBinding ContentControl.ContentStringFormat}\"\r\n                        HorizontalAlignment=\"{TemplateBinding Control.HorizontalContentAlignment}\"\r\n                        VerticalAlignment=\"{TemplateBinding Control.VerticalContentAlignment}\"\r\n                        TextElement.Foreground=\"{TemplateBinding Foreground}\" />\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsInactive\" Value=\"True\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"CalendarDayButtonStyle\" TargetType=\"{x:Type CalendarDayButton}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\"/>\r\n        <Setter Property=\"Width\" Value=\"40\" />\r\n        <Setter Property=\"Height\" Value=\"40\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type CalendarDayButton}\">\r\n                    <Border Background=\"Transparent\">\r\n                        <ContentPresenter\r\n                        Content=\"{TemplateBinding ContentControl.Content}\"\r\n                        ContentTemplate=\"{TemplateBinding ContentControl.ContentTemplate}\"\r\n                        ContentStringFormat=\"{TemplateBinding ContentControl.ContentStringFormat}\"\r\n                        HorizontalAlignment=\"{TemplateBinding Control.HorizontalContentAlignment}\"\r\n                        VerticalAlignment=\"{TemplateBinding Control.VerticalContentAlignment}\"\r\n                        TextElement.Foreground=\"{TemplateBinding Foreground}\">\r\n                        </ContentPresenter>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsToday\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsInactive\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsSelected\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"CalendarStyle\" TargetType=\"{x:Type Calendar}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"CalendarDayButtonStyle\" Value=\"{DynamicResource CalendarDayButtonStyle}\"/>\r\n        <Setter Property=\"CalendarButtonStyle\" Value=\"{DynamicResource CalendarButtonStyle}\"/>\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource PopupBackgroundBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"Calendar\">\r\n                    <Grid Name=\"PART_Root\">\r\n                        <CalendarItem Name=\"PART_CalendarItem\"\r\n                                      Style=\"{DynamicResource CalendarItemStyle}\"\r\n                                      VerticalAlignment=\"Center\" />\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type DatePicker}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"TextBlock.FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Setter Property=\"TextBlock.FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"TextBlock.Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"TextBlock.Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"CalendarStyle\" Value=\"{StaticResource CalendarStyle}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Padding\" Value=\"3\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"DatePicker\">\r\n                    <Border x:Name=\"Border\" BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                            Padding=\"{TemplateBinding Padding}\">\r\n                        <DockPanel>\r\n                            <Popup x:Name=\"PART_Popup\" StaysOpen=\"False\"\r\n                                   AllowsTransparency=\"True\" Placement=\"Bottom\"\r\n                                   PlacementTarget=\"{Binding ElementName=PART_TextBox}\" />\r\n                            <ToggleButton x:Name=\"PART_Button\" DockPanel.Dock=\"Right\" Content=\"🗓\"\r\n                                          BorderThickness=\"0\" Padding=\"5,0,5,0\"\r\n                                          IsChecked=\"{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}\"/>\r\n                            <DatePickerTextBox x:Name=\"PART_TextBox\" DockPanel.Dock=\"Left\"\r\n                                               Background=\"Transparent\" BorderThickness=\"0\"/>\r\n                        </DockPanel>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger SourceName=\"PART_TextBox\"  Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                        <Trigger SourceName=\"PART_Button\"  Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type DatePickerTextBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"KeyboardNavigation.TabNavigation\" Value=\"None\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"AllowDrop\" Value=\"True\" />\r\n        <Setter Property=\"CaretBrush\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\"/>\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type DatePickerTextBox}\">\r\n                    <Border x:Name=\"Border\" BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            Background=\"{TemplateBinding Background}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                            Style=\"{DynamicResource HighlightBorder}\">\r\n                        <Grid>\r\n                            <ScrollViewer x:Name=\"PART_ContentHost\"\r\n                                          VerticalScrollBarVisibility=\"{TemplateBinding VerticalScrollBarVisibility}\"\r\n                                          HorizontalScrollBarVisibility=\"{TemplateBinding HorizontalScrollBarVisibility}\"/>\r\n                        </Grid>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Expander.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"ExpanderDownHeaderStyle\" TargetType=\"{x:Type ToggleButton}\">\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\r\n                    <Border Padding=\"{TemplateBinding Padding}\" Background=\"{TemplateBinding Background}\"\r\n                            BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\">\r\n                        <Grid>\r\n                            <Grid.ColumnDefinitions>\r\n                                <ColumnDefinition Width=\"Auto\" />\r\n                                <ColumnDefinition Width=\"*\" />\r\n                            </Grid.ColumnDefinitions>\r\n                            <TextBlock Text=\"&#xeaa0;\" x:Name=\"CollapsedIcon\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"\r\n                                       Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                       Foreground=\"{DynamicResource GlyphBrush}\" FontSize=\"18\" MinWidth=\"20\" Margin=\"5,0,5,0\"\r\n                                       Grid.Column=\"0\" TextAlignment=\"Center\" />\r\n                            <TextBlock Text=\"&#xea99;\" x:Name=\"ExpandedIcon\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"\r\n                                       Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                       Foreground=\"{DynamicResource GlyphBrush}\" FontSize=\"18\" MinWidth=\"20\" Margin=\"5,0,5,0\"\r\n                                       Visibility=\"Collapsed\"\r\n                                       Grid.Column=\"0\" TextAlignment=\"Center\"/>\r\n                            <ContentPresenter Grid.Column=\"1\" VerticalAlignment=\"Center\"\r\n                                              SnapsToDevicePixels=\"True\" HorizontalAlignment=\"Stretch\" RecognizesAccessKey=\"True\"  />\r\n                        </Grid>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" TargetName=\"ExpandedIcon\" Value=\"Visible\" />\r\n                            <Setter Property=\"Visibility\" TargetName=\"CollapsedIcon\" Value=\"Collapsed\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.75\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type Expander}\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ExpanderBackgroundBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"Transparent\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Expander}\">\r\n                    <DockPanel>\r\n                        <ToggleButton BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                                      Style=\"{DynamicResource ExpanderDownHeaderStyle}\"\r\n                                      Padding=\"{TemplateBinding Padding}\"\r\n                                      MinHeight=\"25\" DockPanel.Dock=\"Top\"\r\n                                      Background=\"{TemplateBinding Background}\"\r\n                                      Content=\"{TemplateBinding Header}\"\r\n                                      IsChecked=\"{Binding Path=IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}\" />\r\n                        <Border x:Name=\"Border\" DockPanel.Dock=\"Top\" Visibility=\"Collapsed\"\r\n                                BorderThickness=\"{TemplateBinding BorderThickness}\" BorderBrush=\"{TemplateBinding BorderBrush}\">\r\n                            <ContentPresenter Focusable=\"False\"\r\n                                              HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                              VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"  />\r\n                        </Border>\r\n                    </DockPanel>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsExpanded\" Value=\"true\">\r\n                            <Setter Property=\"Visibility\" TargetName=\"Border\" Value=\"Visible\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/GridSplitter.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type GridSplitter}\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource NormalBrushDark}\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/GroupBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type GroupBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Padding\" Value=\"5\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GroupBox}\">\r\n                    <Border DockPanel.Dock=\"Top\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\" BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            CornerRadius=\"{DynamicResource ControlCornerRadius}\">\r\n                        <DockPanel>\r\n                            <Border DockPanel.Dock=\"Top\" BorderThickness=\"0,0,0,1\" BorderBrush=\"{DynamicResource NormalBrush}\" >\r\n                                <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\" Margin=\"{TemplateBinding Padding}\">\r\n                                    <ContentPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" ContentSource=\"Header\"\r\n                                                      RecognizesAccessKey=\"True\" />\r\n                                </TextBlock>\r\n                            </Border>\r\n                            <ContentPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" DockPanel.Dock=\"Top\"\r\n                                              Margin=\"{TemplateBinding Padding}\"/>\r\n                        </DockPanel>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Hyperlink.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type Hyperlink}\">\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n        <Setter Property=\"TextDecorations\" Value=\"{x:Null}\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Label.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type Label}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Label}\">\r\n                    <ContentPresenter RecognizesAccessKey=\"True\"\r\n                                      HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                      VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ListBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type ListBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"ScrollViewer.HorizontalScrollBarVisibility\" Value=\"Auto\" />\r\n        <Setter Property=\"ScrollViewer.VerticalScrollBarVisibility\" Value=\"Auto\" />\r\n        <Setter Property=\"ScrollViewer.CanContentScroll\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"2,1,2,1\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ListBox}\">\r\n                    <Border BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            Background=\"{TemplateBinding Background}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\">\r\n                        <ScrollViewer Focusable=\"False\"\r\n                                      HorizontalScrollBarVisibility=\"{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}\"\r\n                                      VerticalScrollBarVisibility=\"{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}\"\r\n                                      CanContentScroll=\"{TemplateBinding ScrollViewer.CanContentScroll}\">\r\n                            <ItemsPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"\r\n                                            Margin=\"{TemplateBinding Padding}\"/>\r\n                        </ScrollViewer>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type ListBoxItem}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"3\" />\r\n        <Setter Property=\"Margin\" Value=\"0\" />\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ListBoxItem}\">\r\n                    <Grid>\r\n                        <Border x:Name=\"HoverRectangle\" IsHitTestVisible=\"False\" Visibility=\"Collapsed\"\r\n                                Background=\"{DynamicResource HoverBrush}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\" />\r\n                        <Border x:Name=\"SelectedRectangle\" IsHitTestVisible=\"False\" Visibility=\"Collapsed\"\r\n                                Background=\"{DynamicResource GlyphBrush}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"/>\r\n                        <Border Padding=\"{TemplateBinding Padding}\" Background=\"Transparent\">\r\n                            <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                              VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                              Margin=\"3,0,0,0\" />\r\n                        </Border>\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectedRectangle\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsSelected\" Value=\"true\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectedRectangle\" />\r\n                        </Trigger>\r\n                        <MultiTrigger>\r\n                            <MultiTrigger.Conditions>\r\n                                <Condition Property=\"IsMouseOver\" Value=\"True\" />\r\n                                <Condition Property=\"Selector.IsSelected\" Value=\"False\" />\r\n                            </MultiTrigger.Conditions>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"HoverRectangle\" />\r\n                        </MultiTrigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"Selector.IsSelected\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDark}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ListView.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type GridViewColumnHeader}\">\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GridViewColumnHeader}\">\r\n                    <Grid Margin=\"1\">\r\n                        <Border Padding=\"5,3,5,3\" Style=\"{DynamicResource HighlightBorder}\" BorderThickness=\"1\" Background=\"Transparent\">\r\n                            <TextBlock Style=\"{DynamicResource BaseTextBlockStyle}\">\r\n                                <ContentPresenter VerticalAlignment=\"Center\" />\r\n                            </TextBlock>\r\n                        </Border>\r\n                        <Thumb x:Name=\"PART_HeaderGripper\" HorizontalAlignment=\"Right\" Margin=\"0,0,-10,0\">\r\n                            <Thumb.Style>\r\n                                <Style TargetType=\"Thumb\">\r\n                                    <Setter Property=\"Width\" Value=\"20\" />\r\n                                    <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n                                    <Setter Property=\"Template\">\r\n                                        <Setter.Value>\r\n                                            <ControlTemplate TargetType=\"{x:Type Thumb}\">\r\n                                                <Border Padding=\"{TemplateBinding Padding}\" Background=\"Transparent\">\r\n                                                    <Rectangle HorizontalAlignment=\"Center\" Width=\"1\"/>\r\n                                                </Border>\r\n                                            </ControlTemplate>\r\n                                        </Setter.Value>\r\n                                    </Setter>\r\n                                </Style>\r\n                            </Thumb.Style>\r\n                        </Thumb>\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"{x:Static GridView.GridViewScrollViewerStyleKey}\" TargetType=\"ScrollViewer\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"ScrollViewer\">\r\n                    <Grid Background=\"{TemplateBinding Background}\">\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"*\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"*\" />\r\n                            <RowDefinition Height=\"Auto\" />\r\n                        </Grid.RowDefinitions>\r\n                        <DockPanel Margin=\"{TemplateBinding Padding}\">\r\n                            <ScrollViewer DockPanel.Dock=\"Top\" HorizontalScrollBarVisibility=\"Hidden\"\r\n                                          VerticalScrollBarVisibility=\"Hidden\" Focusable=\"false\">\r\n                                <GridViewHeaderRowPresenter Columns=\"{Binding Path=TemplatedParent.View.Columns, RelativeSource={RelativeSource TemplatedParent}}\"\r\n                                                            ColumnHeaderContainerStyle=\"{Binding Path=TemplatedParent.View.ColumnHeaderContainerStyle, RelativeSource={RelativeSource TemplatedParent}}\"\r\n                                                            ColumnHeaderTemplate=\"{Binding Path=TemplatedParent.View.ColumnHeaderTemplate, RelativeSource={RelativeSource TemplatedParent}}\"\r\n                                                            ColumnHeaderTemplateSelector=\"{Binding Path=TemplatedParent.View.ColumnHeaderTemplateSelector, RelativeSource={RelativeSource TemplatedParent}}\"\r\n                                                            AllowsColumnReorder=\"{Binding Path=TemplatedParent.View.AllowsColumnReorder, RelativeSource={RelativeSource TemplatedParent}}\"\r\n                                                            ColumnHeaderContextMenu=\"{Binding Path=TemplatedParent.View.ColumnHeaderContextMenu, RelativeSource={RelativeSource TemplatedParent}}\"\r\n                                                            ColumnHeaderToolTip=\"{Binding Path=TemplatedParent.View.ColumnHeaderToolTip, RelativeSource={RelativeSource TemplatedParent}}\" SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" />\r\n                            </ScrollViewer>\r\n                            <ScrollContentPresenter Name=\"PART_ScrollContentPresenter\"\r\n                                                    KeyboardNavigation.DirectionalNavigation=\"Local\"\r\n                                                    CanContentScroll=\"True\"\r\n                                                    CanHorizontallyScroll=\"False\"\r\n                                                    CanVerticallyScroll=\"False\" />\r\n                        </DockPanel>\r\n                        <ScrollBar Name=\"PART_HorizontalScrollBar\" Orientation=\"Horizontal\"\r\n                                   Grid.Row=\"1\" Maximum=\"{TemplateBinding ScrollableWidth}\"\r\n                                   ViewportSize=\"{TemplateBinding ViewportWidth}\"\r\n                                   Value=\"{TemplateBinding HorizontalOffset}\"\r\n                                   Visibility=\"{TemplateBinding ComputedHorizontalScrollBarVisibility}\" />\r\n\r\n                        <ScrollBar Name=\"PART_VerticalScrollBar\" Grid.Column=\"1\"\r\n                                   Maximum=\"{TemplateBinding ScrollableHeight}\"\r\n                                   ViewportSize=\"{TemplateBinding ViewportHeight}\"\r\n                                   Value=\"{TemplateBinding VerticalOffset}\"\r\n                                   Visibility=\"{TemplateBinding ComputedVerticalScrollBarVisibility}\" />\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type ListView}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"ScrollViewer.HorizontalScrollBarVisibility\" Value=\"Auto\" />\r\n        <Setter Property=\"ScrollViewer.VerticalScrollBarVisibility\" Value=\"Auto\" />\r\n        <Setter Property=\"ScrollViewer.CanContentScroll\" Value=\"True\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ListView}\">\r\n                    <Border BorderThickness=\"{TemplateBinding BorderThickness}\" BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            Background=\"{DynamicResource ControlBackgroundBrush}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\">\r\n                        <ScrollViewer Style=\"{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}\">\r\n                            <ItemsPresenter />\r\n                        </ScrollViewer>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type ListViewItem}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\"/>\r\n        <Setter Property=\"Padding\" Value=\"0,1,0,1\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ListViewItem}\">\r\n                    <Grid>\r\n                        <Rectangle x:Name=\"HoverRectangle\" Visibility=\"Collapsed\" Fill=\"{DynamicResource HoverBrush}\" />\r\n                        <Rectangle x:Name=\"SelectedRectangle\" Visibility=\"Collapsed\" Fill=\"{DynamicResource GlyphBrush}\" />\r\n                        <Border Padding=\"{TemplateBinding Padding}\" Background=\"Transparent\">\r\n                            <GridViewRowPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" VerticalAlignment=\"Stretch\" />\r\n                        </Border>\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"Selector.IsSelected\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectedRectangle\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"HoverRectangle\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"Selector.IsSelected\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDark}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Menu.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type Separator}\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"Margin\" Value=\"0,2,0,2\" />\r\n        <Setter Property=\"Focusable\" Value=\"False\"/>\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Separator}\">\r\n                    <Border BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            Background=\"{TemplateBinding Background}\" \r\n                            Height=\"1\"\r\n                            SnapsToDevicePixels=\"true\"/>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type Menu}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"Menu\">\r\n                    <StackPanel Orientation=\"Horizontal\" IsItemsHost=\"True\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"{x:Static MenuItem.SeparatorStyleKey}\" TargetType=\"{x:Type Separator}\" BasedOn=\"{StaticResource {x:Type Separator}}\" />\r\n\r\n    <!-- TopLevelHeader -->\r\n    <ControlTemplate x:Key=\"{x:Static MenuItem.TopLevelHeaderTemplateKey}\" TargetType=\"{x:Type MenuItem}\">\r\n        <Border x:Name=\"Border\">\r\n            <Grid>\r\n                <Border x:Name=\"HoverBorder\" Background=\"{DynamicResource HoverBrush}\" Visibility=\"Collapsed\"  />\r\n                <TextBlock VerticalAlignment=\"Center\" Padding=\"5\" Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                           Foreground=\"{TemplateBinding Foreground}\">\r\n                    <ContentPresenter ContentSource=\"Header\" RecognizesAccessKey=\"True\" />\r\n                </TextBlock>\r\n                <Popup Placement=\"Bottom\" IsOpen=\"{TemplateBinding IsSubmenuOpen}\" AllowsTransparency=\"True\" Focusable=\"False\">\r\n                    <Border SnapsToDevicePixels=\"True\" BorderBrush=\"{DynamicResource PopupBorderBrush}\"\r\n                            Background=\"{DynamicResource PopupBackgroundBrush}\" BorderThickness=\"{DynamicResource PopupBorderThickness}\">\r\n                        <StackPanel Grid.IsSharedSizeScope=\"True\" IsItemsHost=\"True\" KeyboardNavigation.DirectionalNavigation=\"Cycle\" />\r\n                    </Border>\r\n                </Popup>\r\n            </Grid>\r\n        </Border>\r\n        <ControlTemplate.Triggers>\r\n            <Trigger Property=\"IsHighlighted\" Value=\"True\">\r\n                <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"HoverBorder\" />\r\n            </Trigger>\r\n        </ControlTemplate.Triggers>\r\n    </ControlTemplate>\r\n\r\n    <!-- TopLevelItem -->\r\n    <ControlTemplate x:Key=\"{x:Static MenuItem.TopLevelItemTemplateKey}\" TargetType=\"{x:Type MenuItem}\">\r\n        <Border x:Name=\"Border\" BorderBrush=\"{DynamicResource PopupBorderBrush}\"\r\n                Background=\"{DynamicResource PopupBackgroundBrush}\" BorderThickness=\"{DynamicResource PopupBorderThickness}\">\r\n            <ContentPresenter ContentSource=\"Header\" RecognizesAccessKey=\"True\" />\r\n        </Border>\r\n    </ControlTemplate>\r\n\r\n    <!-- SubmenuHeader -->\r\n    <ControlTemplate x:Key=\"{x:Static MenuItem.SubmenuHeaderTemplateKey}\" TargetType=\"{x:Type MenuItem}\">\r\n        <Grid Background=\"Transparent\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"Auto\" SharedSizeGroup=\"MenuItemIconColumnGroup\" />\r\n                <ColumnDefinition Width=\"*\" SharedSizeGroup=\"MenuItemIGTColumnGroup\" />\r\n                <ColumnDefinition Width=\"Auto\" SharedSizeGroup=\"MenuItemShortcutColumnGroup\" />\r\n                <ColumnDefinition Width=\"Auto\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Border x:Name=\"HoverBorder\" Grid.Column=\"0\" Grid.ColumnSpan=\"4\"\r\n                    Background=\"{DynamicResource HoverBrush}\" Visibility=\"Collapsed\"  />\r\n            <ContentPresenter x:Name=\"Icon\" Grid.Column=\"0\" Margin=\"4,0,-5,0\"\r\n                              MaxHeight=\"16\" MaxWidth=\"16\"\r\n                              VerticalAlignment=\"Center\" ContentSource=\"Icon\" />\r\n            <Grid x:Name=\"GlyphPanel\" Grid.Column=\"0\" Visibility=\"Collapsed\"\r\n                  Margin=\"5,0,-5,0\" VerticalAlignment=\"Center\">\r\n                <TextBlock FontFamily=\"Marlett\" Text=\"a\" VerticalAlignment=\"Center\" Style=\"{DynamicResource BaseTextBlockStyle}\" />\r\n            </Grid>\r\n            <TextBlock Grid.Column=\"1\" Padding=\"5\" VerticalAlignment=\"Center\" Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                       Foreground=\"{TemplateBinding Foreground}\">\r\n                <ContentPresenter RecognizesAccessKey=\"True\" Margin=\"5,0,5,0\" ContentSource=\"Header\"/>\r\n            </TextBlock>\r\n            <TextBlock x:Name=\"GestureText\" Grid.Column=\"2\" Text=\"{TemplateBinding InputGestureText}\"\r\n                       TextAlignment=\"Left\" HorizontalAlignment=\"Stretch\" Margin=\"20,5,10,5\"\r\n                       VerticalAlignment=\"Center\" Background=\"Transparent\" Opacity=\"0.6\"/>\r\n            <Grid Grid.Column=\"3\" Margin=\"0,0,5,0\">\r\n                <TextBlock FontFamily=\"Marlett\" Text=\"4\" VerticalAlignment=\"Center\" Style=\"{DynamicResource BaseTextBlockStyle}\" />\r\n            </Grid>\r\n            <Popup IsOpen=\"{Binding Path=IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}\" Placement=\"Right\"\r\n                   Focusable=\"False\" AllowsTransparency=\"True\">\r\n                <Border BorderBrush=\"{DynamicResource PopupBorderBrush}\" Background=\"{DynamicResource PopupBackgroundBrush}\"\r\n                        BorderThickness=\"{DynamicResource PopupBorderThickness}\">\r\n                    <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\">\r\n                        <StackPanel Grid.IsSharedSizeScope=\"True\" IsItemsHost=\"True\" KeyboardNavigation.DirectionalNavigation=\"Cycle\" />\r\n                    </ScrollViewer>\r\n                </Border>\r\n            </Popup>\r\n        </Grid>\r\n        <ControlTemplate.Triggers>\r\n            <Trigger Property=\"Icon\" Value=\"{x:Null}\">\r\n                <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"Icon\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"GlyphPanel\" />\r\n                <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"Icon\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsHighlighted\" Value=\"True\">\r\n                <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"HoverBorder\" />\r\n            </Trigger>\r\n            <Trigger Property=\"InputGestureText\" Value=\"\">\r\n                <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"GestureText\" />\r\n            </Trigger>\r\n        </ControlTemplate.Triggers>\r\n    </ControlTemplate>\r\n\r\n    <!-- SubmenuItem -->\r\n    <ControlTemplate x:Key=\"{x:Static MenuItem.SubmenuItemTemplateKey}\" TargetType=\"{x:Type MenuItem}\">\r\n        <Border x:Name=\"HoverBorder\" Background=\"{DynamicResource HoverBrush}\">\r\n            <Grid>\r\n                <Grid.ColumnDefinitions>\r\n                    <ColumnDefinition Width=\"Auto\" SharedSizeGroup=\"MenuItemIconColumnGroup\" />\r\n                    <ColumnDefinition Width=\"*\" SharedSizeGroup=\"MenuItemIGTColumnGroup\" />\r\n                    <ColumnDefinition Width=\"Auto\" SharedSizeGroup=\"MenuItemShortcutColumnGroup\" />\r\n                </Grid.ColumnDefinitions>\r\n                <ContentPresenter x:Name=\"Icon\" Grid.Column=\"0\" Margin=\"4,0,-5,0\"\r\n                                  MaxHeight=\"16\" MaxWidth=\"16\"\r\n                                  VerticalAlignment=\"Center\" ContentSource=\"Icon\" />\r\n                <Grid x:Name=\"GlyphPanel\" Grid.Column=\"0\" Visibility=\"Collapsed\" Margin=\"5,0,-5,0\" VerticalAlignment=\"Center\">\r\n                    <TextBlock FontFamily=\"Marlett\" Text=\"a\" VerticalAlignment=\"Center\" Style=\"{DynamicResource BaseTextBlockStyle}\" />\r\n                </Grid>\r\n                <TextBlock VerticalAlignment=\"Center\" Grid.Column=\"1\" Margin=\"5,0,5,0\" Padding=\"5\" Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                           Foreground=\"{TemplateBinding Foreground}\">\r\n                    <ContentPresenter RecognizesAccessKey=\"True\" ContentSource=\"Header\"/>\r\n                </TextBlock>\r\n                <TextBlock x:Name=\"GestureText\" Grid.Column=\"2\" Text=\"{TemplateBinding InputGestureText}\"\r\n                           TextAlignment=\"Left\" HorizontalAlignment=\"Stretch\"\r\n                           VerticalAlignment=\"Center\" Margin=\"20,5,10,5\" Opacity=\"0.6\" />\r\n            </Grid>\r\n        </Border>\r\n        <ControlTemplate.Triggers>\r\n            <Trigger Property=\"Icon\" Value=\"{x:Null}\">\r\n                <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"Icon\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"GlyphPanel\" />\r\n                <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"Icon\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsHighlighted\" Value=\"False\">\r\n                <Setter Property=\"Background\" Value=\"Transparent\" TargetName=\"HoverBorder\" />\r\n            </Trigger>\r\n            <Trigger Property=\"InputGestureText\" Value=\"\">\r\n                <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"GestureText\" />\r\n            </Trigger>\r\n        </ControlTemplate.Triggers>\r\n    </ControlTemplate>\r\n\r\n    <Style TargetType=\"{x:Type MenuItem}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\"/>\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\"/>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"Role\" Value=\"TopLevelHeader\">\r\n                <Setter Property=\"Template\" Value=\"{DynamicResource {x:Static MenuItem.TopLevelHeaderTemplateKey}}\" />\r\n                <Setter Property=\"Grid.IsSharedSizeScope\" Value=\"true\" />\r\n            </Trigger>\r\n            <Trigger Property=\"Role\" Value=\"TopLevelItem\">\r\n                <Setter Property=\"Template\" Value=\"{DynamicResource {x:Static MenuItem.TopLevelItemTemplateKey}}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"Role\" Value=\"SubmenuHeader\">\r\n                <Setter Property=\"Template\" Value=\"{DynamicResource {x:Static MenuItem.SubmenuHeaderTemplateKey}}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"Role\" Value=\"SubmenuItem\">\r\n                <Setter Property=\"Template\" Value=\"{DynamicResource {x:Static MenuItem.SubmenuItemTemplateKey}}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/PasswordBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type PasswordBox}\">\r\n        <Setter Property=\"KeyboardNavigation.TabNavigation\" Value=\"None\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"CaretBrush\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\"/>\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Padding\" Value=\"3\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type PasswordBox}\">\r\n                    <Border x:Name=\"Border\" BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            Background=\"{TemplateBinding Background}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                            BorderBrush=\"{TemplateBinding BorderBrush}\">\r\n                        <ScrollViewer x:Name=\"PART_ContentHost\" />\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Popup.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type Popup}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"AllowsTransparency\" Value=\"True\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ProgressBar.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type ProgressBar}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource HoverBrush}\"/>\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource NormalBrushDark}\"/>\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\"/>\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ProgressBar}\">\r\n                    <Border BorderThickness=\"{TemplateBinding BorderThickness}\" BorderBrush=\"{DynamicResource NormalBorderBrush}\"\r\n                            CornerRadius=\"{DynamicResource ControlCornerRadius}\">\r\n                        <Grid SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\">\r\n                            <Rectangle Fill=\"{TemplateBinding Background}\" />\r\n                            <Rectangle Name=\"PART_Track\" Margin=\"0\" />\r\n                            <Decorator x:Name=\"PART_Indicator\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Stretch\">\r\n                                <Grid>\r\n                                    <Rectangle Fill=\"{TemplateBinding Foreground}\" />\r\n                                    <Grid x:Name=\"Animation\" Visibility=\"Hidden\">\r\n                                        <Rectangle Fill=\"{TemplateBinding Background}\" Margin=\"0,0,50,0\">\r\n                                            <Rectangle.RenderTransform>\r\n                                                <ScaleTransform x:Name=\"HiderPreTransform\" ScaleX=\"0\"/>\r\n                                            </Rectangle.RenderTransform>\r\n                                        </Rectangle>\r\n                                        <Rectangle Fill=\"{TemplateBinding Background}\" RenderTransformOrigin=\"1, 0\" Margin=\"50,0,0,0\">\r\n                                            <Rectangle.RenderTransform>\r\n                                                <ScaleTransform x:Name=\"HiderPostTransform\" ScaleX=\"1\" />\r\n                                            </Rectangle.RenderTransform>\r\n                                        </Rectangle>\r\n                                    </Grid>\r\n                                </Grid>\r\n                            </Decorator>\r\n                        </Grid>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsIndeterminate\" Value=\"True\">\r\n                            <Setter TargetName=\"Animation\" Property=\"Visibility\" Value=\"Visible\" />\r\n                            <Trigger.EnterActions>\r\n                                <BeginStoryboard>\r\n                                    <Storyboard RepeatBehavior=\"Forever\">\r\n                                        <DoubleAnimation Storyboard.TargetName=\"HiderPreTransform\" Storyboard.TargetProperty=\"(ScaleTransform.ScaleX)\"\r\n                                                         To=\"1\" Duration=\"0:00:2\" AutoReverse=\"True\"/>\r\n                                        <DoubleAnimation Storyboard.TargetName=\"HiderPostTransform\" Storyboard.TargetProperty=\"(ScaleTransform.ScaleX)\"\r\n                                                         To=\"0\" Duration=\"0:00:2\" AutoReverse=\"True\"/>\r\n                                    </Storyboard>\r\n                                </BeginStoryboard>\r\n                            </Trigger.EnterActions>\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/RadioButton.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type RadioButton}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type RadioButton}\">\r\n                    <BulletDecorator>\r\n                        <BulletDecorator.Bullet>\r\n                            <Border Background=\"Transparent\">\r\n                                <Grid Width=\"18\" Height=\"18\">\r\n                                    <Ellipse x:Name=\"BulletBorder\" Width=\"18\" Height=\"18\"\r\n                                            Stroke=\"{DynamicResource NormalBorderBrush}\"\r\n                                            StrokeThickness=\"{DynamicResource EllipseBorderThickness}\" />\r\n                                    <Viewbox x:Name=\"CheckIcon\" Visibility=\"Collapsed\" >\r\n                                        <TextBlock Text=\"h\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                </Grid>\r\n                            </Border>\r\n                        </BulletDecorator.Bullet>\r\n                        <Border Padding=\"{TemplateBinding Padding}\" Background=\"{TemplateBinding Background}\">\r\n                            <ContentPresenter RecognizesAccessKey=\"True\" Margin=\"5,0,0,0\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"/>\r\n                        </Border>\r\n                    </BulletDecorator>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"CheckIcon\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Stroke\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Stroke\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/RepeatButton.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type RepeatButton}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource NormalBrushDark}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Padding\" Value=\"10,5,10,5\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type RepeatButton}\">\r\n                    <Border BorderThickness=\"{TemplateBinding BorderThickness}\" Background=\"{TemplateBinding Background}\"\r\n                            CornerRadius=\"{DynamicResource ControlCornerRadius}\" Style=\"{DynamicResource HighlightBorder}\">\r\n                        <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                          VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                          Margin=\"{TemplateBinding Padding}\" RecognizesAccessKey=\"True\" />\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/RichTextBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type RichTextBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"KeyboardNavigation.TabNavigation\" Value=\"None\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"AllowDrop\" Value=\"True\" />\r\n        <Setter Property=\"CaretBrush\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\"/>\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Padding\" Value=\"3\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type RichTextBox}\">\r\n                    <Border x:Name=\"Border\" BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            Background=\"{TemplateBinding Background}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                            Style=\"{DynamicResource HighlightBorder}\">\r\n                        <ScrollViewer x:Name=\"PART_ContentHost\"\r\n                                      VerticalScrollBarVisibility=\"{TemplateBinding VerticalScrollBarVisibility}\"\r\n                                      HorizontalScrollBarVisibility=\"{TemplateBinding HorizontalScrollBarVisibility}\"/>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ScrollViewer.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"ScrollBarTrackButton\" TargetType=\"{x:Type RepeatButton}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"true\" />\r\n        <Setter Property=\"IsTabStop\" Value=\"False\" />\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type RepeatButton}\">\r\n                    <Border Background=\"Transparent\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type ScrollBar}\">\r\n        <Setter Property=\"Stylus.IsFlicksEnabled\" Value=\"False\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ScrollBar}\">\r\n                    <Track x:Name=\"PART_Track\" Orientation=\"Vertical\" IsDirectionReversed=\"True\"\r\n                           Width=\"17\">\r\n                        <Track.Resources>\r\n                            <sys:Double x:Key=\"{x:Static SystemParameters.VerticalScrollBarButtonHeightKey}\">42</sys:Double>\r\n                        </Track.Resources>\r\n                        <Track.Thumb>\r\n                            <Thumb Width=\"8\" />\r\n                        </Track.Thumb>\r\n                        <Track.DecreaseRepeatButton>\r\n                            <RepeatButton x:Name=\"UpButton\" Style=\"{DynamicResource ScrollBarTrackButton}\"\r\n                                          Command=\"ScrollBar.PageUpCommand\" />\r\n                        </Track.DecreaseRepeatButton>\r\n                        <Track.IncreaseRepeatButton>\r\n                            <RepeatButton x:Name=\"DownButton\" Style=\"{DynamicResource ScrollBarTrackButton}\"\r\n                                          Command=\"ScrollBar.PageDownCommand\" />\r\n                        </Track.IncreaseRepeatButton>\r\n                    </Track>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"Orientation\" Value=\"Horizontal\">\r\n                            <Setter Property=\"LayoutTransform\" TargetName=\"PART_Track\">\r\n                                <Setter.Value>\r\n                                    <RotateTransform Angle=\"-90\" />\r\n                                </Setter.Value>\r\n                            </Setter>\r\n                            <Setter TargetName=\"PART_Track\" Property=\"Orientation\" Value=\"Vertical\" />\r\n                            <Setter TargetName=\"UpButton\" Property=\"Command\" Value=\"ScrollBar.PageLeftCommand\" />\r\n                            <Setter TargetName=\"DownButton\" Property=\"Command\" Value=\"ScrollBar.PageRightCommand\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type ScrollViewer}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ScrollViewer}\">\r\n                    <Border BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\">\r\n                        <Grid Background=\"{TemplateBinding Background}\">\r\n                            <Grid.ColumnDefinitions>\r\n                                <ColumnDefinition Width=\"*\" />\r\n                                <ColumnDefinition Width=\"Auto\" />\r\n                            </Grid.ColumnDefinitions>\r\n                            <Grid.RowDefinitions>\r\n                                <RowDefinition Height=\"*\" />\r\n                                <RowDefinition Height=\"Auto\" />\r\n                            </Grid.RowDefinitions>\r\n                            <ScrollContentPresenter x:Name=\"PART_ScrollContentPresenter\" Grid.Column=\"0\" Grid.Row=\"0\"\r\n                                                Margin=\"{TemplateBinding Padding}\" Content=\"{TemplateBinding Content}\"\r\n                                                ContentTemplate=\"{TemplateBinding ContentTemplate}\"\r\n                                                CanContentScroll=\"{TemplateBinding CanContentScroll}\" />\r\n                            <Rectangle Grid.Column=\"1\" Grid.Row=\"1\" Fill=\"{DynamicResource ControlBackgroundBrush}\" />\r\n                            <ScrollBar x:Name=\"PART_HorizontalScrollBar\" Grid.Column=\"0\" Grid.Row=\"1\"\r\n                                   Visibility=\"{TemplateBinding ComputedHorizontalScrollBarVisibility}\"\r\n                                   Value=\"{Binding Path=HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}\"\r\n                                   ViewportSize=\"{TemplateBinding ViewportWidth}\"\r\n                                   Minimum=\"0\" Maximum=\"{TemplateBinding ScrollableWidth}\" Orientation=\"Horizontal\"\r\n                                   AutomationProperties.AutomationId=\"HorizontalScrollBar\" />\r\n                            <ScrollBar x:Name=\"PART_VerticalScrollBar\" Grid.Column=\"1\" Grid.Row=\"0\"\r\n                                   Visibility=\"{TemplateBinding ComputedVerticalScrollBarVisibility}\"\r\n                                   Value=\"{Binding Path=VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}\"\r\n                                   ViewportSize=\"{TemplateBinding ViewportHeight}\"\r\n                                   Minimum=\"0\" Maximum=\"{TemplateBinding ScrollableHeight}\" Orientation=\"Vertical\"\r\n                                   AutomationProperties.AutomationId=\"VerticalScrollBar\" />\r\n                        </Grid>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger SourceName=\"PART_VerticalScrollBar\" Property=\"Visibility\" Value=\"Visible\">\r\n                            <Setter Property=\"IsTabStop\" Value=\"True\"/>\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Slider.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n    \r\n    <Style x:Key=\"SliderTrackButton\" TargetType=\"{x:Type RepeatButton}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"true\" />\r\n        <Setter Property=\"IsTabStop\" Value=\"False\" />\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type RepeatButton}\">\r\n                    <Border Background=\"Transparent\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n    \r\n    <Style TargetType=\"{x:Type Slider}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Slider}\">\r\n                    <Grid x:Name=\"GridRoot\">\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"Auto\" />\r\n                            <RowDefinition Height=\"Auto\" MinHeight=\"{TemplateBinding MinHeight}\" />\r\n                            <RowDefinition Height=\"Auto\" />\r\n                        </Grid.RowDefinitions>\r\n                        <TickBar x:Name=\"TopTick\" Visibility=\"Collapsed\" Height=\"4\" Placement=\"Top\"\r\n                                 SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"  Fill=\"{DynamicResource GlyphBrush}\" />\r\n                        <Border Grid.Row=\"1\" Margin=\"1\" Height=\"4\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\r\n                                Background=\"{DynamicResource HighlightGlyphBrush}\" \r\n                                Width=\"{Binding ActualWidth, ElementName=ButtonDecrease}\" />\r\n                        <Border x:Name=\"Border\" Grid.Row=\"1\" Margin=\"0\" Height=\"6\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                                Background=\"{TemplateBinding Background}\" BorderBrush=\"{DynamicResource NormalBorderBrush}\"\r\n                                BorderThickness=\"{DynamicResource ControlBorderThickness}\" />\r\n                        <Track Grid.Row=\"1\" x:Name=\"PART_Track\" Height=\"{TemplateBinding Height}\">\r\n                            <Track.Thumb>\r\n                                <Thumb Width=\"10\" />\r\n                            </Track.Thumb>\r\n                            <Track.DecreaseRepeatButton>\r\n                                <RepeatButton x:Name=\"ButtonDecrease\"\r\n                                              Style=\"{StaticResource SliderTrackButton}\"\r\n                                              Command=\"Slider.DecreaseLarge\" />\r\n                            </Track.DecreaseRepeatButton>\r\n                            <Track.IncreaseRepeatButton>\r\n                                <RepeatButton x:Name=\"ButtonIncrease\"\r\n                                              Style=\"{StaticResource SliderTrackButton}\"\r\n                                              Command=\"Slider.IncreaseLarge\" />\r\n                            </Track.IncreaseRepeatButton>\r\n                        </Track>\r\n                        <TickBar x:Name=\"BottomTick\" Visibility=\"Collapsed\" Grid.Row=\"2\" Height=\"4\" Placement=\"Bottom\"\r\n                                 SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" Fill=\"{TemplateBinding Foreground}\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter TargetName=\"PART_Track\" Property=\"FocusManager.FocusedElement\" Value=\"{Binding ElementName=PART_Track}\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"TickPlacement\" Value=\"TopLeft\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"TopTick\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"TickPlacement\" Value=\"BottomRight\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BottomTick\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"TickPlacement\" Value=\"Both\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"TopTick\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BottomTick\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"Orientation\" Value=\"Vertical\">\r\n                            <Setter Property=\"LayoutTransform\" TargetName=\"GridRoot\">\r\n                                <Setter.Value>\r\n                                    <RotateTransform Angle=\"-90\" />\r\n                                </Setter.Value>\r\n                            </Setter>\r\n                            <Setter TargetName=\"PART_Track\" Property=\"Orientation\" Value=\"Horizontal\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/TabControl.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type TabControl}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type TabControl}\">\r\n                    <Grid KeyboardNavigation.TabNavigation=\"Local\">\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition x:Name=\"ColumnDefinition0\" />\r\n                            <ColumnDefinition x:Name=\"ColumnDefinition1\" Width=\"0\" />\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"Auto\" x:Name=\"RowDefinition0\" />\r\n                            <RowDefinition Height=\"*\" x:Name=\"RowDefinition1\" />\r\n                        </Grid.RowDefinitions>\r\n                        <Border x:Name=\"HeaderBorder\" Background=\"{DynamicResource ControlBackgroundBrush}\"\r\n                                BorderThickness=\"0,0,0,1\" BorderBrush=\"{DynamicResource NormalBorderBrush}\">\r\n                            <TabPanel x:Name=\"HeaderPanel\" IsItemsHost=\"True\" Panel.ZIndex=\"1\" Width=\"Auto\" Height=\"Auto\"\r\n                                      KeyboardNavigation.TabIndex=\"1\" RenderTransformOrigin=\"0.5,0.5\">\r\n                                <TabPanel.LayoutTransform>\r\n                                    <TransformGroup>\r\n                                        <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\r\n                                        <SkewTransform AngleX=\"0\" AngleY=\"0\" />\r\n                                        <RotateTransform Angle=\"0\" />\r\n                                        <TranslateTransform X=\"0\" Y=\"0\" />\r\n                                    </TransformGroup>\r\n                                </TabPanel.LayoutTransform>\r\n                                <TabPanel.RenderTransform>\r\n                                    <TransformGroup>\r\n                                        <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\r\n                                        <SkewTransform AngleX=\"0\" AngleY=\"0\" />\r\n                                        <RotateTransform />\r\n                                        <TranslateTransform X=\"0\" Y=\"0\" />\r\n                                    </TransformGroup>\r\n                                </TabPanel.RenderTransform>\r\n                            </TabPanel>\r\n                        </Border>\r\n                        <Border x:Name=\"ContentPanel\" Grid.Column=\"0\" Grid.Row=\"1\"\r\n                                KeyboardNavigation.DirectionalNavigation=\"Contained\" KeyboardNavigation.TabIndex=\"2\"\r\n                                KeyboardNavigation.TabNavigation=\"Local\" Background=\"{DynamicResource ControlBackgroundBrush}\">\r\n                            <ContentPresenter x:Name=\"PART_SelectedContentHost\" SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"\r\n                                              ContentSource=\"SelectedContent\" />\r\n                        </Border>\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Bottom\">\r\n                            <Setter Property=\"Grid.Row\" TargetName=\"ContentPanel\" Value=\"0\" />\r\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition0\" Value=\"*\" />\r\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition1\" Value=\"Auto\" />\r\n                            <Setter Property=\"Grid.Row\" TargetName=\"HeaderBorder\" Value=\"1\"/>\r\n                            <Setter Property=\"BorderThickness\" TargetName=\"HeaderBorder\" Value=\"0,1,0,0\"/>\r\n                            <Setter Property=\"CornerRadius\" TargetName=\"ContentPanel\" Value=\"2,2,0,0\"/>\r\n                            <Setter Property=\"CornerRadius\" TargetName=\"HeaderBorder\" Value=\"0,0,2,2\"/>\r\n                        </Trigger>\r\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Left\">\r\n                            <Setter Property=\"Grid.Row\" TargetName=\"HeaderPanel\" Value=\"0\" />\r\n                            <Setter Property=\"Grid.Row\" TargetName=\"ContentPanel\" Value=\"0\" />\r\n                            <Setter Property=\"Grid.Column\" TargetName=\"ContentPanel\" Value=\"1\" />\r\n                            <Setter Property=\"Width\" TargetName=\"ColumnDefinition0\" Value=\"Auto\" />\r\n                            <Setter Property=\"Width\" TargetName=\"ColumnDefinition1\" Value=\"*\" />\r\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition0\" Value=\"*\" />\r\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition1\" Value=\"0\" />\r\n                            <Setter Property=\"Grid.Column\" TargetName=\"HeaderBorder\" Value=\"0\"/>\r\n                            <Setter Property=\"BorderThickness\" TargetName=\"HeaderBorder\" Value=\"0,0,1,0\"/>\r\n                            <Setter Property=\"Margin\" TargetName=\"HeaderBorder\" Value=\"0,0,0,0\"/>\r\n                            <Setter Property=\"Margin\" TargetName=\"ContentPanel\" Value=\"0,0,0,0\"/>\r\n                            <Setter Property=\"CornerRadius\" TargetName=\"HeaderBorder\" Value=\"0,2,2,0\"/>\r\n                            <Setter Property=\"CornerRadius\" TargetName=\"ContentPanel\" Value=\"0,2,2,0\"/>\r\n                        </Trigger>\r\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Right\">\r\n                            <Setter Property=\"Grid.Row\" TargetName=\"HeaderPanel\" Value=\"0\" />\r\n                            <Setter Property=\"Grid.Row\" TargetName=\"ContentPanel\" Value=\"0\" />\r\n                            <Setter Property=\"Grid.Column\" TargetName=\"ContentPanel\" Value=\"0\" />\r\n                            <Setter Property=\"Width\" TargetName=\"ColumnDefinition0\" Value=\"*\" />\r\n                            <Setter Property=\"Width\" TargetName=\"ColumnDefinition1\" Value=\"Auto\" />\r\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition0\" Value=\"*\" />\r\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition1\" Value=\"0\" />\r\n                            <Setter Property=\"Grid.Column\" TargetName=\"HeaderBorder\" Value=\"1\"/>\r\n                            <Setter Property=\"BorderThickness\" TargetName=\"HeaderBorder\" Value=\"1,0,0,0\"/>\r\n                            <Setter Property=\"CornerRadius\" TargetName=\"ContentPanel\" Value=\"2,0,0,2\"/>\r\n                            <Setter Property=\"CornerRadius\" TargetName=\"HeaderBorder\" Value=\"0,2,2,0\"/>\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type TabItem}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type TabItem}\">\r\n                    <Grid x:Name=\"TabGrid\">\r\n                        <Border x:Name=\"SelectedBorder\" Visibility=\"Collapsed\" Margin=\"1,0,1,0\"\r\n                                SnapsToDevicePixels=\"True\"\r\n                                BorderThickness=\"0,0,0,2\" BorderBrush=\"{DynamicResource GlyphBrush}\"/>\r\n                        <TextBlock x:Name=\"TextContent\" Padding=\"5\" Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                   Foreground=\"{TemplateBinding Foreground}\">\r\n                            <ContentPresenter x:Name=\"ContentSite\" RecognizesAccessKey=\"True\" ContentSource=\"Header\"\r\n                                              HorizontalAlignment=\"Center\" Margin=\"5\" VerticalAlignment=\"Center\" />\r\n                        </TextBlock>\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Left\">\r\n                            <Setter Property=\"BorderThickness\" Value=\"0,0,2,0\" TargetName=\"SelectedBorder\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Right\">\r\n                            <Setter Property=\"BorderThickness\" Value=\"2,0,0,0\" TargetName=\"SelectedBorder\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Bottom\">\r\n                            <Setter Property=\"BorderThickness\" Value=\"0,2,0,0\" TargetName=\"SelectedBorder\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsSelected\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"TextContent\"/>\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectedBorder\" />\r\n                            <Setter Property=\"Opacity\" Value=\"1\" TargetName=\"TextContent\"/>\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectedBorder\" />\r\n                            <Setter Property=\"BorderThickness\" Value=\"1,1,1,1\" TargetName=\"SelectedBorder\" />\r\n                            <Setter Property=\"Opacity\" Value=\"1\" TargetName=\"TextContent\"/>\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsSelected\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectedBorder\" />\r\n                            <Setter Property=\"Opacity\" Value=\"1\" TargetName=\"TextContent\"/>\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/TextBlock.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <!--<Style TargetType=\"TextBlock\">\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>-->\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/TextBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type TextBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"KeyboardNavigation.TabNavigation\" Value=\"None\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"AllowDrop\" Value=\"True\" />\r\n        <Setter Property=\"CaretBrush\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\"/>\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Padding\" Value=\"3\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type TextBox}\">\r\n                    <Border x:Name=\"Border\" BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            Background=\"{TemplateBinding Background}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                            Style=\"{DynamicResource HighlightBorder}\" BorderBrush=\"{TemplateBinding BorderBrush}\">\r\n                        <ScrollViewer x:Name=\"PART_ContentHost\"\r\n                                      VerticalScrollBarVisibility=\"{TemplateBinding VerticalScrollBarVisibility}\"\r\n                                      HorizontalScrollBarVisibility=\"{TemplateBinding HorizontalScrollBarVisibility}\"/>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Thumb.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type Thumb}\">\r\n        <Setter Property=\"Width\" Value=\"Auto\" />\r\n        <Setter Property=\"Height\" Value=\"Auto\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource NormalBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Thumb}\">\r\n                    <Grid>\r\n                        <Rectangle x:Name=\"HoverRectangle\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\"\r\n                                   Width=\"{TemplateBinding Width}\" Height=\"{TemplateBinding Height}\" RadiusX=\"3\" RadiusY=\"4\"\r\n                                   Stroke=\"{x:Null}\" Margin=\"0\" MinHeight=\"10\"\r\n                                   Fill=\"{TemplateBinding Background}\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\" />\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Fill\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"HoverRectangle\" />\r\n                        </Trigger>\r\n                        <DataTrigger Binding=\"{Binding IsFocused, RelativeSource={RelativeSource AncestorType=Track}}\" Value=\"True\">\r\n                            <Setter Property=\"Fill\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"HoverRectangle\" />\r\n                        </DataTrigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ToggleButton.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type ToggleButton}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource NormalBrushDark}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"10,5,10,5\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\r\n                    <Border x:Name=\"Border\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\" Background=\"{TemplateBinding Background}\"\r\n                            CornerRadius=\"{DynamicResource ControlCornerRadius}\" Style=\"{DynamicResource HighlightBorder}\"\r\n                            BorderBrush=\"{TemplateBinding BorderBrush}\">\r\n                        <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                          VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                          Margin=\"{TemplateBinding Padding}\" RecognizesAccessKey=\"True\" />\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ToolTip.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type ToolTip}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource TooltipBackgroundBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource PopupBorderBrush}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource PopupBorderThickness}\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/TreeView.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type TreeView}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"ScrollViewer.HorizontalScrollBarVisibility\" Value=\"Auto\" />\r\n        <Setter Property=\"ScrollViewer.VerticalScrollBarVisibility\" Value=\"Auto\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type TreeView}\">\r\n                    <Border BorderThickness=\"{TemplateBinding BorderThickness}\" BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            CornerRadius=\"{DynamicResource ControlCornerRadius}\">\r\n                        <ScrollViewer Focusable=\"False\" Padding=\"4\"\r\n                                      HorizontalScrollBarVisibility=\"{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}\"\r\n                                      VerticalScrollBarVisibility=\"{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}\">\r\n                            <ItemsPresenter />\r\n                        </ScrollViewer>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type TreeViewItem}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"Padding\" Value=\"0,2,4,2\" />\r\n        <Setter Property=\"Margin\" Value=\"0,1,0,0\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type TreeViewItem}\">\r\n                    <StackPanel>\r\n                        <Border x:Name=\"SelectionBorder\" Background=\"Transparent\"\r\n                                Padding=\"{TemplateBinding Padding}\" Margin=\"{TemplateBinding Margin}\">\r\n                            <DockPanel>\r\n                                <ToggleButton x:Name=\"Expander\" ClickMode=\"Press\" DockPanel.Dock=\"Left\"\r\n                                              IsChecked=\"{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}\">\r\n                                    <ToggleButton.Style>\r\n                                        <Style TargetType=\"{x:Type ToggleButton}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n                                            <Setter Property=\"Focusable\" Value=\"False\" />\r\n                                            <Setter Property=\"Template\">\r\n                                                <Setter.Value>\r\n                                                    <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\r\n                                                        <Grid>\r\n                                                            <Viewbox x:Name=\"IsExpandedPath\" Visibility=\"Visible\" >\r\n                                                                <TextBlock Text=\"4\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource TextBrush}\"\r\n                                                                           HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                                            </Viewbox>\r\n                                                            <Viewbox x:Name=\"ExpandPath\" Visibility=\"Collapsed\" >\r\n                                                                <TextBlock Text=\"6\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource TextBrush}\"\r\n                                                                           HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                                            </Viewbox>\r\n                                                        </Grid>\r\n                                                        <ControlTemplate.Triggers>\r\n                                                            <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                                                                <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"ExpandPath\" />\r\n                                                                <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"IsExpandedPath\" />\r\n                                                            </Trigger>\r\n                                                        </ControlTemplate.Triggers>\r\n                                                    </ControlTemplate>\r\n                                                </Setter.Value>\r\n                                            </Setter>\r\n                                        </Style>\r\n                                    </ToggleButton.Style>\r\n                                </ToggleButton>\r\n                                <ContentPresenter x:Name=\"PART_Header\" ContentSource=\"Header\" Height=\"Auto\"\r\n                                                  DockPanel.Dock=\"Left\"/>\r\n                            </DockPanel>\r\n                        </Border>\r\n                        <ItemsPresenter x:Name=\"ItemsHost\" Margin=\"20,0,0,0\" />\r\n                    </StackPanel>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsExpanded\" Value=\"False\">\r\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"ItemsHost\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"HasItems\" Value=\"False\">\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"Expander\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsSelected\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\" SourceName=\"SelectionBorder\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/BottomButton.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"BottomButton\" TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n        <Setter Property=\"Margin\" Value=\"5\" />\r\n        <Setter Property=\"Padding\" Value=\"15,8,15,8\" />\r\n        <Setter Property=\"MinWidth\" Value=\"70\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/DetailsHyperlink.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"DetailsHyperlink\" TargetType=\"Hyperlink\" BasedOn=\"{StaticResource {x:Type Hyperlink}}\">\r\n        <Setter Property=\"FontSize\" Value=\"16\" />\r\n        <Setter Property=\"Foreground\" Value=\"LightGray\" />\r\n        <Setter Property=\"TextDecorations\" Value=\"{x:Null}\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"White\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/DetailsScrollViewer.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"DetailsScrollViewer\" TargetType=\"{x:Type ScrollViewer}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ScrollViewer}\">\r\n                    <Grid>\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"*\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                        </Grid.ColumnDefinitions>\r\n                        <ScrollContentPresenter Grid.Column=\"0\" Grid.Row=\"0\"\r\n                                                Margin=\"{TemplateBinding Padding}\" Content=\"{TemplateBinding Content}\"\r\n                                                ContentTemplate=\"{TemplateBinding ContentTemplate}\"\r\n                                                CanContentScroll=\"{TemplateBinding CanContentScroll}\" />\r\n\r\n                        <Rectangle Grid.Column=\"1\" Grid.Row=\"0\" Fill=\"{TemplateBinding Background}\"\r\n                                   Width=\"17\"\r\n                                   Margin=\"-17,0,0,0\"/>\r\n            \r\n                        <ScrollBar x:Name=\"PART_VerticalScrollBar\" Grid.Column=\"1\" Grid.Row=\"0\"\r\n                                   Margin=\"-17,0,0,0\"\r\n                                   Visibility=\"{TemplateBinding ComputedVerticalScrollBarVisibility}\"\r\n                                   Value=\"{Binding Path=VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}\"\r\n                                   ViewportSize=\"{TemplateBinding ViewportHeight}\"\r\n                                   Minimum=\"0\" Maximum=\"{TemplateBinding ScrollableHeight}\" Orientation=\"Vertical\"\r\n                                   AutomationProperties.AutomationId=\"VerticalScrollBar\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger SourceName=\"PART_VerticalScrollBar\" Property=\"Visibility\" Value=\"Visible\">\r\n                            <Setter Property=\"IsTabStop\" Value=\"True\"/>\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"DataContext\" Value=\"{x:Null}\">\r\n                <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/DetailsViewGroupStyle.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"DetailsViewGroupStyle\" TargetType=\"{x:Type GroupItem}\">\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"True\" />\r\n        <Setter Property=\"FontSize\" Value=\"15\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GroupItem}\">\r\n                    <ExpanderEx BorderThickness=\"0\" SaveGameGroupId=\"{Binding Name, Mode=OneWay}\"\r\n                                IsExpanded=\"True\">\r\n                        <ExpanderEx.Header>                            \r\n                            <DockPanel Background=\"Transparent\">\r\n                                <DockPanel.ContextMenu>\r\n                                    <GameGroupMenu />\r\n                                </DockPanel.ContextMenu>\r\n                                <TextBlock DockPanel.Dock=\"Left\"\r\n                                           VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\r\n                                           TextAlignment=\"Center\" Margin=\"0,0,5,0\">\r\n                                    <TextBlock.Style>\r\n                                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                            <Setter Property=\"Text\" Value=\"{Binding Name, Converter={StaticResource ObjectToStringConverter}}\" />\r\n                                            <Style.Triggers>\r\n                                                <DataTrigger Binding=\"{Binding Name, Converter={StaticResource ObjectToStringConverter}}\" Value=\"{x:Null}\">\r\n                                                    <Setter Property=\"Text\" Value=\"{DynamicResource LOCNone}\" />\r\n                                                </DataTrigger>\r\n                                                <DataTrigger Binding=\"{Binding Name, Converter={StaticResource ObjectToStringConverter}}\" Value=\"\">\r\n                                                    <Setter Property=\"Text\" Value=\"{DynamicResource LOCNone}\" />\r\n                                                </DataTrigger>\r\n                                            </Style.Triggers>\r\n                                        </Style>\r\n                                    </TextBlock.Style>\r\n                                </TextBlock>\r\n                                <TextBlock Text=\"{Binding Items.Count, Mode=OneWay, StringFormat=({0})}\"\r\n                                           VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\r\n                                           Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                           DockPanel.Dock=\"Left\" TextAlignment=\"Center\"\r\n                                           Visibility=\"{Settings ShowGroupCount}\"/>\r\n                            </DockPanel>\r\n                        </ExpanderEx.Header>\r\n                        <ItemsPresenter />\r\n                    </ExpanderEx>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/DetailsViewItemStyle.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"DetailsViewItemStyle\" TargetType=\"{x:Type ListBoxItem}\">\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"True\" />\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSizeLarge}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ListBoxItem}\">\r\n                    <Grid>\r\n                        <Border x:Name=\"SelectedRectangle\" IsHitTestVisible=\"False\" Visibility=\"Collapsed\"\r\n                                                        BorderThickness=\"5,0,0,0\" BorderBrush=\"{DynamicResource GlyphBrush}\"/>\r\n                        <Border x:Name=\"HoverRectangle\" IsHitTestVisible=\"False\" Visibility=\"Collapsed\"\r\n                                                        BorderThickness=\"5,0,0,0\" BorderBrush=\"{DynamicResource GlyphBrush}\"/>\r\n                        <Border Padding=\"{TemplateBinding Padding}\" Background=\"Transparent\">\r\n                            <ContentPresenter />\r\n                        </Border>\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <DataTrigger Binding=\"{Binding IsInstalled}\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n                        </DataTrigger>\r\n                        <DataTrigger Binding=\"{Binding IsInstalled}\" Value=\"False\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n                        </DataTrigger>                        \r\n                        <Trigger Property=\"IsSelected\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectedRectangle\" />\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectedRectangle\" />\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/DetailsViewItemTemplate.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"DetailsViewItemTemplate\" TargetType=\"{x:Type GameListItem}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GameListItem}\">\r\n                    <Border Name=\"PART_PanelHost\" Padding=\"10,3,0,3\" Background=\"Transparent\"\r\n                            d:DataContext=\"{x:Static DesignMainViewModel.DesignSelectedGameIntance}\">\r\n                        <DockPanel>\r\n                            <Image Name=\"PART_ImageIcon\"\r\n                                   Height=\"{Settings DetailsViewListIconSize}\"\r\n                                   RenderOptions.BitmapScalingMode=\"Fant\"\r\n                                   DockPanel.Dock=\"Left\" Margin=\"0,0,8,0\" />\r\n                            <TextBlock Text=\"{Binding DisplayName}\" TextTrimming=\"CharacterEllipsis\"\r\n                                       VerticalAlignment=\"Center\" DockPanel.Dock=\"Left\">\r\n                            </TextBlock>\r\n                        </DockPanel>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/GridViewGroupStyle.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"GridViewGroupStyle\" TargetType=\"{x:Type GroupItem}\">\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"True\" />\r\n        <Setter Property=\"FontSize\" Value=\"15\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GroupItem}\">\r\n                    <ExpanderEx BorderThickness=\"0\" SaveGameGroupId=\"{Binding Name, Mode=OneWay}\"\r\n                                IsExpanded=\"True\" Background=\"Transparent\" Padding=\"10\">\r\n                        <ExpanderEx.Header>                            \r\n                            <DockPanel Background=\"Transparent\">\r\n                                <DockPanel.ContextMenu>\r\n                                    <GameGroupMenu />\r\n                                </DockPanel.ContextMenu>\r\n                                <TextBlock DockPanel.Dock=\"Left\"\r\n                                           VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\r\n                                           TextAlignment=\"Center\" Margin=\"0,0,5,0\">\r\n                                    <TextBlock.Style>\r\n                                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                            <Setter Property=\"Text\" Value=\"{Binding Name, Converter={StaticResource ObjectToStringConverter}}\" />\r\n                                            <Style.Triggers>\r\n                                                <DataTrigger Binding=\"{Binding Name, Converter={StaticResource ObjectToStringConverter}}\" Value=\"{x:Null}\">\r\n                                                    <Setter Property=\"Text\" Value=\"{DynamicResource LOCNone}\" />\r\n                                                </DataTrigger>\r\n                                                <DataTrigger Binding=\"{Binding Name, Converter={StaticResource ObjectToStringConverter}}\" Value=\"\">\r\n                                                    <Setter Property=\"Text\" Value=\"{DynamicResource LOCNone}\" />\r\n                                                </DataTrigger>\r\n                                            </Style.Triggers>\r\n                                        </Style>\r\n                                    </TextBlock.Style>\r\n                                </TextBlock>\r\n                                <TextBlock Text=\"{Binding Items.Count, Mode=OneWay, StringFormat=({0})}\"\r\n                                           VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\r\n                                           Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                           DockPanel.Dock=\"Left\" TextAlignment=\"Center\"\r\n                                           Visibility=\"{Settings ShowGroupCount}\"/>\r\n                            </DockPanel>\r\n                        </ExpanderEx.Header>\r\n                        <ItemsPresenter />\r\n                    </ExpanderEx>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/GridViewItemStyle.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"GridViewItemStyle\" TargetType=\"{x:Type ListBoxItem}\">\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"True\" />\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"UseLayoutRounding\" Value=\"True\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ListBoxItem}\">\r\n                    <Grid Background=\"{DynamicResource GridItemBackgroundBrush}\"\r\n                          Margin=\"{Settings ItemSpacingMargin}\"\r\n                          x:Name=\"ItemGrid\">\r\n                        <Border x:Name=\"SelectionBorder\" BorderThickness=\"3\" Margin=\"-3\" />\r\n                        <ContentPresenter />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsSelected\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"SelectionBorder\"/>\r\n                            <Setter Property=\"Canvas.ZIndex\" Value=\"90\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"SelectionBorder\"/>\r\n                            <Setter Property=\"Canvas.ZIndex\" Value=\"90\" />\r\n                        </Trigger>\r\n                        <DataTrigger Binding=\"{Settings ShowGridItemBackground}\" Value=\"False\">\r\n                            <Setter Property=\"Background\" Value=\"Transparent\" TargetName=\"ItemGrid\" />\r\n                        </DataTrigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/GridViewItemTemplate.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"GridViewItemTemplate\" TargetType=\"{x:Type GameListItem}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GameListItem}\">\r\n                    <Border BorderThickness=\"{Settings GridItemMargin}\" BorderBrush=\"{DynamicResource GridItemBackgroundBrush}\">\r\n                        <StackPanel Name=\"PART_PanelHost\"\r\n                                    d:DataContext=\"{x:Static DesignMainViewModel.DesignSelectedGameIntance}\">\r\n\r\n                            <Grid Width=\"{Settings GridItemWidth}\"\r\n                              Height=\"{Settings GridItemHeight}\">\r\n                                <Image Name=\"PART_ImageCover\"\r\n                                   RenderOptions.BitmapScalingMode=\"Fant\" StretchDirection=\"Both\"\r\n                                   HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"\r\n                                   Stretch=\"{Settings CoverArtStretch}\" />\r\n                                <Border Background=\"#99000000\" x:Name=\"TextGameName\" Visibility=\"Collapsed\">\r\n                                    <TextBlock Text=\"{Binding DisplayName}\"\r\n                                           TextWrapping=\"Wrap\" Margin=\"5\"\r\n                                           Style=\"{StaticResource BaseTextBlockStyle}\"\r\n                                           TextTrimming=\"CharacterEllipsis\" TextAlignment=\"Center\"\r\n                                           HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                </Border>\r\n                                <Border Background=\"#AA000000\" x:Name=\"BorderMouseOver\" Visibility=\"Collapsed\" />\r\n                                <Viewbox VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"\r\n                                         Name=\"GameControls\"  Visibility=\"Collapsed\">\r\n                                    <StackPanel Orientation=\"Horizontal\">\r\n                                        <Button Name=\"PART_ButtonPlay\" Style=\"{StaticResource SimpleButton}\"\r\n                                                Margin=\"20,0,2,0\" VerticalAlignment=\"Center\"\r\n                                                Content=\"&#xec74;\" FontFamily=\"{StaticResource FontIcoFont}\" />\r\n                                        <Button Name=\"PART_ButtonInfo\" Style=\"{StaticResource SimpleButton}\"\r\n                                                Margin=\"2,0,20,0\" VerticalAlignment=\"Center\"\r\n                                                Content=\"&#xef4f;\" FontFamily=\"{StaticResource FontIcoFont}\" />\r\n                                    </StackPanel>\r\n                                </Viewbox>\r\n                            </Grid>\r\n                            <TextBlock Text=\"{Binding DisplayName}\"\r\n                                   Style=\"{DynamicResource BaseTextBlockStyle}\"                                                                   \r\n                                   TextAlignment=\"Center\" TextTrimming=\"CharacterEllipsis\"\r\n                                   VerticalAlignment=\"Center\"\r\n                                   Padding=\"2,5,2,5\" Grid.Row=\"1\" Grid.Column=\"0\"\r\n                                   Width=\"{Settings GridItemWidth}\" \r\n                                   Visibility=\"{Settings ShowNamesUnderCovers}\" />\r\n                        </StackPanel>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <DataTrigger Binding=\"{Binding IsInstalled}\" Value=\"False\">\r\n                            <Setter Property=\"Content\" Value=\"&#xef08;\" TargetName=\"PART_ButtonPlay\" />\r\n                        </DataTrigger>\r\n                        <MultiDataTrigger>\r\n                            <MultiDataTrigger.Conditions>\r\n                                <Condition Binding=\"{Binding IsInstalled}\" Value=\"False\" />\r\n                                <Condition Binding=\"{Settings DarkenUninstalledGamesGrid}\" Value=\"True\" />\r\n                            </MultiDataTrigger.Conditions>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderMouseOver\" />\r\n                        </MultiDataTrigger>\r\n                        <MultiDataTrigger>\r\n                            <MultiDataTrigger.Conditions>\r\n                                <Condition Binding=\"{Binding CoverImage}\" Value=\"{x:Null}\" />\r\n                                <Condition Binding=\"{Settings ShowNameEmptyCover}\" Value=\"True\" />\r\n                            </MultiDataTrigger.Conditions>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"TextGameName\"/>\r\n                        </MultiDataTrigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderMouseOver\"/>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"GameControls\"/>\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/HighlightBorder.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"HighlightBorder\" TargetType=\"Border\" BasedOn=\"{StaticResource {x:Type Border}}\">\r\n        <Setter Property=\"CornerRadius\" Value=\"{DynamicResource ControlCornerRadius}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>                  \r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/ImageHighlightButton.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"ImageHighlightButton\" TargetType=\"Button\">\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"True\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate>\r\n                    <Rectangle Fill=\"{TemplateBinding Foreground}\" OpacityMask=\"{TemplateBinding OpacityMask}\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"False\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/ListViewGroupStyle.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"ListViewGroupStyle\" TargetType=\"{x:Type GroupItem}\">\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"True\" />\r\n        <Setter Property=\"FontSize\" Value=\"15\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GroupItem}\">\r\n                    <ExpanderEx BorderThickness=\"0\" SaveGameGroupId=\"{Binding Name, Mode=OneWay}\"\r\n                                IsExpanded=\"True\">\r\n                        <ExpanderEx.Header>                            \r\n                            <DockPanel Background=\"Transparent\">\r\n                                <DockPanel.ContextMenu>\r\n                                    <GameGroupMenu />\r\n                                </DockPanel.ContextMenu>\r\n                                <TextBlock DockPanel.Dock=\"Left\"\r\n                                           VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\r\n                                           TextAlignment=\"Center\" Margin=\"0,0,5,0\">\r\n                                    <TextBlock.Style>\r\n                                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                            <Setter Property=\"Text\" Value=\"{Binding Name, Converter={StaticResource ObjectToStringConverter}}\" />\r\n                                            <Style.Triggers>\r\n                                                <DataTrigger Binding=\"{Binding Name, Converter={StaticResource ObjectToStringConverter}}\" Value=\"{x:Null}\">\r\n                                                    <Setter Property=\"Text\" Value=\"{DynamicResource LOCNone}\" />\r\n                                                </DataTrigger>\r\n                                                <DataTrigger Binding=\"{Binding Name, Converter={StaticResource ObjectToStringConverter}}\" Value=\"\">\r\n                                                    <Setter Property=\"Text\" Value=\"{DynamicResource LOCNone}\" />\r\n                                                </DataTrigger>\r\n                                            </Style.Triggers>\r\n                                        </Style>\r\n                                    </TextBlock.Style>\r\n                                </TextBlock>\r\n                                <TextBlock Text=\"{Binding Items.Count, Mode=OneWay, StringFormat=({0})}\"\r\n                                           VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\r\n                                           Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                           DockPanel.Dock=\"Left\" TextAlignment=\"Center\"\r\n                                           Visibility=\"{Settings ShowGroupCount}\"/>\r\n                            </DockPanel>\r\n                        </ExpanderEx.Header>\r\n                        <ItemsPresenter />\r\n                    </ExpanderEx>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/MainWindowStyle.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n\r\n    <Style x:Key=\"MainWindowStyle\" TargetType=\"WindowBase\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource WindowBackgourndBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\r\n        <Setter Property=\"TextOptions.TextFormattingMode\" Value=\"Ideal\" />\r\n        <Setter Property=\"TextOptions.TextRenderingMode\" Value=\"Auto\" />\r\n        <Setter Property=\"WindowChrome.WindowChrome\">\r\n            <Setter.Value>\r\n                <WindowChrome CaptionHeight=\"25\" CornerRadius=\"0\" ResizeBorderThickness=\"4\"\r\n                              NonClientFrameEdges =\"None\" UseAeroCaptionButtons=\"False\" GlassFrameThickness=\"0\"/>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type WindowBase}\">\r\n                    <ControlTemplate.Resources>\r\n                        <sys:Boolean x:Key=\"True\">True</sys:Boolean>\r\n                    </ControlTemplate.Resources>\r\n                    <AdornerDecorator>\r\n                        <Border x:Name=\"WindowBorder\" BorderBrush=\"{DynamicResource PopupBorderBrush}\" CornerRadius=\"0\"\r\n                                BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                                Background=\"{TemplateBinding Background}\">\r\n                            <Grid>\r\n                                <ContentPresenter Margin=\"0,0,0,0\"/>\r\n                                <DockPanel DockPanel.Dock=\"Top\" LastChildFill=\"False\">\r\n                                    <DockPanel DockPanel.Dock=\"Top\" LastChildFill=\"False\">\r\n                                        <TextBlock Text=\"{TemplateBinding Title}\" DockPanel.Dock=\"Left\" Margin=\"10,3,0,0\" VerticalAlignment=\"Center\"\r\n                                                   Opacity=\"0.75\" Style=\"{DynamicResource BaseTextBlockStyle}\" x:Name=\"PART_TextTitle\" />\r\n                                        <StackPanel DockPanel.Dock=\"Right\" Orientation=\"Horizontal\" Margin=\"0,3,5,0\">\r\n                                            <Button Style=\"{DynamicResource WindowBarButton}\" Content=\"0\" x:Name=\"PART_ButtonMinimize\"/>\r\n                                            <Button Style=\"{DynamicResource WindowBarButton}\" Content=\"1\" x:Name=\"PART_ButtonMaximize\" />\r\n                                            <Button Style=\"{DynamicResource WindowBarButton}\" Content=\"r\" x:Name=\"PART_ButtonClose\"/>\r\n                                        </StackPanel>\r\n                                    </DockPanel>\r\n                                </DockPanel>\r\n                            </Grid>\r\n                        </Border>\r\n                    </AdornerDecorator>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"WindowState\" Value=\"Maximized\">\r\n                            <Setter Property=\"Content\" Value=\"2\" TargetName=\"PART_ButtonMaximize\"/>\r\n                            <Setter Property=\"Padding\" Value=\"8\" TargetName=\"WindowBorder\"/>\r\n                        </Trigger>\r\n                        <DataTrigger Binding=\"{Binding HasChildWindow, Mode=OneWay, RelativeSource={RelativeSource Self}, TargetNullValue=False}\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" TargetName=\"WindowBorder\"/>\r\n                            <Setter Property=\"Opacity\" Value=\"0.4\" />\r\n                        </DataTrigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/NotificationMessage.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"NotificationMessage\" TargetType=\"Button\">\r\n        <Setter Property=\"Command\" Value=\"{Binding ActivateCommand}\" />\r\n        <Setter Property=\"Margin\" Value=\"10,8,10,0\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"Button\">\r\n                    <Border Style=\"{StaticResource HighlightBorder}\" Background=\"{DynamicResource ButtonBackgroundBrush}\"\r\n                            d:DataContext=\"{x:Static DesignMainViewModel.DesignNotificationIntance}\">\r\n                        <DockPanel>\r\n                            <Button DockPanel.Dock=\"Right\" Padding=\"6,0,6,0\"\r\n                                    Content=\"r\" FontFamily=\"Marlett\"\r\n                                    VerticalAlignment=\"Stretch\" BorderThickness=\"0\"\r\n                                    Command=\"{Binding CloseCommand}\"/>\r\n                            <TextBlock Text=\"{Binding Text}\"\r\n                                       Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                       Margin=\"6,6,0,6\" TextWrapping=\"Wrap\"\r\n                                       MinHeight=\"38\" DockPanel.Dock=\"Left\" />\r\n                        </DockPanel>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/PlayButton.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"PlayButton\" TargetType=\"{x:Type Button}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource GlyphBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDark}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Padding\" Value=\"10,5,10,5\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Button}\">\r\n                    <Grid x:Name=\"Grid\">\r\n                        <Border x:Name=\"DefaultBorder\" BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                                BorderThickness=\"{TemplateBinding BorderThickness}\"  Background=\"{TemplateBinding Background}\"\r\n                                Opacity=\"1\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"/>\r\n                        <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" Margin=\"{TemplateBinding Padding}\" VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" RecognizesAccessKey=\"True\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsEnabled\" Value=\"True\" />\r\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                            <Setter Property=\"Opacity\" TargetName=\"Grid\" Value=\"0.5\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"true\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource TextBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/PropertyItemButton.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"PropertyItemButton\" TargetType=\"Button\">\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"Margin\" Value=\"0,4,0,4\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"Button\">\r\n                    <TextBlock FontSize=\"{TemplateBinding FontSize}\"\r\n                               Foreground=\"{TemplateBinding Foreground}\"\r\n                               Text=\"{TemplateBinding Content, Converter={StaticResource ObjectToStringConverter}}\"\r\n                               TextWrapping=\"Wrap\"/>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n                <Setter Property=\"Cursor\" Value=\"Hand\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/SimpleButton.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"SimpleButton\" TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"Margin\" Value=\"0,3,0,3\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"Button\">\r\n                    <TextBlock FontSize=\"{TemplateBinding FontSize}\"\r\n                               Foreground=\"{TemplateBinding Foreground}\"\r\n                               Text=\"{TemplateBinding Content}\"\r\n                               TextWrapping=\"Wrap\"/>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/StandardWindowStyle.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n\r\n    <Style x:Key=\"WindowDesignStyle\" TargetType=\"WindowBase\">\r\n        <Setter Property=\"TextOptions.TextFormattingMode\" Value=\"Ideal\" />\r\n        <Setter Property=\"TextOptions.TextRenderingMode\" Value=\"Auto\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"StandardWindowStyle\" TargetType=\"WindowBase\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource WindowBackgourndBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\r\n        <Setter Property=\"TextOptions.TextFormattingMode\" Value=\"Ideal\" />\r\n        <Setter Property=\"TextOptions.TextRenderingMode\" Value=\"Auto\" />\r\n        <Setter Property=\"WindowChrome.WindowChrome\">\r\n            <Setter.Value>\r\n                <WindowChrome CaptionHeight=\"25\" CornerRadius=\"0\" ResizeBorderThickness=\"4\"\r\n                              NonClientFrameEdges =\"None\" UseAeroCaptionButtons=\"False\" GlassFrameThickness=\"0\"/>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type WindowBase}\">\r\n                    <ControlTemplate.Resources>\r\n                        <sys:Boolean x:Key=\"True\">True</sys:Boolean>\r\n                    </ControlTemplate.Resources>\r\n                    <AdornerDecorator>\r\n                        <Border x:Name=\"WindowBorder\" BorderBrush=\"{DynamicResource PopupBorderBrush}\" CornerRadius=\"0\"\r\n                                BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                                Background=\"{TemplateBinding Background}\">\r\n                            <Grid>\r\n                                <ContentPresenter Margin=\"0,25,0,0\"/>\r\n                                <DockPanel DockPanel.Dock=\"Top\" LastChildFill=\"False\">\r\n                                    <DockPanel DockPanel.Dock=\"Top\" LastChildFill=\"False\">\r\n                                        <TextBlock Text=\"{TemplateBinding Title}\" DockPanel.Dock=\"Left\" Margin=\"10,3,0,0\" VerticalAlignment=\"Center\"\r\n                                                   Opacity=\"0.75\" Style=\"{DynamicResource BaseTextBlockStyle}\" x:Name=\"PART_TextTitle\" />\r\n                                        <StackPanel DockPanel.Dock=\"Right\" Orientation=\"Horizontal\" Margin=\"0,3,5,0\">\r\n                                            <Button Style=\"{DynamicResource WindowBarButton}\" Content=\"0\" x:Name=\"PART_ButtonMinimize\"/>\r\n                                            <Button Style=\"{DynamicResource WindowBarButton}\" Content=\"1\" x:Name=\"PART_ButtonMaximize\" />\r\n                                            <Button Style=\"{DynamicResource WindowBarButton}\" Content=\"r\" x:Name=\"PART_ButtonClose\"/>\r\n                                        </StackPanel>\r\n                                    </DockPanel>\r\n                                </DockPanel>\r\n                            </Grid>\r\n                        </Border>\r\n                    </AdornerDecorator>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"WindowState\" Value=\"Maximized\">\r\n                            <Setter Property=\"Content\" Value=\"2\" TargetName=\"PART_ButtonMaximize\"/>\r\n                            <Setter Property=\"Padding\" Value=\"8\" TargetName=\"WindowBorder\"/>\r\n                        </Trigger>\r\n                        <DataTrigger Binding=\"{Binding HasChildWindow, Mode=OneWay, RelativeSource={RelativeSource Self}, TargetNullValue=False}\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" TargetName=\"WindowBorder\"/>\r\n                            <Setter Property=\"Opacity\" Value=\"0.4\" />\r\n                        </DataTrigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/TextBlockGameScore.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n    \r\n    <Style x:Key=\"TextBlockGameScore\" TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n        <Style.Triggers>\r\n            <Trigger Property=\"Tag\" Value=\"{x:Static ScoreRating.Positive}\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource PositiveRatingBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"Tag\" Value=\"{x:Static ScoreRating.Negative}\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource NegativeRatingBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"Tag\" Value=\"{x:Static ScoreRating.Mixed}\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource MixedRatingBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/WindowBarButton.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"WindowBarButton\" TargetType=\"Button\">\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"True\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Margin\" Value=\"5,0,5,0\" />\r\n        <Setter Property=\"Padding\" Value=\"3\" />\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"WindowChrome.IsHitTestVisibleInChrome\" Value=\"True\" />    \r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Button}\">\r\n                    <TextBlock FontFamily=\"Marlett\"\r\n                               Foreground=\"{TemplateBinding Foreground}\"\r\n                               FontSize=\"16\"\r\n                               Padding=\"{TemplateBinding Padding}\"\r\n                               Text=\"{TemplateBinding Content}\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/DescriptionView.html",
    "content": "﻿<!DOCTYPE html>\r\n<html>\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <style type=\"text/css\">\r\n        HTML,BODY\r\n        {\r\n            color: {foreground};\r\n            font-family: \"{font_family}\";\r\n            font-size: {font_size}px;\r\n            margin: 0;\r\n            padding: 0;\r\n        }\r\n\r\n        a {\r\n            color: {link_foreground};\r\n            text-decoration: none;\r\n        }\r\n        \r\n        img {\r\n            max-width: 100%;\r\n        }\r\n    </style>\r\n    <title>Game Description</title>\r\n</head>\r\n<body>\r\n<div>\r\n{text}\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Media.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:popt=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation/options\">\r\n\r\n    <BitmapImage x:Key=\"TrayIcon\" UriSource=\"{ThemeFile 'Images/applogo.ico'}\" RenderOptions.BitmapScalingMode=\"Fant\" popt:Freeze=\"True\"/>\r\n    <BitmapImage x:Key=\"TrayIconWhite\" UriSource=\"{ThemeFile 'Images/applogo_black.ico'}\" RenderOptions.BitmapScalingMode=\"Fant\" popt:Freeze=\"True\"/>\r\n    <BitmapImage x:Key=\"TrayIconBlack\" UriSource=\"{ThemeFile 'Images/applogo_white.ico'}\" RenderOptions.BitmapScalingMode=\"Fant\" popt:Freeze=\"True\"/>\r\n    <TextBlock x:Key=\"FullscreenModeIcon\" Text=\"&#xea48;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n\r\n    <TextBlock x:Key=\"AddGameIcon\" Text=\"&#xec3e;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"UpdateDbIcon\" Text=\"&#xefd1;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"AboutPlayniteIcon\" Text=\"&#xef4e;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"ExitIcon\" Text=\"&#xef1d;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"OrangeRed\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"SettingsIcon\" Text=\"&#xefb0;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"AddonsIcon\" Text=\"&#xeea0;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"PlayIcon\" Text=\"&#xec74;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"InstallIcon\" Text=\"&#xef08;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"LinksIcon\" Text=\"&#xef71;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"OpenFolderIcon\" Text=\"&#xec5b;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"InstallSizeIcon\" Text=\"&#xef43;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"DesktopShortcutIcon\" Text=\"&#xef20;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"AddFavoritesIcon\" Text=\"&#xef25;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"Yellow\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"RemoveFavoritesIcon\" Text=\"&#xef25;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"HideIcon\" Text=\"&#xef22;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"UnHideIcon\" Text=\"&#xef21;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"HdrIcon\" Text=\"&#xeef2;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"EditGameIcon\" Text=\"&#xeded;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"RemoveGameIcon\" Text=\"&#xec53;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"OrangeRed\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"DiceIcon\" Text=\"&#xef03;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"ManualIcon\" Text=\"&#xead1;\" FontFamily=\"{DynamicResource FontIcoFont}\" Foreground=\"{DynamicResource TextBrush}\" FontWeight=\"Light\"/>\r\n    <TextBlock x:Key=\"BackupIcon\" Text=\"&#xeea5;\" FontFamily=\"{DynamicResource FontIcoFont}\" />\r\n    <TextBlock x:Key=\"RestoreBackupIcon\" Text=\"&#xefd1;\" FontFamily=\"{DynamicResource FontIcoFont}\" />\r\n\r\n    <TextBlock x:Key=\"ClearTextIcon\" Text=\"&#xef00;\" FontFamily=\"{DynamicResource FontIcoFont}\"/>\r\n    <TextBlock x:Key=\"SearchTextIcon\" Text=\"&#xed11;\" FontFamily=\"{DynamicResource FontIcoFont}\" />\r\n\r\n    <TextBlock x:Key=\"SidebarLibraryIcon\" Text=\"&#xef65;\" FontFamily=\"{DynamicResource FontIcoFont}\"  FontWeight=\"ExtraLight\"/>\r\n    <TextBlock x:Key=\"SidebarStatisticsIcon\" Text=\"&#xe983;\" FontFamily=\"{DynamicResource FontIcoFont}\"  FontWeight=\"ExtraLight\"/>\r\n\r\n    <DataTemplate x:Key=\"ClearTextIconTemplate\">\r\n        <TextBlock Text=\"&#xef00;\" FontFamily=\"{DynamicResource FontIcoFont}\" />\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"SearchTextIconTemplate\">\r\n        <TextBlock Text=\"&#xed11;\" FontFamily=\"{DynamicResource FontIcoFont}\" />\r\n    </DataTemplate>\r\n\r\n    <BitmapImage x:Key=\"PlayniteLogo\" UriSource=\"{ThemeFile 'Images/applogo.png'}\" popt:Freeze=\"True\" />\r\n    <BitmapImage x:Key=\"DefaultGameIcon\" UriSource=\"{ThemeFile 'Images/applogo_dark.png'}\" popt:Freeze=\"True\" />\r\n    <BitmapImage x:Key=\"DefaultGameCover\" UriSource=\"{ThemeFile 'Images/custom_cover_background.png'}\" popt:Freeze=\"True\" />\r\n\r\n    <BitmapImage x:Key=\"PowerShellIcon\" UriSource=\"{ThemeFile 'Images/powershell.ico'}\" popt:Freeze=\"True\" />    \r\n    <BitmapImage x:Key=\"CsharpIcon\" UriSource=\"{ThemeFile 'Images/csharp.ico'}\" popt:Freeze=\"True\" />\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/DetailsViewGameOverview.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type DetailsViewGameOverview}\">        \r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type DetailsViewGameOverview}\">\r\n                    <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\"\r\n                                  VerticalScrollBarVisibility=\"Auto\"\r\n                                  Style=\"{DynamicResource DetailsScrollViewer}\"\r\n                                  d:DesignWidth=\"1280\"\r\n                                  d:DesignHeight=\"1280\"\r\n                                  d:DataContext=\"{x:Static DesignMainViewModel.DesignSelectedGameDetailsIntance}\"\r\n                                  x:Name=\"PART_ScrollViewHost\">\r\n                        <Grid>\r\n                            <FadeImage x:Name=\"PART_ImageBackground\" Stretch=\"Uniform\"\r\n                                       HorizontalAlignment=\"Center\" VerticalAlignment=\"Top\">\r\n                                <FadeImage.ImageOpacityMask>\r\n                                    <RadialGradientBrush GradientOrigin=\"0.5,0\" Center=\"0.5,0\" RadiusX=\"2\" RadiusY=\"0.9\">\r\n                                        <RadialGradientBrush.GradientStops>\r\n                                            <GradientStop Color=\"Black\" Offset=\"0.3\" />\r\n                                            <GradientStop Color=\"Transparent\" Offset=\"1\" />\r\n                                        </RadialGradientBrush.GradientStops>\r\n                                    </RadialGradientBrush>\r\n                                </FadeImage.ImageOpacityMask>\r\n                            </FadeImage>\r\n\r\n                            <Grid HorizontalAlignment=\"Stretch\" Margin=\"20,0,20,0\">\r\n                                <Grid.RowDefinitions>\r\n                                    <RowDefinition Height=\"{Settings CalculatedGameDetailsIndentation}\"/>\r\n                                    <RowDefinition Height=\"Auto\"/>\r\n                                    <RowDefinition Height=\"*\"/>\r\n                                </Grid.RowDefinitions>                                \r\n\r\n                                <DockPanel Margin=\"0,20,0,15\" MaxWidth=\"1024\" Grid.Row=\"1\"\r\n                                           Background=\"Transparent\">                                    \r\n                                    <Image Name=\"PART_ImageCover\" VerticalAlignment=\"Bottom\"\r\n                                            DockPanel.Dock=\"Right\"\r\n                                            Height=\"{Settings GameDetailsCoverHeight}\"\r\n                                            StretchDirection=\"Both\" Stretch=\"Uniform\"\r\n                                            RenderOptions.BitmapScalingMode=\"Fant\" />\r\n                                    <StackPanel VerticalAlignment=\"Bottom\" DockPanel.Dock=\"Left\">\r\n                                        <DockPanel>\r\n                                            <Image Name=\"PART_ImageIcon\" MaxHeight=\"48\" MaxWidth=\"48\"\r\n                                                    DockPanel.Dock=\"Left\" Margin=\"0,0,10,0\"\r\n                                                    VerticalAlignment=\"Center\"\r\n                                                    RenderOptions.BitmapScalingMode=\"Fant\" />\r\n                                            <TextBlock Name=\"PART_TextDisplayName\" FontFamily=\"{DynamicResource FontFamily}\"\r\n                                                        DockPanel.Dock=\"Left\"\r\n                                                        FontSize=\"{DynamicResource FontSizeLargest}\" Margin=\"0,0,10,0\" TextWrapping=\"Wrap\"\r\n                                                        VerticalAlignment=\"Center\"\r\n                                                        Foreground=\"{DynamicResource TextBrush}\">\r\n                                                <TextBlock.Effect>\r\n                                                    <DropShadowEffect ShadowDepth=\"3\" RenderingBias=\"Quality\"/>\r\n                                                </TextBlock.Effect>\r\n                                            </TextBlock>\r\n                                        </DockPanel>\r\n                                        <StackPanel HorizontalAlignment=\"Left\" VerticalAlignment=\"Top\"\r\n                                                    Orientation=\"Horizontal\" Margin=\"0,15,0,0\">\r\n                                            <Button Name=\"PART_ButtonPlayAction\"\r\n                                                    Width=\"150\" Height=\"40\" Style=\"{DynamicResource PlayButton}\" />\r\n                                            <Button Name=\"PART_ButtonContextAction\" \r\n                                                    Width=\"150\" Height=\"40\" />\r\n                                            <Button Name=\"PART_ButtonMoreActions\"\r\n                                                    Content=\"{DynamicResource LOCMoreAction}\"\r\n                                                    Width=\"150\" Height=\"40\" Margin=\"10,0,0,0\" />\r\n                                            <Button x:Name=\"PART_ButtonEditGame\"\r\n                                                    Margin=\"10,0,0,0\" Height=\"40\" Focusable=\"False\"\r\n                                                    Content=\"&#xeded;\" FontFamily=\"{DynamicResource FontIcoFont}\">\r\n                                                <Button.Style>\r\n                                                    <Style TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n                                                        <Setter Property=\"Visibility\" Value=\"Hidden\" />\r\n                                                        <Style.Triggers>\r\n                                                            <DataTrigger Binding=\"{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=DockPanel}}\"  Value=\"True\">\r\n                                                                <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                                                            </DataTrigger>\r\n                                                        </Style.Triggers>\r\n                                                    </Style>\r\n                                                </Button.Style>\r\n                                            </Button>\r\n                                        </StackPanel>\r\n                                    </StackPanel>\r\n                                </DockPanel>\r\n\r\n                                <DockPanel MaxWidth=\"1024\" Grid.Row=\"2\">\r\n                                    <StackPanel DockPanel.Dock=\"Left\" Width=\"300\"\r\n                                                Margin=\"2,0,0,0\">\r\n                                        <StackPanel.Resources>\r\n                                            <Style TargetType=\"ItemsControl\">\r\n                                                <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                                            </Style>\r\n                                            <Style TargetType=\"Label\" BasedOn=\"{StaticResource {x:Type Label}}\">\r\n                                                <Setter Property=\"Margin\" Value=\"0,4,8,4\" />\r\n                                                <Setter Property=\"VerticalAlignment\" Value=\"Top\" />\r\n                                                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n                                            </Style>\r\n                                            <Style TargetType=\"Button\" BasedOn=\"{StaticResource PropertyItemButton}\" />\r\n                                        </StackPanel.Resources>\r\n\r\n                                        <TextBlock Text=\"{DynamicResource LOCGameDetails}\" Margin=\"0,15,0,5\"\r\n                                                    Style=\"{DynamicResource BaseTextBlockStyle}\" />\r\n\r\n                                        <Separator Background=\"{DynamicResource PanelSeparatorBrush}\" />\r\n                                            \r\n                                        <GridEx Margin=\"0,5,0,10\"\r\n                                                ColumnCount=\"2\" StarColumns=\"1\"\r\n                                                RowCount=\"25\" AutoLayoutColumns=\"2\">\r\n                                            <Grid.Resources>\r\n                                                <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n                                            </Grid.Resources>\r\n\r\n                                            <Label Name=\"PART_ElemAdded\" Content=\"{DynamicResource LOCDateAddedLabel}\" />\r\n                                            <TextBlock Name=\"PART_TextAdded\" VerticalAlignment=\"Center\" />\r\n                                            \r\n                                            <Label Name=\"PART_ElemPlayTime\" Content=\"{DynamicResource LOCTimePlayed}\" />\r\n                                            <TextBlock Name=\"PART_TextPlayTime\" VerticalAlignment=\"Center\" />\r\n\r\n                                            <Label Name=\"PART_ElemLastPlayed\" Content=\"{DynamicResource LOCLastPlayed}\" />\r\n                                            <TextBlock Name=\"PART_TextLastActivity\" VerticalAlignment=\"Center\" />\r\n\r\n                                            <Label Name=\"PART_ElemRecentActivity\" Content=\"{DynamicResource LOCRecentActivityLabel}\" />\r\n                                            <TextBlock Name=\"PART_TextRecentActivity\" VerticalAlignment=\"Center\" />\r\n                                            \r\n                                            <Label Name=\"PART_ElemCompletionStatus\" Content=\"{DynamicResource LOCCompletionStatus}\" />\r\n                                            <Button Name=\"PART_ButtonCompletionStatus\" VerticalAlignment=\"Center\" />\r\n\r\n                                            <Label Name=\"PART_ElemInstallDirectory\" Content=\"{DynamicResource LOCGameInstallDirTitle}\" />\r\n                                            <Button Name=\"PART_ButtonInstallDirectory\" VerticalAlignment=\"Center\" />\r\n\r\n                                            <Label Name=\"PART_ElemInstallSize\" Content=\"{DynamicResource LOCInstallSizeLabel}\" />\r\n                                            <TextBlock Name=\"PART_TextInstallSize\" VerticalAlignment=\"Center\" />\r\n                                            \r\n                                            <Label Name=\"PART_ElemLibrary\" Content=\"{DynamicResource LOCGameProviderTitle}\" />\r\n                                            <Button Name=\"PART_ButtonLibrary\" VerticalAlignment=\"Center\" />\r\n\r\n                                            <Label Name=\"PART_ElemPlatform\" Content=\"{DynamicResource LOCPlatformTitle}\" />\r\n                                            <ItemsControl Name=\"PART_ItemsPlatforms\" />\r\n\r\n                                            <Label Name=\"PART_ElemGenres\" Content=\"{DynamicResource LOCGenreLabel}\" />\r\n                                            <ItemsControl Name=\"PART_ItemsGenres\"  />\r\n\r\n                                            <Label Name=\"PART_ElemDevelopers\" Content=\"{DynamicResource LOCDeveloperLabel}\" />\r\n                                            <ItemsControl Name=\"PART_ItemsDevelopers\" />\r\n\r\n                                            <Label Name=\"PART_ElemPublishers\" Content=\"{DynamicResource LOCPublisherLabel}\" />\r\n                                            <ItemsControl Name=\"PART_ItemsPublishers\" />\r\n\r\n                                            <Label Name=\"PART_ElemReleaseDate\" Content=\"{DynamicResource LOCGameReleaseDateTitle}\" />\r\n                                            <Button Name=\"PART_ButtonReleaseDate\" VerticalAlignment=\"Center\" />\r\n\r\n                                            <Label Name=\"PART_ElemCategories\" Content=\"{DynamicResource LOCGameCategoriesTitle}\" />\r\n                                            <ItemsControl Name=\"PART_ItemsCategories\" />\r\n\r\n                                            <Label Name=\"PART_ElemFeatures\" Content=\"{DynamicResource LOCFeaturesLabel}\" />\r\n                                            <ItemsControl Name=\"PART_ItemsFeatures\" />\r\n\r\n                                            <Label Name=\"PART_ElemTags\" Content=\"{DynamicResource LOCTagsLabel}\" />\r\n                                            <ItemsControl Name=\"PART_ItemsTags\" />\r\n\r\n                                            <Label Name=\"PART_ElemAgeRating\" Content=\"{DynamicResource LOCAgeRatingLabel}\" />\r\n                                            <ItemsControl Name=\"PART_ItemsAgeRatings\" />\r\n\r\n                                            <Label Name=\"PART_ElemSeries\" Content=\"{DynamicResource LOCSeriesLabel}\" />\r\n                                            <ItemsControl Name=\"PART_ItemsSeries\" />\r\n\r\n                                            <Label Name=\"PART_ElemSource\" Content=\"{DynamicResource LOCSourceLabel}\" />\r\n                                            <Button Name=\"PART_ButtonSource\" VerticalAlignment=\"Center\" />\r\n\r\n                                            <Label Name=\"PART_ElemRegion\" Content=\"{DynamicResource LOCRegionLabel}\" />\r\n                                            <ItemsControl Name=\"PART_ItemsRegions\" />\r\n\r\n                                            <Label Name=\"PART_ElemVersion\" Content=\"{DynamicResource LOCVersionLabel}\" />\r\n                                            <Button Name=\"PART_ButtonVersion\" VerticalAlignment=\"Center\" />\r\n\r\n                                            <Label Name=\"PART_ElemCommunityScore\" Content=\"{DynamicResource LOCCommunityScore}\" />\r\n                                            <TextBlock Name=\"PART_TextCommunityScore\" VerticalAlignment=\"Center\"\r\n                                                        Style=\"{DynamicResource TextBlockGameScore}\" />\r\n\r\n                                            <Label Name=\"PART_ElemCriticScore\" Content=\"{DynamicResource LOCCriticScore}\" />\r\n                                            <TextBlock Name=\"PART_TextCriticScore\" VerticalAlignment=\"Center\"\r\n                                                        Style=\"{DynamicResource TextBlockGameScore}\" />\r\n\r\n                                            <Label Name=\"PART_ElemUserScore\" Content=\"{DynamicResource LOCUserScore}\" />\r\n                                            <TextBlock Name=\"PART_TextUserScore\" VerticalAlignment=\"Center\"\r\n                                                        Style=\"{DynamicResource TextBlockGameScore}\" />\r\n\r\n                                            <Label Name=\"PART_ElemLinks\" Content=\"{DynamicResource LOCLinksLabel}\" />\r\n                                            <ItemsControl Name=\"PART_ItemsLinks\" />\r\n                                        </GridEx>\r\n                                    </StackPanel>\r\n\r\n                                    <StackPanel DockPanel.Dock=\"Right\" Margin=\"10,0,2,0\">\r\n                                        <StackPanel Name=\"PART_ElemNotes\">\r\n                                            <TextBlock Text=\"{DynamicResource LOCNotesLabel}\" Margin=\"0,15,0,5\"\r\n                                                       Style=\"{DynamicResource BaseTextBlockStyle}\" />\r\n                                            <Separator Background=\"{DynamicResource PanelSeparatorBrush}\" />\r\n                                            <TextBox Name=\"PART_TextNotes\" IsReadOnly=\"True\"\r\n                                                     BorderThickness=\"0\"\r\n                                                     AcceptsReturn=\"True\" TextWrapping=\"Wrap\"\r\n                                                     Margin=\"-1,5,-1,5\" Padding=\"0\"/>\r\n                                        </StackPanel>\r\n                                        \r\n                                        <StackPanel Name=\"PART_ElemDescription\">\r\n                                            <TextBlock Text=\"{DynamicResource LOCGameDescriptionTitle}\" Margin=\"0,15,0,5\"\r\n                                                    Style=\"{DynamicResource BaseTextBlockStyle}\" />\r\n                                            <Separator Background=\"{DynamicResource PanelSeparatorBrush}\" />\r\n                                            <HtmlTextView Name=\"PART_HtmlDescription\"\r\n                                                        Margin=\"0,5,0,5\"\r\n                                                        HtmlFontSize=\"{DynamicResource FontSize}\"\r\n                                                        HtmlFontFamily=\"{DynamicResource FontFamily}\"\r\n                                                        HtmlForeground=\"{DynamicResource TextColor}\"\r\n                                                        LinkForeground=\"{DynamicResource GlyphColor}\"                                      \r\n                                                        ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\r\n                                                        ScrollViewer.VerticalScrollBarVisibility=\"Disabled\"/>\r\n                                        </StackPanel>\r\n                                    </StackPanel>\r\n                                </DockPanel>                              \r\n                            </Grid>\r\n                        </Grid>\r\n                    </ScrollViewer>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/ExplorerPanel.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">    \r\n\r\n    <Style TargetType=\"{x:Type ExplorerPanel}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ExplorerPanel}\">\r\n                    <Border BorderBrush=\"{DynamicResource PanelSeparatorBrush}\"\r\n                            d:DesignWidth=\"200\"\r\n                            d:DesignHeight=\"400\">\r\n                        <Border.Style>\r\n                            <Style TargetType=\"Border\">\r\n                                <Setter Property=\"BorderThickness\" Value=\"1,0,0,0\" />\r\n                                <Style.Triggers>\r\n                                    <DataTrigger Binding=\"{Settings ExplorerPanelPosition}\" Value=\"Left\">\r\n                                        <Setter Property=\"BorderThickness\" Value=\"0,0,1,0\" />\r\n                                    </DataTrigger>\r\n                                    <DataTrigger Binding=\"{Settings ShowPanelSeparators}\" Value=\"False\">\r\n                                        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n                                    </DataTrigger>\r\n                                </Style.Triggers>\r\n                            </Style>\r\n                        </Border.Style>\r\n                        <DockPanel Background=\"{TemplateBinding Background}\">\r\n                            <DockPanel DockPanel.Dock=\"Top\" LastChildFill=\"True\"\r\n                                       Margin=\"5,8,5,8\">\r\n                                <Button Content=\"r\" FontFamily=\"Marlett\"\r\n                                        Style=\"{StaticResource SimpleButton}\"\r\n                                        DockPanel.Dock=\"Right\" Margin=\"0,0,5,0\"\r\n                                        VerticalAlignment=\"Center\"\r\n                                        Name=\"PART_ButtonClose\"/>\r\n                                <ComboBox Name=\"PART_SelectFields\" MaxDropDownHeight=\"Auto\"\r\n                                          DockPanel.Dock=\"Left\" Margin=\"0,0,8,0\" />\r\n                            </DockPanel>\r\n                            <ListBox Name=\"PART_SelectItems\"\r\n                                 DockPanel.Dock=\"Top\" Margin=\"5,0,5,8\"                                      \r\n                                 BorderThickness=\"0\"\r\n                                 ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\">\r\n                            </ListBox>\r\n                        </DockPanel>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/FilterPanelView.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"FilterPanelCheckBox\" TargetType=\"CheckBox\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\r\n        <Setter Property=\"Margin\" Value=\"8,2,6,8\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsChecked\" Value=\"{StaticResource False}\">\r\n                <Setter Property=\"Opacity\" Value=\"0.6\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n    \r\n    <Style x:Key=\"FilterPanelLabel\" TargetType=\"Label\" BasedOn=\"{StaticResource {x:Type Label}}\">\r\n        <Setter Property=\"Margin\" Value=\"8,10,6,4\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"Tag\" Value=\"{StaticResource False}\">\r\n                <Setter Property=\"Opacity\" Value=\"0.6\"/>\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n    \r\n    <Style x:Key=\"FilterPanelFilterSearchBox\" TargetType=\"SearchBox\" BasedOn=\"{StaticResource {x:Type SearchBox}}\">\r\n        <Setter Property=\"Margin\" Value=\"8,0,6,0\" />\r\n        <Setter Property=\"ShowImage\" Value=\"False\" />\r\n    </Style>\r\n    \r\n    <Style x:Key=\"FilterPanelFilterSelectionBox\" TargetType=\"FilterSelectionBox\" BasedOn=\"{StaticResource {x:Type FilterSelectionBox}}\">\r\n        <Setter Property=\"Margin\" Value=\"8,0,6,0\" />\r\n    </Style>\r\n    \r\n    <Style x:Key=\"FilterPanelFilterEnumSelectionBox\" TargetType=\"FilterEnumSelectionBox\" BasedOn=\"{StaticResource {x:Type FilterEnumSelectionBox}}\">\r\n        <Setter Property=\"Margin\" Value=\"8,0,6,0\" />\r\n    </Style>\r\n    \r\n    <Style x:Key=\"FilterPanelFilterStringSelectionBox\" TargetType=\"FilterStringSelectionBox\" BasedOn=\"{StaticResource {x:Type FilterStringSelectionBox}}\">\r\n        <Setter Property=\"Margin\" Value=\"8,0,6,0\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"FilterPresetButtonAction\" TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n        <Setter Property=\"FontFamily\" Value=\"{StaticResource FontIcoFont}\" />\r\n        <Setter Property=\"Padding\" Value=\"5\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n        <Setter Property=\"DockPanel.Dock\" Value=\"Right\" />\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type FilterPanel}\">  \r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type FilterPanel}\">\r\n                    <Border BorderBrush=\"{DynamicResource PanelSeparatorBrush}\"\r\n                            d:DesignWidth=\"200\">\r\n                        <Border.Style>\r\n                            <Style TargetType=\"Border\">\r\n                                <Setter Property=\"BorderThickness\" Value=\"1,0,0,0\" />\r\n                                <Style.Triggers>                                    \r\n                                    <DataTrigger Binding=\"{Settings FilterPanelPosition}\" Value=\"Left\">\r\n                                        <Setter Property=\"BorderThickness\" Value=\"0,0,1,0\" />\r\n                                    </DataTrigger>\r\n                                    <DataTrigger Binding=\"{Settings ShowPanelSeparators}\" Value=\"False\">\r\n                                        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n                                    </DataTrigger>\r\n                                </Style.Triggers>\r\n                            </Style>\r\n                        </Border.Style>\r\n                        <DockPanel Background=\"{TemplateBinding Background}\">\r\n                            <DockPanel Margin=\"10,8,5,5\" DockPanel.Dock=\"Top\">\r\n                                <Button Content=\"r\" FontFamily=\"Marlett\"\r\n                                        Style=\"{StaticResource SimpleButton}\"\r\n                                        DockPanel.Dock=\"Right\" Margin=\"0,0,5,0\"\r\n                                        Name=\"PART_ButtonClose\"/>\r\n                                <Button DockPanel.Dock=\"Left\" Content=\"{StaticResource LOCClearFilters}\"                                        \r\n                                        HorizontalAlignment=\"Left\"\r\n                                        Style=\"{StaticResource SimpleButton}\"\r\n                                        Name=\"PART_ButtonClear\"/>\r\n                            </DockPanel>\r\n                            <DockPanel DockPanel.Dock=\"Top\" Margin=\"8,0,6,5\">\r\n                                <Button x:Name=\"PART_ButtonDeleteFilter\"\r\n                                        Content=\"&#xec53;\" Style=\"{DynamicResource FilterPresetButtonAction}\" />\r\n                                <Button x:Name=\"PART_ButtonRenameFilter\"\r\n                                        Content=\"&#xec55;\" Style=\"{DynamicResource FilterPresetButtonAction}\"/>\r\n                                <Button x:Name=\"PART_ButtonSaveFilter\"\r\n                                        Content=\"&#xee00;\" Style=\"{DynamicResource FilterPresetButtonAction}\" />\r\n                                <ComboBox x:Name=\"PART_ComboFilterPresets\"\r\n                                          DockPanel.Dock=\"Left\" VerticalAlignment=\"Center\" />\r\n                            </DockPanel>                            \r\n                            <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\"\r\n                                      DockPanel.Dock=\"Top\" Padding=\"0,0,0,15\">\r\n                                <StackPanel x:Name=\"PART_PanelItemsHost\" />\r\n                            </ScrollViewer>\r\n                        </DockPanel>\r\n                    </Border>                                                       \r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/GridViewGameOverview.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type GridViewGameOverview}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GridViewGameOverview}\">\r\n                    <Border Padding=\"10,0,5,0\" BorderBrush=\"{DynamicResource PanelSeparatorBrush}\"\r\n                            d:DataContext=\"{x:Static DesignMainViewModel.DesignSelectedGameDetailsIntance}\">\r\n                        <Border.Style>\r\n                            <Style TargetType=\"Border\">\r\n                                <Setter Property=\"BorderThickness\" Value=\"1,0,0,0\" />\r\n                                <Style.Triggers>\r\n                                    <DataTrigger Binding=\"{Settings GridViewDetailsPosition}\" Value=\"Left\">\r\n                                        <Setter Property=\"BorderThickness\" Value=\"0,0,1,0\" />\r\n                                    </DataTrigger>\r\n                                    <DataTrigger Binding=\"{Settings ShowPanelSeparators}\" Value=\"False\">\r\n                                        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n                                    </DataTrigger>\r\n                                </Style.Triggers>\r\n                            </Style>\r\n                        </Border.Style>\r\n                        <DockPanel>\r\n                            <Button HorizontalAlignment=\"Right\" VerticalAlignment=\"Top\"\r\n                                    Content=\"r\" FontFamily=\"Marlett\"\r\n                                    Style=\"{DynamicResource SimpleButton}\"\r\n                                    Command=\"{MainViewModel CloseGameSideBarCommand}\"\r\n                                    DockPanel.Dock=\"Top\" Margin=\"0,10,15,5\" />\r\n\r\n                            <TextBlock Text=\"{DynamicResource LOCErrorNoGameSelected}\" \r\n                                   Margin=\"0,20,0,0\" DockPanel.Dock=\"Top\"\r\n                                   HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\r\n                                <TextBlock.Style>\r\n                                    <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                        <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                                        <Style.Triggers>\r\n                                            <Trigger Property=\"DataContext\" Value=\"{x:Null}\">\r\n                                                <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                                            </Trigger>\r\n                                        </Style.Triggers>\r\n                                    </Style>\r\n                                </TextBlock.Style>\r\n                            </TextBlock>\r\n\r\n                            <DockPanel DockPanel.Dock=\"Top\">\r\n                                <DockPanel.Style>\r\n                                    <Style TargetType=\"DockPanel\">\r\n                                        <Style.Triggers>\r\n                                            <Trigger Property=\"DataContext\" Value=\"{x:Null}\">\r\n                                                <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                                            </Trigger>\r\n                                        </Style.Triggers>\r\n                                    </Style>\r\n                                </DockPanel.Style>\r\n\r\n                                <DockPanel DockPanel.Dock=\"Top\">\r\n                                    <Image Name=\"PART_ImageIcon\" DockPanel.Dock=\"Left\" MaxHeight=\"32\" MaxWidth=\"32\"\r\n                                           RenderOptions.BitmapScalingMode=\"Fant\" Margin=\"0,0,10,0\" />\r\n                                    <TextBlock Name=\"PART_TextDisplayName\" FontSize=\"{DynamicResource FontSizeLarger}\"\r\n                                               TextWrapping=\"Wrap\" DockPanel.Dock=\"Left\"\r\n                                               VerticalAlignment=\"Center\" Foreground=\"{DynamicResource TextBrush}\">\r\n                                        <TextBlock.Effect>\r\n                                            <DropShadowEffect ShadowDepth=\"3\"/>\r\n                                        </TextBlock.Effect>\r\n                                    </TextBlock>\r\n                                </DockPanel>\r\n\r\n                                <Grid DockPanel.Dock=\"Top\" Margin=\"0,10,0,10\" Background=\"Transparent\">\r\n                                    <Grid.ColumnDefinitions>\r\n                                        <ColumnDefinition Width=\"*\" MaxWidth=\"150\" />\r\n                                        <ColumnDefinition Width=\"*\" MaxWidth=\"150\" />\r\n                                        <ColumnDefinition Width=\"Auto\" />\r\n                                    </Grid.ColumnDefinitions>\r\n                                    <Button Name=\"PART_ButtonPlayAction\" Grid.Column=\"0\"\r\n                                            Height=\"40\" Style=\"{DynamicResource PlayButton}\" />\r\n                                    <Button Name=\"PART_ButtonContextAction\"\r\n                                            Height=\"40\" Grid.Column=\"0\" />\r\n                                    <Button Name=\"PART_ButtonMoreActions\"\r\n                                            Content=\"{DynamicResource LOCMoreAction}\"\r\n                                            Height=\"40\" Grid.Column=\"1\" Margin=\"10,0,0,0\" />\r\n                                    <Button x:Name=\"PART_ButtonEditGame\" Grid.Column=\"2\"\r\n                                            Margin=\"10,0,5,0\" Height=\"40\" Focusable=\"False\"\r\n                                            Content=\"&#xeded;\" FontFamily=\"{DynamicResource FontIcoFont}\">\r\n                                        <Button.Style>\r\n                                            <Style TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n                                                <Setter Property=\"Visibility\" Value=\"Hidden\" />\r\n                                                <Style.Triggers>\r\n                                                    <DataTrigger Binding=\"{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=Grid}}\"  Value=\"True\">\r\n                                                        <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                                                    </DataTrigger>\r\n                                                </Style.Triggers>\r\n                                            </Style>\r\n                                        </Button.Style>\r\n                                    </Button>\r\n                                </Grid>\r\n\r\n                                <ScrollViewer DockPanel.Dock=\"Top\" HorizontalAlignment=\"Stretch\"\r\n                                              HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\"\r\n                                              x:Name=\"PART_ScrollViewHost\">\r\n                                    <DockPanel>\r\n                                        <StackPanel DockPanel.Dock=\"Top\" Margin=\"5,0,0,0\">\r\n                                            <StackPanel.Resources>\r\n                                                <Style TargetType=\"ItemsControl\">\r\n                                                    <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                                                </Style>\r\n                                                <Style TargetType=\"Label\" BasedOn=\"{StaticResource {x:Type Label}}\">\r\n                                                    <Setter Property=\"Margin\" Value=\"0,4,8,4\" />\r\n                                                    <Setter Property=\"VerticalAlignment\" Value=\"Top\" />\r\n                                                    <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n                                                </Style>\r\n                                                <Style TargetType=\"Button\" BasedOn=\"{StaticResource PropertyItemButton}\" />\r\n                                            </StackPanel.Resources>\r\n\r\n                                            <GridEx Margin=\"0,5,0,10\"\r\n                                                    ColumnCount=\"2\" StarColumns=\"1\"\r\n                                                    RowCount=\"25\" AutoLayoutColumns=\"2\">\r\n                                                <Grid.Resources>\r\n                                                    <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n                                                </Grid.Resources>\r\n\r\n                                                <Label Name=\"PART_ElemAdded\" Content=\"{DynamicResource LOCDateAddedLabel}\" />\r\n                                                <TextBlock Name=\"PART_TextAdded\" VerticalAlignment=\"Center\" />\r\n                                                \r\n                                                <Label Name=\"PART_ElemPlayTime\" Content=\"{DynamicResource LOCTimePlayed}\" />\r\n                                                <TextBlock Name=\"PART_TextPlayTime\" VerticalAlignment=\"Center\" />\r\n\r\n                                                <Label Name=\"PART_ElemLastPlayed\" Content=\"{DynamicResource LOCLastPlayed}\" />\r\n                                                <TextBlock Name=\"PART_TextLastActivity\" VerticalAlignment=\"Center\" />\r\n\r\n                                                <Label Name=\"PART_ElemCompletionStatus\" Content=\"{DynamicResource LOCCompletionStatus}\" />\r\n                                                <Button Name=\"PART_ButtonCompletionStatus\" VerticalAlignment=\"Center\" />\r\n\r\n                                                <Label Name=\"PART_ElemInstallDirectory\" Content=\"{DynamicResource LOCGameInstallDirTitle}\" />\r\n                                                <Button Name=\"PART_ButtonInstallDirectory\" VerticalAlignment=\"Center\" />\r\n                                                \r\n                                                <Label Name=\"PART_ElemInstallSize\" Content=\"{DynamicResource LOCInstallSizeLabel}\" />\r\n                                                <TextBlock Name=\"PART_TextInstallSize\" VerticalAlignment=\"Center\" />\r\n                                                \r\n                                                <Label Name=\"PART_ElemLibrary\" Content=\"{DynamicResource LOCGameProviderTitle}\" />\r\n                                                <Button Name=\"PART_ButtonLibrary\" VerticalAlignment=\"Center\" />\r\n\r\n                                                <Label Name=\"PART_ElemPlatform\" Content=\"{DynamicResource LOCPlatformTitle}\" />\r\n                                                <ItemsControl Name=\"PART_ItemsPlatforms\" />\r\n\r\n                                                <Label Name=\"PART_ElemGenres\" Content=\"{DynamicResource LOCGenreLabel}\" />\r\n                                                <ItemsControl Name=\"PART_ItemsGenres\"  />\r\n\r\n                                                <Label Name=\"PART_ElemDevelopers\" Content=\"{DynamicResource LOCDeveloperLabel}\" />\r\n                                                <ItemsControl Name=\"PART_ItemsDevelopers\" />\r\n\r\n                                                <Label Name=\"PART_ElemPublishers\" Content=\"{DynamicResource LOCPublisherLabel}\" />\r\n                                                <ItemsControl Name=\"PART_ItemsPublishers\" />\r\n\r\n                                                <Label Name=\"PART_ElemReleaseDate\" Content=\"{DynamicResource LOCGameReleaseDateTitle}\" />\r\n                                                <Button Name=\"PART_ButtonReleaseDate\" VerticalAlignment=\"Center\" />\r\n\r\n                                                <Label Name=\"PART_ElemCategories\" Content=\"{DynamicResource LOCGameCategoriesTitle}\" />\r\n                                                <ItemsControl Name=\"PART_ItemsCategories\" />\r\n\r\n                                                <Label Name=\"PART_ElemFeatures\" Content=\"{DynamicResource LOCFeaturesLabel}\" />\r\n                                                <ItemsControl Name=\"PART_ItemsFeatures\" />\r\n\r\n                                                <Label Name=\"PART_ElemTags\" Content=\"{DynamicResource LOCTagsLabel}\" />\r\n                                                <ItemsControl Name=\"PART_ItemsTags\" />\r\n\r\n                                                <Label Name=\"PART_ElemAgeRating\" Content=\"{DynamicResource LOCAgeRatingLabel}\" />\r\n                                                <ItemsControl Name=\"PART_ItemsAgeRatings\" />\r\n\r\n                                                <Label Name=\"PART_ElemSeries\" Content=\"{DynamicResource LOCSeriesLabel}\" />\r\n                                                <ItemsControl Name=\"PART_ItemsSeries\" />\r\n\r\n                                                <Label Name=\"PART_ElemSource\" Content=\"{DynamicResource LOCSourceLabel}\" />\r\n                                                <Button Name=\"PART_ButtonSource\" VerticalAlignment=\"Center\" />\r\n\r\n                                                <Label Name=\"PART_ElemRegion\" Content=\"{DynamicResource LOCRegionLabel}\" />\r\n                                                <ItemsControl Name=\"PART_ItemsRegions\" />\r\n\r\n                                                <Label Name=\"PART_ElemVersion\" Content=\"{DynamicResource LOCVersionLabel}\" />\r\n                                                <Button Name=\"PART_ButtonVersion\" VerticalAlignment=\"Center\" />\r\n\r\n                                                <Label Name=\"PART_ElemCommunityScore\" Content=\"{DynamicResource LOCCommunityScore}\" />\r\n                                                <TextBlock Name=\"PART_TextCommunityScore\" VerticalAlignment=\"Center\"\r\n                                                           Style=\"{DynamicResource TextBlockGameScore}\" />\r\n\r\n                                                <Label Name=\"PART_ElemCriticScore\" Content=\"{DynamicResource LOCCriticScore}\" />\r\n                                                <TextBlock Name=\"PART_TextCriticScore\" VerticalAlignment=\"Center\"\r\n                                                           Style=\"{DynamicResource TextBlockGameScore}\" />\r\n\r\n                                                <Label Name=\"PART_ElemUserScore\" Content=\"{DynamicResource LOCUserScore}\" />\r\n                                                <TextBlock Name=\"PART_TextUserScore\" VerticalAlignment=\"Center\"\r\n                                                           Style=\"{DynamicResource TextBlockGameScore}\" />\r\n\r\n                                                <Label Name=\"PART_ElemLinks\" Content=\"{DynamicResource LOCLinksLabel}\" />\r\n                                                <ItemsControl Name=\"PART_ItemsLinks\" />\r\n                                            </GridEx>\r\n                                        </StackPanel>\r\n                                        \r\n                                        <StackPanel Name=\"PART_ElemNotes\" DockPanel.Dock=\"Top\"\r\n                                                    Margin=\"5,0,5,15\">\r\n                                            <TextBlock Text=\"{DynamicResource LOCNotesLabel}\"\r\n                                                       Style=\"{DynamicResource BaseTextBlockStyle}\" />\r\n                                            <Separator Background=\"{DynamicResource PanelSeparatorBrush}\" Margin=\"0,5,0,5\" />\r\n                                            <TextBox Name=\"PART_TextNotes\" IsReadOnly=\"True\"\r\n                                                     BorderThickness=\"0\"\r\n                                                     AcceptsReturn=\"True\" TextWrapping=\"Wrap\"\r\n                                                     Margin=\"-1,0,-1,0\" Padding=\"0\"/>\r\n                                        </StackPanel>\r\n\r\n                                        <StackPanel Name=\"PART_ElemDescription\" DockPanel.Dock=\"Top\"\r\n                                                    Margin=\"5,0,5,0\">\r\n                                            <TextBlock Text=\"{DynamicResource LOCGameDescriptionTitle}\"\r\n                                                       Style=\"{DynamicResource BaseTextBlockStyle}\" />\r\n                                            <Separator Background=\"{DynamicResource PanelSeparatorBrush}\" Margin=\"0,5,0,5\" />\r\n                                            <HtmlTextView Name=\"PART_HtmlDescription\"\r\n                                                          HtmlFontSize=\"{DynamicResource FontSize}\"\r\n                                                          HtmlFontFamily=\"{DynamicResource FontFamily}\"\r\n                                                          HtmlForeground=\"{DynamicResource TextColor}\"\r\n                                                          LinkForeground=\"{DynamicResource GlyphColor}\"                                      \r\n                                                          ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\r\n                                                          ScrollViewer.VerticalScrollBarVisibility=\"Disabled\"/>\r\n                                        </StackPanel>\r\n                                    </DockPanel>\r\n                                </ScrollViewer>\r\n                            </DockPanel>\r\n                        </DockPanel>\r\n                    </Border>                    \r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/Library.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type Library}\">\r\n        <Setter Property=\"Background\" Value=\"Yellow\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Library}\">\r\n                    <Grid d:DesignWidth=\"1500\" d:DesignHeight=\"960\"\r\n                          d:DataContext=\"{x:Static DesignMainViewModel.DesignIntance}\">\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"Auto\" />\r\n                            <RowDefinition Height=\"*\" />\r\n                        </Grid.RowDefinitions>\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition />\r\n                        </Grid.ColumnDefinitions>\r\n\r\n                        <FadeImage x:Name=\"PART_ImageBackground\"\r\n                                   Grid.Row=\"0\" Grid.Column=\"0\" Grid.RowSpan=\"2\"\r\n                                   HorizontalAlignment=\"Center\" VerticalAlignment=\"Top\" />\r\n\r\n                        <TopPanel DockPanel.Dock=\"Top\" Grid.Row=\"0\" />\r\n                        \r\n                        <DockPanel Grid.Row=\"1\">\r\n                            <FilterPanel x:Name=\"PART_FilterPanel\"\r\n                                         DockPanel.Dock=\"{Settings FilterPanelPosition}\"\r\n                                         Width=\"{Settings FilterPanelWitdh}\"\r\n                                         Visibility=\"{Settings FilterPanelVisible}\"/>\r\n\r\n                            <ExplorerPanel Visibility=\"{Settings ExplorerPanelVisible}\"\r\n                                           DockPanel.Dock=\"{Settings ExplorerPanelPosition}\"\r\n                                           Width=\"{Settings ExplorerPanelWitdh}\"/>\r\n                            \r\n                            <Grid DockPanel.Dock=\"Left\">                                \r\n                                <LibraryDetailsView x:Name=\"PART_ViewDetails\" />\r\n                                <LibraryGridView x:Name=\"PART_ViewGrid\" />\r\n                                <LibraryListView x:Name=\"PART_ViewList\" />\r\n                            </Grid>\r\n                        </DockPanel>\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/LibraryDetailsView.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type LibraryDetailsView}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type LibraryDetailsView}\">\r\n                    <DockPanel d:DesignWidth=\"1280\" d:DesignHeight=\"960\"\r\n                               d:DataContext=\"{x:Static DesignMainViewModel.DesignIntance}\">\r\n                        <Grid DockPanel.Dock=\"{Settings DetailsListPosition}\"\r\n                              Width=\"{Settings DetailsListWitdh}\">\r\n                            <ExtendedListBox x:Name=\"PART_ListGames\"\r\n                                         BorderBrush=\"{DynamicResource PanelSeparatorBrush}\"\r\n                                         ItemContainerStyle=\"{DynamicResource DetailsViewItemStyle}\"\r\n                                         ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\r\n                                         ScrollViewer.PanningMode=\"VerticalOnly\">\r\n                                <ExtendedListBox.Style>\r\n                                    <Style TargetType=\"ExtendedListBox\" BasedOn=\"{StaticResource {x:Type ExtendedListBox}}\">\r\n                                        <Setter Property=\"BorderThickness\" Value=\"0,0,1,0\" />\r\n                                        <Style.Triggers>\r\n                                            <DataTrigger Binding=\"{Settings DetailsListPosition}\" Value=\"Right\">\r\n                                                <Setter Property=\"BorderThickness\" Value=\"1,0,0,0\" />\r\n                                            </DataTrigger>\r\n                                            <DataTrigger Binding=\"{Settings ShowPanelSeparators}\" Value=\"False\">\r\n                                                <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n                                            </DataTrigger>\r\n                                        </Style.Triggers>\r\n                                    </Style>\r\n                                </ExtendedListBox.Style>\r\n                                <ExtendedListBox.GroupStyle>\r\n                                    <GroupStyle ContainerStyle=\"{StaticResource DetailsViewGroupStyle}\"/>\r\n                                </ExtendedListBox.GroupStyle>\r\n                                <ExtendedListBox.ItemTemplate>\r\n                                    <DataTemplate>\r\n                                        <GameListItem Style=\"{StaticResource DetailsViewItemTemplate}\" />\r\n                                    </DataTemplate>\r\n                                </ExtendedListBox.ItemTemplate>\r\n                            </ExtendedListBox>\r\n                            <TextBlock FontSize=\"{StaticResource FontSizeLarge}\" Margin=\"0,15,0,0\"\r\n                                       Text=\"{DynamicResource LOCNoItemsFound}\" TextWrapping=\"Wrap\"                                       \r\n                                       TextAlignment=\"Center\" HorizontalAlignment=\"Center\">\r\n                                <TextBlock.Style>\r\n                                    <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                        <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                                        <Style.Triggers>\r\n                                            <DataTrigger Binding=\"{Binding Items.Count, ElementName=PART_ListGames, Mode=OneWay}\" Value=\"0\">\r\n                                                <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                                            </DataTrigger>\r\n                                        </Style.Triggers>\r\n                                    </Style>\r\n                                </TextBlock.Style>\r\n                            </TextBlock>\r\n                        </Grid>\r\n                        <DetailsViewGameOverview x:Name=\"PART_ControlGameView\" DockPanel.Dock=\"Left\" />\r\n                    </DockPanel>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/LibraryGridView.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    mc:Ignorable=\"d\">    \r\n\r\n    <Style TargetType=\"{x:Type LibraryGridView}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type LibraryGridView}\">\r\n                    <DockPanel Background=\"{TemplateBinding Background}\"\r\n                               d:DesignWidth=\"1280\" d:DesignHeight=\"960\"\r\n                               d:DataContext=\"{x:Static DesignMainViewModel.DesignIntance}\">\r\n                        <GridViewGameOverview x:Name=\"PART_ControlGameView\"\r\n                                              Width=\"{Settings GrdiDetailsWitdh}\"\r\n                                              DockPanel.Dock=\"{Settings GridViewDetailsPosition}\" />                   \r\n                        <Grid DockPanel.Dock=\"Left\">\r\n                            <Grid.RowDefinitions>\r\n                                <RowDefinition Height=\"*\" />\r\n                                <RowDefinition Height=\"Auto\" />\r\n                            </Grid.RowDefinitions>\r\n                            <ExtendedListBox x:Name=\"PART_ListGames\" Padding=\"5\"\r\n                                             ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\r\n                                             ScrollViewer.PanningMode=\"VerticalOnly\"\r\n                                             ItemContainerStyle=\"{DynamicResource GridViewItemStyle}\"\r\n                                             DockPanel.Dock=\"Left\"\r\n                                             BorderThickness=\"0\">\r\n                                <ExtendedListBox.ItemTemplate>\r\n                                    <DataTemplate>\r\n                                        <GameListItem Style=\"{StaticResource GridViewItemTemplate}\" />\r\n                                    </DataTemplate>\r\n                                </ExtendedListBox.ItemTemplate>\r\n                                <ExtendedListBox.GroupStyle>\r\n                                    <GroupStyle ContainerStyle=\"{StaticResource GridViewGroupStyle}\"/>\r\n                                </ExtendedListBox.GroupStyle>\r\n                            </ExtendedListBox>\r\n                            <TextBlock FontSize=\"{StaticResource FontSizeLarge}\" Margin=\"0,40,0,0\"\r\n                                       Text=\"{DynamicResource LOCNoItemsFound}\" TextWrapping=\"Wrap\"                                      \r\n                                       TextAlignment=\"Center\" HorizontalAlignment=\"Center\">\r\n                                <TextBlock.Style>\r\n                                    <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                        <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                                        <Style.Triggers>\r\n                                            <DataTrigger Binding=\"{Binding Items.Count, ElementName=PART_ListGames, Mode=OneWay}\" Value=\"0\">\r\n                                                <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                                            </DataTrigger>\r\n                                        </Style.Triggers>\r\n                                    </Style>\r\n                                </TextBlock.Style>\r\n                            </TextBlock>\r\n                            <StackPanel Margin=\"5\" Orientation=\"Horizontal\" Grid.Row=\"1\">\r\n                                <Label Content=\"{DynamicResource LOCZoomLabel}\" Margin=\"10,0,10,0\"/>\r\n                                <SliderWithPopup x:Name=\"PART_SliderZoom\" />\r\n                            </StackPanel>\r\n                        </Grid>\r\n                    </DockPanel>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/LibraryListView.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type LibraryListView}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type LibraryListView}\">\r\n                    <GamesGridView x:Name=\"PART_ListGames\"\r\n                                   d:DesignWidth=\"1280\" d:DesignHeight=\"960\"\r\n                                   d:DataContext=\"{x:Static DesignMainViewModel.DesignIntance}\"/>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/MainWindow.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type MainWindow}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type MainWindow}\">\r\n                    <Border Background=\"{TemplateBinding Background}\"\r\n                            BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            d:DesignWidth=\"1280\" d:DesignHeight=\"960\">\r\n                        <Grid>\r\n                            <Grid.RowDefinitions>\r\n                                <RowDefinition />\r\n                            </Grid.RowDefinitions>\r\n                            <Grid.ColumnDefinitions>\r\n                                <ColumnDefinition />\r\n                            </Grid.ColumnDefinitions>\r\n                            <Grid.Resources>      \r\n                                <Storyboard x:Key=\"VisibilityOn\">\r\n                                    <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty=\"Margin\"\r\n                                                 Storyboard.TargetName=\"PART_Notifications\">\r\n                                        <SplineThicknessKeyFrame KeyTime=\"00:00:00\" Value=\"-260,0,0,0\" />\r\n                                        <SplineThicknessKeyFrame KeyTime=\"0:0:0.10\" Value=\"0,0,0,0\" />\r\n                                    </ThicknessAnimationUsingKeyFrames>\r\n                                </Storyboard>\r\n                                <Storyboard x:Key=\"VisibilityOff\">\r\n                                    <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty=\"Margin\"\r\n                                                 Storyboard.TargetName=\"PART_Notifications\">\r\n                                        <SplineThicknessKeyFrame KeyTime=\"00:00:00\" Value=\"0,0,0,0\" />\r\n                                        <SplineThicknessKeyFrame KeyTime=\"0:0:0.10\" Value=\"-260,0,0,0\" />\r\n                                    </ThicknessAnimationUsingKeyFrames>\r\n                                </Storyboard>\r\n                            </Grid.Resources>\r\n                            \r\n                            <DockPanel>\r\n                                <Sidebar x:Name=\"PART_Sidebar\" Panel.ZIndex=\"999\"\r\n                                         DockPanel.Dock=\"{Settings SidebarPosition}\" />                             \r\n                                <ContentControl Name=\"PART_ContentView\"\r\n                                                DockPanel.Dock=\"Top\" />\r\n                            </DockPanel>                            \r\n                            <NotificationPanel x:Name=\"PART_Notifications\"  \r\n                                               WindowChrome.IsHitTestVisibleInChrome=\"True\"\r\n                                               Width=\"260\"\r\n                                               Grid.Row=\"0\" Grid.Column=\"0\" Grid.RowSpan=\"2\"\r\n                                               HorizontalAlignment=\"Left\" VerticalAlignment=\"Stretch\"\r\n                                               AnimatedVisibility.Visibility=\"{Settings NotificationPanelVisible}\"\r\n                                               AnimatedVisibility.Visible=\"{StaticResource VisibilityOn}\"\r\n                                               AnimatedVisibility.Collapsed=\"{StaticResource VisibilityOff}\"/>\r\n                        </Grid>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/NotificationPanel.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type NotificationPanel}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"NotificationPanel\">\r\n                    <DockPanel Background=\"{DynamicResource PopupBackgroundBrush}\"\r\n                               d:DesignWidth=\"260\" d:DesignHeight=\"400\"\r\n                               d:DataContext=\"{x:Static DesignMainViewModel.DesignIntance}\">\r\n                        <DockPanel Margin=\"13,15,7,15\" DockPanel.Dock=\"Top\">\r\n                            <Button Name=\"PART_ButtonClose\" Content=\"r\" FontFamily=\"Marlett\"\r\n                                    Style=\"{StaticResource SimpleButton}\"\r\n                                    DockPanel.Dock=\"Right\" Margin=\"0,0,5,0\" />\r\n                            <Button Name=\"PART_ButtonDismissAll\" DockPanel.Dock=\"Left\"\r\n                                    HorizontalAlignment=\"Left\"\r\n                                    Style=\"{StaticResource SimpleButton}\"\r\n                                    Content=\"{DynamicResource LOCDismissAll}\" />\r\n                        </DockPanel>\r\n                        <ItemsControl Name=\"PART_ItemsMessages\" DockPanel.Dock=\"Top\" >\r\n                            <ItemsControl.ItemTemplate>\r\n                                <DataTemplate>\r\n                                    <Button Style=\"{StaticResource NotificationMessage}\" />\r\n                                </DataTemplate>\r\n                            </ItemsControl.ItemTemplate>\r\n                            <ItemsControl.Template>\r\n                                <ControlTemplate>\r\n                                    <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\"\r\n                                                  VerticalScrollBarVisibility=\"Auto\">\r\n                                        <ItemsPresenter />\r\n                                    </ScrollViewer>\r\n                                </ControlTemplate>\r\n                            </ItemsControl.Template>\r\n                        </ItemsControl>\r\n                    </DockPanel>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary> "
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/SearchView.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type SearchWindowGameItem}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type SearchWindowGameItem}\">\r\n                    <DockPanel Margin=\"5,5,5,5\">\r\n                        <Image Name=\"PART_ImageGameIcon\"\r\n                               VerticalAlignment=\"Center\" Height=\"32\" Width=\"32\" DockPanel.Dock=\"Left\"\r\n                               RenderOptions.BitmapScalingMode=\"Fant\" >\r\n                            <Image.Style>\r\n                                <Style TargetType=\"Image\">\r\n                                    <Style.Triggers>\r\n                                        <DataTrigger Binding=\"{Binding GameView.IsInstalled}\" Value=\"False\">\r\n                                            <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n                                        </DataTrigger>\r\n                                    </Style.Triggers>\r\n                                </Style>\r\n                            </Image.Style>\r\n                        </Image>\r\n            \r\n                        <StackPanel Margin=\"10,0,0,0\" VerticalAlignment=\"Center\" DockPanel.Dock=\"Left\">\r\n                            <StackPanel Orientation=\"Horizontal\">\r\n                                <TextBlock Name=\"PART_TextName\"\r\n                                           FontWeight=\"SemiBold\" FontSize=\"{DynamicResource FontSizeLarge}\"\r\n                                           VerticalAlignment=\"Center\" Margin=\"0,0,5,0\">\r\n                                    <TextBlock.Style>\r\n                                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                            <Style.Triggers>\r\n                                                <DataTrigger Binding=\"{Binding GameView.IsInstalled}\" Value=\"False\">\r\n                                                    <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n                                                </DataTrigger>\r\n                                            </Style.Triggers>\r\n                                        </Style>\r\n                                    </TextBlock.Style>\r\n                                </TextBlock>\r\n                                <Image Name=\"PART_ImageLibraryIcon\"\r\n                                       VerticalAlignment=\"Center\" Height=\"18\" Width=\"18\"\r\n                                       RenderOptions.BitmapScalingMode=\"Fant\" Margin=\"5,0,5,0\" />\r\n                                <TextBlock Name=\"PART_ElemHiddenStatus\"\r\n                                           Text=\"&#xef22;\" FontFamily=\"{StaticResource FontIcoFont}\" FontSize=\"16\"\r\n                                           VerticalAlignment=\"Center\" Margin=\"5,0,5,0\" />\r\n                            </StackPanel>\r\n\r\n                            <ItemsControl Name=\"PART_ItemsAdditionalInfo\" Margin=\"0,5,0,0\">\r\n                                <ItemsControl.ItemTemplate>\r\n                                    <DataTemplate>\r\n                                        <TextBlock Foreground=\"{DynamicResource TextBrushDarker}\">\r\n                                            <TextBlock.Style>\r\n                                                <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                                    <Setter Property=\"Margin\" Value=\"5,0,0,0\" />\r\n                                                    <Setter Property=\"Text\" Value=\"{Binding '', StringFormat='- {0}'}\" />\r\n                                                    <Style.Triggers>\r\n                                                        <DataTrigger Binding=\"{Binding RelativeSource={RelativeSource PreviousData}}\" Value=\"{x:Null}\">\r\n                                                            <Setter Property=\"Margin\" Value=\"0\" />\r\n                                                            <Setter Property=\"Text\" Value=\"{Binding}\" />\r\n                                                        </DataTrigger>\r\n                                                    </Style.Triggers>\r\n                                                </Style>\r\n                                            </TextBlock.Style>\r\n                                        </TextBlock>\r\n                                    </DataTemplate>\r\n                                </ItemsControl.ItemTemplate>\r\n                                <ItemsControl.ItemsPanel>\r\n                                    <ItemsPanelTemplate>\r\n                                        <StackPanel Orientation=\"Horizontal\" />    \r\n                                    </ItemsPanelTemplate>\r\n                                </ItemsControl.ItemsPanel>\r\n                            </ItemsControl>\r\n                        </StackPanel>\r\n                    </DockPanel>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <DataTemplate x:Key=\"SearchWindowGameItemTemplate\">\r\n        <SearchWindowGameItem />\r\n    </DataTemplate>\r\n\r\n    <Style TargetType=\"{x:Type SearchWindowSearchItem}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type SearchWindowSearchItem}\">\r\n                    <StackPanel Orientation=\"Horizontal\" Margin=\"5,2,5,2\">\r\n                        <Viewbox Width=\"32\" Height=\"32\" VerticalAlignment=\"Center\">\r\n                            <ContentControl Name=\"PART_ContentIcon\"\r\n                                            Focusable=\"False\" VerticalAlignment=\"Center\" Margin=\"4\" />\r\n                        </Viewbox>\r\n                        <StackPanel Margin=\"10,0,0,0\" VerticalAlignment=\"Center\" >\r\n                            <TextBlock Name=\"PART_TextName\"\r\n                                       VerticalAlignment=\"Center\" FontWeight=\"Normal\" FontSize=\"{DynamicResource FontSizeLarge}\" />\r\n                            <TextBlock Name=\"PART_TextDescription\"\r\n                                       Foreground=\"{DynamicResource TextBrushDarker}\"\r\n                                       Margin=\"0,5,0,0\" VerticalAlignment=\"Center\"/>\r\n                        </StackPanel>\r\n                    </StackPanel>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <DataTemplate x:Key=\"SearchWindowSearchItemTemplate\">\r\n        <SearchWindowSearchItem />\r\n    </DataTemplate>\r\n\r\n    <Style x:Key=\"SearchWindowSearchLabelButton\" TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n        <Setter Property=\"WindowChrome.IsHitTestVisibleInChrome\" Value=\"True\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Margin\" Value=\"0,0,5,0\" />\r\n        <Setter Property=\"ContentTemplate\">\r\n            <Setter.Value>\r\n                <DataTemplate>\r\n                    <StackPanel Orientation=\"Horizontal\">\r\n                        <TextBlock Text=\"{Binding}\" TextTrimming=\"CharacterEllipsis\" MaxWidth=\"100\" Margin=\"0,0,4,0\"/>\r\n                        <TextBlock Text=\"&#xeee4;\" FontFamily=\"{StaticResource FontIcoFont}\" />\r\n                    </StackPanel>\r\n                </DataTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"SearchWindowActionButton\" TargetType=\"ToggleButton\" BasedOn=\"{StaticResource {x:Type ToggleButton}}\">\r\n        <Setter Property=\"WindowChrome.IsHitTestVisibleInChrome\" Value=\"True\" />        \r\n        <Setter Property=\"Margin\" Value=\"5,0,5,0\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"SearchWindowInfoButton\" TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n        <Setter Property=\"WindowChrome.IsHitTestVisibleInChrome\" Value=\"True\" />\r\n        <Setter Property=\"FontSize\" Value=\"20\" />\r\n        <Setter Property=\"Margin\" Value=\"10,0,5,0\" />\r\n        <Setter Property=\"Padding\" Value=\"0\" />\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Content\" Value=\"&#xef50;\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{StaticResource FontIcoFont}\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"SearchWindowSettignsButton\" TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n        <Setter Property=\"WindowChrome.IsHitTestVisibleInChrome\" Value=\"True\" />\r\n        <Setter Property=\"FontSize\" Value=\"20\" />\r\n        <Setter Property=\"Margin\" Value=\"5,0,5,0\" />\r\n        <Setter Property=\"Padding\" Value=\"0\" />\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Content\" Value=\"&#xefb0;\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{StaticResource FontIcoFont}\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"SearchWindowStyle\" TargetType=\"WindowBase\" BasedOn=\"{StaticResource StandardWindowStyle}\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource NormalBrushDark}\" />\r\n        <Setter Property=\"Width\" Value=\"800\" />\r\n        <Setter Property=\"SizeToContent\" Value=\"Height\" />\r\n    </Style>\r\n\r\n    <ControlTemplate x:Key=\"SearchWindowFilterNotification\" TargetType=\"ContentControl\">\r\n        <Border Background=\"{DynamicResource NormalBrushDark}\"\r\n                HorizontalAlignment=\"Stretch\">\r\n            <TextBlock FontSize=\"{DynamicResource FontSizeLarge}\" VerticalAlignment=\"Center\"\r\n                       Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                       Text=\"{TemplateBinding Content}\" Margin=\"10,0,0,0\" />\r\n        </Border>\r\n    </ControlTemplate>\r\n\r\n    <Style x:Key=\"SearchWindowSearchBox\" TargetType=\"TextBox\" BasedOn=\"{StaticResource {x:Type TextBox}}\">\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n        <Setter Property=\"WindowChrome.IsHitTestVisibleInChrome\" Value=\"True\" />\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSizeLarger}\" />\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"SearchWindowSearchDescription\" TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n        <Setter Property=\"Margin\" Value=\"5,0,0,0\" />\r\n        <Setter Property=\"Foreground\" Value=\"LightGray\" />\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSizeLarge}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"SearchWindowSearchHint\" TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n        <Setter Property=\"Margin\" Value=\"10\" />\r\n        <Setter Property=\"TextWrapping\" Value=\"Wrap\" />\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSizeLarge}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"SearchWindowList\" TargetType=\"ListBox\" BasedOn=\"{StaticResource {x:Type ListBox}}\">\r\n        <Setter Property=\"ScrollViewer.HorizontalScrollBarVisibility\" Value=\"Disabled\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n        <Setter Property=\"MaxHeight\" Value=\"600\" />\r\n        <Setter Property=\"ItemContainerStyle\">\r\n            <Setter.Value>\r\n                <Style TargetType=\"{x:Type ListBoxItem}\">\r\n                    <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n                    <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n                    <Setter Property=\"OverridesDefaultStyle\" Value=\"True\" />\r\n                    <Setter Property=\"Padding\" Value=\"3\" />\r\n                    <Setter Property=\"Margin\" Value=\"0\" />\r\n                    <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\r\n                    <Setter Property=\"VerticalAlignment\" Value=\"Stretch\" />\r\n                    <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\r\n                    <Setter Property=\"Template\">\r\n                        <Setter.Value>\r\n                            <ControlTemplate TargetType=\"{x:Type ListBoxItem}\">\r\n                                <Grid>\r\n                                    <Border x:Name=\"HoverRectangle\" IsHitTestVisible=\"False\" Visibility=\"Collapsed\"\r\n                                            Background=\"#003f59\" CornerRadius=\"{DynamicResource ControlCornerRadius}\" />\r\n                                    <Border x:Name=\"SelectedRectangle\" IsHitTestVisible=\"False\" Visibility=\"Collapsed\"\r\n                                            Background=\"#003f59\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"/>\r\n                                    <Border Padding=\"{TemplateBinding Padding}\" Background=\"Transparent\">\r\n                                        <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                              VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                              Margin=\"3,0,0,0\" />\r\n                                    </Border>\r\n                                </Grid>\r\n                                <ControlTemplate.Triggers>\r\n                                    <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                                        <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectedRectangle\" />\r\n                                    </Trigger>\r\n                                    <Trigger Property=\"IsSelected\" Value=\"true\">\r\n                                        <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectedRectangle\" />\r\n                                    </Trigger>\r\n                                    <MultiTrigger>\r\n                                        <MultiTrigger.Conditions>\r\n                                            <Condition Property=\"IsMouseOver\" Value=\"True\" />\r\n                                            <Condition Property=\"Selector.IsSelected\" Value=\"False\" />\r\n                                        </MultiTrigger.Conditions>\r\n                                        <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"HoverRectangle\" />\r\n                                    </MultiTrigger>\r\n                                </ControlTemplate.Triggers>\r\n                            </ControlTemplate>\r\n                        </Setter.Value>\r\n                    </Setter>\r\n                </Style>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/Sidebar.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n    \r\n    <Style TargetType=\"{x:Type Sidebar}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Sidebar}\">\r\n                    <Border BorderThickness=\"0,0,1,0\" BorderBrush=\"{DynamicResource PanelSeparatorBrush}\"\r\n                            x:Name=\"BorderContentHolder\" Margin=\"{TemplateBinding Padding}\">\r\n                        <DockPanel x:Name=\"DockContentHolder\">                            \r\n                            <Border x:Name=\"PART_ElemMainMenu\" Background=\"Transparent\"\r\n                                    Width=\"44\" Height=\"44\" Margin=\"0,0,0,5\"\r\n                                    DockPanel.Dock=\"Top\" Padding=\"5\" Cursor=\"Hand\"\r\n                                    WindowChrome.IsHitTestVisibleInChrome=\"True\">\r\n                                <Image Source=\"{ThemeFile 'Images/applogo.png'}\"\r\n                                       RenderOptions.BitmapScalingMode=\"Fant\" />\r\n                            </Border>\r\n\r\n                            <ScrollViewer HorizontalScrollBarVisibility=\"Auto\" VerticalScrollBarVisibility=\"Hidden\"\r\n                                          DockPanel.Dock=\"Top\" CanContentScroll=\"True\"\r\n                                          x:Name=\"ScrollSidebarItems\">\r\n                                <StackPanel x:Name=\"PART_PanelSideBarItems\" Orientation=\"Vertical\" />\r\n                            </ScrollViewer> \r\n                        </DockPanel>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <DataTrigger Binding=\"{Settings SidebarPosition}\" Value=\"Right\">\r\n                            <Setter Property=\"Padding\" Value=\"0,25,0,0\" />\r\n                            <Setter Property=\"Margin\" Value=\"0,0,0,5\" TargetName=\"PART_ElemMainMenu\" />\r\n                            <Setter Property=\"BorderThickness\" Value=\"1,0,0,0\" TargetName=\"BorderContentHolder\" />\r\n                        </DataTrigger>\r\n                        <DataTrigger Binding=\"{Settings SidebarPosition}\" Value=\"Top\">\r\n                            <Setter Property=\"Margin\" Value=\"0,0,5,0\" TargetName=\"PART_ElemMainMenu\" />\r\n                            <Setter Property=\"BorderThickness\" Value=\"0,0,0,1\" TargetName=\"BorderContentHolder\" />\r\n                            <Setter Property=\"DockPanel.Dock\" Value=\"Left\" TargetName=\"PART_ElemMainMenu\" />\r\n                            <Setter Property=\"DockPanel.Dock\" Value=\"Left\" TargetName=\"ScrollSidebarItems\" />\r\n                            <Setter Property=\"Margin\" Value=\"0,0,100,0\" TargetName=\"ScrollSidebarItems\" />\r\n                            <Setter Property=\"Orientation\" Value=\"Horizontal\" TargetName=\"PART_PanelSideBarItems\" />\r\n                        </DataTrigger>\r\n                        <DataTrigger Binding=\"{Settings SidebarPosition}\" Value=\"Bottom\">\r\n                            <Setter Property=\"Margin\" Value=\"0,0,5,0\" TargetName=\"PART_ElemMainMenu\" />\r\n                            <Setter Property=\"BorderThickness\" Value=\"0,1,0,0\" TargetName=\"BorderContentHolder\" />\r\n                            <Setter Property=\"DockPanel.Dock\" Value=\"Left\" TargetName=\"PART_ElemMainMenu\" />\r\n                            <Setter Property=\"DockPanel.Dock\" Value=\"Left\" TargetName=\"ScrollSidebarItems\" />\r\n                            <Setter Property=\"Orientation\" Value=\"Horizontal\" TargetName=\"PART_PanelSideBarItems\" />\r\n                        </DataTrigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/Views/TopPanel.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <DataTemplate x:Key=\"TopPanelGeneralViewSettingsTemplate\">\r\n        <TextBlock Text=\"&#xefe2;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"18\"                   \r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"TopPanelFilterPresetsSelectionTemplate\">\r\n        <TextBlock Text=\"&#xeec0;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"20\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"TopPanelGroupSettingsTemplate\">\r\n        <TextBlock Text=\"&#xee03;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"20\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"TopPanelSortSettingsTemplate\">\r\n        <TextBlock Text=\"&#xefee;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"20\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"TopPanelSwitchDetailsViewTemplate\">\r\n        <TextBlock Text=\"&#xE145;\" FontFamily=\"Segoe UI Symbol\" FontSize=\"20\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"TopPanelSwitchGridViewTemplate\">\r\n        <TextBlock Text=\"&#xE138;\" FontFamily=\"Segoe UI Symbol\" FontSize=\"20\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"TopPanelSwitchListViewTemplate\">\r\n        <TextBlock Text=\"&#xE14C;\" FontFamily=\"Segoe UI Symbol\" FontSize=\"20\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n    \r\n    <DataTemplate x:Key=\"TopPanelUpdateButtonTemplate\">\r\n        <TextBlock Foreground=\"{DynamicResource WarningBrush}\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"\r\n                   Text=\"&#xef08;\" FontSize=\"24\" FontFamily=\"{DynamicResource FontIcoFont}\"/>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"TopPanelExplorerSwitchTemplate\">\r\n        <TextBlock Text=\"&#xeeed;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"20\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"TopPanelSelectRandomGameButtonTemplate\">\r\n        <TextBlock Text=\"&#xef03;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"20\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"TopPanelViewSelectRandomGameButtonTemplate\">\r\n        <TextBlock Text=\"&#xefcf;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"20\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n    \r\n    <DataTemplate x:Key=\"TopPanelSearchButtonTemplate\">\r\n        <TextBlock Text=\"&#xed12;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"20\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <Style x:Key=\"TopPanelMenu\" TargetType=\"{x:Type ContextMenu}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource PopupBackgroundBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource PopupBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource PopupBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ContextMenu}\">\r\n                    <Border BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                            BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            Background=\"{TemplateBinding Background}\"\r\n                            Grid.IsSharedSizeScope=\"True\">\r\n                        <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\">\r\n                            <ItemsPresenter KeyboardNavigation.DirectionalNavigation=\"Cycle\"/>\r\n                        </ScrollViewer>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"TopPanelFilterToggle\" TargetType=\"CheckBox\">\r\n        <Setter Property=\"MinWidth\" Value=\"35\" />\r\n        <Setter Property=\"WindowChrome.IsHitTestVisibleInChrome\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"#990a0e1e\" />\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Margin\" Value=\"10,6,0,6\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate>\r\n                    <Border Background=\"{TemplateBinding Background}\" BorderThickness=\"0\"\r\n                            CornerRadius=\"3\">\r\n                        <StackPanel Orientation=\"Horizontal\" Margin=\"6,0,6,0\">\r\n                            <TextBlock Text=\"&#xef29;\"\r\n                                       FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"20\"\r\n                                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"\r\n                                       Foreground=\"{TemplateBinding Foreground}\"/>\r\n                            <TextBlock Text=\"{DynamicResource LOCFilterActiveLabel}\"\r\n                                       Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                       Margin=\"3,0,0,0\" VerticalAlignment=\"Center\"\r\n                                       Name=\"TextFilter\" />\r\n                        </StackPanel>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"Tag\" Value=\"{StaticResource True}\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"TextFilter\" />\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource NormalBrush}\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"Tag\" Value=\"{StaticResource False}\">\r\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"TextFilter\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n\r\n    <Style x:Key=\"TopPanelNotificationsToggle\" TargetType=\"ToggleButton\">\r\n        <Setter Property=\"Margin\" Value=\"10,6,0,6\" />\r\n        <Setter Property=\"MinWidth\" Value=\"35\" />\r\n        <Setter Property=\"WindowChrome.IsHitTestVisibleInChrome\" Value=\"True\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate>\r\n                    <Border Background=\"Transparent\">\r\n                        <Grid>\r\n                            <TextBlock Text=\"&#xeea3;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                                       Foreground=\"{TemplateBinding Foreground}\"\r\n                                       HorizontalAlignment=\"Center\"/>\r\n                            <Border CornerRadius=\"3\" Width=\"15\" Height=\"15\"\r\n                                    Margin=\"20,0,0,0\" Background=\"OrangeRed\"\r\n                                    HorizontalAlignment=\"Right\" VerticalAlignment=\"Bottom\">\r\n                                <TextBlock Text=\"{Api Notifications.Count}\" FontSize=\"12\"\r\n                                           Foreground=\"{DynamicResource TextBrush}\"\r\n                                           HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                            </Border>\r\n                        </Grid>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <DataTrigger Binding=\"{Api Notifications.Count}\" Value=\"0\">\r\n                <Setter Property=\"Visibility\" Value=\"Collapsed\"/>\r\n            </DataTrigger>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type TopPanel}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type TopPanel}\">\r\n                    <Border Height=\"50\" BorderBrush=\"{DynamicResource PanelSeparatorBrush}\"\r\n                            Background=\"{TemplateBinding Background}\"\r\n                            d:DesignWidth=\"1280\"\r\n                            d:DataContext=\"{x:Static DesignMainViewModel.DesignIntance}\">\r\n                        <Border.Style>\r\n                            <Style TargetType=\"Border\">\r\n                                <Setter Property=\"BorderThickness\" Value=\"0,0,0,1\" />\r\n                                <Style.Triggers>\r\n                                    <DataTrigger Binding=\"{Settings ShowPanelSeparators}\" Value=\"False\">\r\n                                        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n                                    </DataTrigger>\r\n                                </Style.Triggers>\r\n                            </Style>\r\n                        </Border.Style>\r\n                        <DockPanel Margin=\"0,3,110,3\">\r\n                            <Border x:Name=\"PART_ElemMainMenu\" Background=\"Transparent\"\r\n                                    DockPanel.Dock=\"Left\" Margin=\"5,0,0,0\" Cursor=\"Hand\"\r\n                                    WindowChrome.IsHitTestVisibleInChrome=\"True\">\r\n                                <Image Source=\"{ThemeFile 'Images/applogo.png'}\"\r\n                                       Height=\"40\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n                                       Margin=\"10,0,5,0\"/>\r\n                            </Border>\r\n\r\n                            <SearchBox x:Name=\"PART_TextMainSearch\"\r\n                                        Margin=\"5,6,0,6\" DockPanel.Dock=\"Left\"\r\n                                        WindowChrome.IsHitTestVisibleInChrome=\"True\"\r\n                                        Width=\"300\" />\r\n\r\n                            <StackPanel x:Name=\"PART_PanelMainItems\" Orientation=\"Horizontal\"\r\n                                        VerticalAlignment=\"Stretch\" Margin=\"0,6,0,6\"/>\r\n\r\n                            <CheckBox x:Name=\"PART_ToggleFilter\" ToolTip=\"{DynamicResource LOCFilters}\"\r\n                                      Style=\"{DynamicResource TopPanelFilterToggle}\"\r\n                                      DockPanel.Dock=\"Left\" />\r\n\r\n                            <CheckBox x:Name=\"PART_ToggleNotifications\"\r\n                                      Style=\"{DynamicResource TopPanelNotificationsToggle}\"\r\n                                      DockPanel.Dock=\"Left\" />\r\n\r\n                            <StackPanel x:Name=\"PART_PanelMainPluginItems\" Orientation=\"Horizontal\"\r\n                                        VerticalAlignment=\"Stretch\" Margin=\"15,6,15,6\"\r\n                                        DockPanel.Dock=\"{Settings PluginTopPanelAlignment}\"/>\r\n\r\n                            <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Left\"\r\n                                        HorizontalAlignment=\"Center\" Margin=\"0,5,0,5\">\r\n                                <Grid MaxWidth=\"600\" MinWidth=\"300\">\r\n                                    <ProgressBar Name=\"PART_ProgressGlobal\" />\r\n                                    <TextBlock Name=\"PART_TextProgressText\"\r\n                                               VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"\r\n                                               Style=\"{DynamicResource BaseTextBlockStyle}\" Margin=\"5,0,5,0\" />\r\n                                </Grid>\r\n\r\n                                <Button Name=\"PART_ButtonProgressCancel\"\r\n                                        Content=\"{DynamicResource LOCCancelLabel}\"\r\n                                        WindowChrome.IsHitTestVisibleInChrome=\"True\"\r\n                                        Margin=\"5,0,0,0\" />\r\n                            </StackPanel>                    \r\n                        </DockPanel>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Desktop/Default/theme.yaml",
    "content": "﻿Id: Playnite_builtin_DefaultDesktop\r\nName: Default\r\nAuthor: Playnite\r\nVersion: 1.0\r\nThemeApiVersion: 2.0.0"
  },
  {
    "path": "source/Playnite.DesktopApp/Themes/Generic.xaml",
    "content": "<ResourceDictionary\r\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/AboutViewModel.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.Services;\r\nusing Playnite.Settings;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.Windows;\r\nusing Playnite.Common;\r\nusing Playnite.ViewModels;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class AboutViewModel : ObservableObject\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private IDialogsFactory dialogs;\r\n        private IResourceProvider resources;\r\n        private ServicesClient client;\r\n\r\n        public string VersionInfo\r\n        {\r\n            get\r\n            {\r\n                return \"Playnite \" + Updater.CurrentVersion.ToString(2);\r\n            }\r\n        }\r\n\r\n        public string SDKVersion\r\n        {\r\n            get\r\n            {\r\n                return \"SDK: \" + Playnite.SDK.SdkVersions.SDKVersion.ToString(3);\r\n            }\r\n        }\r\n\r\n        public string ThemeApiVersion\r\n        {\r\n            get\r\n            {\r\n                return \"Theme API: \" + ThemeManager.DesktopApiVersion.ToString(3);\r\n            }\r\n        }\r\n\r\n        public bool IsPortable\r\n        {\r\n            get\r\n            {\r\n                return PlaynitePaths.IsPortable;\r\n            }\r\n        }\r\n\r\n        public string InstallDir\r\n        {\r\n            get => PlaynitePaths.ProgramPath;\r\n        }\r\n\r\n        public string UserDir\r\n        {\r\n            get => PlaynitePaths.ConfigRootPath;\r\n        }\r\n\r\n        public string Contributors\r\n        {\r\n            get\r\n            {\r\n                return Resources.ReadFileFromResource(\"Playnite.DesktopApp.Resources.contributors.txt\");\r\n            }\r\n        }\r\n\r\n        private string patronsList;\r\n        public string PatronsList\r\n        {\r\n            get\r\n            {\r\n                if (PlayniteEnvironment.InOfflineMode)\r\n                {\r\n                    return string.Empty;\r\n                }\r\n\r\n                try\r\n                {\r\n                    if (patronsList == null)\r\n                    {\r\n                        patronsList = string.Join(Environment.NewLine, client.GetPatrons());\r\n                    }\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, \"Failed to get patron list.\");\r\n                }\r\n\r\n                return patronsList;\r\n            }\r\n        }\r\n\r\n        public string PatronsListDownloading\r\n        {\r\n            get => resources.GetString(\"LOCDownloadingLabel\");\r\n        }\r\n\r\n        public RelayCommand<object> CreateDiagPackageCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CreateDiagPackage();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> CloseCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> OpenLicensesCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ProcessStarter.StartProcess(Path.Combine(PlaynitePaths.ProgramPath, \"license.txt\"));\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> NavigateUrlCommand => GlobalCommands.NavigateUrlCommand;\r\n\r\n        public AboutViewModel(IWindowFactory window, IDialogsFactory dialogs, IResourceProvider resources, ServicesClient client)\r\n        {\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            this.client = client;\r\n        }\r\n\r\n        public void OpenView()\r\n        {\r\n            window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView()\r\n        {\r\n            window.Close();\r\n        }\r\n\r\n        public void CreateDiagPackage()\r\n        {\r\n            CrashHandlerViewModel.CreateDiagPackage(dialogs);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/ActionSelectionViewModel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Services;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class ActionSelectionViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n\r\n        public List<SelectableItem<object>> Actions { get; set; }\r\n        public object SelectedAction { get; set; }\r\n\r\n        public RelayCommand<object> PlayCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectedAction = Actions.FirstOrDefault(i => i.Selected == true)?.Item;\r\n                window.Close(true);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> PlaySpecificCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectedAction = a;\r\n                window.Close(true);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                window.Close(null);\r\n            });\r\n        }\r\n\r\n        public ActionSelectionViewModel(IWindowFactory window)\r\n        {\r\n            this.window = window;\r\n        }\r\n\r\n        public object SelectPlayAction(List<PlayController> controllers, List<GameAction> actions)\r\n        {\r\n            if (!actions.HasItems() && !controllers.HasItems())\r\n            {\r\n                throw new ArgumentNullException(\"Not actions provided!\");\r\n            }\r\n\r\n            Actions = new List<SelectableItem<object>>();\r\n            if (controllers.HasItems())\r\n            {\r\n                Actions.AddRange(controllers.Select(a => new SelectableItem<object>(a)));\r\n            }\r\n\r\n            if (actions.HasItems())\r\n            {\r\n                Actions.AddRange(actions.Select(a => new SelectableItem<object>(a)));\r\n            }\r\n\r\n            Actions[0].Selected = true;\r\n            if (window.CreateAndOpenDialog(this) == true)\r\n            {\r\n                return SelectedAction;\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public InstallController SelectInstallAction(List<InstallController> pluginActions)\r\n        {\r\n            if (!pluginActions.HasItems())\r\n            {\r\n                throw new ArgumentNullException(\"Not install action provided!\");\r\n            }\r\n\r\n            Actions = pluginActions.Select(a => new SelectableItem<object>(a)).ToList();\r\n            Actions[0].Selected = true;\r\n            if (window.CreateAndOpenDialog(this) == true)\r\n            {\r\n                return (InstallController)SelectedAction;\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public UninstallController SelectUninstallAction(List<UninstallController> pluginActions)\r\n        {\r\n            if (!pluginActions.HasItems())\r\n            {\r\n                throw new ArgumentNullException(\"Not uninstall action provided!\");\r\n            }\r\n\r\n            Actions = pluginActions.Select(a => new SelectableItem<object>(a)).ToList();\r\n            Actions[0].Selected = true;\r\n            if (window.CreateAndOpenDialog(this) == true)\r\n            {\r\n                return (UninstallController)SelectedAction;\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/AddonsViewModel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Services;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public partial class AddonsViewModel : Playnite.ViewModels.AddonsViewModelBase\r\n    {\r\n        private enum View : int\r\n        {\r\n            InstalledLibraries = 0,\r\n            InstalledMetadata = 1,\r\n            InstalledGeneric = 2,\r\n            InstalledThemesDesktop = 3,\r\n            InstalledThemesFullscreen = 4,\r\n            BrowseLibraries = 5,\r\n            BrowseMetadata = 6,\r\n            BrowseGeneric = 7,\r\n            BrowseThemesDesktop = 8,\r\n            BrowseThemesFullscreen = 9,\r\n            Updates = 10,\r\n            None = 99\r\n        }\r\n\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private ServicesClient serviceClient;\r\n        private PlayniteSettings settings;\r\n        private Dictionary<View, UserControl> sectionViews;\r\n        private PlayniteApplication application;\r\n        private bool closingHanled = false;\r\n        private Dictionary<Guid, PluginSettingsItem> loadedPluginSettings = new Dictionary<Guid, PluginSettingsItem>();\r\n\r\n        public ExtensionFactory Extensions { get; set; }\r\n        public List<LibraryPlugin> LibraryPlugins { get; set; }\r\n        public List<MetadataPlugin> MetadataPlugins { get; set; }\r\n\r\n        private UserControl selectedSectionView;\r\n        public UserControl SelectedSectionView\r\n        {\r\n            get => selectedSectionView;\r\n            set\r\n            {\r\n                selectedSectionView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public List<LoadedPlugin> GenericPlugins\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        public bool AnyGenericPluginSettings\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        public RelayCommand<InstalledPlugin> UninstallExtensionCommand\r\n        {\r\n            get => new RelayCommand<InstalledPlugin>((a) =>\r\n            {\r\n                UninstallExtension(a);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<ThemeManifest> UninstallThemeCommand\r\n        {\r\n            get => new RelayCommand<ThemeManifest>((a) =>\r\n            {\r\n                UninstallTheme(a);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<InstalledPlugin> OpenExtensionDataDirCommand\r\n        {\r\n            get => new RelayCommand<InstalledPlugin>((plugin) =>\r\n            {\r\n                var extDir = string.Empty;\r\n                if (plugin.Description.Type == ExtensionType.Script)\r\n                {\r\n                    if (!plugin.Description.Id.IsNullOrEmpty())\r\n                    {\r\n                        extDir = Path.Combine(PlaynitePaths.ExtensionsDataPath, Paths.GetSafePathName(plugin.Description.Id));\r\n                    }\r\n                }\r\n\r\n                var p = Extensions.Plugins.Values.FirstOrDefault(a => a.Description.DirectoryPath == plugin.Description.DirectoryPath);\r\n                if (p != null)\r\n                {\r\n                    extDir = p.Plugin.GetPluginUserDataPath();\r\n                }\r\n\r\n                if (!extDir.IsNullOrEmpty())\r\n                {\r\n                    try\r\n                    {\r\n                        FileSystem.CreateDirectory(extDir);\r\n                        Process.Start(extDir);\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to open dir {extDir}.\");\r\n                    }\r\n                }\r\n            });\r\n        }\r\n\r\n        public RelayCommand<RoutedPropertyChangedEventArgs<object>> SectionChangedChangedCommand\r\n        {\r\n            get => new RelayCommand<RoutedPropertyChangedEventArgs<object>>((a) =>\r\n            {\r\n                SectionChanged(a);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CancelClose();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> WindowClosingCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                WindowClosing();\r\n            });\r\n        }\r\n\r\n        public AddonsViewModel(\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ServicesClient serviceClient,\r\n            ExtensionFactory extensions,\r\n            PlayniteSettings settings,\r\n            PlayniteApplication application) : base(dialogs, resources)\r\n        {\r\n            Init(\r\n                window,\r\n                dialogs,\r\n                resources,\r\n                serviceClient,\r\n                extensions,\r\n                settings,\r\n                application);\r\n            CheckUpdates();\r\n        }\r\n\r\n        public AddonsViewModel(\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ServicesClient serviceClient,\r\n            ExtensionFactory extensions,\r\n            PlayniteSettings settings,\r\n            PlayniteApplication application,\r\n            List<AddonUpdate> addonUpdates) : base(dialogs, resources)\r\n        {\r\n            Init(\r\n                window,\r\n                dialogs,\r\n                resources,\r\n                serviceClient,\r\n                extensions,\r\n                settings,\r\n                application);\r\n            UpdateAddonList = addonUpdates;\r\n            UpdateAddonCount = addonUpdates.Count;\r\n            IsUpdateSectionSelected = true;\r\n            SelectedSectionView = sectionViews[View.Updates];\r\n        }\r\n\r\n        private void Init(\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ServicesClient serviceClient,\r\n            ExtensionFactory extensions,\r\n            PlayniteSettings settings,\r\n            PlayniteApplication application)\r\n        {\r\n            this.window = window;\r\n            this.serviceClient = serviceClient;\r\n            this.settings = settings;\r\n            this.application = application;\r\n            Extensions = extensions;\r\n            LibraryPlugins = extensions.LibraryPlugins.OrderBy(a => a.Name).ToList();\r\n            MetadataPlugins = extensions.MetadataPlugins.OrderBy(a => a.Name).ToList();\r\n\r\n            sectionViews = new Dictionary<View, UserControl>()\r\n            {\r\n                { View.InstalledLibraries, new Controls.AddonsSections.InstalledExtensions() { DataContext = this } },\r\n                { View.InstalledMetadata, new Controls.AddonsSections.InstalledExtensions() { DataContext = this } },\r\n                { View.InstalledGeneric, new Controls.AddonsSections.InstalledExtensions() { DataContext = this } },\r\n                { View.InstalledThemesDesktop, new Controls.AddonsSections.InstalledThemes() { DataContext = this } },\r\n                { View.InstalledThemesFullscreen, new Controls.AddonsSections.InstalledThemes() { DataContext = this } },\r\n                { View.BrowseLibraries, new Controls.AddonsSections.BrowseAddons() { DataContext = this } },\r\n                { View.BrowseMetadata, new Controls.AddonsSections.BrowseAddons() { DataContext = this } },\r\n                { View.BrowseGeneric, new Controls.AddonsSections.BrowseAddons() { DataContext = this } },\r\n                { View.BrowseThemesDesktop, new Controls.AddonsSections.BrowseAddons() { DataContext = this } },\r\n                { View.BrowseThemesFullscreen, new Controls.AddonsSections.BrowseAddons() { DataContext = this } },\r\n                { View.Updates, new Controls.AddonsSections.AddonUpdates() { DataContext = this } },\r\n                { View.None, null },\r\n            };\r\n\r\n            var descriptions = ExtensionFactory.GetInstalledManifests(settings.DevelExtenions.Where(a => a.Selected == true).Select(a => a.Item).ToList());\r\n            LibraryPluginList = descriptions\r\n                .Where(a => a.Type == ExtensionType.GameLibrary)\r\n                .Select(a => new InstalledPlugin(\r\n                    settings.DisabledPlugins?.Contains(a.Id) != true,\r\n                    Extensions.Plugins.Values.FirstOrDefault(b => a.DescriptionPath == b.Description.DescriptionPath)?.Plugin,\r\n                    a,\r\n                    extensions.FailedExtensions.Any(ext => ext.manifest.DirectoryPath.Equals(a.DirectoryPath))))\r\n                .OrderBy(a => a.Description.Name)\r\n                .ToList();\r\n\r\n            MetadataPluginList = descriptions\r\n                .Where(a => a.Type == ExtensionType.MetadataProvider)\r\n                .Select(a => new InstalledPlugin(\r\n                    settings.DisabledPlugins?.Contains(a.Id) != true,\r\n                    Extensions.Plugins.Values.FirstOrDefault(b => a.DescriptionPath == b.Description.DescriptionPath)?.Plugin,\r\n                    a,\r\n                    extensions.FailedExtensions.Any(ext => ext.manifest.DirectoryPath.Equals(a.DirectoryPath))))\r\n                .OrderBy(a => a.Description.Name)\r\n                .ToList();\r\n\r\n            OtherPluginList = descriptions\r\n                .Where(a => a.Type == ExtensionType.GenericPlugin || a.Type == ExtensionType.Script)\r\n                .Select(a => new InstalledPlugin(\r\n                    settings.DisabledPlugins?.Contains(a.Id) != true,\r\n                    null,\r\n                    a,\r\n                    extensions.FailedExtensions.Any(ext => ext.manifest.DirectoryPath.Equals(a.DirectoryPath))))\r\n                .OrderBy(a => a.Description.Name)\r\n                .ToList();\r\n\r\n            DesktopThemeList = ThemeManager.GetAvailableThemes(ApplicationMode.Desktop).OrderBy(a => a.Name).ToList();\r\n            FullscreenThemeList = ThemeManager.GetAvailableThemes(ApplicationMode.Fullscreen).OrderBy(a => a.Name).ToList();\r\n            GenericPlugins = Extensions.Plugins.Values.Where(a => a.Description.Type == ExtensionType.GenericPlugin && ((GenericPlugin)a.Plugin).Properties?.HasSettings == true).OrderBy(a => a.Description.Name).ToList();\r\n            AnyGenericPluginSettings = GenericPlugins.HasItems();\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        private void SectionChanged(RoutedPropertyChangedEventArgs<object> selectedItem)\r\n        {\r\n            int viewIndex = -1;\r\n\r\n            if (selectedItem.NewValue is Plugin plugin)\r\n            {\r\n                SelectedSectionView = PluginSettingsHelper.GetPluginSettingsView(plugin.Id, Extensions, loadedPluginSettings);\r\n                return;\r\n            }\r\n            else if (selectedItem.NewValue is LoadedPlugin ldPlugin)\r\n            {\r\n                SelectedSectionView = PluginSettingsHelper.GetPluginSettingsView(ldPlugin.Plugin.Id, Extensions, loadedPluginSettings);\r\n                return;\r\n            }\r\n\r\n            if (selectedItem.NewValue is TreeViewItem treeItem)\r\n            {\r\n                if (treeItem.Tag != null && int.TryParse(treeItem.Tag.ToString(), out var treeIndex))\r\n                {\r\n                    viewIndex = treeIndex;\r\n                }\r\n            }\r\n\r\n            if (viewIndex == -1)\r\n            {\r\n                SelectedSectionView = null;\r\n                return;\r\n            }\r\n\r\n            var view = (View)viewIndex;\r\n            SelectedSectionView = sectionViews[view];\r\n            switch (view)\r\n            {\r\n                case View.BrowseLibraries:\r\n                    application.ShowAddonPerfNotice();\r\n                    activeAddonSearchMode = AddonType.GameLibrary;\r\n                    AddonSearchText = string.Empty;\r\n                    SearchAddon();\r\n                    break;\r\n                case View.BrowseMetadata:\r\n                    application.ShowAddonPerfNotice();\r\n                    activeAddonSearchMode = AddonType.MetadataProvider;\r\n                    AddonSearchText = string.Empty;\r\n                    SearchAddon();\r\n                    break;\r\n                case View.BrowseGeneric:\r\n                    application.ShowAddonPerfNotice();\r\n                    activeAddonSearchMode = AddonType.Generic;\r\n                    AddonSearchText = string.Empty;\r\n                    SearchAddon();\r\n                    break;\r\n                case View.BrowseThemesDesktop:\r\n                    application.ShowAddonPerfNotice();\r\n                    activeAddonSearchMode = AddonType.ThemeDesktop;\r\n                    AddonSearchText = string.Empty;\r\n                    SearchAddon();\r\n                    break;\r\n                case View.BrowseThemesFullscreen:\r\n                    application.ShowAddonPerfNotice();\r\n                    activeAddonSearchMode = AddonType.ThemeFullscreen;\r\n                    AddonSearchText = string.Empty;\r\n                    SearchAddon();\r\n                    break;\r\n                case View.InstalledLibraries:\r\n                    ActiveInstalledExtensionsList = LibraryPluginList;\r\n                    break;\r\n                case View.InstalledMetadata:\r\n                    ActiveInstalledExtensionsList = MetadataPluginList;\r\n                    break;\r\n                case View.InstalledGeneric:\r\n                    ActiveInstalledExtensionsList = OtherPluginList;\r\n                    break;\r\n                case View.InstalledThemesDesktop:\r\n                    ActiveInstalledThemeList = DesktopThemeList;\r\n                    break;\r\n                case View.InstalledThemesFullscreen:\r\n                    ActiveInstalledThemeList = FullscreenThemeList;\r\n                    break;\r\n                case View.Updates:\r\n                    CheckUpdates();\r\n                    break;\r\n                default:\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private void UninstallExtension(InstalledPlugin a)\r\n        {\r\n            if (dialogs.ShowMessage(\r\n                LOC.ExtensionUninstallQuestion,\r\n                string.Empty,\r\n                MessageBoxButton.YesNo,\r\n                MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n            {\r\n                IsRestartRequired = true;\r\n                ExtensionInstaller.QueueExtensionUninstall(a.Description.DirectoryPath);\r\n            }\r\n        }\r\n\r\n        private void UninstallTheme(ThemeManifest a)\r\n        {\r\n            if (dialogs.ShowMessage(\r\n               LOC.ThemeUninstallQuestion,\r\n               string.Empty,\r\n               MessageBoxButton.YesNo,\r\n               MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n            {\r\n                IsRestartRequired = true;\r\n                ExtensionInstaller.QueueExtensionUninstall(a.DirectoryPath);\r\n            }\r\n        }\r\n\r\n        internal void UpdateDisabledExtensions()\r\n        {\r\n            var disabledPlugs = LibraryPluginList.Where(a => !a.Selected)?.Select(a => a.Description.Id).ToList();\r\n            disabledPlugs.AddMissing(MetadataPluginList.Where(a => !a.Selected)?.Select(a => a.Description.Id).ToList());\r\n            disabledPlugs.AddMissing(OtherPluginList.Where(a => !a.Selected)?.Select(a => a.Description.Id).ToList());\r\n            if (settings.DisabledPlugins?.IsListEqual(disabledPlugs) != true)\r\n            {\r\n                IsRestartRequired = true;\r\n                settings.DisabledPlugins = disabledPlugs;\r\n            }\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            var verResult = PluginSettingsHelper.VerifyPluginSettings(loadedPluginSettings);\r\n            if (!verResult.Item1)\r\n            {\r\n                dialogs.ShowErrorMessage(string.Join(Environment.NewLine, verResult.Item2), \"\");\r\n                return;\r\n            }\r\n\r\n            foreach (var plugin in loadedPluginSettings.Values)\r\n            {\r\n                plugin.Settings.EndEdit();\r\n            }\r\n\r\n            UpdateDisabledExtensions();\r\n            if (IsRestartRequired)\r\n            {\r\n                if (dialogs.ShowMessage(\r\n                       LOC.SettingsRestartAskMessage,\r\n                       LOC.SettingsRestartTitle,\r\n                       MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n                {\r\n                    application.Restart(new CmdLineOptions() { SkipLibUpdate = true });\r\n                }\r\n            }\r\n\r\n            closingHanled = true;\r\n            window.Close(true);\r\n        }\r\n\r\n        public void CancelClose()\r\n        {\r\n            foreach (var plugin in loadedPluginSettings.Values)\r\n            {\r\n                plugin.Settings.CancelEdit();\r\n            }\r\n\r\n            closingHanled = true;\r\n            window.Close(false);\r\n        }\r\n\r\n        public void WindowClosing()\r\n        {\r\n            if (!closingHanled)\r\n            {\r\n                foreach (var plugin in loadedPluginSettings.Values)\r\n                {\r\n                    plugin.Settings.CancelEdit();\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/AddonsViewModel_Installed.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class InstalledPlugin : ObservableObject\r\n    {\r\n        public Plugin Plugin { get; set; }\r\n        public ExtensionManifest Description { get; set; }\r\n        public object PluginIcon { get; set; }\r\n\r\n        private bool selected;\r\n        public bool Selected\r\n        {\r\n            get => selected;\r\n            set\r\n            {\r\n                selected = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public bool FailedLoading { get; set; }\r\n\r\n        public InstalledPlugin()\r\n        {\r\n        }\r\n\r\n        public InstalledPlugin(bool selected, Plugin plugin, ExtensionManifest description, bool failedLoading)\r\n        {\r\n            Selected = selected;\r\n            Plugin = plugin;\r\n            Description = description;\r\n            FailedLoading = failedLoading;\r\n            if (!string.IsNullOrEmpty(description.Icon))\r\n            {\r\n                PluginIcon = Path.Combine(Path.GetDirectoryName(description.DescriptionPath), description.Icon);\r\n            }\r\n            else if (description.Type == ExtensionType.Script && description.Module.Contains(\".psm1\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                PluginIcon = ResourceProvider.GetResource(\"PowerShellIcon\");\r\n            }\r\n            else\r\n            {\r\n                PluginIcon = ResourceProvider.GetResource(\"CsharpIcon\");\r\n            }\r\n        }\r\n\r\n        public override string ToString()\r\n        {\r\n            if (Plugin is LibraryPlugin lib)\r\n            {\r\n                return lib.Name;\r\n            }\r\n            else if (Plugin is MetadataPlugin met)\r\n            {\r\n                return met.Name;\r\n            }\r\n            else\r\n            {\r\n                return Description.Name;\r\n            }\r\n        }\r\n    }\r\n\r\n    public partial class AddonsViewModel : Playnite.ViewModels.AddonsViewModelBase\r\n    {\r\n        private List<InstalledPlugin> activeInstalledExtensionsList;\r\n        public List<InstalledPlugin> ActiveInstalledExtensionsList\r\n        {\r\n            get => activeInstalledExtensionsList;\r\n            set\r\n            {\r\n                activeInstalledExtensionsList = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<ThemeManifest> activeInstalledThemeList;\r\n        public List<ThemeManifest> ActiveInstalledThemeList\r\n        {\r\n            get => activeInstalledThemeList;\r\n            set\r\n            {\r\n                activeInstalledThemeList = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public List<InstalledPlugin> LibraryPluginList\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        public List<InstalledPlugin> MetadataPluginList\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        public List<InstalledPlugin> OtherPluginList\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        public List<ThemeManifest> DesktopThemeList\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        public List<ThemeManifest> FullscreenThemeList\r\n        {\r\n            get; private set;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/AddonsViewModel_Online.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Common.Web;\r\nusing Playnite.DesktopApp.Windows;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.Services;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public partial class AddonsViewModel :  Playnite.ViewModels.AddonsViewModelBase\r\n    {\r\n        private AddonType activeAddonSearchMode;\r\n\r\n        private bool isUpdateSectionSelected;\r\n        public bool IsUpdateSectionSelected\r\n        {\r\n            get => isUpdateSectionSelected;\r\n            set\r\n            {\r\n                isUpdateSectionSelected = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<AddonManifest> onlineAddonList;\r\n        public List<AddonManifest> OnlineAddonList\r\n        {\r\n            get => onlineAddonList;\r\n            set\r\n            {\r\n                onlineAddonList = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private AddonManifest selectedOnlineAddon;\r\n        public AddonManifest SelectedOnlineAddon\r\n        {\r\n            get => selectedOnlineAddon;\r\n            set\r\n            {\r\n                AddonInstallerManifest manifest = null;\r\n                selectedOnlineAddon = value;\r\n                if (value != null)\r\n                {\r\n                    var progressModel = new ProgressViewViewModel(\r\n                        new Playnite.Windows.ProgressWindowFactory(),\r\n                            new GlobalProgressOptions(LOC.GettingsAddonInformation.GetLocalized(), true) { IsIndeterminate = true});\r\n                    var progRes = progressModel.ActivateProgress((args) =>\r\n                    {\r\n                        manifest = selectedOnlineAddon.InstallerManifest;\r\n                        if (selectedOnlineAddon.Links == null)\r\n                        {\r\n                            selectedOnlineAddon.Links = new Dictionary<string, string>();\r\n                        }\r\n\r\n                        if (!selectedOnlineAddon.SourceUrl.IsNullOrEmpty() && !selectedOnlineAddon.Links.ContainsValue(selectedOnlineAddon.SourceUrl))\r\n                        {\r\n                            selectedOnlineAddon.Links.AddOrUpdate(\"Source Repository\", selectedOnlineAddon.SourceUrl);\r\n                        }\r\n                    }, 1500);\r\n                    if (progRes.Canceled)\r\n                    {\r\n                        selectedOnlineAddon = null;\r\n                    }\r\n                    else if (progRes.Error != null)\r\n                    {\r\n                        selectedOnlineAddon = null;\r\n                        SDK.API.Instance.Dialogs.ShowErrorMessage(progRes.Error.Message, \"\");\r\n                    }\r\n                }\r\n\r\n                OnPropertyChanged();\r\n                AvailablePackages = manifest?.GetCompatiblePackages() ?? new List<AddonInstallerPackage>();\r\n                SelectedInstallPackage = AvailablePackages?.FirstOrDefault();\r\n            }\r\n        }\r\n\r\n        private AddonInstallerPackage selectedInstallVersion;\r\n        public AddonInstallerPackage SelectedInstallPackage\r\n        {\r\n            get => selectedInstallVersion;\r\n            set\r\n            {\r\n                selectedInstallVersion = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<AddonInstallerPackage> availablePackages;\r\n        public List<AddonInstallerPackage> AvailablePackages\r\n        {\r\n            get => availablePackages;\r\n            set\r\n            {\r\n                availablePackages = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int updateAddonCount = 0;\r\n        public int UpdateAddonCount\r\n        {\r\n            get => updateAddonCount;\r\n            set\r\n            {\r\n                updateAddonCount = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(IsUpdateAvailable));\r\n            }\r\n        }\r\n\r\n        public bool IsUpdateAvailable\r\n        {\r\n            get => UpdateAddonCount > 0;\r\n        }\r\n\r\n        private bool isOnlineListLoading;\r\n        public bool IsOnlineListLoading\r\n        {\r\n            get => isOnlineListLoading;\r\n            set\r\n            {\r\n                isOnlineListLoading = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isUpdateListLoading;\r\n        public bool IsUpdateListLoading\r\n        {\r\n            get => isUpdateListLoading;\r\n            set\r\n            {\r\n                isUpdateListLoading = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string addonSearchText;\r\n        public string AddonSearchText\r\n        {\r\n            get => addonSearchText;\r\n            set\r\n            {\r\n                addonSearchText = value;\r\n                OnPropertyChanged();\r\n                SearchAddon();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> SearchAddonCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SearchAddon();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<AddonManifest> InstallAddonCommand\r\n        {\r\n            get => new RelayCommand<AddonManifest>((a) =>\r\n            {\r\n                InstallAddon(a);\r\n            });\r\n        }\r\n\r\n        private void InstallAddon(AddonManifest addon)\r\n        {\r\n            var licenseRes = addon.CheckAddonLicense();\r\n            if (licenseRes == null)\r\n            {\r\n                dialogs.ShowErrorMessage(LOC.AddonErrorDownloadFailed, string.Empty);\r\n                return;\r\n            }\r\n\r\n            if (licenseRes == false)\r\n            {\r\n                return;\r\n            }    \r\n\r\n            if (SelectedInstallPackage == null || SelectedInstallPackage.PackageUrl.IsNullOrEmpty())\r\n            {\r\n                dialogs.ShowErrorMessage(LOC.AddonErrorNotCompatible, string.Empty);\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                var locaPath = addon.GetTargetDownloadPath();\r\n                FileSystem.DeleteFile(locaPath);\r\n                var res = dialogs.ActivateGlobalProgress((_) =>\r\n                {\r\n                    if (SelectedInstallPackage.PackageUrl.IsHttpUrl())\r\n                    {\r\n                        FileSystem.PrepareSaveFile(locaPath);\r\n                        HttpDownloader.DownloadFile(SelectedInstallPackage.PackageUrl, locaPath);\r\n                    }\r\n                    else\r\n                    {\r\n                        File.Copy(SelectedInstallPackage.PackageUrl, locaPath);\r\n                    }\r\n                },\r\n                new GlobalProgressOptions(LOC.DownloadingLabel, false));\r\n\r\n                if (res.Error != null)\r\n                {\r\n                    throw res.Error;\r\n                }\r\n\r\n                ExtensionInstaller.QueuePackageInstall(locaPath);\r\n                IsRestartRequired = true;\r\n                addon.OnPropertyChanged(nameof(addon.IsQueuedForInstall));\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to download addon package {SelectedInstallPackage.PackageUrl}\");\r\n                dialogs.ShowErrorMessage(LOC.AddonErrorDownloadFailed, string.Empty);\r\n            }\r\n        }\r\n\r\n        private void SearchAddon()\r\n        {\r\n            if (IsOnlineListLoading)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (PlayniteEnvironment.InOfflineMode)\r\n            {\r\n                return;\r\n            }\r\n\r\n            IsOnlineListLoading = true;\r\n            Task.Run(() =>\r\n            {\r\n                try\r\n                {\r\n                    OnlineAddonList = serviceClient.GetAllAddons(activeAddonSearchMode, AddonSearchText).OrderBy(a => a.Name).ToList();\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, \"Failed to get addon list.\");\r\n                    OnlineAddonList = new List<AddonManifest>();\r\n                }\r\n                finally\r\n                {\r\n                    IsOnlineListLoading = false;\r\n                }\r\n            });\r\n        }\r\n\r\n        private void CheckUpdates()\r\n        {\r\n            if (PlayniteEnvironment.InOfflineMode)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (IsUpdateListLoading || UpdateAddonList != null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            IsUpdateListLoading = true;\r\n            var updateList = new List<AddonUpdate>();\r\n            Task.Run(() =>\r\n            {\r\n                try\r\n                {\r\n                    updateList = Addons.CheckAddonUpdates(serviceClient);\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to check for addon updates.\");\r\n                }\r\n                finally\r\n                {\r\n                    IsUpdateListLoading = false;\r\n                    UpdateAddonList = updateList;\r\n                    UpdateAddonCount = updateList.Count;\r\n                }\r\n            });\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/CategoryConfigViewModel.cs",
    "content": "﻿using Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Commands;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class CategoryConfigViewModel : ObservableObject\r\n    {\r\n        private string newTextCat;\r\n        public string NewTextCat\r\n        {\r\n            get\r\n            {\r\n                return newTextCat;\r\n            }\r\n\r\n            set\r\n            {\r\n                newTextCat = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<SelectableItem<Category>> categories;\r\n        public ObservableCollection<SelectableItem<Category>> Categories\r\n        {\r\n            get\r\n            {\r\n                return categories;\r\n            }\r\n\r\n            set\r\n            {\r\n                categories = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool enableThreeState;\r\n        public bool EnableThreeState\r\n        {\r\n            get\r\n            {\r\n                return enableThreeState;\r\n            }\r\n\r\n            set\r\n            {\r\n                enableThreeState = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Game game;\r\n        private IEnumerable<Game> games;\r\n        private IWindowFactory window;\r\n        private GameDatabase database;\r\n\r\n        public RelayCommand<object> CloseCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddCategoryCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddCategory();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SetCategoriesCommand\r\n        {\r\n            get => new RelayCommand<object>((category) =>\r\n            {\r\n                SetCategories();\r\n            });\r\n        }\r\n\r\n        public CategoryConfigViewModel(IWindowFactory window, GameDatabase database, IEnumerable<Game> games)\r\n        {\r\n            this.window = window;\r\n            this.database = database;\r\n            this.games = games;\r\n            EnableThreeState = true;\r\n            Categories = GetAllCategories();\r\n            SetCategoryStates();\r\n        }\r\n\r\n        public CategoryConfigViewModel(IWindowFactory window, GameDatabase database, Game game)\r\n        {\r\n            this.window = window;\r\n            this.database = database;\r\n            this.game = game;\r\n            EnableThreeState = false;\r\n            Categories = GetAllCategories();\r\n            SetCategoryStates();\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView()\r\n        {\r\n            window.Close(false);\r\n        }\r\n\r\n        public void AddCategory()\r\n        {\r\n            if (NewTextCat.IsNullOrEmpty())\r\n            {\r\n                return;\r\n            }\r\n\r\n            var existing = Categories.FirstOrDefault(a => a.Item.Name?.Equals(NewTextCat, StringComparison.CurrentCultureIgnoreCase) == true);\r\n            if (existing != null)\r\n            {\r\n                existing.Selected = true;\r\n            }\r\n            else\r\n            {\r\n                var newCat = new Category(NewTextCat);\r\n                Categories.Add(new SelectableItem<Category>(newCat) { Selected = true });\r\n            }\r\n\r\n            NewTextCat = string.Empty;\r\n        }\r\n\r\n        public void SetCategories()\r\n        {\r\n            using (database.BufferedUpdate())\r\n            {\r\n                var newCategoeries = Categories.Where(a => (a.Selected == true || a.Selected == null) && database.Categories[a.Item.Id] == null);\r\n                if (newCategoeries.Any())\r\n                {\r\n                    database.Categories.Add(newCategoeries.Select(a => a.Item).ToList());\r\n                }\r\n\r\n                if (games != null)\r\n                {\r\n                    var toBeAdded = Categories.Where(a => a.Selected == true || a.Selected == null);\r\n                    var selected = toBeAdded.Where(a => a.Selected == true);\r\n                    foreach (var game in games)\r\n                    {\r\n                        if (toBeAdded.Any())\r\n                        {\r\n                            var toAssign = new List<Guid>();\r\n                            if (selected.Any())\r\n                            {\r\n                                toAssign.AddRange(selected.Select(a => a.Item.Id));\r\n                            }\r\n\r\n                            var under = toBeAdded.Where(a => a.Selected == null);\r\n                            if (under.Any() && game.CategoryIds?.Any() == true)\r\n                            {\r\n                                var approp = game.CategoryIds.Intersect(under.Select(a => a.Item.Id));\r\n                                if (approp.Any())\r\n                                {\r\n                                    toAssign.AddRange(approp);\r\n                                }\r\n                            }\r\n\r\n                            game.CategoryIds = toAssign;\r\n                        }\r\n                        else\r\n                        {\r\n                            game.CategoryIds = null;\r\n                        }\r\n                    }\r\n\r\n                    database.Games.Update(games);\r\n                }\r\n                else if (game != null)\r\n                {\r\n                    var selected = Categories.Where(a => a.Selected == true);\r\n                    if (selected.Any())\r\n                    {\r\n                        game.CategoryIds = selected.Select(a => a.Item.Id).ToList();\r\n                    }\r\n                    else\r\n                    {\r\n                        game.CategoryIds = null;\r\n                    }\r\n\r\n                    database.Games.Update(game);\r\n                }\r\n            }\r\n\r\n            window.Close(true);\r\n        }\r\n\r\n        private void SetCategoryStates()\r\n        {\r\n            if (games != null)\r\n            {\r\n                var catCount = new Dictionary<Guid, int>();\r\n                EnableThreeState = true;\r\n                foreach (var game in games)\r\n                {\r\n                    if (!game.CategoryIds.HasItems())\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    foreach (var cat in game.CategoryIds)\r\n                    {\r\n                        if (catCount.ContainsKey(cat))\r\n                        {\r\n                            catCount[cat] += 1;\r\n                        }\r\n                        else\r\n                        {\r\n                            catCount.Add(cat, 1);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                foreach (var cat in Categories)\r\n                {\r\n                    if (catCount.ContainsKey(cat.Item.Id))\r\n                    {\r\n                        if (catCount[cat.Item.Id] == games.Count())\r\n                        {\r\n                            cat.Selected = true;\r\n                        }\r\n                        else\r\n                        {\r\n                            cat.Selected = null;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (game.CategoryIds.HasItems())\r\n                {\r\n                    foreach (var cat in game.CategoryIds)\r\n                    {\r\n                        var existingCat = Categories.FirstOrDefault(a => a.Item.Id == cat);\r\n                        if (existingCat != null)\r\n                        {\r\n                            existingCat.Selected = true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<SelectableItem<Category>> GetAllCategories()\r\n        {\r\n            return database.Categories.Select(a => new SelectableItem<Category>(a)).OrderBy(a => a.Item.Name).ToObservable();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/DatabaseFieldsManagerViewModel.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Settings;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.Windows;\r\nusing System.Windows;\r\nusing Playnite.Common.Media.Icons;\r\nusing Playnite.Emulators;\r\nusing System.Threading;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class DatabaseFieldsManagerViewModel : ObservableObject\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private IDialogsFactory dialogs;\r\n        private IResourceProvider resources;\r\n        private IGameDatabaseMain database;\r\n\r\n        public List<EmulatedPlatform> PlatformsSpecifications { get; set; }\r\n        public List<EmulatedRegion> RegionsSpecifications { get; set; }\r\n\r\n        #region Genres\r\n\r\n        public ObservableCollection<Genre> EditingGenres\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<object> AddGenreCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddItem(EditingGenres);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveGenreCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemoveItem(EditingGenres, a.Cast<Genre>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenameGenreCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingGenres, a.First() as Genre);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveUnusedGenresCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveUnusedItems(EditingGenres, g => g.GenreIds);\r\n            }, (a) => EditingGenres.Count > 0);\r\n        }\r\n\r\n        #endregion Genres\r\n\r\n        #region Companies\r\n\r\n        public ObservableCollection<Company> EditingCompanies\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<object> AddCompanyCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddItem(EditingCompanies);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveCompanyCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemoveItem(EditingCompanies, a.Cast<Company>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenameCompanyCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingCompanies, a.First() as Company);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveUnusedCompaniesCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveUnusedItems(EditingCompanies, g =>\r\n                {\r\n                    var ids = new List<Guid>();\r\n                    if (g.DeveloperIds.HasItems())\r\n                    {\r\n                        g.DeveloperIds.ForEach(d => ids.AddMissing(d));\r\n                    }\r\n\r\n                    if (g.PublisherIds.HasItems())\r\n                    {\r\n                        g.PublisherIds.ForEach(d => ids.AddMissing(d));\r\n                    }\r\n\r\n                    return ids;\r\n                });\r\n            }, (a) => EditingCompanies.Count > 0);\r\n        }\r\n\r\n        #endregion Companies\r\n\r\n        #region Tags\r\n\r\n        public ObservableCollection<Tag> EditingTags\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<object> AddTagCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddItem(EditingTags);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveTagCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemoveItem(EditingTags, a.Cast<Tag>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenameTagCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingTags, a.First() as Tag);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveUnusedTagsCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveUnusedItems(EditingTags, g => g.TagIds);\r\n            }, (a) => EditingTags.Count > 0);\r\n        }\r\n\r\n        #endregion Tags\r\n\r\n        #region Features\r\n\r\n        public ObservableCollection<GameFeature> EditingFeatures\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<object> AddFeatureCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddItem(EditingFeatures);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveFeatureCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemoveItem(EditingFeatures, a.Cast<GameFeature>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenameFeatureCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingFeatures, a.First() as GameFeature);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveUnusedFeaturesCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveUnusedItems(EditingFeatures, g => g.FeatureIds);\r\n            }, (a) => EditingFeatures.Count > 0);\r\n        }\r\n\r\n        #endregion Features\r\n\r\n        #region Platforms\r\n\r\n        public ObservableCollection<Platform> EditingPlatforms\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<object> AddPlatformCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddItem(EditingPlatforms);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemovePlatformCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemoveItem(EditingPlatforms, a.Cast<Platform>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenamePlatformCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingPlatforms, a.First() as Platform);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> SelectPlatformIconCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                SelectPlatformIcon(a.First() as Platform);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> SelectPlatformCoverCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                SelectPlatformCover(a.First() as Platform);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> SelectPlatformBackgroundCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                SelectPlatformBackground(a.First() as Platform);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemovePlatformIconCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemovePlatformIcon(a.First() as Platform);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemovePlatformCoverCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemovePlatformCover(a.First() as Platform);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemovePlatformBackgroundCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemovePlatformBackground(a.First() as Platform);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveUnusedPlatformsCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveUnusedPlatforms();\r\n            }, (a) => EditingPlatforms.Count > 0);\r\n        }\r\n\r\n        #endregion Platforms\r\n\r\n        #region Series\r\n\r\n        public ObservableCollection<Series> EditingSeries\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<object> AddSeriesCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddItem(EditingSeries);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveSeriesCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemoveItem(EditingSeries, a.Cast<Series>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenameSeriesCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingSeries, a.First() as Series);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveUnusedSeriesCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveUnusedItems(EditingSeries, g => g.SeriesIds);\r\n            }, (a) => EditingSeries.Count > 0);\r\n        }\r\n\r\n        #endregion Series\r\n\r\n        #region AgeRatings\r\n\r\n        public ObservableCollection<AgeRating> EditingAgeRatings\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<object> AddAgeRatingCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddItem(EditingAgeRatings);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveAgeRatingCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemoveItem(EditingAgeRatings, a.Cast<AgeRating>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenameAgeRatingCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingAgeRatings, a.First() as AgeRating);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveUnusedAgeRatingsCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveUnusedItems(EditingAgeRatings, g => g.AgeRatingIds);\r\n            }, (a) => EditingAgeRatings.Count > 0);\r\n        }\r\n\r\n        #endregion AgeRatings\r\n\r\n        #region Regions\r\n\r\n        public ObservableCollection<Region> EditingRegions\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<object> AddRegionCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddItem(EditingRegions);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveRegionCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemoveItem(EditingRegions, a.Cast<Region>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenameRegionCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingRegions, a.First() as Region);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveUnusedRegionsCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveUnusedItems(EditingRegions, g => g.RegionIds);\r\n            }, (a) => EditingRegions.Count > 0);\r\n        }\r\n\r\n        #endregion Regions\r\n\r\n        #region Sources\r\n\r\n        public ObservableCollection<GameSource> EditingSources\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<object> AddSourceCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddItem(EditingSources);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveSourceCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemoveItem(EditingSources, a.Cast<GameSource>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenameSourceCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingSources, a.First() as GameSource);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveUnusedSourcesCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveUnusedItems(EditingSources, g => g.SourceId);\r\n            }, (a) => EditingSources.Count > 0);\r\n        }\r\n\r\n        #endregion Sources\r\n\r\n        #region Categories\r\n\r\n        public ObservableCollection<Category> EditingCategories\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<object> AddCategoryCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddItem(EditingCategories);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveCategoryCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemoveItem(EditingCategories, a.Cast<Category>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenameCategoryCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingCategories, a.First() as Category);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveUnusedCategoriesCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveUnusedItems(EditingCategories, g => g.CategoryIds);\r\n            }, (a) => EditingCategories.Count > 0);\r\n        }\r\n\r\n        #endregion Categories\r\n\r\n        #region CompletionStatuses\r\n\r\n        public CompletionStatusSettings CompletionStatusSettings\r\n        {\r\n            get;\r\n        }\r\n\r\n        public ObservableCollection<CompletionStatus> CompletionStatusesSelection\r\n        {\r\n            get;\r\n        }\r\n\r\n        public ObservableCollection<CompletionStatus> EditingCompletionStatuses\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<object> AddCompletionStatusCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                var added = AddItem(EditingCompletionStatuses);\r\n                if (added != null)\r\n                {\r\n                    CompletionStatusesSelection.Add(added);\r\n                }\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveCompletionStatusCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                a.ForEach(s => CompletionStatusesSelection.Remove((CompletionStatus)s));\r\n                RemoveItem(EditingCompletionStatuses, a.Cast<CompletionStatus>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenameCompletionStatusCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingCompletionStatuses, a.First() as CompletionStatus);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveUnusedCompletionStatusesCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveUnusedItems(EditingCompletionStatuses, g => g.CompletionStatusId);\r\n            }, (a) => EditingCompletionStatuses.Count > 0);\r\n        }\r\n\r\n        #endregion CompletionStatuses\r\n\r\n        #region FilterPresets\r\n\r\n        public ObservableCollection<FilterPreset> EditingFilterPresets\r\n        {\r\n            get;\r\n        }\r\n\r\n        public FilterPresetsSettings FilterPresetsSettings\r\n        {\r\n            get;\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveFilterPresetCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RemoveItem(EditingFilterPresets, a.Cast<FilterPreset>().ToList());\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RenameFilterPresetCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                RenameItem(EditingFilterPresets, a.First() as FilterPreset);\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> MoveUpFilterPresetCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                var index = EditingFilterPresets.IndexOf(a.First() as FilterPreset);\r\n                if (index != 0)\r\n                {\r\n                    EditingFilterPresets.Move(index, index - 1);\r\n                }\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        public RelayCommand<IList<object>> MoveDownFilterPresetCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((a) =>\r\n            {\r\n                var index = EditingFilterPresets.IndexOf(a.First() as FilterPreset);\r\n                if (index != EditingFilterPresets.Count - 1)\r\n                {\r\n                    EditingFilterPresets.Move(index, index + 1);\r\n                }\r\n            }, (a) => a?.Count == 1);\r\n        }\r\n\r\n        #endregion FilterPresets\r\n\r\n        public RelayCommand<object> SaveCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SaveChanges();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView();\r\n            });\r\n        }\r\n\r\n        public DatabaseFieldsManagerViewModel(IGameDatabaseMain database, IWindowFactory window, IDialogsFactory dialogs, IResourceProvider resources)\r\n        {\r\n            this.database = database;\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            EditingCategories = database.Categories.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            EditingAgeRatings = database.AgeRatings.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            EditingCompanies = database.Companies.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            EditingGenres = database.Genres.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            EditingPlatforms = database.Platforms.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            EditingRegions = database.Regions.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            EditingSeries = database.Series.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            EditingSources = database.Sources.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            EditingTags = database.Tags.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            EditingFeatures = database.Features.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            EditingCompletionStatuses = database.CompletionStatuses.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            CompletionStatusesSelection = database.CompletionStatuses.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            CompletionStatusesSelection.Insert(0, new CompletionStatus\r\n            {\r\n                Name = ResourceProvider.GetString(LOC.RemoveLabel),\r\n                Id = Guid.Empty\r\n            });\r\n            CompletionStatusesSelection.Insert(0, new CompletionStatus\r\n            {\r\n                Name = ResourceProvider.GetString(LOC.None),\r\n                Id = Constants.MaxGuidVal\r\n            });\r\n\r\n            PlatformsSpecifications = Emulation.Platforms.OrderBy(a => a.Name).ToList();\r\n            PlatformsSpecifications.Insert(0, new EmulatedPlatform\r\n            {\r\n                Name = ResourceProvider.GetString(LOC.None),\r\n                Id = null\r\n            });\r\n\r\n            RegionsSpecifications = Emulation.Regions.OrderBy(a => a.Name).ToList();\r\n            RegionsSpecifications.Insert(0, new EmulatedRegion\r\n            {\r\n                Name = ResourceProvider.GetString(LOC.None),\r\n                Id = null\r\n            });\r\n\r\n            CompletionStatusSettings = database.GetCompletionStatusSettings();\r\n            FilterPresetsSettings = database.GetFilterPresetsSettings();\r\n            EditingFilterPresets = database.GetSortedFilterPresets().GetClone().ToObservable();\r\n        }\r\n\r\n        public void OpenView()\r\n        {\r\n            window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView()\r\n        {\r\n            window.Close();\r\n        }\r\n\r\n        internal void SaveChanges()\r\n        {\r\n            using (database.BufferedUpdate())\r\n            {\r\n                UpdateDbCollection(database.Categories, EditingCategories);\r\n                UpdateDbCollection(database.AgeRatings, EditingAgeRatings);\r\n                UpdateDbCollection(database.Companies, EditingCompanies);\r\n                UpdateDbCollection(database.Genres, EditingGenres);\r\n                UpdateDbCollection(database.Regions, EditingRegions);\r\n                UpdateDbCollection(database.Series, EditingSeries);\r\n                UpdateDbCollection(database.Sources, EditingSources);\r\n                UpdateDbCollection(database.FilterPresets, EditingFilterPresets);\r\n                UpdateDbCollection(database.Tags, EditingTags);\r\n                UpdateDbCollection(database.Features, EditingFeatures);\r\n                UpdateDbCollection(database.CompletionStatuses, EditingCompletionStatuses);\r\n                UpdatePlatformsCollection();\r\n                UpdateCompletionStatusSettings();\r\n                UpdateFilterPresetsSettings();\r\n            }\r\n\r\n            window.Close(true);\r\n        }\r\n\r\n        private void UpdateDbCollection<TItem>(IItemCollection<TItem> dbCollection, IList<TItem> updatedCollection) where TItem : DatabaseObject\r\n        {\r\n            // Remove deleted items\r\n            var removedItems = dbCollection.Where(a => updatedCollection.FirstOrDefault(b => b.Id == a.Id) == null);\r\n            if (removedItems.Any())\r\n            {\r\n                dbCollection.Remove(removedItems.ToList());\r\n            }\r\n\r\n            // Add new items\r\n            var addedItems = updatedCollection.Where(a => dbCollection[a.Id] == null);\r\n            if (addedItems.Any())\r\n            {\r\n                dbCollection.Add(addedItems.ToList());\r\n            }\r\n\r\n            // Update modified items\r\n            foreach (var item in updatedCollection)\r\n            {\r\n                var dbItem = dbCollection[item.Id];\r\n                if (dbItem != null && !item.IsEqualJson(dbItem))\r\n                {\r\n                    dbCollection.Update(item);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void UpdatePlatformsCollection()\r\n        {\r\n            string addNewFile(string path, Guid parent)\r\n            {\r\n                var newPath = database.AddFile(path, parent, true, CancellationToken.None);\r\n                if (Paths.AreEqual(Path.GetDirectoryName(path), PlaynitePaths.TempPath))\r\n                {\r\n                    File.Delete(path);\r\n                }\r\n\r\n                return newPath;\r\n            }\r\n\r\n            // Update modified platforms in database\r\n            foreach (var platform in EditingPlatforms.Where(a => database.Platforms[a.Id] != null).ToList())\r\n            {\r\n                var dbPlatform = database.Platforms.Get(platform.Id);\r\n                if (platform.IsEqualJson(dbPlatform))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (!string.IsNullOrEmpty(platform.Icon) && File.Exists(platform.Icon))\r\n                {\r\n                    platform.Icon = addNewFile(platform.Icon, dbPlatform.Id);\r\n                }\r\n\r\n                if (!string.IsNullOrEmpty(platform.Cover) && File.Exists(platform.Cover))\r\n                {\r\n                    platform.Cover = addNewFile(platform.Cover, dbPlatform.Id);\r\n                }\r\n\r\n                if (!string.IsNullOrEmpty(platform.Background) && File.Exists(platform.Background))\r\n                {\r\n                    platform.Background = addNewFile(platform.Background, dbPlatform.Id);\r\n                }\r\n\r\n                database.Platforms.Update(platform);\r\n            }\r\n\r\n            // Remove deleted platforms from database\r\n            var removedItems = database.Platforms.Where(a => EditingPlatforms.FirstOrDefault(b => b.Id == a.Id) == null).ToList();\r\n            database.Platforms.Remove(removedItems);\r\n\r\n            // Add new platforms to database\r\n            foreach (var addedPlatform in EditingPlatforms.Where(a => database.Platforms[a.Id] == null).ToList())\r\n            {\r\n                if (!string.IsNullOrEmpty(addedPlatform.Icon))\r\n                {\r\n                    addedPlatform.Icon = addNewFile(addedPlatform.Icon, addedPlatform.Id);\r\n                }\r\n\r\n                if (!string.IsNullOrEmpty(addedPlatform.Cover))\r\n                {\r\n                    addedPlatform.Cover = addNewFile(addedPlatform.Cover, addedPlatform.Id);\r\n                }\r\n\r\n                if (!string.IsNullOrEmpty(addedPlatform.Background))\r\n                {\r\n                    addedPlatform.Background = addNewFile(addedPlatform.Background, addedPlatform.Id);\r\n                }\r\n\r\n                database.Platforms.Add(addedPlatform);\r\n            }\r\n        }\r\n\r\n        public void RemoveUnusedItems<TItem>(IList<TItem> sourceCollection, Func<Game, Guid> fieldSelector) where TItem : DatabaseObject\r\n        {\r\n            if (sourceCollection.Count == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var unused = new List<Guid>(sourceCollection.Select(a => a.Id));\r\n            foreach (var game in database.Games)\r\n            {\r\n                unused.Remove(fieldSelector(game));\r\n            }\r\n\r\n            if (unused.Count > 0)\r\n            {\r\n                if (dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCRemoveUnusedFieldsAskMessage\"), unused.Count),\r\n                    \"\", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n                {\r\n                    foreach (var item in unused)\r\n                    {\r\n                        var srcItem = sourceCollection.First(a => a.Id == item);\r\n                        sourceCollection.Remove(srcItem);\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                dialogs.ShowMessage(resources.GetString(\"LOCRemoveUnusedFieldsNoUnusedMessage\"));\r\n            }\r\n        }\r\n\r\n        public void RemoveUnusedItems<TItem>(IList<TItem> sourceCollection, Func<Game, List<Guid>> fieldSelector) where TItem : DatabaseObject\r\n        {\r\n            if (sourceCollection.Count == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var unused = new List<Guid>(sourceCollection.Select(a => a.Id));\r\n            foreach (var game in database.Games)\r\n            {\r\n                fieldSelector(game)?.ForEach(a => unused.Remove(a));\r\n            }\r\n\r\n            if (unused.Count > 0)\r\n            {\r\n                if (dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCRemoveUnusedFieldsAskMessage\"), unused.Count),\r\n                    \"\", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n                {\r\n                    foreach (var item in unused)\r\n                    {\r\n                        var srcItem = sourceCollection.First(a => a.Id == item);\r\n                        sourceCollection.Remove(srcItem);\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                dialogs.ShowMessage(resources.GetString(\"LOCRemoveUnusedFieldsNoUnusedMessage\"));\r\n            }\r\n        }\r\n\r\n        public void RemoveUnusedPlatforms()\r\n        {\r\n            if (EditingPlatforms.Count == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var unused = new List<Guid>(EditingPlatforms.Select(a => a.Id));\r\n            foreach (var game in database.Games)\r\n            {\r\n                game.PlatformIds?.ForEach(a => unused.Remove(a));\r\n            }\r\n\r\n            foreach (var emulator in database.Emulators)\r\n            {\r\n                if (!emulator.CustomProfiles.HasItems())\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                foreach (var profile in emulator.CustomProfiles)\r\n                {\r\n                    var usedIds = profile.Platforms ?? new List<Guid>();\r\n                    foreach (var item in unused.Intersect(usedIds).ToList())\r\n                    {\r\n                        unused.Remove(item);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (unused.Count > 0)\r\n            {\r\n                if (dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCRemoveUnusedFieldsAskMessage\"), unused.Count),\r\n                    \"\", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n                {\r\n                    foreach (var item in unused)\r\n                    {\r\n                        var srcItem = EditingPlatforms.First(a => a.Id == item);\r\n                        EditingPlatforms.Remove(srcItem);\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                dialogs.ShowMessage(resources.GetString(\"LOCRemoveUnusedFieldsNoUnusedMessage\"));\r\n            }\r\n        }\r\n\r\n        public TItem AddItem<TItem>(IList<TItem> collection) where TItem : DatabaseObject\r\n        {\r\n            var res = dialogs.SelectString(\r\n                resources.GetString(\"LOCEnterName\"),\r\n                resources.GetString(\"LOCAddNewItem\"),\r\n                \"\");\r\n            if (res.Result && !res.SelectedString.IsNullOrEmpty())\r\n            {\r\n                if (collection.Any(a => a.Name?.Equals(res.SelectedString, StringComparison.InvariantCultureIgnoreCase) == true))\r\n                {\r\n                    dialogs.ShowErrorMessage(resources.GetString(\"LOCItemAlreadyExists\"), \"\");\r\n                }\r\n                else\r\n                {\r\n                    var newItem = typeof(TItem).CrateInstance<TItem>(res.SelectedString);\r\n                    collection.Add(newItem);\r\n                    return newItem;\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public void RenameItem<TItem>(IList<TItem> collection, TItem item) where TItem : DatabaseObject\r\n        {\r\n            var res = dialogs.SelectString(\r\n                resources.GetString(\"LOCEnterNewName\"),\r\n                resources.GetString(\"LOCRenameItem\"),\r\n                item.Name);\r\n            if (res.Result && !res.SelectedString.IsNullOrEmpty())\r\n            {\r\n                if (collection.Any(a => a.Name?.Equals(res.SelectedString, StringComparison.InvariantCultureIgnoreCase) == true && a.Id != item.Id))\r\n                {\r\n                    dialogs.ShowErrorMessage(resources.GetString(\"LOCItemAlreadyExists\"), \"\");\r\n                }\r\n                else\r\n                {\r\n                    item.Name = res.SelectedString;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void RemoveItem<TItem>(IList<TItem> collection, IList<TItem> items) where TItem : DatabaseObject\r\n        {\r\n            foreach (var item in items)\r\n            {\r\n                collection.Remove(item);\r\n            }\r\n        }\r\n\r\n        public void SelectPlatformIcon(Platform platform)\r\n        {\r\n            var iconPath = dialogs.SelectIconFile();\r\n            if (string.IsNullOrEmpty(iconPath))\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (iconPath.EndsWith(\"exe\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                var convertedPath = Path.Combine(PlaynitePaths.TempPath, Guid.NewGuid() + \".ico\");\r\n                if (IconExtractor.ExtractMainIconFromFile(iconPath, convertedPath))\r\n                {\r\n                    iconPath = convertedPath;\r\n                }\r\n                else\r\n                {\r\n                    iconPath = null;\r\n                }\r\n            }\r\n\r\n            platform.Icon = iconPath;\r\n        }\r\n\r\n        public void SelectPlatformCover(Platform platform)\r\n        {\r\n            var path = dialogs.SelectIconFile();\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                platform.Cover = path;\r\n            }\r\n        }\r\n\r\n        public void SelectPlatformBackground(Platform platform)\r\n        {\r\n            var path = dialogs.SelectIconFile();\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                platform.Background = path;\r\n            }\r\n        }\r\n\r\n        public void RemovePlatformIcon(Platform platform)\r\n        {\r\n            platform.Icon = null;\r\n        }\r\n\r\n        public void RemovePlatformCover(Platform platform)\r\n        {\r\n            platform.Cover = null;\r\n        }\r\n\r\n        public void RemovePlatformBackground(Platform platform)\r\n        {\r\n            platform.Background = null;\r\n        }\r\n\r\n        private void UpdateCompletionStatusSettings()\r\n        {\r\n            var dbSet = database.GetCompletionStatusSettings();\r\n            if (!CompletionStatusSettings.IsEqualJson(dbSet))\r\n            {\r\n                database.SetCompletionStatusSettings(CompletionStatusSettings);\r\n            }\r\n        }\r\n\r\n        private void UpdateFilterPresetsSettings()\r\n        {\r\n            var dbSet = database.GetFilterPresetsSettings();\r\n            FilterPresetsSettings.SortingOrder = EditingFilterPresets.Select(x => x.Id).ToList();\r\n            if (!FilterPresetsSettings.IsEqualJson(dbSet))\r\n            {\r\n                database.SetFilterPresetsSettings(FilterPresetsSettings);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/DesignData/DesignMainViewModel.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Controllers;\r\nusing Playnite.Database;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class DesignMainViewModel : DesktopAppViewModel\r\n    {\r\n        private static DesignMainViewModel designIntance;\r\n        public static DesignMainViewModel DesignIntance\r\n        {\r\n            get\r\n            {\r\n                if (!DesignerTools.IsInDesignMode)\r\n                {\r\n                    return null;\r\n                }\r\n                else\r\n                {\r\n                    if (designIntance == null)\r\n                    {\r\n                        designIntance = new DesignMainViewModel();\r\n                    }\r\n\r\n                    return designIntance;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static GameDetailsViewModel DesignSelectedGameDetailsIntance\r\n        {\r\n            get\r\n            {\r\n                return DesignIntance?.SelectedGameDetails;\r\n            }\r\n        }\r\n\r\n        public static GamesCollectionViewEntry DesignSelectedGameIntance\r\n        {\r\n            get\r\n            {\r\n                return DesignIntance?.SelectedGame;\r\n            }\r\n        }\r\n\r\n        public static NotificationMessage DesignNotificationIntance\r\n        {\r\n            get\r\n            {\r\n                return new NotificationMessage(\"1\", \"Some testing notification message.\", NotificationType.Info);\r\n            }\r\n        }\r\n\r\n        public DesignMainViewModel() : base(new InMemoryGameDatabase(), null, null, new ResourceProvider(), null)\r\n        {\r\n            ProgressStatus = \"Status example in progress...\";\r\n            ProgressValue = 50;\r\n            ProgressTotal = 100;\r\n            ProgressActive = true;\r\n\r\n            Game.DatabaseReference = Database;\r\n            GameDatabase.GenerateSampleData(Database);\r\n            var designGame = Database.Games.First();\r\n            designGame.CoverImage = \"pack://application:,,,/Playnite;component/Resources/Images/DesignCover.jpg\";\r\n            designGame.BackgroundImage = \"pack://application:,,,/Playnite;component/Resources/Images/DesignBackground.jpg\";\r\n            designGame.Icon = \"pack://application:,,,/Playnite;component/Resources/Images/DesignIcon.png\";\r\n\r\n            AppSettings = new PlayniteSettings();\r\n            AppSettings.ExplorerPanelVisible = true;\r\n            AppSettings.GridViewSideBarVisible = true;\r\n            AppSettings.ShowNamesUnderCovers = true;\r\n            AppSettings.ShowNameEmptyCover = true;\r\n            AppSettings.ViewSettings.SelectedExplorerField = ExplorerField.LastActivity;\r\n\r\n            Extensions = new ExtensionFactory(Database, new GameControllerFactory(), null);\r\n            GamesView = new DesktopCollectionView(Database, AppSettings, Extensions);\r\n            SelectedGames = new List<GamesCollectionViewEntry>() { GamesView.Items[0] };\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/DesktopAppViewModel.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.Metadata;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Settings;\r\nusing Playnite.Commands;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Drawing;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\nusing Playnite.ViewModels;\r\nusing Playnite.DesktopApp.Windows;\r\nusing System.Windows.Controls;\r\nusing Playnite.SDK.Exceptions;\r\nusing Playnite.Common.Media.Icons;\r\nusing Playnite.DesktopApp.Markup;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Media;\r\nusing System.Drawing.Imaging;\r\nusing Playnite.DesktopApp.Controls;\r\nusing System.Diagnostics;\r\nusing Playnite.SDK.Events;\r\nusing Playnite.Emulators;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public partial class DesktopAppViewModel : MainViewModelBase, IDisposable, IMainViewModelBase\r\n    {\r\n        private static object gamesLock = new object();\r\n        protected bool ignoreCloseActions = false;\r\n        protected bool ignoreSelectionChanges = false;\r\n        private readonly SynchronizationContext context;\r\n        private Controls.LibraryStatistics statsView;\r\n        private Controls.Views.Library libraryView;\r\n        private SearchViewModel currentGlobalSearch;\r\n\r\n        public DesktopGamesEditor GamesEditor { get; }\r\n\r\n        private Control activeView;\r\n        public Control ActiveView\r\n        {\r\n            get => activeView;\r\n            set\r\n            {\r\n                activeView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private StatisticsViewModel libraryStats;\r\n        public StatisticsViewModel LibraryStats\r\n        {\r\n            get => libraryStats;\r\n            set\r\n            {\r\n                libraryStats = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private GameDetailsViewModel selectedGameDetails;\r\n        public GameDetailsViewModel SelectedGameDetails\r\n        {\r\n            get => selectedGameDetails;\r\n            set\r\n            {\r\n                if (selectedGameDetails != value)\r\n                {\r\n                    selectedGameDetails?.Dispose();\r\n                    selectedGameDetails = value;\r\n                }\r\n            }\r\n        }\r\n\r\n        public GamesCollectionViewEntry SelectedGame { get => SelectedGames?.Count > 0 ? SelectedGames[0] : null; }\r\n\r\n        private List<GamesCollectionViewEntry> selectedGames;\r\n        public List<GamesCollectionViewEntry> SelectedGames\r\n        {\r\n            get => selectedGames;\r\n            set\r\n            {\r\n                if (ignoreSelectionChanges)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                var oldValue = selectedGames;\r\n                selectedGames = value;\r\n                GamesCollectionViewEntry toSelect = null;\r\n                if (selectedGames?.Count > 0)\r\n                {\r\n                    toSelect = selectedGames[0];\r\n                }\r\n\r\n                if (SelectedGameDetails?.Game != toSelect)\r\n                {\r\n                    if (toSelect == null)\r\n                    {\r\n                        SelectedGameDetails = null;\r\n                    }\r\n                    else\r\n                    {\r\n                        SelectedGameDetails = new GameDetailsViewModel(toSelect, AppSettings, GamesEditor, Dialogs, Resources);\r\n                    }\r\n                }\r\n\r\n                OnPropertyChanged(nameof(SelectedGameDetails));\r\n                OnPropertyChanged(nameof(SelectedGame));\r\n                OnPropertyChanged();\r\n                if (!IsDisposing)\r\n                {\r\n                    Extensions.InvokeOnGameSelected(\r\n                        oldValue?.Select(a => a.Game).Distinct().ToList(),\r\n                        SelectedGames?.Select(a => a.Game).Distinct().ToList());\r\n                }\r\n\r\n                ignoreSelectionChanges = true;\r\n                SelectedGamesBinder = selectedGames?.Cast<object>().ToList();\r\n                ignoreSelectionChanges = false;\r\n\r\n                if (SelectedGames?.Count == 1)\r\n                {\r\n                    AppSettings.LastSelectedGame = SelectedGames[0].Id;\r\n                }\r\n            }\r\n        }\r\n\r\n        // SelectedGamesBinder is only used as a glue to bind to ListBox because its\r\n        // SelectedItems is IList which can't bind anything else.\r\n        private IList<object> selectedGamesBinder;\r\n        public IList<object> SelectedGamesBinder\r\n        {\r\n            get => selectedGamesBinder;\r\n            set\r\n            {\r\n                selectedGamesBinder = value;\r\n                if (selectedGamesBinder == null)\r\n                {\r\n                    SelectedGames = null;\r\n                }\r\n                else\r\n                {\r\n                    SelectedGames = selectedGamesBinder.Cast<GamesCollectionViewEntry>().ToList();\r\n                }\r\n\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool searchOpened = false;\r\n        public bool SearchOpened\r\n        {\r\n            get => searchOpened;\r\n            set\r\n            {\r\n                searchOpened = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Visibility visibility = Visibility.Visible;\r\n        public Visibility Visibility\r\n        {\r\n            get => visibility;\r\n            set\r\n            {\r\n                visibility = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private WindowState windowState = WindowState.Normal;\r\n        public WindowState WindowState\r\n        {\r\n            get => windowState;\r\n            set\r\n            {\r\n                if (value == WindowState.Minimized && AppSettings.MinimizeToTray && AppSettings.EnableTray)\r\n                {\r\n                    Visibility = Visibility.Hidden;\r\n                    ImageSourceManager.Cache.Clear();\r\n                }\r\n\r\n                windowState = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DatabaseStats gamesStats;\r\n        public DatabaseStats GamesStats\r\n        {\r\n            get => gamesStats;\r\n            set\r\n            {\r\n                gamesStats = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DatabaseExplorer databaseExplorer;\r\n        public DatabaseExplorer DatabaseExplorer\r\n        {\r\n            get => databaseExplorer;\r\n            set\r\n            {\r\n                databaseExplorer = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// This constructor should be used on from <see cref=\"DesignMainViewModel\"/> for Blend usage!\r\n        /// </summary>\r\n        public DesktopAppViewModel(\r\n            IGameDatabaseMain database,\r\n            PlayniteApplication app,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ExtensionFactory extensions) : base(database, app, dialogs, resources, extensions, null)\r\n        {\r\n        }\r\n\r\n        public DesktopAppViewModel(\r\n            IGameDatabaseMain database,\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            PlayniteSettings settings,\r\n            DesktopGamesEditor gamesEditor,\r\n            ExtensionFactory extensions,\r\n            PlayniteApplication app) : base(database, app, dialogs, resources, extensions, window)\r\n        {\r\n            context = SynchronizationContext.Current;\r\n            GamesEditor = gamesEditor;\r\n            AppSettings = settings;\r\n            App.Notifications.ActivationRequested += DesktopAppViewModel_ActivationRequested;\r\n            App.Notifications.CloseRequested += Notifications_CloseRequested;\r\n            AppSettings.FilterSettings.PropertyChanged += FilterSettings_PropertyChanged;\r\n            AppSettings.FilterSettings.FilterChanged += FilterSettings_FilterChanged;\r\n            AppSettings.ViewSettings.PropertyChanged += ViewSettings_PropertyChanged;\r\n            AppSettings.PropertyChanged += AppSettings_PropertyChanged;\r\n            GamesStats = new DatabaseStats(database);\r\n            InitializeCommands();\r\n        }\r\n\r\n        private void FilterSettings_FilterChanged(object sender, FilterChangedEventArgs e)\r\n        {\r\n            if (!IgnoreFilterChanges)\r\n            {\r\n                ActiveFilterPreset = null;\r\n            }\r\n        }\r\n\r\n        private void DesktopAppViewModel_ActivationRequested(object sender, NotificationsAPI.MessageEventArgs e)\r\n        {\r\n            App.Notifications.Remove(e.Message.Id);\r\n            if (App.Notifications.Messages.Count == 0)\r\n            {\r\n                AppSettings.NotificationPanelVisible = false;\r\n            }\r\n            e.Message.ActivationAction();\r\n        }\r\n\r\n        private void Notifications_CloseRequested(object sender, NotificationsAPI.MessageEventArgs e)\r\n        {\r\n            App.Notifications.Remove(e.Message.Id);\r\n            if (App.Notifications.Messages.Count == 0)\r\n            {\r\n                AppSettings.NotificationPanelVisible = false;\r\n            }\r\n        }\r\n\r\n        private void ViewSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (!IgnoreFilterChanges && ActiveFilterPreset != null)\r\n            {\r\n                if (ActiveFilterPreset.SortingOrder != null)\r\n                {\r\n                    ActiveFilterPreset = null;\r\n                }\r\n            }\r\n\r\n            if (e.PropertyName == nameof(ViewSettings.GamesViewType))\r\n            {\r\n                // This is done to keep behavior same as in P9 because it could otherwise break some plugins\r\n                // that set behavior of custom UI elements based on active view and they refresh on game seletion change.\r\n                if (SelectedGames != null)\r\n                {\r\n                    SelectedGames = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void AppSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            var oldDetailsListIconProperties = GamesCollectionViewEntry.DetailsListIconProperties;\r\n            var oldGridViewCoverProperties = GamesCollectionViewEntry.GridViewCoverProperties;\r\n            if (e.PropertyName == nameof(PlayniteSettings.GridItemWidth) ||\r\n                e.PropertyName == nameof(PlayniteSettings.CoverAspectRatio) ||\r\n                e.PropertyName == nameof(PlayniteSettings.CoverArtStretch) ||\r\n                e.PropertyName == nameof(PlayniteSettings.ImageScalerMode) ||\r\n                e.PropertyName == nameof(PlayniteSettings.DetailsViewListIconSize))\r\n            {\r\n                GamesCollectionViewEntry.InitItemViewProperties(App, AppSettings);\r\n            }\r\n\r\n            var notifyProps = new List<string>();\r\n            if (e.PropertyName == nameof(PlayniteSettings.DetailsViewListIconSize) && oldDetailsListIconProperties != GamesCollectionViewEntry.DetailsListIconProperties)\r\n            {\r\n                notifyProps.Add(nameof(GamesCollectionViewEntry.DetailsListIconObjectCached));\r\n                notifyProps.Add(nameof(GamesCollectionViewEntry.DefaultDetailsListIconObjectCached));\r\n            }\r\n\r\n            if ((e.PropertyName == nameof(PlayniteSettings.GridItemWidth) ||\r\n                e.PropertyName == nameof(PlayniteSettings.CoverAspectRatio) ||\r\n                e.PropertyName == nameof(PlayniteSettings.CoverArtStretch)) && oldGridViewCoverProperties != GamesCollectionViewEntry.GridViewCoverProperties)\r\n            {\r\n                notifyProps.Add(nameof(GamesCollectionViewEntry.GridViewCoverObjectCached));\r\n                notifyProps.Add(nameof(GamesCollectionViewEntry.DefaultGridViewCoverObjectCached));\r\n            }\r\n\r\n            if (notifyProps.HasItems())\r\n            {\r\n                GamesView.NotifyItemPropertyChanges(notifyProps.ToArray());\r\n            }\r\n\r\n            if (e.PropertyName == nameof(PlayniteSettings.SystemSearchHotkey))\r\n            {\r\n                RegisterSystemSearchHotkey();\r\n            }\r\n        }\r\n\r\n        private void FilterSettings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\r\n        {\r\n        }\r\n\r\n        public void RemoveGameSelection()\r\n        {\r\n            SelectedGames = null;\r\n        }\r\n\r\n        public void OpenSteamFriends()\r\n        {\r\n            try\r\n            {\r\n                ProcessStarter.StartUrl(@\"steam://open/friends\");\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(e, \"Failed to open Steam friends.\");\r\n            }\r\n        }\r\n\r\n        public static void ReportIssue()\r\n        {\r\n            CrashHandlerViewModel.ReportIssue();\r\n        }\r\n\r\n        public void ShutdownApp()\r\n        {\r\n            Dispose();\r\n            App.Quit();\r\n        }\r\n\r\n        protected void InitializeView()\r\n        {\r\n            if (App.GameController != null)\r\n            {\r\n                App.GameController.ButtonChanged += GameControllerInputButtonChanged;\r\n                App.GameController.ControllerConnected += GameControllerOnControllerConnected;\r\n                App.GameController.ControllerDisconnected += GameControllerOnControllerDisconnected;\r\n            }\r\n\r\n            GamesCollectionViewEntry.InitItemViewProperties(App, AppSettings);\r\n            LibraryStats = new StatisticsViewModel(Database, Extensions, AppSettings, SwitchToLibraryView, (g) =>\r\n            {\r\n                SwitchToLibraryView();\r\n                SelectGame(g.Id);\r\n            });\r\n\r\n            LoadSideBarItems();\r\n            DatabaseFilters = new DatabaseFilter(Database, Extensions, AppSettings, AppSettings.FilterSettings);\r\n            DatabaseExplorer = new DatabaseExplorer(Database, Extensions, AppSettings, this);\r\n\r\n            var openProgress = new ProgressViewViewModel(\r\n                new ProgressWindowFactory(),\r\n                new GlobalProgressOptions(LOC.OpeningDatabase));\r\n\r\n            if (openProgress.ActivateProgress((_) =>\r\n            {\r\n                if (!Database.IsOpen)\r\n                {\r\n                    Database.SetDatabasePath(AppSettings.DatabasePath);\r\n                    Database.OpenDatabase();\r\n                }\r\n            }).Result != true)\r\n            {\r\n                Logger.Error(openProgress.FailException, \"Failed to open library database.\");\r\n                var message = Resources.GetString(\"LOCDatabaseOpenError\") + $\"\\n{openProgress.FailException?.Message}\";\r\n                Dialogs.ShowErrorMessage(message, \"\");\r\n                GameAdditionAllowed = false;\r\n                return;\r\n            }\r\n\r\n            GamesView = new DesktopCollectionView(Database, AppSettings, Extensions);\r\n            BindingOperations.EnableCollectionSynchronization(GamesView.Items, gamesLock);\r\n\r\n            if (AppSettings.LastSelectedGame != Guid.Empty)\r\n            {\r\n                if (!SelectGameImpl(AppSettings.LastSelectedGame) && GamesView.CollectionView.Count > 0)\r\n                {\r\n                    SelectGame((GamesView.CollectionView.GetItemAt(0) as GamesCollectionViewEntry).Id);\r\n                }\r\n            }\r\n            else if (GamesView.CollectionView.Count > 0)\r\n            {\r\n                SelectGame((GamesView.CollectionView.GetItemAt(0) as GamesCollectionViewEntry).Id);\r\n            }\r\n            else\r\n            {\r\n                SelectedGames = null;\r\n            }\r\n\r\n            try\r\n            {\r\n                GamesEditor.UpdateJumpList();\r\n            }\r\n            catch (Exception exc)\r\n            {\r\n                Logger.Error(exc, \"Failed to set update JumpList data: \");\r\n            }\r\n\r\n            RunStartupScript();\r\n            Extensions.NotifiyOnApplicationStarted();\r\n\r\n            try\r\n            {\r\n                App.Discord = new DiscordManager(AppSettings.DiscordPresenceEnabled);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(e, \"Failed to initialize Discord manager.\");\r\n            }\r\n\r\n            LoadSoftwareToolsSidebarItems();\r\n            OnPropertyChanged(nameof(SortedFilterPresets));\r\n            OnPropertyChanged(nameof(SortedFilterFullscreenPresets));\r\n            if (AppSettings.SelectedFilterPreset != Guid.Empty)\r\n            {\r\n                ActiveFilterPreset = Database.FilterPresets.FirstOrDefault(a => a.Id == AppSettings.SelectedFilterPreset);\r\n            }\r\n\r\n            RegisterSystemSearchHotkey();\r\n            if (Database.IsOpen)\r\n            {\r\n                Database.Games.ItemCollectionChanged += Games_ItemCollectionChanged;\r\n            }\r\n        }\r\n\r\n        private void Games_ItemCollectionChanged(object sender, ItemCollectionChangedEventArgs<Game> e)\r\n        {\r\n            if (e.RemovedItems.HasItems() && SelectedGameDetails != null)\r\n            {\r\n                if (e.RemovedItems.Any(a => a.Id == SelectedGameDetails.Game.Id))\r\n                {\r\n                    SelectedGameDetails = null;\r\n                    OnPropertyChanged(nameof(SelectedGameDetails));\r\n                }\r\n            }\r\n        }\r\n\r\n        public override NotificationMessage GetAddonUpdatesFoundMessage(List<AddonUpdate> updates)\r\n        {\r\n            return new NotificationMessage(\"AddonUpdateAvailable\", Resources.GetString(LOC.AddonUpdatesAvailable), NotificationType.Info, () =>\r\n            {\r\n                new AddonsViewModel(\r\n                     new AddonsWindowFactory(),\r\n                     Dialogs,\r\n                     Resources,\r\n                     App.ServicesClient,\r\n                     Extensions,\r\n                     AppSettings,\r\n                     App,\r\n                     updates).OpenView();\r\n            });\r\n        }\r\n\r\n        public async Task DownloadMetadata(MetadataDownloaderSettings settings, List<Game> games)\r\n        {\r\n            GameAdditionAllowed = false;\r\n\r\n            try\r\n            {\r\n                if (GlobalTaskHandler.ProgressTask != null && GlobalTaskHandler.ProgressTask.Status == TaskStatus.Running)\r\n                {\r\n                    GlobalTaskHandler.CancelToken.Cancel();\r\n                    await GlobalTaskHandler.ProgressTask;\r\n                }\r\n\r\n                DatabaseFilters.IgnoreDatabaseUpdates = true;\r\n                GlobalTaskHandler.CancelToken = new CancellationTokenSource();\r\n                ProgressActive = true;\r\n                ProgressValue = 0;\r\n                ProgressTotal = games.Count;\r\n                ProgressStatus = Resources.GetString(\"LOCProgressMetadata\");\r\n\r\n                using (var downloader = new MetadataDownloader(Database, Extensions.MetadataPlugins, Extensions.LibraryPlugins))\r\n                {\r\n                    GlobalTaskHandler.ProgressTask =\r\n                        downloader.DownloadMetadataAsync(games, settings, AppSettings,\r\n                            (g, i, t) =>\r\n                            {\r\n                                ProgressValue = i + 1;\r\n                                ProgressStatus = Resources.GetString(\"LOCProgressMetadata\") + $\" [{ProgressValue}/{ProgressTotal}]\";\r\n                            },\r\n                            GlobalTaskHandler.CancelToken.Token);\r\n                    await GlobalTaskHandler.ProgressTask;\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                ProgressActive = false;\r\n                GameAdditionAllowed = true;\r\n                DatabaseFilters.IgnoreDatabaseUpdates = false;\r\n            }\r\n        }\r\n\r\n        public async Task SetSortingNames(List<Game> games)\r\n        {\r\n            if (!AppSettings.GameSortingNameAutofill)\r\n            {\r\n                return;\r\n            }\r\n\r\n            GameAdditionAllowed = false;\r\n\r\n            try\r\n            {\r\n                if (GlobalTaskHandler.ProgressTask != null && GlobalTaskHandler.ProgressTask.Status == TaskStatus.Running)\r\n                {\r\n                    Logger.Info(\"Waiting on other global task to complete before setting Sorting Name for newly added games.\");\r\n                    await GlobalTaskHandler.ProgressTask;\r\n                }\r\n\r\n                DatabaseFilters.IgnoreDatabaseUpdates = true;\r\n                GlobalTaskHandler.CancelToken = new CancellationTokenSource();\r\n                ProgressActive = true;\r\n                ProgressStatus = Resources.GetString(LOC.SortingNameAutofillProgress);\r\n\r\n                var c = new SortableNameConverter(AppSettings.GameSortingNameRemovedArticles, batchOperation: games.Count > 20);\r\n                using (Database.BufferedUpdate())\r\n                {\r\n                    foreach (var game in games)\r\n                    {\r\n                        if (GlobalTaskHandler.CancelToken.Token.IsCancellationRequested)\r\n                        {\r\n                            break;\r\n                        }\r\n\r\n                        var dbGame = Database.Games[game.Id];\r\n                        // This can be null in theory if a user deletes the game while overall library update procedure is in progress.\r\n                        if (dbGame == null)\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        string sortingName = c.Convert(dbGame.Name);\r\n                        if (sortingName != dbGame.Name)\r\n                        {\r\n                            dbGame.SortingName = sortingName;\r\n                            Database.Games.Update(dbGame);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            finally\r\n            {\r\n                ProgressActive = false;\r\n                GameAdditionAllowed = true;\r\n                DatabaseFilters.IgnoreDatabaseUpdates = false;\r\n            }\r\n        }\r\n\r\n        public async Task DownloadMetadata(MetadataDownloaderSettings settings)\r\n        {\r\n            List<Game> games = null;\r\n            if (settings.GamesSource == MetadataGamesSource.Selected)\r\n            {\r\n                if (SelectedGames != null && SelectedGames.Count() > 0)\r\n                {\r\n                    games = SelectedGames.Select(a => a.Game).Distinct().ToList();\r\n                }\r\n                else\r\n                {\r\n                    return;\r\n                }\r\n            }\r\n            else if (settings.GamesSource == MetadataGamesSource.AllFromDB)\r\n            {\r\n                games = Database.Games.ToList();\r\n            }\r\n            else if (settings.GamesSource == MetadataGamesSource.Filtered)\r\n            {\r\n                games = GamesView.CollectionView.Cast<GamesCollectionViewEntry>().Select(a => a.Game).Distinct().ToList();\r\n            }\r\n\r\n            await DownloadMetadata(settings, games);\r\n        }\r\n\r\n        public async void DownloadMetadata(MetadataDownloadViewModel model)\r\n        {\r\n            if (model.OpenView(MetadataDownloadViewModel.ViewMode.Manual, AppSettings.MetadataSettings.GetClone()) != true)\r\n            {\r\n                return;\r\n            }\r\n\r\n            await DownloadMetadata(model.Settings);\r\n        }\r\n\r\n        public void RestoreWindow()\r\n        {\r\n            Window.RestoreWindow();\r\n        }\r\n\r\n        public void AddCustomGame(IWindowFactory window)\r\n        {\r\n            var newGame = new Game()\r\n            {\r\n                Name = \"New Game\",\r\n                CompletionStatusId = Database.GetCompletionStatusSettings().DefaultStatus\r\n            };\r\n\r\n            Database.Games.Add(newGame);\r\n            if (GamesEditor.EditGame(newGame) == true)\r\n            {\r\n                SelectGame(newGame.Id);\r\n            }\r\n            else\r\n            {\r\n                Database.Games.Remove(newGame);\r\n            }\r\n        }\r\n\r\n        public async void ImportWindowsStoreGames(InstalledGamesViewModel model)\r\n        {\r\n            if (model.OpenViewOnWindowsApps() == true && model.SelectedGames?.Any() == true)\r\n            {\r\n                var addedGames = InstalledGamesViewModel.AddImportableGamesToDb(model.SelectedGames, Database);\r\n                if (AppSettings.DownloadMetadataOnImport)\r\n                {\r\n                    if (!GlobalTaskHandler.IsActive)\r\n                    {\r\n                        await DownloadMetadata(AppSettings.MetadataSettings, addedGames);\r\n                    }\r\n                    else\r\n                    {\r\n                        Logger.Warn(\"Skipping metadata download for manually added games, some global task is already in progress.\");\r\n                    }\r\n                }\r\n\r\n                if (!GlobalTaskHandler.IsActive)\r\n                {\r\n                    GlobalTaskHandler.CancelToken = new CancellationTokenSource();\r\n                    GlobalTaskHandler.ProgressTask = Task.Run(() => UpdateGamesInstallSizes(GlobalTaskHandler.CancelToken.Token, addedGames, LOC.ProgressScanningImportedGamesInstallSize));\r\n                    await GlobalTaskHandler.ProgressTask;\r\n                }\r\n\r\n                await SetSortingNames(addedGames);\r\n            }\r\n        }\r\n\r\n        public async void ImportInstalledGames(InstalledGamesViewModel model, string path)\r\n        {\r\n            if (model.OpenView(path) == true && model.SelectedGames?.Any() == true)\r\n            {\r\n                var addedGames = InstalledGamesViewModel.AddImportableGamesToDb(model.SelectedGames, Database);\r\n                if (AppSettings.DownloadMetadataOnImport)\r\n                {\r\n                    if (!GlobalTaskHandler.IsActive)\r\n                    {\r\n                        await DownloadMetadata(AppSettings.MetadataSettings, addedGames);\r\n                    }\r\n                    else\r\n                    {\r\n                        Logger.Warn(\"Skipping metadata download for manually added games, some global task is already in progress.\");\r\n                    }\r\n                }\r\n\r\n                if (!GlobalTaskHandler.IsActive)\r\n                {\r\n                    GlobalTaskHandler.CancelToken = new CancellationTokenSource();\r\n                    GlobalTaskHandler.ProgressTask = Task.Run(() => UpdateGamesInstallSizes(GlobalTaskHandler.CancelToken.Token, addedGames, LOC.ProgressScanningImportedGamesInstallSize));\r\n                    await GlobalTaskHandler.ProgressTask;\r\n                }\r\n\r\n                await SetSortingNames(addedGames);\r\n            }\r\n        }\r\n\r\n        public async void ImportEmulatedGames(EmulatedGamesImportViewModel model)\r\n        {\r\n            if (model.OpenView() != true || !model.ImportedGames.HasItems())\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (AppSettings.DownloadMetadataOnImport)\r\n            {\r\n                if (!GlobalTaskHandler.IsActive)\r\n                {\r\n                    await DownloadMetadata(AppSettings.MetadataSettings, model.ImportedGames);\r\n                }\r\n                else\r\n                {\r\n                    Logger.Warn(\"Skipping metadata download for manually added emulated games, some global task is already in progress.\");\r\n                }\r\n            }\r\n\r\n            if (!GlobalTaskHandler.IsActive)\r\n            {\r\n                GlobalTaskHandler.CancelToken = new CancellationTokenSource();\r\n                GlobalTaskHandler.ProgressTask = Task.Run(() => UpdateGamesInstallSizes(GlobalTaskHandler.CancelToken.Token, model.ImportedGames, LOC.ProgressScanningImportedGamesInstallSize));\r\n                await GlobalTaskHandler.ProgressTask;\r\n            }\r\n\r\n            await SetSortingNames(model.ImportedGames);\r\n        }\r\n\r\n        public void OpenAboutWindow(AboutViewModel model)\r\n        {\r\n            model.OpenView();\r\n        }\r\n\r\n        public void OpenIntegrationSettings(LibraryIntegrationsViewModel model)\r\n        {\r\n            model.OpenView();\r\n        }\r\n\r\n        public void ConfigureEmulators(EmulatorsViewModel model)\r\n        {\r\n            model.OpenView();\r\n        }\r\n\r\n        private void ConfigureSoftwareTools(ToolsConfigViewModel model)\r\n        {\r\n            model.OpenView();\r\n        }\r\n\r\n        public void ConfigureDatabaseFields(DatabaseFieldsManagerViewModel model)\r\n        {\r\n            model.OpenView();\r\n        }\r\n\r\n        public bool SelectGameImpl(Guid id, bool restoreView = false)\r\n        {\r\n            var viewEntry = GamesView.Items.FirstOrDefault(a => a.Game.Id == id);\r\n            if (viewEntry != null)\r\n            {\r\n                SelectedGames = new List<GamesCollectionViewEntry>(1) { viewEntry };\r\n            }\r\n\r\n            if (restoreView && Window?.Window?.IsActive == false)\r\n            {\r\n                Window.RestoreWindow();\r\n            }\r\n\r\n            return viewEntry != null;\r\n        }\r\n\r\n        public override void SelectGame(Guid id, bool restoreView = false)\r\n        {\r\n            SelectGameImpl(id, restoreView);\r\n        }\r\n\r\n        public void SelectGames(IEnumerable<Guid> gameIds, bool restoreView = false)\r\n        {\r\n            if (!gameIds.HasItems())\r\n            {\r\n                return;\r\n            }\r\n\r\n            var entries = GamesView.Items.Where(a => gameIds.Contains(a.Game.Id));\r\n            if (entries.HasItems())\r\n            {\r\n                SelectedGames = entries.ToList();\r\n            }\r\n\r\n            if (restoreView && Window?.Window?.IsActive == false)\r\n            {\r\n                Window.RestoreWindow();\r\n            }\r\n        }\r\n\r\n        protected virtual void OnClosing(CancelEventArgs args)\r\n        {\r\n            if (ignoreCloseActions)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (AppSettings.CloseToTray && AppSettings.EnableTray)\r\n            {\r\n                Visibility = Visibility.Hidden;\r\n                args.Cancel = true;\r\n                ImageSourceManager.Cache.Clear();\r\n            }\r\n            else\r\n            {\r\n                if (GlobalTaskHandler.IsActive)\r\n                {\r\n                    if (Dialogs.ShowMessage(\r\n                        Resources.GetString(\"LOCBackgroundProgressCancelAskExit\"),\r\n                        Resources.GetString(\"LOCCrashClosePlaynite\"),\r\n                        MessageBoxButton.YesNo) != MessageBoxResult.Yes)\r\n                    {\r\n                        args.Cancel = true;\r\n                        return;\r\n                    }\r\n                }\r\n\r\n                ShutdownApp();\r\n            }\r\n        }\r\n\r\n        private void OnFileDropped(DragEventArgs args)\r\n        {\r\n            if (args.Data.GetDataPresent(DataFormats.FileDrop))\r\n            {\r\n                var files = (string[])args.Data.GetData(DataFormats.FileDrop);\r\n                if (files.Count() == 1)\r\n                {\r\n                    Window.RestoreWindow();\r\n\r\n                    var path = files[0];\r\n                    if (File.Exists(path))\r\n                    {\r\n                        var ext = Path.GetExtension(path).ToLower();\r\n                        if (ext.Equals(PlaynitePaths.PackedThemeFileExtention, StringComparison.OrdinalIgnoreCase))\r\n                        {\r\n                            App.InstallThemeFile(path);\r\n                        }\r\n                        else if (ext.Equals(PlaynitePaths.PackedExtensionFileExtention, StringComparison.OrdinalIgnoreCase))\r\n                        {\r\n                            App.InstallExtensionFile(path);\r\n                        }\r\n                        else\r\n                        {\r\n                            // Other file types to be added in #501\r\n                            if (!(new List<string>() { \".exe\", \".lnk\", \".url\" }).Contains(ext))\r\n                            {\r\n                                return;\r\n                            }\r\n\r\n                            Game game = null;\r\n                            try\r\n                            {\r\n                                game = GameExtensions.GetGameFromExecutable(path);\r\n                            }\r\n                            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                            {\r\n                                Logger.Error(e, \"Failed to get game data from file.\");\r\n                                return;\r\n                            }\r\n\r\n                            var icoPath = game.Icon;\r\n                            game.Icon = null;\r\n                            if (icoPath.IsNullOrEmpty())\r\n                            {\r\n                                var exePath = game.GetRawExecutablePath();\r\n                                if (!string.IsNullOrEmpty(exePath))\r\n                                {\r\n                                    icoPath = exePath;\r\n                                }\r\n                            }\r\n\r\n                            if (!icoPath.IsNullOrEmpty())\r\n                            {\r\n                                game.Icon = Database.AddFile(icoPath, game.Id, true, CancellationToken.None);\r\n                            }\r\n\r\n                            Database.Games.Add(game);\r\n                            if (GamesEditor.EditGame(game) == true)\r\n                            {\r\n                                SelectGame(game.Id);\r\n                            }\r\n                            else\r\n                            {\r\n                                Database.Games.Remove(game);\r\n                            }\r\n                        }\r\n                    }\r\n                    else if (Directory.Exists(path))\r\n                    {\r\n                        var instModel = new InstalledGamesViewModel(\r\n                           new InstalledGamesWindowFactory(),\r\n                           Dialogs,\r\n                           Database);\r\n                        ImportInstalledGames(instModel, path);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ClearMessages()\r\n        {\r\n            App.Notifications.RemoveAll();\r\n            AppSettings.NotificationPanelVisible = false;\r\n        }\r\n\r\n        public void CheckForUpdate()\r\n        {\r\n            var updater = new Updater(App);\r\n            var appUpdateAvailable = false;\r\n            var addonUpdates = new List<AddonUpdate>();\r\n            var dialogRes = Dialogs.ActivateGlobalProgress((args) =>\r\n                {\r\n                    appUpdateAvailable = updater.IsUpdateAvailable;\r\n                    args.Text = LOC.AddonLookingForUpdates.GetLocalized();\r\n                    addonUpdates = Addons.CheckAddonUpdates(App.ServicesClient);\r\n                },\r\n                new GlobalProgressOptions(LOC.AppLookingForUpdates) { IsIndeterminate = true });\r\n\r\n            if (dialogRes.Result != true)\r\n            {\r\n                Dialogs.ShowErrorMessage(dialogRes.Error?.Message ?? \"Update check failed.\");\r\n                return;\r\n            }\r\n\r\n            if (!appUpdateAvailable && !addonUpdates.HasItems())\r\n            {\r\n                Dialogs.ShowMessage(LOC.UpdateNoNewUpdateMessage.GetLocalized(), string.Empty);\r\n                return;\r\n            }\r\n\r\n            if (appUpdateAvailable)\r\n            {\r\n                var model = new UpdateViewModel(updater, new UpdateWindowFactory(), Resources, Dialogs, App.Mode);\r\n                if (model.OpenView() == true)\r\n                    return;\r\n            }\r\n\r\n            if (addonUpdates.HasItems())\r\n            {\r\n                var model = new AddonsViewModel(new AddonsWindowFactory(), Dialogs, Resources, App.ServicesClient, Extensions, AppSettings, App, addonUpdates);\r\n                model.OpenView();\r\n            }\r\n        }\r\n\r\n        public void SwitchToFullscreenMode()\r\n        {\r\n            Logger.Info(\"Switching to Fullscreen mode.\");\r\n            if (GlobalTaskHandler.IsActive)\r\n            {\r\n                if (Dialogs.ShowMessage(\r\n                    Resources.GetString(LOC.BackgroundProgressCancelAskSwitchMode),\r\n                    Resources.GetString(LOC.MenuOpenFullscreen),\r\n                    MessageBoxButton.YesNo) != MessageBoxResult.Yes)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                var dialogRes = Dialogs.ActivateGlobalProgress((_) =>\r\n                    {\r\n                        var waitRes = GlobalTaskHandler.CancelAndWait(30_000);\r\n                        if (waitRes == false)\r\n                        {\r\n                            Logger.Error(\"Active global task failed to finish in time when switching to fullscreen mode.\");\r\n                        }\r\n                    },\r\n                    new GlobalProgressOptions(LOC.OpeningFullscreenModeMessage));\r\n                if (dialogRes.Error != null)\r\n                {\r\n                    Logger.Error(dialogRes.Error, \"Cancelling global task when switching to fullscreen mode failed.\");\r\n                }\r\n            }\r\n\r\n            CloseView();\r\n            App.QuitAndStart(\r\n                PlaynitePaths.FullscreenExecutablePath,\r\n                new CmdLineOptions()\r\n                {\r\n                    SkipLibUpdate = true,\r\n                    StartInFullscreen = true,\r\n                    MasterInstance = true,\r\n                    SafeStartup = App.CmdLine.SafeStartup,\r\n                    UserDataDir = App.CmdLine.UserDataDir\r\n                }.ToString());\r\n        }\r\n\r\n        public void PlayRandomGame()\r\n        {\r\n            var model = new RandomGameSelectViewModel(\r\n                Database,\r\n                GamesView,\r\n                new RandomGameSelectWindowFactory(),\r\n                Resources);\r\n            model.OpenView();\r\n            if (model.SelectedAction == RandomGameSelectAction.Play)\r\n            {\r\n                SelectGame(model.SelectedGame.Id);\r\n                GamesEditor.PlayGame(model.SelectedGame, true);\r\n            }\r\n            else if (model.SelectedAction == RandomGameSelectAction.Navigate)\r\n            {\r\n                if (AppSettings.ViewSettings.GamesViewType == DesktopView.List)\r\n                {\r\n                    AppSettings.ViewSettings.GamesViewType = DesktopView.Details;\r\n                }\r\n                else if (AppSettings.ViewSettings.GamesViewType == DesktopView.Grid)\r\n                {\r\n                    if (!AppSettings.GridViewSideBarVisible)\r\n                    {\r\n                        AppSettings.GridViewSideBarVisible = true;\r\n                    }\r\n                }\r\n\r\n                SelectGame(model.SelectedGame.Id);\r\n            }\r\n        }\r\n\r\n        public void ViewSelectRandomGame()\r\n        {\r\n            var count = GamesView.CollectionView.Count;\r\n            if (count == 1)\r\n            {\r\n                SelectGame((GamesView.CollectionView.GetItemAt(0) as GamesCollectionViewEntry).Id);\r\n            }\r\n            else if (count > 1)\r\n            {\r\n                while (true)\r\n                {\r\n                    var index = GlobalRandom.Next(0, count);\r\n                    var newGame = GamesView.CollectionView.GetItemAt(index) as GamesCollectionViewEntry;\r\n                    if (SelectedGame == null || SelectedGame != newGame)\r\n                    {\r\n                        SelectGame(newGame.Id);\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public void OpenView()\r\n        {\r\n            if (App.CmdLine.StartClosedToTray && AppSettings.EnableTray)\r\n            {\r\n                Visibility = Visibility.Hidden;\r\n            }\r\n\r\n            Window.Show(this);\r\n            App.UpdateScreenInformation(Window.Window);\r\n            Window.Window.LocationChanged += Window_LocationChanged;\r\n\r\n            if (AppSettings.StartMinimized)\r\n            {\r\n                WindowState = WindowState.Minimized;\r\n            }\r\n            else\r\n            {\r\n                Window.RestoreWindow();\r\n            }\r\n\r\n            InitializeView();\r\n        }\r\n\r\n        public override void CloseView()\r\n        {\r\n            ignoreCloseActions = true;\r\n            Window.Close();\r\n            ignoreCloseActions = false;\r\n            Dispose();\r\n        }\r\n\r\n        public virtual void ClearFilters()\r\n        {\r\n            AppSettings.FilterSettings.ClearFilters();\r\n            ActiveFilterPreset = null;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            IsDisposing = true;\r\n            GamesView?.Dispose();\r\n            GamesStats?.Dispose();\r\n            AppSettings.FilterSettings.PropertyChanged -= FilterSettings_PropertyChanged;\r\n            Window.Window.LocationChanged -= Window_LocationChanged;\r\n        }\r\n\r\n        private void Window_LocationChanged(object sender, EventArgs e)\r\n        {\r\n            App.UpdateScreenInformation(Window.Window);\r\n        }\r\n\r\n        public bool OpenPluginSettings(Guid pluginId)\r\n        {\r\n            if (!Extensions.Plugins.ContainsKey(pluginId))\r\n            {\r\n                Logger.Error($\"Cannot open plugin settings, plugin is not loaded {pluginId}\");\r\n                return false;\r\n            }\r\n\r\n            var model = new PluginSettingsViewModel(\r\n                new PluginSettingsWindowFactory(),\r\n                Resources,\r\n                Dialogs,\r\n                Extensions,\r\n                pluginId);\r\n            return model.OpenView() ?? false;\r\n        }\r\n\r\n        public void SwitchToLibraryView()\r\n        {\r\n            SidebarItems.First(a => a.SideItem is MainSidebarViewItem item && item.AppView == ApplicationView.Library).Command.Execute(null);\r\n        }\r\n\r\n        internal void ProcessUriRequest(PlayniteUriEventArgs args)\r\n        {\r\n            var arguments = args.Arguments;\r\n            if (args.Arguments.Count() == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var command = arguments[0];\r\n            switch (command)\r\n            {\r\n                case UriCommands.ShowGame:\r\n                    if (Guid.TryParse(arguments[1], out var gameId))\r\n                    {\r\n                        var game = Database.Games[gameId];\r\n                        if (game == null)\r\n                        {\r\n                            Logger.Error($\"Cannot display game, game {arguments[1]} not found.\");\r\n                        }\r\n                        else\r\n                        {\r\n                            RestoreWindow();\r\n                            SwitchToLibraryView();\r\n                            SelectGame(game.Id);\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        Logger.Error($\"Can't display game, failed to parse game id: {arguments[1]}\");\r\n                    }\r\n\r\n                    break;\r\n\r\n                case UriCommands.Restore:\r\n                    Window.Window.RestoreWindow();\r\n                    break;\r\n\r\n                default:\r\n                    Logger.Warn($\"Uknown URI command {command}\");\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public override IEnumerable<SearchItem> GetSearchCommands()\r\n        {\r\n            SearchItem createItemG<T>(string root, string name, RelayCommand<T> command, T commandParam = null, object icon = null) where T : class\r\n            {\r\n                return new SearchItem(\r\n                    root.IsNullOrEmpty() ? name.GetLocalized() : $\"{root.GetLocalized()} > {name.GetLocalized()}\",\r\n                    LOC.Open,\r\n                    () => command.Execute(commandParam),\r\n                    icon);\r\n            }\r\n\r\n            SearchItem createItemH(string root, string name, RelayCommand command, object icon = null)\r\n            {\r\n                return new SearchItem(\r\n                    root.IsNullOrEmpty() ? name.GetLocalized() : $\"{root.GetLocalized()} > {name.GetLocalized()}\",\r\n                    LOC.Open,\r\n                    () => command.Execute(),\r\n                    icon);\r\n            }\r\n\r\n            SearchItem createItem<T>(string root, string name, RelayCommand<T> command, T commandParam, object icon = null)\r\n            {\r\n                return new SearchItem(\r\n                    root.IsNullOrEmpty() ? name.GetLocalized() : $\"{root.GetLocalized()} > {name.GetLocalized()}\",\r\n                    LOC.Open,\r\n                    () => command.Execute(commandParam),\r\n                    icon);\r\n            }\r\n\r\n            // Add game\r\n            yield return createItemG(LOC.MenuAddGame, LOC.MenuAddGameManual, AddCustomGameCommand);\r\n            yield return createItemG(LOC.MenuAddGame, LOC.MenuAddGameInstalled, AddInstalledGamesCommand);\r\n            yield return createItemG(LOC.MenuAddGame, LOC.MenuAddGameEmulated, AddEmulatedGamesCommand);\r\n            yield return createItemG(LOC.MenuAddGame, LOC.MenuAddWindowsStore, AddWindowsStoreGamesCommand);\r\n\r\n            // Library\r\n            yield return createItemG(LOC.Library, LOC.MenuConfigureIntegrations, OpenLibraryIntegrationsConfigCommand);\r\n            yield return createItemG(LOC.Library, LOC.MenuLibraryManagerTitle, OpenDbFieldsManagerCommand);\r\n            yield return createItemG(LOC.Library, LOC.MenuConfigureEmulatorsMenuTitle, OpenEmulatorsCommand);\r\n            yield return createItemG(LOC.Library, LOC.MenuDownloadMetadata, DownloadMetadataCommand);\r\n            yield return createItemG(LOC.Library, LOC.MenuSoftwareTools, OpenSoftwareToolsCommand);\r\n            yield return createItemH(LOC.Library, LOC.MenuBackupData, BackupDataCommand, \"BackupIcon\");\r\n            yield return createItemH(LOC.Library, LOC.MenuRestoreBackup, RestoreDataBackupCommand, \"RestoreBackupIcon\");\r\n\r\n            // Library update\r\n            foreach (var plugin in Extensions.LibraryPlugins)\r\n            {\r\n                yield return createItemG(LOC.MenuReloadLibrary, plugin.Name, UpdateLibraryCommand, plugin, plugin.LibraryIcon);\r\n            }\r\n\r\n            // Extensions main menu items\r\n            foreach (var item in MenuItems.GetSearchExtensionsMainMenuItem(this))\r\n            {\r\n                yield return item;\r\n            }\r\n\r\n            // Extensions global commands\r\n            foreach (var item in MenuItems.GetGlobalPluginCommands(this))\r\n            {\r\n                yield return item;\r\n            }\r\n\r\n            // Switch mode\r\n            yield return new SearchItem(LOC.MenuOpenFullscreen, LOC.Activate, () => SwitchToFullscreenMode(), \"FullscreenModeIcon\");\r\n\r\n            // Settings\r\n            yield return new SearchItem(LOC.MenuPlayniteSettingsTitle, LOC.Open, () => OpenSettingsCommand.Execute(null), \"SettingsIcon\");\r\n\r\n            // Plugin settings\r\n            foreach (var plugin in Extensions.Plugins)\r\n            {\r\n                yield return createItem(LOC.ExtensionSettingsMenu, plugin.Value.Description.Name, OpenPluginSettingsCommand, plugin.Key, plugin.Value.PluginIcon);\r\n            }\r\n\r\n            // Random game\r\n            yield return new SearchItem(LOC.MenuSelectRandomGame, LOC.Open, () => SelectRandomGameCommand.Execute(null), \"DiceIcon\");\r\n\r\n            // Addons window\r\n            yield return new SearchItem(LOC.MenuAddons, LOC.Open, () => OpenAddonsCommand.Execute(null), \"AddonsIcon\");\r\n\r\n            // Open client\r\n            foreach (var tool in ThirdPartyTools)\r\n            {\r\n                yield return createItem(LOC.MenuOpenClient, tool.Name, ThirdPartyToolOpenCommand, tool, tool.Icon);\r\n            }\r\n\r\n            // Check for updates\r\n            yield return new SearchItem(LOC.CheckForUpdates, LOC.Activate, () => CheckForUpdateCommand.Execute(null));\r\n\r\n            // Help\r\n            yield return new SearchItem(LOC.MenuAbout, LOC.Open, () => OpenAboutCommand.Execute(null), \"AboutPlayniteIcon\");\r\n            yield return new SearchItem(LOC.CrashRestartSafe, LOC.Activate, () => RestartInSafeMode.Execute(null));\r\n            yield return createItemG(LOC.MenuHelpTitle, LOC.OpenGameManual, GlobalCommands.NavigateUrlCommand, UrlConstants.SdkDocs);\r\n            yield return createItemG(LOC.MenuHelpTitle, LOC.MenuIssues, ReportIssueCommand);\r\n            yield return createItemG(LOC.MenuHelpTitle, LOC.SDKDocumentation, GlobalCommands.NavigateUrlCommand, UrlConstants.SdkDocs);\r\n\r\n            // Restore window\r\n            yield return new SearchItem(LOC.RestoreWindow, LOC.Activate, () => Window.RestoreWindow());\r\n\r\n            // Exit\r\n            yield return new SearchItem(LOC.ExitPlaynite, LOC.Activate, () => ShutdownCommand.Execute(null), \"ExitIcon\");\r\n        }\r\n\r\n        public override void OpenSettings(int settingsPageIndex)\r\n        {\r\n            new SettingsViewModel(Database,\r\n                AppSettings,\r\n                new SettingsWindowFactory(),\r\n                Dialogs,\r\n                Resources,\r\n                Extensions,\r\n                App).OpenView((DesktopSettingsPage)settingsPageIndex);\r\n        }\r\n\r\n        public void OpenSettings()\r\n        {\r\n            OpenSettings(0);\r\n        }\r\n\r\n        public override void EditGame(Game game)\r\n        {\r\n            if (GamesEditor.EditGame(game) == true)\r\n            {\r\n                SelectGame(game.Id);\r\n            }\r\n        }\r\n\r\n        public override void AssignCategories(Game game)\r\n        {\r\n            if (GamesEditor.SetGameCategories(game) == true)\r\n            {\r\n                SelectGame(game.Id);\r\n            }\r\n        }\r\n\r\n        public void OpenSearch()\r\n        {\r\n            if (AppSettings.ShowTopPanelSearchBox && AppSettings.GlobalSearchOpenWithLegacySearch)\r\n            {\r\n                OpenGlobalSearch();\r\n            }\r\n            else if (AppSettings.ShowTopPanelSearchBox && !AppSettings.GlobalSearchOpenWithLegacySearch)\r\n            {\r\n                FocusSearchBox();\r\n            }\r\n            else\r\n            {\r\n                OpenGlobalSearch();\r\n            }\r\n        }\r\n\r\n        public void FocusSearchBox()\r\n        {\r\n            SearchOpened = false;\r\n            SearchOpened = true;\r\n        }\r\n\r\n        public void OpenGlobalSearch()\r\n        {\r\n            if (currentGlobalSearch != null)\r\n            {\r\n                if (currentGlobalSearch.Active)\r\n                {\r\n                    currentGlobalSearch.Close();\r\n                }\r\n                else\r\n                {\r\n                    currentGlobalSearch.Focus();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                CreateAndSetGlobalSearchView();\r\n                currentGlobalSearch.OpenSearch();\r\n            }\r\n        }\r\n\r\n        public void OpenSearch(string searchTerm)\r\n        {\r\n            currentGlobalSearch?.Close();\r\n            CreateAndSetGlobalSearchView();\r\n            currentGlobalSearch.OpenSearch(searchTerm);\r\n        }\r\n\r\n        public void OpenSearch(SearchContext context, string searchTerm)\r\n        {\r\n            currentGlobalSearch?.Close();\r\n            CreateAndSetGlobalSearchView();\r\n            currentGlobalSearch.OpenSearch(context, searchTerm);\r\n        }\r\n\r\n        private SearchViewModel CreateAndSetGlobalSearchView()\r\n        {\r\n            currentGlobalSearch = new SearchViewModel(\r\n              new SearchWindowFactory(),\r\n              Database,\r\n              Extensions,\r\n              this);\r\n            currentGlobalSearch.SearchClosed += (_, __) => currentGlobalSearch = null;\r\n            return currentGlobalSearch;\r\n        }\r\n\r\n        public void RegisterSystemSearchHotkey()\r\n        {\r\n            UnregisterSystemSearchHotkey();\r\n            if (AppSettings.SystemSearchHotkey == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                Window.Window.RegisterHotKeyHandler(1337, AppSettings.SystemSearchHotkey, () =>\r\n                {\r\n                    OpenGlobalSearch();\r\n                });\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(e, \"Failed to register system search hotkey.\");\r\n            }\r\n        }\r\n\r\n        public void UnregisterSystemSearchHotkey()\r\n        {\r\n            try\r\n            {\r\n                Window.Window.UnregisterHotKeyHandler(1337);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(e, \"Failed to unregister system search hotkey.\");\r\n            }\r\n        }\r\n\r\n        private void GameControllerInputButtonChanged(object sender, OnControllerButtonStateChangedArgs e)\r\n        {\r\n            foreach (var plugin in Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnDesktopControllerButtonStateChanged(e);\r\n                }\r\n                catch (Exception exc)\r\n                {\r\n                    Logger.Error(exc, $\"Plugin {plugin.Description.Id} failed to process controller input.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private void GameControllerOnControllerDisconnected(object sender, OnControllerDisconnectedArgs e)\r\n        {\r\n            foreach (var plugin in Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnControllerDisconnected(e);\r\n                }\r\n                catch (Exception exc)\r\n                {\r\n                    Logger.Error(exc, $\"Plugin {plugin.Description.Id} failed to process controller connected event.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private void GameControllerOnControllerConnected(object sender, OnControllerConnectedArgs e)\r\n        {\r\n            foreach (var plugin in Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnControllerConnected(e);\r\n                }\r\n                catch (Exception exc)\r\n                {\r\n                    Logger.Error(exc, $\"Plugin {plugin.Description.Id} failed to process controller disconnected event.\");\r\n                }\r\n            }\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/DesktopAppViewModel_Commands.cs",
    "content": "﻿using Playnite.DesktopApp.Windows;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Exceptions;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public partial class DesktopAppViewModel\r\n    {\r\n        public RelayCommand<object> ToggleExplorerPanelCommand { get; private set; }\r\n        public RelayCommand<object> ToggleFilterPanelCommand { get; private set; }\r\n        public RelayCommand<object> OpenFilterPanelCommand { get; private set; }\r\n        public RelayCommand<object> CloseFilterPanelCommand { get; private set; }\r\n        public RelayCommand<object> CloseNotificationPanelCommand { get; private set; }\r\n        public RelayCommand<object> UpdateGamesCommand { get; private set; }\r\n        public RelayCommand<object> OpenSteamFriendsCommand { get; private set; }\r\n        public RelayCommand<object> ReportIssueCommand { get; private set; }\r\n        public RelayCommand<object> ShutdownCommand { get; private set; }\r\n        public RelayCommand<object> ShowWindowCommand { get; private set; }\r\n        public RelayCommand<CancelEventArgs> WindowClosingCommand { get; private set; }\r\n        public RelayCommand<DragEventArgs> FileDroppedCommand { get; private set; }\r\n        public RelayCommand<object> OpenAboutCommand { get; private set; }\r\n        public RelayCommand<object> OpenEmulatorsCommand { get; private set; }\r\n        public RelayCommand<object> OpenSettingsCommand { get; private set; }\r\n        public RelayCommand<object> OpenAddonsCommand { get; private set; }\r\n        public RelayCommand<object> AddCustomGameCommand { get; private set; }\r\n        public RelayCommand<object> AddInstalledGamesCommand { get; private set; }\r\n        public RelayCommand<object> AddEmulatedGamesCommand { get; private set; }\r\n        public RelayCommand<object> AddWindowsStoreGamesCommand { get; private set; }\r\n        public RelayCommand<object> OpenFullScreenCommand { get; private set; }\r\n        public RelayCommand<object> OpenFullScreenFromControllerCommand { get; private set; }\r\n        public RelayCommand<object> ClearMessagesCommand { get; private set; }\r\n        public RelayCommand<object> DownloadMetadataCommand { get; private set; }\r\n        public RelayCommand<object> OpenSoftwareToolsCommand { get; private set; }\r\n        public RelayCommand<object> ClearFiltersCommand { get; private set; }\r\n        public RelayCommand<object> RemoveGameSelectionCommand { get; private set; }\r\n        public RelayCommand<ExtensionFunction> InvokeExtensionFunctionCommand { get; private set; }\r\n        public RelayCommand<object> ReloadScriptsCommand { get; private set; }\r\n        public RelayCommand<GamesCollectionViewEntry> ShowGameSideBarCommand { get; private set; }\r\n        public RelayCommand<object> CloseGameSideBarCommand { get; private set; }\r\n        public RelayCommand<object> OpenSearchCommand { get; private set; }\r\n        public RelayCommand OpenGlobalSearchCommand { get; private set; }\r\n        public RelayCommand<object> CheckForUpdateCommand { get; private set; }\r\n        public RelayCommand<object> OpenDbFieldsManagerCommand { get; private set; }\r\n        public RelayCommand<object> OpenLibraryIntegrationsConfigCommand { get; private set; }\r\n        public RelayCommand<LibraryPlugin> UpdateLibraryCommand { get; private set; }\r\n        public RelayCommand UpdateEmulationDirsCommand { get; private set; }\r\n        public RelayCommand<GameScannerConfig> UpdateEmulationDirCommand { get; private set; }\r\n        public RelayCommand<Guid> OpenPluginSettingsCommand { get; private set; }\r\n\r\n        public RelayCommand<Game> StartGameCommand { get; private set; }\r\n        public RelayCommand<Game> StartGameFromTrayCommand { get; private set; }\r\n        public RelayCommand<AppSoftware> StartSoftwareToolCommand { get; private set; }\r\n        public RelayCommand<Game> InstallGameCommand { get; private set; }\r\n        public RelayCommand<Game> UninstallGameCommand { get; private set; }\r\n        public RelayCommand<object> StartSelectedGameCommand { get; private set; }\r\n        public RelayCommand<object> EditSelectedGamesCommand { get; private set; }\r\n        public RelayCommand<object> RemoveSelectedGamesCommand { get; private set; }\r\n        public RelayCommand<Game> EditGameCommand { get; private set; }\r\n        public RelayCommand<IEnumerable<Game>> EditGamesCommand { get; private set; }\r\n        public RelayCommand<Game> OpenGameLocationCommand { get; private set; }\r\n        public RelayCommand<Game> UpdateGameInstallSizeWithDialogCommand { get; private set; }\r\n        public RelayCommand<IEnumerable<Game>> UpdateGamesAllInstallSizeWithDialogCommand { get; private set; }\r\n        public RelayCommand<IEnumerable<Game>> UpdateGamesMissingInstallSizeWithDialogCommand { get; private set; }\r\n        public RelayCommand<Game> CreateDesktopShortcutCommand { get; private set; }\r\n        public RelayCommand<List<Game>> CreateDesktopShortcutsCommand { get; private set; }\r\n        public RelayCommand<Game> OpenManualCommand { get; private set; }\r\n        public RelayCommand<Game> ToggleFavoritesCommand { get; private set; }\r\n        public RelayCommand<Game> ToggleVisibilityCommand { get; private set; }\r\n        public RelayCommand<Game> ToggleHdrCommand { get; private set; }\r\n        public RelayCommand<IEnumerable<Game>> SetAsFavoritesCommand { get; private set; }\r\n        public RelayCommand<IEnumerable<Game>> RemoveAsFavoritesCommand { get; private set; }\r\n        public RelayCommand<IEnumerable<Game>> SetAsHiddensCommand { get; private set; }\r\n        public RelayCommand<IEnumerable<Game>> RemoveAsHiddensCommand { get; private set; }\r\n        public RelayCommand<IEnumerable<Game>> EnableHdrCommand { get; private set; }\r\n        public RelayCommand<IEnumerable<Game>> DisableHdrCommand { get; private set; }\r\n\r\n        public RelayCommand<Game> AssignGameCategoryCommand { get; private set; }\r\n        public RelayCommand<IEnumerable<Game>> AssignGamesCategoryCommand { get; private set; }\r\n        public RelayCommand<Tuple<Game, CompletionStatus>> SetGameCompletionStatusCommand { get; private set; }\r\n        public RelayCommand<Tuple<IEnumerable<Game>, CompletionStatus>> SetGamesCompletionStatusCommand { get; private set; }\r\n        public RelayCommand<Game> RemoveGameCommand { get; private set; }\r\n        public RelayCommand<IEnumerable<Game>> RemoveGamesCommand { get; private set; }\r\n        public RelayCommand<object> SelectRandomGameCommand { get; private set; }\r\n        public RelayCommand<object> ViewSelectRandomGameCommand { get; private set; }\r\n        public RelayCommand<SidebarWrapperItem> SelectSidebarViewCommand { get; private set; }\r\n\r\n        public RelayCommand<object> SwitchDetailsViewCommand { get; private set; }\r\n        public RelayCommand<object> SwitchGridViewCommand { get; private set; }\r\n        public RelayCommand<object> SwitchListViewCommand { get; private set; }\r\n\r\n        private void InitializeCommands()\r\n        {\r\n            OpenSearchCommand = new RelayCommand<object>((_) => OpenSearch(), new KeyGesture(Key.F, ModifierKeys.Control));\r\n            OpenGlobalSearchCommand = new RelayCommand(() => OpenGlobalSearch());\r\n\r\n            ToggleExplorerPanelCommand = new RelayCommand<object>((game) =>\r\n            {\r\n                AppSettings.ExplorerPanelVisible = !AppSettings.ExplorerPanelVisible;\r\n            }, new KeyGesture(Key.E, ModifierKeys.Control));\r\n\r\n            ToggleFilterPanelCommand = new RelayCommand<object>((game) =>\r\n            {\r\n                AppSettings.FilterPanelVisible = !AppSettings.FilterPanelVisible;\r\n            }, new KeyGesture(Key.G, ModifierKeys.Control));\r\n\r\n            OpenFilterPanelCommand = new RelayCommand<object>((game) =>\r\n            {\r\n                AppSettings.FilterPanelVisible = true;\r\n            });\r\n\r\n            CloseFilterPanelCommand = new RelayCommand<object>((game) =>\r\n            {\r\n                AppSettings.FilterPanelVisible = false;\r\n            });\r\n\r\n            CloseNotificationPanelCommand = new RelayCommand<object>((game) =>\r\n            {\r\n                AppSettings.NotificationPanelVisible = false;\r\n            });\r\n\r\n            UpdateGamesCommand = new RelayCommand<object>((a) =>\r\n            {\r\n#pragma warning disable CS4014\r\n                UpdateLibrary(AppSettings.DownloadMetadataOnImport, true, true);\r\n#pragma warning restore CS4014\r\n            }, (a) => GameAdditionAllowed,\r\n            new KeyGesture(Key.F5));\r\n\r\n            OpenSteamFriendsCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                OpenSteamFriends();\r\n            });\r\n\r\n            ReportIssueCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ReportIssue();\r\n            });\r\n\r\n            ShutdownCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                if (GlobalTaskHandler.IsActive)\r\n                {\r\n                    if (Dialogs.ShowMessage(\r\n                        Resources.GetString(\"LOCBackgroundProgressCancelAskExit\"),\r\n                        Resources.GetString(\"LOCCrashClosePlaynite\"),\r\n                        MessageBoxButton.YesNo) != MessageBoxResult.Yes)\r\n                    {\r\n                        return;\r\n                    }\r\n                }\r\n\r\n                ignoreCloseActions = true;\r\n                ShutdownApp();\r\n            }, new KeyGesture(Key.Q, ModifierKeys.Alt));\r\n\r\n            ShowWindowCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                RestoreWindow();\r\n            });\r\n\r\n            WindowClosingCommand = new RelayCommand<CancelEventArgs>((args) =>\r\n            {\r\n                OnClosing(args);\r\n            });\r\n\r\n            FileDroppedCommand = new RelayCommand<DragEventArgs>((args) =>\r\n            {\r\n                OnFileDropped(args);\r\n            });\r\n\r\n            OpenAboutCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                OpenAboutWindow(new AboutViewModel(new AboutWindowFactory(), Dialogs, Resources, App.ServicesClient));\r\n            }, new KeyGesture(Key.F1));\r\n\r\n            OpenEmulatorsCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ConfigureEmulators(\r\n                    new EmulatorsViewModel(Database,\r\n                    new EmulatorsWindowFactory(),\r\n                    Dialogs,\r\n                    Resources));\r\n            }, (a) => Database?.IsOpen == true,\r\n            new KeyGesture(Key.T, ModifierKeys.Control));\r\n\r\n            OpenSoftwareToolsCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ConfigureSoftwareTools(new ToolsConfigViewModel(\r\n                    Database,\r\n                    new ToolsConfigWindowFactory(),\r\n                    Dialogs,\r\n                    Resources));\r\n            }, (a) => Database?.IsOpen == true);\r\n\r\n            AddCustomGameCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                AddCustomGame(new GameEditWindowFactory());\r\n            }, (a) => Database?.IsOpen == true,\r\n            new KeyGesture(Key.Insert));\r\n\r\n            AddInstalledGamesCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ImportInstalledGames(\r\n                    new InstalledGamesViewModel(\r\n                    new InstalledGamesWindowFactory(),\r\n                    Dialogs,\r\n                    Database), null);\r\n            }, (a) => Database?.IsOpen == true);\r\n\r\n            AddEmulatedGamesCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ImportEmulatedGames(\r\n                    new EmulatedGamesImportViewModel(\r\n                        Database,\r\n                        new EmulatedGameImportWindowFactory(),\r\n                        Dialogs,\r\n                        Resources));\r\n            }, (a) => Database?.IsOpen == true,\r\n            new KeyGesture(Key.Q, ModifierKeys.Control));\r\n\r\n            AddWindowsStoreGamesCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ImportWindowsStoreGames(\r\n                    new InstalledGamesViewModel(\r\n                    new InstalledGamesWindowFactory(),\r\n                    Dialogs,\r\n                    Database));\r\n            }, (a) => Database?.IsOpen == true);\r\n\r\n            OpenFullScreenCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                SwitchToFullscreenMode();\r\n            }, new KeyGesture(Key.F11));\r\n\r\n            ClearMessagesCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ClearMessages();\r\n            }, (a) => App?.Notifications?.Count > 0);\r\n\r\n            DownloadMetadataCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                DownloadMetadata(new MetadataDownloadViewModel(new MetadataDownloadWindowFactory(), Resources));\r\n            }, (a) => GameAdditionAllowed,\r\n            new KeyGesture(Key.D, ModifierKeys.Control));\r\n\r\n            ClearFiltersCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ClearFilters();\r\n            });\r\n\r\n            CheckForUpdateCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                CheckForUpdate();\r\n            });\r\n\r\n            OpenDbFieldsManagerCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ConfigureDatabaseFields(\r\n                        new DatabaseFieldsManagerViewModel(\r\n                            Database,\r\n                            new DatabaseFieldsManagerWindowFactory(),\r\n                            Dialogs,\r\n                            Resources));\r\n            }, (a) => GameAdditionAllowed,\r\n            new KeyGesture(Key.W, ModifierKeys.Control));\r\n\r\n            OpenLibraryIntegrationsConfigCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                OpenIntegrationSettings(\r\n                    new LibraryIntegrationsViewModel(\r\n                        new LibraryIntegrationsWindowFactory(),\r\n                        Dialogs,\r\n                        Resources,\r\n                        Extensions));\r\n            });\r\n\r\n            UpdateLibraryCommand = new RelayCommand<LibraryPlugin>((a) =>\r\n            {\r\n#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n                UpdateLibrary(a);\r\n#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n            }, (a) => GameAdditionAllowed);\r\n\r\n            RemoveGameSelectionCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveGameSelection();\r\n            });\r\n\r\n            InvokeExtensionFunctionCommand = new RelayCommand<ExtensionFunction>((f) =>\r\n            {\r\n                if (!Extensions.InvokeExtension(f, out var error))\r\n                {\r\n                    Dialogs.ShowMessage(\r\n                         error.Message,\r\n                         Resources.GetString(\"LOCScriptError\"),\r\n                         MessageBoxButton.OK, MessageBoxImage.Error);\r\n                }\r\n            });\r\n\r\n            ReloadScriptsCommand = new RelayCommand<object>((f) =>\r\n            {\r\n                Extensions.LoadScripts(AppSettings.DisabledPlugins, App.CmdLine.SafeStartup, AppSettings.DevelExtenions.Where(a => a.Selected == true).Select(a => a.Item).ToList());\r\n            }, new KeyGesture(Key.F12));\r\n\r\n            ShowGameSideBarCommand = new RelayCommand<GamesCollectionViewEntry>((f) =>\r\n            {\r\n                AppSettings.GridViewSideBarVisible = true;\r\n                if (SelectedGame?.Game.Id != f.Id)\r\n                {\r\n                    SelectedGames = new List<GamesCollectionViewEntry> { f };\r\n                }\r\n            });\r\n\r\n            CloseGameSideBarCommand = new RelayCommand<object>((f) =>\r\n            {\r\n                AppSettings.GridViewSideBarVisible = false;\r\n            });\r\n\r\n            OpenSettingsCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                OpenSettings();\r\n            }, new KeyGesture(Key.F4));\r\n\r\n            OpenAddonsCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                new AddonsViewModel(\r\n                    new AddonsWindowFactory(),\r\n                    Dialogs,\r\n                    Resources,\r\n                    App.ServicesClient,\r\n                    Extensions,\r\n                    AppSettings,\r\n                    App).OpenView();\r\n            }, new KeyGesture(Key.F9));\r\n\r\n            StartGameCommand = new RelayCommand<Game>((game) =>\r\n            {\r\n                if (game != null)\r\n                {\r\n                    StartGame(game, true);\r\n                }\r\n                else if (SelectedGame != null)\r\n                {\r\n                    StartGame(SelectedGame.Game, true);\r\n                }\r\n            });\r\n\r\n            StartGameFromTrayCommand = new RelayCommand<Game>((game) =>\r\n            {\r\n                if (game != null)\r\n                {\r\n                    StartGame(game, false);\r\n                }\r\n            });\r\n\r\n            StartSoftwareToolCommand = new RelayCommand<AppSoftware>((app) =>\r\n            {\r\n                StartSoftwareTool(app);\r\n            });\r\n\r\n            InstallGameCommand = new RelayCommand<Game>((game) =>\r\n            {\r\n                if (game != null)\r\n                {\r\n                    GamesEditor.InstallGame(game);\r\n                }\r\n                else if (SelectedGame != null)\r\n                {\r\n                    GamesEditor.InstallGame(SelectedGame.Game);\r\n                }\r\n            });\r\n\r\n            UninstallGameCommand = new RelayCommand<Game>((game) =>\r\n            {\r\n                if (game != null)\r\n                {\r\n                    GamesEditor.UnInstallGame(game);\r\n                }\r\n                else if (SelectedGame != null)\r\n                {\r\n                    GamesEditor.UnInstallGame(SelectedGame.Game);\r\n                }\r\n            });\r\n\r\n            EditSelectedGamesCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                if (SelectedGames?.Count() > 1)\r\n                {\r\n                    ignoreSelectionChanges = true;\r\n                    try\r\n                    {\r\n                        GamesEditor.EditGames(SelectedGames.Select(g => g.Game).ToList());\r\n                    }\r\n                    finally\r\n                    {\r\n                        ignoreSelectionChanges = false;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    GamesEditor.EditGame(SelectedGame.Game);\r\n                }\r\n            },\r\n            (a) => SelectedGame != null,\r\n            new KeyGesture(Key.F3));\r\n\r\n            StartSelectedGameCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                GamesEditor.PlayGame(SelectedGame.Game, true);\r\n            },\r\n            (a) => SelectedGames?.Count() == 1,\r\n            new KeyGesture(Key.Enter));\r\n\r\n            RemoveSelectedGamesCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                if (SelectedGames?.Count() > 1)\r\n                {\r\n                    GamesEditor.RemoveGames(SelectedGames.Select(g => g.Game).Distinct().ToList());\r\n                }\r\n                else\r\n                {\r\n                    GamesEditor.RemoveGame(SelectedGame.Game);\r\n                }\r\n            },\r\n            (a) => SelectedGame != null,\r\n            new KeyGesture(Key.Delete));\r\n\r\n            EditGameCommand = new RelayCommand<Game>((a) => EditGame(a));\r\n\r\n            EditGamesCommand = new RelayCommand<IEnumerable<Game>>((a) =>\r\n            {\r\n                ignoreSelectionChanges = true;\r\n                try\r\n                {\r\n                    GamesEditor.EditGames(a.ToList());\r\n                }\r\n                finally\r\n                {\r\n                    ignoreSelectionChanges = false;\r\n                }\r\n            });\r\n\r\n            OpenGameLocationCommand = new RelayCommand<Game>((a) =>\r\n            {\r\n                GamesEditor.OpenGameLocation(a);\r\n            });\r\n\r\n            CreateDesktopShortcutCommand = new RelayCommand<Game>((a) =>\r\n            {\r\n                GamesEditor.CreateDesktopShortcut(a);\r\n            });\r\n\r\n            UpdateGameInstallSizeWithDialogCommand = new RelayCommand<Game>((a) =>\r\n            {\r\n                GamesEditor.UpdateGameSizeWithDialog(a, false, true);\r\n            });\r\n\r\n            CreateDesktopShortcutsCommand = new RelayCommand<List<Game>>((a) =>\r\n            {\r\n                GamesEditor.CreateDesktopShortcut(a);\r\n            });\r\n\r\n            OpenManualCommand = new RelayCommand<Game>((a) =>\r\n            {\r\n                GamesEditor.OpenManual(a);\r\n            });\r\n\r\n            ToggleFavoritesCommand = new RelayCommand<Game>((a) =>\r\n            {\r\n                GamesEditor.ToggleFavoriteGame(a);\r\n            });\r\n\r\n            ToggleVisibilityCommand = new RelayCommand<Game>((a) =>\r\n            {\r\n                GamesEditor.ToggleHideGame(a);\r\n            });\r\n\r\n            ToggleHdrCommand = new RelayCommand<Game>((a) =>\r\n            {\r\n                GamesEditor.ToggleHdrGame(a);\r\n            });\r\n\r\n            AssignGameCategoryCommand = new RelayCommand<Game>((a) => AssignCategories(a));\r\n\r\n            AssignGamesCategoryCommand = new RelayCommand<IEnumerable<Game>>((a) =>\r\n            {\r\n                GamesEditor.SetGamesCategories(a.ToList());\r\n            });\r\n\r\n            SetGameCompletionStatusCommand = new RelayCommand<Tuple<Game, CompletionStatus>>((a) =>\r\n            {\r\n                GamesEditor.SetCompletionStatus(a.Item1, a.Item2);\r\n            });\r\n\r\n            SetGamesCompletionStatusCommand = new RelayCommand<Tuple<IEnumerable<Game>, CompletionStatus>>((a) =>\r\n            {\r\n                GamesEditor.SetCompletionStatus(a.Item1.ToList(), a.Item2);\r\n            });\r\n\r\n            RemoveGameCommand = new RelayCommand<Game>((a) =>\r\n            {\r\n                GamesEditor.RemoveGame(a);\r\n            },\r\n            new KeyGesture(Key.Delete));\r\n\r\n            RemoveGamesCommand = new RelayCommand<IEnumerable<Game>>((a) =>\r\n            {\r\n                GamesEditor.RemoveGames(a.Distinct().ToList());\r\n            },\r\n            new KeyGesture(Key.Delete));\r\n\r\n            SetAsFavoritesCommand = new RelayCommand<IEnumerable<Game>>((a) =>\r\n            {\r\n                GamesEditor.SetFavoriteGames(a.ToList(), true);\r\n            });\r\n\r\n            RemoveAsFavoritesCommand = new RelayCommand<IEnumerable<Game>>((a) =>\r\n            {\r\n                GamesEditor.SetFavoriteGames(a.ToList(), false);\r\n            });\r\n\r\n            UpdateGamesAllInstallSizeWithDialogCommand = new RelayCommand<IEnumerable<Game>>((a) =>\r\n            {\r\n                GamesEditor.UpdateGamesSizeWithDialog(a.ToList(), false);\r\n            });\r\n\r\n            UpdateGamesMissingInstallSizeWithDialogCommand = new RelayCommand<IEnumerable<Game>>((a) =>\r\n            {\r\n                GamesEditor.UpdateGamesSizeWithDialog(a.ToList(), true);\r\n            });\r\n\r\n            SetAsHiddensCommand = new RelayCommand<IEnumerable<Game>>((a) =>\r\n            {\r\n                GamesEditor.SetHideGames(a.ToList(), true);\r\n            });\r\n\r\n            RemoveAsHiddensCommand = new RelayCommand<IEnumerable<Game>>((a) =>\r\n            {\r\n                GamesEditor.SetHideGames(a.ToList(), false);\r\n            });\r\n\r\n            EnableHdrCommand = new RelayCommand<IEnumerable<Game>>((a) =>\r\n            {\r\n                GamesEditor.SetHdrSupport(a.ToList(), true);\r\n            });\r\n\r\n            DisableHdrCommand = new RelayCommand<IEnumerable<Game>>((a) =>\r\n            {\r\n                GamesEditor.SetHdrSupport(a.ToList(), false);\r\n            });\r\n\r\n            SelectRandomGameCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                PlayRandomGame();\r\n            }, (a) => Database?.IsOpen == true,\r\n            new KeyGesture(Key.F6));\r\n\r\n            ViewSelectRandomGameCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ViewSelectRandomGame();\r\n            }, (a) => Database?.IsOpen == true,\r\n            new KeyGesture(Key.F7));\r\n\r\n            SelectSidebarViewCommand = new RelayCommand<SidebarWrapperItem>((a) =>\r\n            {\r\n                a.Command.Execute(null);\r\n            });\r\n\r\n            SwitchDetailsViewCommand = new RelayCommand<object>((_) => AppSettings.ViewSettings.GamesViewType = DesktopView.Details);\r\n            SwitchGridViewCommand = new RelayCommand<object>((_) => AppSettings.ViewSettings.GamesViewType = DesktopView.Grid);\r\n            SwitchListViewCommand = new RelayCommand<object>((_) => AppSettings.ViewSettings.GamesViewType = DesktopView.List);\r\n\r\n            UpdateEmulationDirCommand = new RelayCommand<GameScannerConfig>((a) =>\r\n            {\r\n#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n                UpdateEmulationLibrary(a);\r\n#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n            }, (a) => GameAdditionAllowed);\r\n\r\n            UpdateEmulationDirsCommand = new RelayCommand(() =>\r\n            {\r\n#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n                UpdateEmulationLibrary();\r\n#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n            }, () => GameAdditionAllowed);\r\n\r\n            OpenPluginSettingsCommand = new RelayCommand<Guid>((pluginId) => OpenPluginSettings(pluginId));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/DesktopAppViewModel_Sidebar.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.Extensions.Markup;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class SidebarWrapperItem : ObservableObject\r\n    {\r\n        public enum SourceType\r\n        {\r\n            Builtin,\r\n            Extension,\r\n            SoftwareTool\r\n        }\r\n\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private DesktopAppViewModel model;\r\n        public RelayCommand<object> Command { get; set; }\r\n\r\n        public SidebarItem SideItem { get; }\r\n\r\n        public SiderbarItemType Type\r\n        {\r\n            get => SideItem.Type;\r\n        }\r\n\r\n        public string Title\r\n        {\r\n            get => SideItem.Title;\r\n        }\r\n\r\n        public Thickness IconPadding\r\n        {\r\n            get => SideItem.IconPadding;\r\n            set { }\r\n        }\r\n\r\n        public double ProgressValue\r\n        {\r\n            get => SideItem.ProgressValue;\r\n            set { }\r\n        }\r\n\r\n        public double ProgressMaximum\r\n        {\r\n            get => SideItem.ProgressMaximum;\r\n            set { }\r\n        }\r\n\r\n        public bool Visible\r\n        {\r\n            get => SideItem.Visible;\r\n            set { }\r\n        }\r\n\r\n        public object IconObject => SdkHelpers.ResolveUiItemIcon(SideItem.Icon);\r\n\r\n        private bool selected;\r\n        public bool Selected\r\n        {\r\n            get => selected;\r\n            set\r\n            {\r\n                if (SideItem.Type == SiderbarItemType.Button)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                if (selected != value && value == false)\r\n                {\r\n                    if (SideItem.Closed != null)\r\n                    {\r\n                        SideItem.Closed();\r\n                    }\r\n                }\r\n\r\n                selected = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public SidebarWrapperItem(SidebarItem item, DesktopAppViewModel model)\r\n        {\r\n            this.model = model;\r\n            SideItem = item;\r\n            Command = new RelayCommand<object>(Activation);\r\n            item.PropertyChanged += Item_PropertyChanged;\r\n        }\r\n\r\n        private void Item_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\r\n        {\r\n            OnPropertyChanged(e.PropertyName);\r\n        }\r\n\r\n        private void Activation(object arg)\r\n        {\r\n            if (Selected)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (SideItem.Type == SiderbarItemType.Button)\r\n            {\r\n                try\r\n                {\r\n                    SideItem.Activated();\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, \"Failed to activate sidebar item.\");\r\n                }\r\n            }\r\n            else\r\n            {\r\n                Control view = null;\r\n                if (SideItem.Opened != null)\r\n                {\r\n                    view = SideItem.Opened();\r\n                    if (view == null)\r\n                    {\r\n                        return;\r\n                    }\r\n                }\r\n\r\n                model.SidebarItems.ForEach(a =>\r\n                {\r\n                    if (a.Selected)\r\n                    {\r\n                        a.Selected = false;\r\n                    }\r\n                });\r\n\r\n                Selected = true;\r\n                model.ActiveView = view;\r\n            }\r\n        }\r\n    }\r\n\r\n    public class MainSidebarViewItem : SidebarItem\r\n    {\r\n        private Control view;\r\n        private DesktopAppViewModel model;\r\n\r\n        public ApplicationView AppView { get; }\r\n\r\n        public MainSidebarViewItem(Control view, DesktopAppViewModel model, ApplicationView appView)\r\n        {\r\n            this.view = view;\r\n            this.AppView = appView;\r\n            this.model = model;\r\n            Type = SiderbarItemType.View;\r\n            Opened = () =>\r\n            {\r\n                if (AppView == ApplicationView.Statistics)\r\n                {\r\n                    model.LibraryStats.Calculate();\r\n                }\r\n\r\n                return view;\r\n            };\r\n        }\r\n    }\r\n\r\n    public class SoftwareToolSidebarItem : SidebarItem\r\n    {\r\n        private AppSoftware app;\r\n        private DesktopAppViewModel model;\r\n\r\n        public SoftwareToolSidebarItem(AppSoftware app, DesktopAppViewModel model)\r\n        {\r\n            this.app = app;\r\n            this.model = model;\r\n            Type = SiderbarItemType.Button;\r\n            Icon = app.Icon;\r\n            Title = app.Name;\r\n            Activated = () => model.StartSoftwareToolCommand.Execute(app);\r\n        }\r\n    }\r\n\r\n    public partial class DesktopAppViewModel\r\n    {\r\n        private ObservableCollection<SidebarWrapperItem> sidebarItems = new ObservableCollection<SidebarWrapperItem>();\r\n        public ObservableCollection<SidebarWrapperItem> SidebarItems\r\n        {\r\n            get => sidebarItems;\r\n            set\r\n            {\r\n                sidebarItems = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public void LoadSideBarItems()\r\n        {\r\n            libraryView = new Controls.Views.Library(this);\r\n            statsView = new Controls.LibraryStatistics(LibraryStats);\r\n\r\n            var libraryItem = new MainSidebarViewItem(libraryView, this, ApplicationView.Library)\r\n            {\r\n                Icon = \"SidebarLibraryIcon\",\r\n                Title = Resources.GetString(LOC.Library)\r\n            };\r\n\r\n            var statsItem = new MainSidebarViewItem(statsView, this, ApplicationView.Statistics)\r\n            {\r\n                Icon = \"SidebarStatisticsIcon\",\r\n                Title = Resources.GetString(LOC.Statistics)\r\n            };\r\n\r\n            var sideItems = new List<SidebarWrapperItem>();\r\n            foreach (var plugin in Extensions.Plugins)\r\n            {\r\n                try\r\n                {\r\n                    var items = plugin.Value.Plugin.GetSidebarItems().ToList();\r\n                    if (items.HasItems())\r\n                    {\r\n                        items.ForEach(a => sideItems.Add(new SidebarWrapperItem(a, this)));\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    Logger.Error(e, $\"Failed to GetSidebarItems, from {plugin.Value.Description.Name}\");\r\n                }\r\n            }\r\n\r\n            sideItems = sideItems.OrderByDescending(a => a.SideItem.Type).ThenBy(a => a.SideItem.Title).ToList();\r\n            sideItems.Insert(0, new SidebarWrapperItem(statsItem, this));\r\n            sideItems.Insert(0, new SidebarWrapperItem(libraryItem, this));\r\n            sideItems[0].Command.Execute(null);\r\n            SidebarItems.AddRange(sideItems);\r\n        }\r\n\r\n        public void LoadSoftwareToolsSidebarItems()\r\n        {\r\n            if (!Database.IsOpen)\r\n            {\r\n                return;\r\n            }\r\n\r\n            Database.SoftwareApps.ItemUpdated += (_, __) => RefreshSoftwareToolsSidebarItems();\r\n            Database.SoftwareApps.ItemCollectionChanged += (_, __) => RefreshSoftwareToolsSidebarItems();\r\n            foreach (var tool in Database.SoftwareApps.OrderBy(a => a.Name))\r\n            {\r\n                if (tool.ShowOnSidebar)\r\n                {\r\n                    SidebarItems.Add(new SidebarWrapperItem(new SoftwareToolSidebarItem(tool, this), this));\r\n                }\r\n            }\r\n        }\r\n\r\n        public void RefreshSoftwareToolsSidebarItems()\r\n        {\r\n            SidebarItems.Where(a => a.SideItem is SoftwareToolSidebarItem).ToList().ForEach(a => SidebarItems.Remove(a));\r\n            foreach (var tool in Database.SoftwareApps.OrderBy(a => a.Name))\r\n            {\r\n                if (tool.ShowOnSidebar)\r\n                {\r\n                    SidebarItems.Add(new SidebarWrapperItem(new SoftwareToolSidebarItem(tool, this), this));\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/DesktopAppViewModel_TopPanel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.DesktopApp.Markup;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class TopPanelWrapperItem : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        private DesktopAppViewModel model;\r\n        public TopPanelItem PanelItem { get; }\r\n        public RelayCommandBase Command { get; set; }\r\n\r\n        public string Title\r\n        {\r\n            get => PanelItem.Title;\r\n        }\r\n\r\n        public bool Visible\r\n        {\r\n            get => PanelItem.Visible;\r\n            set { }\r\n        }\r\n\r\n        public object IconObject => SdkHelpers.ResolveUiItemIcon(PanelItem.Icon);\r\n\r\n        public TopPanelWrapperItem(TopPanelItem item, DesktopAppViewModel model)\r\n        {\r\n            this.model = model;\r\n            PanelItem = item;\r\n            Command = new RelayCommand(() =>\r\n            {\r\n                try\r\n                {\r\n                    PanelItem.Activated?.Invoke();\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, \"Failed to run top panel extension button action.\");\r\n                }\r\n            });\r\n            item.PropertyChanged += Item_PropertyChanged;\r\n        }\r\n\r\n        private void Item_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\r\n        {\r\n            OnPropertyChanged(e.PropertyName);\r\n        }\r\n    }\r\n\r\n    public partial class DesktopAppViewModel\r\n    {\r\n        public List<TopPanelWrapperItem> GetTopPanelPluginItems()\r\n        {\r\n            var newItems = new List<TopPanelWrapperItem>();\r\n            foreach (var item in Extensions.GetTopPanelPluginItems())\r\n            {\r\n                newItems.Add(new TopPanelWrapperItem(item, this));\r\n            }\r\n\r\n            return newItems;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/EmulatedGamesImportViewModel.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing Playnite.Common;\r\nusing Playnite.Windows;\r\nusing Playnite.DesktopApp.Windows;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Emulators;\r\nusing System.IO;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class EmulatedGamesImportViewModel : ObservableObject\r\n    {\r\n        public class ImportGameScannerConfig : GameScannerConfig\r\n        {\r\n            public bool Save { get; set; }\r\n            public bool SavedConfig { get; set; }\r\n        }\r\n\r\n        public class MenuItem\r\n        {\r\n            public string Title { get; set; }\r\n            public RelayCommandBase Command { get; set; }\r\n            public List<MenuItem> Items { get; set; }\r\n\r\n            public override string ToString()\r\n            {\r\n                return Title;\r\n            }\r\n        }\r\n\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private readonly IDialogsFactory dialogs;\r\n        private readonly IResourceProvider resources;\r\n        private readonly IGameDatabaseMain database;\r\n        private readonly MenuItem menuSplitItem;\r\n        private readonly MenuItem menuMergeItem;\r\n        private readonly MenuItem menuPlatformsItem;\r\n        private readonly MenuItem menuRegionsItem;\r\n        private readonly MenuItem menuAddFolderToExclusions;\r\n        private readonly MenuItem menuAddFilesToExclusions;\r\n\r\n        private List<Platform> newPlatforms;\r\n        private List<Region> newRegions;\r\n\r\n        #region backing fields\r\n        private List<Platform> platforms;\r\n        private List<Region> regions;\r\n        #endregion backing fields\r\n\r\n        public List<Emulator> Emulators { get; set; }\r\n        public List<Platform> Platforms { get => platforms; set => SetValue(ref platforms, value); }\r\n        public List<Platform> OverridePlatforms { get; set; }\r\n        public List<Region> Regions     { get => regions; set => SetValue(ref regions, value); }\r\n        public List<GameScannerConfig> SavedConfigs { get; set; }\r\n        public List<Game> ImportedGames { get; } = new List<Game>();\r\n\r\n        private List<MenuItem> menuItems;\r\n        public List<MenuItem> MenuItems\r\n        {\r\n            get => menuItems;\r\n            private set\r\n            {\r\n                menuItems = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<ScannedGame> gameList;\r\n        public ObservableCollection<ScannedGame> GameList\r\n        {\r\n            get => gameList;\r\n            set\r\n            {\r\n                gameList = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<ImportGameScannerConfig> scannerConfigs = new ObservableCollection<ImportGameScannerConfig>();\r\n        public ObservableCollection<ImportGameScannerConfig> ScannerConfigs\r\n        {\r\n            get => scannerConfigs;\r\n            set\r\n            {\r\n                scannerConfigs = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isScanSetup = true;\r\n        public bool IsScanSetup\r\n        {\r\n            get => isScanSetup;\r\n            set\r\n            {\r\n                isScanSetup = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private IList<object> selectedGames;\r\n        public IList<object> SelectedGames\r\n        {\r\n            get => selectedGames;\r\n            set\r\n            {\r\n                selectedGames = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand SelectAllCommmand =>\r\n            new RelayCommand(\r\n                () => GameList.ForEach(e => e.Import = true),\r\n                () => GameList.HasItems());\r\n\r\n        public RelayCommand DeselectAllCommmand =>\r\n            new RelayCommand(\r\n                () => GameList.ForEach(e => e.Import = false),\r\n                () => GameList.HasItems());\r\n\r\n        public RelayCommand CancelCommand =>\r\n            new RelayCommand(() => CloseView(false));\r\n\r\n        public RelayCommand ScanCommmand =>\r\n            new RelayCommand(() => StartScan());\r\n\r\n        public RelayCommand ImportCommand =>\r\n            new RelayCommand(() => ImportGames());\r\n\r\n        public RelayCommand AddScanConfigCommand =>\r\n            new RelayCommand(() => ScannerConfigs.Add(new ImportGameScannerConfig()));\r\n\r\n        public RelayCommand<ImportGameScannerConfig> RemoveScanConfigCommand =>\r\n            new RelayCommand<ImportGameScannerConfig>((a) => ScannerConfigs.Remove(a));\r\n\r\n        public RelayCommand<GameScannerConfig> AddSavedScanConfigCommand =>\r\n            new RelayCommand<GameScannerConfig>((a) =>\r\n            {\r\n                var config = a.GetClone<GameScannerConfig, ImportGameScannerConfig>();\r\n                config.Save = false;\r\n                config.SavedConfig = true;\r\n                ScannerConfigs.Add(config);\r\n            });\r\n\r\n        public RelayCommand<ContextMenuEventArgs> ContextMenuOpening =>\r\n            new RelayCommand<ContextMenuEventArgs>((a) =>\r\n            {\r\n                if (SelectedGames == null || SelectedGames.Count == 0)\r\n                {\r\n                    MenuItems = null;\r\n                    return;\r\n                }\r\n\r\n                var items = new List<MenuItem>();\r\n                if (SelectedGames?.Count == 1 && SelectedGames.Cast<ScannedGame>().First().Roms.Count > 1)\r\n                {\r\n                    items.Add(menuSplitItem);\r\n                }\r\n                else if (SelectedGames?.Count > 1)\r\n                {\r\n                    items.Add(menuMergeItem);\r\n                }\r\n\r\n                items.Add(menuPlatformsItem);\r\n                items.Add(menuRegionsItem);\r\n                items.Add(menuAddFilesToExclusions);\r\n                items.Add(menuAddFolderToExclusions);\r\n                MenuItems = items;\r\n            });\r\n\r\n        public RelayCommand<ScannedRom> AddFileToExclusionListCommand => new RelayCommand<ScannedRom>((r) => AddFileToExclusionList(r));\r\n        public RelayCommand<ScannedRom> AddDirToExclusionListCommand => new RelayCommand<ScannedRom>((r) => AddDirToExclusionList(r));\r\n        public RelayCommand AddFilesToExclusionListCommand => new RelayCommand(() => AddFilesToExclusionList(SelectedGames?.Cast<ScannedGame>()));\r\n        public RelayCommand AddDirsToExclusionListCommand => new RelayCommand(() => AddDirsToExclusionList(SelectedGames?.Cast<ScannedGame>()));\r\n\r\n        public EmulatedGamesImportViewModel(\r\n            IGameDatabaseMain database,\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources)\r\n        {\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            this.database = database;\r\n            Emulators = database.Emulators.OrderBy(a => a.Name).ToList();\r\n            Platforms = database.Platforms.OrderBy(a => a.Name).ToList();\r\n            Regions = database.Regions.OrderBy(a => a.Name).ToList();\r\n            SavedConfigs = database.GameScanners.OrderBy(a => a.Name).ToList();\r\n            OverridePlatforms = database.Platforms.OrderBy(a => a.Name).ToList();\r\n            OverridePlatforms.Insert(0, new Platform(LOC.None.GetLocalized()) { Id = Guid.Empty });\r\n\r\n            menuSplitItem = new MenuItem\r\n            {\r\n                Title = resources.GetString(LOC.SplitEmuImportSplitGames),\r\n                Command = new RelayCommand<object>((_) =>\r\n                {\r\n                    SplitSelectedGames();\r\n                })\r\n            };\r\n            menuMergeItem = new MenuItem\r\n            {\r\n                Title = resources.GetString(LOC.SplitEmuImportMergeGames),\r\n                Command = new RelayCommand<object>((_) =>\r\n                {\r\n                    MergeSelectedGames();\r\n                })\r\n            };\r\n\r\n            menuPlatformsItem = new MenuItem\r\n            {\r\n                Title = resources.GetString(LOC.EmuImportAssignPlatform),\r\n                Items = new List<MenuItem>()\r\n            };\r\n\r\n            Platforms.ForEach(a => menuPlatformsItem.Items.Add(new MenuItem\r\n            {\r\n                Title = a.Name,\r\n                Command = new RelayCommand<object>((_) =>\r\n                {\r\n                    foreach (ScannedGame game in SelectedGames)\r\n                    {\r\n                        game.Platforms = new List<Platform> { a };\r\n                    }\r\n                })\r\n            }));\r\n\r\n            menuRegionsItem = new MenuItem\r\n            {\r\n                Title = resources.GetString(LOC.EmuImportAssignRegion),\r\n                Items = new List<MenuItem>()\r\n            };\r\n\r\n            menuAddFilesToExclusions = new MenuItem\r\n            {\r\n                Title = resources.GetString(LOC.EmuImportAddROMExclusionList),\r\n                Command = AddFilesToExclusionListCommand\r\n            };\r\n\r\n            menuAddFolderToExclusions = new MenuItem\r\n            {\r\n                Title = resources.GetString(LOC.EmuImportAddFolderExclusionList),\r\n                Command = AddDirsToExclusionListCommand,\r\n            };\r\n\r\n            Regions.ForEach(a => menuRegionsItem.Items.Add(new MenuItem\r\n            {\r\n                Title = a.Name,\r\n                Command = new RelayCommand<object>((_) =>\r\n                {\r\n                    foreach (ScannedGame game in SelectedGames)\r\n                    {\r\n                        game.Regions = new List<Region> { a };\r\n                    }\r\n                })\r\n            }));\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView(bool? result)\r\n        {\r\n            window.Close(result);\r\n        }\r\n\r\n        private void SplitSelectedGames()\r\n        {\r\n            var game = SelectedGames[0] as ScannedGame;\r\n            if (!game.Roms.HasItems() || game.Roms.Count == 1)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var tmpList = game.Roms.ToList();\r\n            for (int i = 1; i < tmpList.Count; i++)\r\n            {\r\n                var rom = tmpList[i];\r\n                var newGame = new ScannedGame\r\n                {\r\n                    Roms = new ObservableCollection<ScannedRom> { rom },\r\n                    Name = rom.Name.Name,\r\n                    Platforms = game.Platforms?.ToList(),\r\n                    Regions = game.Regions?.ToList(),\r\n                    SourceConfig = game.SourceConfig,\r\n                    SourceEmulator = game.SourceEmulator\r\n                };\r\n\r\n                GameList.Insert(GameList.IndexOf(game) + 1, newGame);\r\n                game.Roms.Remove(rom);\r\n            }\r\n        }\r\n\r\n        private void MergeSelectedGames()\r\n        {\r\n            ScannedGame resGame = null;\r\n            var tempList = SelectedGames.ToList();\r\n            for (int i = 0; i < tempList.Count; i++)\r\n            {\r\n                var game = tempList[i] as ScannedGame;\r\n                if (i == 0)\r\n                {\r\n                    resGame = game;\r\n                }\r\n                else\r\n                {\r\n                    resGame.Roms.AddRange(game.Roms);\r\n                    GameList.Remove(game);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void StartScan()\r\n        {\r\n            foreach (var config in ScannerConfigs)\r\n            {\r\n                if (config.Save && config.Name.IsNullOrWhiteSpace())\r\n                {\r\n                    Dialogs.ShowErrorMessage(resources.GetString(LOC.ScanConfigError) + \"\\n\" + resources.GetString(LOC.ScanConfigNameError), \"\");\r\n                    return;\r\n                }\r\n\r\n                if (config.EmulatorId == Guid.Empty || config.EmulatorProfileId.IsNullOrEmpty())\r\n                {\r\n                    Dialogs.ShowErrorMessage(resources.GetString(LOC.ScanConfigError) + \"\\n\" + resources.GetString(LOC.ScanConfigNoEmulatorError), \"\");\r\n                    return;\r\n                }\r\n\r\n                if (config.Directory.IsNullOrEmpty())\r\n                {\r\n                    Dialogs.ShowErrorMessage(resources.GetString(LOC.ScanConfigError) + \"\\n\" + resources.GetString(LOC.ScanConfigDirectoryError), \"\");\r\n                    return;\r\n                }\r\n                else\r\n                {\r\n                    var emulator = database.Emulators[config.EmulatorId];\r\n                    if (emulator == null)\r\n                    {\r\n                        Dialogs.ShowErrorMessage(resources.GetString(LOC.ScanConfigError) + \"\\n\" + resources.GetString(LOC.ScanConfigNoEmulatorError), \"\");\r\n                        return;\r\n                    }\r\n\r\n                    var dirToScan = PlaynitePaths.ExpandVariables(config.Directory, emulator.InstallDir, true);\r\n                    if (!Directory.Exists(dirToScan))\r\n                    {\r\n                        Dialogs.ShowErrorMessage(resources.GetString(LOC.ScanConfigError) + \"\\n\" + resources.GetString(LOC.ScanConfigDirectoryError), \"\");\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n\r\n            foreach (var config in ScannerConfigs.Where(a => a.Save))\r\n            {\r\n                var exists = database.GameScanners.Any(c =>\r\n                    string.Equals(c.Directory, config.Directory, StringComparison.OrdinalIgnoreCase) &&\r\n                    string.Equals(c.EmulatorProfileId, config.EmulatorProfileId, StringComparison.Ordinal) &&\r\n                    c.EmulatorId == config.EmulatorId);\r\n                if (!exists)\r\n                {\r\n                    var emulator = database.Emulators[config.EmulatorId];\r\n                    if (config.Name.IsNullOrEmpty())\r\n                    {\r\n                        config.Name = config.Directory + \": \" + emulator.Name + \": \" + emulator.GetProfile(config.EmulatorProfileId).Name;\r\n                    }\r\n\r\n                    database.GameScanners.Add(config.GetClone<GameScannerConfig>());\r\n                }\r\n            }\r\n\r\n            var tempList = new ObservableCollection<ScannedGame>();\r\n            var scanString = resources.GetString(LOC.EmuWizardScanningSpecific);\r\n            var scanRes = dialogs.ActivateGlobalProgress((args) =>\r\n            {\r\n                foreach (GameScannerConfig config in ScannerConfigs)\r\n                {\r\n                    args.Text = scanString.Format(config.Directory);\r\n                    tempList.AddRange(new GameScanner(config, database).Scan(\r\n                        args.CancelToken,\r\n                        out newPlatforms,\r\n                        out newRegions,\r\n                        (path) => args.Text = scanString.Format(path)));\r\n                }\r\n            },\r\n            new GlobalProgressOptions(LOC.EmuWizardScanning)\r\n            {\r\n                Cancelable = true,\r\n                IsIndeterminate = true\r\n            });\r\n\r\n            if (scanRes.Error != null)\r\n            {\r\n                logger.Error(scanRes.Error, \"Failed to scan emulated folder.\");\r\n                dialogs.ShowErrorMessage(resources.GetString(LOC.EmulatedGameScanFailed) + \"\\n\" + scanRes.Error.Message, \"\");\r\n                IsScanSetup = true;\r\n            }\r\n            else\r\n            {\r\n                if (newPlatforms.HasItems())\r\n                {\r\n                    // Control we use to bind this information doesn't support observable collections...\r\n                    var pt = Platforms.GetClone();\r\n                    newPlatforms.ForEach(platform =>\r\n                    {\r\n                        pt.Insert(0, platform);\r\n                        menuPlatformsItem.Items.Insert(0, new MenuItem\r\n                        {\r\n                            Title = platform.Name,\r\n                            Command = new RelayCommand<object>((_) =>\r\n                            {\r\n                                foreach (ScannedGame game in SelectedGames)\r\n                                {\r\n                                    game.Platforms = new List<Platform> { platform };\r\n                                }\r\n                            })\r\n                        });\r\n                    });\r\n                    Platforms = pt;\r\n                }\r\n\r\n                if (newRegions.HasItems())\r\n                {\r\n                    // Control we use to bind this information doesn't support observable collections...\r\n                    var rg = Regions.GetClone();\r\n                    newRegions.ForEach(region =>\r\n                    {\r\n                        rg.Insert(0, region);\r\n                        menuRegionsItem.Items.Insert(0, new MenuItem\r\n                        {\r\n                            Title = region.Name,\r\n                            Command = new RelayCommand<object>((_) =>\r\n                            {\r\n                                foreach (ScannedGame game in SelectedGames)\r\n                                {\r\n                                    game.Regions = new List<Region> { region };\r\n                                }\r\n                            })\r\n                        });\r\n                    });\r\n                    Regions = rg;\r\n                }\r\n\r\n                IsScanSetup = false;\r\n            }\r\n\r\n            GameList = tempList;\r\n        }\r\n\r\n        private void ImportGames()\r\n        {\r\n            var statusSettings = database.GetCompletionStatusSettings();\r\n            using (database.BufferedUpdate())\r\n            {\r\n                if (newPlatforms.HasItems())\r\n                {\r\n                    foreach (var newPlat in newPlatforms)\r\n                    {\r\n                        if (GameList.Any(a => a.Platforms?.FirstOrDefault(p => p.Id == newPlat.Id) != null))\r\n                        {\r\n                            database.Platforms.Add(newPlat);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (newRegions.HasItems())\r\n                {\r\n                    foreach (var newReg in newRegions)\r\n                    {\r\n                        if (GameList.Any(a => a.Regions?.FirstOrDefault(p => p.Id == newReg.Id) != null))\r\n                        {\r\n                            database.Regions.Add(newReg);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                foreach (var scannedGame in GameList.Where(a => a.Import && a.Roms?.Any(r => r.Import) == true))\r\n                {\r\n                    var game = scannedGame.ToGame();\r\n                    if (statusSettings.DefaultStatus != Guid.Empty)\r\n                    {\r\n                        game.CompletionStatusId = statusSettings.DefaultStatus;\r\n                    }\r\n\r\n                    database.Games.Add(game);\r\n                    ImportedGames.Add(game);\r\n                }\r\n            }\r\n\r\n            CloseView(true);\r\n        }\r\n\r\n        private void AddFileToExclusionList(ScannedRom rom)\r\n        {\r\n            rom.Import = false;\r\n            var parent = GameList.First(a => a.Roms.Contains(rom));\r\n            ExcludeFiles(new List<string> { rom.Path }, parent.SourceConfig.Id);\r\n        }\r\n\r\n        private void AddDirToExclusionList(ScannedRom rom)\r\n        {\r\n            rom.Import = false;\r\n            var parent = GameList.First(a => a.Roms.Contains(rom));\r\n            ExcludeDirectories(new List<string> { rom.Path }, parent.SourceConfig.Id);\r\n        }\r\n\r\n        private void AddFilesToExclusionList(IEnumerable<ScannedGame> games)\r\n        {\r\n            games.ForEach(a => a.Import = false);\r\n            foreach (var scanner in games.GroupBy(a => a.SourceConfig))\r\n            {\r\n                ExcludeFiles(scanner.SelectMany(a => a.Roms).Select(a => a.Path), scanner.Key.Id);\r\n            }\r\n        }\r\n\r\n        private void AddDirsToExclusionList(IEnumerable<ScannedGame> games)\r\n        {\r\n            games.ForEach(a => a.Import = false);\r\n            foreach (var scanner in games.GroupBy(a => a.SourceConfig))\r\n            {\r\n                ExcludeDirectories(scanner.SelectMany(a => a.Roms).Select(a => a.Path), scanner.Key.Id);\r\n            }\r\n        }\r\n\r\n        private void ExcludeFiles(IEnumerable<string> romPaths, Guid scannerId)\r\n        {\r\n            var scanner = database.GameScanners[scannerId];\r\n            if (scanner == null)\r\n            {\r\n                dialogs.ShowErrorMessage(LOC.EmuExclusionNoConfigError, \"\");\r\n            }\r\n            else\r\n            {\r\n                bool update = false;\r\n                foreach (var file in romPaths)\r\n                {\r\n                    var exFile = file.Replace(scanner.Directory, \"\").TrimStart(Paths.DirectorySeparators);\r\n                    if (scanner.ExcludedFiles == null)\r\n                    {\r\n                        scanner.ExcludedFiles = new List<string> { exFile };\r\n                        update = true;\r\n                    }\r\n                    else\r\n                    {\r\n                        if (!scanner.ExcludedFiles.ContainsString(exFile, StringComparison.OrdinalIgnoreCase))\r\n                        {\r\n                            scanner.ExcludedFiles.Add(exFile);\r\n                            update = true;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (update)\r\n                {\r\n                    dialogs.ShowMessage(LOC.EmuExclusionAddedMessage.GetLocalized().Format(scanner.Name));\r\n                    database.GameScanners.Update(scanner);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void ExcludeDirectories(IEnumerable<string> romPaths, Guid scannerId)\r\n        {\r\n            var scanner = database.GameScanners[scannerId];\r\n            if (scanner == null)\r\n            {\r\n                dialogs.ShowErrorMessage(LOC.EmuExclusionNoConfigError, \"\");\r\n            }\r\n            else\r\n            {\r\n                bool update = false;\r\n                foreach (var file in romPaths)\r\n                {\r\n                    var dir = Path.GetDirectoryName(file);\r\n                    var exDir = dir.Replace(scanner.Directory.TrimEnd(Paths.DirectorySeparators), \"\").TrimStart(Paths.DirectorySeparators);\r\n                    if (exDir.IsNullOrWhiteSpace())\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    if (scanner.ExcludedDirectories == null)\r\n                    {\r\n                        scanner.ExcludedDirectories = new List<string> { exDir };\r\n                        update = true;\r\n                    }\r\n                    else\r\n                    {\r\n                        if (!scanner.ExcludedDirectories.ContainsString(exDir, StringComparison.OrdinalIgnoreCase))\r\n                        {\r\n                            scanner.ExcludedDirectories.Add(exDir);\r\n                            update = true;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (update)\r\n                {\r\n                    dialogs.ShowMessage(LOC.EmuExclusionAddedMessage.GetLocalized().Format(scanner.Name));\r\n                    database.GameScanners.Update(scanner);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/EmulatorImportViewModel.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing Playnite.Common;\r\nusing Playnite.Windows;\r\nusing Playnite.DesktopApp.Windows;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Emulators;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class EmulatorImportViewModel : ObservableObject\r\n    {\r\n        private readonly object listSyncLock = new object();\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private readonly IDialogsFactory dialogs;\r\n        private readonly IResourceProvider resources;\r\n        private readonly IGameDatabaseMain database;\r\n        private readonly List<string> importedDirs;\r\n\r\n        public List<ScannedEmulator> SelectedEmulators;\r\n\r\n        private ObservableCollection<ScannedEmulator> emulatorList = new ObservableCollection<ScannedEmulator>();\r\n        public ObservableCollection<ScannedEmulator> EmulatorList\r\n        {\r\n            get => emulatorList;\r\n            set\r\n            {\r\n                emulatorList = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListCollectionView collectionView;\r\n        public ListCollectionView CollectionView\r\n        {\r\n            get => collectionView;\r\n            private set\r\n            {\r\n                collectionView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool hideImported = true;\r\n        public bool HideImported\r\n        {\r\n            get => hideImported;\r\n            set\r\n            {\r\n                hideImported = value;\r\n                OnPropertyChanged();\r\n                CollectionView.Refresh();\r\n            }\r\n        }\r\n\r\n        public RelayCommand CancelCommand =>\r\n            new RelayCommand(() => CloseView(false));\r\n\r\n        public RelayCommand ScanCommmand =>\r\n            new RelayCommand(() => ScanEmulators());\r\n\r\n        public RelayCommand ImportCommand =>\r\n            new RelayCommand(() => ImportEmulators());\r\n\r\n        public RelayCommand SelectAllCommmand =>\r\n            new RelayCommand(\r\n                () => EmulatorList.ForEach(e => e.Import = true),\r\n                () => EmulatorList.HasItems());\r\n\r\n        public RelayCommand DeselectAllCommmand =>\r\n            new RelayCommand(\r\n                () => EmulatorList.ForEach(e => e.Import = false),\r\n                () => EmulatorList.HasItems());\r\n\r\n        public EmulatorImportViewModel(\r\n            IGameDatabaseMain database,\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources)\r\n        {\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            this.database = database;\r\n            importedDirs = database.Emulators.Select(a => a.InstallDir).ToList();\r\n            CollectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(EmulatorList);\r\n            CollectionView.Filter = ListFilter;\r\n            BindingOperations.EnableCollectionSynchronization(EmulatorList, listSyncLock);\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView(bool? result)\r\n        {\r\n            window.Close(result);\r\n        }\r\n\r\n        private bool ListFilter(object item)\r\n        {\r\n            var emulator = (ScannedEmulator)item;\r\n            if (HideImported)\r\n            {\r\n                return !importedDirs.ContainsString(emulator.InstallDir, StringComparison.OrdinalIgnoreCase);\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        public void ScanEmulators()\r\n        {\r\n            var dirToScan = dialogs.SelectFolder();\r\n            if (dirToScan.IsNullOrEmpty())\r\n            {\r\n                return;\r\n            }\r\n\r\n            var scanRes = dialogs.ActivateGlobalProgress((args) =>\r\n            {\r\n                var emulators = EmulatorScanner.SearchForEmulators(dirToScan, Emulation.Definitions, args.CancelToken);\r\n                window.Window.Dispatcher.Invoke(() => EmulatorList.AddRange(emulators));\r\n            },\r\n            new GlobalProgressOptions(LOC.EmuWizardScanning)\r\n            {\r\n                Cancelable = true,\r\n                IsIndeterminate = true\r\n            });\r\n\r\n            if (scanRes.Error != null)\r\n            {\r\n                dialogs.ShowErrorMessage(LOC.EmulatorScanFailed + \"\\n\" + scanRes.Error.Message, \"\");\r\n            }\r\n        }\r\n\r\n        public void ImportEmulators()\r\n        {\r\n            SelectedEmulators = CollectionView.Cast<ScannedEmulator>().Where(a => a.Import).ToList();\r\n            CloseView(true);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/EmulatorsViewModel.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing Playnite.Common;\r\nusing Playnite.Settings;\r\nusing Playnite.Windows;\r\nusing Playnite.DesktopApp.Windows;\r\nusing Playnite.Emulators;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class EmulatorsViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        class DownloadPlatform : EmulatedPlatform\r\n        {\r\n            public new List<EmulatorDefinition> Emulators { get; set; }\r\n        }\r\n\r\n        public class DownloadEmu\r\n        {\r\n            public string Name { get; set; }\r\n            public string Website { get; set; }\r\n            public EmulatedPlatform Platform { get; set; }\r\n        }\r\n\r\n        public List<DownloadEmu> DownloadEmulatorsList { get; set; }\r\n        public List<Platform> OverridePlatforms { get; set; }\r\n\r\n        private SelectableDbItemList availablePlatforms;\r\n        public SelectableDbItemList AvailablePlatforms\r\n        {\r\n            get => availablePlatforms;\r\n            set\r\n            {\r\n                availablePlatforms = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<string> selectedEmulatorBuiltInProfiles;\r\n        public List<string> SelectedEmulatorBuiltInProfiles\r\n        {\r\n            get => selectedEmulatorBuiltInProfiles;\r\n            set\r\n            {\r\n                selectedEmulatorBuiltInProfiles = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Emulator selectedEmulator;\r\n        public Emulator SelectedEmulator\r\n        {\r\n            get => selectedEmulator;\r\n            set\r\n            {\r\n                if (selectedEmulator != null)\r\n                {\r\n                    selectedEmulator.PropertyChanged -= SelectedEmulator_PropertyChanged;\r\n                }\r\n\r\n                selectedEmulator = value;\r\n                OnPropertyChanged();\r\n                SelectedProfile = SelectedEmulator?.CustomProfiles?.FirstOrDefault();\r\n                if (selectedEmulator != null)\r\n                {\r\n                    selectedEmulator.PropertyChanged += SelectedEmulator_PropertyChanged;\r\n                }\r\n                UpdateSelectedEmulatorBuiltInProfiles();\r\n            }\r\n        }\r\n\r\n        private CustomEmulatorProfile selectedCustomProfile;\r\n        public CustomEmulatorProfile SelectedCustomProfile\r\n        {\r\n            get => selectedCustomProfile;\r\n            set\r\n            {\r\n                selectedCustomProfile = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private BuiltInEmulatorProfile selectedBuiltinProfile;\r\n        public BuiltInEmulatorProfile SelectedBuiltinProfile\r\n        {\r\n            get => selectedBuiltinProfile;\r\n            set\r\n            {\r\n                selectedBuiltinProfile = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(SelectedBuiltInProfilePlatforms));\r\n                OnPropertyChanged(nameof(SelectedBuiltInProfileDefinition));\r\n            }\r\n        }\r\n\r\n        private object selectedProfile;\r\n        public object SelectedProfile\r\n        {\r\n            get => selectedProfile;\r\n            set\r\n            {\r\n                selectedProfile = value;\r\n                if (value is CustomEmulatorProfile cus)\r\n                {\r\n                    SelectedCustomProfile = cus;\r\n                    SelectedBuiltinProfile = null;\r\n                }\r\n                else if (value is BuiltInEmulatorProfile blt)\r\n                {\r\n                    SelectedCustomProfile = null;\r\n                    SelectedBuiltinProfile = blt;\r\n                }\r\n                else\r\n                {\r\n                    SelectedCustomProfile = null;\r\n                    SelectedBuiltinProfile = null;\r\n                }\r\n\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public EmulatorDefinitionProfile SelectedBuiltInProfileDefinition\r\n        {\r\n            get\r\n            {\r\n                if (SelectedEmulator == null || SelectedBuiltinProfile == null)\r\n                {\r\n                    return null;\r\n                }\r\n\r\n                return Emulation.GetProfile(SelectedEmulator.BuiltInConfigId, SelectedBuiltinProfile.BuiltInProfileName);\r\n            }\r\n        }\r\n\r\n        public string SelectedBuiltInProfilePlatforms\r\n        {\r\n            get\r\n            {\r\n                if (SelectedBuiltinProfile == null)\r\n                {\r\n                    return string.Empty;\r\n                }\r\n\r\n                var profile = Emulation.GetProfile(SelectedEmulator.BuiltInConfigId, SelectedBuiltinProfile.BuiltInProfileName);\r\n                if (profile == null)\r\n                {\r\n                    return string.Empty;\r\n                }\r\n\r\n                return string.Join(\", \", profile.Platforms.Select(a => Emulation.GetPlatform(a)?.Name).Where(a => a != null));\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<Emulator> editingEmulators;\r\n        public ObservableCollection<Emulator> EditingEmulators\r\n        {\r\n            get => editingEmulators;\r\n            set\r\n            {\r\n                editingEmulators = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<GameScannerConfig> editingScannerConfigs;\r\n        public ObservableCollection<GameScannerConfig> EditingScanners\r\n        {\r\n            get => editingScannerConfigs;\r\n            set\r\n            {\r\n                editingScannerConfigs = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private GameScannerConfig selectedScanner;\r\n        public GameScannerConfig SelectedScanner\r\n        {\r\n            get => selectedScanner;\r\n            set\r\n            {\r\n                selectedScanner = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public GameScannersSettings GlobalScanSettings\r\n        {\r\n            get;\r\n        }\r\n\r\n        public List<EmulatorDefinition> SelectableEmulatorDefinitions { get; set; }\r\n        public IList<EmulatorDefinition> EmulatorDefinitions { get; set; }\r\n\r\n        public RelayCommand CancelCommand =>\r\n            new RelayCommand(() => CancelDialog());\r\n\r\n        public RelayCommand ConfirmCommand =>\r\n            new RelayCommand(() => ConfirmDialog());\r\n\r\n        public RelayCommand<CustomEmulatorProfile> SelectEmulatorExecutableCommand =>\r\n            new RelayCommand<CustomEmulatorProfile>(\r\n                (a) => SelectEmulatorExecutable(a),\r\n                (a) => a != null);\r\n\r\n        public RelayCommand AddEmulatorCommand =>\r\n            new RelayCommand(() => AddEmulator());\r\n\r\n        public RelayCommand<Emulator> RemoveEmulatorCommand =>\r\n            new RelayCommand<Emulator>(\r\n                (a) => RemoveEmulator(a),\r\n                (a) => a != null);\r\n\r\n        public RelayCommand<Emulator> CopyEmulatorCommand =>\r\n            new RelayCommand<Emulator>(\r\n                (a) => CopyEmulator(a),\r\n                (a) => a != null);\r\n\r\n        public RelayCommand<Button> AddEmulatorProfileCommand\r\n        {\r\n            get => new RelayCommand<Button>((button) =>\r\n            {\r\n                if (!SelectedEmulator.BuiltInConfigId.IsNullOrEmpty())\r\n                {\r\n                    var def = Emulation.GetDefition(SelectedEmulator.BuiltInConfigId);\r\n                    if (def == null)\r\n                    {\r\n                        logger.Error($\"Trying to add built-in emulator profile to uknown emulator def {SelectedEmulator.BuiltInConfigId}\");\r\n                        return;\r\n                    }\r\n\r\n                    var menu = button.ContextMenu;\r\n                    menu.Items.Clear();\r\n                    foreach (var profile in def.Profiles.OrderBy(a => a.Name).Select(p => p.Name))\r\n                    {\r\n                        menu.Items.Add(new MenuItem\r\n                        {\r\n                            Header = $\"{LOC.EmulatorBuiltInProfile.GetLocalized()}: {profile}\",\r\n                            Command = new RelayCommand<object>((_) => AddBuiltinEmulatorProfile(SelectedEmulator, profile))\r\n                        });\r\n                    }\r\n\r\n                    menu.Items.Add(new MenuItem\r\n                    {\r\n                        Header = LOC.EmulatorCustomProfile.GetLocalized(),\r\n                        Command = new RelayCommand<object>((_) => AddCustomEmulatorProfile(SelectedEmulator))\r\n                    });\r\n\r\n                    menu.PlacementTarget = button;\r\n                    menu.IsOpen = true;\r\n                }\r\n                else\r\n                {\r\n                    AddCustomEmulatorProfile(SelectedEmulator);\r\n                }\r\n            }, (_) => SelectedEmulator != null);\r\n        }\r\n\r\n        public RelayCommand<object> RemoveEmulatorProfileCommand =>\r\n            new RelayCommand<object>(\r\n                (a) => RemoveEmulatorProfile(SelectedEmulator, a),\r\n                (a) => a != null);\r\n\r\n        public RelayCommand<object> CopyEmulatorProfileCommand =>\r\n            new RelayCommand<object>(\r\n                (a) => CopyEmulatorProfile(SelectedEmulator, (CustomEmulatorProfile)a),\r\n                (a) => a is CustomEmulatorProfile);\r\n\r\n        public RelayCommand ImportEmulatorsCommand =>\r\n            new RelayCommand(() => ImportEmulators());\r\n\r\n        public RelayCommand DownloadEmulatorsCommand =>\r\n            new RelayCommand(() => DownloadEmulators());\r\n\r\n        public RelayCommand AddScanConfigCommand =>\r\n            new RelayCommand(() => AddNewScannerConfig());\r\n\r\n        public RelayCommand<GameScannerConfig> RemoveScanConfigCommand =>\r\n            new RelayCommand<GameScannerConfig>(\r\n                (a) => RemoveScanConfig(a),\r\n                (a) => a != null);\r\n\r\n        public RelayCommand<GameScannerConfig> CopyScanConfigCommand =>\r\n            new RelayCommand<GameScannerConfig>(\r\n                (a) => CopyScanConfig(a),\r\n                (a) => a != null);\r\n\r\n        public RelayCommand<CancelEventArgs> WindowClosingCommand =>\r\n            new RelayCommand<CancelEventArgs>((a) =>\r\n            {\r\n                WindowClosing(a);\r\n            });\r\n\r\n        private IGameDatabaseMain database;\r\n        private IWindowFactory window;\r\n        private IDialogsFactory dialogs;\r\n        private IResourceProvider resources;\r\n        private bool ignoreClosingEvent = false;\r\n\r\n        public EmulatorsViewModel(IGameDatabaseMain database, IWindowFactory window, IDialogsFactory dialogs, IResourceProvider resources)\r\n        {\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            this.database = database;\r\n\r\n            EmulatorDefinitions = Emulation.Definitions;\r\n            SelectableEmulatorDefinitions = Emulation.Definitions.ToList();\r\n            SelectableEmulatorDefinitions.Insert(0, new EmulatorDefinition\r\n            {\r\n                Name = ResourceProvider.GetString(LOC.None),\r\n                Id = null\r\n            });\r\n\r\n            AvailablePlatforms = new SelectableDbItemList(database.Platforms);\r\n            OverridePlatforms = database.Platforms.OrderBy(a => a.Name).ToList();\r\n            OverridePlatforms.Insert(0, new Platform(LOC.None.GetLocalized()) { Id = Guid.Empty });\r\n            EditingEmulators = database.Emulators.ToList().GetClone().OrderBy(a => a.Name).ToObservable();\r\n            EditingScanners = database.GameScanners.ToList().GetClone().OrderBy(a => a.Name).ToObservable();\r\n            SelectedEmulator = EditingEmulators.Count > 0 ? EditingEmulators[0] : null;\r\n            SelectedScanner = EditingScanners.Count > 0 ? EditingScanners[0] : null;\r\n            GlobalScanSettings = database.GetGameScannersSettings();\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        // Required for cases where a window is closed using ALT-F4 or via X button\r\n        private void WindowClosing(CancelEventArgs e)\r\n        {\r\n            if (ignoreClosingEvent)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var res = CheckUnsavedChanges();\r\n            if (res == MessageBoxResult.Cancel)\r\n            {\r\n                e.Cancel = true;\r\n                return;\r\n            }\r\n            else if (res == MessageBoxResult.Yes)\r\n            {\r\n                ConfirmDataChanges();\r\n                return;\r\n            }\r\n        }\r\n\r\n        private MessageBoxResult CheckUnsavedChanges()\r\n        {\r\n            var hasChanges = false;\r\n            if (EditingEmulators.Count != database.Emulators.Count)\r\n            {\r\n                hasChanges = true;\r\n                goto checkDone;\r\n            }\r\n            else if (EditingEmulators.Count > 0)\r\n            {\r\n                var alist = EditingEmulators.OrderBy(a => a.Id).ToArray();\r\n                var blist = database.Emulators.OrderBy(a => a.Id).ToArray();\r\n                for (int i = 0; i < alist.Length; i++)\r\n                {\r\n                    var a = alist[i];\r\n                    var b = blist[i];\r\n                    if (a.Id != b.Id)\r\n                    {\r\n                        hasChanges = true;\r\n                        goto checkDone;\r\n                    }\r\n\r\n                    if (!a.IsEqualJson(b))\r\n                    {\r\n                        hasChanges = true;\r\n                        goto checkDone;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (EditingScanners.Count != database.GameScanners.Count)\r\n            {\r\n                hasChanges = true;\r\n            }\r\n            else if (EditingScanners.Count > 0)\r\n            {\r\n                var alist = EditingScanners.OrderBy(a => a.Id).ToArray();\r\n                var blist = database.GameScanners.OrderBy(a => a.Id).ToArray();\r\n                for (int i = 0; i < alist.Length; i++)\r\n                {\r\n                    var a = alist[i];\r\n                    var b = blist[i];\r\n                    if (a.Id != b.Id)\r\n                    {\r\n                        hasChanges = true;\r\n                        goto checkDone;\r\n                    }\r\n\r\n                    if (!a.IsEqualJson(b))\r\n                    {\r\n                        hasChanges = true;\r\n                        goto checkDone;\r\n                    }\r\n                }\r\n            }\r\n\r\n            checkDone:\r\n            if (hasChanges)\r\n            {\r\n                return dialogs.ShowMessage(LOC.UnsavedChangesAskMessage, \"\", MessageBoxButton.YesNoCancel, MessageBoxImage.Warning);\r\n            }\r\n\r\n            return MessageBoxResult.None;\r\n        }\r\n\r\n        public void CancelDialog()\r\n        {\r\n            var res = CheckUnsavedChanges();\r\n            if (res == MessageBoxResult.Cancel)\r\n            {\r\n                return;\r\n            }\r\n            else if (res == MessageBoxResult.Yes)\r\n            {\r\n                ConfirmDialog();\r\n                return;\r\n            }\r\n\r\n            ignoreClosingEvent = true;\r\n            window.Close(false);\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            ConfirmDataChanges();\r\n            ignoreClosingEvent = true;\r\n            window.Close(true);\r\n        }\r\n\r\n        private void ConfirmDataChanges()\r\n        {\r\n            using (database.BufferedUpdate())\r\n            {\r\n                // Remove deleted items\r\n                var removedEmulators = database.Emulators.Where(a => EditingEmulators.FirstOrDefault(b => b.Id == a.Id) == null).ToList();\r\n                if (removedEmulators.Any())\r\n                {\r\n                    database.Emulators.Remove(removedEmulators);\r\n                }\r\n\r\n                var removedScanners = database.GameScanners.Where(a => EditingScanners.FirstOrDefault(b => b.Id == a.Id) == null).ToList();\r\n                if (removedScanners.Any())\r\n                {\r\n                    database.GameScanners.Remove(removedScanners);\r\n                }\r\n\r\n                // Add new items\r\n                var addedEmulators = EditingEmulators.Where(a => database.Emulators[a.Id] == null).ToList();\r\n                if (addedEmulators.Any())\r\n                {\r\n                    database.Emulators.Add(addedEmulators);\r\n                }\r\n\r\n                var addedScanners = EditingScanners.Where(a => database.GameScanners[a.Id] == null).ToList();\r\n                if (addedScanners.Any())\r\n                {\r\n                    database.GameScanners.Add(addedScanners);\r\n                }\r\n\r\n                // Update modified items\r\n                foreach (var item in EditingEmulators)\r\n                {\r\n                    var dbItem = database.Emulators[item.Id];\r\n                    if (dbItem != null && !item.IsEqualJson(dbItem))\r\n                    {\r\n                        database.Emulators.Update(item);\r\n                    }\r\n                }\r\n\r\n                foreach (var item in EditingScanners)\r\n                {\r\n                    var dbItem = database.GameScanners[item.Id];\r\n                    if (dbItem != null && !item.IsEqualJson(dbItem))\r\n                    {\r\n                        database.GameScanners.Update(item);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var dbSet = database.GetGameScannersSettings();\r\n            if (!GlobalScanSettings.IsEqualJson(dbSet))\r\n            {\r\n                database.SetGameScannersSettings(GlobalScanSettings);\r\n            }\r\n        }\r\n\r\n        public void AddEmulator()\r\n        {\r\n            var emulator = new Emulator(\"New Emulator\");\r\n            EditingEmulators.Add(emulator);\r\n            SelectedEmulator = emulator;\r\n        }\r\n\r\n        public void RemoveEmulator(Emulator emulator)\r\n        {\r\n            var games = database.Games.Where(a => a.GameActions?.FirstOrDefault(action => action.Type == GameActionType.Emulator && action.EmulatorId == emulator.Id) != null);\r\n            if (games.Count() > 0)\r\n            {\r\n                if (dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCEmuRemovalConfirmation\"), emulator.Name, games.Count()),\r\n                    \"\",\r\n                    MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.No)\r\n                {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            EditingEmulators.Remove(emulator);\r\n            if (EditingEmulators.Count > 0)\r\n            {\r\n                SelectedEmulator = EditingEmulators[0];\r\n            }\r\n            else\r\n            {\r\n                SelectedEmulator = null;\r\n            }\r\n        }\r\n\r\n        public void CopyEmulator(Emulator emulator)\r\n        {\r\n            var copy = emulator.GetClone();\r\n            copy.Id = Guid.NewGuid();\r\n            copy.Name += \" Copy\";\r\n            if (copy.CustomProfiles?.Any() == true)\r\n            {\r\n                foreach (var profile in copy.CustomProfiles)\r\n                {\r\n                    profile.Id = $\"{CustomEmulatorProfile.ProfilePrefix}{Guid.NewGuid()}\";\r\n                }\r\n            }\r\n\r\n            EditingEmulators.Add(copy);\r\n            SelectedEmulator = copy;\r\n        }\r\n\r\n        public void AddCustomEmulatorProfile(Emulator emulator)\r\n        {\r\n            if (emulator.CustomProfiles == null)\r\n            {\r\n                emulator.CustomProfiles = new ObservableCollection<CustomEmulatorProfile>();\r\n            }\r\n\r\n            emulator.CustomProfiles.Add(new CustomEmulatorProfile\r\n            {\r\n                Name = \"New Profile\",\r\n                WorkingDirectory = ExpandableVariables.EmulatorDirectory\r\n            });\r\n            SelectedProfile = emulator.CustomProfiles.Last();\r\n        }\r\n\r\n        private void AddBuiltinEmulatorProfile(Emulator emulator, string profileName)\r\n        {\r\n            if (emulator.BuiltinProfiles == null)\r\n            {\r\n                emulator.BuiltinProfiles = new ObservableCollection<BuiltInEmulatorProfile>();\r\n            }\r\n\r\n            emulator.BuiltinProfiles.Add(new BuiltInEmulatorProfile\r\n            {\r\n                Name = profileName,\r\n                BuiltInProfileName = profileName\r\n            });\r\n            SelectedProfile = emulator.BuiltinProfiles.Last();\r\n        }\r\n\r\n        public void RemoveEmulatorProfile(Emulator parent, object profile)\r\n        {\r\n            if (profile is BuiltInEmulatorProfile biProf)\r\n            {\r\n                parent.BuiltinProfiles.Remove(biProf);\r\n            }\r\n            else if (profile is CustomEmulatorProfile csProf)\r\n            {\r\n                parent.CustomProfiles.Remove(csProf);\r\n            }\r\n        }\r\n\r\n        public void CopyEmulatorProfile(Emulator emulator, CustomEmulatorProfile profile)\r\n        {\r\n            var copy = profile.GetClone();\r\n            copy.Id = $\"{CustomEmulatorProfile.ProfilePrefix}{Guid.NewGuid()}\";\r\n            copy.Name += \" Copy\";\r\n            emulator.CustomProfiles.Add(copy);\r\n            SelectedProfile = copy;\r\n        }\r\n\r\n        public void SelectEmulatorExecutable(CustomEmulatorProfile profile)\r\n        {\r\n            var path = dialogs.SelectFile(\"*.*|*.*\");\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                profile.Executable = path;\r\n            }\r\n        }\r\n\r\n        public void DownloadEmulators()\r\n        {\r\n            // TODO rewrite to something more sane\r\n            var plats = Emulation.Platforms.Where(a => a.Emulators.HasItems()).Select(a => new DownloadPlatform\r\n            {\r\n                Id = a.Id,\r\n                Name = a.Name,\r\n                Emulators = a.Emulators.Select(p => Emulation.GetDefition(p)).ToList()\r\n            });\r\n            DownloadEmulatorsList = plats.SelectMany(a => a.Emulators.Where(e => e != null).Select(b => new DownloadEmu\r\n            {\r\n                Name = b.Name,\r\n                Website = b.Website,\r\n                Platform = a\r\n            })).ToList();\r\n            new EmulatorDownloadWindowFactory().CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void ImportEmulators()\r\n        {\r\n            var model = new EmulatorImportViewModel(\r\n                database,\r\n                new EmulatorImportWindowFactory(),\r\n                dialogs,\r\n                resources);\r\n            if (model.OpenView() != true)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (!model.SelectedEmulators.HasItems())\r\n            {\r\n                return;\r\n            }\r\n\r\n            foreach (var toImport in model.SelectedEmulators)\r\n            {\r\n                var importProfiles = toImport.Profiles.Where(a => a.Import);\r\n                if (!importProfiles.HasItems())\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                var newEmulator = new Emulator(toImport.Name)\r\n                {\r\n                    BuiltInConfigId = toImport.Id,\r\n                    BuiltinProfiles = new ObservableCollection<BuiltInEmulatorProfile>(),\r\n                    InstallDir = toImport.InstallDir\r\n                };\r\n\r\n                importProfiles.ForEach(a => newEmulator.BuiltinProfiles.Add(new BuiltInEmulatorProfile\r\n                {\r\n                    Name = a.Name,\r\n                    BuiltInProfileName = a.ProfileName\r\n                }));\r\n\r\n                EditingEmulators.Add(newEmulator);\r\n            }\r\n        }\r\n\r\n        private void SelectedEmulator_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(Emulator.BuiltInConfigId))\r\n            {\r\n                UpdateSelectedEmulatorBuiltInProfiles();\r\n            }\r\n        }\r\n\r\n        private void UpdateSelectedEmulatorBuiltInProfiles()\r\n        {\r\n            if (SelectedEmulator == null)\r\n            {\r\n                SelectedEmulatorBuiltInProfiles = null;\r\n                return;\r\n            }\r\n\r\n            SelectedEmulatorBuiltInProfiles =\r\n                Emulation.GetDefition(SelectedEmulator.BuiltInConfigId)?.Profiles.Select(a => a.Name).ToList();\r\n        }\r\n\r\n        private void AddNewScannerConfig()\r\n        {\r\n            var newConfig = new GameScannerConfig { Name = \"Config\" };\r\n            EditingScanners.Add(newConfig);\r\n            SelectedScanner = newConfig;\r\n        }\r\n\r\n        private void CopyScanConfig(GameScannerConfig config)\r\n        {\r\n            var copy = config.GetClone();\r\n            copy.Id = Guid.NewGuid();\r\n            copy.Name += \" Copy\";\r\n            EditingScanners.Add(copy);\r\n            SelectedScanner = copy;\r\n        }\r\n\r\n        private void RemoveScanConfig(GameScannerConfig config)\r\n        {\r\n            EditingScanners.Remove(config);\r\n            if (EditingScanners.Count > 0)\r\n            {\r\n                SelectedScanner = EditingScanners[0];\r\n            }\r\n            else\r\n            {\r\n                SelectedScanner = null;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/FirstTimeStartupViewModel.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Settings;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing Playnite.Windows;\r\nusing Playnite.DesktopApp.Windows;\r\nusing Playnite.Services;\r\nusing Playnite.Common.Web;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class FirstTimeStartupViewModel : ObservableObject\r\n    {\r\n        public class Pages\r\n        {\r\n            public const int Intro = 0;\r\n            public const int ProviderSelect = 1;\r\n            public const int ProviderConfig = 2;\r\n            public const int Finish = 3;\r\n        }\r\n\r\n        public class RecommendedAddon : SelectableItem<string>\r\n        {\r\n            public string Name { get; set; }\r\n\r\n            public RecommendedAddon(string addonId, string name) : base(addonId)\r\n            {\r\n                Name = name;\r\n            }\r\n        }\r\n\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private IDialogsFactory dialogs;\r\n        private IResourceProvider resources;\r\n        private ExtensionFactory extensions;\r\n        private List<PluginSettingsItem> selectedPlugins { get; } = new List<PluginSettingsItem>();\r\n        private int selectedPluginIndex = 0;\r\n        private ServicesClient backendClient;\r\n        ServicesClient.RecommendedAddons recommendedExtensions = new ServicesClient.RecommendedAddons();\r\n\r\n        public bool ShowFinishButton\r\n        {\r\n            get => SelectedIndex == Pages.Finish;\r\n        }\r\n\r\n        private List<RecommendedAddon> recommendeLibrariesList;\r\n        public List<RecommendedAddon> RecommendeLibrariesList { get => recommendeLibrariesList; set => SetValue(ref recommendeLibrariesList, value); }\r\n\r\n        private PlayniteSettings settings = new PlayniteSettings();\r\n        public PlayniteSettings Settings\r\n        {\r\n            get\r\n            {\r\n                return settings;\r\n            }\r\n\r\n            set\r\n            {\r\n                settings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int selectedIndex = 0;\r\n        public int SelectedIndex\r\n        {\r\n            get\r\n            {\r\n                return selectedIndex;\r\n            }\r\n\r\n            set\r\n            {\r\n                selectedIndex = value;\r\n                OnPropertyChanged(nameof(ShowFinishButton));\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private UserControl selectedProviderSettingsView;\r\n        public UserControl SelectedProviderSettingsView\r\n        {\r\n            get\r\n            {\r\n                return selectedProviderSettingsView;\r\n            }\r\n\r\n            set\r\n            {\r\n                selectedProviderSettingsView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private PluginSettingsItem selectedPlugin;\r\n        public PluginSettingsItem SelectedLibraryPlugin\r\n        {\r\n            get\r\n            {\r\n                return selectedPlugin;\r\n            }\r\n\r\n            set\r\n            {\r\n                selectedPlugin = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public List<InstalledPlugin> LibraryPlugins\r\n        {\r\n            get;\r\n        } = new List<InstalledPlugin>();\r\n\r\n        public RelayCommand<object> CloseCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView(false);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> FinishCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView(true);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> NextCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                NavigateNext();\r\n            }, (a) => SelectedIndex < Pages.Finish);\r\n        }\r\n\r\n        public FirstTimeStartupViewModel(\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ExtensionFactory extensions,\r\n            ServicesClient backendClient)\r\n        {\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            this.extensions = extensions;\r\n            this.backendClient = backendClient;\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView(bool? result)\r\n        {\r\n            Settings.DisabledPlugins = LibraryPlugins.Where(a => !a.Selected)?.Select(a => a.Description.Id).ToList();\r\n            foreach (var plugin in LibraryPlugins)\r\n            {\r\n                plugin.Plugin.Dispose();\r\n            }\r\n\r\n            window.Close(result);\r\n        }\r\n\r\n        private void SetPluginConfiguration(PluginSettingsItem plugin)\r\n        {\r\n            SelectedLibraryPlugin = plugin;\r\n            var view = plugin.View;\r\n            view.DataContext = plugin.Settings;\r\n            SelectedProviderSettingsView = view;\r\n            plugin.Settings.BeginEdit();\r\n        }\r\n\r\n        public void NavigateNext()\r\n        {\r\n            if (SelectedIndex == Pages.Intro)\r\n            {\r\n                var listDownRes = dialogs.ActivateGlobalProgress((prg) =>\r\n                {\r\n                    recommendedExtensions = backendClient.GetDefaultExtensions();\r\n                }, new GlobalProgressOptions(LOC.DefaultAddonListDownload, false) { IsIndeterminate = true });\r\n\r\n                if (!recommendedExtensions.Libraries.HasItems())\r\n                {\r\n                    if (listDownRes.Error != null)\r\n                    {\r\n                        logger.Error(listDownRes.Error, \"Failed to get list of default extensions.\");\r\n                    }\r\n\r\n                    dialogs.ShowErrorMessage(LOC.DefaultAddonListDownloadError.GetLocalized() + $\"\\n\\n{listDownRes.Error?.Message}\", \"\");\r\n                    SelectedIndex = Pages.Finish;\r\n                    return;\r\n                }\r\n\r\n                RecommendeLibrariesList = recommendedExtensions.Libraries.Select(a => new RecommendedAddon(a.Value, a.Key)).ToList();\r\n                SelectedIndex++;\r\n                return;\r\n            }\r\n\r\n            if (SelectedIndex == Pages.ProviderSelect)\r\n            {\r\n                var selectedLibs = RecommendeLibrariesList.Where(a => a.Selected == true).ToList();\r\n                var allPassed = true;\r\n                dialogs.ActivateGlobalProgress((prg) =>\r\n                {\r\n                    prg.ProgressMaxValue = selectedLibs.Count + recommendedExtensions.Generic?.Count ?? 0;\r\n                    prg.CurrentProgressValue = 0;\r\n\r\n                    foreach (var lib in selectedLibs)\r\n                    {\r\n                        prg.CurrentProgressValue++;\r\n                        prg.Text = resources.GetString(LOC.FirstDownloadingAddon).Format(lib.Name);\r\n                        if (!DownloadAndInstallAddon(lib.Item))\r\n                        {\r\n                            allPassed = false;\r\n                        }\r\n                    }\r\n\r\n                    foreach (var genericPlugin in recommendedExtensions.Generic ?? new Dictionary<string, string>())\r\n                    {\r\n                        prg.CurrentProgressValue++;\r\n                        prg.Text = resources.GetString(LOC.FirstDownloadingAddon).Format(genericPlugin.Key);\r\n                        if (!DownloadAndInstallAddon(genericPlugin.Value))\r\n                        {\r\n                            allPassed = false;\r\n                        }\r\n                    }\r\n                }, new GlobalProgressOptions(\"\", false) { IsIndeterminate = false });\r\n\r\n                if (!allPassed)\r\n                {\r\n                    dialogs.ShowErrorMessage(LOC.FirstPluginDownloadError, \"\");\r\n                }\r\n\r\n                ExtensionInstaller.InstallExtensionQueue();\r\n                extensions.LoadPlugins(null, false, null);\r\n                foreach (var lib in extensions.LibraryPlugins)\r\n                {\r\n                    selectedPlugins.Add(new PluginSettingsItem\r\n                    {\r\n                        Name = lib.Name,\r\n                        View = lib.GetSettingsView(true),\r\n                        Settings = lib.GetSettings(true),\r\n                        Icon = lib.LibraryIcon\r\n                    });\r\n                }\r\n\r\n                if (selectedPlugins.HasItems())\r\n                {\r\n                    SelectedIndex++;\r\n                    SetPluginConfiguration(selectedPlugins[0]);\r\n                }\r\n                else\r\n                {\r\n                    SelectedIndex = Pages.Finish;\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            if (SelectedIndex == Pages.ProviderConfig && SelectedLibraryPlugin != null)\r\n            {\r\n                if (SelectedLibraryPlugin.Settings.VerifySettings(out var errors))\r\n                {\r\n                    SelectedLibraryPlugin.Settings.EndEdit();\r\n                }\r\n                else\r\n                {\r\n                    dialogs.ShowErrorMessage(string.Join(Environment.NewLine, errors), \"\");\r\n                    return;\r\n                }\r\n\r\n                if ((selectedPluginIndex + 1) < selectedPlugins.Count)\r\n                {\r\n                    selectedPluginIndex++;\r\n                    SetPluginConfiguration(selectedPlugins[selectedPluginIndex]);\r\n                    return;\r\n                }\r\n            }\r\n\r\n            SelectedIndex++;\r\n        }\r\n\r\n        private bool DownloadAndInstallAddon(string addonId)\r\n        {\r\n            try\r\n            {\r\n                var addon = backendClient.GetAddon(addonId);\r\n                var man = addon.InstallerManifest;\r\n                var package = man.GetLatestCompatiblePackage();\r\n                if (package == null)\r\n                {\r\n                    logger.Error($\"Can't install addon {addonId}, no compatible package found.\");\r\n                    return false;\r\n                }\r\n\r\n                var localPath = addon.GetTargetDownloadPath();\r\n                FileSystem.DeleteFile(localPath);\r\n                FileSystem.PrepareSaveFile(localPath);\r\n                HttpDownloader.DownloadFile(package.PackageUrl, localPath);\r\n                ExtensionInstaller.QueuePackageInstall(localPath);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to firt time setup addon {addonId}\");\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/GameDetailsViewModel.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Settings;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing Playnite.Converters;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class GameDetailsViewModel : ObservableObject, IDisposable\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private IResourceProvider resources;\r\n        private IDialogsFactory dialogs;\r\n        private DesktopGamesEditor editor;\r\n        private PlayniteSettings settings;\r\n\r\n        public bool IsRunning\r\n        {\r\n            get\r\n            {\r\n                return Game != null && Game.IsRunning;\r\n            }\r\n        }\r\n\r\n        public bool IsInstalling\r\n        {\r\n            get\r\n            {\r\n                return Game != null && Game.IsInstalling;\r\n            }\r\n        }\r\n\r\n        public bool IsUninstalling\r\n        {\r\n            get\r\n            {\r\n                return Game != null && Game.IsUninstalling;\r\n            }\r\n        }\r\n\r\n        public bool IsLaunching\r\n        {\r\n            get\r\n            {\r\n                return Game != null && Game.IsLaunching;\r\n            }\r\n        }\r\n\r\n        public bool IsInstalled\r\n        {\r\n            get\r\n            {\r\n                return Game != null && Game.IsInstalled;\r\n            }\r\n        }\r\n\r\n        public bool IsPlayAvailable\r\n        {\r\n            get\r\n            {\r\n                return Game != null && Game.IsInstalled && !IsRunning && !IsInstalling && !IsUninstalling && !IsLaunching;\r\n            }\r\n        }\r\n\r\n        public bool IsContextAvailable\r\n        {\r\n            get\r\n            {\r\n                return Game != null && (IsRunning || IsInstalling || IsUninstalling || IsLaunching || !IsInstalled);\r\n            }\r\n        }\r\n\r\n        public bool IsInstallAvailable\r\n        {\r\n            get\r\n            {\r\n                return Game != null && !Game.IsInstalled && !IsRunning && !IsInstalling && !IsUninstalling && !IsLaunching && Game.PluginId != Guid.Empty;\r\n            }\r\n        }\r\n\r\n        public string ContextActionDescription\r\n        {\r\n            get\r\n            {\r\n                if (Game?.IsRunning == true)\r\n                {\r\n                    return resources.GetString(\"LOCGameRunning\");\r\n                }\r\n                else if (Game?.IsLaunching == true)\r\n                {\r\n                    return resources.GetString(\"LOCGameLaunching\");\r\n                }\r\n                else if (Game?.IsInstalling == true)\r\n                {\r\n                    return resources.GetString(\"LOCSetupRunning\");\r\n                }\r\n                else if (Game?.IsUninstalling == true)\r\n                {\r\n                    return resources.GetString(\"LOCUninstalling\");\r\n                }\r\n                else if (Game?.IsInstalled == false)\r\n                {\r\n                    return resources.GetString(\"LOCInstallGame\");\r\n                }\r\n                else if (Game?.IsInstalled == true)\r\n                {\r\n                    return resources.GetString(\"LOCPlayGame\");\r\n                }\r\n\r\n                return \"<ErrorState>\";\r\n            }\r\n        }\r\n\r\n        public Visibility SourceLibraryVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Library & Game.LibraryPlugin != null) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility PlayTimeVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.PlayTime) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility InstallSizeVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.InstallSize && game.InstallSize != null) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility InstallDirectoryVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.InstallDirectory && game.IsInstalled && !string.IsNullOrWhiteSpace(game.InstallDirectory)) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility LastPlayedVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.LastPlayed) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility AddedVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Added && game.Added != null) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility RecentActivityVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.RecentActivity && (game.LastActivity != null || game.Added != null)) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility CompletionStatusVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.CompletionStatus && game.CompletionStatus.Id != Guid.Empty) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility PlatformVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Platform && game.Platforms.HasItems()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility GenreVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Genres && game.GenreIds.HasItems()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility DeveloperVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Developers && game.DeveloperIds.HasItems()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility PublisherVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Publishers && game.PublisherIds.HasItems()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility ReleaseDateVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.ReleaseDate && game.ReleaseDate != null) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility CategoryVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Categories && game.CategoryIds.HasItems()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility TagVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Tags && game.TagIds.HasItems()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility FeatureVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Features && game.FeatureIds.HasItems()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility LinkVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Links && game.Links.HasItems()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility DescriptionVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Description && !game.Description.IsNullOrEmpty()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility NotesVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Notes && !game.Notes.IsNullOrEmpty()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility CoverVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.CoverImage) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility BackgroundVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.BackgroundImage) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility IconVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Icon) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility AgeRatingVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.AgeRating && game.AgeRatings.HasItems()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility SeriesVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Series && game.Series.HasItems()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility SourceVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Source && game.Source.Id != Guid.Empty) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility RegionVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Region && game.Regions.HasItems()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility VersionVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.Version && !game.Version.IsNullOrEmpty()) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility CommunityScoreVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.CommunityScore && game.CommunityScore != null) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility CriticScoreVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.CriticScore && game.CriticScore != null) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility UserScoreVisibility\r\n        {\r\n            get => (settings.DetailsVisibility.UserScore && game.UserScore != null) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public Visibility NameVisibility\r\n        {\r\n            get => settings.DetailsVisibility.Name ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        private GamesCollectionViewEntry game;\r\n        public GamesCollectionViewEntry Game\r\n        {\r\n            get => game;\r\n            set\r\n            {\r\n                game = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<Guid> SetLibraryFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetPlatformFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetPublisherFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetDeveloperFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetGenreFilterCommand { get; }\r\n        public RelayCommand<ReleaseDate?> SetReleaseDateFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetCategoryFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetTagFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetFeatureFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetAgeRatingFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetSeriesFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetSourceFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetRegionFilterCommand { get; }\r\n        public RelayCommand<DatabaseObject> SetCompletionStatusFilterCommand { get; }\r\n        public RelayCommand<Game> OpenGameLocationCommand { get; }\r\n        public RelayCommand<string> SetVersionFilterCommand { get; }\r\n        public RelayCommand<Link> OpenLinkCommand { get; }\r\n        public RelayCommand<DatabaseObject> PlayCommand { get; }\r\n        public RelayCommand<object> InstallCommand { get; }\r\n        public RelayCommand<object> CheckSetupCommand { get; }\r\n        public RelayCommand<object> CheckExecutionCommand { get; }\r\n        public RelayCommand<object> EditGameCommand { get; }\r\n        public RelayCommand<object> ContextActionCommand { get; }\r\n\r\n        public GameDetailsViewModel(GamesCollectionViewEntry game, PlayniteSettings settings)\r\n        {\r\n            this.resources = new ResourceProvider();\r\n            this.settings = settings;\r\n            Game = game;\r\n        }\r\n\r\n        public GameDetailsViewModel(GamesCollectionViewEntry game, PlayniteSettings settings, DesktopGamesEditor editor, IDialogsFactory dialogs, IResourceProvider resources)\r\n        {\r\n            OpenLinkCommand = new RelayCommand<Link>((a) =>\r\n            {\r\n                try\r\n                {\r\n                    GlobalCommands.NavigateUrl(Game.Game.ExpandVariables(a.Url));\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, \"Failed to open url.\");\r\n                }\r\n            });\r\n\r\n            SetLibraryFilterCommand = new RelayCommand<Guid>((a) => SetLibraryFilter(a));\r\n            SetPlatformFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.Platforms));\r\n            SetPublisherFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.Publishers));\r\n            SetDeveloperFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.Developers));\r\n            SetGenreFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.Genres));\r\n            SetReleaseDateFilterCommand = new RelayCommand<ReleaseDate?>((a) => SetReleaseDateFilter(a));\r\n            SetCategoryFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.Categories));\r\n            SetTagFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.Tags));\r\n            SetFeatureFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.Features));\r\n            SetAgeRatingFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.AgeRatings));\r\n            SetSeriesFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.Series));\r\n            SetSourceFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.Source));\r\n            SetRegionFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.Regions));\r\n            SetVersionFilterCommand = new RelayCommand<string>((filter) => SetVersionFilter(filter));\r\n            SetCompletionStatusFilterCommand = new RelayCommand<DatabaseObject>((a) => SetFilter(a, GameField.CompletionStatus));\r\n            PlayCommand = new RelayCommand<DatabaseObject>((a) => Play());\r\n            InstallCommand = new RelayCommand<object>((a) => Install());\r\n            CheckSetupCommand = new RelayCommand<object>((a) => CheckSetup());\r\n            CheckExecutionCommand = new RelayCommand<object>((a) => CheckExecution());\r\n            EditGameCommand = new RelayCommand<object>((a) => EditGame());\r\n            ContextActionCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                if (Game?.IsInstalling == true || Game?.IsUninstalling == true)\r\n                {\r\n                    CheckSetup();\r\n                }\r\n                else if (Game?.IsRunning == true || Game?.IsLaunching == true)\r\n                {\r\n                    CheckExecution();\r\n                }\r\n                else if (Game?.IsInstalled == false)\r\n                {\r\n                    Install();\r\n                }\r\n                else if (Game?.IsInstalled == true)\r\n                {\r\n                    Play();\r\n                }\r\n            });\r\n\r\n            OpenGameLocationCommand = new RelayCommand<Game>((a) =>\r\n            {\r\n                editor.OpenGameLocation(a);\r\n            });\r\n\r\n            this.resources = resources;\r\n            this.dialogs = dialogs;\r\n            this.editor = editor;\r\n            this.settings = settings;\r\n            Game = game;\r\n            if (game != null)\r\n            {\r\n                Game.PropertyChanged += Game_PropertyChanged;\r\n            }\r\n\r\n            settings.PropertyChanged += Settings_PropertyChanged;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            if (game != null)\r\n            {\r\n                Game.PropertyChanged -= Game_PropertyChanged;\r\n            }\r\n\r\n            settings.PropertyChanged -= Settings_PropertyChanged;\r\n        }\r\n\r\n        private void Settings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\r\n        {\r\n            NotifyVisibilityChange();\r\n        }\r\n\r\n        private void Game_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\r\n        {\r\n            OnPropertyChanged(nameof(IsRunning));\r\n            OnPropertyChanged(nameof(IsInstalling));\r\n            OnPropertyChanged(nameof(IsUninstalling));\r\n            OnPropertyChanged(nameof(IsLaunching));\r\n            OnPropertyChanged(nameof(IsPlayAvailable));\r\n            OnPropertyChanged(nameof(IsContextAvailable));\r\n            OnPropertyChanged(nameof(IsInstallAvailable));\r\n            OnPropertyChanged(nameof(ContextActionDescription));\r\n            NotifyVisibilityChange();\r\n        }\r\n\r\n        private void NotifyVisibilityChange()\r\n        {\r\n            foreach (var prop in GetType().GetProperties().Where(a => a.Name.EndsWith(\"Visibility\")))\r\n            {\r\n                OnPropertyChanged(prop.Name);\r\n            }\r\n        }\r\n\r\n        public void SetFilter(DatabaseObject value, GameField filterField)\r\n        {\r\n            var filter = new IdItemFilterItemProperties() { Ids = new List<Guid> { value.Id } };\r\n            switch (filterField)\r\n            {\r\n                case GameField.Platforms:\r\n                    settings.FilterSettings.Platform = filter;\r\n                    break;\r\n                case GameField.Genres:\r\n                    settings.FilterSettings.Genre = filter;\r\n                    break;\r\n                case GameField.Developers:\r\n                    settings.FilterSettings.Developer = filter;\r\n                    break;\r\n                case GameField.Publishers:\r\n                    settings.FilterSettings.Publisher = filter;\r\n                    break;\r\n                case GameField.Categories:\r\n                    settings.FilterSettings.Category = filter;\r\n                    break;\r\n                case GameField.Tags:\r\n                    settings.FilterSettings.Tag = filter;\r\n                    break;\r\n                case GameField.AgeRatings:\r\n                    settings.FilterSettings.AgeRating = filter;\r\n                    break;\r\n                case GameField.Series:\r\n                    settings.FilterSettings.Series = filter;\r\n                    break;\r\n                case GameField.Regions:\r\n                    settings.FilterSettings.Region = filter;\r\n                    break;\r\n                case GameField.Source:\r\n                    settings.FilterSettings.Source = filter;\r\n                    break;\r\n                case GameField.Features:\r\n                    settings.FilterSettings.Feature = filter;\r\n                    break;\r\n                case GameField.CompletionStatus:\r\n                    settings.FilterSettings.CompletionStatuses = filter;\r\n                    break;\r\n                default:\r\n                    break;\r\n            }\r\n\r\n            settings.FilterPanelVisible = true;\r\n        }\r\n\r\n        public void SetReleaseDateFilter(ReleaseDate? date)\r\n        {\r\n            if (date != null)\r\n            {\r\n                settings.FilterSettings.ReleaseYear = new StringFilterItemProperties(date.Value.Year.ToString());\r\n                settings.FilterPanelVisible = true;\r\n            }\r\n        }\r\n\r\n        public void SetVersionFilter(string version)\r\n        {\r\n            if (!version.IsNullOrEmpty())\r\n            {\r\n                settings.FilterSettings.Version = version;\r\n                settings.FilterPanelVisible = true;\r\n            }\r\n        }\r\n\r\n        public void SetLibraryFilter(Guid LibraryId)\r\n        {\r\n            var filter = new IdItemFilterItemProperties() { Ids = new List<Guid> { LibraryId } };\r\n            settings.FilterSettings.Library = filter;\r\n            settings.FilterPanelVisible = true;\r\n        }\r\n\r\n        public void Play()\r\n        {\r\n            editor.PlayGame(game.Game, true);\r\n        }\r\n\r\n        public void Install()\r\n        {\r\n            editor.InstallGame(game.Game);\r\n        }\r\n\r\n        public void EditGame()\r\n        {\r\n            editor.EditGame(game.Game);\r\n        }\r\n\r\n        public void CheckSetup()\r\n        {\r\n            if (dialogs.ShowMessage(\r\n                resources.GetString(\"LOCCancelMonitoringSetupAsk\"),\r\n                resources.GetString(\"LOCCancelMonitoringAskTitle\"),\r\n                MessageBoxButton.YesNo) == MessageBoxResult.Yes)\r\n            {\r\n                editor.CancelGameMonitoring(game.Game);\r\n            }\r\n        }\r\n\r\n        public void CheckExecution()\r\n        {\r\n            if (dialogs.ShowMessage(\r\n                resources.GetString(\"LOCCancelMonitoringExecutionAsk\"),\r\n                resources.GetString(\"LOCCancelMonitoringAskTitle\"),\r\n                MessageBoxButton.YesNo) == MessageBoxResult.Yes)\r\n            {\r\n                editor.CancelGameMonitoring(game.Game);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/GameEditViewModel.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.Database;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.ComponentModel;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Common.Web;\r\nusing Playnite.Metadata;\r\nusing Playnite.Settings;\r\nusing Playnite.Plugins;\r\nusing Playnite.Common;\r\nusing System.Net;\r\nusing Playnite.Windows;\r\nusing System.Drawing.Imaging;\r\nusing Playnite.DesktopApp.Windows;\r\nusing Playnite.SDK.Plugins;\r\nusing System.Text.RegularExpressions;\r\nusing Playnite.Common.Media.Icons;\r\nusing System.Diagnostics;\r\nusing Playnite.SDK.Exceptions;\r\nusing Playnite.Scripting.PowerShell;\r\nusing System.Threading;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public partial class GameEditViewModel : ObservableObject\r\n    {\r\n        public class MetadataDownloadOption\r\n        {\r\n            private IDialogsFactory dialogs;\r\n            private IResourceProvider resources;\r\n            private GameEditViewModel editModel;\r\n\r\n            public object Downloader { get; set; }\r\n\r\n            public string Name { get; set; }\r\n\r\n            public RelayCommand DownloadCommand\r\n            {\r\n                get => new RelayCommand(() =>\r\n                {\r\n                    if (Downloader == null)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    if (Downloader is MetadataPlugin plugin)\r\n                    {\r\n                        editModel.DownloadPluginData(plugin);\r\n                    }\r\n                    else if (Downloader is LibraryMetadataProvider provider)\r\n                    {\r\n                        editModel.DownloadStoreData();\r\n                    }\r\n                });\r\n            }\r\n\r\n            public MetadataDownloadOption(GameEditViewModel model, IDialogsFactory dialogs, IResourceProvider resources)\r\n            {\r\n                this.dialogs = dialogs;\r\n                this.resources = resources;\r\n                editModel = model;\r\n            }\r\n\r\n            public override string ToString()\r\n            {\r\n                return Name ?? base.ToString();\r\n            }\r\n        }\r\n\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private IDialogsFactory dialogs;\r\n        private IResourceProvider resources;\r\n        private GameDatabase database;\r\n        private ExtensionFactory extensions;\r\n        private PlayniteSettings appSettings;\r\n        private bool ignoreClosingEvent = false;\r\n        private readonly MultiEditGame originalMultiGameObj;\r\n\r\n        public string IconMetadata\r\n        {\r\n            get => GetImageProperties(EditingGame.Icon)?.Item1;\r\n        }\r\n\r\n        public string CoverMetadata\r\n        {\r\n            get => GetImageProperties(EditingGame.CoverImage)?.Item1;\r\n        }\r\n\r\n        public string BackgroundMetadata\r\n        {\r\n            get => GetImageProperties(EditingGame.BackgroundImage)?.Item1;\r\n        }\r\n\r\n        public bool IsIconTooLage\r\n        {\r\n            get\r\n            {\r\n                var props = GetImageProperties(EditingGame.Icon);\r\n                if (props != null)\r\n                {\r\n                    return Sizes.GetMegapixelsFromRes(props.Item2) > GameDatabase.MaximumRecommendedIconSize;\r\n                }\r\n\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public bool IsCoverTooLage\r\n        {\r\n            get\r\n            {\r\n                var props = GetImageProperties(EditingGame.CoverImage);\r\n                if (props != null)\r\n                {\r\n                    return Sizes.GetMegapixelsFromRes(props.Item2) > GameDatabase.MaximumRecommendedCoverSize;\r\n                }\r\n\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public bool IsBackgroundTooLage\r\n        {\r\n            get\r\n            {\r\n                var props = GetImageProperties(EditingGame.BackgroundImage);\r\n                if (props != null)\r\n                {\r\n                    return Sizes.GetMegapixelsFromRes(props.Item2) > GameDatabase.MaximumRecommendedBackgroundSize;\r\n                }\r\n\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public object IconImageObject => ImageSourceManager.GetImage(EditingGame.Icon, false, new BitmapLoadProperties(0, 256));\r\n        public object CoverImageObject => ImageSourceManager.GetImage(EditingGame.CoverImage, false, new BitmapLoadProperties(0, 900));\r\n        public object BackgroundImageObject => ImageSourceManager.GetImage(EditingGame.BackgroundImage, false, new BitmapLoadProperties(0, 1080));\r\n\r\n        #region Database fields\r\n\r\n        public SelectableDbItemList Genres { get; set; }\r\n\r\n        public SelectableDbItemList Developers { get; set; }\r\n\r\n        public SelectableDbItemList Publishers { get; set; }\r\n\r\n        public SelectableDbItemList Tags { get; set; }\r\n\r\n        public SelectableDbItemList Features { get; set; }\r\n\r\n        public SelectableDbItemList Categories { get; set; }\r\n\r\n        public ObservableCollection<GameSource> Sources { get; set; }\r\n\r\n        public SelectableDbItemList Regions { get; set; }\r\n\r\n        public SelectableDbItemList Series { get; set; }\r\n\r\n        public SelectableDbItemList AgeRatings { get; set; }\r\n\r\n        public SelectableDbItemList Platforms { get; set; }\r\n\r\n        public List<Emulator> Emulators { get; set; }\r\n\r\n        public ObservableCollection<CompletionStatus> CompletionStatuses { get; set; }\r\n\r\n        #endregion Database fields\r\n\r\n        public bool IsHdrSupported => HdrUtilities.IsHdrSupported();\r\n\r\n        private Game editingGame;\r\n        public Game EditingGame\r\n        {\r\n            get\r\n            {\r\n                return editingGame;\r\n            }\r\n\r\n            set\r\n            {\r\n                editingGame = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public Game Game\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public IEnumerable<Game> Games\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public bool ShowBackgroundUrl\r\n        {\r\n            get\r\n            {\r\n                return EditingGame?.BackgroundImage?.IsHttpUrl() == true;\r\n            }\r\n        }\r\n\r\n        private bool showMetaDownload;\r\n        public bool ShowMetaDownload\r\n        {\r\n            get\r\n            {\r\n                return showMetaDownload;\r\n            }\r\n\r\n            set\r\n            {\r\n                showMetaDownload = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showCheckBoxes = false;\r\n        public bool ShowCheckBoxes\r\n        {\r\n            get\r\n            {\r\n                return showCheckBoxes;\r\n            }\r\n\r\n            set\r\n            {\r\n                showCheckBoxes = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public bool ShowIncludeLibraryPluginAction\r\n        {\r\n            get => IsMultiGameEdit || !EditingGame.IsCustomGame;\r\n        }\r\n\r\n        public bool ShowOverrideInstallStateOption\r\n        {\r\n            get => IsMultiGameEdit || !EditingGame.IsCustomGame;\r\n        }\r\n\r\n        public bool IsSingleGameEdit\r\n        {\r\n            get;\r\n        }\r\n\r\n        public bool IsMultiGameEdit\r\n        {\r\n            get;\r\n        }\r\n\r\n        public bool IsOfficialMetadataAvailable => LibraryPluginMetadataDownloader != null;\r\n\r\n        public List<MetadataDownloadOption> MetadataDownloadOptions\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public LibraryPlugin LibraryPlugin\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public LibraryMetadataProvider LibraryPluginMetadataDownloader\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        public GameEditViewModel(\r\n            Game game,\r\n            GameDatabase database,\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ExtensionFactory extensions,\r\n            PlayniteSettings appSettings)\r\n        {\r\n            Game = game.GetClone();\r\n            IsSingleGameEdit = true;\r\n            IsMultiGameEdit = false;\r\n            EditingGame = game.GetClone();\r\n            ShowCheckBoxes = false;\r\n            ShowMetaDownload = true;\r\n            Init(database, window, dialogs, resources, extensions, appSettings);\r\n        }\r\n\r\n        public GameEditViewModel(\r\n            IEnumerable<Game> games,\r\n            GameDatabase database,\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ExtensionFactory extensions,\r\n            PlayniteSettings appSettings)\r\n        {\r\n            Games = games.Select(a => a.GetClone()).ToList();\r\n            IsSingleGameEdit = false;\r\n            IsMultiGameEdit = true;\r\n            EditingGame = GameTools.GetMultiGameEditObject(Games);\r\n            originalMultiGameObj = EditingGame.GetClone<Game, MultiEditGame>();\r\n            ShowCheckBoxes = true;\r\n            ShowMetaDownload = false;\r\n            Init(database, window, dialogs, resources, extensions, appSettings, EditingGame as MultiEditGame);\r\n        }\r\n\r\n        private void Init(\r\n            GameDatabase database,\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ExtensionFactory extensions,\r\n            PlayniteSettings appSettings,\r\n            MultiEditGame multiEditData = null)\r\n        {\r\n            this.database = database;\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            this.extensions = extensions;\r\n            this.appSettings = appSettings;\r\n\r\n            EditingGame.PropertyChanged += EditingGame_PropertyChanged;\r\n\r\n            Genres = new SelectableDbItemList(database.Genres, EditingGame.GenreIds, multiEditData?.DistinctGenreIds);\r\n            Genres.SelectionChanged += (s, e) => { EditingGame.GenreIds = ((SelectableDbItemList)s).GetSelectedIds(); };\r\n\r\n            Developers = new SelectableDbItemList(database.Companies, EditingGame.DeveloperIds, multiEditData?.DistinctDeveloperIds);\r\n            Developers.SelectionChanged += (s, e) => { EditingGame.DeveloperIds = ((SelectableDbItemList)s).GetSelectedIds(); };\r\n\r\n            Publishers = new SelectableDbItemList(database.Companies, EditingGame.PublisherIds, multiEditData?.DistinctPublisherIds);\r\n            Publishers.SelectionChanged += (s, e) => { EditingGame.PublisherIds = ((SelectableDbItemList)s).GetSelectedIds(); };\r\n\r\n            Categories = new SelectableDbItemList(database.Categories, EditingGame.CategoryIds, multiEditData?.DistinctCategoryIds);\r\n            Categories.SelectionChanged += (s, e) => { EditingGame.CategoryIds = ((SelectableDbItemList)s).GetSelectedIds(); };\r\n\r\n            Tags = new SelectableDbItemList(database.Tags, EditingGame.TagIds, multiEditData?.DistinctTagIds);\r\n            Tags.SelectionChanged += (s, e) => { EditingGame.TagIds = ((SelectableDbItemList)s).GetSelectedIds(); };\r\n\r\n            Features = new SelectableDbItemList(database.Features, EditingGame.FeatureIds, multiEditData?.DistinctFeatureIds);\r\n            Features.SelectionChanged += (s, e) => { EditingGame.FeatureIds = ((SelectableDbItemList)s).GetSelectedIds(); };\r\n\r\n            Platforms = new SelectableDbItemList(database.Platforms, EditingGame.PlatformIds, multiEditData?.DistinctPlatformIds);\r\n            Platforms.SelectionChanged += (s, e) => { EditingGame.PlatformIds = ((SelectableDbItemList)s).GetSelectedIds(); };\r\n\r\n            Series = new SelectableDbItemList(database.Series, EditingGame.SeriesIds, multiEditData?.DistinctSeriesIds);\r\n            Series.SelectionChanged += (s, e) => { EditingGame.SeriesIds = ((SelectableDbItemList)s).GetSelectedIds(); };\r\n\r\n            AgeRatings = new SelectableDbItemList(database.AgeRatings, EditingGame.AgeRatingIds, multiEditData?.DistinctAgeRatingIds);\r\n            AgeRatings.SelectionChanged += (s, e) => { EditingGame.AgeRatingIds = ((SelectableDbItemList)s).GetSelectedIds(); };\r\n\r\n            Regions = new SelectableDbItemList(database.Regions, EditingGame.RegionIds, multiEditData?.DistinctRegionIds);\r\n            Regions.SelectionChanged += (s, e) => { EditingGame.RegionIds = ((SelectableDbItemList)s).GetSelectedIds(); };\r\n\r\n            Sources = database.Sources.OrderBy(a => a.Name).ToObservable();\r\n            Sources.Insert(0, new GameSource() { Id = Guid.Empty, Name = string.Empty });\r\n\r\n            CompletionStatuses = database.CompletionStatuses.OrderBy(a => a.Name).ToObservable();\r\n            CompletionStatuses.Insert(0, new CompletionStatus() { Id = Guid.Empty, Name = string.Empty });\r\n\r\n            Emulators = database.Emulators.OrderBy(a => a.Name).ToList();\r\n            Emulators.Insert(0, new Emulator(resources.GetString(LOC.EmulatorSelectOnStart)) { Id = Guid.Empty });\r\n\r\n            if (EditingGame.Links != null)\r\n            {\r\n                EditingGame.Links.CollectionChanged += Links_CollectionChanged;\r\n                foreach (var link in EditingGame.Links)\r\n                {\r\n                    if (link != null)\r\n                    {\r\n                        link.PropertyChanged += Link_PropertyChanged;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (EditingGame.Roms != null)\r\n            {\r\n                EditingGame.Roms.CollectionChanged += Roms_CollectionChanged;\r\n                foreach (var rom in EditingGame.Roms)\r\n                {\r\n                    if (rom != null)\r\n                    {\r\n                        rom.PropertyChanged += Rom_PropertyChanged;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (EditingGame.GameActions != null)\r\n            {\r\n                EditingGame.GameActions.CollectionChanged += OtherActions_CollectionChanged;\r\n                foreach (var action in EditingGame.GameActions)\r\n                {\r\n                    action.PropertyChanged += GameAction_PropertyChanged;\r\n                }\r\n            }\r\n\r\n            if (IsSingleGameEdit)\r\n            {\r\n                MetadataDownloadOptions = new List<MetadataDownloadOption>();\r\n                if (extensions?.MetadataPlugins != null)\r\n                {\r\n                    foreach (var plugin in extensions.MetadataPlugins)\r\n                    {\r\n                        MetadataDownloadOptions.Add(new MetadataDownloadOption(this, dialogs, resources)\r\n                        {\r\n                            Downloader = plugin,\r\n                            Name = plugin.Name\r\n                        });\r\n                    }\r\n                }\r\n\r\n                LibraryPlugin = extensions?.LibraryPlugins?.FirstOrDefault(a => a.Id == Game?.PluginId);\r\n                try\r\n                {\r\n                    LibraryPluginMetadataDownloader = LibraryPlugin?.GetMetadataDownloader();\r\n                    if (LibraryPluginMetadataDownloader != null)\r\n                    {\r\n                        MetadataDownloadOptions.Add(new MetadataDownloadOption(this, dialogs, resources)\r\n                        {\r\n                            Downloader = LibraryPluginMetadataDownloader,\r\n                            Name = resources.GetString(\"LOCMetaSourceStore\")\r\n                        });\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get library metadata downloader {LibraryPlugin?.GetType()}\");\r\n                }\r\n\r\n                if (!MetadataDownloadOptions.HasItems())\r\n                {\r\n                    MetadataDownloadOptions.Add(new MetadataDownloadOption(this, dialogs, resources)\r\n                    {\r\n                        Name = LOC.NoMetadataSource.GetLocalized()\r\n                    });\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        // Required for cases where a window is closed using ALT-F4 or via X button\r\n        private void WindowClosing(CancelEventArgs e)\r\n        {\r\n            if (ignoreClosingEvent)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var res = CheckUnsavedChanges();\r\n            if (res == MessageBoxResult.Cancel)\r\n            {\r\n                e.Cancel = true;\r\n                return;\r\n            }\r\n            else if (res == MessageBoxResult.Yes)\r\n            {\r\n                ConfirmDialog(true);\r\n                return;\r\n            }\r\n        }\r\n\r\n        private MessageBoxResult CheckUnsavedChanges()\r\n        {\r\n            var compareObj = IsMultiGameEdit ? originalMultiGameObj : Game;\r\n            if (!EditingGame.IsEqualJson(compareObj))\r\n            {\r\n                return dialogs.ShowMessage(LOC.UnsavedChangesAskMessage, \"\", MessageBoxButton.YesNoCancel, MessageBoxImage.Warning);\r\n            }\r\n\r\n            return MessageBoxResult.None;\r\n        }\r\n\r\n        public void CancelDialog()\r\n        {\r\n            var res = CheckUnsavedChanges();\r\n            if (res == MessageBoxResult.Cancel)\r\n            {\r\n                return;\r\n            }\r\n            else if (res == MessageBoxResult.Yes)\r\n            {\r\n                ConfirmDialog(false);\r\n                return;\r\n            }\r\n\r\n            ignoreClosingEvent = true;\r\n            CloseView(false, false);\r\n        }\r\n\r\n        public void CloseView(bool result, bool alreadyClosing)\r\n        {\r\n            CleanupTempFiles();\r\n\r\n            try\r\n            {\r\n                LibraryPluginMetadataDownloader?.Dispose();\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to dispose library metadata downloader {LibraryPluginMetadataDownloader.GetType()}\");\r\n            }\r\n\r\n            if (!alreadyClosing)\r\n            {\r\n                window.Close(result);\r\n            }\r\n        }\r\n\r\n        public void ConfirmDialog(bool alreadyClosing)\r\n        {\r\n            try\r\n            {\r\n                // This absolutely sucks, but it has to be done to fix issues like #3013.\r\n                // The only other solution would be changing binding update trigger on ALL elements to PropertyChanged\r\n                // which is probbaly even worse.\r\n                // Basically, when a window is closed via default command action on Enter, current editing control\r\n                // doesn't loose focus before closing a window (specifically before executing default command)\r\n                // and therefore binding for that control is not updated.\r\n                if (window?.Window != null)\r\n                {\r\n                    System.Windows.Input.FocusManager.SetFocusedElement(System.Windows.Input.FocusManager.GetFocusScope(window.Window), null);\r\n                    System.Windows.Input.Keyboard.ClearFocus();\r\n                }\r\n\r\n                // What sucks even more is that this can't be handled generally in a view via something like OnClosing event,\r\n                // because these events are executed after default command is executed.\r\n                // This is therefore an issue on other views as well, not just game edit window.\r\n                // TODO: Implement custom handling for default commands and solve this somehow globally.\r\n            }\r\n            catch\r\n            {\r\n                // This can obviously fail in some cases like when running via unit test runner.\r\n            }\r\n\r\n            List<Guid> consolidateIds(SelectableDbItemList selectionList, List<Guid> originalIds)\r\n            {\r\n                var selected = selectionList.GetSelectedIds();\r\n                var indetermined = selectionList.Where(a => a.Selected == null).Select(a => a.Item.Id);\r\n                if (indetermined.HasItems() && originalIds.HasItems())\r\n                {\r\n                    var fromOriginal = indetermined.Intersect(originalIds);\r\n                    selected.AddRange(fromOriginal.ToList());\r\n                }\r\n\r\n                if (selected.HasItems())\r\n                {\r\n                    return selected;\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n\r\n            if (EditingGame.GameActions.HasItems())\r\n            {\r\n                foreach (var action in EditingGame.GameActions)\r\n                {\r\n                    if (action.TrackingMode == TrackingMode.Directory && action.TrackingPath.IsNullOrWhiteSpace())\r\n                    {\r\n                        dialogs.ShowErrorMessage(\r\n                            resources.GetString(LOC.EmptyTrackingFolderError),\r\n                            resources.GetString(LOC.InvalidGameData));\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (UseNameChanges)\r\n            {\r\n                if (string.IsNullOrWhiteSpace(EditingGame.Name))\r\n                {\r\n                    dialogs.ShowMessage(\r\n                        resources.GetString(\"LOCEmptyGameNameError\"),\r\n                        resources.GetString(\"LOCInvalidGameData\"),\r\n                        MessageBoxButton.OK, MessageBoxImage.Error);\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (UseGenresChanges)\r\n            {\r\n                AddNewItemsToDb(Genres, EditingGame.GenreIds, database.Genres);\r\n            }\r\n\r\n            if (UseDeveloperChanges)\r\n            {\r\n                AddNewItemsToDb(Developers, EditingGame.DeveloperIds, database.Companies);\r\n            }\r\n\r\n            if (UsePublisherChanges)\r\n            {\r\n                AddNewItemsToDb(Publishers, EditingGame.PublisherIds, database.Companies);\r\n            }\r\n\r\n            if (UseCategoryChanges)\r\n            {\r\n                AddNewItemsToDb(Categories, EditingGame.CategoryIds, database.Categories);\r\n            }\r\n\r\n            if (UseTagChanges)\r\n            {\r\n                AddNewItemsToDb(Tags, EditingGame.TagIds, database.Tags);\r\n            }\r\n\r\n            if (UseFeatureChanges)\r\n            {\r\n                AddNewItemsToDb(Features, EditingGame.FeatureIds, database.Features);\r\n            }\r\n\r\n            if (UsePlatformChanges)\r\n            {\r\n                AddNewItemsToDb(Platforms, EditingGame.PlatformIds, database.Platforms);\r\n            }\r\n\r\n            if (UseSeriesChanges)\r\n            {\r\n                AddNewItemsToDb(Series, EditingGame.SeriesIds, database.Series);\r\n            }\r\n\r\n            if (UseAgeRatingChanges)\r\n            {\r\n                AddNewItemsToDb(AgeRatings, EditingGame.AgeRatingIds, database.AgeRatings);\r\n            }\r\n\r\n            if (UseRegionChanges)\r\n            {\r\n                AddNewItemsToDb(Regions, EditingGame.RegionIds, database.Regions);\r\n            }\r\n\r\n            if (UseSourceChanges)\r\n            {\r\n                AddNewItemToDb(Sources, EditingGame.SourceId, database.Sources);\r\n            }\r\n\r\n            if (UseCompletionStatusChanges)\r\n            {\r\n                AddNewItemToDb(CompletionStatuses, EditingGame.CompletionStatusId, database.CompletionStatuses);\r\n            }\r\n\r\n            var changeDate = DateTime.Now;\r\n            var gamesToUpdate = IsMultiGameEdit ? Games : new List<Game> { Game };\r\n            var sortableNameConverter = appSettings.GameSortingNameAutofill\r\n                ? new SortableNameConverter(appSettings.GameSortingNameRemovedArticles, IsMultiGameEdit)\r\n                : null;\r\n            \r\n            database.Games.BeginBufferUpdate();\r\n            foreach (var game in gamesToUpdate)\r\n            {\r\n                if (UseNameChanges)\r\n                {\r\n                    game.Name = EditingGame.Name;\r\n                }\r\n\r\n                if (UseSortingNameChanges)\r\n                {\r\n                    game.SortingName = EditingGame.SortingName;\r\n                }\r\n\r\n                if (UseReleaseDateChanges)\r\n                {\r\n                    game.ReleaseDate = EditingGame.ReleaseDate;\r\n                }\r\n\r\n                if (UseGenresChanges)\r\n                {\r\n                    game.GenreIds = consolidateIds(Genres, game.GenreIds);\r\n                }\r\n\r\n                if (UseDeveloperChanges)\r\n                {\r\n                    game.DeveloperIds = consolidateIds(Developers, game.DeveloperIds);\r\n                }\r\n\r\n                if (UsePublisherChanges)\r\n                {\r\n                    game.PublisherIds = consolidateIds(Publishers, game.PublisherIds);\r\n                }\r\n\r\n                if (UseCategoryChanges)\r\n                {\r\n                    game.CategoryIds = consolidateIds(Categories, game.CategoryIds);\r\n                }\r\n\r\n                if (UseTagChanges)\r\n                {\r\n                    game.TagIds = consolidateIds(Tags, game.TagIds);\r\n                }\r\n\r\n                if (UseFeatureChanges)\r\n                {\r\n                    game.FeatureIds = consolidateIds(Features, game.FeatureIds);\r\n                }\r\n\r\n                if (UseDescriptionChanges)\r\n                {\r\n                    game.Description = EditingGame.Description;\r\n                }\r\n\r\n                if (UseNotesChanges)\r\n                {\r\n                    game.Notes = EditingGame.Notes;\r\n                }\r\n\r\n                if (UseManualChanges)\r\n                {\r\n                    game.Manual = EditingGame.Manual;\r\n                }\r\n\r\n                if (UseInstallDirChanges)\r\n                {\r\n                    game.InstallDirectory = EditingGame.InstallDirectory;\r\n                }\r\n\r\n                if (UseInstallStateChanges)\r\n                {\r\n                    game.IsInstalled = EditingGame.IsInstalled;\r\n                }\r\n\r\n                if (UsePlatformChanges)\r\n                {\r\n                    game.PlatformIds = consolidateIds(Platforms, game.PlatformIds);\r\n                }\r\n\r\n                if (UseLastActivityChanges)\r\n                {\r\n                    game.LastActivity = EditingGame.LastActivity;\r\n                }\r\n\r\n                if (UsePlaytimeChanges)\r\n                {\r\n                    game.Playtime = EditingGame.Playtime;\r\n                }\r\n\r\n                if (UseAddedChanges)\r\n                {\r\n                    game.Added = EditingGame.Added;\r\n                }\r\n\r\n                if (UsePlayCountChanges)\r\n                {\r\n                    game.PlayCount = EditingGame.PlayCount;\r\n                }\r\n\r\n                if (UseInstallSizeChanges)\r\n                {\r\n                    if (game.InstallSize != EditingGame.InstallSize)\r\n                    {\r\n                        game.LastSizeScanDate = DateTime.Now;\r\n                    }\r\n\r\n                    game.InstallSize = EditingGame.InstallSize;\r\n                }\r\n\r\n                if (UseSeriesChanges)\r\n                {\r\n                    game.SeriesIds = consolidateIds(Series, game.SeriesIds);\r\n                }\r\n\r\n                if (UseVersionChanges)\r\n                {\r\n                    game.Version = EditingGame.Version;\r\n                }\r\n\r\n                if (UseAgeRatingChanges)\r\n                {\r\n                    game.AgeRatingIds = consolidateIds(AgeRatings, game.AgeRatingIds);\r\n                }\r\n\r\n                if (UseRegionChanges)\r\n                {\r\n                    game.RegionIds = consolidateIds(Regions, game.RegionIds);\r\n                }\r\n\r\n                if (UseSourceChanges)\r\n                {\r\n                    game.SourceId = EditingGame.SourceId;\r\n                }\r\n\r\n                if (UseCompletionStatusChanges)\r\n                {\r\n                    game.CompletionStatusId = EditingGame.CompletionStatusId;\r\n                }\r\n\r\n                if (UseUserScoreChanges)\r\n                {\r\n                    game.UserScore = EditingGame.UserScore;\r\n                }\r\n\r\n                if (UseCriticScoreChanges)\r\n                {\r\n                    game.CriticScore = EditingGame.CriticScore;\r\n                }\r\n\r\n                if (UseCommunityScoreChanges)\r\n                {\r\n                    game.CommunityScore = EditingGame.CommunityScore;\r\n                }\r\n\r\n                if (UseFavoriteChanges)\r\n                {\r\n                    game.Favorite = EditingGame.Favorite;\r\n                }\r\n\r\n                if (UseHdrChanges)\r\n                {\r\n                    game.EnableSystemHdr = EditingGame.EnableSystemHdr;\r\n                }\r\n\r\n                if (UseHiddenChanges)\r\n                {\r\n                    game.Hidden = EditingGame.Hidden;\r\n                }\r\n\r\n                if (UsePreScriptChanges)\r\n                {\r\n                    game.PreScript = EditingGame.PreScript;\r\n                }\r\n\r\n                if (UsePostScriptChanges)\r\n                {\r\n                    game.PostScript = EditingGame.PostScript;\r\n                }\r\n\r\n                if (UsePreGlobalScriptChanges)\r\n                {\r\n                    game.UseGlobalPreScript = EditingGame.UseGlobalPreScript;\r\n                }\r\n\r\n                if (UsePostGlobalScriptChanges)\r\n                {\r\n                    game.UseGlobalPostScript = EditingGame.UseGlobalPostScript;\r\n                }\r\n\r\n                if (UseGameStartedScriptChanges)\r\n                {\r\n                    game.GameStartedScript = EditingGame.GameStartedScript;\r\n                }\r\n\r\n                if (UseGameStartedGlobalScriptChanges)\r\n                {\r\n                    game.UseGlobalGameStartedScript = EditingGame.UseGlobalGameStartedScript;\r\n                }\r\n\r\n                if (UseGameActionsChanges)\r\n                {\r\n                    // Get clone here, because original collection has some WPF bound collection view source that causes #2443\r\n                    // This happens even after unloading game edit view, which makes no sense.\r\n                    game.GameActions = EditingGame.GameActions?.GetClone();\r\n                }\r\n\r\n                if (UseLinksChanges)\r\n                {\r\n                    game.Links = EditingGame.Links?.GetClone();\r\n                }\r\n\r\n                if (UseRomsChanges)\r\n                {\r\n                    game.Roms = EditingGame.Roms?.GetClone();\r\n                }\r\n\r\n                if (UseIconChanges)\r\n                {\r\n                    if (EditingGame.Icon.IsNullOrEmpty())\r\n                    {\r\n                        game.Icon = null;\r\n                    }\r\n                    else if (File.Exists(EditingGame.Icon))\r\n                    {\r\n                        game.Icon = database.AddFile(EditingGame.Icon, game.Id, true, CancellationToken.None);\r\n                    }\r\n                }\r\n\r\n                if (UseImageChanges)\r\n                {\r\n                    if (EditingGame.CoverImage.IsNullOrEmpty())\r\n                    {\r\n                        game.CoverImage = null;\r\n                    }\r\n                    else if (File.Exists(EditingGame.CoverImage))\r\n                    {\r\n                        game.CoverImage = database.AddFile(EditingGame.CoverImage, game.Id, true, CancellationToken.None);\r\n                    }\r\n                }\r\n\r\n                if (UseBackgroundChanges)\r\n                {\r\n                    if (EditingGame.BackgroundImage.IsNullOrEmpty())\r\n                    {\r\n                        game.BackgroundImage = null;\r\n                    }\r\n                    else if (EditingGame.BackgroundImage.IsHttpUrl())\r\n                    {\r\n                        game.BackgroundImage = EditingGame.BackgroundImage;\r\n                    }\r\n                    else if (File.Exists(EditingGame.BackgroundImage))\r\n                    {\r\n                        game.BackgroundImage = database.AddFile(EditingGame.BackgroundImage, game.Id, true, CancellationToken.None);\r\n                    }\r\n                }\r\n\r\n                if (UseIncludeLibraryPluginAction)\r\n                {\r\n                    game.IncludeLibraryPluginAction = EditingGame.IncludeLibraryPluginAction;\r\n                }\r\n\r\n                if (UseOverrideInstallState)\r\n                {\r\n                    game.OverrideInstallState = EditingGame.OverrideInstallState;\r\n                }\r\n\r\n                if (appSettings.GameSortingNameAutofill && string.IsNullOrWhiteSpace(game.SortingName))\r\n                {\r\n                    var sortingName = sortableNameConverter.Convert(game.Name);\r\n                    if (sortingName != game.Name)\r\n                    {\r\n                        game.SortingName = sortingName;\r\n                    }\r\n                }\r\n\r\n                game.Modified = changeDate;\r\n                database.Games.Update(game);\r\n            }\r\n\r\n            database.Games.EndBufferUpdate();\r\n            ignoreClosingEvent = true;\r\n            CloseView(true, alreadyClosing);\r\n        }\r\n\r\n        internal void CleanupTempFiles()\r\n        {\r\n            try\r\n            {\r\n                if (!Directory.Exists(PlaynitePaths.TempPath))\r\n                {\r\n                    return;\r\n                }\r\n\r\n                foreach (var icon in Directory.GetFiles(PlaynitePaths.TempPath, tempEditingIconFileName + \".*\"))\r\n                {\r\n                    File.Delete(icon);\r\n                }\r\n\r\n                foreach (var icon in Directory.GetFiles(PlaynitePaths.TempPath, tempDownloadIconFileName + \".*\"))\r\n                {\r\n                    File.Delete(icon);\r\n                }\r\n\r\n                foreach (var cover in Directory.GetFiles(PlaynitePaths.TempPath, tempEditingCoverFileName + \".*\"))\r\n                {\r\n                    File.Delete(cover);\r\n                }\r\n\r\n                foreach (var cover in Directory.GetFiles(PlaynitePaths.TempPath, tempDownloadCoverFileName + \".*\"))\r\n                {\r\n                    File.Delete(cover);\r\n                }\r\n\r\n                foreach (var bk in Directory.GetFiles(PlaynitePaths.TempPath, tempEditingBackgroundFileName + \".*\"))\r\n                {\r\n                    File.Delete(bk);\r\n                }\r\n\r\n                foreach (var bk in Directory.GetFiles(PlaynitePaths.TempPath, tempDownloadBackgroundFileName + \".*\"))\r\n                {\r\n                    File.Delete(bk);\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to cleanup temporary files.\");\r\n            }\r\n        }\r\n\r\n        public string GetDroppedImage(DragEventArgs args, List<string> compatibleExtensions)\r\n        {\r\n            if (args.Data.GetDataPresent(DataFormats.FileDrop))\r\n            {\r\n                var files = (string[])args.Data.GetData(DataFormats.FileDrop);\r\n                if (files?.Length == 1)\r\n                {\r\n                    var path = files[0];\r\n                    var imageExtension = Path.GetExtension(path).ToLower();\r\n                    if (!compatibleExtensions.Contains(imageExtension))\r\n                    {\r\n                        dialogs.ShowErrorMessage(string.Format(\r\n                            resources.GetString(\"LOCIncompatibleDragAndDropExtensionError\"), imageExtension),\r\n                            resources.GetString(\"LOCIncompatibleDragAndDropExtensionErrorTitle\"));\r\n                    }\r\n                    else if (File.Exists(path))\r\n                    {\r\n                        return path;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public void DropIcon(DragEventArgs args)\r\n        {\r\n            var compatibleExtensions = new List<string> { \".bmp\", \".jpg\", \".jpeg\", \".png\", \".gif\", \".ico\", \".tga\", \".exe\", \".tif\", \".webp\", \".avif\" };\r\n            var path = ProcessMetadataFile(GetDroppedImage(args, compatibleExtensions), tempEditingIconFileName);\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                EditingGame.Icon = path;\r\n                CheckImagePerformanceRestrains(path, GameDatabase.MaximumRecommendedIconSize);\r\n            }\r\n        }\r\n\r\n        public void SelectIcon()\r\n        {\r\n            var path = ProcessMetadataFile(dialogs.SelectIconFile(), tempEditingIconFileName);\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                EditingGame.Icon = path;\r\n                CheckImagePerformanceRestrains(path, GameDatabase.MaximumRecommendedIconSize);\r\n            }\r\n        }\r\n\r\n        public void SelectCover()\r\n        {\r\n            var path = ProcessMetadataFile(dialogs.SelectImagefile(), tempEditingCoverFileName);\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                EditingGame.CoverImage = path;\r\n                CheckImagePerformanceRestrains(path, GameDatabase.MaximumRecommendedCoverSize);\r\n            }\r\n        }\r\n\r\n        public void DropCover(DragEventArgs args)\r\n        {\r\n            var compatibleExtensions = new List<string> { \".bmp\", \".jpg\", \".jpeg\", \".png\", \".gif\", \".tga\", \".tif\", \".webp\", \".avif\" };\r\n            var path = ProcessMetadataFile(GetDroppedImage(args, compatibleExtensions), tempEditingCoverFileName);\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                EditingGame.CoverImage = path;\r\n                CheckImagePerformanceRestrains(path, GameDatabase.MaximumRecommendedCoverSize);\r\n            }\r\n        }\r\n\r\n        public void SelectBackground()\r\n        {\r\n            var path = ProcessMetadataFile(dialogs.SelectImagefile(), tempEditingBackgroundFileName);\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                EditingGame.BackgroundImage = path;\r\n                CheckImagePerformanceRestrains(path, GameDatabase.MaximumRecommendedBackgroundSize);\r\n            }\r\n        }\r\n\r\n        public void DropBackground(DragEventArgs args)\r\n        {\r\n            var compatibleExtensions = new List<string> { \".bmp\", \".jpg\", \".jpeg\", \".png\", \".gif\", \".tga\", \".tif\", \".webp\", \".avif\" };\r\n            var path = ProcessMetadataFile(GetDroppedImage(args, compatibleExtensions), tempEditingBackgroundFileName);\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                EditingGame.BackgroundImage = path;\r\n                CheckImagePerformanceRestrains(path, GameDatabase.MaximumRecommendedBackgroundSize);\r\n            }\r\n        }\r\n\r\n        public void SetBackgroundUrl()\r\n        {\r\n            var image = SelectUrlImage(tempEditingBackgroundFileName);\r\n            if (!image.IsNullOrEmpty())\r\n            {\r\n                EditingGame.BackgroundImage = image;\r\n            }\r\n        }\r\n\r\n        public void SetIconUrl()\r\n        {\r\n            var image = SelectUrlImage(tempEditingIconFileName);\r\n            if (!image.IsNullOrEmpty())\r\n            {\r\n                EditingGame.Icon = image;\r\n            }\r\n        }\r\n\r\n        public void SetCoverUrl()\r\n        {\r\n            var image = SelectUrlImage(tempEditingCoverFileName);\r\n            if (!image.IsNullOrEmpty())\r\n            {\r\n                EditingGame.CoverImage = image;\r\n            }\r\n        }\r\n\r\n        public string SelectUrlImage(string tempFileName)\r\n        {\r\n            var url = dialogs.SelectString(\r\n                resources.GetString(\"LOCURLInputInfo\"),\r\n                resources.GetString(\"LOCURLInputInfoTitile\"),\r\n                string.Empty);\r\n            if (url.Result && !url.SelectedString.IsNullOrEmpty())\r\n            {\r\n                try\r\n                {\r\n                    return ProcessMetadataFile(url.SelectedString, tempFileName);\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to download image from url {url.SelectedString}\");\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public void AddAction()\r\n        {\r\n            if (EditingGame.GameActions == null)\r\n            {\r\n                EditingGame.GameActions = new ObservableCollection<GameAction>();\r\n                EditingGame.GameActions.CollectionChanged += OtherActions_CollectionChanged;\r\n            }\r\n\r\n            var newAction = new GameAction()\r\n            {\r\n                Name = \"New Action\",\r\n                IsPlayAction = true\r\n            };\r\n\r\n            newAction.PropertyChanged += GameAction_PropertyChanged;\r\n            EditingGame.GameActions.Add(newAction);\r\n        }\r\n\r\n        public void RemoveAction(GameAction action)\r\n        {\r\n            action.PropertyChanged -= GameAction_PropertyChanged;\r\n            EditingGame.GameActions.Remove(action);\r\n        }\r\n\r\n        public void MoveActionUp(GameAction action)\r\n        {\r\n            var index = EditingGame.GameActions.IndexOf(action);\r\n            if (index != 0)\r\n            {\r\n                EditingGame.GameActions.Move(index, index - 1);\r\n            }\r\n        }\r\n\r\n        public void MoveActionDown(GameAction action)\r\n        {\r\n            var index = EditingGame.GameActions.IndexOf(action);\r\n            if (index != EditingGame.GameActions.Count - 1)\r\n            {\r\n                EditingGame.GameActions.Move(index, index + 1);\r\n            }\r\n        }\r\n\r\n        private void Link_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            UseLinksChanges = true;\r\n        }\r\n\r\n        private void Links_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)\r\n        {\r\n            UseLinksChanges = true;\r\n        }\r\n\r\n        public void AddLink()\r\n        {\r\n            if (EditingGame.Links == null)\r\n            {\r\n                EditingGame.Links = new ObservableCollection<Link>();\r\n                EditingGame.Links.CollectionChanged += Links_CollectionChanged;\r\n            }\r\n\r\n            var newLink = new Link(\"NewLink\", \"NewUrl\");\r\n            newLink.PropertyChanged += Link_PropertyChanged;\r\n            EditingGame.Links.Add(newLink);\r\n        }\r\n\r\n        public void RemoveLink(Link link)\r\n        {\r\n            if (link != null)\r\n            {\r\n                link.PropertyChanged -= Link_PropertyChanged;\r\n            }\r\n\r\n            EditingGame.Links.Remove(link);\r\n        }\r\n\r\n        public void MoveLinkUp(Link link)\r\n        {\r\n            var index = EditingGame.Links.IndexOf(link);\r\n            if (index != 0)\r\n            {\r\n                EditingGame.Links.Move(index, index - 1);\r\n            }\r\n        }\r\n\r\n        public void MoveLinkDown(Link link)\r\n        {\r\n            var index = EditingGame.Links.IndexOf(link);\r\n            if (index != EditingGame.Links.Count - 1)\r\n            {\r\n                EditingGame.Links.Move(index, index + 1);\r\n            }\r\n        }\r\n\r\n        private void Rom_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            UseRomsChanges = true;\r\n        }\r\n\r\n        private void Roms_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)\r\n        {\r\n            UseRomsChanges = true;\r\n        }\r\n\r\n        public void AddRom()\r\n        {\r\n            if (EditingGame.Roms == null)\r\n            {\r\n                EditingGame.Roms = new ObservableCollection<GameRom>();\r\n                EditingGame.Roms.CollectionChanged += Roms_CollectionChanged;\r\n            }\r\n\r\n            var newRom = new GameRom(\"NewRom\", \"NewPath\");\r\n            newRom.PropertyChanged += Rom_PropertyChanged;\r\n            EditingGame.Roms.Add(newRom);\r\n        }\r\n\r\n        public void RemoveRom(GameRom rom)\r\n        {\r\n            rom.PropertyChanged -= Rom_PropertyChanged;\r\n            EditingGame.Roms.Remove(rom);\r\n        }\r\n\r\n        public void MoveRomUp(GameRom rom)\r\n        {\r\n            var index = EditingGame.Roms.IndexOf(rom);\r\n            if (index != 0)\r\n            {\r\n                EditingGame.Roms.Move(index, index - 1);\r\n            }\r\n        }\r\n\r\n        public void MoveRomDown(GameRom rom)\r\n        {\r\n            var index = EditingGame.Roms.IndexOf(rom);\r\n            if (index != EditingGame.Roms.Count - 1)\r\n            {\r\n                EditingGame.Roms.Move(index, index + 1);\r\n            }\r\n        }\r\n\r\n        public void SelectInstallDir()\r\n        {\r\n            var path = dialogs.SelectFolder();\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                EditingGame.InstallDirectory = path;\r\n            }\r\n        }\r\n\r\n        public string SelectGameImage()\r\n        {\r\n            var path = dialogs.SelectFile(\"*.*|*.*\");\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                return path;\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public void RemoveIcon()\r\n        {\r\n            EditingGame.Icon = null;\r\n        }\r\n\r\n        public void RemoveImage()\r\n        {\r\n            EditingGame.CoverImage = null;\r\n        }\r\n\r\n        public void RemoveBackground()\r\n        {\r\n            EditingGame.BackgroundImage = null;\r\n        }\r\n\r\n        public void OpenMetadataFolder()\r\n        {\r\n            if (appSettings.DirectoryOpenCommand.IsNullOrWhiteSpace())\r\n            {\r\n                Process.Start(database.GetFileStoragePath(EditingGame.Id));\r\n            }\r\n            else\r\n            {\r\n                try\r\n                {\r\n                    ProcessStarter.ShellExecute(appSettings.DirectoryOpenCommand.Replace(\"{Dir}\", database.GetFileStoragePath(EditingGame.Id)));\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, \"Failed to open directory using custom command.\");\r\n                    Process.Start(database.GetFileStoragePath(EditingGame.Id));\r\n                }\r\n            }\r\n        }\r\n\r\n        public void AddNewItemsToDb<TItem>(SelectableDbItemList sourceList, List<Guid> itemsToAdd, IItemCollection<TItem> targetCollection) where TItem : DatabaseObject\r\n        {\r\n            if (itemsToAdd?.Any() != true)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var addedItems = sourceList.Where(a => itemsToAdd.Contains(a.Item.Id) == true && targetCollection[a.Item.Id] == null).ToList();\r\n            if (addedItems.Any())\r\n            {\r\n                targetCollection.Add(addedItems.Select(a => (TItem)a.Item));\r\n            }\r\n        }\r\n\r\n        public void AddNewItemToDb<TItem>(ObservableCollection<TItem> sourceList, Guid itemToAdd, IItemCollection<TItem> targetCollection) where TItem : DatabaseObject\r\n        {\r\n            if (itemToAdd == Guid.Empty || itemToAdd == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var addedItem = sourceList.FirstOrDefault(a => a.Id == itemToAdd && targetCollection[a.Id] == null);\r\n            if (addedItem != null)\r\n            {\r\n                targetCollection.Add(addedItem);\r\n            }\r\n        }\r\n\r\n        public TItem CreateNewItem<TItem>(string itemName = null) where TItem : DatabaseObject\r\n        {\r\n            if (itemName.IsNullOrEmpty())\r\n            {\r\n                var res = dialogs.SelectString(\r\n                    resources.GetString(\"LOCEnterName\"),\r\n                    resources.GetString(\"LOCAddNewItem\"),\r\n                    \"\");\r\n                if (res.Result)\r\n                {\r\n                    return typeof(TItem).CrateInstance<TItem>(res.SelectedString);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return typeof(TItem).CrateInstance<TItem>(itemName);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public TItem CreateNewItemInCollection<TItem>(ObservableCollection<TItem> collection, string itemName = null) where TItem : DatabaseObject\r\n        {\r\n            var newItem = CreateNewItem<TItem>(itemName);\r\n            if (newItem == null)\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                var existing = collection.FirstOrDefault(a => a.Name?.Equals(newItem.Name, StringComparison.InvariantCultureIgnoreCase) == true);\r\n                if (existing != null)\r\n                {\r\n                    return existing;\r\n                }\r\n                else\r\n                {\r\n                    collection.Add(newItem);\r\n                    return newItem;\r\n                }\r\n            }\r\n        }\r\n\r\n        public TItem CreateNewItemInCollection<TItem>(\r\n            SelectableDbItemList collection,\r\n            string itemName = null,\r\n            Func<SelectableItem<DatabaseObject>, string, bool> existingComparer = null) where TItem : DatabaseObject\r\n        {\r\n            var newItem = CreateNewItem<TItem>(itemName);\r\n            if (newItem == null)\r\n            {\r\n                return null;\r\n            }\r\n            else\r\n            {\r\n                SelectableItem<DatabaseObject> existing = null;\r\n                if (existingComparer != null)\r\n                {\r\n                    existing = collection.FirstOrDefault(a => existingComparer(a, newItem.Name));\r\n                }\r\n                else\r\n                {\r\n                    existing = collection.FirstOrDefault(a => a.Item.Name?.Equals(newItem.Name, StringComparison.InvariantCultureIgnoreCase) == true);\r\n                }\r\n\r\n                if (existing != null)\r\n                {\r\n                    existing.Selected = true;\r\n                    return (TItem)existing.Item;\r\n                }\r\n                else\r\n                {\r\n                    collection.Add(newItem, true);\r\n                    return newItem;\r\n                }\r\n            }\r\n        }\r\n\r\n        public Platform AddNewPlatform(string item = null)\r\n        {\r\n            return CreateNewItemInCollection<Platform>(Platforms, item, LooseDbNameComparer);\r\n        }\r\n\r\n        public void AddNewPlatforms(List<string> items)\r\n        {\r\n            var added = new List<Platform>();\r\n            items?.ForEach(a => added.Add(AddNewPlatform(a)));\r\n            if (added.Any())\r\n            {\r\n                Platforms.SetSelection(added.Select(a => a.Id).ToList());\r\n            }\r\n        }\r\n\r\n        public Series AddNewSeries(string item = null)\r\n        {\r\n            return CreateNewItemInCollection<Series>(Series, item, LooseDbNameComparer);\r\n        }\r\n\r\n        public void AddNewSeries(List<string> items)\r\n        {\r\n            var added = new List<Series>();\r\n            items?.ForEach(a => added.Add(AddNewSeries(a)));\r\n            if (added.Any())\r\n            {\r\n                Series.SetSelection(added.Select(a => a.Id).ToList());\r\n            }\r\n        }\r\n\r\n        public AgeRating AddNewAgeRating(string item = null)\r\n        {\r\n            return CreateNewItemInCollection<AgeRating>(AgeRatings, item, LooseDbNameComparer);\r\n        }\r\n\r\n        public void AddNewAgeRatings(List<string> items)\r\n        {\r\n            var added = new List<AgeRating>();\r\n            items?.ForEach(a => added.Add(AddNewAgeRating(a)));\r\n            if (added.Any())\r\n            {\r\n                AgeRatings.SetSelection(added.Select(a => a.Id).ToList());\r\n            }\r\n        }\r\n\r\n        public Region AddNewRegion(string item = null)\r\n        {\r\n            return CreateNewItemInCollection<Region>(Regions, item, LooseDbNameComparer);\r\n        }\r\n\r\n        public void AddNewRegions(List<string> items)\r\n        {\r\n            var added = new List<Region>();\r\n            items?.ForEach(a => added.Add(AddNewRegion(a)));\r\n            if (added.Any())\r\n            {\r\n                Regions.SetSelection(added.Select(a => a.Id).ToList());\r\n            }\r\n        }\r\n\r\n        public void AddNewSource(string source = null)\r\n        {\r\n            EditingGame.SourceId = CreateNewItemInCollection(Sources, source)?.Id ?? EditingGame.SourceId;\r\n        }\r\n\r\n        public void AddNewCategory()\r\n        {\r\n            CreateNewItemInCollection<Category>(Categories);\r\n        }\r\n\r\n        public Company AddNewPublisher(string publisher = null)\r\n        {\r\n            var newItem = CreateNewItemInCollection<Company>(Publishers, publisher);\r\n            if (newItem != null)\r\n            {\r\n                if (!Developers.Any(a => LooseDbNameComparer(a, newItem.Name) == true))\r\n                {\r\n                    Developers.Add(newItem);\r\n                }\r\n            }\r\n\r\n            return newItem;\r\n        }\r\n\r\n        public void AddNewPublishers(List<string> publishers)\r\n        {\r\n            var added = new List<Company>();\r\n            publishers?.ForEach(a => added.Add(AddNewPublisher(a)));\r\n            if (added.Any())\r\n            {\r\n                Publishers.SetSelection(added.Select(a => a.Id).ToList());\r\n            }\r\n        }\r\n\r\n        public Company AddNewDeveloper(string developer = null)\r\n        {\r\n            var newItem = CreateNewItemInCollection<Company>(Developers, developer);\r\n            if (newItem != null)\r\n            {\r\n                if (!Publishers.Any(a => LooseDbNameComparer(a, newItem.Name) == true))\r\n                {\r\n                    Publishers.Add(newItem);\r\n                }\r\n            }\r\n\r\n            return newItem;\r\n        }\r\n\r\n        public void AddNewDevelopers(List<string> developers)\r\n        {\r\n            var added = new List<Company>();\r\n            developers?.ForEach(a => added.Add(AddNewDeveloper(a)));\r\n            if (added.Any())\r\n            {\r\n                Developers.SetSelection(added.Select(a => a.Id).ToList());\r\n            }\r\n        }\r\n\r\n        public Genre AddNewGenre(string item = null)\r\n        {\r\n            return CreateNewItemInCollection<Genre>(Genres, item, LooseDbNameComparer);\r\n        }\r\n\r\n        public void AddNewGenres(List<string> items)\r\n        {\r\n            var added = new List<Genre>();\r\n            items?.ForEach(a => added.Add(AddNewGenre(a)));\r\n            if (added.Any())\r\n            {\r\n                Genres.SetSelection(added.Select(a => a.Id).ToList());\r\n            }\r\n        }\r\n\r\n        public Tag AddNewTag(string tag = null)\r\n        {\r\n            return CreateNewItemInCollection<Tag>(Tags, tag, LooseDbNameComparer);\r\n        }\r\n\r\n        public void AddNewTags(List<string> tags)\r\n        {\r\n            var added = new List<Tag>();\r\n            tags?.ForEach(a => added.Add(AddNewTag(a)));\r\n            if (added.Any())\r\n            {\r\n                Tags.SetSelection(added.Select(a => a.Id).ToList());\r\n            }\r\n        }\r\n\r\n        public GameFeature AddNewFeature(string feature = null)\r\n        {\r\n            return CreateNewItemInCollection<GameFeature>(Features, feature, LooseDbNameComparer);\r\n        }\r\n\r\n        public void AddNewCompletionStatus(string status = null)\r\n        {\r\n            EditingGame.CompletionStatusId = CreateNewItemInCollection(CompletionStatuses, status)?.Id ?? EditingGame.CompletionStatusId;\r\n        }\r\n\r\n        public void AddNewFeatures(List<string> features)\r\n        {\r\n            var added = new List<GameFeature>();\r\n            features?.ForEach(a => added.Add(AddNewFeature(a)));\r\n            if (added.Any())\r\n            {\r\n                Features.SetSelection(added.Select(a => a.Id).ToList());\r\n            }\r\n        }\r\n\r\n        private bool LooseDbNameComparer(SelectableItem<DatabaseObject> existingItem, string newName)\r\n        {\r\n            return GameFieldComparer.StringEquals(\r\n                existingItem.Item.Name ?? string.Empty,\r\n                newName ?? string.Empty);\r\n        }\r\n\r\n        private Tuple<string, ImageProperties> GetImageProperties(string image)\r\n        {\r\n            try\r\n            {\r\n                var imagePath = ImageSourceManager.GetImagePath(image);\r\n                if (!imagePath.IsNullOrEmpty())\r\n                {\r\n                    var props = Images.GetImageProperties(imagePath);\r\n                    return new Tuple<string, ImageProperties>($\"{props?.Width}x{props.Height}px\", props);\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to get metadata from image  {image}\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        private void CheckImagePerformanceRestrains(string imagePath, double maxMegapixels)\r\n        {\r\n            if (!appSettings.ShowImagePerformanceWarning)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (imagePath != null)\r\n            {\r\n                var imageProps = Images.GetImageProperties(imagePath);\r\n                if (imageProps != null && Sizes.GetMegapixelsFromRes(imageProps) > maxMegapixels)\r\n                {\r\n                    var okResponse = new MessageBoxOption(\"LOCOKLabel\", true, true);\r\n                    var dontShowResponse = new MessageBoxOption(\"LOCDontShowAgainTitle\");\r\n                    var ask = new MessageBoxWindow();\r\n                    var result = ask.ShowCustom(\r\n                        window.Window,\r\n                        string.Format(resources.GetString(\"LOCGameImageSizeWarning\"),\r\n                        GameDatabase.MaximumRecommendedIconSize,\r\n                        GameDatabase.MaximumRecommendedCoverSize,\r\n                        GameDatabase.MaximumRecommendedBackgroundSize),\r\n                        resources.GetString(\"LOCPerformanceWarningTitle\"),\r\n                        MessageBoxImage.Warning,\r\n                        new List<MessageBoxOption> { okResponse, dontShowResponse });\r\n                    if (result == dontShowResponse)\r\n                    {\r\n                        appSettings.ShowImagePerformanceWarning = false;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public void TestScript(string script)\r\n        {\r\n            try\r\n            {\r\n                var expandedScript = EditingGame.ExpandVariables(script);\r\n                var startingArgs = new SDK.Events.OnGameStartingEventArgs\r\n                {\r\n                    Game = EditingGame,\r\n                    SelectedRomFile = EditingGame.Roms?.FirstOrDefault()?.Path,\r\n                    SourceAction = EditingGame.GameActions?.FirstOrDefault()\r\n                };\r\n\r\n                using (var runtime = new PowerShellRuntime($\"test script runtime\"))\r\n                {\r\n                    PlayniteApplication.Current.GamesEditor.ExecuteScriptAction(runtime, expandedScript, EditingGame, true, false, GameScriptType.None,\r\n                        new Dictionary<string, object>\r\n                        {\r\n                            {  \"StartingArgs\", startingArgs },\r\n                            {  \"SourceAction\", startingArgs.SourceAction },\r\n                            {  \"SelectedRomFile\", startingArgs.SelectedRomFile }\r\n                        });\r\n                }\r\n            }\r\n            catch (Exception exc)\r\n            {\r\n                var message = exc.Message;\r\n                if (exc is ScriptRuntimeException err)\r\n                {\r\n                    message = err.Message + \"\\n\\n\" + err.ScriptStackTrace;\r\n                }\r\n\r\n                Dialogs.ShowMessage(\r\n                    message,\r\n                    resources.GetString(\"LOCScriptError\"),\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n            }\r\n        }\r\n\r\n        public void CalculateInstallSizeWithDialog()\r\n        {\r\n            PlayniteApplication.Current.GamesEditor.UpdateGameSizeWithDialog(EditingGame, false, false);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/GameEditViewModelCommands.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public partial class GameEditViewModel\r\n    {\r\n        public RelayCommand<object> AddPlatformCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewPlatform();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddSeriesCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewSeries();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddAgeRatingCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewAgeRating();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddRegionCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewRegion();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddSourceCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewSource();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddCategoryCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewCategory();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddPublisherCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewPublisher();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddDeveloperCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewDeveloper();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddGenreCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewGenre();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddTagCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewTag();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddFeatureCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewFeature();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddCompletionStatusCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddNewCompletionStatus();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog(false);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CancelDialog();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<CancelEventArgs> WindowClosingCommand\r\n        {\r\n            get => new RelayCommand<CancelEventArgs>((a) =>\r\n            {\r\n                WindowClosing(a);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SelectIconCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectIcon();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<DragEventArgs> DropIconCommand\r\n        {\r\n            get => new RelayCommand<DragEventArgs>((args) =>\r\n            {\r\n                DropIcon(args);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<DragEventArgs> DropCoverCommand\r\n        {\r\n            get => new RelayCommand<DragEventArgs>((args) =>\r\n            {\r\n                DropCover(args);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SelectCoverCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectCover();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<DragEventArgs> DropBackgroundCommand\r\n        {\r\n            get => new RelayCommand<DragEventArgs>((args) =>\r\n            {\r\n                DropBackground(args);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SelectBackgroundCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectBackground();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SetBackgroundUrlCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SetBackgroundUrl();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SetIconUrlCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SetIconUrl();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SetCoverUrlCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SetCoverUrl();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddLinkCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddLink();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<Link> RemoveLinkCommand\r\n        {\r\n            get => new RelayCommand<Link>((link) =>\r\n            {\r\n                RemoveLink(link);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<Link> MoveUpLinkCommand\r\n        {\r\n            get => new RelayCommand<Link>((link) =>\r\n            {\r\n                MoveLinkUp(link);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<Link> MoveDownLinkCommand\r\n        {\r\n            get => new RelayCommand<Link>((link) =>\r\n            {\r\n                MoveLinkDown(link);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddRomCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddRom();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<GameRom> RemoveRomCommand\r\n        {\r\n            get => new RelayCommand<GameRom>((rom) =>\r\n            {\r\n                RemoveRom(rom);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<GameRom> MoveUpRomCommand\r\n        {\r\n            get => new RelayCommand<GameRom>((rom) =>\r\n            {\r\n                MoveRomUp(rom);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<GameRom> MoveDownRomCommand\r\n        {\r\n            get => new RelayCommand<GameRom>((rom) =>\r\n            {\r\n                MoveRomDown(rom);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SelectInstallDirCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectInstallDir();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SelectGameImageCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectGameImage();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddActionCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddAction();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<GameAction> MoveUpActionCommand\r\n        {\r\n            get => new RelayCommand<GameAction>((action) =>\r\n            {\r\n                MoveActionUp(action);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<GameAction> MoveDownActionCommand\r\n        {\r\n            get => new RelayCommand<GameAction>((action) =>\r\n            {\r\n                MoveActionDown(action);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<GameAction> DeleteActionCommand\r\n        {\r\n            get => new RelayCommand<GameAction>((action) =>\r\n            {\r\n                RemoveAction(action);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> RemoveIconCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveIcon();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> RemoveImageCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveImage();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> RemoveBackgroundCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                RemoveBackground();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> OpenMetadataFolderCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                OpenMetadataFolder();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SelectGoogleIconCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectGoogleIcon();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SelectGoogleCoverCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectGoogleCover();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SelectGoogleBackgroundCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectGoogleBackground();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<string> TestScriptCommand\r\n        {\r\n            get => new RelayCommand<string>((a) =>\r\n            {\r\n                TestScript(a);\r\n            }, (a) => !a.IsNullOrEmpty());\r\n        }\r\n\r\n        public RelayCommand CalculateInstallSizeWithDialogCommand\r\n        {\r\n            get => new RelayCommand(() =>\r\n            {\r\n                CalculateInstallSizeWithDialog();\r\n            });\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/GameEditViewModelFieldChecks.cs",
    "content": "﻿using Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public partial class GameEditViewModel\r\n    {\r\n        private bool useNameChanges;\r\n        public bool UseNameChanges\r\n        {\r\n            get\r\n            {\r\n                return useNameChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useNameChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useSortingNameChanges;\r\n        public bool UseSortingNameChanges\r\n        {\r\n            get\r\n            {\r\n                return useSortingNameChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useSortingNameChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool usePlatformChanges;\r\n        public bool UsePlatformChanges\r\n        {\r\n            get\r\n            {\r\n                return usePlatformChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                usePlatformChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useGenresChanges;\r\n        public bool UseGenresChanges\r\n        {\r\n            get\r\n            {\r\n                return useGenresChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useGenresChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useReleaseDateChanges;\r\n        public bool UseReleaseDateChanges\r\n        {\r\n            get\r\n            {\r\n                return useReleaseDateChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useReleaseDateChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useDeveloperChanges;\r\n        public bool UseDeveloperChanges\r\n        {\r\n            get\r\n            {\r\n                return useDeveloperChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useDeveloperChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool usePublisherChanges;\r\n        public bool UsePublisherChanges\r\n        {\r\n            get\r\n            {\r\n                return usePublisherChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                usePublisherChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useCategoryChanges;\r\n        public bool UseCategoryChanges\r\n        {\r\n            get\r\n            {\r\n                return useCategoryChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useCategoryChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useTagChanges;\r\n        public bool UseTagChanges\r\n        {\r\n            get\r\n            {\r\n                return useTagChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useTagChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useFeatureChanges;\r\n        public bool UseFeatureChanges\r\n        {\r\n            get\r\n            {\r\n                return useFeatureChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useFeatureChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useDescriptionChanges;\r\n        public bool UseDescriptionChanges\r\n        {\r\n            get\r\n            {\r\n                return useDescriptionChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useDescriptionChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useIconChanges;\r\n        public bool UseIconChanges\r\n        {\r\n            get\r\n            {\r\n                return useIconChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useIconChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowMediaChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useImageChanges;\r\n        public bool UseImageChanges\r\n        {\r\n            get\r\n            {\r\n                return useImageChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useImageChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowMediaChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useBackgroundChanges;\r\n        public bool UseBackgroundChanges\r\n        {\r\n            get\r\n            {\r\n                return useBackgroundChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useBackgroundChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowMediaChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useInstallDirChanges;\r\n        public bool UseInstallDirChanges\r\n        {\r\n            get\r\n            {\r\n                return useInstallDirChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useInstallDirChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowInstallChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useInstallStateChanges;\r\n        public bool UseInstallStateChanges\r\n        {\r\n            get\r\n            {\r\n                return useInstallStateChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useInstallStateChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowInstallChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useLinksChanges;\r\n        public bool UseLinksChanges\r\n        {\r\n            get\r\n            {\r\n                return useLinksChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useLinksChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowLinksChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useRomsChanges;\r\n        public bool UseRomsChanges\r\n        {\r\n            get\r\n            {\r\n                return useRomsChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useRomsChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowInstallChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useLastActivityChanges;\r\n        public bool UseLastActivityChanges\r\n        {\r\n            get\r\n            {\r\n                return useLastActivityChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useLastActivityChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowAdvancedChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool usePlaytimeChanges;\r\n        public bool UsePlaytimeChanges\r\n        {\r\n            get\r\n            {\r\n                return usePlaytimeChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                usePlaytimeChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowAdvancedChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useAddedChanges;\r\n        public bool UseAddedChanges\r\n        {\r\n            get\r\n            {\r\n                return useAddedChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useAddedChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowAdvancedChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool usePlayCountChanges;\r\n        public bool UsePlayCountChanges\r\n        {\r\n            get\r\n            {\r\n                return usePlayCountChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                usePlayCountChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowAdvancedChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useInstallSizeChanges;\r\n        public bool UseInstallSizeChanges\r\n        {\r\n            get\r\n            {\r\n                return useInstallSizeChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useInstallSizeChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowInstallChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useSeriesChanges;\r\n        public bool UseSeriesChanges\r\n        {\r\n            get\r\n            {\r\n                return useSeriesChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useSeriesChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useVersionChanges;\r\n        public bool UseVersionChanges\r\n        {\r\n            get\r\n            {\r\n                return useVersionChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useVersionChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useAgeRatingChanges;\r\n        public bool UseAgeRatingChanges\r\n        {\r\n            get\r\n            {\r\n                return useAgeRatingChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useAgeRatingChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useRegionChanges;\r\n        public bool UseRegionChanges\r\n        {\r\n            get\r\n            {\r\n                return useRegionChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useRegionChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useSourceChanges;\r\n        public bool UseSourceChanges\r\n        {\r\n            get\r\n            {\r\n                return useSourceChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useSourceChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useCompletionStatusChanges;\r\n        public bool UseCompletionStatusChanges\r\n        {\r\n            get\r\n            {\r\n                return useCompletionStatusChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useCompletionStatusChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useUserScoreChanges;\r\n        public bool UseUserScoreChanges\r\n        {\r\n            get\r\n            {\r\n                return useUserScoreChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useUserScoreChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useCriticScoreChanges;\r\n        public bool UseCriticScoreChanges\r\n        {\r\n            get\r\n            {\r\n                return useCriticScoreChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useCriticScoreChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useCommunityScoreChanges;\r\n        public bool UseCommunityScoreChanges\r\n        {\r\n            get\r\n            {\r\n                return useCommunityScoreChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useCommunityScoreChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowGeneralChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useHdrChanges;\r\n        public bool UseHdrChanges\r\n        {\r\n            get\r\n            {\r\n                return useHdrChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useHdrChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowAdvancedChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useHiddenChanges;\r\n        public bool UseHiddenChanges\r\n        {\r\n            get\r\n            {\r\n                return useHiddenChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useHiddenChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowAdvancedChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useFavoriteChanges;\r\n        public bool UseFavoriteChanges\r\n        {\r\n            get\r\n            {\r\n                return useFavoriteChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useFavoriteChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowAdvancedChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool usePreScriptChanges;\r\n        public bool UsePreScriptChanges\r\n        {\r\n            get\r\n            {\r\n                return usePreScriptChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                usePreScriptChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowScriptsChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool usePostScriptChanges;\r\n        public bool UsePostScriptChanges\r\n        {\r\n            get\r\n            {\r\n                return usePostScriptChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                usePostScriptChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowScriptsChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useGameStartedScriptChanges;\r\n        public bool UseGameStartedScriptChanges\r\n        {\r\n            get\r\n            {\r\n                return useGameStartedScriptChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useGameStartedScriptChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowScriptsChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useGameStartedGlobalScriptChanges;\r\n        public bool UseGameStartedGlobalScriptChanges\r\n        {\r\n            get\r\n            {\r\n                return useGameStartedGlobalScriptChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useGameStartedGlobalScriptChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowScriptsChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool usePreGlobalScriptChanges;\r\n        public bool UsePreGlobalScriptChanges\r\n        {\r\n            get\r\n            {\r\n                return usePreGlobalScriptChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                usePreGlobalScriptChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowScriptsChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool usePostGlobalScriptChanges;\r\n        public bool UsePostGlobalScriptChanges\r\n        {\r\n            get\r\n            {\r\n                return usePostGlobalScriptChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                usePostGlobalScriptChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowScriptsChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useGameActionsChanges;\r\n        public bool UseGameActionsChanges\r\n        {\r\n            get\r\n            {\r\n                return useGameActionsChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useGameActionsChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowActionsChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useIncludeLibraryPluginAction;\r\n        public bool UseIncludeLibraryPluginAction\r\n        {\r\n            get\r\n            {\r\n                return useIncludeLibraryPluginAction;\r\n            }\r\n\r\n            set\r\n            {\r\n                useIncludeLibraryPluginAction = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowActionsChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useNotesChanges;\r\n        public bool UseNotesChanges\r\n        {\r\n            get\r\n            {\r\n                return useNotesChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useNotesChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowAdvancedChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useManualChanges;\r\n        public bool UseManualChanges\r\n        {\r\n            get\r\n            {\r\n                return useManualChanges;\r\n            }\r\n\r\n            set\r\n            {\r\n                useManualChanges = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowAdvancedChangeNotif));\r\n            }\r\n        }\r\n\r\n        private bool useOverrideInstallState;\r\n        public bool UseOverrideInstallState\r\n        {\r\n            get\r\n            {\r\n                return useOverrideInstallState;\r\n            }\r\n\r\n            set\r\n            {\r\n                useOverrideInstallState = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowInstallChangeNotif));\r\n            }\r\n        }\r\n\r\n        public bool ShowGeneralChangeNotif\r\n        {\r\n            get\r\n            {\r\n                return ShowCheckBoxes &&\r\n                    (UseNameChanges ||\r\n                    UseReleaseDateChanges ||\r\n                    UseCategoryChanges ||\r\n                    UseDescriptionChanges ||\r\n                    UseDeveloperChanges ||\r\n                    UseGenresChanges ||\r\n                    UsePlatformChanges ||\r\n                    UsePublisherChanges ||\r\n                    UseSortingNameChanges ||\r\n                    UseTagChanges ||\r\n                    UseFeatureChanges ||\r\n                    UseSeriesChanges ||\r\n                    UseVersionChanges ||\r\n                    UseAgeRatingChanges ||\r\n                    UseRegionChanges ||\r\n                    UseSourceChanges ||\r\n                    UseCompletionStatusChanges ||\r\n                    UseUserScoreChanges ||\r\n                    UseCriticScoreChanges ||\r\n                    UseCommunityScoreChanges);\r\n            }\r\n        }\r\n\r\n        public bool ShowMediaChangeNotif\r\n        {\r\n            get\r\n            {\r\n                return ShowCheckBoxes &&\r\n                    (UseImageChanges ||\r\n                    UseBackgroundChanges ||\r\n                    UseIconChanges);\r\n            }\r\n        }\r\n\r\n        public bool ShowAdvancedChangeNotif\r\n        {\r\n            get\r\n            {\r\n                return ShowCheckBoxes &&\r\n                    (UseHdrChanges ||\r\n                    UseHiddenChanges ||\r\n                    UseFavoriteChanges ||\r\n                    UseLastActivityChanges ||\r\n                    UsePlaytimeChanges ||\r\n                    UseAddedChanges ||\r\n                    UsePlayCountChanges ||\r\n                    UseNotesChanges ||\r\n                    UseManualChanges);\r\n            }\r\n        }\r\n\r\n        public bool ShowLinksChangeNotif\r\n        {\r\n            get\r\n            {\r\n                return ShowCheckBoxes && UseLinksChanges;\r\n            }\r\n        }\r\n\r\n        public bool ShowInstallChangeNotif\r\n        {\r\n            get\r\n            {\r\n                return ShowCheckBoxes &&\r\n                    (UseInstallDirChanges ||\r\n                    UseRomsChanges ||\r\n                    UseInstallStateChanges ||\r\n                    UseInstallSizeChanges ||\r\n                    UseOverrideInstallState);\r\n            }\r\n        }\r\n\r\n        public bool ShowScriptsChangeNotif\r\n        {\r\n            get\r\n            {\r\n                return ShowCheckBoxes &&\r\n                    (UsePreScriptChanges ||\r\n                    UsePostScriptChanges ||\r\n                    UsePreGlobalScriptChanges ||\r\n                    UsePostGlobalScriptChanges ||\r\n                    UseGameStartedGlobalScriptChanges ||\r\n                    UseGameStartedScriptChanges);\r\n            }\r\n        }\r\n\r\n        public bool ShowActionsChangeNotif\r\n        {\r\n            get\r\n            {\r\n                return ShowCheckBoxes &&\r\n                    (UseGameActionsChanges || UseIncludeLibraryPluginAction);\r\n            }\r\n        }\r\n\r\n        private void EditingGame_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            switch (e.PropertyName)\r\n            {\r\n                case nameof(Game.Name):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseNameChanges = Game.Name != EditingGame.Name;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseNameChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.SortingName):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseSortingNameChanges = Game.SortingName != EditingGame.SortingName;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseSortingNameChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.PlatformIds):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UsePlatformChanges = !Game.PlatformIds.IsListEqual(EditingGame.PlatformIds);\r\n                    }\r\n                    else\r\n                    {\r\n                        UsePlatformChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.CoverImage):\r\n                    OnPropertyChanged(nameof(CoverMetadata));\r\n                    OnPropertyChanged(nameof(IsCoverTooLage));\r\n                    OnPropertyChanged(nameof(CoverImageObject));\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseImageChanges = Game.CoverImage != EditingGame.CoverImage;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseImageChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.BackgroundImage):\r\n                    OnPropertyChanged(nameof(BackgroundMetadata));\r\n                    OnPropertyChanged(nameof(IsBackgroundTooLage));\r\n                    OnPropertyChanged(nameof(BackgroundImageObject));\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseBackgroundChanges = Game.BackgroundImage != EditingGame.BackgroundImage;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseBackgroundChanges = true;\r\n                    }\r\n\r\n                    OnPropertyChanged(nameof(ShowBackgroundUrl));\r\n                    break;\r\n                case nameof(Game.Icon):\r\n                    OnPropertyChanged(nameof(IconMetadata));\r\n                    OnPropertyChanged(nameof(IsIconTooLage));\r\n                    OnPropertyChanged(nameof(IconImageObject));\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseIconChanges = Game.Icon != EditingGame.Icon;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseIconChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.Links):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseLinksChanges = !Game.Links.IsEqualJson(EditingGame.Links);\r\n                    }\r\n                    else\r\n                    {\r\n                        UseLinksChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.Roms):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseRomsChanges = !Game.Roms.IsEqualJson(EditingGame.Roms);\r\n                    }\r\n                    else\r\n                    {\r\n                        UseRomsChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.InstallDirectory):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseInstallDirChanges = Game.InstallDirectory != EditingGame.InstallDirectory;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseInstallDirChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.IsInstalled):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseInstallStateChanges = Game.IsInstalled != EditingGame.IsInstalled;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseInstallStateChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.Description):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseDescriptionChanges = Game.Description != EditingGame.Description;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseDescriptionChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.Notes):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseNotesChanges = Game.Notes != EditingGame.Notes;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseNotesChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.Manual):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseManualChanges = Game.Manual != EditingGame.Manual;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseManualChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.CategoryIds):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseCategoryChanges = !Game.CategoryIds.IsListEqual(EditingGame.CategoryIds);\r\n                    }\r\n                    else\r\n                    {\r\n                        UseCategoryChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.TagIds):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseTagChanges = !Game.TagIds.IsListEqual(EditingGame.TagIds);\r\n                    }\r\n                    else\r\n                    {\r\n                        UseTagChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.FeatureIds):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseFeatureChanges = !Game.FeatureIds.IsListEqual(EditingGame.FeatureIds);\r\n                    }\r\n                    else\r\n                    {\r\n                        UseFeatureChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.GenreIds):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseGenresChanges = !Game.GenreIds.IsListEqual(EditingGame.GenreIds);\r\n                    }\r\n                    else\r\n                    {\r\n                        UseGenresChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.ReleaseDate):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseReleaseDateChanges = Game.ReleaseDate != EditingGame.ReleaseDate;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseReleaseDateChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.DeveloperIds):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseDeveloperChanges = !Game.DeveloperIds.IsListEqual(EditingGame.DeveloperIds);\r\n                    }\r\n                    else\r\n                    {\r\n                        UseDeveloperChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.PublisherIds):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UsePublisherChanges = !Game.PublisherIds.IsListEqual(EditingGame.PublisherIds);\r\n                    }\r\n                    else\r\n                    {\r\n                        UsePublisherChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.LastActivity):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseLastActivityChanges = Game.LastActivity != EditingGame.LastActivity;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseLastActivityChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.Playtime):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UsePlaytimeChanges = Game.Playtime != EditingGame.Playtime;\r\n                    }\r\n                    else\r\n                    {\r\n                        UsePlaytimeChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.Added):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseAddedChanges = Game.Added != EditingGame.Added;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseAddedChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.PlayCount):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UsePlayCountChanges = Game.PlayCount != EditingGame.PlayCount;\r\n                    }\r\n                    else\r\n                    {\r\n                        UsePlayCountChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.InstallSize):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseInstallSizeChanges = Game.InstallSize != EditingGame.InstallSize;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseInstallSizeChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.SeriesIds):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseSeriesChanges = !Game.SeriesIds.IsListEqual(EditingGame.SeriesIds);\r\n                    }\r\n                    else\r\n                    {\r\n                        UseSeriesChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.Version):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseVersionChanges = Game.Version != EditingGame.Version;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseVersionChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.AgeRatingIds):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseAgeRatingChanges = !Game.AgeRatingIds.IsListEqual(EditingGame.AgeRatingIds);\r\n                    }\r\n                    else\r\n                    {\r\n                        UseAgeRatingChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.RegionIds):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseRegionChanges = !Game.RegionIds.IsListEqual(EditingGame.RegionIds);\r\n                    }\r\n                    else\r\n                    {\r\n                        UseRegionChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.SourceId):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseSourceChanges = Game.SourceId != EditingGame.SourceId;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseSourceChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.CompletionStatusId):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseCompletionStatusChanges = Game.CompletionStatusId != EditingGame.CompletionStatusId;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseCompletionStatusChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.UserScore):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseUserScoreChanges = Game.UserScore != EditingGame.UserScore;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseUserScoreChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.CriticScore):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseCriticScoreChanges = Game.CriticScore != EditingGame.CriticScore;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseCriticScoreChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.CommunityScore):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseCommunityScoreChanges = Game.CommunityScore != EditingGame.CommunityScore;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseCommunityScoreChanges = true;\r\n                    }\r\n                    break; ;\r\n                case nameof(Game.Favorite):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseFavoriteChanges = Game.Favorite != EditingGame.Favorite;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseFavoriteChanges = true;\r\n                    }\r\n                    break; ;\r\n                case nameof(Game.Hidden):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseHiddenChanges = Game.Hidden != EditingGame.Hidden;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseHiddenChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.EnableSystemHdr):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseHdrChanges = Game.EnableSystemHdr != EditingGame.EnableSystemHdr;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseHdrChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.PreScript):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UsePreScriptChanges = !string.Equals(Game.PreScript, EditingGame.PreScript, StringComparison.Ordinal);\r\n                    }\r\n                    else\r\n                    {\r\n                        UsePreScriptChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.PostScript):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UsePostScriptChanges = !string.Equals(Game.PostScript, EditingGame.PostScript, StringComparison.Ordinal);\r\n                    }\r\n                    else\r\n                    {\r\n                        UsePostScriptChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.GameStartedScript):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseGameStartedScriptChanges = !string.Equals(Game.GameStartedScript, EditingGame.GameStartedScript, StringComparison.Ordinal);\r\n                    }\r\n                    else\r\n                    {\r\n                        UseGameStartedScriptChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.UseGlobalPostScript):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UsePostGlobalScriptChanges = Game.UseGlobalPostScript != EditingGame.UseGlobalPostScript;\r\n                    }\r\n                    else\r\n                    {\r\n                        UsePostGlobalScriptChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.UseGlobalPreScript):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UsePreGlobalScriptChanges = Game.UseGlobalPreScript != EditingGame.UseGlobalPreScript;\r\n                    }\r\n                    else\r\n                    {\r\n                        UsePreGlobalScriptChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.UseGlobalGameStartedScript):\r\n                    if (IsSingleGameEdit)\r\n                    {\r\n                        UseGameStartedGlobalScriptChanges = Game.UseGlobalGameStartedScript != EditingGame.UseGlobalGameStartedScript;\r\n                    }\r\n                    else\r\n                    {\r\n                        UseGameStartedGlobalScriptChanges = true;\r\n                    }\r\n                    break;\r\n                case nameof(Game.IncludeLibraryPluginAction):\r\n                    UseIncludeLibraryPluginAction = true;\r\n                    break;\r\n                case nameof(Game.GameActions):\r\n                    UseGameActionsChanges = true;\r\n                    break;\r\n                case nameof(Game.OverrideInstallState):\r\n                    UseOverrideInstallState = true;\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private void OtherActions_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)\r\n        {\r\n            UseGameActionsChanges = true;\r\n        }\r\n\r\n        private void GameAction_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            UseGameActionsChanges = true;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/GameEditViewModelMetadata.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Common.Web;\r\nusing Playnite.Database;\r\nusing Playnite.DesktopApp.Windows;\r\nusing Playnite.Emulators;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Net;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class ComparableMetadatGameData\r\n    {\r\n        public string Name { get; set; }\r\n        public List<Genre> Genres { get; set; }\r\n        public ReleaseDate? ReleaseDate { get; set; }\r\n        public List<Company> Developers { get; set; }\r\n        public List<Company> Publishers { get; set; }\r\n        public List<Tag> Tags { get; set; }\r\n        public List<GameFeature> Features { get; set; }\r\n        public string Description { get; set; }\r\n        public List<Link> Links { get; set; }\r\n        public int? CriticScore { get; set; }\r\n        public int? CommunityScore { get; set; }\r\n        public List<AgeRating> AgeRatings { get; set; }\r\n        public List<Series> Series { get; set; }\r\n        public List<Region> Regions { get; set; }\r\n        public List<Platform> Platforms { get; set; }\r\n        public MetadataFile Icon { get; set; }\r\n        public MetadataFile CoverImage { get; set; }\r\n        public MetadataFile BackgroundImage { get; set; }\r\n        public ulong? InstallSize { get; set; }\r\n    }\r\n\r\n    public partial class GameEditViewModel\r\n    {\r\n        private const string tempEditingIconFileName = \"temp_edit_preview_icon\";\r\n        private const string tempEditingCoverFileName = \"temp_edit_preview_cover\";\r\n        private const string tempEditingBackgroundFileName = \"temp_edit_preview_background\";\r\n\r\n        private const string tempDownloadIconFileName = \"temp_download_preview_icon\";\r\n        private const string tempDownloadCoverFileName = \"temp_download_preview_cover\";\r\n        private const string tempDownloadBackgroundFileName = \"temp_download_preview_background\";\r\n\r\n        private List<GameField> GetDisplayDiffFields(Game oldGame, ComparableMetadatGameData newGame)\r\n        {\r\n            var diffFields = new List<GameField>();\r\n            void checkListChanged<T>(SelectableDbItemList oldData, IEnumerable<T> newData, GameField field) where T : DatabaseObject\r\n            {\r\n                var oldFields = oldData.Where(a => a.Selected == true).Select(a => a.Item.Name).ToList();\r\n                var newFields = newData?.Select(a => a.Name).ToList() ?? new List<string>();\r\n                if (!oldFields.HasItems() && newFields.HasItems())\r\n                {\r\n                    return;\r\n                }\r\n\r\n                if (newFields.HasItems() && oldFields.HasItems() && !oldFields.IsListEqual(newFields, GameFieldComparer.Instance))\r\n                {\r\n                    diffFields.Add(field);\r\n                }\r\n            }\r\n\r\n            if (!newGame.Name.IsNullOrWhiteSpace())\r\n            {\r\n                if (!oldGame.Name.IsNullOrWhiteSpace() && !string.Equals(oldGame.Name, newGame.Name, StringComparison.InvariantCultureIgnoreCase))\r\n                {\r\n                    diffFields.Add(GameField.Name);\r\n                }\r\n            }\r\n\r\n            if (!newGame.Description.IsNullOrWhiteSpace())\r\n            {\r\n                if (!oldGame.Description.IsNullOrWhiteSpace() && !string.Equals(oldGame.Description, newGame.Description, StringComparison.InvariantCultureIgnoreCase))\r\n                {\r\n                    diffFields.Add(GameField.Description);\r\n                }\r\n            }\r\n\r\n            checkListChanged(AgeRatings, newGame.AgeRatings, GameField.AgeRatings);\r\n            checkListChanged(Regions, newGame.Regions, GameField.Regions);\r\n            checkListChanged(Series, newGame.Series, GameField.Series);\r\n            checkListChanged(Platforms, newGame.Platforms, GameField.Platforms);\r\n            checkListChanged(Developers, newGame.Developers, GameField.Developers);\r\n            checkListChanged(Publishers, newGame.Publishers, GameField.Publishers);\r\n            checkListChanged(Genres, newGame.Genres, GameField.Genres);\r\n            checkListChanged(Tags, newGame.Tags, GameField.Tags);\r\n            checkListChanged(Features, newGame.Features, GameField.Features);\r\n\r\n            if (newGame.ReleaseDate != null)\r\n            {\r\n                if (oldGame.ReleaseDate != null && oldGame.ReleaseDate != newGame.ReleaseDate)\r\n                {\r\n                    diffFields.Add(GameField.ReleaseDate);\r\n                }\r\n            }\r\n\r\n            if (newGame.Links.HasItems())\r\n            {\r\n                if (oldGame.Links.HasItems() && !oldGame.Links.IsListEqualExact(newGame.Links))\r\n                {\r\n                    diffFields.Add(GameField.Links);\r\n                }\r\n            }\r\n\r\n            if (newGame.CriticScore != null)\r\n            {\r\n                if (oldGame.CriticScore != null && oldGame.CriticScore != newGame.CriticScore)\r\n                {\r\n                    diffFields.Add(GameField.CriticScore);\r\n                }\r\n            }\r\n\r\n            if (newGame.CommunityScore != null)\r\n            {\r\n                if (oldGame.CommunityScore != null && oldGame.CommunityScore != newGame.CommunityScore)\r\n                {\r\n                    diffFields.Add(GameField.CommunityScore);\r\n                }\r\n            }\r\n\r\n            if (newGame.Icon != null && !oldGame.Icon.IsNullOrEmpty())\r\n            {\r\n                var newIcon = ProcessMetadataFile(newGame.Icon, tempDownloadIconFileName);\r\n                if (newIcon != null)\r\n                {\r\n                    var currentPath = ImageSourceManager.GetImagePath(EditingGame.Icon);\r\n                    if (currentPath.IsNullOrEmpty() ||\r\n                        !File.Exists(currentPath) ||\r\n                        !FileSystem.AreFileContentsEqual(newIcon, currentPath))\r\n                    {\r\n                        newGame.Icon = new MetadataFile(newIcon);\r\n                        diffFields.Add(GameField.Icon);\r\n                    }\r\n                    else\r\n                    {\r\n                        newGame.Icon = null;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    newGame.Icon = null;\r\n                }\r\n            }\r\n\r\n            if (newGame.CoverImage != null && !oldGame.CoverImage.IsNullOrEmpty())\r\n            {\r\n                var newCover = ProcessMetadataFile(newGame.CoverImage, tempDownloadCoverFileName);\r\n                if (newCover != null)\r\n                {\r\n                    var currentPath = ImageSourceManager.GetImagePath(EditingGame.CoverImage);\r\n                    if (currentPath.IsNullOrEmpty() ||\r\n                        !File.Exists(currentPath) ||\r\n                        !FileSystem.AreFileContentsEqual(newCover, currentPath))\r\n                    {\r\n                        newGame.CoverImage = new MetadataFile(newCover);\r\n                        diffFields.Add(GameField.CoverImage);\r\n                    }\r\n                    else\r\n                    {\r\n                        newGame.CoverImage = null;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    newGame.CoverImage = null;\r\n                }\r\n            }\r\n\r\n            if (newGame.BackgroundImage != null && !oldGame.BackgroundImage.IsNullOrEmpty())\r\n            {\r\n                var newBack = ProcessMetadataFile(newGame.BackgroundImage, tempDownloadBackgroundFileName);\r\n                if (newBack != null)\r\n                {\r\n                    var currentPath = ImageSourceManager.GetImagePath(EditingGame.BackgroundImage);\r\n                    if (currentPath.IsNullOrEmpty() ||\r\n                        !File.Exists(currentPath) ||\r\n                        !FileSystem.AreFileContentsEqual(newBack, currentPath))\r\n                    {\r\n                        newGame.BackgroundImage = new MetadataFile(newBack);\r\n                        diffFields.Add(GameField.BackgroundImage);\r\n                    }\r\n                    else\r\n                    {\r\n                        newGame.BackgroundImage = null;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    newGame.BackgroundImage = null;\r\n                }\r\n            }\r\n\r\n            if (!oldGame.IsInstalled && newGame.InstallSize != null)\r\n            {\r\n                if (oldGame.InstallSize != null && oldGame.InstallSize != newGame.InstallSize)\r\n                {\r\n                    diffFields.Add(GameField.InstallSize);\r\n                }\r\n            }\r\n\r\n            return diffFields;\r\n        }\r\n\r\n        public void PreviewGameData(ComparableMetadatGameData metadata)\r\n        {\r\n            var diffItems = GetDisplayDiffFields(EditingGame, metadata);\r\n            if (diffItems.HasItems())\r\n            {\r\n                var comp = new MetadataComparisonViewModel(\r\n                    new MetadataComparisonWindowFactory(),\r\n                    dialogs,\r\n                    resources,\r\n                    EditingGame,\r\n                    metadata,\r\n                    diffItems);\r\n\r\n                if (comp.OpenView() == true)\r\n                {\r\n                    LoadNewMetadata(comp.ResultMetadata);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                LoadNewMetadata(metadata);\r\n            }\r\n        }\r\n\r\n        public void AddNewAndSetFieldList<T>(List<T> items, SelectableDbItemList selectList) where T : DatabaseObject\r\n        {\r\n            foreach (var item in items)\r\n            {\r\n                if (selectList.FirstOrDefault(a => a.Item.Id == item.Id) == null)\r\n                {\r\n                    selectList.Add(item);\r\n                }\r\n            }\r\n\r\n            selectList.SetSelection(items.Select(a => a.Id));\r\n        }\r\n\r\n        private void LoadNewMetadata(ComparableMetadatGameData newData)\r\n        {\r\n            ShowCheckBoxes = true;\r\n            if (!newData.Name.IsNullOrWhiteSpace() && !string.Equals(newData.Name, EditingGame.Name, StringComparison.InvariantCultureIgnoreCase))\r\n            {\r\n                EditingGame.Name = newData.Name;\r\n            }\r\n\r\n            if (newData.Developers.HasItems())\r\n            {\r\n                AddNewAndSetFieldList(newData.Developers, Developers);\r\n            }\r\n\r\n            if (newData.Publishers.HasItems())\r\n            {\r\n                AddNewAndSetFieldList(newData.Publishers, Publishers);\r\n            }\r\n\r\n            if (newData.Genres.HasItems())\r\n            {\r\n                AddNewAndSetFieldList(newData.Genres, Genres);\r\n            }\r\n\r\n            if (newData.Tags.HasItems())\r\n            {\r\n                AddNewAndSetFieldList(newData.Tags, Tags);\r\n            }\r\n\r\n            if (newData.Features.HasItems())\r\n            {\r\n                AddNewAndSetFieldList(newData.Features, Features);\r\n            }\r\n\r\n            if (newData.AgeRatings.HasItems())\r\n            {\r\n                AddNewAndSetFieldList(newData.AgeRatings, AgeRatings);\r\n            }\r\n\r\n            if (newData.Regions.HasItems())\r\n            {\r\n                AddNewAndSetFieldList(newData.Regions, Regions);\r\n            }\r\n\r\n            if (newData.Series.HasItems())\r\n            {\r\n                AddNewAndSetFieldList(newData.Series, Series);\r\n            }\r\n\r\n            if (newData.Platforms.HasItems())\r\n            {\r\n                AddNewAndSetFieldList(newData.Platforms, Platforms);\r\n            }\r\n\r\n            if (newData.ReleaseDate != null)\r\n            {\r\n                EditingGame.ReleaseDate = newData.ReleaseDate;\r\n            }\r\n\r\n            if (!newData.Description.IsNullOrWhiteSpace() && !string.Equals(newData.Description, EditingGame.Description, StringComparison.InvariantCultureIgnoreCase))\r\n            {\r\n                EditingGame.Description = newData.Description;\r\n            }\r\n\r\n            if (newData.Links.HasItems())\r\n            {\r\n                EditingGame.Links = newData.Links.ToObservable();\r\n            }\r\n\r\n            if (newData.CriticScore != null)\r\n            {\r\n                EditingGame.CriticScore = newData.CriticScore;\r\n            }\r\n\r\n            if (newData.CommunityScore != null)\r\n            {\r\n                EditingGame.CommunityScore = newData.CommunityScore;\r\n            }\r\n\r\n            if (newData.CoverImage != null)\r\n            {\r\n                var newCover = ProcessMetadataFile(newData.CoverImage, tempEditingCoverFileName);\r\n                if (newCover != null)\r\n                {\r\n                    EditingGame.CoverImage = newCover;\r\n                }\r\n            }\r\n\r\n            if (newData.Icon != null)\r\n            {\r\n                var newIcon = ProcessMetadataFile(newData.Icon, tempEditingIconFileName);\r\n                if (newIcon != null)\r\n                {\r\n                    EditingGame.Icon = newIcon;\r\n                }\r\n            }\r\n\r\n            if (newData.BackgroundImage != null)\r\n            {\r\n                var newBackground = ProcessMetadataFile(newData.BackgroundImage, tempEditingBackgroundFileName);\r\n                if (newBackground != null)\r\n                {\r\n                    EditingGame.BackgroundImage = newBackground;\r\n                }\r\n            }\r\n\r\n            if (!EditingGame.IsInstalled && newData.InstallSize != null)\r\n            {\r\n                EditingGame.InstallSize = newData.InstallSize;\r\n            }\r\n        }\r\n\r\n        private string ProcessMetadataFile(string file, string tempFileName)\r\n        {\r\n            return ProcessMetadataFile(new MetadataFile(file), tempFileName);\r\n        }\r\n\r\n        private string ProcessMetadataFile(MetadataFile file, string tempFileName)\r\n        {\r\n            string localFile = null;\r\n            var progRes = dialogs.ActivateGlobalProgress((a) =>\r\n                {\r\n                    localFile = file.GetLocalFile(a.CancelToken);\r\n                    // GetLocalFile creates generic Guid based name if a file is http link\r\n                    if (localFile?.StartsWith(PlaynitePaths.TempPath) == true)\r\n                    {\r\n                        var resFile = Path.Combine(PlaynitePaths.TempPath, tempFileName + Path.GetExtension(localFile));\r\n                        if (!localFile.Equals(resFile, StringComparison.OrdinalIgnoreCase))\r\n                        {\r\n                            FileSystem.DeleteFile(resFile);\r\n                            File.Move(localFile, resFile);\r\n                            localFile = resFile;\r\n                        }\r\n                    }\r\n                },\r\n                new GlobalProgressOptions(\"LOCDownloadingMediaLabel\", true));\r\n            if (progRes.Result == true && !progRes.Canceled)\r\n            {\r\n                if (localFile.IsNullOrEmpty())\r\n                {\r\n                    return null;\r\n                }\r\n                else\r\n                {\r\n                    localFile = Images.ConvertToCompatibleFormat(localFile, Path.Combine(PlaynitePaths.TempPath, tempFileName));\r\n                    return localFile;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                logger.Error(progRes.Error, $\"Failed to download {file.Path}.\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        public IEnumerable<T> GetOrGenerateNewFieldItem<T>(HashSet<MetadataProperty> properties, SelectableDbItemList selectList) where T : DatabaseObject\r\n        {\r\n            foreach (var property in properties)\r\n            {\r\n                if (property is MetadataNameProperty nameProp)\r\n                {\r\n                    if (nameProp.Name.IsNullOrWhiteSpace())\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    var existingItem = selectList.FirstOrDefault(a => GameFieldComparer.StringEquals(a.Item.Name, nameProp.Name));\r\n                    if (existingItem != null)\r\n                    {\r\n                        yield return (T)existingItem.Item;\r\n                    }\r\n                    else\r\n                    {\r\n                        yield return typeof(T).CrateInstance<T>(nameProp.Name);\r\n                    }\r\n                }\r\n                else if (property is MetadataIdProperty idProp)\r\n                {\r\n                    var existingItem = selectList.FirstOrDefault(a => a.Item.Id == idProp.Id);\r\n                    if (existingItem != null)\r\n                    {\r\n                        yield return  (T)existingItem.Item;\r\n                    }\r\n                }\r\n                else if (property is MetadataSpecProperty specProp)\r\n                {\r\n                    if (typeof(T) == typeof(Platform))\r\n                    {\r\n                        var platSpec = Emulation.Platforms.FirstOrDefault(a => a.Id == specProp.Id || a.Name == specProp.Id);\r\n                        if (platSpec != null)\r\n                        {\r\n                            var exPlat = selectList.FirstOrDefault(a => ((Platform)a.Item).SpecificationId == platSpec.Id);\r\n                            if (exPlat != null)\r\n                            {\r\n                                yield return (T)exPlat.Item;\r\n                            }\r\n                            else\r\n                            {\r\n                                yield return (T)(new Platform(platSpec.Name) { SpecificationId = platSpec.Id } as DatabaseObject);\r\n                            }\r\n                        }\r\n                    }\r\n                    else if (typeof(T) == typeof(Region))\r\n                    {\r\n                        var regionSpec = Emulation.Regions.FirstOrDefault(a => a.Id == specProp.Id || a.Name == specProp.Id);\r\n                        if (regionSpec != null)\r\n                        {\r\n                            var exRegion = selectList.FirstOrDefault(a => ((Region)a.Item).SpecificationId == regionSpec.Id);\r\n                            if (exRegion != null)\r\n                            {\r\n                                yield return (T)exRegion.Item;\r\n                            }\r\n                            else\r\n                            {\r\n                                yield return (T)(new Region(regionSpec.Name) { SpecificationId = regionSpec.Id } as DatabaseObject);\r\n                            }\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        throw new NotSupportedException($\"{property.GetType()} property type is not supported in {typeof(T)} collection.\");\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    throw new NotSupportedException($\"{property.GetType()} property type is not supported in {typeof(T)} collection.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        ComparableMetadatGameData ConvertGameInfo(GameMetadata game)\r\n        {\r\n            var result = new ComparableMetadatGameData\r\n            {\r\n                Name = game.Name,\r\n                Description = game.Description,\r\n                ReleaseDate = game.ReleaseDate,\r\n                CommunityScore = game.CommunityScore,\r\n                CriticScore = game.CriticScore,\r\n                Links = game.Links,\r\n                InstallSize = game.InstallSize\r\n            };\r\n\r\n            if (game.Genres.HasItems())\r\n            {\r\n                result.Genres = GetOrGenerateNewFieldItem<Genre>(game.Genres, Genres).ToList();\r\n            }\r\n\r\n            if (game.Developers.HasItems())\r\n            {\r\n                result.Developers = GetOrGenerateNewFieldItem<Company>(game.Developers, Developers).ToList();\r\n            }\r\n\r\n            if (game.Publishers.HasItems())\r\n            {\r\n                var publishers = GetOrGenerateNewFieldItem<Company>(game.Publishers, Publishers).ToList();\r\n                for (int i = 0; i < publishers.Count; i++)\r\n                {\r\n                    var p = publishers[i];\r\n                    var existingDev = result.Developers?.FirstOrDefault(d => GameFieldComparer.StringEquals(p.Name, d.Name));\r\n                    if (existingDev != null && p.Id != existingDev.Id)\r\n                    {\r\n                        publishers[i] = existingDev;\r\n                    }\r\n                }\r\n\r\n                result.Publishers = publishers;\r\n            }\r\n\r\n            if (game.Tags.HasItems())\r\n            {\r\n                result.Tags = GetOrGenerateNewFieldItem<Tag>(game.Tags, Tags).ToList();\r\n            }\r\n\r\n            if (game.Features.HasItems())\r\n            {\r\n                result.Features = GetOrGenerateNewFieldItem<GameFeature>(game.Features, Features).ToList();\r\n            }\r\n\r\n            if (game.AgeRatings.HasItems())\r\n            {\r\n                result.AgeRatings = GetOrGenerateNewFieldItem<AgeRating>(game.AgeRatings, AgeRatings).ToList();\r\n            }\r\n\r\n            if (game.Series.HasItems())\r\n            {\r\n                result.Series = GetOrGenerateNewFieldItem<Series>(game.Series, Series).ToList();\r\n            }\r\n\r\n            if (game.Regions.HasItems())\r\n            {\r\n                result.Regions = GetOrGenerateNewFieldItem<Region>(game.Regions, Regions).ToList();\r\n            }\r\n\r\n            if (game.Platforms.HasItems())\r\n            {\r\n                result.Platforms = GetOrGenerateNewFieldItem<Platform>(game.Platforms, Platforms).ToList();\r\n            }\r\n\r\n            if (game.CoverImage != null)\r\n            {\r\n                result.CoverImage = new MetadataFile(ProcessMetadataFile(game.CoverImage, tempDownloadCoverFileName));\r\n            }\r\n\r\n            if (game.Icon != null)\r\n            {\r\n                result.Icon = new MetadataFile(ProcessMetadataFile(game.Icon, tempDownloadIconFileName));\r\n            }\r\n\r\n            if (game.BackgroundImage != null)\r\n            {\r\n                result.BackgroundImage = new MetadataFile(ProcessMetadataFile(game.BackgroundImage, tempDownloadBackgroundFileName));\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        public void DownloadPluginData(MetadataPlugin plugin)\r\n        {\r\n            var res = dialogs.ActivateGlobalProgress((args) =>\r\n            {\r\n                var provider = plugin.GetMetadataProvider(new MetadataRequestOptions(EditingGame, false));\r\n                if (provider != null)\r\n                {\r\n                    try\r\n                    {\r\n                        var fieldArgs = new GetMetadataFieldArgs { CancelToken = args.CancelToken };\r\n                        var metadata = new GameMetadata\r\n                        {\r\n                            Name = provider.GetName(fieldArgs),\r\n                            Genres = provider.GetGenres(fieldArgs)?.Where(a => a != null).ToHashSet(),\r\n                            ReleaseDate = provider.GetReleaseDate(fieldArgs),\r\n                            Developers = provider.GetDevelopers(fieldArgs)?.Where(a => a != null).ToHashSet(),\r\n                            Publishers = provider.GetPublishers(fieldArgs)?.Where(a => a != null).ToHashSet(),\r\n                            Tags = provider.GetTags(fieldArgs)?.Where(a => a != null).ToHashSet(),\r\n                            Features = provider.GetFeatures(fieldArgs)?.Where(a => a != null).ToHashSet(),\r\n                            Description = provider.GetDescription(fieldArgs),\r\n                            Links = provider.GetLinks(fieldArgs)?.Where(a => a != null).ToList(),\r\n                            CriticScore = provider.GetCriticScore(fieldArgs),\r\n                            CommunityScore = provider.GetCommunityScore(fieldArgs),\r\n                            AgeRatings = provider.GetAgeRatings(fieldArgs)?.Where(a => a != null).ToHashSet(),\r\n                            Series = provider.GetSeries(fieldArgs)?.Where(a => a != null).ToHashSet(),\r\n                            Regions = provider.GetRegions(fieldArgs)?.Where(a => a != null).ToHashSet(),\r\n                            Platforms = provider.GetPlatforms(fieldArgs)?.Where(a => a != null).ToHashSet(),\r\n                            Icon = provider.GetIcon(fieldArgs),\r\n                            CoverImage = provider.GetCoverImage(fieldArgs),\r\n                            BackgroundImage = provider.GetBackgroundImage(fieldArgs),\r\n                            InstallSize = provider.GetInstallSize(fieldArgs)\r\n                        };\r\n\r\n                        Application.Current.Dispatcher.Invoke(() => PreviewGameData(ConvertGameInfo(metadata)));\r\n                    }\r\n                    finally\r\n                    {\r\n                        provider.Dispose();\r\n                    }\r\n                }\r\n            }, new GlobalProgressOptions(LOC.DownloadingLabel)\r\n            {\r\n                IsIndeterminate = true,\r\n                Cancelable = true\r\n            });\r\n\r\n            if (res.Error != null)\r\n            {\r\n                logger.Error(res.Error, string.Format(\"Failed to download metadata, {0}, {1}\", Game.PluginId, Game.GameId));\r\n                dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCMetadataDownloadError\"), res.Error.Message),\r\n                    resources.GetString(\"LOCDownloadError\"),\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n            }\r\n        }\r\n\r\n        public void DownloadStoreData()\r\n        {\r\n            var res = dialogs.ActivateGlobalProgress((args) =>\r\n            {\r\n                if (extensions.Plugins.TryGetValue(Game.PluginId, out var plugin))\r\n                {\r\n                    if (LibraryPluginMetadataDownloader == null)\r\n                    {\r\n                        dialogs.ShowErrorMessage(\r\n                            resources.GetString(\"LOCErrorNoMetadataDownloader\"),\r\n                            resources.GetString(\"LOCGameError\"));\r\n                        return;\r\n                    }\r\n\r\n                    var metadata = LibraryPluginMetadataDownloader.GetMetadata(EditingGame);\r\n                    if (metadata != null)\r\n                    {\r\n                        Application.Current.Dispatcher.Invoke(() => PreviewGameData(ConvertGameInfo(metadata)));\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    dialogs.ShowErrorMessage(\r\n                        resources.GetString(\"LOCErrorLibraryPluginNotFound\"),\r\n                        resources.GetString(\"LOCGameError\"));\r\n                    return;\r\n                }\r\n            }, new GlobalProgressOptions(LOC.DownloadingLabel)\r\n            {\r\n                IsIndeterminate = true,\r\n                Cancelable = true\r\n            });\r\n\r\n            if (res.Error != null)\r\n            {\r\n                logger.Error(res.Error, string.Format(\"Failed to download metadata, {0}, {1}\", Game.PluginId, Game.GameId));\r\n                dialogs.ShowMessage(\r\n                    string.Format(resources.GetString(\"LOCMetadataDownloadError\"), res.Error.Message),\r\n                    resources.GetString(\"LOCDownloadError\"),\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n            }\r\n        }\r\n\r\n        private string ReplaceImageSearchVariables(string input)\r\n        {\r\n            input = input.Replace(\"{Name}\", editingGame.Name, StringComparison.OrdinalIgnoreCase);\r\n            var yearToReplace = editingGame.ReleaseDate.HasValue ? editingGame.ReleaseDate.Value.Year.ToString() : string.Empty;\r\n            input = input.Replace(\"{ReleaseYear}\", yearToReplace, StringComparison.OrdinalIgnoreCase);\r\n            return input.Replace(\"{Platform}\", editingGame.Platforms?.FirstOrDefault()?.Name, StringComparison.OrdinalIgnoreCase);\r\n        }\r\n\r\n        public void SelectGoogleIcon()\r\n        {\r\n            var searchTerm = appSettings.WebImageSarchIconTerm.IsNullOrWhiteSpace() ? $\"{EditingGame.Name} icon\" : appSettings.WebImageSarchIconTerm;\r\n            searchTerm = ReplaceImageSearchVariables(searchTerm);\r\n            var image = SelectGoogleImage(searchTerm, tempEditingIconFileName);\r\n            if (!image.IsNullOrEmpty())\r\n            {\r\n                EditingGame.Icon = image;\r\n            }\r\n        }\r\n\r\n        public void SelectGoogleCover()\r\n        {\r\n            var searchTerm = appSettings.WebImageSarchCoverTerm.IsNullOrWhiteSpace() ? $\"{EditingGame.Name} cover\" : appSettings.WebImageSarchCoverTerm;\r\n            searchTerm = ReplaceImageSearchVariables(searchTerm);\r\n            var image = SelectGoogleImage(searchTerm, tempEditingCoverFileName);\r\n            if (!image.IsNullOrEmpty())\r\n            {\r\n                EditingGame.CoverImage = image;\r\n            }\r\n        }\r\n\r\n        public void SelectGoogleBackground()\r\n        {\r\n            var searchTerm = appSettings.WebImageSarchBackgroundTerm.IsNullOrWhiteSpace() ? $\"{EditingGame.Name} wallpaper\" : appSettings.WebImageSarchBackgroundTerm;\r\n            searchTerm = ReplaceImageSearchVariables(searchTerm);\r\n            var image = SelectGoogleImage(searchTerm, tempEditingBackgroundFileName);\r\n            if (!image.IsNullOrEmpty())\r\n            {\r\n                EditingGame.BackgroundImage = image;\r\n            }\r\n        }\r\n\r\n        public string SelectGoogleImage(string searchTerm, string tempFileName, double imageWidth = 0, double imageHeight = 0)\r\n        {\r\n            var model = new GoogleImageDownloadViewModel(\r\n                new GoogleImageDownloadWindowFactory(),\r\n                resources,\r\n                searchTerm,\r\n                appSettings.WebImageSafeSearch,\r\n                imageWidth,\r\n                imageHeight);\r\n            if (model.OpenView() == true)\r\n            {\r\n                try\r\n                {\r\n                    var url = model.SelectedImage?.ImageUrl;\r\n                    if (url.IsNullOrEmpty())\r\n                    {\r\n                        return null;\r\n                    }\r\n\r\n                    if (model.SafeSearch != appSettings.WebImageSafeSearch)\r\n                    {\r\n                        appSettings.WebImageSafeSearch = model.SafeSearch;\r\n                    }\r\n\r\n                    var cancelToken = new CancellationTokenSource(Common.Timer.SecondsToMilliseconds(5));\r\n                    var response = HttpDownloader.GetResponseCode(url, cancelToken.Token, out var test);\r\n                    if (!response.IsSuccess())\r\n                    {\r\n                        logger.Warn(\"Original Google image request failed: \" + response.ToString());\r\n                        url = model.SelectedImage.ThumbUrl;\r\n                    }\r\n\r\n                    return ProcessMetadataFile(url, tempFileName);\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to use google image {model.SelectedImage?.ImageUrl}.\");\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/GoogleImageDownloadViewModel.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class GoogleImageDownloadViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private readonly IResourceProvider resources;\r\n        private bool closingHanled = false;\r\n        private readonly GoogleImageDownloader downloader;\r\n\r\n        public double ItemWidth { get; set; } = 240;\r\n        public double ItemHeight { get; set; } = 180;\r\n\r\n        private bool showLoadMore = false;\r\n        public bool ShowLoadMore\r\n        {\r\n            get => showLoadMore;\r\n            set\r\n            {\r\n                showLoadMore = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool transparent = false;\r\n        public bool Transparent\r\n        {\r\n            get => transparent;\r\n            set\r\n            {\r\n                var old = transparent;\r\n                transparent = value;\r\n                OnPropertyChanged();\r\n                if (old != transparent)\r\n                {\r\n                    Search();\r\n                }\r\n            }\r\n        }\r\n\r\n        private string searchTerm;\r\n        public string SearchTerm\r\n        {\r\n            get => searchTerm;\r\n            set\r\n            {\r\n                searchTerm = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int? searchWidth;\r\n        public int? SearchWidth\r\n        {\r\n            get => searchWidth;\r\n            set\r\n            {\r\n                searchWidth = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int? searchHeight;\r\n        public int? SearchHeight\r\n        {\r\n            get => searchHeight;\r\n            set\r\n            {\r\n                searchHeight = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SafeSearchSettings safeSearch;\r\n        public SafeSearchSettings SafeSearch\r\n        {\r\n            get => safeSearch;\r\n            set\r\n            {\r\n                safeSearch = value;\r\n                OnPropertyChanged();\r\n                Search();\r\n            }\r\n        }\r\n\r\n        private List<GoogleImage> images = new List<GoogleImage>();\r\n        public List<GoogleImage> AvailableImages\r\n        {\r\n            get\r\n            {\r\n                return images;\r\n            }\r\n\r\n            set\r\n            {\r\n                images = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public ObservableCollection<GoogleImage> DisplayImages\r\n        {\r\n            get;\r\n        } = new ObservableCollection<GoogleImage>();\r\n\r\n        private GoogleImage selectedImage;\r\n        public GoogleImage SelectedImage\r\n        {\r\n            get => selectedImage;\r\n            set\r\n            {\r\n                selectedImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> CloseCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView(false);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            }, (a) => SelectedImage != null);\r\n        }\r\n\r\n        public RelayCommand<object> ItemDoubleClickCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> WindowClosingCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                WindowClosing();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> LoadMoreCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                LoadMore();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SearchCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                Search();\r\n            }, (a) => !string.IsNullOrEmpty(SearchTerm));\r\n        }\r\n\r\n        public RelayCommand<string> SetSearchResolutionCommand\r\n        {\r\n            get => new RelayCommand<string>((resolution) =>\r\n            {\r\n                SetSearchResolution(resolution);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<string> ClearSearchResolutionCommand\r\n        {\r\n            get => new RelayCommand<string>((a) =>\r\n            {\r\n                ClearSearchResolution();\r\n            });\r\n        }\r\n\r\n        public GoogleImageDownloadViewModel(\r\n            IWindowFactory window,\r\n            IResourceProvider resources,\r\n            string initialSearch,\r\n            SafeSearchSettings safeSearch,\r\n            double itemWidth = 0,\r\n            double itemHeigth = 0)\r\n        {\r\n            this.window = window;\r\n            this.resources = resources;\r\n            this.safeSearch = safeSearch;\r\n            if (itemWidth != 0)\r\n            {\r\n                ItemWidth = itemWidth;\r\n            }\r\n\r\n            if (itemHeigth != 0)\r\n            {\r\n                ItemHeight = itemHeigth;\r\n            }\r\n\r\n            downloader = new GoogleImageDownloader();\r\n            SearchTerm = initialSearch;\r\n            if (!initialSearch.IsNullOrEmpty())\r\n            {\r\n                Search();\r\n            }\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView(bool? result)\r\n        {\r\n            downloader.Dispose();\r\n            closingHanled = true;\r\n            window.Close(result);\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            downloader.Dispose();\r\n            closingHanled = true;\r\n            CloseView(true);\r\n        }\r\n\r\n        public void Search()\r\n        {\r\n            AvailableImages = new List<GoogleImage>();\r\n            var query = SearchTerm;\r\n            if (SearchWidth != null && SearchHeight != null && !query.Contains(\"imagesize:\"))\r\n            {\r\n                query = $\"{query} imagesize:{SearchWidth}x{SearchHeight}\";\r\n            }\r\n\r\n            if (GlobalProgress.ActivateProgress((_) =>\r\n            {\r\n                AvailableImages = downloader.GetImages(query, SafeSearch, Transparent).GetAwaiter().GetResult();\r\n            }, new GlobalProgressOptions(\"LOCDownloadingLabel\")).Result == true)\r\n            {\r\n                if (!AvailableImages.HasItems())\r\n                {\r\n                    return;\r\n                }\r\n\r\n                DisplayImages.Clear();\r\n                if (AvailableImages.Count > 20)\r\n                {\r\n                    DisplayImages.AddRange(AvailableImages.Take(20));\r\n                    AvailableImages.RemoveRange(0, 20);\r\n                    ShowLoadMore = true;\r\n                }\r\n                else if (AvailableImages.Count > 0)\r\n                {\r\n                    DisplayImages.AddRange(AvailableImages);\r\n                    AvailableImages.Clear();\r\n                    ShowLoadMore = false;\r\n                }\r\n            }\r\n        }\r\n\r\n        public void SetSearchResolution(string resolution)\r\n        {\r\n            var regex = Regex.Match(resolution, @\"(\\d+)x(\\d+)\");\r\n            if (regex.Success)\r\n            {\r\n                SearchWidth = int.Parse(regex.Groups[1].Value);\r\n                SearchHeight = int.Parse(regex.Groups[2].Value);\r\n            }\r\n        }\r\n\r\n        public void ClearSearchResolution()\r\n        {\r\n            SearchWidth = null;\r\n            SearchHeight = null;\r\n        }\r\n\r\n        public void LoadMore()\r\n        {\r\n            if (AvailableImages.Count > 20)\r\n            {\r\n                DisplayImages.AddRange(AvailableImages.Take(20));\r\n                AvailableImages.RemoveRange(0, 20);\r\n                ShowLoadMore = true;\r\n            }\r\n            else if (AvailableImages.Count > 0)\r\n            {\r\n                DisplayImages.AddRange(AvailableImages);\r\n                AvailableImages.Clear();\r\n                ShowLoadMore = false;\r\n            }\r\n        }\r\n\r\n        public void WindowClosing()\r\n        {\r\n            if (!closingHanled)\r\n            {\r\n                downloader.Dispose();\r\n            }\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/ImageSelectionViewModel.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class ImageSelectionViewModel : ObservableObject\r\n    {\r\n        public string WindowTitle { get; set; }\r\n        public double ItemWidth { get; set; } = 240;\r\n        public double ItemHeight { get; set; } = 180;\r\n\r\n        private List<ImageFileOption> images = new List<ImageFileOption>();\r\n        public List<ImageFileOption> Images\r\n        {\r\n            get\r\n            {\r\n                return images;\r\n            }\r\n\r\n            set\r\n            {\r\n                images = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ImageFileOption selectedImage;\r\n        public ImageFileOption SelectedImage\r\n        {\r\n            get => selectedImage;\r\n            set\r\n            {\r\n                selectedImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> CloseCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView(false);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            }, (a) => SelectedImage != null);\r\n        }\r\n\r\n        public RelayCommand<object> ItemDoubleClickCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            });\r\n        }\r\n\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n\r\n        public ImageSelectionViewModel(\r\n            List<ImageFileOption> images,\r\n            IWindowFactory window,\r\n            string caption = null,\r\n            double itemWidth = 240,\r\n            double itemHeight = 180)\r\n        {\r\n            Images = images;\r\n            this.window = window;\r\n            if (caption.IsNullOrEmpty())\r\n            {\r\n                WindowTitle = ResourceProvider.GetString(\"LOCSelectImageTitle\");\r\n            }\r\n            else\r\n            {\r\n                WindowTitle = caption;\r\n            }\r\n\r\n            ItemWidth = itemWidth;\r\n            ItemHeight = itemHeight;\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView(bool? result)\r\n        {\r\n            window.Close(result);\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            CloseView(true);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/InstalledGamesViewModel.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing Playnite.Common;\r\nusing System.Diagnostics;\r\nusing System.Drawing.Imaging;\r\nusing Playnite.Windows;\r\nusing System.Drawing;\r\nusing Playnite.Common.Media.Icons;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class InstalledGamesViewModel : ObservableObject\r\n    {\r\n        public enum ProgramType\r\n        {\r\n            Win32,\r\n            UWP\r\n        }\r\n\r\n        public class ImportableProgram : SelectableItem<Program>\r\n        {\r\n            public static BitmapImage EmptyImage { get; set; }\r\n\r\n            public ProgramType Type\r\n            {\r\n                get; set;\r\n            }\r\n\r\n            public string DisplayPath\r\n            {\r\n                get; set;\r\n            }\r\n\r\n            private ImageSource iconSource;\r\n            public ImageSource IconSource\r\n            {\r\n                get\r\n                {\r\n                    if (string.IsNullOrEmpty(Item.Icon))\r\n                    {\r\n                        return null;\r\n                    }\r\n\r\n                    if (iconSource != null)\r\n                    {\r\n                        return iconSource;\r\n                    }\r\n\r\n                    if (Type == ProgramType.UWP)\r\n                    {\r\n                        iconSource = BitmapExtensions.CreateSourceFromURI(Item.Icon);\r\n                    }\r\n                    else\r\n                    {\r\n                        string path;\r\n                        var match = Regex.Match(Item.Icon, @\"(.*),(\\d+)\");\r\n                        if (match.Success)\r\n                        {\r\n                            path = match.Groups[1].Value;\r\n                            if (string.IsNullOrEmpty(path))\r\n                            {\r\n                                path = Item.Path;\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            path = Item.Icon;\r\n                        }\r\n\r\n                        var index = match.Groups[2].Value;\r\n                        if (!File.Exists(path))\r\n                        {\r\n                            return null;\r\n                        }\r\n\r\n                        if (path.EndsWith(\".ico\", StringComparison.OrdinalIgnoreCase))\r\n                        {\r\n                            iconSource = BitmapExtensions.CreateSourceFromURI(path);\r\n                        }\r\n                        else\r\n                        {\r\n                            var icon = IconExtractor.ExtractMainIconFromFile(path);\r\n                            if (icon != null)\r\n                            {\r\n                                try\r\n                                {\r\n                                    iconSource = icon.ToImageSource();\r\n                                }\r\n                                catch (Exception e)\r\n                                {\r\n                                    logger.Error(e, \"Failed to convert icon.\");\r\n                                }\r\n                                finally\r\n                                {\r\n                                    icon.Dispose();\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (iconSource == null)\r\n                    {\r\n                        iconSource = EmptyImage;\r\n                    }\r\n\r\n                    return iconSource;\r\n                }\r\n            }\r\n\r\n            private bool import;\r\n            public bool Import\r\n            {\r\n                get => import;\r\n                set\r\n                {\r\n                    import = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n\r\n            public ImportableProgram(Program program, ProgramType type) : base(program)\r\n            {\r\n                Type = type;\r\n                DisplayPath = type == ProgramType.Win32 ? program.Path : \"Microsoft Store\";\r\n            }\r\n        }\r\n\r\n        public List<GameMetadata> SelectedGames\r\n        {\r\n            get;\r\n            private set;\r\n        } = new List<GameMetadata>();\r\n\r\n        private ObservableCollection<ImportableProgram> programs = new ObservableCollection<ImportableProgram>();\r\n        public ObservableCollection<ImportableProgram> Programs\r\n        {\r\n            get\r\n            {\r\n                return programs;\r\n            }\r\n\r\n            set\r\n            {\r\n                programs = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ImportableProgram selectedProgram;\r\n        public ImportableProgram SelectedProgram\r\n        {\r\n            get\r\n            {\r\n                return selectedProgram;\r\n            }\r\n\r\n            set\r\n            {\r\n                selectedProgram = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ListCollectionView collectionView;\r\n        public ListCollectionView CollectionView\r\n        {\r\n            get => collectionView;\r\n            private set\r\n            {\r\n                collectionView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool hideImported = true;\r\n        public bool HideImported\r\n        {\r\n            get => hideImported;\r\n            set\r\n            {\r\n                hideImported = value;\r\n                OnPropertyChanged();\r\n                CollectionView.Refresh();\r\n            }\r\n        }\r\n\r\n        private bool markImportAll;\r\n        public bool MarkImportAll\r\n        {\r\n            get => markImportAll;\r\n            set\r\n            {\r\n                markImportAll = value;\r\n                OnPropertyChanged();\r\n                CollectionView.Cast<ImportableProgram>().ForEach(a => a.Import = markImportAll);\r\n            }\r\n        }\r\n\r\n        private readonly object listSyncLock = new object();\r\n        private readonly HashSet<string> importedExes;\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private IDialogsFactory dialogs;\r\n\r\n        public RelayCommand<object> CloseCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView(false);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SelectExecutableCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectExecutable();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ScanFolderCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ScanFolder();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> DetectInstalledCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                DetectInstalled();\r\n            });\r\n        }\r\n\r\n        public InstalledGamesViewModel(IWindowFactory window, IDialogsFactory dialogs, IGameDatabaseMain database)\r\n        {\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            importedExes = database.GetImportedExeFiles();\r\n            CollectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(Programs);\r\n            CollectionView.Filter = ListFilter;\r\n            BindingOperations.EnableCollectionSynchronization(Programs, listSyncLock);\r\n            ImportableProgram.EmptyImage = new BitmapImage(); // This is initialized here because the bitmap has to be created on main thread\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public bool? OpenView(string directory)\r\n        {\r\n            if (!string.IsNullOrEmpty(directory))\r\n            {\r\n#pragma warning disable CS4014\r\n                ScanFolder(directory);\r\n#pragma warning restore CS4014\r\n            }\r\n\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public bool? OpenViewOnWindowsApps()\r\n        {\r\n            DetectWindowsStoreApps();\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView(bool? result)\r\n        {\r\n            window.Close(result);\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            SelectedGames = new List<GameMetadata>();\r\n            foreach (var program in CollectionView.Cast<ImportableProgram>())\r\n            {\r\n                if (!program.Import)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                var newGame = new GameMetadata()\r\n                {\r\n                    Name = program.Item.Name.RemoveTrademarks(),\r\n                    GameId = program.Item.AppId,\r\n                    InstallDirectory = program.Item.WorkDir,\r\n                    Source = program.Type == ProgramType.UWP ? new MetadataNameProperty(\"Microsoft Store\") : null,\r\n                    IsInstalled = true,\r\n                    Platforms = new HashSet<MetadataProperty> { new MetadataSpecProperty(\"pc_windows\") }\r\n                };\r\n\r\n                var path = program.Item.Path;\r\n                if (program.Type == ProgramType.Win32 && !string.IsNullOrEmpty(program.Item.WorkDir))\r\n                {\r\n                    path = program.Item.Path.Replace(program.Item.WorkDir.EndWithDirSeparator(), ExpandableVariables.InstallationDirectory.EndWithDirSeparator());\r\n                }\r\n\r\n                newGame.GameActions = new List<GameAction>\r\n                {\r\n                     new GameAction()\r\n                    {\r\n                        Path = path,\r\n                        Arguments = program.Item.Arguments,\r\n                        Type = GameActionType.File,\r\n                        WorkingDir = program.Type == ProgramType.Win32 ? ExpandableVariables.InstallationDirectory : string.Empty,\r\n                        Name = newGame.Name,\r\n                        IsPlayAction = true\r\n                    }\r\n                };\r\n\r\n                if (program.IconSource != null &&  program.IconSource != ImportableProgram.EmptyImage)\r\n                {\r\n                    var bitmap = (BitmapSource)program.IconSource;\r\n                    newGame.Icon = new MetadataFile(Guid.NewGuid().ToString() + \".png\", bitmap.ToPngArray());\r\n                }\r\n\r\n                SelectedGames.Add(newGame);\r\n            }\r\n\r\n            CloseView(true);\r\n        }\r\n\r\n        public void SelectExecutable()\r\n        {\r\n            var path = dialogs.SelectFile(\"Executable (.exe,.bat,lnk)|*.exe;*.bat;*.lnk\");\r\n            if (string.IsNullOrEmpty(path))\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (!path.EndsWith(\".exe\", StringComparison.OrdinalIgnoreCase) &&\r\n                !path.EndsWith(\".lnk\", StringComparison.OrdinalIgnoreCase) &&\r\n                !path.EndsWith(\".bat\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                return;\r\n            }\r\n\r\n            var program = Common.Programs.GetProgramData(path);\r\n            var import = new ImportableProgram(program, ProgramType.Win32)\r\n            {\r\n                Selected = true\r\n            };\r\n\r\n            // Use shortcut name as game name for .lnk shortcuts\r\n            if (path.EndsWith(\".lnk\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                var shortcutName = Path.GetFileNameWithoutExtension(path);\r\n                if (!shortcutName.IsNullOrEmpty())\r\n                {\r\n                    import.Item.Name = shortcutName;\r\n                }\r\n            }\r\n\r\n            Programs.Add(import);\r\n            SelectedProgram = import;\r\n        }\r\n\r\n        public void DetectInstalled()\r\n        {\r\n            dialogs.ActivateGlobalProgress(async (progArgs) =>\r\n            {\r\n                try\r\n                {\r\n                    var allApps = new List<ImportableProgram>();\r\n                    var installed = await Playnite.Common.Programs.GetInstalledPrograms(progArgs.CancelToken);\r\n                    if (installed != null)\r\n                    {\r\n                        allApps.AddRange(installed.Select(a => new ImportableProgram(a, ProgramType.Win32)));\r\n                        if (Computer.WindowsVersion == WindowsVersion.Win10 || Computer.WindowsVersion == WindowsVersion.Win11)\r\n                        {\r\n                            allApps.AddRange(Playnite.Common.Programs.GetUWPApps().Select(a => new ImportableProgram(a, ProgramType.UWP)));\r\n                        }\r\n\r\n                        progArgs.MainContext.Send(_ =>\r\n                        {\r\n                            Programs.Clear();\r\n                            Programs.AddRange(allApps.OrderBy(a => a.Item.Name));\r\n                        }, null);\r\n                    }\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(exc, \"Failed to load list of installed apps.\");\r\n                }\r\n            }, new GlobalProgressOptions(LOC.EmuWizardScanning, true));\r\n        }\r\n\r\n        public void DetectWindowsStoreApps()\r\n        {\r\n            try\r\n            {\r\n                var winApps = Playnite.Common.Programs.GetUWPApps().Select(a => new ImportableProgram(a, ProgramType.UWP));\r\n                Programs.Clear();\r\n                Programs.AddRange(winApps.OrderBy(a => a.Item.Name));\r\n            }\r\n                catch (Exception e) when(!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to detect Windows Store apps.\");\r\n            }\r\n        }\r\n\r\n        public void ScanFolder()\r\n        {\r\n            var path = dialogs.SelectFolder();\r\n            if (string.IsNullOrEmpty(path))\r\n            {\r\n                return;\r\n            }\r\n\r\n            ScanFolder(path);\r\n        }\r\n\r\n        public void ScanFolder(string path)\r\n        {\r\n            dialogs.ActivateGlobalProgress(async (progArgs) =>\r\n            {\r\n                try\r\n                {\r\n                    var executables = await Playnite.Common.Programs.GetExecutablesFromFolder(path, SearchOption.AllDirectories, progArgs.CancelToken);\r\n                    if (executables != null)\r\n                    {\r\n                        var apps = executables.Select(a => new ImportableProgram(a, ProgramType.Win32)).OrderBy(a => a.Item.Name);\r\n                        progArgs.MainContext.Send(_ =>\r\n                        {\r\n                            Programs.Clear();\r\n                            Programs.AddRange(apps);\r\n                        }, null);\r\n                    }\r\n                }\r\n                catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(exc, \"Failed to scan folder for executables: \" + path);\r\n                }\r\n            }, new GlobalProgressOptions(LOC.EmuWizardScanning, true));\r\n        }\r\n\r\n        public static List<Game> AddImportableGamesToDb(List<GameMetadata> games, IGameDatabaseMain database)\r\n        {\r\n            var statusSettings = database.GetCompletionStatusSettings();\r\n            using (var buffer = database.BufferedUpdate())\r\n            {\r\n                var addedGames = new List<Game>();\r\n                foreach (var game in games)\r\n                {\r\n                    var added = database.ImportGame(game);\r\n                    if (statusSettings.DefaultStatus != Guid.Empty)\r\n                    {\r\n                        added.CompletionStatusId = statusSettings.DefaultStatus;\r\n                        database.Games.Update(added);\r\n                    }\r\n\r\n                    addedGames.Add(added);\r\n                }\r\n\r\n                return addedGames;\r\n            }\r\n        }\r\n\r\n        private bool ListFilter(object item)\r\n        {\r\n            var program = (ImportableProgram)item;\r\n            if (HideImported)\r\n            {\r\n                return !importedExes.ContainsString(program.Item.Path + program.Item.Arguments ?? string.Empty, StringComparison.OrdinalIgnoreCase);\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/ItemSelectionWithSearchViewModel.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.Windows;\r\nusing Playnite.SDK.Plugins;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class ItemSelectionWithSearchViewModel : ObservableObject\r\n    {\r\n        public string WindowTitle { get; set; }\r\n\r\n        private string searchTerm;\r\n        public string SearchTerm\r\n        {\r\n            get => searchTerm;\r\n            set\r\n            {\r\n                searchTerm = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<GenericItemOption> searchResults = new ObservableCollection<GenericItemOption>();\r\n        public ObservableCollection<GenericItemOption> SearchResults\r\n        {\r\n            get\r\n            {\r\n                return searchResults;\r\n            }\r\n\r\n            set\r\n            {\r\n                searchResults = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private GenericItemOption selectedResult;\r\n        public GenericItemOption SelectedResult\r\n        {\r\n            get => selectedResult;\r\n            set\r\n            {\r\n                selectedResult = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> CloseCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView(false);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            }, (a) => SelectedResult != null);\r\n        }\r\n\r\n        public RelayCommand<object> SearchCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                Search();\r\n            }, (a) => !string.IsNullOrEmpty(SearchTerm));\r\n        }\r\n\r\n        public RelayCommand<object> ItemDoubleClickCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            });\r\n        }\r\n\r\n        public RelayCommand WindowOpenedCommand\r\n        {\r\n            get => new RelayCommand(() => Search());\r\n        }\r\n\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private readonly Func<string, List<GenericItemOption>> searchFunction;\r\n\r\n        public ItemSelectionWithSearchViewModel(\r\n            IWindowFactory window,\r\n            Func<string, List<GenericItemOption>> searchFunction,\r\n            string defaultSearch = null,\r\n            string caption = null)\r\n        {\r\n            this.window = window;\r\n            this.searchFunction = searchFunction;\r\n            SearchTerm = defaultSearch;\r\n            if (caption.IsNullOrEmpty())\r\n            {\r\n                WindowTitle = ResourceProvider.GetString(\"LOCSelectItemTitle\");\r\n            }\r\n            else\r\n            {\r\n                WindowTitle = caption;\r\n            }\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView(bool? result)\r\n        {\r\n            window.Close(result);\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            CloseView(true);\r\n        }\r\n\r\n        public void Search()\r\n        {\r\n            Dialogs.ActivateGlobalProgress(\r\n                _ => SearchResults = SearchForResults(SearchTerm),\r\n                new GlobalProgressOptions(LOC.LoadingLabel, false));\r\n        }\r\n\r\n        private ObservableCollection<GenericItemOption> SearchForResults(string keyword)\r\n        {\r\n            List<GenericItemOption> result = null;\r\n\r\n            try\r\n            {\r\n                result = searchFunction(keyword);\r\n            }\r\n            catch (Exception exc) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(exc, $\"searchFunction method failed.\");\r\n            }\r\n\r\n            return result?.ToObservable();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/LibraryIntegrationsViewModel.cs",
    "content": "﻿using Playnite.Database;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class LibraryIntegrationsViewModel : ObservableObject\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private IDialogsFactory dialogs;\r\n        private IResourceProvider resources;\r\n        private readonly ExtensionFactory extensions;\r\n        private bool closingHanled = false;\r\n\r\n        private Dictionary<Guid, PluginSettingsItem> loadedPluginSettings = new Dictionary<Guid, PluginSettingsItem>();\r\n\r\n        public RelayCommand<SelectionChangedEventArgs> LibraryItemChangedCommand\r\n        {\r\n            get => new RelayCommand<SelectionChangedEventArgs>((a) =>\r\n            {\r\n                LibraryItemChanged(a);\r\n            });\r\n        }\r\n\r\n        public List<LibraryPlugin> LibraryPlugins { get; set; }\r\n\r\n        private UserControl selectedSectionView;\r\n        public UserControl SelectedSectionView\r\n        {\r\n            get => selectedSectionView;\r\n            set\r\n            {\r\n                selectedSectionView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> WindowClosingCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                WindowClosing();\r\n            });\r\n        }\r\n\r\n        public LibraryIntegrationsViewModel(\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ExtensionFactory extensions)\r\n        {\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            this.extensions = extensions;\r\n            LibraryPlugins = extensions.LibraryPlugins.OrderBy(a => a.Name).ToList();\r\n            SelectedSectionView = new Controls.SettingsSections.LibrariesConfigWindowInfo() { DataContext = this }; ;\r\n        }\r\n\r\n        private void LibraryItemChanged(SelectionChangedEventArgs args)\r\n        {\r\n            if (args.AddedItems.Count == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var item = args.AddedItems[0];\r\n            if (item is Plugin plugin)\r\n            {\r\n                SelectedSectionView = PluginSettingsHelper.GetPluginSettingsView(plugin.Id, extensions, loadedPluginSettings);\r\n            }\r\n            else\r\n            {\r\n                throw new NotSupportedException();\r\n            }\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView()\r\n        {\r\n            foreach (var plugin in loadedPluginSettings.Values)\r\n            {\r\n                plugin.Settings.CancelEdit();\r\n            }\r\n\r\n            closingHanled = true;\r\n            window.Close(false);\r\n        }\r\n\r\n        public void WindowClosing()\r\n        {\r\n            if (!closingHanled)\r\n            {\r\n                foreach (var plugin in loadedPluginSettings.Values)\r\n                {\r\n                    plugin.Settings.CancelEdit();\r\n                }\r\n            }\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            var verResult = PluginSettingsHelper.VerifyPluginSettings(loadedPluginSettings);\r\n            if (!verResult.Item1)\r\n            {\r\n                dialogs.ShowErrorMessage(string.Join(Environment.NewLine, verResult.Item2), \"\");\r\n                return;\r\n            }\r\n\r\n            foreach (var plugin in loadedPluginSettings.Values)\r\n            {\r\n                plugin.Settings.EndEdit();\r\n            }\r\n\r\n            closingHanled = true;\r\n            window.Close(true);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/MetadataComparisonViewModel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Common.Media.Icons;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Diagnostics;\r\nusing System.Drawing.Imaging;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public enum MetadataChangeDataSource\r\n    {\r\n        Current,\r\n        New\r\n    }\r\n\r\n    public class MetadataComparisonViewModel : ObservableObject\r\n    {\r\n        public class DiffItem : ObservableObject\r\n        {\r\n            private bool enabled = false;\r\n            public bool Enabled\r\n            {\r\n                get\r\n                {\r\n                    return enabled;\r\n                }\r\n\r\n                set\r\n                {\r\n                    enabled = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n\r\n            private MetadataChangeDataSource source = MetadataChangeDataSource.New;\r\n            public MetadataChangeDataSource Source\r\n            {\r\n                get\r\n                {\r\n                    return source;\r\n                }\r\n\r\n                set\r\n                {\r\n                    source = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n        }\r\n\r\n        public class ListDiffItem<T> : DiffItem where T : DatabaseObject\r\n        {\r\n            public List<SelectableItem<T>> Current { get; set; }\r\n            public List<SelectableItem<T>> New { get; set; }\r\n        }\r\n\r\n        public class ListObjectItem<T> : DiffItem\r\n        {\r\n            public List<SelectableItem<T>> Current { get; set; }\r\n            public List<SelectableItem<T>> New { get; set; }\r\n        }\r\n\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private IDialogsFactory dialogs;\r\n        private IResourceProvider resources;\r\n        private List<GameField> diffFields;\r\n\r\n        public Game CurrentGame { get; set; }\r\n        public ComparableMetadatGameData NewGame { get; set; }\r\n\r\n        public DiffItem Name { get; } = new DiffItem();\r\n        public DiffItem Description { get; } = new DiffItem();\r\n        public DiffItem CommunityScore { get; } = new DiffItem();\r\n        public DiffItem CriticScore { get; } = new DiffItem();\r\n        public DiffItem ReleaseDate { get; } = new DiffItem();\r\n        public DiffItem InstallSize { get; } = new DiffItem();\r\n        public ListDiffItem<AgeRating> AgeRatings { get; } = new ListDiffItem<AgeRating>();\r\n        public ListDiffItem<Region> Regions { get; } = new ListDiffItem<Region>();\r\n        public ListDiffItem<Series> Series { get; } = new ListDiffItem<Series>();\r\n        public ListDiffItem<Platform> Platforms { get; } = new ListDiffItem<Platform>();\r\n        public ListDiffItem<Genre> Genres { get; } = new ListDiffItem<Genre>();\r\n        public ListDiffItem<Tag> Tags { get; } = new ListDiffItem<Tag>();\r\n        public ListDiffItem<Company> Developers { get; } = new ListDiffItem<Company>();\r\n        public ListDiffItem<Company> Publishers { get; } = new ListDiffItem<Company>();\r\n        public ListDiffItem<GameFeature> Features { get; } = new ListDiffItem<GameFeature>();\r\n        public ListObjectItem<Link> Links { get; } = new ListObjectItem<Link>();\r\n        public DiffItem Icon { get; } = new DiffItem();\r\n        public DiffItem Cover { get; } = new DiffItem();\r\n        public DiffItem Background { get; } = new DiffItem();\r\n\r\n        public object CurrentIcon { get; set; }\r\n        public string CurrentIconDimensions { get; set; }\r\n        public object NewIcon { get; set; }\r\n        public string NewIconDimensions { get; set; }\r\n        public object CurrentCover { get; set; }\r\n        public string CurrentCoverDimensions { get; set; }\r\n        public object NewCover { get; set; }\r\n        public string NewCoverDimensions { get; set; }\r\n        public object CurrentBackground { get; set; }\r\n        public string CurrentBackgroundDimensions { get; set; }\r\n        public object NewBackground { get; set; }\r\n        public string NewBackgroundDimensions { get; set; }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SelectAllCurrentCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectAllCurrent();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SelectAllNewCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectAllNew();\r\n            });\r\n        }\r\n\r\n        public ComparableMetadatGameData ResultMetadata { get; private set; }\r\n\r\n        public MetadataComparisonViewModel(\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            Game currentData,\r\n            ComparableMetadatGameData newData,\r\n            List<GameField> diffFields)\r\n        {\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            this.diffFields = diffFields;\r\n            CurrentGame = currentData;\r\n            NewGame = newData;\r\n\r\n            if (diffFields.Contains(GameField.Name))\r\n            {\r\n                Name.Enabled = true;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Description))\r\n            {\r\n                Description.Enabled = true;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.ReleaseDate))\r\n            {\r\n                ReleaseDate.Enabled = true;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.CriticScore))\r\n            {\r\n                CriticScore.Enabled = true;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.CommunityScore))\r\n            {\r\n                CommunityScore.Enabled = true;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.InstallSize))\r\n            {\r\n                InstallSize.Enabled = true;\r\n            }\r\n\r\n            void loadNewListData<T>(ListDiffItem<T> list, List<T> currentGameData, List<T> newGameData, GameField field) where T : DatabaseObject\r\n            {\r\n                if (diffFields.Contains(field))\r\n                {\r\n                    list.Enabled = true;\r\n                    list.New = newGameData.Select(a => new SelectableItem<T>(a) { Selected = true }).ToList();\r\n                    if (currentGameData.HasItems())\r\n                    {\r\n                        list.Current = currentGameData.Select(a => new SelectableItem<T>(a)).ToList();\r\n                    }\r\n                }\r\n            }\r\n\r\n            loadNewListData(AgeRatings, CurrentGame.AgeRatings, NewGame.AgeRatings, GameField.AgeRatings);\r\n            loadNewListData(Series, CurrentGame.Series, NewGame.Series, GameField.Series);\r\n            loadNewListData(Regions, CurrentGame.Regions, NewGame.Regions, GameField.Regions);\r\n            loadNewListData(Platforms, CurrentGame.Platforms, NewGame.Platforms, GameField.Platforms);\r\n            loadNewListData(Developers, CurrentGame.Developers, NewGame.Developers, GameField.Developers);\r\n            loadNewListData(Publishers, CurrentGame.Publishers, NewGame.Publishers, GameField.Publishers);\r\n            loadNewListData(Tags, CurrentGame.Tags, NewGame.Tags, GameField.Tags);\r\n            loadNewListData(Features, CurrentGame.Features, NewGame.Features, GameField.Features);\r\n            loadNewListData(Genres, CurrentGame.Genres, NewGame.Genres, GameField.Genres);\r\n\r\n            if (diffFields.Contains(GameField.Links))\r\n            {\r\n                Links.Enabled = true;\r\n                Links.New = NewGame.Links.Select(a => new SelectableItem<Link>(a) { Selected = true }).ToList();\r\n                if (CurrentGame.Links.HasItems())\r\n                {\r\n                    Links.Current = CurrentGame.Links.Select(a => new SelectableItem<Link>(a)).ToList();\r\n                }\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Icon))\r\n            {\r\n                Icon.Enabled = true;\r\n                CurrentIcon = ImageSourceManager.GetImage(CurrentGame.Icon, false, new BitmapLoadProperties(256, 256));\r\n                CurrentIconDimensions = GetImageProperties(CurrentGame.Icon)?.Item1;\r\n                NewIcon = ImageSourceManager.GetImage(newData.Icon.Path, false, new BitmapLoadProperties(256, 256));\r\n                NewIconDimensions = GetImageProperties(newData.Icon.Path)?.Item1;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.CoverImage))\r\n            {\r\n                Cover.Enabled = true;\r\n                CurrentCover = ImageSourceManager.GetImage(CurrentGame.CoverImage, false, new BitmapLoadProperties(900, 900));\r\n                CurrentCoverDimensions = GetImageProperties(CurrentGame.CoverImage)?.Item1;\r\n                NewCover = ImageSourceManager.GetImage(newData.CoverImage.Path, false, new BitmapLoadProperties(900, 900));\r\n                NewCoverDimensions = GetImageProperties(newData.CoverImage.Path)?.Item1;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.BackgroundImage))\r\n            {\r\n                Background.Enabled = true;\r\n                CurrentBackground = ImageSourceManager.GetImage(CurrentGame.BackgroundImage, false, new BitmapLoadProperties(1920, 1080));\r\n                CurrentBackgroundDimensions = GetImageProperties(CurrentGame.BackgroundImage)?.Item1;\r\n                NewBackground = ImageSourceManager.GetImage(newData.BackgroundImage.Path, false, new BitmapLoadProperties(1920, 1080));\r\n                NewBackgroundDimensions = GetImageProperties(newData.BackgroundImage.Path)?.Item1;\r\n            }\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView()\r\n        {\r\n            window.Close(false);\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            ResultMetadata = NewGame.GetClone();\r\n\r\n            if (diffFields.Contains(GameField.Name) && Name.Source == MetadataChangeDataSource.Current)\r\n            {\r\n                ResultMetadata.Name = null;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Description) && Description.Source == MetadataChangeDataSource.Current)\r\n            {\r\n                ResultMetadata.Description = null;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.CommunityScore) && CommunityScore.Source == MetadataChangeDataSource.Current)\r\n            {\r\n                ResultMetadata.CommunityScore = null;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.CriticScore) && CriticScore.Source == MetadataChangeDataSource.Current)\r\n            {\r\n                ResultMetadata.CriticScore = null;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.ReleaseDate) && ReleaseDate.Source == MetadataChangeDataSource.Current)\r\n            {\r\n                ResultMetadata.ReleaseDate = null;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.InstallSize) && InstallSize.Source == MetadataChangeDataSource.Current)\r\n            {\r\n                ResultMetadata.InstallSize = null;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.AgeRatings))\r\n            {\r\n                ResultMetadata.AgeRatings = ConsolidateDbListSources(AgeRatings.Current, AgeRatings.New);\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Regions))\r\n            {\r\n                ResultMetadata.Regions = ConsolidateDbListSources(Regions.Current, Regions.New);\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Series))\r\n            {\r\n                ResultMetadata.Series = ConsolidateDbListSources(Series.Current, Series.New);\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Platforms))\r\n            {\r\n                ResultMetadata.Platforms = ConsolidateDbListSources(Platforms.Current, Platforms.New);\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Links))\r\n            {\r\n                ResultMetadata.Links = ConsolidateGenericListSources(Links.Current, Links.New);\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Developers))\r\n            {\r\n                ResultMetadata.Developers = ConsolidateDbListSources(Developers.Current, Developers.New);\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Publishers))\r\n            {\r\n                ResultMetadata.Publishers = ConsolidateDbListSources(Publishers.Current, Publishers.New);\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Tags))\r\n            {\r\n                ResultMetadata.Tags = ConsolidateDbListSources(Tags.Current, Tags.New);\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Features))\r\n            {\r\n                ResultMetadata.Features = ConsolidateDbListSources(Features.Current, Features.New);\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Genres))\r\n            {\r\n                ResultMetadata.Genres = ConsolidateDbListSources(Genres.Current, Genres.New);\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.Icon) && Icon.Source == MetadataChangeDataSource.Current)\r\n            {\r\n                ResultMetadata.Icon = null;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.CoverImage) && Cover.Source == MetadataChangeDataSource.Current)\r\n            {\r\n                ResultMetadata.CoverImage = null;\r\n            }\r\n\r\n            if (diffFields.Contains(GameField.BackgroundImage) && Background.Source == MetadataChangeDataSource.Current)\r\n            {\r\n                ResultMetadata.BackgroundImage = null;\r\n            }\r\n\r\n            window.Close(true);\r\n        }\r\n\r\n        private List<T> ConsolidateGenericListSources<T>(List<SelectableItem<T>> source, List<SelectableItem<T>> other)\r\n        {\r\n            var res = new List<T>();\r\n            if (source.HasItems())\r\n            {\r\n                var srcItems = source.Where(a => a.Selected == true).Select(a => a.Item);\r\n                if (srcItems.HasItems())\r\n                {\r\n                    res.AddRange(srcItems);\r\n                }\r\n            }\r\n\r\n            if (other.HasItems())\r\n            {\r\n                var srcItems = other.Where(a => a.Selected == true).Select(a => a.Item);\r\n                if (srcItems.HasItems())\r\n                {\r\n                    res.AddRange(srcItems.ToList());\r\n                }\r\n            }\r\n\r\n            return res;\r\n        }\r\n\r\n        private List<T> ConsolidateDbListSources<T>(List<SelectableItem<T>> source, List<SelectableItem<T>> other) where T : DatabaseObject\r\n        {\r\n            var res = new List<T>();\r\n            if (source.HasItems())\r\n            {\r\n                var srcItems = source.Where(a => a.Selected == true).Select(a => a.Item);\r\n                if (srcItems.HasItems())\r\n                {\r\n                    res.AddRange(srcItems);\r\n                }\r\n            }\r\n\r\n            if (other.HasItems())\r\n            {\r\n                var srcItems = other.Where(a => a.Selected == true).Select(a => a.Item);\r\n                if (srcItems.HasItems())\r\n                {\r\n                    res.AddMissing(srcItems.ToList());\r\n                }\r\n            }\r\n\r\n            return res;\r\n        }\r\n\r\n        private Tuple<string, ImageProperties> GetImageProperties(string image)\r\n        {\r\n            try\r\n            {\r\n                var imagePath = ImageSourceManager.GetImagePath(image);\r\n                if (!imagePath.IsNullOrEmpty())\r\n                {\r\n                    var props = Images.GetImageProperties(imagePath);\r\n                    return new Tuple<string, ImageProperties>($\"{props?.Width}x{props.Height}px\", props);\r\n                }\r\n                else\r\n                {\r\n                    return null;\r\n                }\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, $\"Failed to get metadata from image  {image}\");\r\n                return null;\r\n            }\r\n        }\r\n\r\n        private void SelectAllCurrent()\r\n        {\r\n            SetSelection(MetadataChangeDataSource.Current);\r\n        }\r\n\r\n        private void SelectAllNew()\r\n        {\r\n            SetSelection(MetadataChangeDataSource.New);\r\n        }\r\n\r\n        private void SetSelection(MetadataChangeDataSource source)\r\n        {\r\n            Name.Source = source;\r\n            Description.Source = source;\r\n            CommunityScore.Source = source;\r\n            CriticScore.Source = source;\r\n            ReleaseDate.Source = source;\r\n            InstallSize.Source = source;\r\n            Icon.Source = source;\r\n            Cover.Source = source;\r\n            Background.Source = source;\r\n            AgeRatings.Current?.ForEach(a => a.Selected = source == MetadataChangeDataSource.Current);\r\n            AgeRatings.New?.ForEach(a => a.Selected = source == MetadataChangeDataSource.New);\r\n            Regions.Current?.ForEach(a => a.Selected = source == MetadataChangeDataSource.Current);\r\n            Regions.New?.ForEach(a => a.Selected = source == MetadataChangeDataSource.New);\r\n            Series.Current?.ForEach(a => a.Selected = source == MetadataChangeDataSource.Current);\r\n            Series.New?.ForEach(a => a.Selected = source == MetadataChangeDataSource.New);\r\n            Platforms.Current?.ForEach(a => a.Selected = source == MetadataChangeDataSource.Current);\r\n            Platforms.New?.ForEach(a => a.Selected = source == MetadataChangeDataSource.New);\r\n            Genres.Current?.ForEach(a => a.Selected = source == MetadataChangeDataSource.Current);\r\n            Genres.New?.ForEach(a => a.Selected = source == MetadataChangeDataSource.New);\r\n            Tags.Current?.ForEach(a => a.Selected = source == MetadataChangeDataSource.Current);\r\n            Tags.New?.ForEach(a => a.Selected = source == MetadataChangeDataSource.New);\r\n            Developers.Current?.ForEach(a => a.Selected = source == MetadataChangeDataSource.Current);\r\n            Developers.New?.ForEach(a => a.Selected = source == MetadataChangeDataSource.New);\r\n            Publishers.Current?.ForEach(a => a.Selected = source == MetadataChangeDataSource.Current);\r\n            Publishers.New?.ForEach(a => a.Selected = source == MetadataChangeDataSource.New);\r\n            Features.Current?.ForEach(a => a.Selected = source == MetadataChangeDataSource.Current);\r\n            Features.New?.ForEach(a => a.Selected = source == MetadataChangeDataSource.New);\r\n            Links.Current?.ForEach(a => a.Selected = source == MetadataChangeDataSource.Current);\r\n            Links.New?.ForEach(a => a.Selected = source == MetadataChangeDataSource.New);\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/MetadataDownloadViewModel.cs",
    "content": "﻿using Playnite.Metadata;\r\nusing Playnite.SDK;\r\nusing Playnite.Windows;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class MetadataDownloadViewModel : ObservableObject\r\n    {\r\n        public enum ViewMode\r\n        {\r\n            Wizard,\r\n            Manual\r\n        }\r\n\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private readonly IResourceProvider resources;\r\n\r\n        public bool SaveAsDefault { get; set; }\r\n\r\n        private int viewTabIndex = 0;\r\n        public int ViewTabIndex\r\n        {\r\n            get => viewTabIndex;\r\n            set\r\n            {\r\n                viewTabIndex = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowDownloadButton));\r\n                OnPropertyChanged(nameof(ShowNextButton));\r\n                OnPropertyChanged(nameof(ShowBackButton));\r\n                OnPropertyChanged(nameof(ShowFinishButton));\r\n            }\r\n        }\r\n\r\n        public bool ShowDownloadButton\r\n        {\r\n            get => Mode == ViewMode.Manual && ViewTabIndex == 1;\r\n        }\r\n\r\n        public bool ShowFinishButton\r\n        {\r\n            get => Mode == ViewMode.Wizard && ViewTabIndex == 1;\r\n        }\r\n\r\n        public bool ShowNextButton\r\n        {\r\n            get => Mode == ViewMode.Manual && ViewTabIndex == 0;\r\n        }\r\n\r\n        public bool ShowBackButton\r\n        {\r\n            get => Mode == ViewMode.Manual && ViewTabIndex == 1;\r\n        }\r\n\r\n        private ViewMode mode;\r\n        public ViewMode Mode\r\n        {\r\n            get\r\n            {\r\n                return mode;\r\n            }\r\n\r\n            set\r\n            {\r\n                mode = value;\r\n                ViewTabIndex = mode == ViewMode.Manual ? 0 : 1;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ShowDownloadButton));\r\n                OnPropertyChanged(nameof(ShowNextButton));\r\n                OnPropertyChanged(nameof(ShowBackButton));\r\n                OnPropertyChanged(nameof(ShowFinishButton));\r\n            }\r\n        }\r\n\r\n        private MetadataDownloaderSettings settings = new MetadataDownloaderSettings();\r\n        public MetadataDownloaderSettings Settings\r\n        {\r\n            get\r\n            {\r\n                return settings;\r\n            }\r\n\r\n            set\r\n            {\r\n                settings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> DownloadCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView(true);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView(false);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> NextCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                Next();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> BackCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                Back();\r\n            });\r\n        }\r\n\r\n        public MetadataDownloadViewModel(IWindowFactory window, IResourceProvider resources)\r\n        {\r\n            this.window = window;\r\n            this.resources = resources;\r\n        }\r\n\r\n        public bool? OpenView(ViewMode mode, MetadataDownloaderSettings settings)\r\n        {\r\n            Mode = mode;\r\n            Settings = settings;\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView(bool success)\r\n        {\r\n            if (success && !CanDownloadData())\r\n            {\r\n                Dialogs.ShowErrorMessage(resources.GetString(LOC.MetaNoFieldsSelectedErrorMessage), resources.GetString(LOC.MetaNoFieldsSelectedErrorCaption));\r\n                return;\r\n            }\r\n\r\n            if (success && SaveAsDefault)\r\n            {\r\n                PlayniteApplication.Current.AppSettings.MetadataSettings = Settings;\r\n                PlayniteApplication.Current.AppSettings.SaveSettings();\r\n            }\r\n\r\n            window.Close(success);\r\n        }\r\n\r\n        public void Next()\r\n        {\r\n            ViewTabIndex = 1;\r\n        }\r\n\r\n        public void Back()\r\n        {\r\n            ViewTabIndex = 0;\r\n        }\r\n\r\n        private bool CanDownloadData()\r\n        {\r\n            return CanDownloadData(Settings.AgeRating)\r\n                || CanDownloadData(Settings.BackgroundImage)\r\n                || CanDownloadData(Settings.CommunityScore)\r\n                || CanDownloadData(Settings.CoverImage)\r\n                || CanDownloadData(Settings.CriticScore)\r\n                || CanDownloadData(Settings.Description)\r\n                || CanDownloadData(Settings.Developer)\r\n                || CanDownloadData(Settings.Feature)\r\n                || CanDownloadData(Settings.Genre)\r\n                || CanDownloadData(Settings.Icon)\r\n                || CanDownloadData(Settings.InstallSize)\r\n                || CanDownloadData(Settings.Links)\r\n                || CanDownloadData(Settings.Name)\r\n                || CanDownloadData(Settings.Platform)\r\n                || CanDownloadData(Settings.Publisher)\r\n                || CanDownloadData(Settings.Region)\r\n                || CanDownloadData(Settings.ReleaseDate)\r\n                || CanDownloadData(Settings.Series)\r\n                || CanDownloadData(Settings.Tag);\r\n        }\r\n\r\n        private static bool CanDownloadData(MetadataFieldSettings fieldSettings)\r\n        {\r\n            return fieldSettings.Import && fieldSettings.Sources.Any();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/PluginSettingsViewModel.cs",
    "content": "﻿using Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class PluginSettingsViewModel : ObservableObject\r\n    {\r\n        private readonly IWindowFactory window;\r\n        private readonly IResourceProvider resources;\r\n        private readonly ExtensionFactory extensions;\r\n        private readonly IDialogsFactory dialogs;\r\n        private ISettings currentSettings;\r\n        private bool closingHanled = false;\r\n\r\n        private string title;\r\n        public string Title\r\n        {\r\n            get => title;\r\n            set\r\n            {\r\n                title = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private UserControl settingsView;\r\n        public UserControl SettingsView\r\n        {\r\n            get => settingsView;\r\n            set\r\n            {\r\n                settingsView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> WindowClosingCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                WindowClosing();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            });\r\n        }\r\n\r\n        public PluginSettingsViewModel(\r\n            IWindowFactory window,\r\n            IResourceProvider resources,\r\n            IDialogsFactory dialogs,\r\n            ExtensionFactory extensions,\r\n            Guid pluginId)\r\n        {\r\n            this.window = window;\r\n            this.resources = resources;\r\n            this.extensions = extensions;\r\n            this.dialogs = dialogs;\r\n\r\n            if (extensions.Plugins.TryGetValue(pluginId, out var plugin))\r\n            {\r\n                var title = plugin.Description.Name;\r\n                if (plugin.Plugin is LibraryPlugin library)\r\n                {\r\n                    title = library.Name;\r\n                }\r\n                else if (plugin.Plugin is MetadataPlugin metadata)\r\n                {\r\n                    title = metadata.Name;\r\n                }\r\n\r\n                currentSettings = plugin.Plugin.GetSettings(false);\r\n                var provView = plugin.Plugin.GetSettingsView(false);\r\n                if (currentSettings != null && provView != null)\r\n                {\r\n                    provView.DataContext = currentSettings;\r\n                    SettingsView = provView;\r\n                }\r\n                else\r\n                {\r\n                    SettingsView = new Controls.SettingsSections.NoSettingsAvailable();\r\n                }\r\n\r\n                Title = title + \" \" + resources.GetString(\"LOCSettingsLabel\");\r\n            }\r\n            else\r\n            {\r\n                SettingsView = new Controls.SettingsSections.NoSettingsAvailable();\r\n                Title = resources.GetString(\"LOCSettingsNoSettingsAvailable\");\r\n            }\r\n\r\n            currentSettings?.BeginEdit();\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView()\r\n        {\r\n            currentSettings?.CancelEdit();\r\n            closingHanled = true;\r\n            window.Close(false);\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            if (currentSettings != null)\r\n            {\r\n                if (!currentSettings.VerifySettings(out var errors))\r\n                {\r\n                    dialogs.ShowErrorMessage(string.Join(Environment.NewLine, errors), \"\");\r\n                    return;\r\n                }\r\n\r\n                currentSettings.EndEdit();\r\n            }\r\n\r\n            closingHanled = true;\r\n            window.Close(true);\r\n        }\r\n\r\n        public void WindowClosing()\r\n        {\r\n            if (!closingHanled)\r\n            {\r\n                currentSettings?.CancelEdit();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/SettingsViewModel.cs",
    "content": "﻿using Playnite;\r\nusing Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Settings;\r\nusing Playnite.Commands;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing Playnite.Windows;\r\nusing Playnite.DesktopApp.Markup;\r\nusing System.Text.RegularExpressions;\r\nusing Playnite.DesktopApp.Controls;\r\nusing System.Diagnostics;\r\nusing Playnite.SDK.Exceptions;\r\nusing Playnite.Scripting.PowerShell;\r\nusing System.Collections.ObjectModel;\r\nusing Playnite.Converters;\r\nusing System.Globalization;\r\nusing Playnite.Input;\r\nusing Playnite.SDK.Models;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class SelectableTrayIcon\r\n    {\r\n        public TrayIconType TrayIcon { get; }\r\n        public object ImageSource { get; }\r\n\r\n        public SelectableTrayIcon(TrayIconType trayIcon)\r\n        {\r\n            TrayIcon = trayIcon;\r\n            ImageSource = ResourceProvider.GetResource(TrayIcon.GetDescription());\r\n        }\r\n    }\r\n\r\n    public class SearchSupportSettings : SearchSupport\r\n    {\r\n        public string SearchId { get; set; }\r\n        public new string Keyword { get; set; }\r\n\r\n        public SearchSupportSettings(LoadedPlugin plugin, SearchSupport support, Dictionary<string, string> customMap) : base(support.DefaultKeyword, support.Name, support.Context)\r\n        {\r\n            SearchId = plugin.Description.Id + support.DefaultKeyword;\r\n            if (customMap?.ContainsKey(SearchId) == true)\r\n            {\r\n                Keyword = customMap[SearchId];\r\n            }\r\n        }\r\n    }\r\n\r\n    public class SettingsViewModel : ObservableObject\r\n    {\r\n        internal static ILogger logger = LogManager.GetLogger();\r\n        internal IWindowFactory window;\r\n        internal IResourceProvider resources;\r\n        internal IDialogsFactory dialogs;\r\n        internal IGameDatabaseMain database;\r\n        internal PlayniteSettings originalSettings;\r\n        internal PlayniteApplication application;\r\n        internal List<string> editedFields = new List<string>();\r\n        internal bool closingHanled = false;\r\n\r\n        public List<SelectableItem<LibraryPlugin>> AutoCloseClientsList { get; } = new List<SelectableItem<LibraryPlugin>>();\r\n\r\n        private UserControl selectedSectionView;\r\n        public UserControl SelectedSectionView\r\n        {\r\n            get => selectedSectionView;\r\n            set\r\n            {\r\n                selectedSectionView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private PlayniteSettings settings;\r\n        public PlayniteSettings Settings\r\n        {\r\n            get => settings;\r\n            set\r\n            {\r\n                settings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public ObservableCollection<ImportExclusionItem> ImportExclusionList { get; }\r\n        public ObservableCollection<string> SortingNameRemovedArticles { get; }\r\n        public ObservableCollection<GameControllerManager.LoadedGameController> Controllers { get; }\r\n\r\n        public List<LoadedPlugin> GenericPlugins\r\n        {\r\n            get; private set;\r\n        }\r\n\r\n        public List<ThemeManifest> AvailableThemes\r\n        {\r\n            get => ThemeManager.GetAvailableThemes(ApplicationMode.Desktop).OrderBy(a => a.Name).ToList();\r\n        }\r\n\r\n        public List<PlayniteLanguage> AvailableLanguages\r\n        {\r\n            get => Localization.AvailableLanguages;\r\n        }\r\n\r\n        public List<string> AvailableFonts\r\n        {\r\n            get => System.Drawing.FontFamily.Families.Where(a => !a.Name.IsNullOrEmpty()).Select(a => a.Name).ToList();\r\n        }\r\n\r\n        public List<SelectableTrayIcon> AvailableTrayIcons\r\n        {\r\n            get;\r\n            private set;\r\n        } = new List<SelectableTrayIcon>();\r\n\r\n        public List<SearchSupportSettings> Searches { get; } = new List<SearchSupportSettings>();\r\n\r\n        private readonly Dictionary<DesktopSettingsPage, UserControl> sectionViews;\r\n\r\n        #region Commands\r\n\r\n        public RelayCommand<object> SelectDbFileCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                SelectDbFile();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ClearWebCacheCommand\r\n        {\r\n            get => new RelayCommand<object>((url) =>\r\n            {\r\n                ClearWebcache();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<string> SetCoverArtAspectRatioCommand\r\n        {\r\n            get => new RelayCommand<string>((ratio) =>\r\n            {\r\n                SetCoverArtAspectRatio(ratio);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SetDefaultFontSizes\r\n        {\r\n            get => new RelayCommand<object>((ratio) =>\r\n            {\r\n                Settings.FontSize = 14;\r\n                Settings.FontSizeSmall = 12;\r\n                Settings.FontSizeLarge = 15;\r\n                Settings.FontSizeLarger = 20;\r\n                Settings.FontSizeLargest = 29;\r\n            });\r\n        }\r\n\r\n        public RelayCommand AddDevelExtensionCommand\r\n        {\r\n            get => new RelayCommand(() =>\r\n            {\r\n                Settings.DevelExtenions.Add(new SelectableItem<string>(\"<change me>\") { Selected = true });\r\n                Settings.DevelExtenions = Settings.DevelExtenions.GetClone();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<SelectableItem<string>> RemoveDevelExtensionCommand\r\n        {\r\n            get => new RelayCommand<SelectableItem<string>>((item) =>\r\n            {\r\n                Settings.DevelExtenions.Remove(item);\r\n                Settings.DevelExtenions = Settings.DevelExtenions.GetClone();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<RoutedPropertyChangedEventArgs<object>> SettingsTreeSelectedItemChangedCommand\r\n        {\r\n            get => new RelayCommand<RoutedPropertyChangedEventArgs<object>>((a) =>\r\n            {\r\n                SettingsTreeSelectedItemChanged(a);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> SetDefaultsCommand\r\n        {\r\n            get => new RelayCommand<object>((ratio) =>\r\n            {\r\n                SetDefaults();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<string> TestScriptCommand\r\n        {\r\n            get => new RelayCommand<string>((a) =>\r\n            {\r\n                TestScript(a);\r\n            }, (a) => !a.IsNullOrEmpty());\r\n        }\r\n\r\n        private readonly List<ImportExclusionItem> removedExclusionItems = new List<ImportExclusionItem>();\r\n        public RelayCommand<IList<object>> RemoveImportExclusionItemCommand\r\n        {\r\n            get => new RelayCommand<IList<object>>((items) =>\r\n            {\r\n                foreach (ImportExclusionItem item in items.ToList())\r\n                {\r\n                    ImportExclusionList.Remove(item);\r\n                    removedExclusionItems.Add(item);\r\n                }\r\n            }, (items) => items != null && items.Count > 0);\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> WindowClosingCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n            });\r\n        }\r\n\r\n        public RelayCommand AddSortingNameRemovedArticle\r\n        {\r\n            get => new RelayCommand(() =>\r\n            {\r\n                var res = dialogs.SelectString(\r\n                    resources.GetString(LOC.EnterName),\r\n                    resources.GetString(LOC.AddNewItem),\r\n                    string.Empty);\r\n                if (res.Result && !res.SelectedString.IsNullOrEmpty())\r\n                {\r\n                    if (SortingNameRemovedArticles.Any(a => a.Equals(res.SelectedString, StringComparison.InvariantCultureIgnoreCase)))\r\n                    {\r\n                        dialogs.ShowErrorMessage(resources.GetString(LOC.ItemAlreadyExists), string.Empty);\r\n                    }\r\n                    else\r\n                    {\r\n                        SortingNameRemovedArticles.Add(res.SelectedString);\r\n                    }\r\n                }\r\n            });\r\n        }\r\n\r\n        public RelayCommand<IList<object>> RemoveSortingNameRemovedArticle\r\n        {\r\n            get => new RelayCommand<IList<object>>((selectedItems) =>\r\n            {\r\n                var selectedStrings = selectedItems.Cast<string>().ToList();\r\n                foreach (string selectedItem in selectedStrings)\r\n                {\r\n                    SortingNameRemovedArticles.Remove(selectedItem);\r\n                }\r\n            }, (a) => a?.Count > 0);\r\n        }\r\n\r\n        public RelayCommand FillSortingNameForAllGames\r\n        {\r\n            get => new RelayCommand(() =>\r\n            {\r\n                dialogs.ActivateGlobalProgress(args =>\r\n                {\r\n                    args.ProgressMaxValue = database.Games.Count;\r\n                    var c = new SortableNameConverter(SortingNameRemovedArticles, true);\r\n                    using (database.BufferedUpdate())\r\n                    {\r\n                        foreach (var game in database.Games)\r\n                        {\r\n                            if (args.CancelToken.IsCancellationRequested)\r\n                            {\r\n                                return;\r\n                            }\r\n                            if (game.SortingName.IsNullOrEmpty())\r\n                            {\r\n                                string sortingName = c.Convert(game.Name);\r\n                                if (game.Name != sortingName)\r\n                                {\r\n                                    game.SortingName = sortingName;\r\n                                    database.Games.Update(game);\r\n                                }\r\n                            }\r\n                            args.CurrentProgressValue++;\r\n                        }\r\n                    }\r\n                }, new GlobalProgressOptions(resources.GetString(LOC.SortingNameAutofillProgress), true));\r\n            });\r\n        }\r\n\r\n        public RelayCommand ResetDateTimeFormatAddedCommand\r\n        {\r\n            get => new RelayCommand(() =>\r\n            {\r\n                settings.DateTimeFormatAdded.Format = Constants.DefaultDateTimeFormat;\r\n            });\r\n        }\r\n\r\n        public RelayCommand ResetDateTimeFormatModifiedCommand\r\n        {\r\n            get => new RelayCommand(() =>\r\n            {\r\n                settings.DateTimeFormatModified.Format = Constants.DefaultDateTimeFormat;\r\n            });\r\n        }\r\n\r\n        public RelayCommand ResetDateTimeFormatRecentActivityCommand\r\n        {\r\n            get => new RelayCommand(() =>\r\n            {\r\n                settings.DateTimeFormatRecentActivity.Format = Constants.DefaultDateTimeFormat;\r\n            });\r\n        }\r\n\r\n        public RelayCommand ResetDateTimeFormatReleaseDateCommand\r\n        {\r\n            get => new RelayCommand(() =>\r\n            {\r\n                settings.DateTimeFormatReleaseDate.Format = Constants.DefaultDateTimeFormat;\r\n                settings.DateTimeFormatReleaseDate.PartialFormat = Constants.DefaultPartialReleaseDateTimeFormat;\r\n            });\r\n        }\r\n\r\n        public RelayCommand ResetDateTimeFormatLastPlayedCommand\r\n        {\r\n            get => new RelayCommand(() =>\r\n            {\r\n                settings.DateTimeFormatLastPlayed.Format = Constants.DefaultDateTimeFormat;\r\n            });\r\n        }\r\n\r\n        #endregion Commands\r\n\r\n        public object DateTimeFormatAddedExample =>\r\n            NullableDateToStringConverter.Instance.Convert(DateTime.Now, typeof(string), Settings.DateTimeFormatAdded, CultureInfo.CurrentCulture);\r\n\r\n        public object DateTimeFormatLastPlayedExample =>\r\n            DateTimeToLastPlayedConverter.Instance.Convert(DateTime.Now, typeof(string), Settings.DateTimeFormatLastPlayed, CultureInfo.CurrentCulture);\r\n\r\n        public object DateTimeFormatModifiedExample =>\r\n            NullableDateToStringConverter.Instance.Convert(DateTime.Now, typeof(string), Settings.DateTimeFormatModified, CultureInfo.CurrentCulture);\r\n\r\n        public object DateTimeFormatRecentActivityExample =>\r\n            NullableDateToStringConverter.Instance.Convert(DateTime.Now, typeof(string), Settings.DateTimeFormatRecentActivity, CultureInfo.CurrentCulture);\r\n\r\n        public object DateTimeFormatReleaseDateExample =>\r\n            ReleaseDateToStringConverter.Instance.Convert(new ReleaseDate(DateTime.Now), typeof(string), Settings.DateTimeFormatReleaseDate, CultureInfo.CurrentCulture);\r\n\r\n        public object DateTimeFormatPartialReleaseDateExample =>\r\n            ReleaseDateToStringConverter.Instance.Convert(new ReleaseDate(1999, 6), typeof(string), Settings.DateTimeFormatReleaseDate, CultureInfo.CurrentCulture);\r\n\r\n        public SettingsViewModel(\r\n            IGameDatabaseMain database,\r\n            PlayniteSettings settings,\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ExtensionFactory extensions,\r\n            PlayniteApplication app)\r\n        {\r\n            this.database = database;\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n            this.application = app;\r\n            originalSettings = settings;\r\n\r\n            Settings = settings.GetClone();\r\n            Settings.PropertyChanged += (s, e) => editedFields.AddMissing(e.PropertyName);\r\n\r\n            Settings.DateTimeFormatAdded.PropertyChanged += (_, __) =>\r\n            {\r\n                OnPropertyChanged(nameof(DateTimeFormatAddedExample));\r\n                editedFields.AddMissing(nameof(Settings.DateTimeFormatAdded));\r\n            };\r\n\r\n            Settings.DateTimeFormatLastPlayed.PropertyChanged += (_, __) =>\r\n            {\r\n                OnPropertyChanged(nameof(DateTimeFormatLastPlayedExample));\r\n                editedFields.AddMissing(nameof(Settings.DateTimeFormatLastPlayed));\r\n            };\r\n\r\n            Settings.DateTimeFormatModified.PropertyChanged += (_, __) =>\r\n            {\r\n                OnPropertyChanged(nameof(DateTimeFormatModifiedExample));\r\n                editedFields.AddMissing(nameof(Settings.DateTimeFormatModified));\r\n            };\r\n\r\n            Settings.DateTimeFormatRecentActivity.PropertyChanged += (_, __) =>\r\n            {\r\n                OnPropertyChanged(nameof(DateTimeFormatRecentActivityExample));\r\n                editedFields.AddMissing(nameof(Settings.DateTimeFormatRecentActivity));\r\n            };\r\n\r\n            Settings.DateTimeFormatReleaseDate.PropertyChanged += (_, __) =>\r\n            {\r\n                OnPropertyChanged(nameof(DateTimeFormatReleaseDateExample));\r\n                OnPropertyChanged(nameof(DateTimeFormatPartialReleaseDateExample));\r\n                editedFields.AddMissing(nameof(Settings.DateTimeFormatReleaseDate));\r\n            };\r\n\r\n            AvailableTrayIcons = new List<SelectableTrayIcon>\r\n            {\r\n                new SelectableTrayIcon(TrayIconType.Default),\r\n                new SelectableTrayIcon(TrayIconType.Bright),\r\n                new SelectableTrayIcon(TrayIconType.Dark)\r\n            };\r\n\r\n            sectionViews = new Dictionary<DesktopSettingsPage, UserControl>()\r\n            {\r\n                { DesktopSettingsPage.General, new Controls.SettingsSections.General() { DataContext = this } },\r\n                { DesktopSettingsPage.AppearanceGeneral, new Controls.SettingsSections.AppearanceGeneral() { DataContext = this } },\r\n                { DesktopSettingsPage.AppearanceAdvanced, new Controls.SettingsSections.AppearanceAdvanced() { DataContext = this } },\r\n                { DesktopSettingsPage.AppearanceDetailsView, new Controls.SettingsSections.AppearanceDetailsView() { DataContext = this } },\r\n                { DesktopSettingsPage.AppearanceGridView, new Controls.SettingsSections.AppearanceGridView() { DataContext = this } },\r\n                { DesktopSettingsPage.AppearanceLayout, new Controls.SettingsSections.AppearanceLayout() { DataContext = this } },\r\n                { DesktopSettingsPage.GeneralAdvanced, new Controls.SettingsSections.GeneralAdvanced() { DataContext = this } },\r\n                { DesktopSettingsPage.Input, new Controls.SettingsSections.Input() { DataContext = this } },\r\n                { DesktopSettingsPage.Metadata, new Controls.SettingsSections.Metadata() { DataContext = this } },\r\n                { DesktopSettingsPage.Scripting, new Controls.SettingsSections.Scripting() { DataContext = this } },\r\n                { DesktopSettingsPage.ClientShutdown, new Controls.SettingsSections.ClientShutdown() { DataContext = this } },\r\n                { DesktopSettingsPage.Performance, new Controls.SettingsSections.Performance() { DataContext = this } },\r\n                { DesktopSettingsPage.ImportExlusionList, new Controls.SettingsSections.ImportExlusionList() { DataContext = this } },\r\n                { DesktopSettingsPage.Development, new Controls.SettingsSections.Development() { DataContext = this } },\r\n                { DesktopSettingsPage.AppearanceTopPanel, new Controls.SettingsSections.AppearanceTopPanel() { DataContext = this } },\r\n                { DesktopSettingsPage.Sorting, new Controls.SettingsSections.Sorting() { DataContext = this } },\r\n                { DesktopSettingsPage.Updates, new Controls.SettingsSections.Updates() { DataContext = this } },\r\n                { DesktopSettingsPage.AppearanceListView, new Controls.SettingsSections.AppearanceListView() { DataContext = this } },\r\n                { DesktopSettingsPage.Search, new Controls.SettingsSections.Search() { DataContext = this } },\r\n                { DesktopSettingsPage.Backup, new Controls.SettingsSections.Backup() { DataContext = this } }\r\n            };\r\n\r\n            SelectedSectionView = sectionViews[0];\r\n            foreach (var plugin in extensions.LibraryPlugins.Where(a => a.Properties?.CanShutdownClient == true))\r\n            {\r\n                AutoCloseClientsList.Add(new SelectableItem<LibraryPlugin>(plugin)\r\n                {\r\n                    Selected = settings.ClientAutoShutdown.ShutdownPlugins.Contains(plugin.Id)\r\n                });\r\n            }\r\n\r\n            foreach (var plugin in extensions.Plugins)\r\n            {\r\n                foreach (var search in plugin.Value.Plugin.Searches ?? new List<SearchSupport>())\r\n                {\r\n                    Searches.Add(new SearchSupportSettings(plugin.Value, search, Settings.CustomSearchKeywrods));\r\n                }\r\n            }\r\n\r\n            ImportExclusionList = new ObservableCollection<ImportExclusionItem>(database.ImportExclusions.OrderBy(a => a.Name));\r\n            SortingNameRemovedArticles = new ObservableCollection<string>(settings.GameSortingNameRemovedArticles.OrderBy(a => a));\r\n\r\n            if (app.AppSettings.EnableGameControllerSupport && app.GameController != null)\r\n            {\r\n                Controllers = app.GameController.Controllers.ToObservable();\r\n            }\r\n            else\r\n            {\r\n                Controllers = new ObservableCollection<GameControllerManager.LoadedGameController>();\r\n            }\r\n        }\r\n\r\n        private void SettingsTreeSelectedItemChanged(RoutedPropertyChangedEventArgs<object> selectedItem)\r\n        {\r\n            if (selectedItem.NewValue is TreeViewItem treeItem)\r\n            {\r\n                if (treeItem.Tag is DesktopSettingsPage viewIndex && sectionViews.ContainsKey(viewIndex))\r\n                {\r\n                    SelectedSectionView = sectionViews[viewIndex];\r\n                }\r\n                else\r\n                {\r\n                    SelectedSectionView = null;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                SelectedSectionView = null;\r\n            }\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public bool? OpenView(DesktopSettingsPage viewIndex)\r\n        {\r\n            if (sectionViews.ContainsKey(viewIndex))\r\n            {\r\n                SelectedSectionView = sectionViews[viewIndex];\r\n            }\r\n\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView()\r\n        {\r\n            closingHanled = true;\r\n            window.Close(false);\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            if (Settings.AutoBackupEnabled && Settings.AutoBackupDir.IsNullOrWhiteSpace())\r\n            {\r\n                dialogs.ShowErrorMessage(LOC.SettingsNoBackupDirSpecifiedError);\r\n                return;\r\n            }\r\n\r\n            if (editedFields.Contains(nameof(Settings.StartOnBoot)) ||\r\n                editedFields.Contains(nameof(Settings.StartOnBootClosedToTray)))\r\n            {\r\n                try\r\n                {\r\n                    SystemIntegration.SetBootupStateRegistration(Settings.StartOnBoot, Settings.StartOnBootClosedToTray);\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, \"Failed to register Playnite to start on boot.\");\r\n                    dialogs.ShowErrorMessage(resources.GetString(\"LOCSettingsStartOnBootRegistrationError\")\r\n                        + Environment.NewLine + e.Message, \"\");\r\n                }\r\n            }\r\n\r\n            var shutdownPlugins = AutoCloseClientsList.Where(a => a.Selected == true).Select(a => a.Item.Id).ToList();\r\n            Settings.ClientAutoShutdown.ShutdownPlugins = shutdownPlugins;\r\n            Settings.GameSortingNameRemovedArticles = SortingNameRemovedArticles.ToList();\r\n            var develExtListUpdated = !Settings.DevelExtenions.IsEqualJson(originalSettings.DevelExtenions);\r\n\r\n            Settings.CustomSearchKeywrods = new Dictionary<string, string>();\r\n            foreach (var search in Searches)\r\n            {\r\n                if (!search.Keyword.IsNullOrWhiteSpace())\r\n                {\r\n                    Settings.CustomSearchKeywrods.Add(search.SearchId, search.Keyword);\r\n                }\r\n            }\r\n\r\n            if (Settings.EnableGameControllerSupport && application.GameController != null)\r\n            {\r\n                var newList = Settings.DisabledGameControllers.GetClone();\r\n                foreach (var controller in Controllers)\r\n                {\r\n                    if (controller.Enabled && newList.Contains(controller.Path))\r\n                    {\r\n                        newList.Remove(controller.Path);\r\n                    }\r\n                    else if (!controller.Enabled)\r\n                    {\r\n                        newList.AddMissing(controller.Path);\r\n                    }\r\n                }\r\n\r\n                Settings.DisabledGameControllers = newList;\r\n            }\r\n\r\n            EndEdit();\r\n            originalSettings.SaveSettings();\r\n            if (editedFields?.Any(a => typeof(PlayniteSettings).HasPropertyAttribute<RequiresRestartAttribute>(a)) == true ||\r\n                develExtListUpdated)\r\n            {\r\n                if (dialogs.ShowMessage(\r\n                    resources.GetString(\"LOCSettingsRestartAskMessage\"),\r\n                    resources.GetString(\"LOCSettingsRestartTitle\"),\r\n                    MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n                {\r\n                    application.Restart(new CmdLineOptions()\r\n                    {\r\n                        SkipLibUpdate = true,\r\n                        StartInDesktop = true\r\n                    });\r\n                }\r\n            }\r\n\r\n            if (editedFields.Contains(nameof(Settings.DiscordPresenceEnabled)) && application.Discord != null)\r\n            {\r\n                application.Discord.IsPresenceEnabled = Settings.DiscordPresenceEnabled;\r\n            }\r\n\r\n            if (editedFields.Contains(nameof(Settings.TraceLogEnabled)))\r\n            {\r\n                NLogLogger.IsTraceEnabled = Settings.TraceLogEnabled;\r\n            }\r\n\r\n            closingHanled = true;\r\n            window.Close(true);\r\n        }\r\n\r\n        public void SelectDbFile()\r\n        {\r\n            dialogs.ShowMessage(resources.GetString(\"LOCSettingsDBPathNotification\"), \"\", MessageBoxButton.OK, MessageBoxImage.Warning);\r\n            var path = dialogs.SelectFolder();\r\n            if (!string.IsNullOrEmpty(path))\r\n            {\r\n                Settings.DatabasePath = path;\r\n            }\r\n        }\r\n\r\n        public void ClearWebcache()\r\n        {\r\n            if (dialogs.ShowMessage(\r\n                    resources.GetString(\"LOCSettingsClearCacheWarn\"),\r\n                    resources.GetString(\"LOCSettingsClearCacheTitle\"),\r\n                    MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n            {\r\n                application.Restart(new CmdLineOptions\r\n                {\r\n                    SkipLibUpdate = true,\r\n                    ClearWebCache = true\r\n                });\r\n            }\r\n        }\r\n\r\n        public void SetCoverArtAspectRatio(string ratio)\r\n        {\r\n            var regex = Regex.Match(ratio, @\"(\\d+):(\\d+)\");\r\n            if (regex.Success)\r\n            {\r\n                Settings.GridItemWidthRatio = Convert.ToInt32(regex.Groups[1].Value);\r\n                Settings.GridItemHeightRatio = Convert.ToInt32(regex.Groups[2].Value);\r\n            }\r\n        }\r\n\r\n        private void SetDefaults()\r\n        {\r\n            if (dialogs.ShowMessage(\r\n                LOC.SettingsDefaultResetDesc,\r\n                string.Empty,\r\n                MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)\r\n            {\r\n                application.Restart(new CmdLineOptions\r\n                {\r\n                    SkipLibUpdate = true,\r\n                    ResetSettings = true\r\n                });\r\n            }\r\n        }\r\n\r\n        public void EndEdit()\r\n        {\r\n            Settings.CopyProperties(originalSettings, true, new List<string>()\r\n            {\r\n                nameof(PlayniteSettings.FilterSettings),\r\n                nameof(PlayniteSettings.ViewSettings),\r\n                nameof(PlayniteSettings.InstallInstanceId),\r\n                nameof(PlayniteSettings.GridItemHeight),\r\n                nameof(PlayniteSettings.WindowPositions),\r\n                nameof(PlayniteSettings.Fullscreen)\r\n            }, true);\r\n\r\n            database.ImportExclusions.Remove(removedExclusionItems);\r\n        }\r\n\r\n        public void TestScript(string script)\r\n        {\r\n            try\r\n            {\r\n                var game = application.PlayniteApiGlobal.MainView.SelectedGames.FirstOrDefault() ?? new SDK.Models.Game(\"Test game\");\r\n                var expandedScript = game.ExpandVariables(script);\r\n                var startingArgs = new SDK.Events.OnGameStartingEventArgs\r\n                {\r\n                    Game = game,\r\n                    SelectedRomFile = game.Roms?.FirstOrDefault()?.Path,\r\n                    SourceAction = game.GameActions?.FirstOrDefault()\r\n                };\r\n\r\n                using (var runtime = new PowerShellRuntime($\"test script runtime\"))\r\n                {\r\n                    application.GamesEditor.ExecuteScriptAction(runtime, expandedScript, game, true, true, GameScriptType.None,\r\n                        new Dictionary<string, object>\r\n                        {\r\n                            {  \"StartingArgs\", startingArgs },\r\n                            {  \"SourceAction\", startingArgs.SourceAction },\r\n                            {  \"SelectedRomFile\", startingArgs.SelectedRomFile }\r\n                        });\r\n                }\r\n            }\r\n            catch (Exception exc)\r\n            {\r\n                var message = exc.Message;\r\n                if (exc is ScriptRuntimeException err)\r\n                {\r\n                    message = err.Message + \"\\n\\n\" + err.ScriptStackTrace;\r\n                }\r\n\r\n                Dialogs.ShowMessage(\r\n                    message,\r\n                    resources.GetString(\"LOCScriptError\"),\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/StatisticsViewModel.cs",
    "content": "﻿using Playnite.Database;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class StatisticsViewModel : ObservableObject\r\n    {\r\n        private static StatisticsViewModel designIntance;\r\n        public static StatisticsViewModel DesignIntance\r\n        {\r\n            get\r\n            {\r\n                if (designIntance == null)\r\n                {\r\n                    designIntance = new StatisticsViewModel\r\n                    {\r\n                        GlobalStats = new GameStats\r\n                        {\r\n                            TotalCount = 33,\r\n                            Favorite = new BaseStatInfo(\"\", 1, 33),\r\n                            Hidden = new BaseStatInfo(\"\", 5, 33),\r\n                            Installed = new BaseStatInfo(\"\", 6, 33),\r\n                            NotInstalled = new BaseStatInfo(\"\", 20, 33),\r\n                            TopPlayed = new List<BaseStatInfo>\r\n                            {\r\n                                new BaseStatInfo(\"Unreal Tournament\", 2665165),\r\n                            }\r\n                        }\r\n                    };\r\n                }\r\n\r\n                return designIntance;\r\n            }\r\n        }\r\n\r\n        public class FilterSection\r\n        {\r\n            public GameField Field { get; }\r\n            public string Name { get; }\r\n\r\n            public FilterSection(GameField field, string name)\r\n            {\r\n                Field = field;\r\n                Name = ResourceProvider.GetString(name);\r\n            }\r\n\r\n            public override string ToString()\r\n            {\r\n                return Name;\r\n            }\r\n        }\r\n\r\n        public class FilterObject : ObservableObject\r\n        {\r\n            public string DisplayName { get; }\r\n            public object Value { get; }\r\n\r\n            public string Name\r\n            {\r\n                get => DisplayName.IsNullOrEmpty() ? Value.ToString() : DisplayName;\r\n            }\r\n\r\n            public FilterObject(object value, string displayName)\r\n            {\r\n                Value = value;\r\n                DisplayName = displayName;\r\n            }\r\n\r\n            public FilterObject(object value)\r\n            {\r\n                Value = value;\r\n            }\r\n        }\r\n\r\n        public class BaseStatInfo\r\n        {\r\n            public string Name { get; set; }\r\n            public ulong Value { get; set; }\r\n            public int Percentage { get; set; }\r\n            public Game Game { get; set; }\r\n\r\n            public BaseStatInfo(string name, ulong value)\r\n            {\r\n                Name = name;\r\n                Value = value;\r\n            }\r\n\r\n            public BaseStatInfo(string name, ulong value, ulong total) : this(name, value)\r\n            {\r\n                if (total > 0 && value <= total)\r\n                {\r\n                    Percentage = Convert.ToInt32(((double)value / (double)total) * 100);\r\n                }\r\n            }\r\n        }\r\n\r\n        public List<FilterSection> Filters { get; } = new List<FilterSection>\r\n        {\r\n            new FilterSection(GameField.None, LOC.None),\r\n            new FilterSection(GameField.PluginId, LOC.GameProviderTitle),\r\n            new FilterSection(GameField.Genres, LOC.GenresLabel),\r\n            new FilterSection(GameField.Features, LOC.FeaturesLabel),\r\n            new FilterSection(GameField.Tags, LOC.TagsLabel),\r\n            new FilterSection(GameField.Platforms, LOC.PlatformsTitle),\r\n            new FilterSection(GameField.Developers, LOC.DevelopersLabel),\r\n            new FilterSection(GameField.Publishers, LOC.PublishersLabel),\r\n            new FilterSection(GameField.Categories, LOC.CategoriesLabel),\r\n            new FilterSection(GameField.ReleaseYear, LOC.GameReleaseYearTitle),\r\n            new FilterSection(GameField.Series, LOC.SeriesLabel),\r\n            new FilterSection(GameField.AgeRatings, LOC.AgeRatingsLabel),\r\n            new FilterSection(GameField.Regions, LOC.RegionsLabel),\r\n            new FilterSection(GameField.Source, LOC.SourcesLabel),\r\n            new FilterSection(GameField.CompletionStatus, LOC.CompletionStatus),\r\n            new FilterSection(GameField.InstallationStatus, LOC.GameInstallationStatus),\r\n        };\r\n\r\n        private FilterSection selectedFilter;\r\n        public FilterSection SelectedFilter\r\n        {\r\n            get => selectedFilter;\r\n            set\r\n            {\r\n                selectedFilter = value;\r\n                selectedFilterObject = null;\r\n                LoadFilterObjects();\r\n                OnPropertyChanged();\r\n                ReloadFilteredData();\r\n            }\r\n        }\r\n\r\n        private List<FilterObject> filterObjects;\r\n        public List<FilterObject> FilterObjects\r\n        {\r\n            get => filterObjects;\r\n            set\r\n            {\r\n                filterObjects = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n        private FilterObject selectedFilterObject;\r\n        public FilterObject SelectedFilterObject\r\n        {\r\n            get => selectedFilterObject;\r\n            set\r\n            {\r\n                selectedFilterObject = value;\r\n                OnPropertyChanged();\r\n                ReloadFilteredData();\r\n            }\r\n        }\r\n\r\n        public class GameStats\r\n        {\r\n            public List<BaseStatInfo> TopPlayed { get; set; }\r\n            public List<BaseStatInfo> CompletionStates { get; set; }\r\n            public List<BaseStatInfo> GameProvider { get; set; }\r\n\r\n            public ulong TotalCount { get; set; }\r\n            public BaseStatInfo Installed { get; set; }\r\n            public BaseStatInfo NotInstalled { get; set; }\r\n            public BaseStatInfo Hidden { get; set; }\r\n            public BaseStatInfo Favorite { get; set; }\r\n            public ulong TotalPlayTime { get; set; }\r\n            public ulong AvaragePlayTime { get; set; }\r\n            public ulong TotalInstallSize { get; set; }\r\n        }\r\n\r\n        private IGameDatabaseMain database;\r\n        private ExtensionFactory extensions;\r\n        private PlayniteSettings settings;\r\n\r\n        private GameStats globalStats;\r\n        public GameStats GlobalStats\r\n        {\r\n            get => globalStats;\r\n            set\r\n            {\r\n                globalStats = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private GameStats filteredStats;\r\n        public GameStats FilteredStats\r\n        {\r\n            get => filteredStats;\r\n            set\r\n            {\r\n                filteredStats = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool includeHidden;\r\n        public bool IncludeHidden\r\n        {\r\n            get => includeHidden;\r\n            set\r\n            {\r\n                includeHidden = value;\r\n                OnPropertyChanged();\r\n                Calculate();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<Game> NavigateToGameCommand { get; }\r\n\r\n        public RelayCommand<object> NavigateBackCommand { get; }\r\n\r\n        public StatisticsViewModel()\r\n        {\r\n        }\r\n\r\n        public StatisticsViewModel(\r\n            IGameDatabaseMain database,\r\n            ExtensionFactory extensions,\r\n            PlayniteSettings settings,\r\n            Action switchToLibraryViewAction,\r\n            Action<Game> gameSelectionAction)\r\n        {\r\n            this.database = database;\r\n            this.extensions = extensions;\r\n            this.settings = settings;\r\n            SelectedFilter = Filters[0];\r\n\r\n            NavigateBackCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                switchToLibraryViewAction();\r\n            });\r\n\r\n            NavigateToGameCommand = new RelayCommand<Game>((a) =>\r\n            {\r\n                gameSelectionAction(a);\r\n            });\r\n        }\r\n\r\n        public void Calculate()\r\n        {\r\n            if (!database.IsOpen)\r\n            {\r\n                return;\r\n            }\r\n\r\n            GlobalStats = FillData(false);\r\n            FilteredStats = FillData(true);\r\n        }\r\n\r\n        private void LoadFilterObjects()\r\n        {\r\n            switch (SelectedFilter.Field)\r\n            {\r\n                case GameField.None:\r\n                    FilterObjects = new List<FilterObject>();\r\n                    break;\r\n                case GameField.PluginId:\r\n                    var libs = extensions.LibraryPlugins.ToList();\r\n                    libs.Add(new FakePlayniteLibraryPlugin());\r\n                    FilterObjects = new List<FilterObject>(libs.Select(a => new FilterObject(a, a.Name)));\r\n                    break;\r\n                case GameField.Genres:\r\n                    FilterObjects = new List<FilterObject>(database.UsedGenres.Select(a => database.Genres[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.Features:\r\n                    FilterObjects = new List<FilterObject>(database.UsedFeastures.Select(a => database.Features[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.Tags:\r\n                    FilterObjects = new List<FilterObject>(database.UsedTags.Select(a => database.Tags[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.Platforms:\r\n                    FilterObjects = new List<FilterObject>(database.UsedPlatforms.Select(a => database.Platforms[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.Developers:\r\n                    FilterObjects = new List<FilterObject>(database.UsedDevelopers.Select(a => database.Companies[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.Publishers:\r\n                    FilterObjects = new List<FilterObject>(database.UsedPublishers.Select(a => database.Companies[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.Categories:\r\n                    FilterObjects = new List<FilterObject>(database.UsedCategories.Select(a => database.Categories[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.ReleaseYear:\r\n                    var years = database.Games.Where(a => a.ReleaseYear != null).Select(a => a.ReleaseYear).Distinct().OrderBy(a => a.Value);\r\n                    FilterObjects = new List<FilterObject>(years.Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.Series:\r\n                    FilterObjects = new List<FilterObject>(database.UsedSeries.Select(a => database.Series[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.AgeRatings:\r\n                    FilterObjects = new List<FilterObject>(database.UsedAgeRatings.Select(a => database.AgeRatings[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.Regions:\r\n                    FilterObjects = new List<FilterObject>(database.UsedRegions.Select(a => database.Regions[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.Source:\r\n                    FilterObjects = new List<FilterObject>(database.UsedSources.Select(a => database.Sources[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.CompletionStatus:\r\n                    FilterObjects = new List<FilterObject>(database.UsedCompletionStatuses.Select(a => database.CompletionStatuses[a]).OrderBy(a => a.Name).Select(a => new FilterObject(a)));\r\n                    break;\r\n                case GameField.InstallationStatus:\r\n                    FilterObjects = new List<FilterObject>\r\n                    {\r\n                        new FilterObject(true, LOC.GameIsGameInstalledTitle.GetLocalized()),\r\n                        new FilterObject(false, LOC.GameIsUnInstalledTitle.GetLocalized()),\r\n                    };\r\n                    break;\r\n                default:\r\n                    if (PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        throw new NotImplementedException($\"LoadFilterObjects {SelectedFilter.Field}\");\r\n                    }\r\n                    break;\r\n            }\r\n        }\r\n\r\n        private GameStats FillData(bool filtered)\r\n        {\r\n            ulong totalGames = 0;\r\n            ulong totalGamesWithPlayTime = 0;\r\n            ulong installed = 0;\r\n            ulong notinstalled = 0;\r\n            ulong hidden = 0;\r\n            ulong favorite = 0;\r\n            ulong totalPlaytime = 0;\r\n            ulong totalInstallSize = 0;\r\n\r\n            var gameProviderStats = new Dictionary<Guid, ulong>();\r\n            var libPlugins = extensions.LibraryPlugins.ToList();\r\n            libPlugins.Add(new FakePlayniteLibraryPlugin());\r\n            foreach (var lib in libPlugins)\r\n            {\r\n                gameProviderStats.Add(lib.Id, 0);\r\n            }\r\n\r\n            var compStats = new Dictionary<Guid, ulong>();\r\n            foreach (var game in database.Games)\r\n            {\r\n                if (game.Hidden && !IncludeHidden)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (filtered && !PassesFilter(game))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                totalGames++;\r\n                if (game.Playtime > 0)\r\n                {\r\n                    totalGamesWithPlayTime++;\r\n                    totalPlaytime += game.Playtime;\r\n                }\r\n\r\n                if (game.IsInstalled && game?.InstallSize > 0)\r\n                {\r\n                    totalInstallSize += game.InstallSize.Value;\r\n                }\r\n\r\n                if (game.IsInstalled)\r\n                {\r\n                    installed++;\r\n                }\r\n\r\n                if (!game.IsInstalled)\r\n                {\r\n                    notinstalled++;\r\n                }\r\n\r\n                if (game.Hidden)\r\n                {\r\n                    hidden++;\r\n                }\r\n\r\n                if (game.Favorite)\r\n                {\r\n                    favorite++;\r\n                }\r\n\r\n                if (gameProviderStats.ContainsKey(game.PluginId))\r\n                {\r\n                    gameProviderStats[game.PluginId] += 1;\r\n                }\r\n\r\n                if (database.CompletionStatuses[game.CompletionStatusId] != null)\r\n                {\r\n                    if (compStats.TryGetValue(game.CompletionStatusId, out var currentCount))\r\n                    {\r\n                        compStats[game.CompletionStatusId] = currentCount + 1;\r\n                    }\r\n                    else\r\n                    {\r\n                        compStats.Add(game.CompletionStatusId, 1);\r\n                    }\r\n                }\r\n            }\r\n\r\n            return new GameStats\r\n            {\r\n                CompletionStates = compStats.\r\n                    OrderByDescending(a => a.Value).\r\n                    Select(a => new BaseStatInfo(database.CompletionStatuses[a.Key].Name, a.Value, totalGames)).\r\n                    ToList(),\r\n                GameProvider = gameProviderStats.\r\n                OrderByDescending(a => a.Value).\r\n                    Select(a => new BaseStatInfo(libPlugins.First(b => b.Id == a.Key).Name, a.Value, totalGames)).\r\n                    ToList(),\r\n                Favorite = new BaseStatInfo(\"\", favorite, totalGames),\r\n                Hidden = new BaseStatInfo(\"\", hidden, totalGames),\r\n                Installed = new BaseStatInfo(\"\", installed, totalGames),\r\n                NotInstalled = new BaseStatInfo(\"\", notinstalled, totalGames),\r\n                TotalCount = totalGames,\r\n                TotalPlayTime = totalPlaytime,\r\n                AvaragePlayTime = totalGamesWithPlayTime > 0 ? totalPlaytime / totalGamesWithPlayTime : 0,\r\n                TopPlayed = database.Games.\r\n                    Where(a => !filtered || PassesFilter(a)).\r\n                    Where(a => !a.Hidden || (a.Hidden && IncludeHidden)).\r\n                    OrderByDescending(a => a.Playtime).\r\n                    Take(50).\r\n                    Select(a => new BaseStatInfo(a.Name, a.Playtime, totalPlaytime) { Game = a }).ToList(),\r\n                TotalInstallSize = totalInstallSize\r\n            };\r\n        }\r\n\r\n        private bool PassesFilter(Game game)\r\n        {\r\n            if (SelectedFilter == null || SelectedFilterObject == null)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            switch (SelectedFilter.Field)\r\n            {\r\n                case GameField.None:\r\n                    FilterObjects = new List<FilterObject>();\r\n                    break;\r\n                case GameField.PluginId:\r\n                    return game.PluginId == ((LibraryPlugin)SelectedFilterObject.Value).Id;\r\n                case GameField.Genres:\r\n                    return game.GenreIds?.Contains(((DatabaseObject)SelectedFilterObject.Value).Id) == true;\r\n                case GameField.Features:\r\n                    return game.FeatureIds?.Contains(((DatabaseObject)SelectedFilterObject.Value).Id) == true;\r\n                case GameField.Tags:\r\n                    return game.TagIds?.Contains(((DatabaseObject)SelectedFilterObject.Value).Id) == true;\r\n                case GameField.Platforms:\r\n                    return game.PlatformIds?.Contains(((DatabaseObject)SelectedFilterObject.Value).Id) == true;\r\n                case GameField.Developers:\r\n                    return game.DeveloperIds?.Contains(((DatabaseObject)SelectedFilterObject.Value).Id) == true;\r\n                case GameField.Publishers:\r\n                    return game.PublisherIds?.Contains(((DatabaseObject)SelectedFilterObject.Value).Id) == true;\r\n                case GameField.Categories:\r\n                    return game.CategoryIds?.Contains(((DatabaseObject)SelectedFilterObject.Value).Id) == true;\r\n                case GameField.ReleaseYear:\r\n                    return game.ReleaseDate?.Year == (int?)SelectedFilterObject.Value;\r\n                case GameField.Series:\r\n                    return game.SeriesIds?.Contains(((DatabaseObject)SelectedFilterObject.Value).Id) == true;\r\n                case GameField.AgeRatings:\r\n                    return game.AgeRatingIds?.Contains(((DatabaseObject)SelectedFilterObject.Value).Id) == true;\r\n                case GameField.Regions:\r\n                    return game.RegionIds?.Contains(((DatabaseObject)SelectedFilterObject.Value).Id) == true;\r\n                case GameField.Source:\r\n                    return game.SourceId == ((DatabaseObject)SelectedFilterObject.Value).Id;\r\n                case GameField.CompletionStatus:\r\n                    return game.CompletionStatusId == ((DatabaseObject)SelectedFilterObject.Value).Id;\r\n                case GameField.InstallationStatus:\r\n                    return SelectedFilterObject.Value is true && game.IsInstalled ||\r\n                        SelectedFilterObject.Value is false && !game.IsInstalled;\r\n                default:\r\n                    if (PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        throw new NotImplementedException($\"PassesFilter {SelectedFilter.Field}\");\r\n                    }\r\n                    break;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        private void ReloadFilteredData()\r\n        {\r\n            FilteredStats = FillData(true);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/ViewModels/ToolsConfigViewModel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Common.Media.Icons;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp.ViewModels\r\n{\r\n    public class ToolsConfigViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private IDialogsFactory dialogs;\r\n        private IResourceProvider resources;\r\n        private IGameDatabaseMain database;\r\n\r\n        public ObservableCollection<AppSoftware> EditingApps\r\n        {\r\n            get;\r\n        }\r\n\r\n        private AppSoftware selectedApp;\r\n        public AppSoftware SelectedApp\r\n        {\r\n            get => selectedApp;\r\n            set\r\n            {\r\n                selectedApp = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> AddAppCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddApp();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddAppFromExeCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddAppFromExe();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<AppSoftware> RemoveAppCommand\r\n        {\r\n            get => new RelayCommand<AppSoftware>((a) =>\r\n            {\r\n                RemoveApp(a);\r\n            }, (_) => SelectedApp != null);\r\n        }\r\n\r\n        public RelayCommand<AppSoftware> SelectIconCommand\r\n        {\r\n            get => new RelayCommand<AppSoftware>((a) =>\r\n            {\r\n                SelectIcon();\r\n            }, (_) => SelectedApp != null);\r\n        }\r\n\r\n        public RelayCommand<AppSoftware> RemoveIconCommand\r\n        {\r\n            get => new RelayCommand<AppSoftware>((a) =>\r\n            {\r\n                RemoveIcon();\r\n            }, (_) => SelectedApp != null);\r\n        }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                CloseView();\r\n            });\r\n        }\r\n\r\n        public ToolsConfigViewModel(\r\n            IGameDatabaseMain database,\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources)\r\n        {\r\n            this.database = database;\r\n            this.window = window;\r\n            this.dialogs = dialogs;\r\n            this.resources = resources;\r\n\r\n            EditingApps = database.SoftwareApps.GetClone().OrderBy(a => a.Name).ToObservable();\r\n            SelectedApp = EditingApps.FirstOrDefault();\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void CloseView()\r\n        {\r\n            window.Close(false);\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            string addNewFile(string path, Guid parent)\r\n            {\r\n                var newPath = database.AddFile(path, parent, true, CancellationToken.None);\r\n                if (Paths.AreEqual(Path.GetDirectoryName(path), PlaynitePaths.TempPath))\r\n                {\r\n                    File.Delete(path);\r\n                }\r\n\r\n                return newPath;\r\n            }\r\n\r\n            database.SoftwareApps.BeginBufferUpdate();\r\n\r\n            // Update modified in database\r\n            foreach (var app in EditingApps.Where(a => database.SoftwareApps[a.Id] != null).ToList())\r\n            {\r\n                var dbItem = database.SoftwareApps.Get(app.Id);\r\n                if (app.IsEqualJson(dbItem))\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (!string.IsNullOrEmpty(app.Icon) && File.Exists(app.Icon))\r\n                {\r\n                    app.Icon = addNewFile(app.Icon, dbItem.Id);\r\n                }\r\n\r\n                database.SoftwareApps.Update(app);\r\n            }\r\n\r\n            // Remove deleted from database\r\n            var removedItems = database.SoftwareApps.Where(a => EditingApps.FirstOrDefault(b => b.Id == a.Id) == null).ToList();\r\n            database.SoftwareApps.Remove(removedItems);\r\n\r\n            // Add new to database\r\n            foreach (var addedItem in EditingApps.Where(a => database.SoftwareApps[a.Id] == null).ToList())\r\n            {\r\n                if (!string.IsNullOrEmpty(addedItem.Icon))\r\n                {\r\n                    addedItem.Icon = addNewFile(addedItem.Icon, addedItem.Id);\r\n                }\r\n\r\n                database.SoftwareApps.Add(addedItem);\r\n            }\r\n\r\n            database.SoftwareApps.EndBufferUpdate();\r\n            window.Close(true);\r\n        }\r\n\r\n        private void AddApp()\r\n        {\r\n            var newApp = new AppSoftware(\"new app\");\r\n            EditingApps.Add(newApp);\r\n            SelectedApp = newApp;\r\n        }\r\n\r\n        private void AddAppFromExe()\r\n        {\r\n            var filePath = dialogs.SelectFile(\"*.exe,*.lnk|*.exe;*.lnk\");\r\n            if (!filePath.IsNullOrEmpty())\r\n            {\r\n                if (filePath.EndsWith(\".exe\", StringComparison.OrdinalIgnoreCase) || filePath.EndsWith(\".lnk\", StringComparison.OrdinalIgnoreCase))\r\n                {\r\n                    var program = Programs.GetProgramData(filePath);\r\n                    var app = new AppSoftware(program.Name)\r\n                    {\r\n                        Path = program.Path,\r\n                        Arguments = program.Arguments,\r\n                        WorkingDir = program.WorkDir\r\n                    };\r\n\r\n                    if (!program.Icon.IsNullOrEmpty())\r\n                    {\r\n                        if (program.Icon.EndsWith(\".ico\", StringComparison.OrdinalIgnoreCase))\r\n                        {\r\n                            app.Icon = program.Icon;\r\n                        }\r\n                        else\r\n                        {\r\n                            var icoPath = Path.Combine(PlaynitePaths.TempPath, Guid.NewGuid() + \".ico\");\r\n                            if (IconExtractor.ExtractMainIconFromFile(program.Icon, icoPath))\r\n                            {\r\n                                app.Icon = icoPath;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    EditingApps.Add(app);\r\n                    SelectedApp = app;\r\n                }\r\n                else\r\n                {\r\n                    var app = new AppSoftware(Path.GetFileNameWithoutExtension(filePath))\r\n                    {\r\n                        Path = filePath\r\n                    };\r\n\r\n                    EditingApps.Add(app);\r\n                    SelectedApp = app;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void RemoveApp(AppSoftware a)\r\n        {\r\n            EditingApps.Remove(a);\r\n        }\r\n\r\n        private void SelectIcon()\r\n        {\r\n            var iconPath = dialogs.SelectIconFile();\r\n            if (string.IsNullOrEmpty(iconPath))\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (iconPath.EndsWith(\"exe\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                var convertedPath = Path.Combine(PlaynitePaths.TempPath, Guid.NewGuid() + \".ico\");\r\n                if (IconExtractor.ExtractMainIconFromFile(iconPath, convertedPath))\r\n                {\r\n                    iconPath = convertedPath;\r\n                }\r\n                else\r\n                {\r\n                    iconPath = null;\r\n                }\r\n            }\r\n\r\n            SelectedApp.Icon = iconPath;\r\n        }\r\n\r\n        private void RemoveIcon()\r\n        {\r\n            SelectedApp.Icon = null;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/AboutWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.AboutWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"                     \r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        WindowStartupLocation=\"CenterOwner\" ShowInTaskbar=\"False\"\r\n        Title=\"{DynamicResource LOCAboutWindowTitle}\" ResizeMode=\"NoResize\" Height=\"400\" Width=\"500\"\r\n        AutomationProperties.AutomationId=\"WindowAbout\" ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\">\r\n\r\n    <controls:WindowBase.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <DockPanel Margin=\"5\">\r\n        <DockPanel LastChildFill=\"False\" DockPanel.Dock=\"Bottom\">\r\n            <Button TabIndex=\"4\" Name=\"ButtonCreatePackage\" Content=\"{DynamicResource LOCAboutCreateDiagButton}\" Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding CreateDiagPackageCommand}\"/>\r\n            <Button TabIndex=\"5\" Name=\"ButtonClose\" Content=\"{DynamicResource LOCCloseLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\" IsDefault=\"True\"\r\n                    Style=\"{StaticResource BottomButton}\" Command=\"{Binding CloseCommand}\"/>\r\n            <Button TabIndex=\"5\" Content=\"{DynamicResource LOCLicenseLabel}\" DockPanel.Dock=\"Left\"\r\n                    Style=\"{StaticResource BottomButton}\" Command=\"{Binding OpenLicensesCommand}\"/>\r\n        </DockPanel>\r\n\r\n        <GridEx DockPanel.Dock=\"Top\" Margin=\"10\"\r\n                ColumnCount=\"3\" StarColumns=\"2\">\r\n            <Image Source=\"{pmrk:ThemeFile 'Images/applogo.png'}\" Width=\"64\" Height=\"64\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n                   Grid.Column=\"0\" />\r\n\r\n            <StackPanel Grid.Column=\"1\" Margin=\"30,0,30,0\">\r\n                <TextBlock Text=\"{Binding VersionInfo}\" />\r\n                <TextBlock Text=\"{Binding SDKVersion}\" Margin=\"0,5,0,0\" />\r\n                <TextBlock Text=\"{Binding ThemeApiVersion}\" Margin=\"0,5,0,0\" />\r\n                <TextBlock Text=\"{DynamicResource LOCPortableInstallation}\" Margin=\"0,5,0,0\"\r\n                           Visibility=\"{Binding IsPortable, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n            </StackPanel>\r\n\r\n            <StackPanel Grid.Column=\"2\">\r\n                <TextBlock>\r\n                    <Hyperlink NavigateUri=\"https://www.playnite.link\"\r\n                               Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\" CommandParameter=\"{Binding NavigateUri, RelativeSource={RelativeSource Self}}\">\r\n                        <Run Text=\"https://www.playnite.link\"/>\r\n                    </Hyperlink>\r\n                </TextBlock>\r\n                <TextBlock Margin=\"0,5,0,0\">\r\n                    <Hyperlink NavigateUri=\"https://playnite.link/docs/\"\r\n                               Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\" CommandParameter=\"{Binding NavigateUri, RelativeSource={RelativeSource Self}}\">\r\n                        <Run Text=\"{DynamicResource LOCUserManual}\"/>\r\n                    </Hyperlink>\r\n                </TextBlock>\r\n                <TextBlock Margin=\"0,5,0,0\">\r\n                    <Hyperlink NavigateUri=\"https://github.com/JosefNemec/Playnite/\"\r\n                               Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\" CommandParameter=\"{Binding NavigateUri, RelativeSource={RelativeSource Self}}\">\r\n                        <Run Text=\"{DynamicResource LOCAboutSourceLink}\"/>\r\n                    </Hyperlink>\r\n                </TextBlock>\r\n                <TextBlock Margin=\"0,5,0,0\">\r\n                    <Hyperlink Focusable=\"False\"\r\n                               Command=\"{x:Static pcmd:GlobalCommands.NavigateDirectoryCommand}\"\r\n                               CommandParameter=\"{Binding InstallDir}\">\r\n                        <Run Text=\"{DynamicResource LOCProgramFolder}\"/>\r\n                    </Hyperlink>\r\n                </TextBlock>\r\n                <TextBlock Margin=\"0,5,0,0\">\r\n                    <Hyperlink Focusable=\"False\"                  \r\n                               Command=\"{x:Static pcmd:GlobalCommands.NavigateDirectoryCommand}\"\r\n                               CommandParameter=\"{Binding UserDir}\">\r\n                        <Run Text=\"{DynamicResource LOCUserDataFolder}\"/>\r\n                    </Hyperlink>\r\n                </TextBlock>\r\n            </StackPanel>\r\n        </GridEx>\r\n\r\n        <TabControl TabIndex=\"2\" DockPanel.Dock=\"Top\">\r\n            <TabItem Header=\"{DynamicResource LOCSpecialThanks}\">\r\n                <DockPanel>\r\n                    <TextBlock DockPanel.Dock=\"Top\" Text=\"{DynamicResource LOCPatreonDevelopMessage}\"\r\n                               HorizontalAlignment=\"Center\" Margin=\"0,5,0,5\" TextWrapping=\"Wrap\" />\r\n                    <TextBox IsTabStop=\"False\" IsReadOnly=\"True\" DockPanel.Dock=\"Top\" BorderThickness=\"0\"\r\n                             HorizontalContentAlignment=\"Center\" ScrollViewer.VerticalScrollBarVisibility=\"Auto\">\r\n                        <TextBox.Text>\r\n                            <PriorityBinding>\r\n                                <Binding Path=\"PatronsList\" IsAsync=\"True\" Mode=\"OneWay\" />\r\n                                <Binding Path=\"PatronsListDownloading\" Mode=\"OneWay\" />\r\n                            </PriorityBinding>\r\n                        </TextBox.Text>\r\n                    </TextBox>\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <TabItem Header=\"{DynamicResource LOCContributorsLabel}\">\r\n                <DockPanel>\r\n                    <TextBlock DockPanel.Dock=\"Top\" Text=\"{DynamicResource LOCAboutContributorsMessage}\"\r\n                               HorizontalAlignment=\"Center\" Margin=\"0,5,0,5\" />\r\n                    <TextBox IsTabStop=\"False\" IsReadOnly=\"True\" DockPanel.Dock=\"Top\" BorderThickness=\"0\"\r\n                         HorizontalContentAlignment=\"Center\" ScrollViewer.VerticalScrollBarVisibility=\"Auto\"\r\n                         Text=\"{Binding Contributors, Mode=OneWay}\"/>\r\n                </DockPanel>\r\n            </TabItem>\r\n        </TabControl>\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/AboutWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class AboutWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new AboutWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for AboutWindow.xaml\r\n    /// </summary>\r\n    public partial class AboutWindow : WindowBase\r\n    {\r\n        public AboutWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ActionSelectionWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.ActionSelectionWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCSelectActionTitle}\"\r\n        WindowStartupLocation=\"CenterOwner\" SizeToContent=\"WidthAndHeight\"\r\n        d:DesignHeight=\"200\" d:DesignWidth=\"350\" MinWidth=\"300\" MaxHeight=\"700\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\"\r\n        AutomationProperties.AutomationId=\"WindowActionSelection\"\r\n        Name=\"WindowActionSelectionWindow\">\r\n\r\n    <controls:WindowBase.InputBindings>\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CancelCommand}\" />\r\n    </controls:WindowBase.InputBindings>\r\n\r\n    <ItemsControl ItemsSource=\"{Binding Actions}\" Margin=\"20,15,25,25\"\r\n                  Focusable=\"False\">\r\n        <ItemsControl.ItemTemplate>\r\n            <DataTemplate>\r\n                <Button Background=\"Transparent\" HorizontalContentAlignment=\"Left\" BorderThickness=\"0\"\r\n                        Command=\"{Binding DataContext.PlaySpecificCommand, ElementName=WindowActionSelectionWindow}\"\r\n                        CommandParameter=\"{Binding Item}\"\r\n                        pbeh:FocusBahaviors.FocusBinding=\"{Binding Selected, Mode=OneWay}\">\r\n                    <Button.Content>\r\n                        <StackPanel Orientation=\"Horizontal\" Margin=\"10,10,10,5\">\r\n                            <TextBlock Text=\"&#xec74;\" FontFamily=\"{StaticResource FontIcoFont}\" VerticalAlignment=\"Center\" />\r\n                            <TextBlock Text=\"{Binding Item.Name}\" VerticalAlignment=\"Center\" Margin=\"5,0,0,0\" />\r\n                        </StackPanel>\r\n                    </Button.Content>\r\n                </Button>                \r\n            </DataTemplate>\r\n        </ItemsControl.ItemTemplate>\r\n        <ItemsControl.Template>\r\n            <ControlTemplate>\r\n                <ScrollViewer HorizontalScrollBarVisibility=\"Auto\" VerticalScrollBarVisibility=\"Auto\"\r\n                              Focusable=\"False\">\r\n                    <ItemsPresenter />\r\n                </ScrollViewer>\r\n            </ControlTemplate>\r\n        </ItemsControl.Template>\r\n    </ItemsControl>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ActionSelectionWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class ActionSelectionWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new ActionSelectionWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for AboutWindow.xaml\r\n    /// </summary>\r\n    public partial class ActionSelectionWindow : WindowBase\r\n    {\r\n        public ActionSelectionWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/AddonsWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.AddonsWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        WindowStartupLocation=\"CenterOwner\"\r\n        Title=\"{DynamicResource LOCMenuAddons}\" Height=\"600\" Width=\"900\"\r\n        AutomationProperties.AutomationId=\"WindowExtensions\">\r\n\r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"Closing\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding WindowClosingCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n\r\n    <controls:WindowBase.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <DockPanel Margin=\"0,5,0,0\">\r\n        <Border DockPanel.Dock=\"Bottom\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{DynamicResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel LastChildFill=\"False\" Margin=\"5\">\r\n                <Button Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                        Command=\"{Binding CancelCommand}\"\r\n                        Style=\"{StaticResource BottomButton}\" />\r\n                <Button Content=\"{DynamicResource LOCSaveLabel}\" DockPanel.Dock=\"Right\"\r\n                        Command=\"{Binding ConfirmCommand}\"\r\n                        Style=\"{StaticResource BottomButton}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCAddonChangesRestart}\" DockPanel.Dock=\"Left\" Margin=\"5,0,0,0\"\r\n                       Style=\"{DynamicResource BaseTextBlockStyle}\" VerticalAlignment=\"Center\"\r\n                       Foreground=\"{DynamicResource WarningBrush}\"\r\n                       Visibility=\"{Binding IsRestartRequired, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n\r\n        <Border BorderThickness=\"0,1,0,0\" BorderBrush=\"{DynamicResource WindowPanelSeparatorBrush}\"\r\n                DockPanel.Dock=\"Left\">\r\n            <TreeView MinWidth=\"250\" BorderThickness=\"0\">\r\n                <i:Interaction.Triggers>\r\n                    <i:EventTrigger EventName=\"SelectedItemChanged\" >\r\n                        <prism:InvokeCommandAction Command=\"{Binding SectionChangedChangedCommand}\" />\r\n                    </i:EventTrigger>\r\n                </i:Interaction.Triggers>\r\n                <TreeViewItem Tag=\"10\" IsSelected=\"{Binding IsUpdateSectionSelected, Mode=TwoWay}\">\r\n                    <TreeViewItem.Style>\r\n                        <Style TargetType=\"TreeViewItem\" BasedOn=\"{StaticResource {x:Type TreeViewItem}}\">\r\n                            <Setter Property=\"Header\" Value=\"{Binding UpdateAddonCount}\" />\r\n                            <Setter Property=\"HeaderStringFormat\" Value=\"{DynamicResource LOCExtensionsUpdatesCount}\" />\r\n                            <Style.Triggers>\r\n                                <DataTrigger Binding=\"{Binding UpdateAddonCount}\" Value=\"0\">\r\n                                    <Setter Property=\"Header\" Value=\"{DynamicResource LOCExtensionsUpdates}\" />\r\n                                    <Setter Property=\"HeaderStringFormat\" Value=\"{x:Null}\" />\r\n                                </DataTrigger>\r\n                            </Style.Triggers>\r\n                        </Style>\r\n                    </TreeViewItem.Style>\r\n                </TreeViewItem>\r\n                <Separator />\r\n                <TreeViewItem Header=\"{DynamicResource LOCExtensionsSettings}\" IsExpanded=\"True\">\r\n                    <TreeViewItem Header=\"{DynamicResource LOCLibraries}\" ItemsSource=\"{Binding LibraryPlugins}\"\r\n                                  DisplayMemberPath=\"Name\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCMetadataProviders}\" ItemsSource=\"{Binding MetadataPlugins}\"\r\n                                  DisplayMemberPath=\"Name\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCExtensionGeneric}\" ItemsSource=\"{Binding GenericPlugins}\"\r\n                                  DisplayMemberPath=\"Description.Name\"\r\n                                  Visibility=\"{Binding AnyGenericPluginSettings, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n                </TreeViewItem>\r\n                <TreeViewItem Header=\"{DynamicResource LOCExtensionsInstalled}\" IsExpanded=\"True\">\r\n                    <TreeViewItem Header=\"{DynamicResource LOCLibraries}\" Tag=\"0\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCMetadataProviders}\" Tag=\"1\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCExtensionGeneric}\" Tag=\"2\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCAddonsThemesDesktop}\" Tag=\"3\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCAddonsThemesFullscren}\" Tag=\"4\" />\r\n                </TreeViewItem>\r\n                <TreeViewItem Header=\"{DynamicResource LOCExtensionsBrowse}\" IsExpanded=\"True\">\r\n                    <TreeViewItem Header=\"{DynamicResource LOCLibraries}\" Tag=\"5\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCMetadataProviders}\" Tag=\"6\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCExtensionGeneric}\" Tag=\"7\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCAddonsThemesDesktop}\" Tag=\"8\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCAddonsThemesFullscren}\" Tag=\"9\"/>\r\n                </TreeViewItem>\r\n            </TreeView>\r\n        </Border>\r\n\r\n        <Border DockPanel.Dock=\"Left\" BorderThickness=\"1,1,0,0\"\r\n                BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <ContentControl Content=\"{Binding SelectedSectionView}\" />\r\n        </Border>\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/AddonsWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class AddonsWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new AddonsWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for AboutWindow.xaml\r\n    /// </summary>\r\n    public partial class AddonsWindow : WindowBase\r\n    {\r\n        private WindowPositionHandler positionManager;\r\n\r\n        public AddonsWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            if (PlayniteApplication.Current.AppSettings != null)\r\n            {\r\n                positionManager = new WindowPositionHandler(this, \"AddonsWindow_2\", PlayniteApplication.Current.AppSettings.WindowPositions);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/CategoryConfigWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.CategoryConfigWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCCategoryWindowTitle}\" Height=\"320\" Width=\"340\"\r\n        WindowStartupLocation=\"CenterScreen\" ShowInTaskbar=\"False\"\r\n        AutomationProperties.AutomationId=\"WindowCategories\"\r\n        x:Name=\"WindowCategories\">\r\n\r\n    <DockPanel Margin=\"0,5,0,0\">\r\n        <DockPanel.Resources>\r\n            <p:BindingProxy x:Key=\"Proxy\" Data=\"{Binding}\" />\r\n        </DockPanel.Resources>\r\n\r\n        <Border DockPanel.Dock=\"Bottom\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel LastChildFill=\"False\" Margin=\"5\">\r\n                <Button Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\"  Style=\"{StaticResource BottomButton}\"\r\n                        DockPanel.Dock=\"Right\" IsCancel=\"True\" Command=\"{Binding CloseCommand}\" />\r\n                <Button Name=\"ButtonOK\" Content=\"{DynamicResource LOCCategorySetButton}\"\r\n                        DockPanel.Dock=\"Right\" Command=\"{Binding SetCategoriesCommand}\">\r\n                    <Button.Style>\r\n                        <Style TargetType=\"{x:Type Button}\" BasedOn=\"{StaticResource BottomButton}\">\r\n                            <Style.Triggers>\r\n                                <DataTrigger Binding=\"{Binding ElementName=TextNewCat, Path=IsFocused}\" Value=\"True\">\r\n                                    <Setter Property=\"IsDefault\"  Value=\"False\"/>\r\n                                </DataTrigger>\r\n                                <DataTrigger Binding=\"{Binding ElementName=TextNewCat, Path=IsFocused}\" Value=\"False\">\r\n                                    <Setter Property=\"IsDefault\"  Value=\"True\"/>\r\n                                </DataTrigger>\r\n                            </Style.Triggers>\r\n                        </Style>\r\n                    </Button.Style>\r\n                </Button>\r\n            </DockPanel>\r\n        </Border>\r\n\r\n        <Border Padding=\"8\" DockPanel.Dock=\"Bottom\"\r\n            BorderThickness=\"0\">\r\n            <DockPanel>\r\n                <Button Name=\"ButtonAddCat\" Content=\"{DynamicResource LOCCategoryAddCatButton}\"\r\n                        DockPanel.Dock=\"Left\" \r\n                        Command=\"{Binding AddCategoryCommand}\" CommandParameter=\"{Binding Text, ElementName=TextNewCat}\"\r\n                        IsDefault=\"{Binding IsFocused, ElementName=TextNewCat}\" />\r\n                <TextBox Name=\"TextNewCat\" Text=\"{Binding NewTextCat}\" DockPanel.Dock=\"Left\"\r\n                         Margin=\"10,0,0,0\" VerticalAlignment=\"Top\"/>\r\n            </DockPanel>\r\n        </Border>\r\n\r\n        <ScrollViewer DockPanel.Dock=\"Top\" HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\">\r\n            <ItemsControl Name=\"ListCategories\" ItemsSource=\"{Binding Categories}\">\r\n                <ItemsControl.ItemTemplate>\r\n                    <DataTemplate>\r\n                        <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item}\"\r\n                                  Margin=\"5,2,2,2\"\r\n                                  IsThreeState=\"{Binding Data.EnableThreeState, Source={StaticResource Proxy}}\"\r\n                                  ToolTip=\"{DynamicResource LOCCategoryTooltip}\" />\r\n                    </DataTemplate>\r\n                </ItemsControl.ItemTemplate>\r\n            </ItemsControl>\r\n        </ScrollViewer>\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/CategoryConfigWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class CategoryConfigWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new CategoryConfigWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for CategoryConfigWindow.xaml\r\n    /// </summary>\r\n    public partial class CategoryConfigWindow : WindowBase\r\n    {\r\n        private WindowPositionHandler positionManager;\r\n\r\n        public CategoryConfigWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            if (PlayniteApplication.Current.AppSettings != null)\r\n            {\r\n                positionManager = new WindowPositionHandler(this, \"CategoryConfig_V2\", PlayniteApplication.Current.AppSettings.WindowPositions);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ControlGallery.xaml",
    "content": "﻿<Window x:Class=\"Playnite.DesktopApp.Windows.ControlGallery\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.DesktopApp.Windows\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"        \r\n        Title=\"ThemeTesterWindow\" Width=\"800\" Height=\"700\"\r\n        d:DataContext=\"{Binding RelativeSource={RelativeSource Self}}\">\r\n\r\n    <ContentControl Style=\"{StaticResource ControlGalleryContentStyle}\" />\r\n</Window>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ControlGallery.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for ControlGallery.xaml\r\n    /// </summary>\r\n    public partial class ControlGallery : Window\r\n    {\r\n        public ControlGallery() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/CrashHandlerWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.CrashHandlerWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCCrashWindowTitle}\" SizeToContent=\"Height\" Width=\"600\"\r\n        WindowStartupLocation=\"CenterScreen\"\r\n        AutomationProperties.AutomationId=\"WindowCrash\">\r\n\r\n    <DockPanel Margin=\"5\">\r\n        <StackPanel DockPanel.Dock=\"Bottom\">\r\n            <DockPanel LastChildFill=\"False\">\r\n                <Button Name=\"ButtonRestart\" Content=\"{DynamicResource LOCCrashRestartPlaynite}\" DockPanel.Dock=\"Right\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding RestartCommand}\"/>\r\n                <Button Name=\"ButtonSaveDiag\" Content=\"{DynamicResource LOCCrashSendDiag}\" DockPanel.Dock=\"Left\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding CreateDiagPackageCommand}\"/>\r\n                <Button Name=\"ButtonReportIssue\" Content=\"{DynamicResource LOCCrashReportIssue}\" DockPanel.Dock=\"Left\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding ReportIssueCommand}\"/>\r\n            </DockPanel>\r\n            <Button Content=\"{DynamicResource LOCCrashRestartSafe}\" HorizontalAlignment=\"Right\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    ToolTipService.InitialShowDelay=\"0\"\r\n                    ToolTip=\"{DynamicResource LOCCrashRestartSafeTooltip}\"\r\n                    Command=\"{Binding RestartSafeCommand}\"/>\r\n        </StackPanel>\r\n        <TextBlock Text=\"{DynamicResource LOCCrashDescription}\"\r\n                   Margin=\"5\"\r\n                   VerticalAlignment=\"Center\" DockPanel.Dock=\"Top\" \r\n                   TextWrapping=\"Wrap\" Foreground=\"{StaticResource TextBrush}\" />\r\n        <Label Content=\"{DynamicResource LOCCrashUserActionsDescription}\" DockPanel.Dock=\"Top\"\r\n               Margin=\"5\" FontSize=\"12\"/>\r\n        <TextBox Name=\"TextBoxDescription\" Text=\"{Binding Description}\" Margin=\"5\" MinLines=\"3\"\r\n                 TextWrapping=\"Wrap\" AcceptsReturn=\"True\" AcceptsTab=\"True\" SpellCheck.IsEnabled=\"True\"/>\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/CrashHandlerWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for CrashHandlerWindow.xaml\r\n    /// </summary>\r\n    public partial class CrashHandlerWindow : WindowBase\r\n    {\r\n        public CrashHandlerWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/DatabaseFieldsManagerWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.DatabaseFieldsManagerWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        WindowStartupLocation=\"CenterOwner\"\r\n        Title=\"{DynamicResource LOCLibraryManager}\" Height=\"600\" Width=\"750\">\r\n\r\n    <Grid>\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n\r\n        <TabControl Grid.Column=\"0\" Grid.Row=\"0\" TabStripPlacement=\"Left\">\r\n            <!--Platform-->\r\n            <TabItem Header=\"{DynamicResource LOCPlatformsTitle}\">\r\n                <DockPanel>\r\n                    <DockPanel DockPanel.Dock=\"Bottom\" LastChildFill=\"False\">\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddPlatformCommand}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenamePlatformCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListPlatforms}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"25,5,5,5\"\r\n                                Command=\"{Binding RemovePlatformCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListPlatforms}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveUnusedTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveUnusedPlatformsCommand}\"/>\r\n                    </DockPanel>\r\n                    <Grid>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition />\r\n                        </Grid.RowDefinitions>\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"250\" />\r\n                            <ColumnDefinition Width=\"*\" />\r\n                        </Grid.ColumnDefinitions>\r\n\r\n                        <Grid Grid.Column=\"1\" Grid.Row=\"0\">\r\n                            <Grid.RowDefinitions>\r\n                                <RowDefinition Height=\"Auto\"/>\r\n                                <RowDefinition Height=\"2*\"/>\r\n                                <RowDefinition Height=\"3*\"/>\r\n                                <RowDefinition Height=\"3*\"/>\r\n                            </Grid.RowDefinitions>\r\n                            <DockPanel Grid.Row=\"0\" Margin=\"5,10,5,10\">\r\n                                <TextBlock Text=\"{DynamicResource LOCPlatformSpec}\" VerticalAlignment=\"Center\" DockPanel.Dock=\"Left\" />\r\n                                <ComboBox Margin=\"5,0,0,0\" DockPanel.Dock=\"Left\"\r\n                                          ItemsSource=\"{Binding PlatformsSpecifications}\"\r\n                                          SelectedValue=\"{Binding SelectedItem.SpecificationId, ElementName=ListPlatforms}\"\r\n                                          SelectedValuePath=\"Id\"/>\r\n                            </DockPanel>                            \r\n                            <GroupBox Header=\"{DynamicResource LOCGameIconTitle}\" Margin=\"5\" Grid.Row=\"1\">\r\n                                <DockPanel>\r\n                                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\">\r\n                                        <Button Content=\"{DynamicResource LOCSelectIconTitle}\"\r\n                                            Margin=\"5\" MaxWidth=\"160\" HorizontalAlignment=\"Left\"\r\n                                            Command=\"{Binding SelectPlatformIconCommand}\"\r\n                                            CommandParameter=\"{Binding SelectedItems, ElementName=ListPlatforms}\"/>\r\n                                        <Button Content=\"{DynamicResource LOCRemoveLabel}\" Margin=\"5\"\r\n                                                Command=\"{Binding RemovePlatformIconCommand}\"\r\n                                                CommandParameter=\"{Binding SelectedItems, ElementName=ListPlatforms}\"/>\r\n                                    </StackPanel>\r\n                                    <Image Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\" DockPanel.Dock=\"Top\"\r\n                                           Source=\"{Binding SelectedItem.Icon, Mode=OneWay, Converter={StaticResource ImageStringToImageConverterCached}, ElementName=ListPlatforms}\" />\r\n                                </DockPanel>\r\n                            </GroupBox>\r\n                            <GroupBox Header=\"{DynamicResource LOCGameCoverImageTitle}\" Margin=\"5\" Grid.Row=\"2\">\r\n                                <DockPanel>\r\n                                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\">\r\n                                        <Button Content=\"{DynamicResource LOCSelectCoverTitle}\"\r\n                                            Margin=\"5\" MaxWidth=\"160\" HorizontalAlignment=\"Left\"\r\n                                            Command=\"{Binding SelectPlatformCoverCommand}\"\r\n                                            CommandParameter=\"{Binding SelectedItems, ElementName=ListPlatforms}\"/>\r\n                                        <Button Content=\"{DynamicResource LOCRemoveLabel}\" Margin=\"5\"\r\n                                                Command=\"{Binding RemovePlatformCoverCommand}\"\r\n                                                CommandParameter=\"{Binding SelectedItems, ElementName=ListPlatforms}\"/>\r\n                                    </StackPanel>\r\n                                    <Image Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\" DockPanel.Dock=\"Top\"\r\n                                           Source=\"{Binding SelectedItem.Cover, Mode=OneWay, Converter={StaticResource ImageStringToImageConverterCached}, ElementName=ListPlatforms}\"/>\r\n                                </DockPanel>\r\n                            </GroupBox>\r\n                            <GroupBox Header=\"{DynamicResource LOCGameBackgroundTitle}\" Margin=\"5\" Grid.Row=\"3\">\r\n                                <DockPanel>\r\n                                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\">\r\n                                        <Button Content=\"{DynamicResource LOCSelectBackgroundTitle}\"\r\n                                            Margin=\"5\" MaxWidth=\"160\" HorizontalAlignment=\"Left\"\r\n                                            Command=\"{Binding SelectPlatformBackgroundCommand}\"\r\n                                            CommandParameter=\"{Binding SelectedItems, ElementName=ListPlatforms}\"/>\r\n                                        <Button Content=\"{DynamicResource LOCRemoveLabel}\" Margin=\"5\"\r\n                                                Command=\"{Binding RemovePlatformBackgroundCommand}\"\r\n                                                CommandParameter=\"{Binding SelectedItems, ElementName=ListPlatforms}\"/>\r\n                                    </StackPanel>\r\n                                    <Image Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\" DockPanel.Dock=\"Top\"\r\n                                           Source=\"{Binding SelectedItem.Background, Mode=OneWay, Converter={StaticResource ImageStringToImageConverterCached}, ElementName=ListPlatforms}\"/>\r\n                                </DockPanel>\r\n                            </GroupBox>\r\n                        </Grid>\r\n                        <ListBox Name=\"ListPlatforms\" Grid.Column=\"0\" Grid.Row=\"0\"\r\n                             DockPanel.Dock=\"Top\" Margin=\"5\" SelectionMode=\"Extended\"\r\n                             ItemsSource=\"{Binding EditingPlatforms}\" DisplayMemberPath=\"Name\" />\r\n                    </Grid>\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!--Category-->\r\n            <TabItem Header=\"{DynamicResource LOCCategoriesLabel}\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddCategoryCommand}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenameCategoryCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListCategories}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"25,5,5,5\"\r\n                                Command=\"{Binding RemoveCategoryCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListCategories}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveUnusedTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveUnusedCategoriesCommand}\"/>\r\n                    </StackPanel>\r\n                    <ListBox Name=\"ListCategories\"\r\n                             DockPanel.Dock=\"Top\" Margin=\"5\" SelectionMode=\"Extended\"\r\n                             ItemsSource=\"{Binding EditingCategories}\" DisplayMemberPath=\"Name\" />\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!--Genre-->\r\n            <TabItem Header=\"{DynamicResource LOCGenresLabel}\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddGenreCommand}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenameGenreCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListGenres}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"25,5,5,5\"\r\n                                Command=\"{Binding RemoveGenreCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListGenres}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveUnusedTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveUnusedGenresCommand}\"/>\r\n                    </StackPanel>\r\n                    <ListBox Name=\"ListGenres\"\r\n                             DockPanel.Dock=\"Top\" Margin=\"5\" SelectionMode=\"Extended\"\r\n                             ItemsSource=\"{Binding EditingGenres}\" DisplayMemberPath=\"Name\" />\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!--Company-->\r\n            <TabItem Header=\"{DynamicResource LOCCompaniesLabel}\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddCompanyCommand}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenameCompanyCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListCompanies}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"25,5,5,5\"\r\n                                Command=\"{Binding RemoveCompanyCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListCompanies}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveUnusedTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveUnusedCompaniesCommand}\"/>\r\n                    </StackPanel>\r\n                    <ListBox Name=\"ListCompanies\"\r\n                             DockPanel.Dock=\"Top\" Margin=\"5\" SelectionMode=\"Extended\"\r\n                             ItemsSource=\"{Binding EditingCompanies}\" DisplayMemberPath=\"Name\" />\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!--Features-->\r\n            <TabItem Header=\"{DynamicResource LOCFeaturesLabel}\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddFeatureCommand}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenameFeatureCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListFeatures}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"25,5,5,5\"\r\n                                Command=\"{Binding RemoveFeatureCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListFeatures}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveUnusedTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveUnusedFeaturesCommand}\"/>\r\n                    </StackPanel>\r\n                    <ListBox Name=\"ListFeatures\"\r\n                             DockPanel.Dock=\"Top\" Margin=\"5\" SelectionMode=\"Extended\"\r\n                             ItemsSource=\"{Binding EditingFeatures}\" DisplayMemberPath=\"Name\" />\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!--Tag-->\r\n            <TabItem Header=\"{DynamicResource LOCTagsLabel}\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddTagCommand}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenameTagCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListTags}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"25,5,5,5\"\r\n                                Command=\"{Binding RemoveTagCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListTags}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveUnusedTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveUnusedTagsCommand}\"/>\r\n                    </StackPanel>\r\n                    <ListBox Name=\"ListTags\"\r\n                             DockPanel.Dock=\"Top\" Margin=\"5\" SelectionMode=\"Extended\"\r\n                             ItemsSource=\"{Binding EditingTags}\" DisplayMemberPath=\"Name\" />\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!--Series-->\r\n            <TabItem Header=\"{DynamicResource LOCSeriesLabel}\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddSeriesCommand}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenameSeriesCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListSeries}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"25,5,5,5\"\r\n                                Command=\"{Binding RemoveSeriesCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListSeries}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveUnusedTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveUnusedSeriesCommand}\"/>\r\n                    </StackPanel>\r\n                    <ListBox Name=\"ListSeries\"\r\n                             DockPanel.Dock=\"Top\" Margin=\"5\" SelectionMode=\"Extended\"\r\n                             ItemsSource=\"{Binding EditingSeries}\" DisplayMemberPath=\"Name\" />\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!--AgeRating-->\r\n            <TabItem Header=\"{DynamicResource LOCAgeRatingsLabel}\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddAgeRatingCommand}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenameAgeRatingCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListAgeRatings}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"25,5,5,5\"\r\n                                Command=\"{Binding RemoveAgeRatingCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListAgeRatings}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveUnusedTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveUnusedAgeRatingsCommand}\"/>\r\n                    </StackPanel>\r\n                    <ListBox Name=\"ListAgeRatings\"\r\n                             DockPanel.Dock=\"Top\" Margin=\"5\" SelectionMode=\"Extended\"\r\n                             ItemsSource=\"{Binding EditingAgeRatings}\" DisplayMemberPath=\"Name\" />\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!--Region-->\r\n            <TabItem Header=\"{DynamicResource LOCRegionsLabel}\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddRegionCommand}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenameRegionCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListRegions}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"25,5,5,5\"\r\n                                Command=\"{Binding RemoveRegionCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListRegions}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveUnusedTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveUnusedRegionsCommand}\"/>\r\n                    </StackPanel>\r\n                    <Grid>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition />\r\n                        </Grid.RowDefinitions>\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"250\" />\r\n                            <ColumnDefinition Width=\"*\" />\r\n                        </Grid.ColumnDefinitions>\r\n\r\n                        <Grid Grid.Column=\"1\" Grid.Row=\"0\">\r\n                            <Grid.RowDefinitions>\r\n                                <RowDefinition Height=\"Auto\"/>\r\n                                <RowDefinition Height=\"2*\"/>\r\n                                <RowDefinition Height=\"3*\"/>\r\n                                <RowDefinition Height=\"3*\"/>\r\n                            </Grid.RowDefinitions>\r\n                            <DockPanel Grid.Row=\"0\" Margin=\"5,10,5,10\">\r\n                                <TextBlock Text=\"{DynamicResource LOCRegionSpec}\" VerticalAlignment=\"Center\" DockPanel.Dock=\"Left\" />\r\n                                <ComboBox Margin=\"5,0,0,0\" DockPanel.Dock=\"Left\"\r\n                                          ItemsSource=\"{Binding RegionsSpecifications}\"\r\n                                          SelectedValue=\"{Binding SelectedItem.SpecificationId, ElementName=ListRegions}\"\r\n                                          SelectedValuePath=\"Id\"/>\r\n                            </DockPanel>\r\n                        </Grid>\r\n\r\n                        <ListBox Name=\"ListRegions\" Grid.Column=\"0\"\r\n                                 Margin=\"5\" SelectionMode=\"Extended\"\r\n                                 ItemsSource=\"{Binding EditingRegions}\" DisplayMemberPath=\"Name\" />\r\n                    </Grid>\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!--Source-->\r\n            <TabItem Header=\"{DynamicResource LOCSourcesLabel}\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddSourceCommand}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenameSourceCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListSources}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"25,5,5,5\"\r\n                                Command=\"{Binding RemoveSourceCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListSources}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveUnusedTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveUnusedSourcesCommand}\"/>\r\n                    </StackPanel>\r\n                    <ListBox Name=\"ListSources\"\r\n                             DockPanel.Dock=\"Top\" Margin=\"5\" SelectionMode=\"Extended\"\r\n                             ItemsSource=\"{Binding EditingSources}\" DisplayMemberPath=\"Name\" />\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!--Completion Statuses-->\r\n            <TabItem Header=\"{DynamicResource LOCCompletionStatuses}\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddCompletionStatusCommand}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenameCompletionStatusCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListCompletionStatuses}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"25,5,5,5\"\r\n                                Command=\"{Binding RemoveCompletionStatusCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListCompletionStatuses}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveUnusedTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveUnusedCompletionStatusesCommand}\"/>\r\n                    </StackPanel>\r\n                    <Grid>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition />\r\n                        </Grid.RowDefinitions>\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"250\" />\r\n                            <ColumnDefinition Width=\"*\" />\r\n                        </Grid.ColumnDefinitions>\r\n\r\n                        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\" Margin=\"0,5,5,0\">\r\n                            <TextBlock Text=\"{DynamicResource LOCCompletionStatusDefaultStatusDesc}\" TextWrapping=\"Wrap\" Margin=\"5\" />\r\n                            <ComboBox Margin=\"5\"\r\n                                      ItemsSource=\"{Binding CompletionStatusesSelection}\"\r\n                                      SelectedValue=\"{Binding CompletionStatusSettings.DefaultStatus}\"\r\n                                      SelectedValuePath=\"Id\" />\r\n                            <TextBlock Text=\"{DynamicResource LOCCompletionStatusPlayedStatusDesc}\" TextWrapping=\"Wrap\" Margin=\"5\" />\r\n                            <ComboBox Margin=\"5\"\r\n                                      ItemsSource=\"{Binding CompletionStatusesSelection}\"\r\n                                      SelectedValue=\"{Binding CompletionStatusSettings.PlayedStatus}\"\r\n                                      SelectedValuePath=\"Id\" />\r\n                        </StackPanel>\r\n\r\n                        <ListBox Name=\"ListCompletionStatuses\" Grid.Column=\"0\"\r\n                                 Margin=\"5\" SelectionMode=\"Extended\"\r\n                                 ItemsSource=\"{Binding EditingCompletionStatuses}\" DisplayMemberPath=\"Name\" />\r\n                    </Grid>\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!--FilterPresets-->\r\n            <TabItem Header=\"{DynamicResource LOCSettingsTopPanelFilterPresetsItem}\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                        <Button Content=\"{DynamicResource LOCRenameTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding RenameFilterPresetCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListFilterPresets}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Margin=\"5,5,25,5\"\r\n                                Command=\"{Binding RemoveFilterPresetCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListFilterPresets}\"/>\r\n                        <Button Name=\"ButtonMoveUpFilterPreset\" FontFamily=\"Marlett\" Content=\"5\" Margin=\"5\"\r\n                                Command=\"{Binding MoveUpFilterPresetCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListFilterPresets}\"/>\r\n                        <Button Name=\"ButtonMoveDownFilterPreset\" FontFamily=\"Marlett\" Content=\"6\" Margin=\"5\"\r\n                                Command=\"{Binding MoveDownFilterPresetCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItems, ElementName=ListFilterPresets}\"/>\r\n                    </StackPanel>\r\n                    <Grid>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition />\r\n                        </Grid.RowDefinitions>\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"250\" />\r\n                            <ColumnDefinition Width=\"*\" />\r\n                        </Grid.ColumnDefinitions>\r\n                        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\" Margin=\"5,10,5,10\"\r\n                                    Visibility=\"{Binding SelectedItem, ElementName=ListFilterPresets, Converter={StaticResource NullToVisibilityConverter}}\">\r\n                            <CheckBox Content=\"{DynamicResource LOCFilterPresetShowOnFSTopPanel}\"\r\n                                      IsChecked=\"{Binding SelectedItem.ShowInFullscreeQuickSelection, ElementName=ListFilterPresets}\" />\r\n                        </StackPanel>\r\n                        <ListBox Name=\"ListFilterPresets\" Grid.Column=\"0\" Grid.Row=\"0\"\r\n                                 DockPanel.Dock=\"Top\" Margin=\"5\" SelectionMode=\"Extended\"\r\n                                 ItemsSource=\"{Binding EditingFilterPresets}\" DisplayMemberPath=\"Name\" />\r\n                    </Grid>\r\n\r\n                </DockPanel>\r\n            </TabItem>\r\n            \r\n        </TabControl>\r\n\r\n        <Border Grid.Column=\"0\" Grid.Row=\"1\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel KeyboardNavigation.TabNavigation=\"Local\" LastChildFill=\"False\" Margin=\"5\">\r\n                <Button Content=\"{DynamicResource LOCMenuHelpTitle}\" DockPanel.Dock=\"Left\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                        CommandParameter=\"{}{DocsRootUrl}/manual/libraryManager.html\" />\r\n                <Button TabIndex=\"3\" Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding CancelCommand}\"/>\r\n                <Button TabIndex=\"2\" Name=\"ButtonOK\" Content=\"{DynamicResource LOCSaveLabel}\" DockPanel.Dock=\"Right\" IsDefault=\"True\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding SaveCommand}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/DatabaseFieldsManagerWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class DatabaseFieldsManagerWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new DatabaseFieldsManagerWindow();\r\n        }\r\n    }\r\n\r\n    public partial class DatabaseFieldsManagerWindow : WindowBase\r\n    {\r\n        public DatabaseFieldsManagerWindow() : base(\"DatabaseFieldsManagerWindow_V2\")\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/EmulatedGameImportWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.EmulatedGameImportWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:dctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n        xmlns:pvm=\"clr-namespace:Playnite.DesktopApp.ViewModels\"\r\n        xmlns:psdkm=\"clr-namespace:Playnite.SDK.Models;assembly=Playnite.SDK\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"       \r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"     \r\n        xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"\" WindowStartupLocation=\"CenterOwner\"\r\n        Height=\"600\" Width=\"800\" x:Name=\"WindowEmulatorImport\"\r\n        AutomationProperties.AutomationId=\"WindowEmulatorImport\">\r\n\r\n    <controls:WindowBase.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <Grid>\r\n        <Grid.Resources>\r\n            <p:BindingProxy x:Key=\"BindingProxy\" Data=\"{Binding}\" />\r\n        </Grid.Resources>\r\n\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"Auto\"/>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n\r\n        <TextBlock Grid.Row=\"0\" TextWrapping=\"Wrap\" Margin=\"10,5,10,5\"\r\n                   Visibility=\"{Binding IsScanSetup, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                   Text=\"{DynamicResource LOCEmuImportDirectoryConfigDesc}\" />\r\n\r\n        <controls:ExtendedDataGrid Grid.Row=\"1\" Margin=\"10,5,10,0\"\r\n                  Visibility=\"{Binding IsScanSetup, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\"\r\n                  CanUserAddRows=\"False\" AutoGenerateColumns=\"False\" CanUserResizeRows=\"False\" GridLinesVisibility=\"None\"\r\n                  ItemsSource=\"{Binding GameList}\" SelectedItemsList=\"{Binding SelectedGames, Mode=TwoWay}\">\r\n            <i:Interaction.Triggers>\r\n                <i:EventTrigger EventName=\"ContextMenuOpening\" >\r\n                    <prism:InvokeCommandAction Command=\"{Binding Data.ContextMenuOpening, Source={StaticResource BindingProxy}}\" />\r\n                </i:EventTrigger>\r\n            </i:Interaction.Triggers>\r\n            <DataGrid.ContextMenu>\r\n                <ContextMenu ItemsSource=\"{Binding Data.MenuItems, Source={StaticResource BindingProxy}}\">  \r\n                    <ContextMenu.ItemContainerStyle>\r\n                        <Style TargetType=\"MenuItem\">\r\n                            <Setter Property=\"Command\" Value=\"{Binding Command}\" />\r\n                            <Setter Property=\"ItemsSource\" Value=\"{Binding Items}\" />\r\n                        </Style>\r\n                    </ContextMenu.ItemContainerStyle>\r\n                </ContextMenu>\r\n            </DataGrid.ContextMenu>\r\n            <DataGrid.Columns>\r\n                <DataGridTemplateColumn Header=\"{DynamicResource LOCImportLabel}\">\r\n                    <DataGridTemplateColumn.CellTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Import, UpdateSourceTrigger=PropertyChanged}\" HorizontalAlignment=\"Center\" />\r\n                        </DataTemplate>\r\n                    </DataGridTemplateColumn.CellTemplate>\r\n                </DataGridTemplateColumn>\r\n                <DataGridTemplateColumn Header=\"{DynamicResource LOCNameLabel}\" SortMemberPath=\"Name\" MinWidth=\"300\">\r\n                    <DataGridTemplateColumn.CellTemplate>\r\n                        <DataTemplate>\r\n                            <TextBox Text=\"{Binding Name, UpdateSourceTrigger=PropertyChanged}\"\r\n                                     Background=\"{StaticResource NormalBrushDark}\"/>\r\n                        </DataTemplate>\r\n                    </DataGridTemplateColumn.CellTemplate>\r\n                </DataGridTemplateColumn>\r\n                <DataGridTemplateColumn Header=\"{DynamicResource LOCPlatformTitle}\" Width=\"200\">\r\n                    <DataGridTemplateColumn.CellTemplate>\r\n                        <DataTemplate>\r\n                            <dctrls:ComboBoxList Background=\"{StaticResource NormalBrushDark}\"\r\n                                                 SelectedItems=\"{Binding Platforms, UpdateSourceTrigger=PropertyChanged}\"\r\n                                                 ItemsSource=\"{Binding Data.Platforms, Source={StaticResource BindingProxy}}\"/>\r\n                        </DataTemplate>\r\n                    </DataGridTemplateColumn.CellTemplate>\r\n                </DataGridTemplateColumn>\r\n                <DataGridTemplateColumn Header=\"{DynamicResource LOCRegionLabel}\" Width=\"200\">\r\n                    <DataGridTemplateColumn.CellTemplate>\r\n                        <DataTemplate>\r\n                            <dctrls:ComboBoxList Background=\"{StaticResource NormalBrushDark}\"\r\n                                                 SelectedItems=\"{Binding Regions, UpdateSourceTrigger=PropertyChanged}\"\r\n                                                 ItemsSource=\"{Binding Data.Regions, Source={StaticResource BindingProxy}}\"/>\r\n                        </DataTemplate>\r\n                    </DataGridTemplateColumn.CellTemplate>\r\n                </DataGridTemplateColumn>\r\n                <!--Hack to make the last empty column being able to slect a row-->\r\n                <DataGridTemplateColumn Width=\"*\">\r\n                    <DataGridTemplateColumn.CellTemplate>\r\n                        <DataTemplate>\r\n                            <TextBlock VerticalAlignment=\"Stretch\" HorizontalAlignment=\"Stretch\" />\r\n                        </DataTemplate>\r\n                    </DataGridTemplateColumn.CellTemplate>\r\n                </DataGridTemplateColumn>\r\n            </DataGrid.Columns>\r\n            <DataGrid.RowDetailsTemplate>\r\n                <DataTemplate>\r\n                    <ListView ItemsSource=\"{Binding Roms}\" BorderThickness=\"0\" Margin=\"8\">\r\n                        <ListView.ContextMenu>\r\n                            <ContextMenu Visibility=\"Collapsed\" />\r\n                        </ListView.ContextMenu>\r\n                        <ListView.ItemContainerStyle>\r\n                            <Style TargetType=\"ListViewItem\" BasedOn=\"{StaticResource {x:Type ListViewItem}}\">\r\n                                <Setter Property=\"Focusable\" Value=\"false\"/>\r\n                                <Setter Property=\"ContextMenu\">\r\n                                    <Setter.Value>\r\n                                        <ContextMenu>\r\n                                            <MenuItem Header=\"{DynamicResource LOCEmuImportAddROMExclusionList}\"\r\n                                                      Command=\"{Binding Data.AddFileToExclusionListCommand, Source={StaticResource BindingProxy}}\"\r\n                                                      CommandParameter=\"{Binding}\"/>\r\n                                            <MenuItem Header=\"{DynamicResource LOCEmuImportAddFolderExclusionList}\"\r\n                                                      Command=\"{Binding Data.AddDirToExclusionListCommand, Source={StaticResource BindingProxy}}\"\r\n                                                      CommandParameter=\"{Binding}\"/>\r\n                                        </ContextMenu>\r\n                                    </Setter.Value>\r\n                                </Setter>\r\n                            </Style>\r\n                        </ListView.ItemContainerStyle>\r\n                        <ListView.View>\r\n                            <GridView>\r\n                                <GridViewColumn>\r\n                                    <GridViewColumn.CellTemplate>\r\n                                        <DataTemplate>\r\n                                            <CheckBox IsChecked=\"{Binding Import}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />\r\n                                        </DataTemplate>\r\n                                    </GridViewColumn.CellTemplate>\r\n                                </GridViewColumn>\r\n                                <GridViewColumn Header=\"{DynamicResource LOCNameLabel}\" Width=\"Auto\" DisplayMemberBinding=\"{Binding Name.DiscName}\" />\r\n                                <GridViewColumn Header=\"{DynamicResource LOCPathLabel}\" Width=\"Auto\" DisplayMemberBinding=\"{Binding Path}\" />\r\n                                <GridViewColumn Header=\"db\" \r\n                                                Width=\"{Binding Path=(p:PlayniteEnvironment.IsDebugBuild), Converter={StaticResource BoolToAutoWidthConverter}}\">\r\n                                    <GridViewColumn.CellTemplate>\r\n                                        <DataTemplate>\r\n                                            <TextBox IsReadOnly=\"True\" Text=\"{Binding DbData, Mode=OneWay, Converter={StaticResource ObjectToStringConverter}}\" />\r\n                                        </DataTemplate>\r\n                                    </GridViewColumn.CellTemplate>\r\n                                </GridViewColumn>\r\n                            </GridView>\r\n                        </ListView.View>\r\n                    </ListView>\r\n                </DataTemplate>\r\n            </DataGrid.RowDetailsTemplate>\r\n        </controls:ExtendedDataGrid>\r\n\r\n        <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\"\r\n                      Grid.Row=\"1\" Visibility=\"{Binding IsScanSetup, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                      Margin=\"5,5,5,0\">\r\n            <ItemsControl ItemsSource=\"{Binding ScannerConfigs}\">\r\n                <ItemsControl.ItemTemplate>\r\n                    <DataTemplate>\r\n                        <Border Margin=\"5\" DockPanel.Dock=\"Top\" BorderThickness=\"1\" \r\n                                BorderBrush=\"{DynamicResource NormalBorderBrush}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\">\r\n                            <StackPanel Margin=\"10\">\r\n                                <StackPanel.Resources>\r\n                                    <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n                                </StackPanel.Resources>\r\n                                <StackPanel Orientation=\"Horizontal\">\r\n                                    <TextBlock Text=\"{DynamicResource LOCEmuScanEmulator}\" VerticalAlignment=\"Center\" />\r\n                                    <ComboBox Width=\"150\" Margin=\"10,0,10,0\" Name=\"ComboEmulatorList\"\r\n                                                ItemsSource=\"{Binding Data.Emulators, Source={StaticResource BindingProxy}}\"\r\n                                                DisplayMemberPath=\"Name\" SelectedValuePath=\"Id\" SelectedValue=\"{Binding EmulatorId}\" />\r\n                                    <TextBlock Text=\"{DynamicResource LOCProfileLabel}\" VerticalAlignment=\"Center\" />\r\n                                    <ComboBox Width=\"150\" Margin=\"10,0,10,0\"\r\n                                                ItemsSource=\"{Binding SelectedItem.AllProfiles, ElementName=ComboEmulatorList}\"\r\n                                                DisplayMemberPath=\"Name\" SelectedValuePath=\"Id\" SelectedValue=\"{Binding EmulatorProfileId}\" />\r\n                                </StackPanel>\r\n                                <StackPanel Orientation=\"Horizontal\" Margin=\"0,10,0,10\">\r\n                                    <TextBlock Text=\"{DynamicResource LOCEmuOverridePlatform}\" VerticalAlignment=\"Center\"\r\n                                               ToolTip=\"{DynamicResource LOCEmuOverridePlatformTooltip}\" />\r\n                                    <ComboBox VerticalAlignment=\"Center\" Margin=\"10,0,00,0\" MinWidth=\"150\"\r\n                                              ToolTip=\"{DynamicResource LOCEmuOverridePlatformTooltip}\"\r\n                                              SelectedValue=\"{Binding OverridePlatformId}\" SelectedValuePath=\"Id\"\r\n                                              DisplayMemberPath=\"Name\"\r\n                                              ItemsSource=\"{Binding Data.OverridePlatforms, Source={StaticResource BindingProxy}}\"/>\r\n                                    <TextBlock Text=\"{DynamicResource LOCScannerConfigPlayActionSettings}\"\r\n                                               Margin=\"20,0,10,0\" VerticalAlignment=\"Center\" />\r\n                                    <ComboBox VerticalAlignment=\"Center\"\r\n                                              pbeh:SelectorBehaviors.EnumSource=\"{x:Type psdkm:ScannerConfigPlayActionSettings}\"\r\n                                              SelectedValue=\"{Binding PlayActionSettings}\"/>\r\n                                </StackPanel>\r\n                                <DockPanel Margin=\"0,10,0,10\">\r\n                                    <TextBlock Text=\"{DynamicResource LOCEmuScanDirectory}\" VerticalAlignment=\"Center\" />\r\n                                    <dctrls:PathSelectionBox Margin=\"10,0,10,0\" ShowDirectorySelector=\"True\"\r\n                                                             Text=\"{Binding Directory, UpdateSourceTrigger=PropertyChanged}\"/>\r\n                                </DockPanel>\r\n                                <DockPanel Margin=\"0,0,0,10\">\r\n                                    <TextBlock Text=\"{DynamicResource LOCEmuCrcExcludeFileTypes}\" VerticalAlignment=\"Center\"\r\n                                               ToolTip=\"{DynamicResource LOCEmuCrcExcludeFileTypesTooltip}\"/>\r\n                                    <TextBox Text=\"{Binding CrcExcludeFileTypes, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ListToStringConverter}}\"\r\n                                             Margin=\"10,0,10,0\"                                             \r\n                                             ToolTip=\"{DynamicResource LOCEmuCrcExcludeFileTypesTooltip}\"/>\r\n                                </DockPanel>\r\n                                <StackPanel Orientation=\"Horizontal\" Margin=\"0,0,0,10\">\r\n                                    <CheckBox Content=\"{DynamicResource LOCEmuExcludeOnlineFiles}\"\r\n                                              ToolTip=\"{DynamicResource LOCEmuExcludeOnlineFilesTooltip}\"\r\n                                              Name=\"CheckExcludeOnlineFiles\"\r\n                                              IsChecked=\"{Binding ExcludeOnlineFiles}\" />\r\n                                    <CheckBox Content=\"{DynamicResource LOCEmuUseSimplifiedOnlineFileScan}\"\r\n                                              ToolTip=\"{DynamicResource LOCEmuUseSimplifiedOnlineFileScanTooltip}\"\r\n                                              IsEnabled=\"{Binding IsChecked, ElementName=CheckExcludeOnlineFiles}\"\r\n                                              Margin=\"20,0,0,0\"\r\n                                              IsChecked=\"{Binding UseSimplifiedOnlineFileScan}\" />\r\n                                </StackPanel>\r\n                                <CheckBox Content=\"{DynamicResource LOCEmuImportWithRelativePaths}\"\r\n                                          ToolTip=\"{DynamicResource LOCEmuImportWithRelativePathsTooltip}\"\r\n                                          ToolTipService.InitialShowDelay=\"200\"\r\n                                          IsChecked=\"{Binding ImportWithRelativePaths}\"/>\r\n                                <CheckBox Content=\"{DynamicResource LOCEmuImportScanSubfolders}\" Margin=\"0,10,0,0\"\r\n                                          IsChecked=\"{Binding ScanSubfolders}\"/>\r\n                                <CheckBox Content=\"{DynamicResource LOCEmuImportScanInsideArchives}\" Margin=\"0,10,0,0\"\r\n                                          IsChecked=\"{Binding ScanInsideArchives}\"/>\r\n                                <CheckBox Content=\"{DynamicResource LOCEmuMergeRelatedFiles}\" Margin=\"0,10,0,0\"\r\n                                          ToolTip=\"{DynamicResource LOCEmuMergeRelatedFilesTooltip}\"\r\n                                          IsChecked=\"{Binding MergeRelatedFiles}\"/>\r\n                                <CheckBox Content=\"{DynamicResource LOCEmuSaveScanConfig}\"\r\n                                          ToolTip=\"{DynamicResource LOCEmuSaveScanConfigTooltip}\"\r\n                                          ToolTipService.InitialShowDelay=\"200\" Margin=\"0,10,0,0\"\r\n                                          IsChecked=\"{Binding Save}\" Name=\"CheckSaveConfig\"\r\n                                          Visibility=\"{Binding SavedConfig, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\"/>\r\n                                <DockPanel Margin=\"0,10,0,10\" Visibility=\"{Binding IsChecked, ElementName=CheckSaveConfig, Converter={pcon:BooleanToVisibilityConverter}}\">\r\n                                    <TextBlock Text=\"{DynamicResource LOCNameLabel}\" VerticalAlignment=\"Center\" />\r\n                                    <TextBox Text=\"{Binding Name, UpdateSourceTrigger=PropertyChanged}\" Margin=\"10,0,10,0\"/>\r\n                                </DockPanel>\r\n                                <Button Content=\"{DynamicResource LOCRemoveLabel}\" Margin=\"0,10,0,0\" HorizontalAlignment=\"Left\"\r\n                                        Command=\"{Binding Data.RemoveScanConfigCommand, Source={StaticResource BindingProxy}}\"\r\n                                        CommandParameter=\"{Binding}\" />\r\n                            </StackPanel>\r\n                        </Border>\r\n                    </DataTemplate>\r\n                </ItemsControl.ItemTemplate>\r\n            </ItemsControl>\r\n        </ScrollViewer>\r\n\r\n        <StackPanel Grid.Row=\"2\" Orientation=\"Horizontal\" Margin=\"10,10,10,10\">\r\n            <Button Content=\"{DynamicResource LOCEmuAddScanner}\"\r\n                    Command=\"{Binding AddScanConfigCommand}\" \r\n                    Visibility=\"{Binding IsScanSetup, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n            <Button Content=\"{DynamicResource LOCEmuAddSavedScanner}\" Margin=\"10,0,0,0\"\r\n                    Command=\"{Binding AddScanConfigCommand}\" \r\n                    Visibility=\"{Binding IsScanSetup, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                    pbeh:LeftClickContextMenuBehavior.Enabled=\"True\">\r\n                <Button.ContextMenu>\r\n                    <ContextMenu ItemsSource=\"{Binding SavedConfigs}\" Placement=\"Top\">\r\n                        <ContextMenu.ItemContainerStyle>\r\n                            <Style TargetType=\"MenuItem\">\r\n                                <Setter Property=\"Command\" Value=\"{Binding Data.AddSavedScanConfigCommand, Source={StaticResource BindingProxy}}\" />\r\n                                <Setter Property=\"CommandParameter\" Value=\"{Binding}\" />\r\n                            </Style>\r\n                        </ContextMenu.ItemContainerStyle>\r\n                    </ContextMenu>\r\n                </Button.ContextMenu>\r\n            </Button>\r\n            <Button Content=\"{DynamicResource LOCSelectAll}\" Margin=\"0,0,10,0\"\r\n                    Command=\"{Binding SelectAllCommmand}\"\r\n                    Visibility=\"{Binding IsScanSetup, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\" />\r\n            <Button Content=\"{DynamicResource LOCDeselectAll}\"\r\n                    Command=\"{Binding DeselectAllCommmand}\"\r\n                    Visibility=\"{Binding IsScanSetup, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\" />\r\n        </StackPanel>\r\n\r\n        <Border Grid.Row=\"3\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel LastChildFill=\"False\" Margin=\"5\">\r\n                <Button Content=\"{DynamicResource LOCCloseLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                        Command=\"{Binding CancelCommand}\" \r\n                        Style=\"{StaticResource BottomButton}\" />\r\n                <Button Content=\"{DynamicResource LOCImportLabel}\" DockPanel.Dock=\"Right\"\r\n                        Command=\"{Binding ImportCommand}\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Visibility=\"{Binding IsScanSetup, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\"/>\r\n                <Button Content=\"{DynamicResource LOCStartScan}\" DockPanel.Dock=\"Right\"\r\n                        Command=\"{Binding ScanCommmand}\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Visibility=\"{Binding IsScanSetup, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n                <Button Content=\"{DynamicResource LOCMenuHelpTitle}\"\r\n                        Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                        CommandParameter=\"{}{DocsRootUrl}/manual/features/emulationSupport/emulationSupportOverview.html\"                        \r\n                        DockPanel.Dock=\"Left\" Style=\"{StaticResource BottomButton}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/EmulatedGameImportWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class EmulatedGameImportWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new EmulatedGameImportWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for EmulatorImportWindow.xaml\r\n    /// </summary>\r\n    public partial class EmulatedGameImportWindow : WindowBase\r\n    {\r\n        public EmulatedGameImportWindow() : base(\"EmulatedGameImportWindow_V2\")\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/EmulatorDownloadWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.EmulatorDownloadWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pvm=\"clr-namespace:Playnite.DesktopApp.ViewModels\"\r\n        xmlns:pm=\"clr-namespace:Playnite.SDK.Models;assembly=Playnite.SDK\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"         \r\n        xmlns:scm=\"clr-namespace:System.ComponentModel;assembly=WindowsBase\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCDownloadEmulatorsButton}\" WindowStartupLocation=\"CenterOwner\"\r\n        Height=\"600\" Width=\"900\" x:Name=\"WindowEmulatorImport\"\r\n        AutomationProperties.AutomationId=\"WindowEmulatorImport\">\r\n\r\n    <controls:WindowBase.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <DockPanel>\r\n        <DockPanel.Resources>\r\n            <p:BindingProxy x:Key=\"Proxy\" Data=\"{Binding}\" />\r\n        </DockPanel.Resources>\r\n\r\n        <Border DockPanel.Dock=\"Bottom\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel KeyboardNavigation.TabNavigation=\"Local\" LastChildFill=\"False\" Margin=\"5\">\r\n                <Button Content=\"{DynamicResource LOCCloseLabel}\" DockPanel.Dock=\"Right\"\r\n                        Style=\"{StaticResource BottomButton}\" IsCancel=\"True\" />\r\n            </DockPanel>\r\n        </Border>\r\n\r\n        <DockPanel>\r\n            <DockPanel.Resources>\r\n                <CollectionViewSource x:Key=\"EmulatorSources\" Source=\"{Binding DownloadEmulatorsList}\">\r\n                    <CollectionViewSource.GroupDescriptions>\r\n                        <PropertyGroupDescription PropertyName=\"Platform\" />\r\n                    </CollectionViewSource.GroupDescriptions>\r\n                    <CollectionViewSource.SortDescriptions>\r\n                        <scm:SortDescription PropertyName=\"Platform.Name\"/>\r\n                    </CollectionViewSource.SortDescriptions>\r\n                </CollectionViewSource>\r\n            </DockPanel.Resources>\r\n            \r\n            <TextBlock Text=\"{DynamicResource LOCEmuDownloadDescription}\" TextWrapping=\"Wrap\" DockPanel.Dock=\"Top\" Margin=\"5,10,5,10\"/>\r\n\r\n            <DataGrid CanUserAddRows=\"False\" AutoGenerateColumns=\"False\" CanUserResizeRows=\"False\"\r\n                      GridLinesVisibility=\"None\" IsReadOnly=\"True\" RowHeaderWidth=\"0\"\r\n                      SelectionMode=\"Single\" Margin=\"5\"\r\n                      EnableRowVirtualization=\"True\" VirtualizingPanel.IsVirtualizingWhenGrouping=\"True\"\r\n                      ScrollViewer.CanContentScroll=\"True\"\r\n                      BorderThickness=\"{StaticResource ControlBorderThickness}\" BorderBrush=\"{StaticResource NormalBorderBrush}\"                      \r\n                      ItemsSource=\"{Binding Source={StaticResource EmulatorSources}}\" DockPanel.Dock=\"Bottom\">\r\n                <DataGrid.RowStyle>\r\n                    <Style TargetType=\"{x:Type DataGridRow}\" BasedOn=\"{StaticResource {x:Type DataGridRow}}\">\r\n                        <Setter Property=\"Focusable\" Value=\"False\"/>\r\n                    </Style>\r\n                </DataGrid.RowStyle>\r\n                <DataGrid.GroupStyle>\r\n                    <GroupStyle>\r\n                        <GroupStyle.HeaderTemplate>\r\n                            <DataTemplate>\r\n                                <TextBlock Margin=\"5,4,5,4\" Text=\"{Binding Name}\" FontWeight=\"Bold\" />\r\n                            </DataTemplate>\r\n                        </GroupStyle.HeaderTemplate>\r\n                    </GroupStyle>\r\n                </DataGrid.GroupStyle>\r\n                <DataGrid.Columns>\r\n                    <DataGridTemplateColumn Header=\"{DynamicResource LOCNameLabel}\" Width=\"250\">\r\n                        <DataGridTemplateColumn.CellTemplate>\r\n                            <DataTemplate>\r\n                                <TextBlock Text=\"{Binding Name, Mode=OneWay}\" VerticalAlignment=\"Center\"\r\n                                           Margin=\"20,0,0,0\"/>\r\n                            </DataTemplate>\r\n                        </DataGridTemplateColumn.CellTemplate>\r\n                    </DataGridTemplateColumn>\r\n                    <DataGridTemplateColumn Header=\"{DynamicResource LOCWebsiteLabel}\">\r\n                        <DataGridTemplateColumn.CellTemplate>\r\n                            <DataTemplate>\r\n                                <TextBlock>\r\n                                    <Hyperlink NavigateUri=\"{Binding Website, Mode=OneWay}\"\r\n                                               Foreground=\"{DynamicResource TextBrush}\"\r\n                                               Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                                               CommandParameter=\"{Binding NavigateUri, RelativeSource={RelativeSource Self}}\">\r\n                                        <Hyperlink.Inlines>\r\n                                            <Run Text=\"{Binding Website, Mode=OneWay}\"/>\r\n                                        </Hyperlink.Inlines>\r\n                                    </Hyperlink>\r\n                                </TextBlock>\r\n                            </DataTemplate>\r\n                        </DataGridTemplateColumn.CellTemplate>\r\n                    </DataGridTemplateColumn>\r\n                </DataGrid.Columns>\r\n            </DataGrid>\r\n        </DockPanel>\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/EmulatorDownloadWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class EmulatorDownloadWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new EmulatorDownloadWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for EmulatorImportWindow.xaml\r\n    /// </summary>\r\n    public partial class EmulatorDownloadWindow : WindowBase\r\n    {\r\n        public EmulatorDownloadWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/EmulatorImportWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.EmulatorImportWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pvm=\"clr-namespace:Playnite.DesktopApp.ViewModels\"\r\n        xmlns:pm=\"clr-namespace:Playnite.SDK.Models;assembly=Playnite.SDK\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"      \r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"       \r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCEmuWizardWindowTitle}\" WindowStartupLocation=\"CenterOwner\"\r\n        Height=\"600\" Width=\"800\" x:Name=\"WindowEmulatorImport\"\r\n        AutomationProperties.AutomationId=\"WindowEmulatorImport\">\r\n\r\n    <controls:WindowBase.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <Grid>\r\n        <Grid.Resources>\r\n            <p:BindingProxy x:Key=\"BindingProxy\" Data=\"{Binding}\" />\r\n        </Grid.Resources>\r\n        \r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n\r\n        <DataGrid Grid.Row=\"0\" Margin=\"10,5,10,0\"\r\n                  CanUserAddRows=\"False\" AutoGenerateColumns=\"False\" CanUserResizeRows=\"False\"\r\n                  SelectionMode=\"Single\" GridLinesVisibility=\"None\" HeadersVisibility=\"Column\"\r\n                  ItemsSource=\"{Binding CollectionView}\">\r\n            <DataGrid.Columns>\r\n                <DataGridTemplateColumn Header=\"{DynamicResource LOCImportLabel}\">\r\n                    <DataGridTemplateColumn.CellTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Import, UpdateSourceTrigger=PropertyChanged}\" HorizontalAlignment=\"Center\" />\r\n                        </DataTemplate>\r\n                    </DataGridTemplateColumn.CellTemplate>\r\n                </DataGridTemplateColumn>\r\n                <DataGridTemplateColumn Header=\"{DynamicResource LOCNameLabel}\" SortMemberPath=\"Name\">\r\n                    <DataGridTemplateColumn.CellTemplate>\r\n                        <DataTemplate>\r\n                            <TextBox Text=\"{Binding Name, UpdateSourceTrigger=PropertyChanged}\"\r\n                                     Background=\"{StaticResource NormalBrushDark}\"/>\r\n                        </DataTemplate>\r\n                    </DataGridTemplateColumn.CellTemplate>\r\n                </DataGridTemplateColumn>\r\n                <DataGridTextColumn Header=\"{DynamicResource LOCFolderLabel}\" Binding=\"{Binding InstallDir}\" IsReadOnly=\"True\" />\r\n                <!--Hack to make the last empty column being able to slect a row-->\r\n                <DataGridTemplateColumn Width=\"*\">\r\n                    <DataGridTemplateColumn.CellTemplate>\r\n                        <DataTemplate>\r\n                            <TextBlock VerticalAlignment=\"Stretch\" HorizontalAlignment=\"Stretch\" />\r\n                        </DataTemplate>\r\n                    </DataGridTemplateColumn.CellTemplate>\r\n                </DataGridTemplateColumn>\r\n            </DataGrid.Columns>\r\n            <DataGrid.RowDetailsTemplate>\r\n                <DataTemplate>\r\n                    <StackPanel Margin=\"20,3,10,3\">\r\n                        <TextBlock Text=\"{DynamicResource LOCEmuImportProfilesToImportHeader}\" />\r\n                        <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\" ScrollViewer.VerticalScrollBarVisibility=\"Auto\"\r\n                                      MaxHeight=\"300\">\r\n                            <ItemsControl ItemsSource=\"{Binding Profiles}\">\r\n                                <ItemsControl.ItemTemplate>\r\n                                    <DataTemplate>\r\n                                        <CheckBox VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\" Margin=\"2\"\r\n                                                  IsChecked=\"{Binding Import}\" Content=\"{Binding Name}\" />\r\n                                    </DataTemplate>\r\n                                </ItemsControl.ItemTemplate>\r\n                            </ItemsControl>\r\n                        </ScrollViewer>                        \r\n                    </StackPanel>\r\n                </DataTemplate>\r\n            </DataGrid.RowDetailsTemplate>\r\n        </DataGrid>\r\n\r\n        <StackPanel Orientation=\"Horizontal\" Margin=\"10\" Grid.Row=\"1\">\r\n            <Button Content=\"{DynamicResource LOCEmuScanDirectory}\"\r\n                    Command=\"{Binding ScanCommmand}\" />\r\n            <CheckBox Content=\"{DynamicResource LOCEmuScanHideImported}\" Margin=\"10,0,0,0\"\r\n                      IsChecked=\"{Binding HideImported}\" VerticalAlignment=\"Center\" />\r\n            <Button Content=\"{DynamicResource LOCSelectAll}\" Margin=\"10,0,10,0\"\r\n                    Command=\"{Binding SelectAllCommmand}\" />\r\n            <Button Content=\"{DynamicResource LOCDeselectAll}\"\r\n                    Command=\"{Binding DeselectAllCommmand}\" />\r\n        </StackPanel>\r\n\r\n        <Border Grid.Row=\"2\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel LastChildFill=\"False\" Margin=\"5\">\r\n                <Button Content=\"{DynamicResource LOCCloseLabel}\" DockPanel.Dock=\"Right\"\r\n                        Command=\"{Binding CancelCommand}\" \r\n                        Style=\"{StaticResource BottomButton}\" />\r\n                <Button Content=\"{DynamicResource LOCImportLabel}\" DockPanel.Dock=\"Right\"\r\n                        Command=\"{Binding ImportCommand}\"\r\n                        Style=\"{StaticResource BottomButton}\" />\r\n                <Button Content=\"{DynamicResource LOCMenuHelpTitle}\"\r\n                        Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                        CommandParameter=\"{}{DocsRootUrl}/manual/features/emulationSupport/troubleshooting.html#emulator-is-not-being-imported\"                        \r\n                        DockPanel.Dock=\"Left\" Style=\"{StaticResource BottomButton}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/EmulatorImportWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class EmulatorImportWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new EmulatorImportWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for EmulatorImportWindow.xaml\r\n    /// </summary>\r\n    public partial class EmulatorImportWindow : WindowBase\r\n    {\r\n        public EmulatorImportWindow() : base(\"EmulatorImportWindow_V2\")\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/EmulatorsWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.EmulatorsWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n        xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:psdkm=\"clr-namespace:Playnite.SDK.Models;assembly=Playnite.SDK\"\r\n        xmlns:mods=\"clr-namespace:Playnite.SDK.Models;assembly=Playnite.SDK\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        WindowStartupLocation=\"CenterOwner\" ShowInTaskbar=\"False\"\r\n        Title=\"{DynamicResource LOCEmulatorsWindowTitle}\"\r\n        Width=\"1024\" Height=\"720\"\r\n        AutomationProperties.AutomationId=\"WindowEmulators\"\r\n        x:Name=\"WindowEmulators\">\r\n\r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"Closing\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding WindowClosingCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n    \r\n    <controls:WindowBase.Resources>\r\n        <pcon:NullToBoolConverter x:Key=\"NullToBoolConverter\" />\r\n        <pcon:ListToStringConverter x:Key=\"ListToStringConverter\" />\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Thickness x:Key=\"EditSeparatorMargin\">5,5,5,7</Thickness>\r\n    </controls:WindowBase.Resources>\r\n    <DockPanel>\r\n        <DockPanel.Resources>\r\n            <p:BindingProxy x:Key=\"Proxy\" Data=\"{Binding}\" />\r\n        </DockPanel.Resources>\r\n\r\n        <Border DockPanel.Dock=\"Bottom\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel KeyboardNavigation.TabNavigation=\"Local\" LastChildFill=\"False\" Margin=\"5\">\r\n                <Button TabIndex=\"2\" Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\"\r\n                        IsCancel=\"True\" Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding CancelCommand}\"/>\r\n                <Button TabIndex=\"1\" Name=\"ButtonOK\" Content=\"{DynamicResource LOCSaveLabel}\" DockPanel.Dock=\"Right\"\r\n                        Style=\"{StaticResource BottomButton}\" \r\n                        Command=\"{Binding ConfirmCommand}\"/>\r\n                <Button Content=\"{DynamicResource LOCMenuHelpTitle}\"\r\n                        Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                        CommandParameter=\"{}{DocsRootUrl}/manual/features/emulationSupport/emulationSupportOverview.html\"                        \r\n                        DockPanel.Dock=\"Left\" Style=\"{StaticResource BottomButton}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n\r\n        <TabControl DockPanel.Dock=\"Top\">\r\n            <TabItem Header=\"{DynamicResource LOCEmulatorsTitle}\">\r\n                <DockPanel>\r\n                    <DockPanel DockPanel.Dock=\"Bottom\" LastChildFill=\"False\" Margin=\"5,0,5,5\">\r\n                        <Button Content=\"{DynamicResource LOCImportLabel}\" Name=\"ButtonImportEmulator\" Margin=\"5\"\r\n                                Command=\"{Binding ImportEmulatorsCommand}\" />\r\n                        <Button Content=\"{DynamicResource LOCAddTitle}\" Name=\"ButtonAddEmulator\" Margin=\"5\"\r\n                                Command=\"{Binding AddEmulatorCommand}\" />\r\n                        <Button Content=\"{DynamicResource LOCCopyTitle}\" Name=\"ButtonCopyEmulator\" Margin=\"5\"\r\n                                Command=\"{Binding CopyEmulatorCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItem, ElementName=ListEmulators}\"/>\r\n                        <Button Content=\"{DynamicResource LOCRemoveTitle}\" Name=\"ButtonRemoveEmulator\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveEmulatorCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItem, ElementName=ListEmulators}\"/>\r\n                        <Button Content=\"{DynamicResource LOCDownloadEmulatorsButton}\"\r\n                                Margin=\"5\" DockPanel.Dock=\"Right\"\r\n                                Name=\"ButtonDownloadEmulators\" Command=\"{Binding DownloadEmulatorsCommand}\"/>\r\n                    </DockPanel>\r\n\r\n                    <Grid Margin=\"5\" DockPanel.Dock=\"Top\">\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"250\"/>\r\n                            <ColumnDefinition Width=\"*\"/>\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition />\r\n                        </Grid.RowDefinitions>\r\n\r\n                        <ListBox Name=\"ListEmulators\" Grid.Row=\"0\" Margin=\"5,0,5,0\"\r\n                                 ItemsSource=\"{Binding EditingEmulators}\"\r\n                                 SelectedItem=\"{Binding SelectedEmulator, Mode=TwoWay}\"\r\n                                 DisplayMemberPath=\"Name\"                     \r\n                                 pbeh:ScrollToSelectedBehavior.Enabled=\"True\" />\r\n\r\n                        <controls:GridEx KeyboardNavigation.TabNavigation=\"Local\" Grid.Column=\"1\" Margin=\"5,5,5,0\"\r\n                                         AutoLayoutColumns=\"2\" StarColumns=\"1\" ColumnCount=\"2\" RowCount=\"4\" StarRows=\"3\"\r\n                                         IsEnabled=\"{Binding SelectedItem, ElementName=ListEmulators, Converter={StaticResource NullToBoolConverter}}\">\r\n                            <controls:GridEx.Resources>\r\n                                <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                    <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                                    <Setter Property=\"Margin\" Value=\"0,10,10,10\" />\r\n                                </Style>\r\n                                <Style TargetType=\"TextBox\" BasedOn=\"{StaticResource {x:Type TextBox}}\">\r\n                                    <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                                </Style>\r\n                                <Style TargetType=\"CheckBox\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\r\n                                    <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                                </Style>\r\n                                <Style TargetType=\"pctrls:PathSelectionBox\" BasedOn=\"{StaticResource {x:Type pctrls:PathSelectionBox}}\">\r\n                                    <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                                </Style>\r\n                            </controls:GridEx.Resources>\r\n\r\n                            <!--Name-->\r\n                            <TextBlock Text=\"{DynamicResource LOCGameNameTitle}\" />\r\n                            <TextBox Text=\"{Binding SelectedEmulator.Name,UpdateSourceTrigger=PropertyChanged}\"/>\r\n\r\n                            <!--InstallDir-->\r\n                            <TextBlock Text=\"{DynamicResource LOCGameInstallDirTitle}\" />\r\n                            <pctrls:PathSelectionBox Text=\"{Binding SelectedEmulator.InstallDir, UpdateSourceTrigger=PropertyChanged}\"\r\n                                                     ShowDirectorySelector=\"True\"/>\r\n\r\n                            <!--BuiltInProfile-->\r\n                            <TextBlock Text=\"{DynamicResource LOCEmulatorSpec}\"/>\r\n                            <ComboBox VerticalAlignment=\"Center\" DisplayMemberPath=\"Name\"\r\n                                      ItemsSource=\"{Binding SelectableEmulatorDefinitions}\"\r\n                                      SelectedValue=\"{Binding SelectedEmulator.BuiltInConfigId}\"\r\n                                      SelectedValuePath=\"Id\" />\r\n \r\n                            <!--Profiles-->\r\n                            <DockPanel Grid.ColumnSpan=\"2\" Margin=\"0,5,0,0\">\r\n                                <TextBlock Text=\"{DynamicResource LOCProfilesLabel}\" DockPanel.Dock=\"Top\" Margin=\"0\" />\r\n                                <Separator DockPanel.Dock=\"Top\" Margin=\"0,4,0,4\" />\r\n                                <Grid>\r\n                                    <Grid.Resources>\r\n                                        <CollectionViewSource x:Key=\"ProfilesSource\" Source=\"{Binding SelectedEmulator.AllProfiles}\">\r\n                                            <CollectionViewSource.GroupDescriptions>\r\n                                                <PropertyGroupDescription PropertyName=\"Type\" />\r\n                                            </CollectionViewSource.GroupDescriptions>\r\n                                        </CollectionViewSource>\r\n                                    </Grid.Resources>\r\n                                    <Grid.ColumnDefinitions>\r\n                                        <ColumnDefinition Width=\"Auto\" />\r\n                                        <ColumnDefinition />\r\n                                    </Grid.ColumnDefinitions>\r\n                                    <Grid.RowDefinitions>\r\n                                        <RowDefinition Height=\"*\" />\r\n                                    </Grid.RowDefinitions>\r\n\r\n                                    <DockPanel Margin=\"0,0,5,0\" Grid.Column=\"0\">\r\n                                        <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                                            <Button Content=\"{DynamicResource LOCAddTitle}\" DockPanel.Dock=\"Right\"\r\n                                                    Command=\"{Binding AddEmulatorProfileCommand}\"\r\n                                                    CommandParameter=\"{Binding RelativeSource={RelativeSource Self}}\">\r\n                                                <Button.ContextMenu>\r\n                                                    <ContextMenu Placement=\"Top\" />\r\n                                                </Button.ContextMenu>\r\n                                            </Button>\r\n                                            <Button Content=\"{DynamicResource LOCCopyTitle}\" Margin=\"5,0,5,0\"\r\n                                                    Command=\"{Binding CopyEmulatorProfileCommand}\"\r\n                                                    CommandParameter=\"{Binding Data.SelectedProfile, Source={StaticResource Proxy}}\"/>\r\n                                            <Button Content=\"{DynamicResource LOCRemoveTitle}\"\r\n                                                    Command=\"{Binding RemoveEmulatorProfileCommand}\"\r\n                                                    CommandParameter=\"{Binding Data.SelectedProfile, Source={StaticResource Proxy}}\"/>\r\n                                        </StackPanel>\r\n\r\n                                        <ListBox SelectedItem=\"{Binding SelectedProfile}\"\r\n                                                 ItemsSource=\"{Binding Source={StaticResource ProfilesSource}}\"\r\n                                                 ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\" ScrollViewer.VerticalScrollBarVisibility=\"Auto\"\r\n                                                 Width=\"220\" DockPanel.Dock=\"Top\" Margin=\"0,0,0,5\"\r\n                                                 DisplayMemberPath=\"Name\" ScrollViewer.CanContentScroll=\"False\">\r\n                                            <ListBox.GroupStyle>\r\n                                                <GroupStyle>\r\n                                                    <GroupStyle.HeaderTemplate>\r\n                                                        <DataTemplate>\r\n                                                            <TextBlock Margin=\"2,5,2,5\" FontStyle=\"Italic\">\r\n                                                                <TextBlock.Style>\r\n                                                                    <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                                                        <Style.Triggers>\r\n                                                                            <DataTrigger Binding=\"{Binding Name}\" Value=\"{x:Type psdkm:BuiltInEmulatorProfile}\">\r\n                                                                                <Setter Property=\"Text\" Value=\"{DynamicResource LOCEmulatorBuiltInProfiles}\" />\r\n                                                                            </DataTrigger>\r\n                                                                            <DataTrigger Binding=\"{Binding Name}\" Value=\"{x:Type psdkm:CustomEmulatorProfile}\">\r\n                                                                                <Setter Property=\"Text\" Value=\"{DynamicResource LOCEmulatorCustomProfiles}\" />\r\n                                                                            </DataTrigger>\r\n                                                                        </Style.Triggers>\r\n                                                                    </Style>\r\n                                                                </TextBlock.Style>\r\n                                                            </TextBlock>\r\n                                                        </DataTemplate>\r\n                                                    </GroupStyle.HeaderTemplate>\r\n                                                </GroupStyle>\r\n                                            </ListBox.GroupStyle>\r\n                                        </ListBox>\r\n                                    </DockPanel>\r\n\r\n                                    <TabControl DataContext=\"{Binding Data.SelectedBuiltinProfile, Source={StaticResource Proxy}}\" Grid.Column=\"1\"\r\n                                                Visibility=\"{Binding Data.SelectedBuiltinProfile, Source={StaticResource Proxy}, Converter={StaticResource NullToVisibilityConverter}}\">\r\n                                        <TabItem Header=\"{DynamicResource LOCGeneralLabel}\">\r\n                                            <controls:GridEx KeyboardNavigation.TabNavigation=\"Local\" Margin=\"3\"\r\n                                                             AutoLayoutColumns=\"2\" StarColumns=\"1\" ColumnCount=\"2\" RowCount=\"7\">\r\n                                                <!--Name-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCNameLabel}\" />\r\n                                                <TextBox Text=\"{Binding Name, UpdateSourceTrigger=PropertyChanged}\"/>\r\n                                                <!--BuiltInProfile-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCEmulatorBuiltInProfile}\" />\r\n                                                <ComboBox SelectedValue=\"{Binding BuiltInProfileName}\" VerticalAlignment=\"Center\"\r\n                                                          ItemsSource=\"{Binding Data.SelectedEmulatorBuiltInProfiles, Source={StaticResource Proxy}}\" />\r\n                                                <!--Platforms-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCPlatformsTitle}\" />\r\n                                                <TextBlock TextWrapping=\"Wrap\" Text=\"{Binding Data.SelectedBuiltInProfilePlatforms, Source={StaticResource Proxy}}\"\r\n                                                           Margin=\"0,10,0,10\"/>\r\n                                                \r\n                                                <!--Arguments-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCBuiltinArguments}\"                                                           \r\n                                                           Visibility=\"{Binding OverrideDefaultArgs, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\"/>\r\n                                                <TextBox IsReadOnly=\"True\"\r\n                                                         Visibility=\"{Binding OverrideDefaultArgs, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\">\r\n                                                    <TextBox.Style>\r\n                                                        <Style TargetType=\"TextBox\" BasedOn=\"{StaticResource {x:Type TextBox}}\">\r\n                                                            <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                                                            <Setter Property=\"Text\" Value=\"{Binding Data.SelectedBuiltInProfileDefinition.StartupArguments, Source={StaticResource Proxy}}\" />\r\n                                                            <Style.Triggers>\r\n                                                                <DataTrigger Binding=\"{Binding Data.SelectedBuiltInProfileDefinition.ScriptStartup, Source={StaticResource Proxy}}\" Value=\"{StaticResource True}\">\r\n                                                                    <Setter Property=\"Text\" Value=\"{DynamicResource LOCEmulatorFunctionHandledByScript}\" />\r\n                                                                </DataTrigger>\r\n                                                            </Style.Triggers>\r\n                                                        </Style>\r\n                                                    </TextBox.Style>\r\n                                                </TextBox>                                                \r\n                                                <!--Custom Arguments-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCOverrideEmulatorArguments}\"\r\n                                                           Visibility=\"{Binding Data.SelectedBuiltInProfileDefinition.ScriptStartup, Source={StaticResource Proxy}, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\" />\r\n                                                <CheckBox IsChecked=\"{Binding OverrideDefaultArgs}\" Name=\"CheckOverBuiltInArguments\"\r\n                                                          Visibility=\"{Binding Data.SelectedBuiltInProfileDefinition.ScriptStartup, Source={StaticResource Proxy}, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\"/>\r\n                                                <TextBlock Text=\"{DynamicResource LOCCustomArguments}\"\r\n                                                           Visibility=\"{Binding OverrideDefaultArgs, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                                                <TextBox Text=\"{Binding CustomArguments, UpdateSourceTrigger=PropertyChanged}\"\r\n                                                         Visibility=\"{Binding OverrideDefaultArgs, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n                                                <!--FileTypes-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCSupportedFilesTitle}\" />\r\n                                                <TextBlock TextWrapping=\"Wrap\">\r\n                                                    <TextBlock.Style>\r\n                                                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                                            <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                                                            <Setter Property=\"Text\" Value=\"{Binding Data.SelectedBuiltInProfileDefinition.ImageExtensions, Converter={StaticResource ListToStringConverter}, Source={StaticResource Proxy}}\" />\r\n                                                            <Style.Triggers>\r\n                                                                <DataTrigger Binding=\"{Binding Data.SelectedBuiltInProfileDefinition.ScriptStartup, Source={StaticResource Proxy}}\" Value=\"{StaticResource True}\">\r\n                                                                    <Setter Property=\"Text\" Value=\"{DynamicResource LOCEmulatorFunctionHandledByScript}\" />\r\n                                                                </DataTrigger>\r\n                                                            </Style.Triggers>\r\n                                                        </Style>\r\n                                                    </TextBlock.Style>\r\n                                                </TextBlock>\r\n                                            </controls:GridEx>\r\n                                        </TabItem>\r\n                                        <TabItem Header=\"{DynamicResource LOCScripts}\">\r\n                                            <Grid>\r\n                                                <Grid.Resources>\r\n                                                    <Style TargetType=\"TextBox\" BasedOn=\"{StaticResource {x:Type TextBox}}\">\r\n                                                        <Setter Property=\"VerticalAlignment\" Value=\"Stretch\" />\r\n                                                        <Setter Property=\"HorizontalScrollBarVisibility\" Value=\"Auto\" />\r\n                                                        <Setter Property=\"VerticalScrollBarVisibility\" Value=\"Visible\" />\r\n                                                        <Setter Property=\"AcceptsReturn\" Value=\"True\" />\r\n                                                    </Style>\r\n                                                </Grid.Resources>\r\n                                                <Grid.RowDefinitions>\r\n                                                    <RowDefinition Height=\"Auto\" />\r\n                                                    <RowDefinition Height=\"*\" />\r\n                                                    <RowDefinition Height=\"Auto\" />\r\n                                                    <RowDefinition Height=\"*\" />\r\n                                                    <RowDefinition Height=\"Auto\" />\r\n                                                    <RowDefinition Height=\"*\" />\r\n                                                </Grid.RowDefinitions>\r\n\r\n                                                <TextBlock Grid.Row=\"0\" Text=\"{DynamicResource LOCEmulatorPreScriptDescription}\" />\r\n                                                <TextBox Grid.Row=\"1\" Text=\"{Binding PreScript}\" AcceptsReturn=\"True\" AcceptsTab=\"True\" />\r\n                                                <TextBlock Grid.Row=\"2\" Text=\"{DynamicResource LOCEmulatorPostScriptDescription}\" />\r\n                                                <TextBox Grid.Row=\"3\" Text=\"{Binding PostScript}\" AcceptsReturn=\"True\" AcceptsTab=\"True\" />\r\n                                                <TextBlock Grid.Row=\"4\" Text=\"{DynamicResource LOCEmulatorStartedScriptDescription}\" />\r\n                                                <TextBox Grid.Row=\"5\" Text=\"{Binding ExitScript}\" AcceptsReturn=\"True\" AcceptsTab=\"True\" />\r\n                                            </Grid>\r\n                                        </TabItem>\r\n                                    </TabControl>\r\n                                    \r\n                                    <TabControl DataContext=\"{Binding Data.SelectedCustomProfile, Source={StaticResource Proxy}}\" Grid.Column=\"1\"\r\n                                                Visibility=\"{Binding Data.SelectedCustomProfile, Source={StaticResource Proxy}, Converter={StaticResource NullToVisibilityConverter}}\">\r\n                                        <TabItem Header=\"{DynamicResource LOCGeneralLabel}\">\r\n                                            <controls:GridEx KeyboardNavigation.TabNavigation=\"Local\" Margin=\"3\"\r\n                                                             AutoLayoutColumns=\"2\" StarColumns=\"1\" ColumnCount=\"2\" RowCount=\"9\">\r\n                                                <!--Name-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCNameLabel}\" />\r\n                                                <TextBox Name=\"TextEmulatorProfileName\"\r\n                                                         Text=\"{Binding Name, UpdateSourceTrigger=PropertyChanged}\"/>\r\n\r\n                                                <!--Platforms-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCSupportedPlatformsTitle}\" />\r\n                                                <pctrls:DdItemListSelectionBox ItemsList=\"{Binding Data.AvailablePlatforms, Source={StaticResource Proxy}}\"\r\n                                                                               BoundIds=\"{Binding Platforms, Mode=TwoWay}\" />\r\n\r\n                                                <!--Executable-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCExecutableTitle}\" />\r\n                                                <pctrls:PathSelectionBox x:Name=\"TextExecutable\" Text=\"{Binding Executable,UpdateSourceTrigger=PropertyChanged}\"\r\n                                                                         ShowFileSelector=\"True\"/>\r\n\r\n                                                <!--Arguments-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCArgumentsTitle}\" />\r\n                                                <TextBox Name=\"TextArguments\" Text=\"{Binding Arguments,UpdateSourceTrigger=PropertyChanged}\" />\r\n\r\n                                                <!--WorkingDir-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCWorkingDirTitle}\" />\r\n                                                <pctrls:PathSelectionBox x:Name=\"TextWorkdir\" Text=\"{Binding WorkingDirectory,UpdateSourceTrigger=PropertyChanged}\"                                                         \r\n                                                                         ShowDirectorySelector=\"True\"/>\r\n                                                \r\n                                                <!--TrackingMode-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCActionTrackingMode}\" />\r\n                                                <ComboBox SelectedValue=\"{Binding TrackingMode}\" VerticalAlignment=\"Center\"\r\n                                                          pbeh:SelectorBehaviors.EnumSource=\"{x:Type mods:TrackingMode}\" />\r\n                                                \r\n                                                <!--TrackingPath-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCActionTrackingPath}\"\r\n                                                           Visibility=\"{Binding TrackingMode, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static mods:TrackingMode.Directory}}\" />\r\n                                                <pctrls:PathSelectionBox Text=\"{Binding TrackingPath}\" ShowDirectorySelector=\"True\"\r\n                                                                         Visibility=\"{Binding TrackingMode, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static mods:TrackingMode.Directory}}\" />\r\n\r\n                                                <!--TrackingPathProcessName-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCActionTrackingPath}\"\r\n                                                           Visibility=\"{Binding TrackingMode, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static mods:TrackingMode.ProcessName}}\" />\r\n                                                <TextBox Text=\"{Binding TrackingPath, UpdateSourceTrigger=PropertyChanged}\"\r\n                                                         Visibility=\"{Binding TrackingMode, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static mods:TrackingMode.ProcessName}}\" />\r\n\r\n                                                <!--FileTypes-->\r\n                                                <TextBlock Text=\"{DynamicResource LOCSupportedFilesTitle}\" />\r\n                                                <TextBox Name=\"TextImageExtension\"\r\n                                                         Text=\"{Binding ImageExtensions,UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ListToStringConverter}}\"/>\r\n                                            </controls:GridEx>\r\n                                        </TabItem>\r\n                                        <TabItem Header=\"{DynamicResource LOCScripts}\">\r\n                                            <Grid>\r\n                                                <Grid.Resources>\r\n                                                    <Style TargetType=\"TextBox\" BasedOn=\"{StaticResource {x:Type TextBox}}\">\r\n                                                        <Setter Property=\"VerticalAlignment\" Value=\"Stretch\" />\r\n                                                        <Setter Property=\"HorizontalScrollBarVisibility\" Value=\"Auto\" />\r\n                                                        <Setter Property=\"VerticalScrollBarVisibility\" Value=\"Visible\" />\r\n                                                        <Setter Property=\"AcceptsReturn\" Value=\"True\" />\r\n                                                    </Style>\r\n                                                </Grid.Resources>\r\n                                                <Grid.RowDefinitions>\r\n                                                    <RowDefinition Height=\"Auto\" />\r\n                                                    <RowDefinition Height=\"*\" />\r\n                                                    <RowDefinition Height=\"Auto\" />\r\n                                                    <RowDefinition Height=\"*\" />\r\n                                                    <RowDefinition Height=\"Auto\" />\r\n                                                    <RowDefinition Height=\"*\" />\r\n                                                </Grid.RowDefinitions>\r\n\r\n                                                <TextBlock Grid.Row=\"0\" Text=\"{DynamicResource LOCEmulatorPreScriptDescription}\" />\r\n                                                <TextBox Grid.Row=\"1\" Text=\"{Binding PreScript}\" AcceptsReturn=\"True\" AcceptsTab=\"True\"\r\n                                                         FontFamily=\"{DynamicResource MonospaceFontFamily}\"/>\r\n                                                <TextBlock Grid.Row=\"2\" Text=\"{DynamicResource LOCEmulatorPostScriptDescription}\" />\r\n                                                <TextBox Grid.Row=\"3\" Text=\"{Binding PostScript}\" AcceptsReturn=\"True\" AcceptsTab=\"True\"\r\n                                                         FontFamily=\"{DynamicResource MonospaceFontFamily}\"/>\r\n                                                <TextBlock Grid.Row=\"4\" Text=\"{DynamicResource LOCEmulatorStartedScriptDescription}\" />\r\n                                                <TextBox Grid.Row=\"5\" Text=\"{Binding ExitScript}\" AcceptsReturn=\"True\" AcceptsTab=\"True\"\r\n                                                         FontFamily=\"{DynamicResource MonospaceFontFamily}\"/>\r\n                                            </Grid>\r\n                                        </TabItem>\r\n                                        <TabItem Header=\"{DynamicResource LOCStartupScript}\">\r\n                                            <TextBox VerticalAlignment=\"Stretch\" AcceptsReturn=\"True\" AcceptsTab=\"True\"\r\n                                                     HorizontalScrollBarVisibility=\"Auto\" VerticalScrollBarVisibility=\"Visible\"\r\n                                                     FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                                                     Text=\"{Binding StartupScript}\" />\r\n                                        </TabItem>\r\n                                    </TabControl>\r\n                                </Grid>\r\n                            </DockPanel>\r\n                        </controls:GridEx>\r\n                    </Grid>\r\n                </DockPanel>                \r\n            </TabItem>\r\n\r\n            <TabItem Header=\"{DynamicResource LOCEmuAutoScanConfigurations}\">\r\n                <DockPanel>\r\n                    <Grid DockPanel.Dock=\"Top\" Margin=\"10,10,10,10\">\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition />\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition />\r\n                        </Grid.RowDefinitions>\r\n\r\n                        <TextBlock Text=\"{DynamicResource LOCEmuCrcExcludeFileTypes}\" VerticalAlignment=\"Center\"\r\n                                   Grid.Column=\"0\" Margin=\"0,0,10,0\"\r\n                                   ToolTip=\"{DynamicResource LOCEmuCrcExcludeFileTypesTooltip}\"/>\r\n                        <TextBox Text=\"{Binding GlobalScanSettings.CrcExcludeFileTypes, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ListToStringConverter}}\"\r\n                                 Grid.Column=\"1\" ToolTip=\"{DynamicResource LOCEmuCrcExcludeFileTypesTooltip}\" />\r\n                    </Grid>\r\n                    <TextBlock Text=\"{DynamicResource LOCEmuScanConfigurations}\" DockPanel.Dock=\"Top\" Margin=\"10,0,10,0\" />\r\n                    <Separator DockPanel.Dock=\"Top\" Margin=\"10,5,10,0\" />\r\n                    <Grid Margin=\"5,5,5,5\" DockPanel.Dock=\"Top\">\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"*\"/>\r\n                            <ColumnDefinition Width=\"3\"/>\r\n                            <ColumnDefinition Width=\"2*\"/>\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"*\" />\r\n                            <RowDefinition Height=\"Auto\" />\r\n                        </Grid.RowDefinitions>\r\n\r\n                        <ListBox Grid.Row=\"0\" Grid.Column=\"0\" Name=\"ListScannerConfigs\"\r\n                             Margin=\"5,0,0,5\"\r\n                             ItemsSource=\"{Binding EditingScanners}\"\r\n                             SelectedItem=\"{Binding SelectedScanner, Mode=TwoWay}\"\r\n                             DisplayMemberPath=\"Name\"                     \r\n                             pbeh:ScrollToSelectedBehavior.Enabled=\"True\" />\r\n\r\n                        <GridSplitter Grid.Column=\"1\" Width=\"3\" HorizontalAlignment=\"Stretch\" />\r\n\r\n                        <TabControl KeyboardNavigation.TabNavigation=\"Local\" Grid.Column=\"2\" Margin=\"5,0,5,0\"\r\n                                    IsEnabled=\"{Binding SelectedItem, ElementName=ListScannerConfigs, Converter={StaticResource NullToBoolConverter}}\"\r\n                                    DataContext=\"{Binding SelectedScanner}\">\r\n                            <TabItem Header=\"{DynamicResource LOCGeneralLabel}\">\r\n                                <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\">\r\n                                <GridEx AutoLayoutColumns=\"2\" StarColumns=\"1\" ColumnCount=\"2\" RowCount=\"13\" StarRows=\"13\"\r\n                                        Margin=\"5,5,5,0\">\r\n                                    <controls:GridEx.Resources>\r\n                                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                            <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                                            <Setter Property=\"Margin\" Value=\"0,10,10,10\" />\r\n                                        </Style>\r\n                                        <Style TargetType=\"TextBox\" BasedOn=\"{StaticResource {x:Type TextBox}}\">\r\n                                            <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                                        </Style>\r\n                                        <Style TargetType=\"pctrls:PathSelectionBox\" BasedOn=\"{StaticResource {x:Type pctrls:PathSelectionBox}}\">\r\n                                            <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                                        </Style>\r\n                                    </controls:GridEx.Resources>\r\n\r\n                                    <!--Name-->\r\n                                    <TextBlock Text=\"{DynamicResource LOCNameLabel}\" />\r\n                                    <TextBox Text=\"{Binding Name, UpdateSourceTrigger=PropertyChanged}\"/>\r\n\r\n                                    <!--Directory-->\r\n                                    <TextBlock Text=\"{DynamicResource LOCEmuScanDirectory}\" VerticalAlignment=\"Center\" />\r\n                                    <pctrls:PathSelectionBox ShowDirectorySelector=\"True\"\r\n                                                             Text=\"{Binding Directory, UpdateSourceTrigger=PropertyChanged}\"/>\r\n\r\n                                    <!--Emulator-->\r\n                                    <TextBlock Text=\"{DynamicResource LOCEmuScanEmulator}\" VerticalAlignment=\"Center\" />\r\n                                    <StackPanel Orientation=\"Horizontal\" VerticalAlignment=\"Center\">\r\n                                        <ComboBox Width=\"150\" VerticalAlignment=\"Center\" Name=\"ComboEmulatorList\"\r\n                                                  ItemsSource=\"{Binding Data.EditingEmulators, Source={StaticResource Proxy}}\"\r\n                                                  DisplayMemberPath=\"Name\" SelectedValuePath=\"Id\" SelectedValue=\"{Binding EmulatorId}\" />\r\n                                        <TextBlock Text=\"{DynamicResource LOCProfileLabel}\" VerticalAlignment=\"Center\" Margin=\"10,0,10,0\"  />\r\n                                        <ComboBox Width=\"150\" VerticalAlignment=\"Center\"\r\n                                                  ItemsSource=\"{Binding SelectedItem.AllProfiles, ElementName=ComboEmulatorList}\"\r\n                                                  DisplayMemberPath=\"Name\" SelectedValuePath=\"Id\" SelectedValue=\"{Binding EmulatorProfileId, Delay=50}\" />\r\n                                    </StackPanel>\r\n\r\n                                    <!--Preferred platform-->\r\n                                    <TextBlock Text=\"{DynamicResource LOCEmuOverridePlatform}\"\r\n                                               ToolTip=\"{DynamicResource LOCEmuOverridePlatformTooltip}\" />\r\n                                    <ComboBox VerticalAlignment=\"Center\" ToolTip=\"{DynamicResource LOCEmuOverridePlatformTooltip}\"\r\n                                              SelectedValue=\"{Binding OverridePlatformId}\" SelectedValuePath=\"Id\"\r\n                                              DisplayMemberPath=\"Name\"\r\n                                              ItemsSource=\"{Binding Data.OverridePlatforms, Source={StaticResource Proxy}}\"/>\r\n\r\n                                    <!--IgnoreTypes-->\r\n                                    <TextBlock Text=\"{DynamicResource LOCEmuCrcExcludeFileTypes}\" VerticalAlignment=\"Center\"\r\n                                               ToolTip=\"{DynamicResource LOCEmuCrcExcludeFileTypesTooltip}\"/>\r\n                                    <TextBox Text=\"{Binding CrcExcludeFileTypes, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ListToStringConverter}}\"\r\n                                             ToolTip=\"{DynamicResource LOCEmuCrcExcludeFileTypesTooltip}\"/>\r\n\r\n                                    <!--Play action settings-->\r\n                                    <TextBlock Text=\"{DynamicResource LOCScannerConfigPlayActionSettings}\" />\r\n                                    <ComboBox VerticalAlignment=\"Center\"\r\n                                              pbeh:SelectorBehaviors.EnumSource=\"{x:Type psdkm:ScannerConfigPlayActionSettings}\"\r\n                                              SelectedValue=\"{Binding PlayActionSettings}\"/>\r\n\r\n                                    <!--Startup scan-->\r\n                                    <CheckBox Content=\"{DynamicResource LOCEmuScanIncludeGlobalUpdate}\"\r\n                                              Grid.ColumnSpan=\"2\" Margin=\"0,5,10,5\"\r\n                                              IsChecked=\"{Binding InGlobalUpdate}\"/>\r\n\r\n                                    <!--Exclude online files-->\r\n                                    <CheckBox Content=\"{DynamicResource LOCEmuExcludeOnlineFiles}\"\r\n                                              ToolTip=\"{DynamicResource LOCEmuExcludeOnlineFilesTooltip}\"\r\n                                              Name=\"CheckExcludeOnlineFiles\"\r\n                                              Grid.ColumnSpan=\"2\" Margin=\"0,10,10,5\"\r\n                                              IsChecked=\"{Binding ExcludeOnlineFiles}\" />\r\n\r\n                                    <!--Scan online files by file name-->\r\n                                    <CheckBox Content=\"{DynamicResource LOCEmuUseSimplifiedOnlineFileScan}\"\r\n                                              ToolTip=\"{DynamicResource LOCEmuUseSimplifiedOnlineFileScanTooltip}\"\r\n                                              IsEnabled=\"{Binding IsChecked, ElementName=CheckExcludeOnlineFiles}\"\r\n                                              Grid.ColumnSpan=\"2\" Margin=\"25,10,10,5\"\r\n                                              IsChecked=\"{Binding UseSimplifiedOnlineFileScan}\" />\r\n\r\n                                    <!--Use relative paths-->\r\n                                    <CheckBox Content=\"{DynamicResource LOCEmuImportWithRelativePaths}\"\r\n                                              ToolTip=\"{DynamicResource LOCEmuImportWithRelativePathsTooltip}\"\r\n                                              ToolTipService.InitialShowDelay=\"200\"\r\n                                              Grid.ColumnSpan=\"2\" Margin=\"0,10,10,5\"\r\n                                              IsChecked=\"{Binding ImportWithRelativePaths}\"/>\r\n\r\n                                    <!--Scan subfolders-->\r\n                                    <CheckBox Content=\"{DynamicResource LOCEmuImportScanSubfolders}\"\r\n                                              Grid.ColumnSpan=\"2\" Margin=\"0,10,10,5\"\r\n                                              IsChecked=\"{Binding ScanSubfolders}\"/>\r\n\r\n                                    <!--Archive scan-->\r\n                                    <CheckBox Content=\"{DynamicResource LOCEmuImportScanInsideArchives}\"\r\n                                              Grid.ColumnSpan=\"2\" Margin=\"0,10,10,5\"\r\n                                              IsChecked=\"{Binding ScanInsideArchives}\"/>\r\n                                    \r\n                                    <!--Merge files-->\r\n                                    <CheckBox Content=\"{DynamicResource LOCEmuMergeRelatedFiles}\"\r\n                                              ToolTip=\"{DynamicResource LOCEmuMergeRelatedFilesTooltip}\"\r\n                                              Grid.ColumnSpan=\"2\" Margin=\"0,10,10,5\"\r\n                                              IsChecked=\"{Binding MergeRelatedFiles}\"/>\r\n                                </GridEx>\r\n                                </ScrollViewer>\r\n                            </TabItem>\r\n                            <TabItem Header=\"{DynamicResource LOCExclusions}\">\r\n                                <GridEx Margin=\"5,5,5,0\" RowCount=\"6\" StarRows=\"1,3\" ColumnCount=\"1\" AutoLayoutColumns=\"1\" StarColumns=\"0\">\r\n                                    <TextBlock Text=\"{DynamicResource LOCEmuScannerExcludedFiles}\" Margin=\"0,5,0,5\" />\r\n                                    <TextBox Text=\"{Binding ExcludedFiles, Converter={pcon:ListToMultilineStringConverter}}\"\r\n                                             AcceptsReturn=\"True\" />\r\n                                    <TextBlock Text=\"{DynamicResource LOCEmuScannerExcludedFolders}\" Margin=\"0,5,0,5\" />\r\n                                    <TextBox Text=\"{Binding ExcludedDirectories, Converter={pcon:ListToMultilineStringConverter}}\"\r\n                                             AcceptsReturn=\"True\"/>\r\n                                </GridEx>\r\n                            </TabItem>\r\n                        </TabControl>\r\n                        \r\n                        <StackPanel Orientation=\"Horizontal\" Grid.Row=\"1\" Grid.ColumnSpan=\"2\">\r\n                            <Button Content=\"{DynamicResource LOCAddTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding AddScanConfigCommand}\" />\r\n                            <Button Content=\"{DynamicResource LOCCopyTitle}\" Margin=\"5\"\r\n                                Command=\"{Binding CopyScanConfigCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItem, ElementName=ListScannerConfigs}\"/>\r\n                            <Button Content=\"{DynamicResource LOCRemoveLabel}\" Margin=\"5\"\r\n                                Command=\"{Binding RemoveScanConfigCommand}\"\r\n                                CommandParameter=\"{Binding SelectedItem, ElementName=ListScannerConfigs}\"/>\r\n                        </StackPanel>\r\n                    </Grid>\r\n                </DockPanel>                \r\n            </TabItem>\r\n        </TabControl>\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/EmulatorsWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class EmulatorsWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new EmulatorsWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for Configuration.xaml\r\n    /// </summary>\r\n    public partial class EmulatorsWindow : WindowBase\r\n    {\r\n        public EmulatorsWindow() : base(\"EmulatorsWindow_V2\")\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ExtensionCrashHandlerWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.ExtensionCrashHandlerWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCCrashWindowTitle}\" SizeToContent=\"Height\" Width=\"600\"\r\n        WindowStartupLocation=\"CenterScreen\"\r\n        AutomationProperties.AutomationId=\"WindowCrash\">\r\n\r\n    <DockPanel Margin=\"5\">\r\n        <DockPanel LastChildFill=\"False\" DockPanel.Dock=\"Bottom\">\r\n            <Button Content=\"{DynamicResource LOCCrashSaveLog}\" DockPanel.Dock=\"Left\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding SaveLogCommand}\"/>\r\n            <Button Content=\"{DynamicResource LOCCrashRestartPlaynite}\" DockPanel.Dock=\"Right\" \r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding RestartCommand}\"/>\r\n            <CheckBox Content=\"{DynamicResource LOCCrashDisableExtension}\" DockPanel.Dock=\"Right\"\r\n                      IsChecked=\"{Binding DisableExtension}\"\r\n                      Visibility=\"{Binding ShowDisableCheck, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                      VerticalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n        </DockPanel>\r\n        <TextBlock Text=\"{Binding ExtCrashDescription}\"\r\n                   Margin=\"10,10,10,15\"\r\n                   FontSize=\"{DynamicResource FontSize}\"\r\n                   VerticalAlignment=\"Center\" DockPanel.Dock=\"Top\" \r\n                   TextWrapping=\"Wrap\" Foreground=\"{StaticResource TextBrush}\" />\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ExtensionCrashHandlerWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for CrashHandlerWindow.xaml\r\n    /// </summary>\r\n    public partial class ExtensionCrashHandlerWindow : WindowBase\r\n    {\r\n        public ExtensionCrashHandlerWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/FirstTimeStartupWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.FirstTimeStartupWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCFirstWindowTitle}\" WindowStartupLocation=\"CenterScreen\"\r\n        ShowCloseButton=\"False\" ShowMaximizeButton=\"False\" ShowMinimizeButton=\"False\"\r\n        Height=\"540\" Width=\"650\" MinHeight=\"250\" MinWidth=\"390\" x:Name=\"WindowMain\" \r\n        AutomationProperties.AutomationId=\"WindowWizard\">\r\n\r\n    <controls:WindowBase.Resources>\r\n        <pcon:NegateConverter x:Key=\"NegateConverter\" />\r\n        <BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource {x:Type TextBlock}}\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <Grid FocusManager.FocusedElement=\"{Binding ElementName=ButtonNext}\">\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n\r\n        <TabControl TabIndex=\"0\" DockPanel.Dock=\"Top\" Grid.Column=\"0\" Grid.Row=\"0\" Name=\"TabMain\"\r\n                    OverridesDefaultStyle=\"True\"\r\n                    SelectedIndex=\"{Binding SelectedIndex}\">\r\n            <TabControl.Style>\r\n                <Style TargetType=\"TabControl\">\r\n                    <Setter Property=\"Template\">\r\n                        <Setter.Value>\r\n                            <ControlTemplate TargetType=\"TabControl\">\r\n                                <ScrollViewer x:Name=\"TabControlScroller\" HorizontalScrollBarVisibility=\"Disabled\"  VerticalScrollBarVisibility=\"Auto\" >\r\n                                    <Grid>\r\n                                        <TabPanel IsItemsHost=\"True\" />\r\n                                        <ContentPresenter ContentSource=\"SelectedContent\" />\r\n                                    </Grid>\r\n                                </ScrollViewer>\r\n                            </ControlTemplate>\r\n                        </Setter.Value>\r\n                    </Setter>                        \r\n                </Style>\r\n            </TabControl.Style>\r\n\r\n            <!-- Intro -->\r\n            <TabItem Visibility=\"Collapsed\">\r\n                <DockPanel LastChildFill=\"False\" Margin=\"20\">\r\n                    <TextBlock Text=\"{DynamicResource LOCWelcomeLabel}\" VerticalAlignment=\"Center\" FontSize=\"16\" DockPanel.Dock=\"Top\"/>\r\n                    <TextBlock Text=\"{DynamicResource LOCFirstIntro}\" \r\n                            TextWrapping=\"Wrap\" DockPanel.Dock=\"Top\" Margin=\"0,20,0,0\"/>\r\n                </DockPanel>\r\n            </TabItem>\r\n            \r\n            <!-- Library Selection -->\r\n            <TabItem Visibility=\"Collapsed\">\r\n                <DockPanel Margin=\"20\" LastChildFill=\"False\">\r\n                    <TextBlock Text=\"{DynamicResource LOCFirstExternalTitle}\" VerticalAlignment=\"Center\" FontSize=\"16\" DockPanel.Dock=\"Top\"/>\r\n                    <TextBlock Text=\"{DynamicResource LOCFirstImportIntroduction}\" TextWrapping=\"Wrap\" DockPanel.Dock=\"Top\" Margin=\"0,20,0,20\"/>\r\n\r\n                    <ItemsControl ItemsSource=\"{Binding RecommendeLibrariesList}\"\r\n                                  HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Top\">\r\n                        <ItemsControl.ItemTemplate>\r\n                            <DataTemplate>\r\n                                <CheckBox Content=\"{Binding Name}\" IsChecked=\"{Binding Selected}\"\r\n                                           Margin=\"7\"/>\r\n                            </DataTemplate>\r\n                        </ItemsControl.ItemTemplate>\r\n                        <ItemsControl.ItemsPanel>\r\n                            <ItemsPanelTemplate>\r\n                                <UniformGrid Columns=\"3\" />\r\n                            </ItemsPanelTemplate>\r\n                        </ItemsControl.ItemsPanel>\r\n                    </ItemsControl>             \r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <!-- Libraries -->\r\n            <TabItem Visibility=\"Collapsed\">\r\n                <DockPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" Margin=\"20\" DockPanel.Dock=\"Top\">\r\n                        <Image Source=\"{Binding SelectedLibraryPlugin.Icon}\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n                               Width=\"32\" Margin=\"0,0,10,0\" />\r\n                        <TextBlock Text=\"{Binding SelectedLibraryPlugin.Name}\" Margin=\"0,0,6,0\" FontSize=\"16\" VerticalAlignment=\"Center\" />\r\n                        <TextBlock Text=\"{DynamicResource LOCMenuPlayniteSettingsTitle}\" FontSize=\"16\" VerticalAlignment=\"Center\" />\r\n                    </StackPanel>\r\n                    <ContentControl Content=\"{Binding SelectedProviderSettingsView}\"\r\n                                    Margin=\"20,10,20,20\" DockPanel.Dock=\"Top\"/>\r\n                </DockPanel>                \r\n            </TabItem>           \r\n\r\n            <!-- Finish -->\r\n            <TabItem Header=\"Done\" Visibility=\"Collapsed\" Foreground=\"{StaticResource TextBrush}\">\r\n                <DockPanel LastChildFill=\"False\" Margin=\"20\">\r\n                    <TextBlock Text=\"{DynamicResource LOCFirstConfigFinishedTitle}\" VerticalAlignment=\"Center\" FontSize=\"16\" DockPanel.Dock=\"Top\"/>\r\n                    <TextBlock Text=\"{DynamicResource LOCFirstConfigFinishedText}\" \r\n                               TextWrapping=\"Wrap\" Margin=\"0,20,0,0\" DockPanel.Dock=\"Top\"/>\r\n                </DockPanel>\r\n            </TabItem>\r\n        </TabControl>\r\n\r\n        <Border Grid.Column=\"0\" Grid.Row=\"1\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel LastChildFill=\"False\" Margin=\"5\">\r\n                <Button TabIndex=\"3\" Content=\"{DynamicResource LOCFinishLabel}\" Name=\"ButtonFinish\" DockPanel.Dock=\"Right\"\r\n                        Visibility=\"{Binding ShowFinishButton, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding FinishCommand}\" IsVisibleChanged=\"ButtonFinish_IsVisibleChanged\"/>\r\n                <Button TabIndex=\"2\" Content=\"{DynamicResource LOCNextLabel}\" Name=\"ButtonNext\" DockPanel.Dock=\"Right\"\r\n                        Visibility=\"{Binding ShowFinishButton, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding NextCommand}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/FirstTimeStartupWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class FirstTimeStartupWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new FirstTimeStartupWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for FirstTimeStartupWindow.xaml\r\n    /// </summary>\r\n    public partial class FirstTimeStartupWindow : WindowBase\r\n    {        \r\n        public FirstTimeStartupWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        private void ButtonFinish_IsVisibleChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)\r\n        {\r\n            if (ButtonFinish.IsVisible)\r\n            {\r\n                ButtonFinish.Focus();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/GameEditWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.GameEditWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n        xmlns:pm=\"clr-namespace:Playnite.SDK.Models;assembly=Playnite.SDK\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n        xmlns:psdk=\"clr-namespace:Playnite.SDK;assembly=Playnite.SDK\"\r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCGameEditWindowTitle}\"\r\n        Height=\"720\" Width=\"850\"\r\n        WindowStartupLocation=\"CenterOwner\"\r\n        x:Name=\"mainWindow\"\r\n        AutomationProperties.AutomationId=\"WindowGameEdit\">\r\n    \r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"Closing\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding WindowClosingCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n    \r\n    <controls:WindowBase.Resources>\r\n        <p:BindingProxy x:Key=\"Proxy\" Data=\"{Binding}\" />\r\n        <pcon:ReleaseDateToStringConverter x:Key=\"ReleaseDateToStringConverter\" />\r\n        <pcon:ListToStringConverter x:Key=\"ListToStringConverter\" />\r\n        <pcon:NullableDateToStringConverter x:Key=\"NullableDateToStringConverter\" />\r\n        <BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n        <pcon:InvertableBooleanToVisibilityConverter x:Key=\"InvertableBooleanToVisibilityConverter\" />\r\n        <pcon:NullToVisibilityConverter x:Key=\"NullToVisibilityConverter\" />\r\n        <pcon:NegateConverter x:Key=\"NegateConverter\" />\r\n        <pcon:ValueConverterGroup x:Key=\"EnumCompVisibilityConverterInverted\">\r\n            <pcon:EnumToBooleanConverter/>\r\n            <pcon:NegateConverter/>\r\n            <BooleanToVisibilityConverter/>\r\n        </pcon:ValueConverterGroup>\r\n        <Style x:Key=\"SaveChangesCheck\" TargetType=\"CheckBox\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\r\n            <Setter Property=\"Margin\" Value=\"0,0,0,0\" />\r\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n            <Setter Property=\"ToolTip\" Value=\"{DynamicResource LOCGameEditChangeSaveTooltip}\" />\r\n            <Setter Property=\"Visibility\" Value=\"{Binding Data.ShowCheckBoxes, Converter={StaticResource BooleanToVisibilityConverter}, Source={StaticResource Proxy}}\" />\r\n            <Style.Triggers>\r\n                <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                    <Setter Property=\"BorderBrush\" Value=\"{StaticResource DataChangeNotifBrush}\" />\r\n                </Trigger>\r\n            </Style.Triggers>\r\n        </Style>\r\n        <DataTemplate x:Key=\"SectionHeaderTemplate\" x:Shared=\"False\">\r\n            <StackPanel Orientation=\"Horizontal\">\r\n                <TextBlock Text=\" ! \" Foreground=\"{StaticResource DataChangeNotifBrush}\" ToolTip=\"{DynamicResource LOCGameEditChangeNotif}\"\r\n                           Visibility=\"{Binding Tag, RelativeSource={RelativeSource AncestorType=ContentControl}, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n                <TextBlock Text=\"{Binding Content, RelativeSource={RelativeSource AncestorType=ContentControl}}\"\r\n                           Foreground=\"{Binding Foreground, RelativeSource={RelativeSource AncestorType=TextBlock}}\" />\r\n            </StackPanel>\r\n        </DataTemplate>\r\n    </controls:WindowBase.Resources>\r\n\r\n    <Grid Margin=\"0,5,0,0\">\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n\r\n        <TabControl Name=\"TabControlMain\" DockPanel.Dock=\"Top\" Grid.Column=\"0\" Grid.Row=\"0\">\r\n            <TabItem Name=\"TabGeneral\">\r\n                <TabItem.Header>\r\n                    <ContentControl ContentTemplate=\"{StaticResource SectionHeaderTemplate}\"\r\n                                    Content=\"{DynamicResource LOCGeneralLabel}\"\r\n                                    Tag=\"{Binding ShowGeneralChangeNotif}\" />\r\n                </TabItem.Header>\r\n                <ScrollViewer>\r\n                    <Grid Grid.Column=\"0\" Grid.Row=\"0\" Margin=\"10\">\r\n                        <Grid.Resources>\r\n                            <!--This one has to be specifically referenced otherwise it messes up with search box in dropdown selector-->\r\n                            <Style x:Key=\"TextBoxStyle\" TargetType=\"TextBox\" BasedOn=\"{StaticResource {x:Type TextBox}}\" >\r\n                                <Setter Property=\"Margin\" Value=\"3\" />\r\n                            </Style>\r\n                            <Style TargetType=\"pctrls:LongNumericBox\" BasedOn=\"{StaticResource {x:Type pctrls:LongNumericBox}}\" >\r\n                                <Setter Property=\"Margin\" Value=\"3\" />\r\n                            </Style>\r\n                            <Style TargetType=\"pctrls:NullIntNumericBox\" BasedOn=\"{StaticResource {x:Type pctrls:NullIntNumericBox}}\" >\r\n                                <Setter Property=\"Margin\" Value=\"3\" />\r\n                            </Style>\r\n                            <Style TargetType=\"ComboBox\" BasedOn=\"{StaticResource {x:Type ComboBox}}\" >\r\n                                <Setter Property=\"Margin\" Value=\"3\" />\r\n                            </Style>\r\n                            <Style TargetType=\"pctrls:DdItemListSelectionBox\" BasedOn=\"{StaticResource {x:Type pctrls:DdItemListSelectionBox}}\" >\r\n                                <Setter Property=\"Margin\" Value=\"3\" />\r\n                                <Setter Property=\"ShowSearchBox\" Value=\"True\" />\r\n                            </Style>\r\n                            <Style TargetType=\"CheckBox\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\r\n                                <Setter Property=\"Margin\" Value=\"0,0,0,0\" />\r\n                                <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                            </Style>\r\n                            <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource {x:Type TextBlock}}\" >\r\n                                <Setter Property=\"Margin\" Value=\"8,0,10,0\" />\r\n                                <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                            </Style>\r\n                            <Style TargetType=\"DatePicker\" BasedOn=\"{StaticResource {x:Type DatePicker}}\" >\r\n                                <Setter Property=\"Margin\" Value=\"3\" />\r\n                            </Style>\r\n                        </Grid.Resources>\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"Auto\"/>\r\n                            <ColumnDefinition Width=\"Auto\"/>\r\n                            <ColumnDefinition Width=\"*\"/>\r\n                            <ColumnDefinition Width=\"Auto\"/>\r\n                            <ColumnDefinition Width=\"Auto\"/>\r\n                            <ColumnDefinition Width=\"*\"/>\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"*\"/>\r\n                        </Grid.RowDefinitions>\r\n\r\n                        <!-- Name -->\r\n                        <TextBlock Grid.Column=\"0\" Grid.Row=\"0\" Text=\"{DynamicResource LOCNameLabel}\"/>\r\n                        <CheckBox Grid.Column=\"1\" Grid.Row=\"0\" Name=\"CheckName\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                    IsChecked=\"{Binding UseNameChanges}\"/>\r\n                        <TextBox Grid.Column=\"2\" Grid.Row=\"0\" Name=\"TextName\" Style=\"{StaticResource TextBoxStyle}\"\r\n                                    Text=\"{Binding EditingGame.Name, UpdateSourceTrigger=PropertyChanged}\"/>\r\n\r\n                        <!-- Sorting Name -->\r\n                        <TextBlock Grid.Column=\"0\" Grid.Row=\"1\" Text=\"{DynamicResource LOCGameSortingNameTitle}\"/>\r\n                        <CheckBox Grid.Column=\"1\" Grid.Row=\"1\" Name=\"CheckSortingName\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                    IsChecked=\"{Binding UseSortingNameChanges}\"/>\r\n                        <TextBox Grid.Column=\"2\" Grid.Row=\"1\" Name=\"TextSortingName\" Style=\"{StaticResource TextBoxStyle}\"\r\n                                    Text=\"{Binding EditingGame.SortingName, UpdateSourceTrigger=PropertyChanged}\"/>\r\n\r\n                        <!-- Platform -->\r\n                        <TextBlock Grid.Column=\"0\" Grid.Row=\"2\" Text=\"{DynamicResource LOCGamePlatformTitle}\"/>\r\n                        <CheckBox Grid.Column=\"1\" Grid.Row=\"2\" Name=\"CheckPlatform\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                    IsChecked=\"{Binding UsePlatformChanges}\"/>\r\n                        <DockPanel Grid.Column=\"2\" Grid.Row=\"2\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                    VerticalContentAlignment=\"Center\"\r\n                                    Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                    Command=\"{Binding AddPlatformCommand}\" />\r\n                            <pctrls:DdItemListSelectionBox DockPanel.Dock=\"Left\"\r\n                                                           IsThreeState=\"{Binding IsMultiGameEdit}\"\r\n                                                           ItemsList=\"{Binding Platforms}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- Genres -->\r\n                        <TextBlock Grid.Column=\"0\" Grid.Row=\"3\" Text=\"{DynamicResource LOCGenresLabel}\" />\r\n                        <CheckBox Grid.Column=\"1\" Grid.Row=\"3\" Name=\"CheckGenres\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                    IsChecked=\"{Binding UseGenresChanges}\" />\r\n                        <DockPanel Grid.Column=\"2\" Grid.Row=\"3\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                    VerticalContentAlignment=\"Center\"\r\n                                    Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                    Command=\"{Binding AddGenreCommand}\" />\r\n                            <pctrls:DdItemListSelectionBox DockPanel.Dock=\"Left\"\r\n                                                   IsThreeState=\"{Binding IsMultiGameEdit}\"\r\n                                                   ItemsList=\"{Binding Genres}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- Developers -->\r\n                        <TextBlock Grid.Column=\"0\" Grid.Row=\"4\" Text=\"{DynamicResource LOCDevelopersLabel}\"/>\r\n                        <CheckBox Grid.Column=\"1\" Grid.Row=\"4\" Name=\"CheckDeveloper\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                    IsChecked=\"{Binding UseDeveloperChanges}\"/>\r\n                        <DockPanel Grid.Column=\"2\" Grid.Row=\"4\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                    VerticalContentAlignment=\"Center\"\r\n                                    Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                    Command=\"{Binding AddDeveloperCommand}\" />\r\n                            <pctrls:DdItemListSelectionBox DockPanel.Dock=\"Left\"\r\n                                                   IsThreeState=\"{Binding IsMultiGameEdit}\"\r\n                                                   ItemsList=\"{Binding Developers}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- Publishers -->\r\n                        <TextBlock Grid.Column=\"0\" Grid.Row=\"5\" Text=\"{DynamicResource LOCPublishersLabel}\" />\r\n                        <CheckBox Grid.Column=\"1\" Grid.Row=\"5\" Name=\"CheckPublisher\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                    IsChecked=\"{Binding UsePublisherChanges}\"/>\r\n                        <DockPanel Grid.Column=\"2\" Grid.Row=\"5\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                    VerticalContentAlignment=\"Center\"\r\n                                    Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                    Command=\"{Binding AddPublisherCommand}\" />\r\n                            <pctrls:DdItemListSelectionBox DockPanel.Dock=\"Left\"\r\n                                                   IsThreeState=\"{Binding IsMultiGameEdit}\"\r\n                                                   ItemsList=\"{Binding Publishers}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- Categories -->\r\n                        <TextBlock Grid.Column=\"0\" Grid.Row=\"6\" Text=\"{DynamicResource LOCCategoriesLabel}\" />\r\n                        <CheckBox Grid.Column=\"1\" Grid.Row=\"6\" Name=\"CheckCategories\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                    IsChecked=\"{Binding UseCategoryChanges}\"/>\r\n                        <DockPanel Grid.Column=\"2\" Grid.Row=\"6\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                    VerticalContentAlignment=\"Center\"\r\n                                    Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                    Command=\"{Binding AddCategoryCommand}\" />\r\n                            <pctrls:DdItemListSelectionBox DockPanel.Dock=\"Left\"\r\n                                                   IsThreeState=\"{Binding IsMultiGameEdit}\"\r\n                                                   ItemsList=\"{Binding Categories}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- Features -->\r\n                        <TextBlock Grid.Column=\"0\" Grid.Row=\"7\" Text=\"{DynamicResource LOCFeaturesLabel}\" />\r\n                        <CheckBox Grid.Column=\"1\" Grid.Row=\"7\" Name=\"CheckFeature\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                    IsChecked=\"{Binding UseFeatureChanges}\"/>\r\n                        <DockPanel Grid.Column=\"2\" Grid.Row=\"7\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                    VerticalContentAlignment=\"Center\"\r\n                                    Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                    Command=\"{Binding AddFeatureCommand}\" />\r\n                            <pctrls:DdItemListSelectionBox DockPanel.Dock=\"Left\"\r\n                                                   IsThreeState=\"{Binding IsMultiGameEdit}\"\r\n                                                   ItemsList=\"{Binding Features}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- Tags -->\r\n                        <TextBlock Grid.Column=\"0\" Grid.Row=\"8\" Text=\"{DynamicResource LOCTagsLabel}\" />\r\n                        <CheckBox Grid.Column=\"1\" Grid.Row=\"8\" Name=\"CheckTag\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                    IsChecked=\"{Binding UseTagChanges}\"/>\r\n                        <DockPanel Grid.Column=\"2\" Grid.Row=\"8\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                    VerticalContentAlignment=\"Center\"\r\n                                    Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                    Command=\"{Binding AddTagCommand}\" />\r\n                            <pctrls:DdItemListSelectionBox DockPanel.Dock=\"Left\"\r\n                                                   IsThreeState=\"{Binding IsMultiGameEdit}\"\r\n                                                   ItemsList=\"{Binding Tags}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- Description -->\r\n                        <TextBlock Grid.Column=\"0\" Grid.Row=\"9\" Text=\"{DynamicResource LOCGameDescriptionTitle}\"\r\n                                   VerticalAlignment=\"Top\" Margin=\"8,6,10,0\"/>\r\n                        <CheckBox Grid.Column=\"1\" Grid.Row=\"9\" Name=\"CheckDescription\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  VerticalAlignment=\"Top\" Margin=\"0,5,0,0\"\r\n                                    IsChecked=\"{Binding UseDescriptionChanges}\"/>\r\n                        <TextBox Grid.Column=\"2\" Grid.Row=\"9\" Grid.RowSpan=\"13\" Grid.ColumnSpan=\"6\"\r\n                                 FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                                 VerticalAlignment=\"Stretch\" Margin=\"3,5,3,3\"\r\n                                 TextWrapping=\"Wrap\" AcceptsReturn=\"True\" Name=\"TextDescription\"\r\n                                 ScrollViewer.VerticalScrollBarVisibility=\"Auto\"\r\n                                 Text=\"{Binding EditingGame.Description, UpdateSourceTrigger=PropertyChanged}\"\r\n                                 ToolTip=\"{DynamicResource LOCDescriptionHTMLSupportTooltip}\"\r\n                                 ToolTipService.Placement=\"Top\" ToolTipService.InitialShowDelay=\"0\"/>\r\n\r\n                        <!-- Release Date -->\r\n                        <TextBlock Grid.Column=\"3\" Grid.Row=\"0\" Text=\"{DynamicResource LOCGameReleaseDateTitle}\"/>\r\n                        <CheckBox Grid.Column=\"4\" Grid.Row=\"0\" Name=\"CheckReleaseDate\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                    IsChecked=\"{Binding UseReleaseDateChanges}\"/>\r\n                        <TextBox Grid.Column=\"5\" Grid.Row=\"0\" Style=\"{StaticResource TextBoxStyle}\"\r\n                                 ToolTip=\"{DynamicResource LOCReleaseDateTooltip}\"\r\n                                 ToolTipService.Placement=\"Top\" ToolTipService.InitialShowDelay=\"0\">\r\n                            <TextBox.Text>\r\n                                <Binding Path=\"EditingGame.ReleaseDate\"\r\n                                         UpdateSourceTrigger=\"PropertyChanged\" \r\n                                         ValidatesOnDataErrors=\"True\"\r\n                                         NotifyOnValidationError=\"True\"\r\n                                         Converter=\"{pcon:EditingReleaseDateToStringConverter}\">\r\n                                    <Binding.ValidationRules>\r\n                                        <pcon:ReleaseDateFieldValidation />\r\n                                    </Binding.ValidationRules>\r\n                                </Binding>\r\n                            </TextBox.Text>\r\n                        </TextBox>\r\n\r\n                        <!-- Series -->\r\n                        <TextBlock Grid.Column=\"3\" Grid.Row=\"1\" Text=\"{DynamicResource LOCSeriesLabel}\"/>\r\n                        <CheckBox Grid.Column=\"4\" Grid.Row=\"1\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseSeriesChanges}\"/>\r\n                        <DockPanel Grid.Column=\"5\" Grid.Row=\"1\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                    VerticalContentAlignment=\"Center\"\r\n                                    Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                    Command=\"{Binding AddSeriesCommand}\" />\r\n                            <pctrls:DdItemListSelectionBox DockPanel.Dock=\"Left\"\r\n                                                           IsThreeState=\"{Binding IsMultiGameEdit}\"\r\n                                                           ItemsList=\"{Binding Series}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- AgeRating -->\r\n                        <TextBlock Grid.Column=\"3\" Grid.Row=\"2\" Text=\"{DynamicResource LOCAgeRatingLabel}\"/>\r\n                        <CheckBox Grid.Column=\"4\" Grid.Row=\"2\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseAgeRatingChanges}\"/>\r\n                        <DockPanel Grid.Column=\"5\" Grid.Row=\"2\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                    VerticalContentAlignment=\"Center\"\r\n                                    Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                    Command=\"{Binding AddAgeRatingCommand}\" />\r\n                            <pctrls:DdItemListSelectionBox DockPanel.Dock=\"Left\"\r\n                                                           IsThreeState=\"{Binding IsMultiGameEdit}\"\r\n                                                           ItemsList=\"{Binding AgeRatings}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- Region -->\r\n                        <TextBlock Grid.Column=\"3\" Grid.Row=\"3\" Text=\"{DynamicResource LOCRegionLabel}\"/>\r\n                        <CheckBox Grid.Column=\"4\" Grid.Row=\"3\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseRegionChanges}\"/>\r\n                        <DockPanel Grid.Column=\"5\" Grid.Row=\"3\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                    VerticalContentAlignment=\"Center\"\r\n                                    Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                    Command=\"{Binding AddRegionCommand}\" />\r\n                            <pctrls:DdItemListSelectionBox DockPanel.Dock=\"Left\"\r\n                                                           IsThreeState=\"{Binding IsMultiGameEdit}\"\r\n                                                           ItemsList=\"{Binding Regions}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- Source -->\r\n                        <TextBlock Grid.Column=\"3\" Grid.Row=\"4\" Text=\"{DynamicResource LOCSourceLabel}\"/>\r\n                        <CheckBox Grid.Column=\"4\" Grid.Row=\"4\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseSourceChanges}\"/>\r\n                        <DockPanel Grid.Column=\"5\" Grid.Row=\"4\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                    VerticalContentAlignment=\"Center\"\r\n                                    Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                    Command=\"{Binding AddSourceCommand}\" />\r\n                            <ComboBox DockPanel.Dock=\"Left\"\r\n                                  ItemsSource=\"{Binding Sources}\"\r\n                                  SelectedValuePath=\"Id\" DisplayMemberPath=\"Name\"\r\n                                  SelectedValue=\"{Binding EditingGame.SourceId, UpdateSourceTrigger=PropertyChanged}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- CompletionStatus -->\r\n                        <TextBlock Grid.Column=\"3\" Grid.Row=\"5\" Text=\"{DynamicResource LOCCompletionStatus}\"/>\r\n                        <CheckBox Grid.Column=\"4\" Grid.Row=\"5\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseCompletionStatusChanges}\"/>\r\n                        <DockPanel Grid.Column=\"5\" Grid.Row=\"5\">\r\n                            <Button Content=\"+\" FontWeight=\"Bold\" DockPanel.Dock=\"Right\"\r\n                                VerticalContentAlignment=\"Center\"\r\n                                Padding=\"4,2,4,2\" Margin=\"3\"\r\n                                Command=\"{Binding AddCompletionStatusCommand}\" />\r\n                            <ComboBox IsTabStop=\"False\" DockPanel.Dock=\"Left\"\r\n                                  ItemsSource=\"{Binding CompletionStatuses}\"\r\n                                  SelectedValuePath=\"Id\" DisplayMemberPath=\"Name\"\r\n                                  SelectedValue=\"{Binding EditingGame.CompletionStatusId, UpdateSourceTrigger=PropertyChanged}\" />\r\n                        </DockPanel>\r\n\r\n                        <!-- UserScore -->\r\n                        <TextBlock Grid.Column=\"3\" Grid.Row=\"6\" Text=\"{DynamicResource LOCUserScore}\"/>\r\n                        <CheckBox Grid.Column=\"4\" Grid.Row=\"6\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseUserScoreChanges}\"/>\r\n                        <TextBox Grid.Column=\"5\" Grid.Row=\"6\" Width=\"50\" HorizontalAlignment=\"Left\"\r\n                                 Style=\"{StaticResource TextBoxStyle}\"\r\n                                 ToolTip=\"{DynamicResource LOCDescriptionScoreValues}\"\r\n                                 ToolTipService.Placement=\"Top\" ToolTipService.InitialShowDelay=\"0\">\r\n                            <TextBox.Text>\r\n                                <Binding Path=\"EditingGame.UserScore\"\r\n                                         UpdateSourceTrigger=\"PropertyChanged\" \r\n                                         ValidatesOnDataErrors=\"True\"\r\n                                         NotifyOnValidationError=\"True\"\r\n                                         Converter=\"{pcon:NullableIntToStringConverter}\">\r\n                                    <Binding.ValidationRules>\r\n                                        <pcon:NullableIntFieldValidation MinValue=\"0\" MaxValue=\"100\" />\r\n                                    </Binding.ValidationRules>\r\n                                </Binding>\r\n                            </TextBox.Text>\r\n                        </TextBox>\r\n\r\n                        <!-- CriticScore -->\r\n                        <TextBlock Grid.Column=\"3\" Grid.Row=\"7\" Text=\"{DynamicResource LOCCriticScore}\"/>\r\n                        <CheckBox Grid.Column=\"4\" Grid.Row=\"7\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseCriticScoreChanges}\"/>\r\n                        <TextBox Grid.Column=\"5\" Grid.Row=\"7\" Width=\"50\" HorizontalAlignment=\"Left\"\r\n                                 Style=\"{StaticResource TextBoxStyle}\"\r\n                                 ToolTip=\"{DynamicResource LOCDescriptionScoreValues}\"\r\n                                 ToolTipService.Placement=\"Top\" ToolTipService.InitialShowDelay=\"0\">\r\n                            <TextBox.Text>\r\n                                <Binding Path=\"EditingGame.CriticScore\"\r\n                                         UpdateSourceTrigger=\"PropertyChanged\" \r\n                                         ValidatesOnDataErrors=\"True\"\r\n                                         NotifyOnValidationError=\"True\"\r\n                                         Converter=\"{pcon:NullableIntToStringConverter}\">\r\n                                    <Binding.ValidationRules>\r\n                                        <pcon:NullableIntFieldValidation MinValue=\"0\" MaxValue=\"100\" />\r\n                                    </Binding.ValidationRules>\r\n                                </Binding>\r\n                            </TextBox.Text>\r\n                        </TextBox>\r\n\r\n                        <!-- CommunityScore -->\r\n                        <TextBlock Grid.Column=\"3\" Grid.Row=\"8\" Text=\"{DynamicResource LOCCommunityScore}\"/>\r\n                        <CheckBox Grid.Column=\"4\" Grid.Row=\"8\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseCommunityScoreChanges}\"/>\r\n                        <TextBox Grid.Column=\"5\" Grid.Row=\"8\" Width=\"50\" HorizontalAlignment=\"Left\"\r\n                                 Style=\"{StaticResource TextBoxStyle}\"\r\n                                 ToolTip=\"{DynamicResource LOCDescriptionScoreValues}\"\r\n                                 ToolTipService.Placement=\"Top\" ToolTipService.InitialShowDelay=\"0\">\r\n                            <TextBox.Text>\r\n                                <Binding Path=\"EditingGame.CommunityScore\"\r\n                                         UpdateSourceTrigger=\"PropertyChanged\" \r\n                                         ValidatesOnDataErrors=\"True\"\r\n                                         NotifyOnValidationError=\"True\"\r\n                                         Converter=\"{pcon:NullableIntToStringConverter}\">\r\n                                    <Binding.ValidationRules>\r\n                                        <pcon:NullableIntFieldValidation MinValue=\"0\" MaxValue=\"100\" />\r\n                                    </Binding.ValidationRules>\r\n                                </Binding>\r\n                            </TextBox.Text>\r\n                        </TextBox>\r\n                    </Grid>\r\n                </ScrollViewer>\r\n            </TabItem>\r\n\r\n            <TabItem>\r\n                <TabItem.Header>\r\n                    <ContentControl ContentTemplate=\"{StaticResource SectionHeaderTemplate}\"\r\n                                    Content=\"{DynamicResource LOCAdvanced}\"\r\n                                    Tag=\"{Binding ShowAdvancedChangeNotif}\" />\r\n                </TabItem.Header>\r\n                <Grid Margin=\"10\">\r\n                    <Grid.Resources>\r\n                        <Style TargetType=\"TextBox\" BasedOn=\"{StaticResource {x:Type TextBox}}\" >\r\n                            <Setter Property=\"Margin\" Value=\"3\" />\r\n                        </Style>\r\n                        <Style TargetType=\"pctrls:LongNumericBox\" BasedOn=\"{StaticResource {x:Type pctrls:LongNumericBox}}\" >\r\n                            <Setter Property=\"Margin\" Value=\"3\" />\r\n                        </Style>\r\n                        <Style TargetType=\"pctrls:UlongNumericBox\" BasedOn=\"{StaticResource {x:Type pctrls:UlongNumericBox}}\" >\r\n                            <Setter Property=\"Margin\" Value=\"3\" />\r\n                        </Style>\r\n                        <Style TargetType=\"pctrls:NullIntNumericBox\" BasedOn=\"{StaticResource {x:Type pctrls:NullIntNumericBox}}\" >\r\n                            <Setter Property=\"Margin\" Value=\"3\" />\r\n                        </Style>\r\n                        <Style TargetType=\"ComboBox\" BasedOn=\"{StaticResource {x:Type ComboBox}}\" >\r\n                            <Setter Property=\"Margin\" Value=\"3\" />\r\n                        </Style>\r\n                        <Style TargetType=\"CheckBox\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\r\n                            <Setter Property=\"Margin\" Value=\"0,0,0,0\" />\r\n                            <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                        </Style>\r\n                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource {x:Type TextBlock}}\" >\r\n                            <Setter Property=\"Margin\" Value=\"8,0,10,0\" />\r\n                            <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n                        </Style>\r\n                        <Style TargetType=\"DatePicker\" BasedOn=\"{StaticResource {x:Type DatePicker}}\" >\r\n                            <Setter Property=\"Margin\" Value=\"3\" />\r\n                        </Style>    \r\n                    </Grid.Resources>\r\n                    <Grid.ColumnDefinitions>\r\n                        <ColumnDefinition Width=\"Auto\"/>\r\n                        <ColumnDefinition Width=\"Auto\"/>\r\n                        <ColumnDefinition Width=\"*\"/>\r\n                        <ColumnDefinition Width=\"20\"/>\r\n                        <ColumnDefinition Width=\"Auto\"/>\r\n                        <ColumnDefinition Width=\"*\"/>\r\n                    </Grid.ColumnDefinitions>\r\n                    <Grid.RowDefinitions>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"Auto\"/>\r\n                        <RowDefinition Height=\"*\"/>\r\n                    </Grid.RowDefinitions>\r\n\r\n                    <!-- Last Played -->\r\n                    <TextBlock Grid.Column=\"1\" Grid.Row=\"0\" Text=\"{DynamicResource LOCLastPlayedLabel}\"/>\r\n                    <CheckBox Grid.Column=\"0\" Grid.Row=\"0\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                IsChecked=\"{Binding UseLastActivityChanges}\"/>\r\n                    <DatePicker Grid.Column=\"2\" Grid.Row=\"0\"\r\n                                SelectedDate=\"{Binding EditingGame.LastActivity}\"/>\r\n\r\n                    <!-- PlayTime -->\r\n                    <TextBlock Grid.Column=\"1\" Grid.Row=\"1\" Text=\"{DynamicResource LOCTimePlayed}\"/>\r\n                    <CheckBox Grid.Column=\"0\" Grid.Row=\"1\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                              IsChecked=\"{Binding UsePlaytimeChanges}\"/>\r\n                    <DockPanel Grid.Column=\"2\" Grid.Row=\"1\">\r\n                        <TextBlock Text=\"{Binding EditingGame.Playtime, Converter={pcon:PlayTimeToStringConverter}, ConverterParameter={pmrk:Settings PlaytimeUseDaysFormat, DirectValue=True}}\"\r\n                                   DockPanel.Dock=\"Right\" />\r\n                        <TextBox ToolTip=\"{DynamicResource LOCDescriptionPlaytimeSeconds}\"\r\n                                 ToolTipService.Placement=\"Top\" ToolTipService.InitialShowDelay=\"0\"\r\n                                 DockPanel.Dock=\"Left\">\r\n                            <TextBox.Text>\r\n                                <Binding Path=\"EditingGame.Playtime\"\r\n                                         UpdateSourceTrigger=\"PropertyChanged\" \r\n                                         ValidatesOnDataErrors=\"True\"\r\n                                         NotifyOnValidationError=\"True\"\r\n                                         Converter=\"{pcon:UlongToStringConverter}\">\r\n                                    <Binding.ValidationRules>\r\n                                        <pcon:UlongFieldValidation />\r\n                                    </Binding.ValidationRules>\r\n                                </Binding>\r\n                            </TextBox.Text>\r\n                        </TextBox>\r\n                    </DockPanel>\r\n\r\n                    <!-- PlayCount -->\r\n                    <TextBlock Grid.Column=\"1\" Grid.Row=\"2\" Text=\"{DynamicResource LOCPlayCountLabel}\"/>\r\n                    <CheckBox Grid.Column=\"0\" Grid.Row=\"2\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                              IsChecked=\"{Binding UsePlayCountChanges}\"/>\r\n                    <TextBox Grid.Column=\"2\" Grid.Row=\"2\">\r\n                        <TextBox.Text>\r\n                            <Binding Path=\"EditingGame.PlayCount\"\r\n                                    UpdateSourceTrigger=\"PropertyChanged\" \r\n                                    ValidatesOnDataErrors=\"True\"\r\n                                    NotifyOnValidationError=\"True\"\r\n                                    Converter=\"{pcon:UlongToStringConverter}\">\r\n                                <Binding.ValidationRules>\r\n                                    <pcon:UlongFieldValidation />\r\n                                </Binding.ValidationRules>\r\n                            </Binding>\r\n                        </TextBox.Text>\r\n                    </TextBox>\r\n\r\n                    <!-- Version -->\r\n                    <TextBlock Grid.Column=\"1\" Grid.Row=\"3\" Text=\"{DynamicResource LOCVersionLabel}\"/>\r\n                    <CheckBox Grid.Column=\"0\" Grid.Row=\"3\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                              IsChecked=\"{Binding UseVersionChanges}\"/>\r\n                    <TextBox Grid.Column=\"2\" Grid.Row=\"3\"\r\n                             Text=\"{Binding EditingGame.Version, UpdateSourceTrigger=PropertyChanged}\"/>\r\n\r\n                    <!--Manual-->\r\n                    <CheckBox Grid.Column=\"0\" Grid.Row=\"4\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                              IsChecked=\"{Binding UseManualChanges}\"/>\r\n                    <TextBlock Grid.Column=\"1\" Grid.Row=\"4\" Text=\"{DynamicResource LOCGameManualTitle}\"/>\r\n                    <TextBox Grid.Column=\"2\" Grid.Row=\"4\"\r\n                             Text=\"{Binding EditingGame.Manual, UpdateSourceTrigger=PropertyChanged}\" />\r\n\r\n                    <Canvas Height=\"20\" Grid.Column=\"0\" Grid.Row=\"5\" />\r\n\r\n                    <!-- Hidden -->\r\n                    <TextBlock Grid.Column=\"1\" Grid.Row=\"6\" Text=\"{DynamicResource LOCGameHiddenTitle}\" />\r\n                    <CheckBox Grid.Column=\"0\" Grid.Row=\"6\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                              IsChecked=\"{Binding UseHiddenChanges}\"/>\r\n                    <CheckBox Grid.Column=\"2\" Grid.Row=\"6\" Margin=\"3\"\r\n                              IsChecked=\"{Binding EditingGame.Hidden}\"/>\r\n\r\n                    <!-- Favorite -->\r\n                    <TextBlock Grid.Column=\"1\" Grid.Row=\"7\" Text=\"{DynamicResource LOCGameFavoriteTitle}\" />\r\n                    <CheckBox Grid.Column=\"0\" Grid.Row=\"7\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                              IsChecked=\"{Binding UseFavoriteChanges}\"/>\r\n                    <CheckBox Grid.Column=\"2\" Grid.Row=\"7\" Margin=\"3\"\r\n                              IsChecked=\"{Binding EditingGame.Favorite}\" />\r\n\r\n                    <!-- HDR -->\r\n                    <TextBlock Grid.Column=\"1\" Grid.Row=\"8\" Text=\"{DynamicResource LOCGameHdrTitle}\" />\r\n                    <CheckBox Grid.Column=\"0\" Grid.Row=\"8\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                IsChecked=\"{Binding UseHdrChanges}\"/>\r\n                    <CheckBox Grid.Column=\"2\" Grid.Row=\"8\" Margin=\"3\"\r\n                              IsChecked=\"{Binding EditingGame.EnableSystemHdr}\"\r\n                              ToolTipService.Placement=\"Top\" ToolTipService.InitialShowDelay=\"0\"\r\n                              ToolTipService.ShowOnDisabled=\"True\">\r\n                        <CheckBox.ToolTip>\r\n                            <StackPanel>\r\n                                <TextBlock Text=\"{DynamicResource LOCGameHdrTooltip}\"\r\n                                           Margin=\"0\"/>\r\n                                <TextBlock Text=\"{DynamicResource LOCGameHdrNotSupportedTooltip}\"\r\n                                           Margin=\"0\"\r\n                                           Visibility=\"{Binding IsHdrSupported, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\"/>\r\n                            </StackPanel>\r\n                        </CheckBox.ToolTip>\r\n                    </CheckBox>\r\n\r\n                    <Canvas Height=\"20\" Grid.Column=\"0\" Grid.Row=\"9\" />\r\n\r\n                    <!-- Added -->\r\n                    <TextBlock Grid.Column=\"1\" Grid.Row=\"10\" Text=\"{DynamicResource LOCAddedLabel}\"/>\r\n                    <CheckBox Grid.Column=\"0\" Grid.Row=\"10\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                IsChecked=\"{Binding UseAddedChanges}\"/>\r\n                    <DatePicker Grid.Column=\"2\" Grid.Row=\"10\"\r\n                                SelectedDate=\"{Binding EditingGame.Added}\"/>\r\n\r\n                    <!-- Modified -->\r\n                    <TextBlock Grid.Column=\"1\" Grid.Row=\"11\" Text=\"{DynamicResource LOCModifiedLabel}\"\r\n                               Visibility=\"{Binding IsSingleGameEdit, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n                    <TextBlock Grid.Column=\"2\" Grid.Row=\"11\" Margin=\"3,6,3,6\"\r\n                               Visibility=\"{Binding IsSingleGameEdit, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                               Text=\"{Binding EditingGame.Modified, Converter={StaticResource NullableDateToStringConverter}}\"/>\r\n\r\n                    <!-- Notes -->\r\n                    <TextBlock Grid.Column=\"1\" Grid.Row=\"12\" Text=\"{DynamicResource LOCNotesLabel}\"\r\n                               VerticalAlignment=\"Top\" Margin=\"8,16,10,0\" />\r\n                    <CheckBox Grid.Column=\"0\" Grid.Row=\"12\"  Style=\"{StaticResource SaveChangesCheck}\"\r\n                              VerticalAlignment=\"Top\" Margin=\"0,15,0,0\"\r\n                              IsChecked=\"{Binding UseNotesChanges}\"/>\r\n                    <TextBox Grid.Column=\"2\" Grid.Row=\"12\" Margin=\"0,15,0,0\"\r\n                             Text=\"{Binding EditingGame.Notes, UpdateSourceTrigger=PropertyChanged}\"\r\n                             Grid.ColumnSpan=\"4\" TextWrapping=\"Wrap\"\r\n                             AcceptsReturn=\"True\" VerticalScrollBarVisibility=\"Auto\"\r\n                             VerticalAlignment=\"Stretch\" />\r\n\r\n                    <!-- GameId -->\r\n                    <TextBlock Grid.Column=\"4\" Grid.Row=\"0\" Text=\"{DynamicResource LOCGameId}\"\r\n                               Visibility=\"{Binding IsSingleGameEdit, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                    <TextBox Grid.Column=\"5\" Grid.Row=\"0\" Text=\"{Binding EditingGame.GameId}\" IsReadOnly=\"True\"\r\n                               Visibility=\"{Binding IsSingleGameEdit, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n\r\n                    <!-- Internal Id -->\r\n                    <TextBlock Grid.Column=\"4\" Grid.Row=\"1\" Text=\"{DynamicResource LOCDatabaseId}\"\r\n                               Visibility=\"{Binding IsSingleGameEdit, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                    <TextBox Grid.Column=\"5\" Grid.Row=\"1\" Text=\"{Binding EditingGame.Id}\" IsReadOnly=\"True\"\r\n                               Visibility=\"{Binding IsSingleGameEdit, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n\r\n                    <!-- Library -->\r\n                    <TextBlock Grid.Column=\"4\" Grid.Row=\"2\" Text=\"{DynamicResource LOCGameProviderTitle}\"\r\n                               Visibility=\"{Binding IsSingleGameEdit, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                    <TextBlock Grid.Column=\"5\" Grid.Row=\"2\" Text=\"{Binding LibraryPlugin.Name, FallbackValue='Playnite'}\"\r\n                               Visibility=\"{Binding IsSingleGameEdit, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n\r\n                </Grid>\r\n            </TabItem>\r\n\r\n            <TabItem>\r\n                <TabItem.Header> \r\n                    <ContentControl ContentTemplate=\"{StaticResource SectionHeaderTemplate}\"\r\n                                    Content=\"{DynamicResource LOCMediaLabel}\"\r\n                                    Tag=\"{Binding ShowMediaChangeNotif}\" />\r\n                </TabItem.Header>\r\n                <DockPanel>\r\n                    <Button Content=\"{DynamicResource LOCOpenMetadataFolder}\" HorizontalAlignment=\"Left\"\r\n                            Margin=\"10,0,0,10\" DockPanel.Dock=\"Bottom\"\r\n                            Command=\"{Binding OpenMetadataFolderCommand}\"\r\n                            Visibility=\"{Binding IsSingleGameEdit, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                    <Grid Margin=\"10\" DockPanel.Dock=\"Top\">\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition />\r\n                            <ColumnDefinition />\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"Auto\" />\r\n                            <RowDefinition Height=\"*\" />\r\n                        </Grid.RowDefinitions>\r\n                        <GroupBox Grid.Column=\"0\" Grid.Row=\"0\" Header=\"{DynamicResource LOCGameIconTitle}\">\r\n                            <GroupBox.HeaderTemplate>\r\n                                <DataTemplate>\r\n                                    <StackPanel Orientation=\"Horizontal\">\r\n                                        <CheckBox Name=\"CheckIcon\" VerticalAlignment=\"Center\" Style=\"{DynamicResource SaveChangesCheck}\"\r\n                                                  IsChecked=\"{Binding Data.UseIconChanges, Source={StaticResource Proxy}}\"/>\r\n                                        <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n                                    </StackPanel>\r\n                                </DataTemplate>\r\n                            </GroupBox.HeaderTemplate>\r\n                            <DockPanel LastChildFill=\"True\" Background=\"Transparent\" AllowDrop=\"True\">\r\n                                <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Left\" Margin=\"5\" DockPanel.Dock=\"Top\">\r\n                                    <Button ToolTip=\"{DynamicResource LOCSelectIconTitle}\"\r\n                                            Content=\"&#xec3e;\"\r\n                                            FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            Command=\"{Binding SelectIconCommand}\" />\r\n                                    <Button ToolTip=\"{DynamicResource LOCSelectUrlTitle}\" Margin=\"5,0,0,0\"\r\n                                            Content=\"&#xef71;\"\r\n                                            FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            Command=\"{Binding SetIconUrlCommand}\" />\r\n                                    <Button ToolTip=\"{DynamicResource LOCRemoveLabel}\" Margin=\"5,0,0,0\"\r\n                                            Content=\"&#xec53;\"\r\n                                            FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            Command=\"{Binding RemoveIconCommand}\" />\r\n                                    <Button Margin=\"5,0,0,0\" ToolTip=\"{DynamicResource LOCSettingsWebImageSearch}\"\r\n                                            Content=\"&#xef3e;\" FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            Command=\"{Binding SelectGoogleIconCommand}\" />\r\n                                </StackPanel>\r\n                                <TextBlock Text=\"{Binding IconMetadata}\" DockPanel.Dock=\"Top\" Margin=\"5,0,0,0\"\r\n                                           ToolTipService.InitialShowDelay=\"0\" HorizontalAlignment=\"Left\">\r\n                                    <TextBlock.Style>\r\n                                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                            <Style.Triggers>\r\n                                                <DataTrigger Binding=\"{Binding IsIconTooLage}\" Value=\"True\">\r\n                                                    <Setter Property=\"Foreground\" Value=\"OrangeRed\" />\r\n                                                    <Setter Property=\"ToolTip\" Value=\"{StaticResource LOCLargeMediaWarningTooltip}\" />\r\n                                                </DataTrigger>\r\n                                            </Style.Triggers>\r\n                                        </Style>\r\n                                    </TextBlock.Style>\r\n                                </TextBlock>\r\n                                <Image Source=\"{Binding IconImageObject, Mode=OneWay}\"\r\n                                       Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\" Name=\"ImageIcon\"\r\n                                       DockPanel.Dock=\"Top\" Height=\"64\"/>\r\n                                <i:Interaction.Triggers>\r\n                                    <i:EventTrigger EventName=\"Drop\" >\r\n                                        <prism:InvokeCommandAction Command=\"{Binding DropIconCommand}\" />\r\n                                    </i:EventTrigger>\r\n                                </i:Interaction.Triggers>\r\n                            </DockPanel>\r\n                        </GroupBox>\r\n                        <GroupBox Grid.Column=\"0\" Grid.Row=\"1\" Header=\"{DynamicResource LOCGameCoverImageTitle}\" Margin=\"0,5,0,0\">\r\n                            <GroupBox.HeaderTemplate>\r\n                                <DataTemplate>\r\n                                    <StackPanel Orientation=\"Horizontal\">\r\n                                        <CheckBox Name=\"CheckImage\" VerticalAlignment=\"Center\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                                  IsChecked=\"{Binding Data.UseImageChanges, Source={StaticResource Proxy}}\"/>\r\n                                        <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n                                    </StackPanel>\r\n                                </DataTemplate>\r\n                            </GroupBox.HeaderTemplate>\r\n                            <DockPanel LastChildFill=\"True\" Background=\"Transparent\" AllowDrop=\"True\">\r\n                                <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\" Margin=\"5\">\r\n                                    <Button Content=\"&#xec3e;\"\r\n                                            FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            ToolTip=\"{DynamicResource LOCSelectCoverTitle}\"\r\n                                            HorizontalAlignment=\"Left\"\r\n                                            Command=\"{Binding SelectCoverCommand}\"/>\r\n                                    <Button ToolTip=\"{DynamicResource LOCSelectUrlTitle}\" Margin=\"5,0,0,0\"\r\n                                            Content=\"&#xef71;\"\r\n                                            FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            Command=\"{Binding SetCoverUrlCommand}\" />\r\n                                    <Button ToolTip=\"{DynamicResource LOCRemoveLabel}\" Margin=\"5,0,0,0\"\r\n                                            Content=\"&#xec53;\"\r\n                                            FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            Command=\"{Binding RemoveImageCommand}\" />\r\n                                    <Button Margin=\"5,0,0,0\" ToolTip=\"{DynamicResource LOCSettingsWebImageSearch}\"\r\n                                            Content=\"&#xef3e;\" FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            Command=\"{Binding SelectGoogleCoverCommand}\" />\r\n                                </StackPanel>\r\n                                <TextBlock Text=\"{Binding CoverMetadata}\" DockPanel.Dock=\"Top\" Margin=\"5,0,0,0\"\r\n                                           ToolTipService.InitialShowDelay=\"0\" HorizontalAlignment=\"Left\">\r\n                                    <TextBlock.Style>\r\n                                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                            <Style.Triggers>\r\n                                                <DataTrigger Binding=\"{Binding IsCoverTooLage}\" Value=\"True\">\r\n                                                    <Setter Property=\"Foreground\" Value=\"OrangeRed\" />\r\n                                                    <Setter Property=\"ToolTip\" Value=\"{StaticResource LOCLargeMediaWarningTooltip}\" />\r\n                                                </DataTrigger>\r\n                                            </Style.Triggers>\r\n                                        </Style>\r\n                                    </TextBlock.Style>\r\n                                </TextBlock>\r\n                                <Image Source=\"{Binding CoverImageObject, Mode=OneWay}\"\r\n                                       Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\" Name=\"ImageImage\"\r\n                                       DockPanel.Dock=\"Top\"/>\r\n                                <i:Interaction.Triggers>\r\n                                    <i:EventTrigger EventName=\"Drop\" >\r\n                                        <prism:InvokeCommandAction Command=\"{Binding DropCoverCommand}\" />\r\n                                    </i:EventTrigger>\r\n                                </i:Interaction.Triggers>\r\n                            </DockPanel>\r\n                        </GroupBox>\r\n                        <GroupBox Grid.Column=\"1\" Grid.Row=\"0\" Grid.RowSpan=\"2\"\r\n                              Header=\"{DynamicResource LOCGameBackgroundTitle}\" Margin=\"5,0,0,0\">\r\n                            <GroupBox.HeaderTemplate>\r\n                                <DataTemplate>\r\n                                    <StackPanel Orientation=\"Horizontal\">\r\n                                        <CheckBox Name=\"CheckImage\" VerticalAlignment=\"Center\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                              IsChecked=\"{Binding Data.UseBackgroundChanges, Source={StaticResource Proxy}}\"/>\r\n                                        <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n                                    </StackPanel>\r\n                                </DataTemplate>\r\n                            </GroupBox.HeaderTemplate>\r\n                            <DockPanel DockPanel.Dock=\"Top\" Background=\"Transparent\" AllowDrop=\"True\">\r\n                                <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\" Margin=\"5\">\r\n                                    <Button Content=\"&#xec3e;\"\r\n                                            FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            ToolTip=\"{DynamicResource LOCSelectBackgroundTitle}\"\r\n                                            HorizontalAlignment=\"Left\"\r\n                                            Command=\"{Binding SelectBackgroundCommand}\"/>\r\n                                    <Button ToolTip=\"{DynamicResource LOCSelectUrlTitle}\" Margin=\"5,0,0,0\"\r\n                                            Content=\"&#xef71;\"\r\n                                            FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            Command=\"{Binding SetBackgroundUrlCommand}\" />\r\n                                    <Button ToolTip=\"{DynamicResource LOCRemoveLabel}\" Margin=\"5,0,0,0\"\r\n                                            Content=\"&#xec53;\"\r\n                                            FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            Command=\"{Binding RemoveBackgroundCommand}\" />\r\n                                    <Button Margin=\"5,0,0,0\" ToolTip=\"{DynamicResource LOCSettingsWebImageSearch}\"\r\n                                            Content=\"&#xef3e;\" FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                                            Command=\"{Binding SelectGoogleBackgroundCommand}\" />\r\n                                </StackPanel>\r\n                                <DockPanel DockPanel.Dock=\"Top\" Margin=\"5,5,0,5\"\r\n                                       Visibility=\"{Binding ShowBackgroundUrl, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                                    <TextBlock Text=\"{DynamicResource LOCImageURL}\" DockPanel.Dock=\"Left\" VerticalAlignment=\"Center\"/>\r\n                                    <TextBox IsReadOnly=\"True\" DockPanel.Dock=\"Left\" Margin=\"5,0,0,0\"\r\n                                         Text=\"{Binding EditingGame.BackgroundImage}\" />\r\n                                </DockPanel>\r\n                                <TextBlock Text=\"{Binding BackgroundMetadata}\" DockPanel.Dock=\"Top\" Margin=\"5,0,0,0\"\r\n                                           ToolTipService.InitialShowDelay=\"0\" HorizontalAlignment=\"Left\">\r\n                                    <TextBlock.Style>\r\n                                        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                                            <Style.Triggers>\r\n                                                <DataTrigger Binding=\"{Binding IsBackgroundTooLage}\" Value=\"True\">\r\n                                                    <Setter Property=\"Foreground\" Value=\"OrangeRed\" />\r\n                                                    <Setter Property=\"ToolTip\" Value=\"{StaticResource LOCLargeMediaWarningTooltip}\" />\r\n                                                </DataTrigger>\r\n                                            </Style.Triggers>\r\n                                        </Style>\r\n                                    </TextBlock.Style>\r\n                                </TextBlock>\r\n                                <Image Source=\"{Binding BackgroundImageObject, Mode=OneWay}\"\r\n                                   Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n                                   DockPanel.Dock=\"Top\"/>\r\n                                <i:Interaction.Triggers>\r\n                                    <i:EventTrigger EventName=\"Drop\" >\r\n                                        <prism:InvokeCommandAction Command=\"{Binding DropBackgroundCommand}\" />\r\n                                    </i:EventTrigger>\r\n                                </i:Interaction.Triggers>\r\n                            </DockPanel>\r\n                        </GroupBox>\r\n                    </Grid>\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <TabItem>\r\n                <TabItem.Header>\r\n                    <ContentControl ContentTemplate=\"{StaticResource SectionHeaderTemplate}\"\r\n                                    Content=\"{DynamicResource LOCLinksLabel}\"\r\n                                    Tag=\"{Binding ShowLinksChangeNotif}\" />\r\n                </TabItem.Header>\r\n                <DockPanel>\r\n                    <TextBlock Visibility=\"{Binding IsMultiGameEdit,Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                               Text=\"{DynamicResource LOCMultiEditOverwriteWarning}\" Foreground=\"{DynamicResource WarningBrush}\"\r\n                               DockPanel.Dock=\"Top\" Margin=\"10,10,10,0\" />\r\n                    <Button Name=\"ButtonAddLink\" Content=\"{DynamicResource LOCAddLinkButton}\" HorizontalAlignment=\"Left\" Margin=\"10,10,0,0\"\r\n                            Command=\"{Binding AddLinkCommand}\" DockPanel.Dock=\"Top\"/>\r\n                    <CheckBox Name=\"CheckLinks\" Content=\"{DynamicResource LOCSaveChanges}\" Margin=\"10,5,5,0\" DockPanel.Dock=\"Top\"\r\n                              IsChecked=\"{Binding UseLinksChanges}\" Style=\"{StaticResource SaveChangesCheck}\"/>\r\n                    <ScrollViewer VerticalScrollBarVisibility=\"Auto\" Margin=\"10,5,10,10\" DockPanel.Dock=\"Top\">                       \r\n                        <ItemsControl IsTabStop=\"False\" Name=\"ItemsLinks\" Grid.IsSharedSizeScope=\"True\"\r\n                                        ItemsSource=\"{Binding EditingGame.Links}\">\r\n                            <ItemsControl.ItemTemplate>\r\n                                <DataTemplate>\r\n                                    <Grid Margin=\"-5,0,-5,0\">\r\n                                        <Grid.ColumnDefinitions>\r\n                                            <ColumnDefinition Width=\"Auto\" MinWidth=\"200\" SharedSizeGroup=\"A\" />\r\n                                            <ColumnDefinition Width=\"*\" />\r\n                                            <ColumnDefinition Width=\"Auto\" />\r\n                                        </Grid.ColumnDefinitions>\r\n                                        <Grid.RowDefinitions>\r\n                                            <RowDefinition Height=\"Auto\" />\r\n                                        </Grid.RowDefinitions>\r\n\r\n                                        <TextBox Text=\"{Binding Name}\" Grid.Column=\"0\" Grid.Row=\"0\" Margin=\"5\"\r\n                                                    VerticalAlignment=\"Stretch\" VerticalContentAlignment=\"Center\" />\r\n                                        <TextBox Text=\"{Binding Url}\" Grid.Column=\"1\" Grid.Row=\"0\" Margin=\"5\"\r\n                                                    VerticalAlignment=\"Stretch\" VerticalContentAlignment=\"Center\" />\r\n                                        <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Right\" Grid.Column=\"2\" Grid.Row=\"0\" Margin=\"5\">\r\n                                            <Button Name=\"ButtonMoveUpAction\" FontFamily=\"Marlett\" Content=\"5\" Margin=\"0,0,5,0\"\r\n                                                    Command=\"{Binding Data.MoveUpLinkCommand, Source={StaticResource Proxy}}\"\r\n                                                    CommandParameter=\"{Binding}\"/>\r\n                                            <Button Name=\"ButtonMoveDownAction\" FontFamily=\"Marlett\" Content=\"6\" Margin=\"0,0,5,0\"\r\n                                                    Command=\"{Binding Data.MoveDownLinkCommand, Source={StaticResource Proxy}}\"\r\n                                                    CommandParameter=\"{Binding}\"/>\r\n                                            <Button Name=\"ButtonRemoveLink\" FontFamily=\"Marlett\" Content=\"r\"\r\n                                                    Command=\"{Binding Data.RemoveLinkCommand, Source={StaticResource Proxy}}\"\r\n                                                    CommandParameter=\"{Binding}\"/>\r\n                                        </StackPanel>\r\n                                    </Grid>\r\n                                </DataTemplate>\r\n                            </ItemsControl.ItemTemplate>\r\n                        </ItemsControl>\r\n                    </ScrollViewer>\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <TabItem>\r\n                <TabItem.Header>\r\n                    <ContentControl ContentTemplate=\"{StaticResource SectionHeaderTemplate}\"\r\n                                    Content=\"{DynamicResource LOCInstallationLabel}\"\r\n                                    Tag=\"{Binding ShowInstallChangeNotif}\" />\r\n                </TabItem.Header>\r\n                <DockPanel>\r\n                    <Grid Margin=\"10\" DockPanel.Dock=\"Top\">\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"Auto\"/>\r\n                            <ColumnDefinition Width=\"Auto\"/>\r\n                            <ColumnDefinition Width=\"*\"/>\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                        </Grid.RowDefinitions>\r\n\r\n                        <CheckBox Grid.Column=\"0\" Grid.Row=\"0\" VerticalAlignment=\"Center\" Margin=\"0,0,5,0\"\r\n                                  Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseInstallDirChanges}\"/>\r\n                        <TextBlock Text=\"{DynamicResource LOCGameInstallDirTitle}\" Grid.Column=\"1\" Margin=\"0,5,5,5\" VerticalAlignment=\"Center\" />\r\n                        <pctrls:PathSelectionBox Grid.Column=\"2\" Margin=\"5\" x:Name=\"TextInstallDir\" VerticalAlignment=\"Center\"                                                \r\n                                                 Text=\"{Binding EditingGame.InstallDirectory, UpdateSourceTrigger=PropertyChanged}\"\r\n                                                 ShowDirectorySelector=\"True\" />\r\n\r\n                        <CheckBox Grid.Column=\"0\" Grid.Row=\"2\" VerticalAlignment=\"Center\" Margin=\"0,0,5,0\"\r\n                                  Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseInstallStateChanges}\"/>\r\n                        <TextBlock Text=\"{DynamicResource LOCGameIsGameInstalledTitle}\"\r\n                               VerticalAlignment=\"Center\"\r\n                               Grid.Column=\"1\" Grid.Row=\"2\" Margin=\"0,5,5,5\" />\r\n                        <CheckBox Grid.Row=\"2\" Grid.Column=\"2\" Margin=\"5,5,5,5\"\r\n                              VerticalAlignment=\"Center\"\r\n                              IsChecked=\"{Binding EditingGame.IsInstalled}\"/>\r\n\r\n                        <CheckBox Grid.Column=\"0\" Grid.Row=\"3\" VerticalAlignment=\"Center\" Margin=\"0,0,5,0\"\r\n                                  Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseOverrideInstallState}\">\r\n                            <CheckBox.Visibility>\r\n                                <MultiBinding Converter=\"{pcon:MultiBooleanToVisibilityConverter}\">\r\n                                    <Binding Path=\"ShowOverrideInstallStateOption\" />\r\n                                    <Binding Path=\"ShowCheckBoxes\" />\r\n                                </MultiBinding>\r\n                            </CheckBox.Visibility>\r\n                        </CheckBox>\r\n                        <TextBlock Text=\"{DynamicResource LOCOverrideInstallState}\"\r\n                                   ToolTip=\"{DynamicResource LOCOverrideInstallStateTooltip}\"\r\n                                   Visibility=\"{Binding ShowOverrideInstallStateOption, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                   VerticalAlignment=\"Center\"\r\n                                   Grid.Column=\"1\" Grid.Row=\"3\" Margin=\"0,5,5,5\" />\r\n                        <CheckBox Grid.Row=\"3\" Grid.Column=\"2\" Margin=\"5,5,5,5\"\r\n                                  ToolTip=\"{DynamicResource LOCOverrideInstallStateTooltip}\"\r\n                                  VerticalAlignment=\"Center\"\r\n                                  Visibility=\"{Binding ShowOverrideInstallStateOption, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                  IsChecked=\"{Binding EditingGame.OverrideInstallState}\"/>\r\n                        \r\n                        <!-- InstallSize -->\r\n                        <CheckBox Grid.Column=\"0\" Grid.Row=\"4\" Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  VerticalAlignment=\"Center\"\r\n                                  IsChecked=\"{Binding UseInstallSizeChanges}\"/>\r\n                        <TextBlock Grid.Column=\"1\" Grid.Row=\"411\" Text=\"{DynamicResource LOCInstallSizeLabel}\"\r\n                                   VerticalAlignment=\"Center\" />\r\n                        <StackPanel Grid.Column=\"2\" Grid.Row=\"4\" Orientation=\"Horizontal\">\r\n                            <Button Content=\"{DynamicResource LOCInstallSizeCalculate}\"\r\n                                    ToolTip=\"{DynamicResource LOCInstallSizeCalculateEditButtonTooltip}\"\r\n                                    ToolTipService.Placement=\"Top\"\r\n                                    VerticalAlignment=\"Center\"\r\n                                    Margin=\"5\" DockPanel.Dock=\"Right\"\r\n                                    Command=\"{Binding CalculateInstallSizeWithDialogCommand}\"\r\n                                    Visibility=\"{Binding IsSingleGameEdit, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                            <TextBox ToolTip=\"{DynamicResource LOCDescriptionSizeBytes}\"\r\n                                     VerticalAlignment=\"Center\"\r\n                                     Margin=\"5\"\r\n                                     ToolTipService.Placement=\"Top\" ToolTipService.InitialShowDelay=\"0\"\r\n                                     MinWidth=\"120\">\r\n                                <TextBox.Text>\r\n                                    <Binding Path=\"EditingGame.InstallSize\"\r\n                                             UpdateSourceTrigger=\"PropertyChanged\" \r\n                                             ValidatesOnDataErrors=\"True\"\r\n                                             NotifyOnValidationError=\"True\"\r\n                                             Converter=\"{pcon:NullableUlongToStringConverter}\">\r\n                                        <Binding.ValidationRules>\r\n                                            <pcon:NullableUlongFieldValidation />\r\n                                        </Binding.ValidationRules>\r\n                                    </Binding>\r\n                                </TextBox.Text>\r\n                            </TextBox>\r\n                            <TextBlock VerticalAlignment=\"Center\" Margin=\"5\"\r\n                                       Text=\"{Binding EditingGame.InstallSize, Converter={pcon:NullableUlongBytesSizeToStringConverter}}\" />\r\n                        </StackPanel>\r\n                    </Grid>\r\n\r\n                    <Button Content=\"{DynamicResource LOCAddRom}\" HorizontalAlignment=\"Left\" Margin=\"10,0,0,0\"\r\n                            Command=\"{Binding AddRomCommand}\" DockPanel.Dock=\"Top\"/>\r\n                    <CheckBox Name=\"CheckSaveRoms\" Content=\"{DynamicResource LOCSaveChanges}\" Margin=\"10,5,5,0\" DockPanel.Dock=\"Top\"\r\n                              IsChecked=\"{Binding UseRomsChanges}\" Style=\"{StaticResource SaveChangesCheck}\"/>\r\n\r\n                    <ListView Margin=\"10,5,10,10\" DockPanel.Dock=\"Top\"\r\n                              ItemsSource=\"{Binding EditingGame.Roms}\">\r\n                        <ListView.ItemContainerStyle>\r\n                            <Style TargetType=\"{x:Type ListViewItem}\" BasedOn=\"{StaticResource {x:Type ListViewItem}}\">\r\n                                <Setter Property=\"Focusable\" Value=\"False\"/>\r\n                                <Setter Property=\"Template\">\r\n                                    <Setter.Value>\r\n                                        <ControlTemplate TargetType=\"{x:Type ListViewItem}\">\r\n                                            <Border Padding=\"{TemplateBinding Padding}\" Background=\"Transparent\">\r\n                                                <GridViewRowPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" VerticalAlignment=\"Stretch\" />\r\n                                            </Border>\r\n                                        </ControlTemplate>\r\n                                    </Setter.Value>\r\n                                </Setter>\r\n                            </Style>\r\n                        </ListView.ItemContainerStyle>\r\n                        <ListView.View>\r\n                            <GridView>\r\n                                <GridViewColumn Width=\"300\" Header=\"{DynamicResource LOCNameLabel}\">\r\n                                    <GridViewColumn.CellTemplate>\r\n                                        <DataTemplate>\r\n                                            <TextBox Text=\"{Binding Name}\" Margin=\"0,5,0,0\"\r\n                                                     VerticalAlignment=\"Stretch\" VerticalContentAlignment=\"Center\" />\r\n                                        </DataTemplate>\r\n                                    </GridViewColumn.CellTemplate>\r\n                                </GridViewColumn>\r\n                                <GridViewColumn Width=\"350\" Header=\"{DynamicResource LOCPathLabel}\">\r\n                                    <GridViewColumn.CellTemplate>\r\n                                        <DataTemplate>\r\n                                            <pctrls:PathSelectionBox Text=\"{Binding Path}\" Margin=\"0,5,0,0\"\r\n                                                                     VerticalAlignment=\"Stretch\" VerticalContentAlignment=\"Center\"\r\n                                                                     ShowFileSelector=\"True\"/>\r\n                                        </DataTemplate>\r\n                                    </GridViewColumn.CellTemplate>\r\n                                </GridViewColumn>\r\n                                <GridViewColumn Width=\"150\">\r\n                                    <GridViewColumn.CellTemplate>\r\n                                        <DataTemplate>\r\n                                            <StackPanel Orientation=\"Horizontal\" Margin=\"0,5,0,0\">\r\n                                                <Button FontFamily=\"Marlett\" Content=\"5\" Margin=\"0,0,5,0\"\r\n                                                    Command=\"{Binding Data.MoveUpRomCommand, Source={StaticResource Proxy}}\"\r\n                                                    CommandParameter=\"{Binding}\"/>\r\n                                                <Button FontFamily=\"Marlett\" Content=\"6\" Margin=\"0,0,5,0\"\r\n                                                    Command=\"{Binding Data.MoveDownRomCommand, Source={StaticResource Proxy}}\"\r\n                                                    CommandParameter=\"{Binding}\"/>\r\n                                                <Button FontFamily=\"Marlett\" Content=\"r\"\r\n                                                    Command=\"{Binding Data.RemoveRomCommand, Source={StaticResource Proxy}}\"\r\n                                                    CommandParameter=\"{Binding}\"/>\r\n                                            </StackPanel>\r\n                                        </DataTemplate>\r\n                                    </GridViewColumn.CellTemplate>\r\n                                </GridViewColumn>\r\n                            </GridView>\r\n                        </ListView.View>\r\n                    </ListView>\r\n                </DockPanel>                \r\n            </TabItem>\r\n\r\n            <TabItem>\r\n                <TabItem.Header>\r\n                    <ContentControl ContentTemplate=\"{StaticResource SectionHeaderTemplate}\"\r\n                                    Content=\"{DynamicResource LOCActionsLabel}\"\r\n                                    Tag=\"{Binding ShowActionsChangeNotif}\" />\r\n                </TabItem.Header>\r\n                <DockPanel>\r\n                    <Button Content=\"{DynamicResource LOCMenuHelpTitle}\" DockPanel.Dock=\"Bottom\" MinWidth=\"80\"\r\n                            Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\" Margin=\"10,0,0,5\"\r\n                            HorizontalAlignment=\"Left\"\r\n                            CommandParameter=\"{}{DocsRootUrl}/manual/library/games/gameActions.html\" />\r\n                    \r\n                    <TextBlock Visibility=\"{Binding IsMultiGameEdit,Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                        Text=\"{DynamicResource LOCMultiEditOverwriteWarning}\" Foreground=\"{DynamicResource WarningBrush}\"\r\n                        DockPanel.Dock=\"Top\" Margin=\"10,10,10,0\" />\r\n\r\n                    <StackPanel Orientation=\"Horizontal\" Margin=\"10,5,10,5\" DockPanel.Dock=\"Top\"\r\n                            Visibility=\"{Binding ShowIncludeLibraryPluginAction, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                        <CheckBox VerticalAlignment=\"Center\"\r\n                                  IsChecked=\"{Binding UseIncludeLibraryPluginAction}\"\r\n                                  Style=\"{StaticResource SaveChangesCheck}\"/>\r\n                        <TextBlock VerticalAlignment=\"Center\"\r\n                                Text=\"{DynamicResource LOCIncludePluginGameActions}\" />\r\n                        <CheckBox Margin=\"5,5,5,5\" VerticalAlignment=\"Center\"\r\n                                IsChecked=\"{Binding EditingGame.IncludeLibraryPluginAction}\"/>\r\n                    </StackPanel>\r\n\r\n                    <Button Content=\"{DynamicResource LOCAddAction}\" DockPanel.Dock=\"Top\" HorizontalAlignment=\"Left\"\r\n                            Command=\"{Binding AddActionCommand}\" Margin=\"10,10,10,5\"/>\r\n                    <CheckBox Content=\"{DynamicResource LOCSaveChanges}\" VerticalAlignment=\"Center\" DockPanel.Dock=\"Top\" HorizontalAlignment=\"Left\"\r\n                              IsChecked=\"{Binding UseGameActionsChanges}\" Margin=\"10,0,0,0\"\r\n                              Style=\"{StaticResource SaveChangesCheck}\" />\r\n\r\n                    <ScrollViewer VerticalScrollBarVisibility=\"Auto\" Margin=\"10,5,10,10\" DockPanel.Dock=\"Top\">\r\n                        <ItemsControl IsTabStop=\"False\" Name=\"OtherTasksItems\" ItemsSource=\"{Binding EditingGame.GameActions}\">\r\n                            <ItemsControl.ItemTemplate>\r\n                                <DataTemplate>\r\n                                    <Border BorderThickness=\"1\" BorderBrush=\"{StaticResource NormalBrush}\" CornerRadius=\"3\" Padding=\"5\" Margin=\"0,0,0,10\">\r\n                                        <StackPanel Margin=\"10\">\r\n                                            <pctrls:GameTaskView x:Name=\"TaskCustom\" ShowNameRow=\"True\"\r\n                                                            Emulators=\"{Binding Data.Emulators, Source={StaticResource Proxy}}\"\r\n                                                            DefaultSelectionDir=\"{Binding Data.EditingGame.InstallDirectory, Mode=OneWay, Source={StaticResource Proxy}}\"/>\r\n                                            <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Right\" Margin=\"0,10,5,0\">\r\n                                                <Button Name=\"ButtonMoveUpAction\" FontFamily=\"Marlett\" Content=\"5\" Margin=\"0,0,5,0\"\r\n                                                Command=\"{Binding Data.MoveUpActionCommand, Source={StaticResource Proxy}}\"\r\n                                                CommandParameter=\"{Binding }\"/>\r\n                                                <Button Name=\"ButtonMoveDownAction\" FontFamily=\"Marlett\" Content=\"6\" Margin=\"0,0,5,0\"\r\n                                                Command=\"{Binding Data.MoveDownActionCommand, Source={StaticResource Proxy}}\"\r\n                                                CommandParameter=\"{Binding }\"/>\r\n                                                <Button Name=\"ButtonDeleteAction\" Content=\"{DynamicResource LOCDeleteAction}\"\r\n                                                Command=\"{Binding Data.DeleteActionCommand, Source={StaticResource Proxy}}\"\r\n                                                CommandParameter=\"{Binding }\"/>\r\n                                            </StackPanel>\r\n                                        </StackPanel>\r\n                                    </Border>\r\n                                </DataTemplate>\r\n                            </ItemsControl.ItemTemplate>\r\n                        </ItemsControl>\r\n                    </ScrollViewer>\r\n                </DockPanel>                \r\n            </TabItem>\r\n\r\n            <TabItem>\r\n                <TabItem.Header>\r\n                    <ContentControl ContentTemplate=\"{StaticResource SectionHeaderTemplate}\"\r\n                                    Content=\"{DynamicResource LOCScripts}\"\r\n                                    Tag=\"{Binding ShowScriptsChangeNotif}\" />\r\n                </TabItem.Header>\r\n                <DockPanel Margin=\"10,5,10,5\">\r\n                    <Button Content=\"{DynamicResource LOCMenuHelpTitle}\" DockPanel.Dock=\"Bottom\" MinWidth=\"80\"\r\n                            HorizontalAlignment=\"Left\"\r\n                            Command=\"{x:Static pcmd:GlobalCommands.NavigateUrlCommand}\"\r\n                            CommandParameter=\"{}{DocsRootUrl}/manual/features/scriptingSupport/scriptingSupportOverview.html\" />\r\n                    <Grid DockPanel.Dock=\"Top\" Margin=\"0,5,0,0\">\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition Width=\"*\" />\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"*\" />\r\n                            <RowDefinition Height=\"*\" />\r\n                            <RowDefinition Height=\"*\" />\r\n                        </Grid.RowDefinitions>\r\n\r\n                        <TextBox AcceptsReturn=\"True\" Grid.Column=\"1\" Grid.Row=\"0\"\r\n                                 FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                                 HorizontalScrollBarVisibility=\"Auto\"\r\n                                 VerticalScrollBarVisibility=\"Visible\"\r\n                                 Text=\"{Binding EditingGame.PreScript, UpdateSourceTrigger=PropertyChanged}\" />\r\n                        <StackPanel Grid.Column=\"0\" Grid.Row=\"0\">\r\n                            <StackPanel Orientation=\"Horizontal\">\r\n                                <CheckBox Style=\"{StaticResource SaveChangesCheck}\"\r\n                                          IsChecked=\"{Binding UsePreScriptChanges}\" />\r\n                                <TextBlock Text=\"{DynamicResource LOCPreScriptDescription}\"\r\n                                           VerticalAlignment=\"Center\" Margin=\"0,0,10,0\" />\r\n                            </StackPanel>\r\n                            <StackPanel Orientation=\"Horizontal\" Margin=\"0,10,0,10\">\r\n                                <CheckBox Style=\"{StaticResource SaveChangesCheck}\"\r\n                                          IsChecked=\"{Binding UsePreGlobalScriptChanges}\" />\r\n                                <CheckBox Content=\"{DynamicResource LOCExecuteGlobalScript}\"\r\n                                          IsChecked=\"{Binding EditingGame.UseGlobalPreScript}\" />\r\n                            </StackPanel>\r\n                            <Button Content=\"{DynamicResource LOCTestScript}\" HorizontalAlignment=\"Left\"\r\n                                    Command=\"{Binding TestScriptCommand}\"\r\n                                    CommandParameter=\"{Binding EditingGame.PreScript}\"/>\r\n                        </StackPanel>\r\n\r\n                        <TextBox AcceptsReturn=\"True\" Grid.Column=\"1\" Grid.Row=\"1\"\r\n                                 FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                                 HorizontalScrollBarVisibility=\"Auto\"\r\n                                 VerticalScrollBarVisibility=\"Visible\"\r\n                                 Text=\"{Binding EditingGame.GameStartedScript, UpdateSourceTrigger=PropertyChanged}\"\r\n                                 Margin=\"0,10,0,10\"/>\r\n                        <StackPanel Grid.Column=\"0\" Grid.Row=\"1\" Margin=\"0,10,10,10\">\r\n                            <StackPanel Orientation=\"Horizontal\">\r\n                                <CheckBox Style=\"{StaticResource SaveChangesCheck}\"\r\n                                      IsChecked=\"{Binding UseGameStartedScriptChanges}\" />\r\n                                <TextBlock Text=\"{DynamicResource LOCGameStartedScriptDescription}\"\r\n                                           VerticalAlignment=\"Center\" Margin=\"0,0,10,0\" />\r\n                            </StackPanel>\r\n                            <StackPanel Orientation=\"Horizontal\" Margin=\"0,10,0,10\">\r\n                                <CheckBox Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UseGameStartedGlobalScriptChanges}\" />\r\n                                <CheckBox Content=\"{DynamicResource LOCExecuteGlobalScript}\"\r\n                                  IsChecked=\"{Binding EditingGame.UseGlobalGameStartedScript}\" />\r\n                            </StackPanel>\r\n                            <Button Content=\"{DynamicResource LOCTestScript}\" HorizontalAlignment=\"Left\"\r\n                                    Command=\"{Binding TestScriptCommand}\"\r\n                                    CommandParameter=\"{Binding EditingGame.GameStartedScript}\"/>\r\n                        </StackPanel>\r\n\r\n                        <TextBox AcceptsReturn=\"True\" Grid.Column=\"1\" Grid.Row=\"2\"\r\n                                 FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                             HorizontalScrollBarVisibility=\"Auto\"\r\n                             VerticalScrollBarVisibility=\"Visible\"\r\n                             Text=\"{Binding EditingGame.PostScript, UpdateSourceTrigger=PropertyChanged}\"/>\r\n                        <StackPanel Grid.Column=\"0\" Grid.Row=\"2\">\r\n                            <StackPanel Orientation=\"Horizontal\">\r\n                                <CheckBox Style=\"{StaticResource SaveChangesCheck}\"\r\n                                      IsChecked=\"{Binding UsePostScriptChanges}\" />\r\n                                <TextBlock Text=\"{DynamicResource LOCPostScriptDescription}\"\r\n                                           VerticalAlignment=\"Center\" Margin=\"0,0,10,0\" />\r\n                            </StackPanel>\r\n                            <StackPanel Orientation=\"Horizontal\" Margin=\"0,10,0,10\">\r\n                                <CheckBox Style=\"{StaticResource SaveChangesCheck}\"\r\n                                  IsChecked=\"{Binding UsePostGlobalScriptChanges}\" />\r\n                                <CheckBox Content=\"{DynamicResource LOCExecuteGlobalScript}\"\r\n                                  IsChecked=\"{Binding EditingGame.UseGlobalPostScript}\" />\r\n                            </StackPanel>\r\n                            <Button Content=\"{DynamicResource LOCTestScript}\" HorizontalAlignment=\"Left\"\r\n                                    Command=\"{Binding TestScriptCommand}\"\r\n                                    CommandParameter=\"{Binding EditingGame.PostScript}\"/>\r\n                        </StackPanel>\r\n                    </Grid>\r\n                </DockPanel>\r\n            </TabItem>\r\n        </TabControl>\r\n\r\n        <Border Grid.Column=\"0\" Grid.Row=\"1\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel KeyboardNavigation.TabNavigation=\"Local\" LastChildFill=\"False\" Margin=\"5\">\r\n                <Button TabIndex=\"1\" Name=\"ButtonDownload\" Content=\"{DynamicResource LOCMenuDownloadMetadata}\"\r\n                        DockPanel.Dock=\"Left\" Style=\"{StaticResource BottomButton}\"\r\n                        Visibility=\"{Binding IsSingleGameEdit, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                        pbeh:LeftClickContextMenuBehavior.Enabled=\"True\">\r\n                    <Button.ContextMenu>\r\n                        <ContextMenu Placement=\"Top\" MinWidth=\"{Binding PlacementTarget.ActualWidth, RelativeSource={RelativeSource Self}}\"\r\n                                     ItemsSource=\"{Binding MetadataDownloadOptions}\">\r\n                            <ContextMenu.Resources>\r\n                                <Style TargetType=\"MenuItem\" BasedOn=\"{StaticResource {x:Type MenuItem}}\">\r\n                                    <Setter Property=\"Command\" Value=\"{Binding DownloadCommand}\" />\r\n                                </Style>\r\n                            </ContextMenu.Resources>\r\n                        </ContextMenu>\r\n                    </Button.ContextMenu>\r\n                </Button>\r\n                <Button TabIndex=\"3\" Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding CancelCommand}\"/>\r\n                <Button TabIndex=\"2\" Name=\"ButtonOK\" Content=\"{DynamicResource LOCSaveLabel}\" DockPanel.Dock=\"Right\" IsDefault=\"True\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding ConfirmCommand}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/GameEditWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class GameEditWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new GameEditWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for GameEditWindow.xaml\r\n    /// </summary>\r\n    public partial class GameEditWindow : WindowBase\r\n    {\r\n        private WindowPositionHandler positionManager;\r\n\r\n        public GameEditWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            if (PlayniteApplication.Current.AppSettings != null)\r\n            {\r\n                positionManager = new WindowPositionHandler(this, \"EditGame_V2\", PlayniteApplication.Current.AppSettings.WindowPositions);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/GoogleImageDownloadWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.GoogleImageDownloadWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\" \r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"             \r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"Google Images\"\r\n        Height=\"600\" Width=\"830\"\r\n        ShowInTaskbar=\"True\" WindowStartupLocation=\"CenterOwner\">\r\n\r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"Closing\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding WindowClosingCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n\r\n    <controls:WindowBase.Resources>\r\n        <pcon:StringNullOrEmptyToVisibilityConverter x:Key=\"StringNullOrEmptyToVisibilityConverter\" />\r\n        <pcon:NegateConverter x:Key=\"NegateConverter\" />\r\n        <BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <Grid Margin=\"0,4,0,0\">\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n\r\n        <ListBox ItemsSource=\"{Binding DisplayImages}\" SelectedItem=\"{Binding SelectedImage}\"\r\n                    ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\r\n                    BorderThickness=\"0\"\r\n                    ScrollViewer.VerticalScrollBarVisibility=\"Auto\">\r\n            <ListBox.ItemsPanel>\r\n                <ItemsPanelTemplate>\r\n                    <WrapPanel />\r\n                </ItemsPanelTemplate>\r\n            </ListBox.ItemsPanel>\r\n\r\n            <ListBox.ItemTemplate>\r\n                <DataTemplate>\r\n                    <Border Margin=\"4\" Background=\"#33000000\">\r\n                        <DockPanel ToolTip=\"{Binding ImageUrl}\"\r\n                                   ToolTipService.InitialShowDelay=\"2000\">\r\n                            <TextBlock DockPanel.Dock=\"Bottom\" Text=\"{Binding Size, StringFormat={}{0}px}\"\r\n                                       Margin=\"0,3,0,0\"\r\n                                       HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" />\r\n                            <Image Width=\"{Binding DataContext.ItemWidth, RelativeSource={RelativeSource AncestorType=controls:WindowBase}}\"\r\n                                   Height=\"{Binding DataContext.ItemHeight, RelativeSource={RelativeSource AncestorType=controls:WindowBase}}\"\r\n                                   Source=\"{Binding ThumbUrl, IsAsync=True}\"\r\n                                   DockPanel.Dock=\"Top\"\r\n                                   Stretch=\"Uniform\" StretchDirection=\"Both\" />\r\n                        </DockPanel>\r\n                        <Border.InputBindings>\r\n                            <MouseBinding MouseAction=\"LeftDoubleClick\"\r\n                                          Command=\"{Binding DataContext.ItemDoubleClickCommand, RelativeSource={RelativeSource AncestorType=controls:WindowBase}}\" />\r\n                        </Border.InputBindings>\r\n                    </Border>\r\n                </DataTemplate>\r\n            </ListBox.ItemTemplate>\r\n        </ListBox>\r\n\r\n        <Button HorizontalAlignment=\"Center\" Grid.Row=\"1\" MinWidth=\"200\" Margin=\"0,5,0,0\"\r\n                Visibility=\"{Binding ShowLoadMore, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                Command=\"{Binding LoadMoreCommand}\"\r\n                Content=\"{DynamicResource LOCLoadMore}\" />\r\n\r\n        <DockPanel Grid.Row=\"2\" Margin=\"15,5,10,5\" LastChildFill=\"True\">\r\n            <Button Name=\"ButtonSearch\" Content=\"{DynamicResource LOCSearchLabel}\" Padding=\"10,5,10,5\" DockPanel.Dock=\"Left\"\r\n                    Command=\"{Binding SearchCommand}\"/>\r\n            <StackPanel DockPanel.Dock=\"Right\" Orientation=\"Horizontal\" VerticalAlignment=\"Center\">\r\n                <TextBlock Name=\"TextBlockResolution\" Text=\"{DynamicResource LOCSearchResolutionLabel}\" Margin=\"10,0,0,0\" VerticalAlignment=\"Center\"/>\r\n                <pctrls:NullIntNumericBox MinValue=\"1\" MaxValue=\"9999\" Width=\"40\"\r\n                                        Margin=\"10,0,0,0\"\r\n                                        Value=\"{Binding SearchWidth}\"/>\r\n                <TextBlock Text=\"x\" VerticalAlignment=\"Center\"\r\n                           Margin=\"4,0,4,0\"/>\r\n                <pctrls:NullIntNumericBox MinValue=\"1\" MaxValue=\"9999\" Width=\"40\"\r\n                                       Value=\"{Binding SearchHeight}\"/>\r\n\r\n                <Button Content=\"{DynamicResource LOCPresets}\" Margin=\"15,0,0,0\" Padding=\"2\"\r\n                        pbeh:LeftClickContextMenuBehavior.Enabled=\"True\">\r\n                    <Button.ContextMenu>\r\n                        <ContextMenu Placement=\"Bottom\">\r\n                            <MenuItem Header=\"{DynamicResource LOCSearchResolutionAnyLabel}\"\r\n                                    Command=\"{Binding ClearSearchResolutionCommand}\"/>\r\n                            <MenuItem Header=\"1920x620 (Steam Hero)\"\r\n                                    Command=\"{Binding SetSearchResolutionCommand}\"\r\n                                    CommandParameter=\"1920x620\"/>\r\n                            <MenuItem Header=\"1920x1080 (1080p)\"\r\n                                    Command=\"{Binding SetSearchResolutionCommand}\"\r\n                                    CommandParameter=\"1920x1080\"/>\r\n                            <MenuItem Header=\"2560x1440 (1440p)\"\r\n                                    Command=\"{Binding SetSearchResolutionCommand}\"\r\n                                    CommandParameter=\"2560x1440\"/>\r\n                        </ContextMenu>\r\n                    </Button.ContextMenu>\r\n                </Button>\r\n            </StackPanel>\r\n            <TextBox Name=\"TextSearch\" Margin=\"10,0,0,0\" DockPanel.Dock=\"Right\" VerticalAlignment=\"Center\"\r\n                     Text=\"{Binding SearchTerm, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\">\r\n                <TextBox.InputBindings>\r\n                    <KeyBinding Command=\"{Binding SearchCommand}\" Key=\"Return\" />\r\n                </TextBox.InputBindings>\r\n            </TextBox>\r\n        </DockPanel>\r\n\r\n        <DockPanel LastChildFill=\"False\" Grid.Row=\"3\" Margin=\"15,0,5,5\">\r\n            <Button Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding CloseCommand}\"/>\r\n            <Button Name=\"ButtonOK\" Content=\"{DynamicResource LOCSelect}\" DockPanel.Dock=\"Right\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding ConfirmCommand}\"/>\r\n            <TextBlock Text=\"SafeSearch\"\r\n                      DockPanel.Dock=\"Left\" VerticalAlignment=\"Center\"/>\r\n            <ComboBox pbeh:SelectorBehaviors.EnumSource=\"{x:Type p:SafeSearchSettings}\"\r\n                      SelectedValue=\"{Binding SafeSearch}\"\r\n                      DockPanel.Dock=\"Left\" VerticalAlignment=\"Center\" Margin=\"10,0,0,0\"/>\r\n            <CheckBox Content=\"{DynamicResource LOCTransparent}\"\r\n                      IsChecked=\"{Binding Transparent}\"\r\n                      DockPanel.Dock=\"Left\" VerticalAlignment=\"Center\" Margin=\"10,0,0,0\"/>\r\n        </DockPanel>\r\n    </Grid>\r\n</controls:WindowBase>"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/GoogleImageDownloadWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class GoogleImageDownloadWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new GoogleImageDownloadWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for MetadataLookupWindow.xaml\r\n    /// </summary>\r\n    public partial class GoogleImageDownloadWindow : WindowBase\r\n    {\r\n        private WindowPositionHandler positionManager;\r\n\r\n        public GoogleImageDownloadWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            if (PlayniteApplication.Current.AppSettings != null)\r\n            {\r\n                positionManager = new WindowPositionHandler(this, \"GoogleImageDownload_V2\", PlayniteApplication.Current.AppSettings.WindowPositions);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ImageSelectionWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.ImageSelectionWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{Binding WindowTitle}\"\r\n        Height=\"600\" Width=\"830\"\r\n        ShowInTaskbar=\"False\" WindowStartupLocation=\"CenterOwner\"\r\n        AutomationProperties.AutomationId=\"WindowMetaSearch\">\r\n\r\n    <controls:WindowBase.Resources>\r\n        <pcon:StringNullOrEmptyToVisibilityConverter x:Key=\"StringNullOrEmptyToVisibilityConverter\" />\r\n        <pcon:NegateConverter x:Key=\"NegateConverter\" />\r\n        <BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <Grid Margin=\"0,4,0,0\">\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n\r\n        <ListBox ItemsSource=\"{Binding Images}\" SelectedItem=\"{Binding SelectedImage}\"\r\n                    ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\r\n                    BorderThickness=\"0\"\r\n                    ScrollViewer.VerticalScrollBarVisibility=\"Auto\">\r\n            <ListBox.ItemsPanel>\r\n                <ItemsPanelTemplate>\r\n                    <WrapPanel />\r\n                </ItemsPanelTemplate>\r\n            </ListBox.ItemsPanel>\r\n\r\n            <ListBox.ItemTemplate>\r\n                <DataTemplate>\r\n                    <Border Margin=\"4\" Background=\"#33000000\">\r\n                        <Border.InputBindings>\r\n                            <MouseBinding MouseAction=\"LeftDoubleClick\"\r\n                                          Command=\"{Binding DataContext.ItemDoubleClickCommand, RelativeSource={RelativeSource AncestorType=controls:WindowBase}}\" />\r\n                        </Border.InputBindings>\r\n                        <DockPanel Background=\"Transparent\">\r\n                            <Image Width=\"{Binding DataContext.ItemWidth, RelativeSource={RelativeSource AncestorType=controls:WindowBase}}\"\r\n                                   Height=\"{Binding DataContext.ItemHeight, RelativeSource={RelativeSource AncestorType=controls:WindowBase}}\"\r\n                                   Source=\"{Binding Path}\"\r\n                                   Stretch=\"Uniform\" StretchDirection=\"Both\" DockPanel.Dock=\"Top\" />\r\n                            <TextBlock Text=\"{Binding Description}\"\r\n                                       Visibility=\"{Binding Description, Converter={StaticResource StringNullOrEmptyToVisibilityConverter}}\"\r\n                                       TextTrimming=\"CharacterEllipsis\" DockPanel.Dock=\"Top\" Margin=\"4,4,4,0\"/>\r\n                        </DockPanel>\r\n                    </Border>\r\n                </DataTemplate>\r\n            </ListBox.ItemTemplate>\r\n        </ListBox>\r\n\r\n        <DockPanel LastChildFill=\"False\" Grid.Column=\"0\" Grid.Row=\"2\" Margin=\"5,0,5,5\">\r\n            <Button Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding CloseCommand}\"/>\r\n            <Button Name=\"ButtonOK\" Content=\"{DynamicResource LOCSelect}\" DockPanel.Dock=\"Right\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding ConfirmCommand}\"/>\r\n        </DockPanel>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ImageSelectionWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class ImageSelectionWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new ImageSelectionWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for MetadataLookupWindow.xaml\r\n    /// </summary>\r\n    public partial class ImageSelectionWindow : WindowBase\r\n    {\r\n        public ImageSelectionWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/InstalledGamesWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.InstalledGamesWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"  \r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        WindowStartupLocation=\"CenterOwner\"\r\n        Title=\"{DynamicResource LOCGameImportWindowTitle}\"                     \r\n        Height=\"500\" Width=\"900\"\r\n        AutomationProperties.AutomationId=\"WindowInstalledGames\">\r\n    <controls:WindowBase.Resources>\r\n        <pcon:IconToImageSourceConverter x:Key=\"IconToImageSourceConverter\" />\r\n        <pcon:NegateConverter x:Key=\"NegateConverter\" />\r\n        <BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <Grid>\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n\r\n        <ListView Grid.Column=\"0\" Grid.Row=\"0\" Name=\"ListPrograms\" SelectionMode=\"Single\" Margin=\"10,5,10,5\"\r\n                    VirtualizingPanel.IsVirtualizing=\"True\" VirtualizingPanel.VirtualizationMode=\"Recycling\"\r\n                    BorderThickness=\"{StaticResource ControlBorderThickness}\" BorderBrush=\"{StaticResource NormalBorderBrush}\"\r\n                    ItemsSource=\"{Binding CollectionView}\" SelectedItem=\"{Binding SelectedProgram, Mode=TwoWay}\"\r\n                    pbeh:ScrollToSelectedBehavior.Enabled=\"True\">\r\n            <ListView.ItemContainerStyle>\r\n                <Style TargetType=\"ListViewItem\" BasedOn=\"{StaticResource {x:Type ListViewItem}}\">\r\n                    <Setter Property=\"AutomationProperties.Name\" Value=\"{Binding Item.Name}\" />\r\n                    <Setter Property=\"AutomationProperties.HelpText\" Value=\"{Binding DisplayPath}\" />\r\n                </Style>\r\n            </ListView.ItemContainerStyle>\r\n            <ListView.View>\r\n                <GridView>\r\n                    <GridViewColumn>\r\n                        <GridViewColumn.Header>\r\n                            <CheckBox IsChecked=\"{Binding MarkImportAll}\" />\r\n                        </GridViewColumn.Header>\r\n                        <GridViewColumn.CellTemplate>\r\n                            <DataTemplate>\r\n                                <CheckBox IsChecked=\"{Binding Import}\" HorizontalAlignment=\"Right\" />\r\n                            </DataTemplate>\r\n                        </GridViewColumn.CellTemplate>\r\n                    </GridViewColumn>\r\n                    <GridViewColumn Header=\"{DynamicResource LOCNameLabel}\">\r\n                        <GridViewColumn.CellTemplate>\r\n                            <DataTemplate>\r\n                                <StackPanel Orientation=\"Horizontal\">\r\n                                    <Image Source=\"{Binding IconSource, Mode=OneWay}\"\r\n                                            RenderOptions.BitmapScalingMode=\"HighQuality\" Width=\"18\"/>\r\n                                    <TextBlock Text=\"{Binding Item.Name, Mode=OneWay}\" Margin=\"5,0,0,0\" />\r\n                                </StackPanel>\r\n                            </DataTemplate>\r\n                        </GridViewColumn.CellTemplate>\r\n                    </GridViewColumn>\r\n                    <GridViewColumn Header=\"{DynamicResource LOCPathLabel}\">\r\n                        <GridViewColumn.CellTemplate>\r\n                            <DataTemplate>\r\n                                <TextBlock Text=\"{Binding DisplayPath, Mode=OneWay}\" Padding=\"0,1,0,1\"/>\r\n                            </DataTemplate>\r\n                        </GridViewColumn.CellTemplate>\r\n                    </GridViewColumn>\r\n                </GridView>\r\n            </ListView.View>\r\n        </ListView>\r\n\r\n        <DockPanel KeyboardNavigation.TabNavigation=\"Local\" LastChildFill=\"False\" Grid.Column=\"0\" Grid.Row=\"1\" Margin=\"5,0,5,5\">\r\n            <Button TabIndex=\"1\" Name=\"ButtonBrowse\" Content=\"{DynamicResource LOCBrowse}\" DockPanel.Dock=\"Left\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding SelectExecutableCommand}\"/>\r\n            <Button TabIndex=\"2\" Name=\"ButtonScan\" Content=\"{DynamicResource LOCScanFolder}\" DockPanel.Dock=\"Left\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding ScanFolderCommand}\"/>\r\n            <Button TabIndex=\"3\" Name=\"ButtonDetectInstalled\" Content=\"{DynamicResource LOCDetectInstalled}\" DockPanel.Dock=\"Left\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding DetectInstalledCommand}\"/>\r\n            <CheckBox Content=\"{DynamicResource LOCEmuScanHideImported}\" Margin=\"10,0,0,0\"\r\n                      IsChecked=\"{Binding HideImported}\" VerticalAlignment=\"Center\" />\r\n            <Button TabIndex=\"5\" Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding CloseCommand}\"/>\r\n            <Button TabIndex=\"4\" Name=\"ButtonOK\" Content=\"{DynamicResource LOCAddGames}\" DockPanel.Dock=\"Right\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding ConfirmCommand}\"/>\r\n        </DockPanel>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/InstalledGamesWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class InstalledGamesWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new InstalledGamesWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for InstalledGamesWindow.xaml\r\n    /// </summary>\r\n    public partial class InstalledGamesWindow : WindowBase\r\n    {\r\n        public InstalledGamesWindow() : base(nameof(InstalledGamesWindow), true)\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ItemSelectionWithSearchWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.ItemSelectionWithSearchWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{Binding WindowTitle}\" Height=\"600\" Width=\"800\"\r\n        ShowInTaskbar=\"False\" WindowStartupLocation=\"CenterOwner\"\r\n        AutomationProperties.AutomationId=\"WindowMetaSearch\">\r\n\r\n    <controls:WindowBase.Resources>\r\n        <pcon:StringNullOrEmptyToVisibilityConverter x:Key=\"StringNullOrEmptyToVisibilityConverter\" />\r\n        <pcon:NegateConverter x:Key=\"NegateConverter\" />\r\n        <BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"Loaded\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding WindowOpenedCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n\r\n    <Grid>\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n\r\n        <ListBox Name=\"ListSearch\" Grid.Row=\"0\" Grid.Column=\"0\" HorizontalAlignment=\"Stretch\" BorderThickness=\"0\"\r\n                    ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\" Margin=\"5\" SelectionMode=\"Single\"\r\n                    SelectedItem=\"{Binding SelectedResult, Mode=TwoWay}\"\r\n                    ItemsSource=\"{Binding SearchResults}\">\r\n            <ListBox.ItemTemplate>\r\n                <DataTemplate>\r\n                    <DockPanel Background=\"Transparent\">\r\n                        <TextBlock Text=\"{Binding Name}\" DockPanel.Dock=\"Top\" Margin=\"5\" FontWeight=\"Bold\" />\r\n                        <TextBlock Text=\"{Binding Description}\" DockPanel.Dock=\"Top\" Margin=\"5,0,5,5\"\r\n                                    FontStyle=\"Italic\" FontSize=\"12\" TextWrapping=\"Wrap\"\r\n                                    Visibility=\"{Binding Description, Converter={StaticResource StringNullOrEmptyToVisibilityConverter}}\"/>\r\n                        <DockPanel.InputBindings>\r\n                            <MouseBinding MouseAction=\"LeftDoubleClick\"\r\n                                            Command=\"{Binding DataContext.ItemDoubleClickCommand, RelativeSource={RelativeSource AncestorType=controls:WindowBase}}\" />\r\n                        </DockPanel.InputBindings>\r\n                    </DockPanel>\r\n                </DataTemplate>\r\n            </ListBox.ItemTemplate>\r\n        </ListBox>\r\n\r\n        <Border Padding=\"10\" DockPanel.Dock=\"Bottom\"\r\n        BorderThickness=\"0\" Grid.Row=\"1\">\r\n            <DockPanel>\r\n                <Button Name=\"ButtonSearch\" Content=\"{DynamicResource LOCSearchLabel}\" Padding=\"10,5,10,5\" DockPanel.Dock=\"Left\"\r\n                        Command=\"{Binding SearchCommand}\"/>\r\n                <TextBox Name=\"TextSearch\" Margin=\"10,0,0,0\" DockPanel.Dock=\"Right\" VerticalAlignment=\"Center\"\r\n                            Text=\"{Binding SearchTerm, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\">\r\n                    <TextBox.InputBindings>\r\n                        <KeyBinding Command=\"{Binding SearchCommand}\" Key=\"Return\" />\r\n                    </TextBox.InputBindings>\r\n                </TextBox>\r\n            </DockPanel>\r\n        </Border>\r\n\r\n        <DockPanel LastChildFill=\"False\" Grid.Column=\"0\" Grid.Row=\"2\" Margin=\"5,0,5,5\">\r\n            <Button Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding CloseCommand}\"/>\r\n            <Button Name=\"ButtonOK\" Content=\"{DynamicResource LOCSelect}\" DockPanel.Dock=\"Right\"\r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding ConfirmCommand}\"/>\r\n        </DockPanel>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ItemSelectionWithSearchWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class ItemSelectionWithSearchWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new ItemSelectionWithSearchWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for MetadataLookupWindow.xaml\r\n    /// </summary>\r\n    public partial class ItemSelectionWithSearchWindow : WindowBase\r\n    {\r\n        public ItemSelectionWithSearchWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            Loaded += (_, __) => TextSearch.Focus();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/LibraryIntegrationsWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.LibraryIntegrationsWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCMenuConfigureIntegrations}\"\r\n        WindowStartupLocation=\"CenterOwner\" ShowInTaskbar=\"False\"\r\n        Width=\"800\" Height=\"620\"                     \r\n        AutomationProperties.AutomationId=\"WindowLibraryIntegrations\">\r\n\r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"Closing\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding WindowClosingCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n\r\n    <controls:WindowBase.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <DockPanel Margin=\"0,5,0,0\">\r\n        <Border DockPanel.Dock=\"Bottom\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{DynamicResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel LastChildFill=\"False\" Margin=\"5\">\r\n                <TextBlock Text=\"{DynamicResource LOCSettingsRestartNotification}\"\r\n                           Margin=\"5,0,0,0\" DockPanel.Dock=\"Left\" VerticalAlignment=\"Center\"\r\n                           Style=\"{DynamicResource BaseTextBlockStyle}\" />\r\n                <Button Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\"\r\n                            Style=\"{StaticResource BottomButton}\" IsCancel=\"True\"\r\n                            Command=\"{Binding CancelCommand}\"/>\r\n                <Button Name=\"ButtonOK\" Content=\"{DynamicResource LOCSaveLabel}\" DockPanel.Dock=\"Right\" \r\n                            Style=\"{StaticResource BottomButton}\"\r\n                            Command=\"{Binding ConfirmCommand}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n\r\n        <Border BorderThickness=\"0,1,0,0\" BorderBrush=\"{DynamicResource WindowPanelSeparatorBrush}\"\r\n                DockPanel.Dock=\"Left\">\r\n            <ListBox MinWidth=\"160\" BorderThickness=\"0\" ScrollViewer.CanContentScroll=\"False\"\r\n                     ItemsSource=\"{Binding LibraryPlugins}\"\r\n                     DisplayMemberPath=\"Name\">\r\n                <ListBox.Resources>\r\n                    <DataTemplate DataType=\"{x:Type Separator}\">\r\n                        <Rectangle Width=\"50\" Height=\"25\" Fill=\"Red\" />\r\n                    </DataTemplate>\r\n                </ListBox.Resources>\r\n                <i:Interaction.Triggers>\r\n                    <i:EventTrigger EventName=\"SelectionChanged\" >\r\n                        <prism:InvokeCommandAction Command=\"{Binding LibraryItemChangedCommand}\" />\r\n                    </i:EventTrigger>\r\n                </i:Interaction.Triggers>\r\n            </ListBox>\r\n        </Border>\r\n\r\n        <Border DockPanel.Dock=\"Left\" BorderThickness=\"1,1,0,0\"\r\n                BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <ContentControl Content=\"{Binding SelectedSectionView}\"/>\r\n        </Border>\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/LibraryIntegrationsWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class LibraryIntegrationsWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new LibraryIntegrationsWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for Configuration.xaml\r\n    /// </summary>\r\n    public partial class LibraryIntegrationsWindow : WindowBase\r\n    {\r\n        public LibraryIntegrationsWindow() : base(\"LibraryIntegrationsWindow_V2\")\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/LicenseAgreementWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.LicenseAgreementWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        WindowStartupLocation=\"CenterOwner\"\r\n        Title=\"{Binding LicenseTitle}\" Height=\"600\" Width=\"500\"\r\n        AutomationProperties.AutomationId=\"WindowLicense\">\r\n\r\n    <DockPanel>\r\n        <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Center\" DockPanel.Dock=\"Bottom\">\r\n            <Button Content=\"{DynamicResource LOCLicenseAccept}\" Margin=\"5\" MinWidth=\"100\"\r\n                    Command=\"{Binding AcceptCommnad}\" IsDefault=\"True\" />\r\n            <Button Content=\"{DynamicResource LOCLicenseDecline}\" Margin=\"5\" MinWidth=\"100\"\r\n                    Command=\"{Binding DeclineCommand}\" IsCancel=\"True\" />\r\n        </StackPanel>\r\n        <TextBox AcceptsReturn=\"True\" IsReadOnly=\"True\" DockPanel.Dock=\"Top\" TextWrapping=\"Wrap\"\r\n                 HorizontalScrollBarVisibility=\"Disabled\" VerticalScrollBarVisibility=\"Auto\"\r\n                 BorderThickness=\"0\" Margin=\"5,5,5,5\"\r\n                 Text=\"{Binding License}\"/>\r\n    </DockPanel>    \r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/LicenseAgreementWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for AboutWindow.xaml\r\n    /// </summary>\r\n    public partial class LicenseAgreementWindow : WindowBase\r\n    {\r\n        public LicenseAgreementWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/MainWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.DesktopApp.Windows.MainWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"     \r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:cv=\"clr-namespace:Playnite.DesktopApp.Controls.Views\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n        mc:Ignorable=\"d\"\r\n        Title=\"Playnite\" ShowTitle=\"False\"\r\n        Width=\"1360\" Height=\"900\"\r\n        MinWidth=\"640\" MinHeight=\"480\"\r\n        WindowStartupLocation=\"CenterScreen\"\r\n        Visibility=\"{Binding Visibility, Mode=TwoWay}\"\r\n        WindowState=\"{Binding WindowState, Mode=TwoWay}\"\r\n        x:Name=\"WindowMain\" AutomationProperties.AutomationId=\"WindowMain\"\r\n        Style=\"{StaticResource MainWindowStyle}\"\r\n        Icon=\"{pmrk:ThemeFile 'Images/applogo.ico'}\"\r\n        AllowDrop=\"True\">    \r\n    \r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"Closing\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding WindowClosingCommand}\" />\r\n        </i:EventTrigger>\r\n        <i:EventTrigger EventName=\"Drop\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding FileDroppedCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <KeyBinding Command=\"{Binding UpdateGamesCommand}\"\r\n                Key =\"{Binding UpdateGamesCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding UpdateGamesCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding OpenSettingsCommand}\"\r\n                Key =\"{Binding OpenSettingsCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding OpenSettingsCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding OpenFullScreenCommand}\"\r\n                Key =\"{Binding OpenFullScreenCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding OpenFullScreenCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding ReloadScriptsCommand}\"\r\n                Key =\"{Binding ReloadScriptsCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding ReloadScriptsCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding AddCustomGameCommand}\"\r\n                Key =\"{Binding AddCustomGameCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding AddCustomGameCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding OpenAboutCommand}\"\r\n                Key =\"{Binding OpenAboutCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding OpenAboutCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding ShutdownCommand}\"\r\n                Key =\"{Binding ShutdownCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding ShutdownCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding DownloadMetadataCommand}\"\r\n                Key =\"{Binding DownloadMetadataCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding DownloadMetadataCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding OpenEmulatorsCommand}\"\r\n                Key =\"{Binding OpenEmulatorsCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding OpenEmulatorsCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding AddEmulatedGamesCommand}\"\r\n                Key =\"{Binding AddEmulatedGamesCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding AddEmulatedGamesCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding OpenSearchCommand}\"\r\n                Key =\"{Binding OpenSearchCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding OpenSearchCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding ToggleExplorerPanelCommand}\"\r\n                Key =\"{Binding ToggleExplorerPanelCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding ToggleExplorerPanelCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding ToggleFilterPanelCommand}\"\r\n                Key =\"{Binding ToggleFilterPanelCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding ToggleFilterPanelCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding SelectRandomGameCommand}\"\r\n                Key =\"{Binding SelectRandomGameCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding SelectRandomGameCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding ViewSelectRandomGameCommand}\"\r\n                Key =\"{Binding ViewSelectRandomGameCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding ViewSelectRandomGameCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding OpenDbFieldsManagerCommand}\"\r\n                Key =\"{Binding OpenDbFieldsManagerCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding OpenDbFieldsManagerCommand.Gesture.Modifiers}\" />\r\n        <KeyBinding Command=\"{Binding OpenAddonsCommand}\"\r\n                Key =\"{Binding OpenAddonsCommand.Gesture.Key}\"\r\n                Modifiers=\"{Binding OpenAddonsCommand.Gesture.Modifiers}\" />\r\n        <pin:GameControllerInputBinding Button=\"Guide\" Command=\"{Binding OpenFullScreenFromControllerCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <cv:MainWindow IsTabStop=\"False\" />\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/MainWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class MainWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new MainWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for MainWindow.xaml\r\n    /// </summary>\r\n    public partial class MainWindow : WindowBase\r\n    {\r\n        private WindowPositionHandler positionManager;\r\n\r\n        public MainWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            if (PlayniteApplication.Current.AppSettings != null)\r\n            {\r\n                positionManager = new WindowPositionHandler(this, \"Main_V2\", PlayniteApplication.Current.AppSettings.WindowPositions);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/MessageBoxWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.MessageBoxWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        x:Name=\"WindowMessageBox\"\r\n        Title=\"{Binding Caption, ElementName=WindowMessageBox}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\" MaxWidth=\"600\"\r\n        ResizeMode=\"NoResize\" SizeToContent=\"WidthAndHeight\" WindowStartupLocation=\"CenterOwner\">\r\n\r\n    <controls:WindowBase.Resources>\r\n        <BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </controls:WindowBase.Resources>\r\n    \r\n    <Grid Margin=\"5\">\r\n        <Grid.ColumnDefinitions>\r\n            <ColumnDefinition Width=\"Auto\" />\r\n            <ColumnDefinition Width=\"*\" />\r\n        </Grid.ColumnDefinitions>        \r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n        <Viewbox Grid.Column=\"0\" Grid.Row=\"0\" Name=\"ViewIcon\" Visibility=\"Collapsed\"\r\n                 Margin=\"10,10,0,10\" MaxWidth=\"32\" MaxHeight=\"32\">\r\n            <TextBlock>\r\n                <TextBlock.Style>\r\n                    <Style TargetType=\"TextBlock\">\r\n                        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontIcoFont}\" />\r\n                        <Style.Triggers>\r\n                            <DataTrigger Binding=\"{Binding DisplayIcon, ElementName=WindowMessageBox}\" Value=\"{x:Static MessageBoxImage.Error}\">\r\n                                <Setter Property=\"Text\" Value=\"&#xef16;\" />\r\n                                <Setter Property=\"Foreground\" Value=\"OrangeRed\" />\r\n                            </DataTrigger>\r\n                            <DataTrigger Binding=\"{Binding DisplayIcon, ElementName=WindowMessageBox}\" Value=\"{x:Static MessageBoxImage.Question}\">\r\n                                <Setter Property=\"Text\" Value=\"&#xefcc;\" />\r\n                                <Setter Property=\"Foreground\" Value=\"DodgerBlue\" />\r\n                            </DataTrigger>\r\n                            <DataTrigger Binding=\"{Binding DisplayIcon, ElementName=WindowMessageBox}\" Value=\"{x:Static MessageBoxImage.Warning}\">\r\n                                <Setter Property=\"Text\" Value=\"&#xf026;\" />\r\n                                <Setter Property=\"Foreground\" Value=\"Yellow\" />\r\n                            </DataTrigger>\r\n                            <DataTrigger Binding=\"{Binding DisplayIcon, ElementName=WindowMessageBox}\" Value=\"{x:Static MessageBoxImage.Information}\">\r\n                                <Setter Property=\"Text\" Value=\"&#xef50;\" />\r\n                                <Setter Property=\"Foreground\" Value=\"DodgerBlue\" />\r\n                            </DataTrigger>\r\n                        </Style.Triggers>\r\n                    </Style>\r\n                </TextBlock.Style>\r\n            </TextBlock>\r\n        </Viewbox>\r\n        <TextBlock Grid.Column=\"1\" Grid.Row=\"0\" Margin=\"10,10,20,10\" Text=\"{Binding Text, ElementName=WindowMessageBox}\"\r\n                   VerticalAlignment=\"Center\" TextWrapping=\"Wrap\" HorizontalAlignment=\"Stretch\"/>\r\n        <TextBox Grid.Row=\"1\" Grid.ColumnSpan=\"2\" Margin=\"10,10,10,10\" Name=\"TextInputText\" Width=\"400\"\r\n                 IsReadOnly=\"{Binding IsTextReadOnly, ElementName=WindowMessageBox}\"\r\n                 Text=\"{Binding InputText, ElementName=WindowMessageBox}\"\r\n                 Visibility=\"{Binding ShowInputField, ElementName=WindowMessageBox, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n\r\n        <ItemsControl Grid.Row=\"2\" Grid.ColumnSpan=\"2\"\r\n                      Name=\"ItemsToggleOptions\" Visibility=\"Collapsed\"\r\n                      ItemsSource=\"{Binding ToggleOptions, ElementName=WindowMessageBox}\">\r\n            <ItemsControl.ItemTemplate>\r\n                <DataTemplate>\r\n                    <CheckBox Content=\"{Binding Title}\"\r\n                              IsChecked=\"{Binding Selected}\"\r\n                              Margin=\"10,5,0,5\"/>\r\n                </DataTemplate>\r\n            </ItemsControl.ItemTemplate>\r\n        </ItemsControl>\r\n\r\n        <StackPanel Grid.Row=\"3\" Grid.ColumnSpan=\"2\" Orientation=\"Horizontal\" Margin=\"5\"\r\n                    Name=\"StackButtons\">\r\n            <StackPanel.Style>\r\n                <Style TargetType=\"StackPanel\">\r\n                    <Style.Triggers>\r\n                        <DataTrigger Binding=\"{Binding ShowOKButton, ElementName=WindowMessageBox}\" Value=\"True\">\r\n                            <Setter Property=\"HorizontalAlignment\" Value=\"Center\"/>\r\n                        </DataTrigger>\r\n                        <DataTrigger Binding=\"{Binding ShowOKButton, ElementName=WindowMessageBox}\" Value=\"False\">\r\n                            <Setter Property=\"HorizontalAlignment\" Value=\"Right\"/>\r\n                        </DataTrigger>\r\n                    </Style.Triggers>\r\n                </Style>\r\n            </StackPanel.Style>\r\n            <Button Content=\"{DynamicResource LOCOKLabel}\" Style=\"{StaticResource BottomButton}\" Name=\"ButtonOK\" Click=\"ButtonOK_Click\"\r\n                    Visibility=\"{Binding ShowOKButton, ElementName=WindowMessageBox, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n            <Button Content=\"{DynamicResource LOCYesLabel}\" Style=\"{StaticResource BottomButton}\" Name=\"ButtonYes\" Click=\"ButtonYes_Click\"\r\n                    Visibility=\"{Binding ShowYesButton, ElementName=WindowMessageBox, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n            <Button Content=\"{DynamicResource LOCNoLabel}\" Style=\"{StaticResource BottomButton}\" Name=\"ButtonNo\" Click=\"ButtonNo_Click\"\r\n                    Visibility=\"{Binding ShowNoButton, ElementName=WindowMessageBox, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n            <Button Content=\"{DynamicResource LOCCancelLabel}\" Style=\"{StaticResource BottomButton}\" Name=\"ButtonCancel\" Click=\"ButtonCancel_Click\"\r\n                    Visibility=\"{Binding ShowCancelButton, ElementName=WindowMessageBox, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n        </StackPanel>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/MessageBoxWindow.xaml.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for MessageBoxWindow.xaml\r\n    /// </summary>\r\n    public partial class MessageBoxWindow : WindowBase\r\n    {\r\n        private MessageBoxResult result;\r\n        private MessageBoxOption resultCustom;\r\n\r\n        private string text = string.Empty;\r\n        public string Text\r\n        {\r\n            get => text;\r\n            set\r\n            {\r\n                text = value;\r\n                OnPropertyChanged(nameof(Text));\r\n            }\r\n        }\r\n\r\n        private string caption = string.Empty;\r\n        public string Caption\r\n        {\r\n            get => caption;\r\n            set\r\n            {\r\n                caption = value;\r\n                OnPropertyChanged(nameof(Caption));\r\n            }\r\n        }\r\n\r\n        private bool showOKButton = false;\r\n        public bool ShowOKButton\r\n        {\r\n            get => showOKButton;\r\n            set\r\n            {\r\n                showOKButton = value;\r\n                OnPropertyChanged(nameof(ShowOKButton));\r\n            }\r\n        }\r\n\r\n        private bool showYesButton = false;\r\n        public bool ShowYesButton\r\n        {\r\n            get => showYesButton;\r\n            set\r\n            {\r\n                showYesButton = value;\r\n                OnPropertyChanged(nameof(ShowYesButton));\r\n            }\r\n        }\r\n\r\n        private bool showNoButton = false;\r\n        public bool ShowNoButton\r\n        {\r\n            get => showNoButton;\r\n            set\r\n            {\r\n                showNoButton = value;\r\n                OnPropertyChanged(nameof(ShowNoButton));\r\n            }\r\n        }\r\n\r\n        private bool showCancelButton = false;\r\n        public bool ShowCancelButton\r\n        {\r\n            get => showCancelButton;\r\n            set\r\n            {\r\n                showCancelButton = value;\r\n                OnPropertyChanged(nameof(ShowCancelButton));\r\n            }\r\n        }\r\n\r\n        private bool showInputField = false;\r\n        public bool ShowInputField\r\n        {\r\n            get => showInputField;\r\n            set\r\n            {\r\n                showInputField = value;\r\n                OnPropertyChanged(nameof(ShowInputField));\r\n            }\r\n        }\r\n\r\n        private string inputText = string.Empty;\r\n        public string InputText\r\n        {\r\n            get => inputText;\r\n            set\r\n            {\r\n                inputText = value;\r\n                OnPropertyChanged(nameof(InputText));\r\n            }\r\n        }\r\n\r\n        private MessageBoxImage displayIcon = MessageBoxImage.None;\r\n        public MessageBoxImage DisplayIcon\r\n        {\r\n            get => displayIcon;\r\n            set\r\n            {\r\n                displayIcon = value;\r\n                OnPropertyChanged(nameof(DisplayIcon));\r\n            }\r\n        }\r\n\r\n        private bool isTextReadOnly = false;\r\n        public bool IsTextReadOnly\r\n        {\r\n            get => isTextReadOnly;\r\n            set\r\n            {\r\n                isTextReadOnly = value;\r\n                OnPropertyChanged(nameof(IsTextReadOnly));\r\n            }\r\n        }\r\n\r\n        private List<MessageBoxToggle> toggleOptions;\r\n        public List<MessageBoxToggle> ToggleOptions\r\n        {\r\n            get => toggleOptions;\r\n            set\r\n            {\r\n                toggleOptions = value;\r\n                OnPropertyChanged(nameof(ToggleOptions));\r\n            }\r\n        }\r\n\r\n        public MessageBoxWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        public void ShowInputReadOnly(\r\n            Window owner,\r\n            string messageBoxText,\r\n            string caption,\r\n            string inputText)\r\n        {\r\n            if (owner == null || owner == this)\r\n            {\r\n                WindowStartupLocation = WindowStartupLocation.CenterScreen;\r\n            }\r\n\r\n            if (this != owner)\r\n            {\r\n                Owner = owner;\r\n            }\r\n\r\n            TextInputText.Focus();\r\n            SetStrings(messageBoxText, caption);\r\n            ShowInputField = true;\r\n            ShowOKButton = true;\r\n            ButtonOK.IsDefault = true;\r\n            ButtonOK.Focus();\r\n            InputText = inputText ?? string.Empty;\r\n            IsTextReadOnly = true;\r\n            ShowDialog();\r\n        }\r\n\r\n        public StringSelectionDialogResult ShowInput(\r\n            Window owner,\r\n            string messageBoxText,\r\n            string caption,\r\n            string defaultInput,\r\n            List<MessageBoxToggle> options = null)\r\n        {\r\n            if (owner == null || owner == this)\r\n            {\r\n                WindowStartupLocation = WindowStartupLocation.CenterScreen;\r\n            }\r\n\r\n            if (this != owner)\r\n            {\r\n                Owner = owner;\r\n            }\r\n\r\n            TextInputText.Focus();\r\n            SetStrings(messageBoxText, caption);\r\n            ShowInputField = true;\r\n            ShowOKButton = true;\r\n            ButtonOK.IsDefault = true;\r\n            ShowCancelButton = true;\r\n            ButtonCancel.IsCancel = true;\r\n            InputText = defaultInput ?? string.Empty;\r\n            ToggleOptions = options;\r\n            if (options.HasItems())\r\n            {\r\n                ItemsToggleOptions.Visibility = Visibility.Visible;\r\n            }\r\n\r\n            ShowDialog();\r\n\r\n            if (result == MessageBoxResult.Cancel)\r\n            {\r\n                return new StringSelectionDialogResult(false, InputText);\r\n            }\r\n            else\r\n            {\r\n                return new StringSelectionDialogResult(true, InputText);\r\n            }\r\n        }\r\n\r\n        public MessageBoxResult Show(\r\n            Window owner,\r\n            string messageBoxText,\r\n            string caption,\r\n            MessageBoxButton button,\r\n            MessageBoxImage icon,\r\n            MessageBoxResult defaultResult,\r\n            MessageBoxOptions options)\r\n        {\r\n            if (owner == null || owner == this)\r\n            {\r\n                WindowStartupLocation = WindowStartupLocation.CenterScreen;\r\n            }\r\n\r\n            if (this != owner)\r\n            {\r\n                Owner = owner;\r\n            }\r\n\r\n            result = defaultResult;\r\n            SetStrings(messageBoxText, caption);\r\n            DisplayIcon = icon;\r\n\r\n            switch (button)\r\n            {\r\n                case MessageBoxButton.OK:\r\n                    ShowOKButton = true;\r\n                    ButtonOK.IsDefault = true;\r\n                    ButtonOK.Focus();\r\n                    break;\r\n                case MessageBoxButton.OKCancel:\r\n                    ShowOKButton = true;\r\n                    ButtonOK.IsDefault = true;\r\n                    ButtonOK.Focus();\r\n                    ShowCancelButton = true;\r\n                    ButtonCancel.IsCancel = true;\r\n                    break;\r\n                case MessageBoxButton.YesNoCancel:\r\n                    ShowYesButton = true;\r\n                    ButtonYes.Focus();\r\n                    ButtonYes.IsDefault = true;\r\n                    ShowNoButton = true;\r\n                    ShowCancelButton = true;\r\n                    ButtonCancel.IsCancel = true;\r\n                    break;\r\n                case MessageBoxButton.YesNo:\r\n                    ShowYesButton = true;\r\n                    ButtonYes.Focus();\r\n                    ButtonYes.IsDefault = true;\r\n                    ShowNoButton = true;\r\n                    ButtonNo.IsCancel = true;\r\n                    break;\r\n                default:\r\n                    ShowOKButton = true;\r\n                    ButtonOK.Focus();\r\n                    ButtonOK.IsDefault = true;\r\n                    break;\r\n            }\r\n\r\n            if (icon != MessageBoxImage.None)\r\n            {\r\n                ViewIcon.Visibility = Visibility.Visible;\r\n            }\r\n\r\n            ShowDialog();\r\n            return result;\r\n        }\r\n\r\n        public MessageBoxOption ShowCustom(\r\n            Window owner,\r\n            string messageBoxText,\r\n            string caption,\r\n            MessageBoxImage icon,\r\n            List<MessageBoxOption> options)\r\n        {\r\n            if (owner == null || owner == this)\r\n            {\r\n                WindowStartupLocation = WindowStartupLocation.CenterScreen;\r\n            }\r\n\r\n            if (this != owner)\r\n            {\r\n                Owner = owner;\r\n            }\r\n\r\n            SetStrings(messageBoxText, caption);\r\n            DisplayIcon = icon;\r\n\r\n            ShowOKButton = false;\r\n            ShowYesButton = false;\r\n            ShowNoButton = false;\r\n            ShowCancelButton = false;\r\n            ShowInputField = false;\r\n\r\n            foreach (var option in options)\r\n            {\r\n                var title = option.Title;\r\n                var button = new Button();\r\n                button.Content = title.StartsWith(\"LOC\", StringComparison.Ordinal) ? ResourceProvider.GetString(title) : title;\r\n                button.Style = ResourceProvider.GetResource(\"BottomButton\") as Style;\r\n                button.Tag = option;\r\n                button.IsDefault = option.IsDefault;\r\n                button.IsCancel = option.IsCancel;\r\n                button.Click += (s, __) =>\r\n                {\r\n                    resultCustom = (s as Button).Tag as MessageBoxOption;\r\n                    Close();\r\n                };\r\n\r\n                StackButtons.Children.Add(button);\r\n                if (option.IsDefault)\r\n                {\r\n                    button.Focus();\r\n                }\r\n            }\r\n\r\n            if (icon != MessageBoxImage.None)\r\n            {\r\n                ViewIcon.Visibility = Visibility.Visible;\r\n            }\r\n\r\n            ShowDialog();\r\n            return resultCustom;\r\n        }\r\n\r\n        private void SetStrings(string messageText, string messageCaption)\r\n        {\r\n            if (messageText?.StartsWith(\"LOC\", StringComparison.Ordinal) == true)\r\n            {\r\n                Text = ResourceProvider.GetString(messageText);\r\n            }\r\n            else\r\n            {\r\n                Text = messageText;\r\n            }\r\n\r\n            if (messageCaption?.StartsWith(\"LOC\", StringComparison.Ordinal) == true)\r\n            {\r\n                Caption = ResourceProvider.GetString(messageCaption);\r\n            }\r\n            else\r\n            {\r\n                Caption = messageCaption;\r\n            }\r\n        }\r\n\r\n        private void ButtonOK_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            result = MessageBoxResult.OK;\r\n            Close();\r\n        }\r\n\r\n        private void ButtonYes_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            result = MessageBoxResult.Yes;\r\n            Close();\r\n        }\r\n\r\n        private void ButtonNo_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            result = MessageBoxResult.No;\r\n            Close();\r\n        }\r\n\r\n        private void ButtonCancel_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            result = MessageBoxResult.Cancel;\r\n            Close();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/MetadataComparisonWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.MetadataComparisonWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n        xmlns:dvm=\"clr-namespace:Playnite.DesktopApp.ViewModels;assembly=Playnite.DesktopApp\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCMedataDiffWindowTitle}\" \r\n        WindowStartupLocation=\"CenterOwner\" ShowInTaskbar=\"False\"\r\n        Height=\"600\" Width=\"800\">\r\n    \r\n    <controls:WindowBase.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n            <Setter Property=\"Margin\" Value=\"5,5,5,5\" />\r\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n        </Style>\r\n        <Style TargetType=\"RadioButton\" BasedOn=\"{StaticResource {x:Type RadioButton}}\">\r\n            <Setter Property=\"Margin\" Value=\"5\" />\r\n        </Style>\r\n        <Style TargetType=\"CheckBox\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\r\n            <Setter Property=\"Margin\" Value=\"5\" />\r\n        </Style>\r\n        <Style TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n            <Setter Property=\"Margin\" Value=\"5\" />\r\n        </Style>\r\n    </controls:WindowBase.Resources>\r\n    \r\n    <DockPanel>\r\n        <Border DockPanel.Dock=\"Bottom\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{DynamicResource NormalBorderBrush}\">\r\n            <DockPanel LastChildFill=\"False\" Margin=\"5\">\r\n                <Button Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\"\r\n                        Style=\"{StaticResource BottomButton}\" IsCancel=\"True\"\r\n                        Command=\"{Binding CancelCommand}\"/>\r\n                <Button Name=\"ButtonOK\" Content=\"{DynamicResource LOCSelect}\" DockPanel.Dock=\"Right\" \r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding ConfirmCommand}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n\r\n        <ScrollViewer DockPanel.Dock=\"Top\" VerticalScrollBarVisibility=\"Auto\">\r\n            <GridEx ColumnCount=\"3\" StarColumns=\"1,2\"\r\n                    Margin=\"5,0,5,0\"\r\n                    RowCount=\"41\" AutoLayoutColumns=\"3\">\r\n                <Canvas />\r\n                <TextBlock Text=\"{DynamicResource LOCMetadataDiffCurrent}\"  />\r\n                <TextBlock Text=\"{DynamicResource LOCMetadataDiffNew}\"  />\r\n                \r\n                <Canvas />\r\n                <Button Content=\"{DynamicResource LOCSelectAll}\" HorizontalAlignment=\"Left\"\r\n                        Command=\"{Binding SelectAllCurrentCommand}\" />\r\n                <Button Content=\"{DynamicResource LOCSelectAll}\" HorizontalAlignment=\"Left\"\r\n                        Command=\"{Binding SelectAllNewCommand}\" />\r\n\r\n                <!--Name-->\r\n                <TextBlock Text=\"{DynamicResource LOCNameLabel}\"\r\n                           Visibility=\"{Binding Name.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <RadioButton Visibility=\"{Binding Name.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"                             \r\n                             IsChecked=\"{Binding Name.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.Current}}\"\r\n                             GroupName=\"Name\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding CurrentGame.Name}\" />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n                <RadioButton Visibility=\"{Binding Name.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding Name.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.New}}\"\r\n                             GroupName=\"Name\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding NewGame.Name}\" />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n\r\n                <!--Release Date-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding ReleaseDate.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCGameReleaseDateTitle}\"\r\n                           Visibility=\"{Binding ReleaseDate.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <RadioButton Visibility=\"{Binding ReleaseDate.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding ReleaseDate.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.Current}}\"\r\n                             GroupName=\"ReleaseDate\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding CurrentGame.ReleaseDate}\" />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n                <RadioButton Visibility=\"{Binding ReleaseDate.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding ReleaseDate.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.New}}\"\r\n                             GroupName=\"ReleaseDate\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding NewGame.ReleaseDate}\" />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n\r\n                <!--Genres-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Genres.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCGenresLabel}\"\r\n                           Visibility=\"{Binding Genres.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <ItemsControl ItemsSource=\"{Binding Genres.Current}\"\r\n                              Visibility=\"{Binding Genres.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n                <ItemsControl ItemsSource=\"{Binding Genres.New}\"\r\n                              Visibility=\"{Binding Genres.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n\r\n                <!--Developers-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Developers.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCDevelopersLabel}\"\r\n                           Visibility=\"{Binding Developers.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <ItemsControl ItemsSource=\"{Binding Developers.Current}\"\r\n                              Visibility=\"{Binding Developers.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n                <ItemsControl ItemsSource=\"{Binding Developers.New}\"\r\n                              Visibility=\"{Binding Developers.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n\r\n                <!--Publishers-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Publishers.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCPublishersLabel}\"\r\n                           Visibility=\"{Binding Publishers.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <ItemsControl ItemsSource=\"{Binding Publishers.Current}\"\r\n                              Visibility=\"{Binding Publishers.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n                <ItemsControl ItemsSource=\"{Binding Publishers.New}\"\r\n                              Visibility=\"{Binding Publishers.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n\r\n                <!--Features-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Features.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCFeaturesLabel}\"\r\n                           Visibility=\"{Binding Features.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <ItemsControl ItemsSource=\"{Binding Features.Current}\"\r\n                              Visibility=\"{Binding Features.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n                <ItemsControl ItemsSource=\"{Binding Features.New}\"\r\n                              Visibility=\"{Binding Features.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n\r\n                <!--Tags-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Tags.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCTagsLabel}\"\r\n                           Visibility=\"{Binding Tags.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <ItemsControl ItemsSource=\"{Binding Tags.Current}\"\r\n                              Visibility=\"{Binding Tags.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n                <ItemsControl ItemsSource=\"{Binding Tags.New}\"\r\n                              Visibility=\"{Binding Tags.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n\r\n                <!--Links-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Links.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCLinksLabel}\"\r\n                           Visibility=\"{Binding Links.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <ItemsControl ItemsSource=\"{Binding Links.Current}\"\r\n                              Visibility=\"{Binding Links.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\"\r\n                                      ToolTip=\"{Binding Item.Url}\" ToolTipService.InitialShowDelay=\"0\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n                <ItemsControl ItemsSource=\"{Binding Links.New}\"\r\n                              Visibility=\"{Binding Links.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\"\r\n                                      ToolTip=\"{Binding Item.Url}\" ToolTipService.InitialShowDelay=\"0\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n\r\n                <!--Age rating-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding AgeRatings.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCAgeRatingLabel}\"\r\n                           Visibility=\"{Binding AgeRatings.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <ItemsControl ItemsSource=\"{Binding AgeRatings.Current}\"\r\n                              Visibility=\"{Binding AgeRatings.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n                <ItemsControl ItemsSource=\"{Binding AgeRatings.New}\"\r\n                              Visibility=\"{Binding AgeRatings.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n\r\n                <!--Region-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Regions.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCRegionLabel}\"\r\n                           Visibility=\"{Binding Regions.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <ItemsControl ItemsSource=\"{Binding Regions.Current}\"\r\n                              Visibility=\"{Binding Regions.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n                <ItemsControl ItemsSource=\"{Binding Regions.New}\"\r\n                              Visibility=\"{Binding Regions.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n\r\n                <!--Series-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Series.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCSeriesLabel}\"\r\n                           Visibility=\"{Binding Series.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <ItemsControl ItemsSource=\"{Binding Series.Current}\"\r\n                              Visibility=\"{Binding Series.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n                <ItemsControl ItemsSource=\"{Binding Series.New}\"\r\n                              Visibility=\"{Binding Series.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n\r\n                <!--Platform-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Platforms.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCGamePlatformTitle}\"\r\n                           Visibility=\"{Binding Platforms.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <ItemsControl ItemsSource=\"{Binding Platforms.Current}\"\r\n                              Visibility=\"{Binding Platforms.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n                <ItemsControl ItemsSource=\"{Binding Platforms.New}\"\r\n                              Visibility=\"{Binding Platforms.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <CheckBox IsChecked=\"{Binding Selected}\" Content=\"{Binding Item.Name}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n\r\n                <!--Description-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Description.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCGameDescriptionTitle}\"\r\n                           Visibility=\"{Binding Description.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <RadioButton Visibility=\"{Binding Description.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"                             \r\n                             IsChecked=\"{Binding Description.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.Current}}\"\r\n                             GroupName=\"Description\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding CurrentGame.Description}\"\r\n                                   TextWrapping=\"Wrap\" MaxHeight=\"150\" TextTrimming=\"CharacterEllipsis\" />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n                <RadioButton Visibility=\"{Binding Description.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding Description.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.New}}\"\r\n                             GroupName=\"Description\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding NewGame.Description}\"\r\n                                   TextWrapping=\"Wrap\" MaxHeight=\"150\" TextTrimming=\"CharacterEllipsis\" />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n\r\n                <!--CriticScore-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding CriticScore.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCCriticScore}\"\r\n                           Visibility=\"{Binding CriticScore.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <RadioButton Visibility=\"{Binding CriticScore.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"                             \r\n                             IsChecked=\"{Binding CriticScore.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.Current}}\"\r\n                             GroupName=\"CriticScore\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding CurrentGame.CriticScore}\" />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n                <RadioButton Visibility=\"{Binding CriticScore.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding CriticScore.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.New}}\"\r\n                             GroupName=\"CriticScore\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding NewGame.CriticScore}\"  />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n\r\n                <!--CommunityScore-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding CommunityScore.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCCommunityScore}\"\r\n                           Visibility=\"{Binding CommunityScore.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <RadioButton Visibility=\"{Binding CommunityScore.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"                             \r\n                             IsChecked=\"{Binding CommunityScore.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.Current}}\"\r\n                             GroupName=\"CommunityScore\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding CurrentGame.CommunityScore}\" />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n                <RadioButton Visibility=\"{Binding CommunityScore.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding CommunityScore.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.New}}\"\r\n                             GroupName=\"CommunityScore\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding NewGame.CommunityScore}\"  />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n\r\n                <!--InstallSize-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding InstallSize.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCInstallSizeLabel}\"\r\n                           Visibility=\"{Binding InstallSize.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <RadioButton Visibility=\"{Binding InstallSize.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"                             \r\n                             IsChecked=\"{Binding InstallSize.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.Current}}\"\r\n                             GroupName=\"InstallSize\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding CurrentGame.InstallSize, Converter={StaticResource NullableUlongBytesSizeToStringConverter}}\" />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n                <RadioButton Visibility=\"{Binding InstallSize.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding InstallSize.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.New}}\"\r\n                             GroupName=\"InstallSize\">\r\n                    <RadioButton.Content>\r\n                        <TextBlock Text=\"{Binding NewGame.InstallSize, Converter={StaticResource NullableUlongBytesSizeToStringConverter}}\"  />\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n                \r\n                <!--Icon-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Icon.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCGameIconTitle}\"\r\n                           Visibility=\"{Binding Icon.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <RadioButton Visibility=\"{Binding Icon.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding Icon.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.Current}}\"\r\n                             GroupName=\"Icon\">\r\n                    <RadioButton.Content>\r\n                        <StackPanel>\r\n                            <Image Source=\"{Binding CurrentIcon}\"\r\n                               Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n                               HorizontalAlignment=\"Left\" Height=\"64\"/>\r\n                            <TextBlock Text=\"{Binding CurrentIconDimensions}\" />\r\n                        </StackPanel>\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n                <RadioButton Visibility=\"{Binding Icon.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding Icon.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.New}}\"\r\n                             GroupName=\"Icon\">\r\n                    <RadioButton.Content>\r\n                        <StackPanel>\r\n                            <Image Source=\"{Binding NewIcon}\"\r\n                               Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n                               HorizontalAlignment=\"Left\" Height=\"64\"/>\r\n                            <TextBlock Text=\"{Binding NewIconDimensions}\" />\r\n                        </StackPanel>\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n\r\n                <!--Cover-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Cover.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <TextBlock Text=\"{DynamicResource LOCGameCoverTitle}\"\r\n                           Visibility=\"{Binding Cover.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <RadioButton Visibility=\"{Binding Cover.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding Cover.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.Current}}\"\r\n                             GroupName=\"Cover\">\r\n                    <RadioButton.Content>\r\n                        <StackPanel>\r\n                            <Image Source=\"{Binding CurrentCover}\"\r\n                               Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n                               HorizontalAlignment=\"Left\" Height=\"128\"/>\r\n                            <TextBlock Text=\"{Binding CurrentCoverDimensions}\" />\r\n                        </StackPanel>\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n                <RadioButton Visibility=\"{Binding Cover.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding Cover.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.New}}\"\r\n                             GroupName=\"Cover\">\r\n                    <RadioButton.Content>\r\n                        <StackPanel>\r\n                            <Image Source=\"{Binding NewCover}\"\r\n                               Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n                               HorizontalAlignment=\"Left\" Height=\"128\"/>\r\n                            <TextBlock Text=\"{Binding NewCoverDimensions}\" />\r\n                        </StackPanel>\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n\r\n                <!--BackgroundImage-->\r\n                <Separator Grid.ColumnSpan=\"3\"\r\n                           Visibility=\"{Binding Background.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"  />\r\n                <TextBlock Text=\"{DynamicResource LOCGameBackgroundTitle}\"\r\n                           Visibility=\"{Binding Background.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\" />\r\n                <RadioButton Visibility=\"{Binding Background.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding Background.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.Current}}\"\r\n                             GroupName=\"Background\">\r\n                    <RadioButton.Content>\r\n                        <StackPanel>\r\n                            <Image Source=\"{Binding CurrentBackground}\"\r\n                               Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n                               HorizontalAlignment=\"Left\" Height=\"169\"/>\r\n                            <TextBlock Text=\"{Binding CurrentBackgroundDimensions}\" />\r\n                        </StackPanel>\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n                <RadioButton Visibility=\"{Binding Background.Enabled, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                             IsChecked=\"{Binding Background.Source, Converter={StaticResource EnumToBooleanConverter},ConverterParameter={x:Static dvm:MetadataChangeDataSource.New}}\"\r\n                             GroupName=\"Background\">\r\n                    <RadioButton.Content>\r\n                        <StackPanel>\r\n                            <Image Source=\"{Binding NewBackground}\"\r\n                               Stretch=\"Uniform\" StretchDirection=\"DownOnly\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n                               HorizontalAlignment=\"Left\" Height=\"169\"/>\r\n                            <TextBlock Text=\"{Binding NewBackgroundDimensions}\" />\r\n                        </StackPanel>\r\n                    </RadioButton.Content>\r\n                </RadioButton>\r\n            </GridEx>\r\n        </ScrollViewer>\r\n    </DockPanel>\r\n</controls:WindowBase>"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/MetadataComparisonWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class MetadataComparisonWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new MetadataComparisonWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for AboutWindow.xaml\r\n    /// </summary>\r\n    public partial class MetadataComparisonWindow : WindowBase\r\n    {\r\n        private WindowPositionHandler positionManager;\r\n\r\n        public MetadataComparisonWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            if (PlayniteApplication.Current.AppSettings != null)\r\n            {\r\n                positionManager = new WindowPositionHandler(this, \"WindowPositionHandler_V2\", PlayniteApplication.Current.AppSettings.WindowPositions);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/MetadataDownloadWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.MetadataDownloadWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n        xmlns:pvm=\"clr-namespace:Playnite.DesktopApp.ViewModels\"\r\n        xmlns:pmp=\"clr-namespace:Playnite.Metadata;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCMetaImportWindowTitle}\" WindowStartupLocation=\"CenterOwner\"\r\n        Height=\"625\" Width=\"700\" x:Name=\"WindowEmulatorImport\"\r\n        AutomationProperties.AutomationId=\"WindowEmulatorImport\">\r\n\r\n    <controls:WindowBase.Resources>\r\n        <pcon:EnumToBooleanConverter x:Key=\"EnumConverter\" />\r\n        <pcon:NegateConverter x:Key=\"NegateConverter\" />\r\n        <pcon:InvertedBooleanToVisibilityConverter x:Key=\"InvertedBooleanToVisibilityConverter\" />\r\n        <pcon:ListToStringConverter x:Key=\"ListToStringConverter\" />\r\n        <BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <Grid>\r\n        <Grid.Resources>\r\n            <p:BindingProxy x:Key=\"Proxy\" Data=\"{Binding}\" />\r\n        </Grid.Resources>\r\n        \r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n        <TabControl DockPanel.Dock=\"Top\" Grid.Column=\"0\" Grid.Row=\"0\" \r\n                    Name=\"TabMain\" OverridesDefaultStyle=\"True\"\r\n                    SelectedIndex=\"{Binding ViewTabIndex, Mode=OneWay}\" TabIndex=\"1\">\r\n            <TabControl.Style>\r\n            <Style TargetType=\"TabControl\">\r\n                <Setter Property=\"Template\">\r\n                    <Setter.Value>\r\n                        <ControlTemplate TargetType=\"TabControl\">\r\n                            <Grid>\r\n                                <TabPanel IsItemsHost=\"True\" />\r\n                                <ContentPresenter ContentSource=\"SelectedContent\" />\r\n                            </Grid>\r\n                        </ControlTemplate>\r\n                    </Setter.Value>\r\n                </Setter>\r\n            </Style>\r\n            </TabControl.Style>\r\n\r\n            <TabItem Visibility=\"Collapsed\" IsTabStop=\"False\">\r\n                <DockPanel KeyboardNavigation.TabNavigation=\"Local\" Margin=\"30,0,30,0\">\r\n                    <TextBlock Text=\"{DynamicResource LOCMetaGamesSourceIntro}\" VerticalAlignment=\"Center\" FontSize=\"16\" DockPanel.Dock=\"Top\"\r\n                               Margin=\"0,30,0,0\"/>\r\n                    <TextBlock Text=\"{DynamicResource LOCMetaGamesSourceDescription}\" TextWrapping=\"Wrap\" DockPanel.Dock=\"Top\" \r\n                               Margin=\"0,30,0,0\"/>\r\n                    <StackPanel Margin=\"20,20,0,0\" DockPanel.Dock=\"Top\" >\r\n                        <RadioButton TabIndex=\"1\" Content=\"{DynamicResource LOCMetaGameSourceAll}\" Margin=\"10\"                                 \r\n                                     IsChecked=\"{Binding Settings.GamesSource, Converter={StaticResource EnumConverter}, ConverterParameter={x:Static pmp:MetadataGamesSource.AllFromDB}}\"/>\r\n                        <RadioButton TabIndex=\"2\" Content=\"{DynamicResource LOCMetaGameSourceFiltered}\" Margin=\"10\"                                 \r\n                                     IsChecked=\"{Binding Settings.GamesSource, Converter={StaticResource EnumConverter}, ConverterParameter={x:Static pmp:MetadataGamesSource.Filtered}}\"/>\r\n                        <RadioButton TabIndex=\"3\" Content=\"{DynamicResource LOCMetaGameSourceSelected}\" Margin=\"10\"\r\n                                     IsChecked=\"{Binding Settings.GamesSource, Converter={StaticResource EnumConverter}, ConverterParameter={x:Static pmp:MetadataGamesSource.Selected}}\"/>\r\n                    </StackPanel>\r\n\r\n                    <CheckBox Content=\"{DynamicResource LOCMetaSkipNonEmpty}\" ToolTip=\"{DynamicResource LOCMetaSkipNonEmptyTooltip}\"\r\n                              IsChecked=\"{Binding Settings.SkipExistingValues}\"\r\n                              DockPanel.Dock=\"Top\" Margin=\"0,20,0,0\" TabIndex=\"4\" />\r\n\r\n                    <TextBlock Text=\"{DynamicResource LOCMetadownloadSingleGameTip}\" TextWrapping=\"Wrap\"\r\n                               DockPanel.Dock=\"Top\" Margin=\"0,30,0,0\"/>\r\n                </DockPanel>\r\n            </TabItem>\r\n\r\n            <TabItem Visibility=\"Collapsed\">                \r\n                <DockPanel>\r\n                    <TextBlock DockPanel.Dock=\"Top\" Margin=\"15,10,15,10\" TextWrapping=\"Wrap\"\r\n                               Text=\"{DynamicResource LOCMetaDescriptionFields}\"/>\r\n                    <CheckBox Content=\"{DynamicResource LOCSaveAsDefault}\"\r\n                              IsChecked=\"{Binding SaveAsDefault}\"\r\n                              HorizontalAlignment=\"Right\" Height=\"22\"\r\n                              DockPanel.Dock=\"Bottom\" Margin=\"0,0,20,10\"\r\n                              ToolTip=\"{DynamicResource LOCSaveDefaultTooltip}\"\r\n                              ToolTipService.InitialShowDelay=\"0\"/>\r\n                    <ScrollViewer Margin=\"15,0,0,10\" DockPanel.Dock=\"Top\">\r\n                        <pctrls:MetadataDownloadSettings Settings=\"{Binding Settings}\" />\r\n                    </ScrollViewer>\r\n                </DockPanel>\r\n            </TabItem>\r\n        </TabControl>\r\n\r\n        <Border Grid.Column=\"0\" Grid.Row=\"1\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel KeyboardNavigation.TabNavigation=\"Local\" LastChildFill=\"False\" Margin=\"5\">\r\n                <Button Content=\"{DynamicResource LOCCancelLabel}\" Name=\"ButtonClose\" DockPanel.Dock=\"Right\"                        \r\n                        Style=\"{StaticResource BottomButton}\" Command=\"{Binding CancelCommand}\" TabIndex=\"6\"/>\r\n                <Button Content=\"{DynamicResource LOCDownloadMetaButton}\" Name=\"ButtonDownload\" DockPanel.Dock=\"Right\"                        \r\n                        Style=\"{StaticResource BottomButton}\" Command=\"{Binding DownloadCommand}\"\r\n                        Visibility=\"{Binding ShowDownloadButton, Converter={StaticResource BooleanToVisibilityConverter}}\" TabIndex=\"5\"/>\r\n                <Button Content=\"{DynamicResource LOCFinishLabel}\" Name=\"ButtonFinish\" DockPanel.Dock=\"Right\"                        \r\n                        Style=\"{StaticResource BottomButton}\" Command=\"{Binding DownloadCommand}\"\r\n                        Visibility=\"{Binding ShowFinishButton, Converter={StaticResource BooleanToVisibilityConverter}}\" TabIndex=\"4\"/>\r\n                <Button Content=\"{DynamicResource LOCNextLabel}\" Name=\"ButtonNext\" DockPanel.Dock=\"Right\"\r\n                        Command=\"{Binding NextCommand}\"\r\n                        Visibility=\"{Binding ShowNextButton, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                        Style=\"{StaticResource BottomButton}\" TabIndex=\"3\" />\r\n                <Button Content=\"{DynamicResource LOCBackLabel}\" Name=\"ButtonBack\" DockPanel.Dock=\"Right\"\r\n                        Command=\"{Binding BackCommand}\"\r\n                        Visibility=\"{Binding ShowBackButton, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                        Style=\"{StaticResource BottomButton}\" TabIndex=\"2\" />\r\n            </DockPanel>\r\n        </Border>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/MetadataDownloadWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class MetadataDownloadWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new MetadataDownloadWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for EmulatorImportWindow.xaml\r\n    /// </summary>\r\n    public partial class MetadataDownloadWindow : WindowBase\r\n    {\r\n        public MetadataDownloadWindow() : base(nameof(MetadataDownloadWindow), true)\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/MultiItemSelectionWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.MultiItemSelectionWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{Binding HeaderText}\"\r\n        WindowStartupLocation=\"CenterOwner\" SizeToContent=\"WidthAndHeight\"\r\n        d:DesignHeight=\"200\" d:DesignWidth=\"350\" \r\n        MinWidth=\"300\" MinHeight=\"200\" \r\n        MaxWidth=\"600\" MaxHeight=\"800\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\"                     \r\n        Name=\"WindowMultiItemSelectionWindow\">\r\n\r\n    <DockPanel>\r\n        <TextBlock DockPanel.Dock=\"Top\" Margin=\"10\" TextWrapping=\"Wrap\"\r\n                   Text=\"{Binding MessageText}\" Style=\"{StaticResource BaseTextBlockStyle}\"\r\n                   Visibility=\"{Binding MessageText, Converter={StaticResource StringNullOrEmptyToVisibilityConverter}}\"/>\r\n        <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Right\" DockPanel.Dock=\"Bottom\" Margin=\"10\">\r\n            <Button Content=\"{DynamicResource LOCSelect}\"\r\n                    Command=\"{Binding ConfirmCommand}\"/>\r\n            <Button Content=\"{DynamicResource LOCCancelLabel}\" Margin=\"10,0,0,0\"\r\n                    Command=\"{Binding CancelCommand}\"/>\r\n        </StackPanel>\r\n\r\n        <ItemsControl Margin=\"10,0,10,0\" ItemsSource=\"{Binding Items}\">\r\n            <ItemsControl.ItemTemplate>\r\n                <DataTemplate>\r\n                    <CheckBox Content=\"{Binding Name}\" IsChecked=\"{Binding Selected}\"\r\n                              Margin=\"0,5,0,5\"/>\r\n                </DataTemplate>\r\n            </ItemsControl.ItemTemplate>\r\n            <ItemsControl.Template>\r\n                <ControlTemplate>\r\n                    <ScrollViewer Focusable=\"False\"\r\n                                  KeyboardNavigation.DirectionalNavigation=\"None\"\r\n                                  HorizontalScrollBarVisibility=\"Disabled\"\r\n                                  VerticalScrollBarVisibility=\"Auto\"\r\n                                  CanContentScroll=\"True\">\r\n                        <ItemsPresenter />\r\n                    </ScrollViewer>\r\n                </ControlTemplate>\r\n            </ItemsControl.Template>\r\n            <ItemsControl.ItemsPanel>\r\n                <ItemsPanelTemplate>\r\n                    <VirtualizingStackPanel IsVirtualizing=\"True\"\r\n                                            VirtualizationMode=\"Recycling\" />\r\n                </ItemsPanelTemplate>\r\n            </ItemsControl.ItemsPanel>\r\n        </ItemsControl>        \r\n    </DockPanel>    \r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/MultiItemSelectionWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for AboutWindow.xaml\r\n    /// </summary>\r\n    public partial class MultiItemSelectionWindow : WindowBase\r\n    {\r\n        public MultiItemSelectionWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/PluginSettingsWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.PluginSettingsWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.DesktopApp.Windows\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        WindowStartupLocation=\"CenterOwner\"\r\n        Title=\"{Binding Title}\" Height=\"600\" Width=\"700\">\r\n\r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"Closing\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding WindowClosingCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n\r\n    <controls:WindowBase.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <DockPanel>\r\n        <DockPanel DockPanel.Dock=\"Bottom\" LastChildFill=\"False\">\r\n            <Button Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\"\r\n                    Style=\"{StaticResource BottomButton}\" IsCancel=\"True\"\r\n                    Command=\"{Binding CancelCommand}\"/>\r\n            <Button Name=\"ButtonOK\" Content=\"{DynamicResource LOCSaveLabel}\" DockPanel.Dock=\"Right\" \r\n                    Style=\"{StaticResource BottomButton}\"\r\n                    Command=\"{Binding ConfirmCommand}\"/>\r\n        </DockPanel>\r\n        <ContentControl DockPanel.Dock=\"Top\" Content=\"{Binding SettingsView}\"/>\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/PluginSettingsWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class PluginSettingsWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new PluginSettingsWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for PluginSettingsWindow.xaml\r\n    /// </summary>\r\n    public partial class PluginSettingsWindow : WindowBase\r\n    {\r\n        public PluginSettingsWindow()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ProgressWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.ProgressWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"                     \r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        WindowStartupLocation=\"CenterOwner\" ShowInTaskbar=\"True\"\r\n        ShowTitle=\"False\" ShowCloseButton=\"False\"\r\n        ShowMaximizeButton=\"False\" ShowMinimizeButton=\"False\"\r\n        ResizeMode=\"NoResize\" Width=\"400\"\r\n        SizeToContent=\"Height\"\r\n        Title=\"{Binding ProgressArgs.Text}\" BlockAltF4=\"True\"\r\n        AutomationProperties.AutomationId=\"WindowProgress\">\r\n\r\n    <Grid Margin=\"10,-20,10,5\">\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition />\r\n            <RowDefinition />\r\n            <RowDefinition />\r\n        </Grid.RowDefinitions>\r\n        <TextBlock HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" \r\n                   Grid.Row=\"0\" TextWrapping=\"Wrap\" Margin=\"0,10,0,5\"\r\n                   Style=\"{DynamicResource BaseTextBlockStyle}\"                   \r\n                   Text=\"{Binding ProgressArgs.Text}\"/>\r\n        <ProgressBar Height=\"25\"  Grid.Row=\"1\"\r\n                     IsIndeterminate=\"{Binding ProgressArgs.IsIndeterminate}\"\r\n                     Value=\"{Binding ProgressArgs.CurrentProgressValue}\"\r\n                     Maximum=\"{Binding ProgressArgs.ProgressMaxValue}\"\r\n                     Margin=\"0,5,0,5\"/>\r\n        <Button Content=\"{DynamicResource LOCCancelLabel}\"\r\n                Command=\"{Binding CancelCommand}\"\r\n                WindowChrome.IsHitTestVisibleInChrome=\"True\"\r\n                Visibility=\"{Binding Cancelable, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                Margin=\"5,5,0,5\" HorizontalAlignment=\"Right\" Grid.Row=\"2\"/>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ProgressWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Native;\r\nusing System;\r\nusing System.Windows.Interop;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for AboutWindow.xaml\r\n    /// </summary>\r\n    public partial class ProgressWindow : WindowBase\r\n    {\r\n        public ProgressWindow() : base()\r\n        {\r\n            Loaded += ProgressWindow_Loaded;\r\n            InitializeComponent();\r\n        }\r\n\r\n        private void ProgressWindow_Loaded(object sender, System.Windows.RoutedEventArgs e)\r\n        {\r\n            // Disable window title bar menu to prevent user from force closing the dialog\r\n            var hwnd = new WindowInteropHelper(this).Handle;\r\n            User32.SetWindowLong(hwnd, Winuser.GWL_STYLE, User32.GetWindowLong(hwnd, Winuser.GWL_STYLE) & ~Winuser.WS_SYSMENU);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/RandomGameSelectWindow.xaml",
    "content": "﻿<WindowBase x:Class=\"Playnite.DesktopApp.Windows.RandomGameSelectWindow\"\r\n            xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n            xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n            xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n            xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n            mc:Ignorable=\"d\"\r\n            ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\"\r\n            SizeToContent=\"Height\" Width=\"350\"\r\n            d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n            Style=\"{DynamicResource StandardWindowStyle}\"\r\n            WindowStartupLocation=\"CenterOwner\" ShowInTaskbar=\"False\">\r\n    \r\n    <WindowBase.InputBindings>\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CloseCommand}\" />\r\n    </WindowBase.InputBindings>\r\n\r\n    <StackPanel Margin=\"0,10,0,20\">\r\n        <Image Stretch=\"Uniform\" StretchDirection=\"Both\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n               Height=\"200\" HorizontalAlignment=\"Center\">\r\n            <Image.Source>\r\n                <PriorityBinding>\r\n                    <Binding Path=\"SelectedGame.CoverImage\" Converter=\"{StaticResource ImageStringToImageConverterCached}\" />\r\n                    <Binding Source=\"{StaticResource DefaultGameCover}\" />\r\n                </PriorityBinding>\r\n            </Image.Source>\r\n        </Image>\r\n        <TextBlock Text=\"{Binding SelectedGame.Name}\" HorizontalAlignment=\"Center\" Margin=\"0,10,0,20\" \r\n                   Style=\"{StaticResource BaseTextBlockStyle}\" FontSize=\"{StaticResource FontSizeLarge}\"\r\n                   TextTrimming=\"CharacterEllipsis\" />\r\n        <CheckBox Content=\"{DynamicResource LOCRandomGameLimistToFilter}\" HorizontalAlignment=\"Center\"\r\n                  IsChecked=\"{Binding IsLimitedToFilter}\"/>\r\n        <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Center\"\r\n                    Margin=\"0,15,0,0\">\r\n            <Button Content=\"{DynamicResource LOCGameSearchItemActionSwitchTo}\" MinWidth=\"110\"                    \r\n                    Command=\"{Binding NavigateToGameCommand}\"/>\r\n            <Button Content=\"{DynamicResource LOCRandomGamePickAnother}\" Margin=\"10,0,0,0\" MinWidth=\"110\"\r\n                    Command=\"{Binding PickAnotherCommand}\" />\r\n        </StackPanel>\r\n        \r\n        <Button Content=\"{DynamicResource LOCPlayGame}\" HorizontalAlignment=\"Center\"\r\n                Command=\"{Binding PlayGameCommand}\" MinWidth=\"110\" Margin=\"0,10,0,0\"\r\n                Style=\"{StaticResource PlayButton}\" />\r\n    </StackPanel>\r\n</WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/RandomGameSelectWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class RandomGameSelectWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new RandomGameSelectWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for RandomGameSelectWindow.xaml\r\n    /// </summary>\r\n    public partial class RandomGameSelectWindow : WindowBase\r\n    {\r\n        public RandomGameSelectWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/SearchWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.DesktopApp.Windows.SearchWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:i=\"http://schemas.microsoft.com/xaml/behaviors\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:psdk=\"clr-namespace:Playnite.SDK.Plugins;assembly=Playnite.SDK\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        xmlns:pwin=\"clr-namespace:Playnite.DesktopApp.Windows\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource SearchWindowStyle}\"\r\n        Title=\"{DynamicResource LOCSearchTitle}\" ResizeMode=\"NoResize\"\r\n        ShowInTaskbar=\"False\" ShowTitle=\"False\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <KeyBinding Key =\"Esc\" Command=\"{Binding CloseCommand}\" />        \r\n    </c:WindowBase.InputBindings>\r\n\r\n    <c:WindowBase.Resources>\r\n        <p:BindingProxy x:Key=\"BindingProxy\" Data=\"{Binding}\" />\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Storyboard x:Key=\"HintVisibilityOff\">\r\n            <DoubleAnimation Duration=\"0:0:1.0\" From=\"1\" To=\"0\"\r\n                             Storyboard.TargetName=\"TextFilterHint\" Storyboard.TargetProperty=\"Opacity\">\r\n                <DoubleAnimation.EasingFunction>\r\n                    <PowerEase EasingMode=\"EaseIn\" Power=\"10\" />\r\n                </DoubleAnimation.EasingFunction>\r\n            </DoubleAnimation>\r\n        </Storyboard>\r\n        <Storyboard x:Key=\"WaitingAnimation\" RepeatBehavior=\"Forever\">\r\n            <DoubleAnimation Storyboard.TargetName=\"Dot1\" BeginTime=\"0:0:0.1\" Storyboard.TargetProperty=\"Opacity\" From=\".1\" To=\"1\" AutoReverse=\"True\" Duration=\"0:0:0.4\"/>\r\n            <DoubleAnimation Storyboard.TargetName=\"Dot2\" BeginTime=\"0:0:0.2\" Storyboard.TargetProperty=\"Opacity\" From=\".1\" To=\"1\" AutoReverse=\"True\" Duration=\"0:0:0.4\"/>\r\n            <DoubleAnimation Storyboard.TargetName=\"Dot3\" BeginTime=\"0:0:0.3\" Storyboard.TargetProperty=\"Opacity\" From=\".1\" To=\"1\" AutoReverse=\"True\" Duration=\"0:0:0.4\"/>\r\n        </Storyboard>\r\n        <pwin:SearchItemTemplateSelector x:Key=\"SearchItemTemplateSelector\" />\r\n    </c:WindowBase.Resources>\r\n\r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"Closed\" >\r\n            <i:InvokeCommandAction Command=\"{Binding WindowClosedCommand}\" />\r\n        </i:EventTrigger>\r\n        <i:EventTrigger EventName=\"Deactivated\" >\r\n            <i:InvokeCommandAction Command=\"{Binding WindowDeactivatedCommand}\" />\r\n        </i:EventTrigger>\r\n        <i:EventTrigger EventName=\"Closing\" >\r\n            <i:InvokeCommandAction Command=\"{Binding WindowClosingCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n\r\n    <DockPanel Margin=\"0,-25,0,0\">\r\n        <DockPanel DockPanel.Dock=\"Top\" Margin=\"10\">\r\n            <Button Style=\"{DynamicResource SearchWindowSearchLabelButton}\"\r\n                    Content=\"{Binding CurrentContextLabel}\"\r\n                    Command=\"{Binding DeactiveCurrentContextCommand}\"\r\n                    Visibility=\"{Binding CurrentContextLabel, Converter={StaticResource StringNullOrEmptyToVisibilityConverter}}\"\r\n                    AutomationProperties.Name=\"{DynamicResource LOCBackLabel}\" />\r\n\r\n            <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Left\"\r\n                        VerticalAlignment=\"Center\" Margin=\"5,0,5,0\"\r\n                        Visibility=\"{Binding SlowAnimationActive, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                        pbeh:AnimationControl.AnimationOnVisible=\"{StaticResource WaitingAnimation}\">\r\n                <Ellipse Name=\"Dot1\" Fill=\"{StaticResource GlyphBrush}\" Opacity=\".1\" Width=\"8\" Height=\"8\"/>\r\n                <Ellipse Name=\"Dot2\" Fill=\"{StaticResource GlyphBrush}\" Opacity=\".1\" Width=\"8\" Height=\"8\" Margin=\"2,0,0,0\"/>\r\n                <Ellipse Name=\"Dot3\" Fill=\"{StaticResource GlyphBrush}\" Opacity=\".1\" Width=\"8\" Height=\"8\" Margin=\"2,0,0,0\"/>\r\n            </StackPanel>\r\n            <Button DockPanel.Dock=\"Right\" Style=\"{DynamicResource SearchWindowSettignsButton}\"\r\n                    pbeh:LeftClickContextMenuBehavior.Enabled=\"True\"\r\n                    AutomationProperties.Name=\"{DynamicResource LOCSettingsLabel}\">\r\n                <Button.ContextMenu>\r\n                    <ContextMenu Placement=\"Bottom\">\r\n                        <MenuItem Header=\"{DynamicResource LOCSearchFilterUninstalled}\" HeaderStringFormat=\"{}{0} [F2]\"\r\n                                  IsCheckable=\"True\" IsChecked=\"{Binding Data.GameFilterSettings.Uninstalled, Source={StaticResource BindingProxy}}\"/>\r\n                        <MenuItem Header=\"{DynamicResource LOCSearchFilterHidden}\" HeaderStringFormat=\"{}{0} [F3]\"\r\n                                  IsCheckable=\"True\" IsChecked=\"{Binding Data.GameFilterSettings.Hidden, Source={StaticResource BindingProxy}}\" />\r\n                        <MenuItem Header=\"{DynamicResource LOCMenuPlayniteSettingsTitle}\" Command=\"{Binding Data.OpenSearchSettingsCommand, Source={StaticResource BindingProxy}}\" />\r\n                    </ContextMenu>\r\n                </Button.ContextMenu>\r\n            </Button>\r\n            <Button DockPanel.Dock=\"Right\" Style=\"{DynamicResource SearchWindowInfoButton}\"\r\n                    Visibility=\"{Binding CurrentContextHint, Converter={StaticResource StringNullOrEmptyToVisibilityConverter}}\"\r\n                    Command=\"{Binding ToggleHintCommand}\"\r\n                    AutomationProperties.Name=\"{DynamicResource LOCMenuHelpTitle}\"/>\r\n            <ToggleButton DockPanel.Dock=\"Right\" Style=\"{DynamicResource SearchWindowActionButton}\"\r\n                          Command=\"{Binding OpenMenuCommand}\"\r\n                          Content=\"&#xefa2;\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                          IsChecked=\"{Binding MenuAction.Selected, Mode=OneWay}\"\r\n                          Visibility=\"{Binding MenuAction, Converter={StaticResource NullToVisibilityConverter}}\"\r\n                          AutomationProperties.Name=\"{DynamicResource LOCGameMenu}\"/>\r\n            <ToggleButton DockPanel.Dock=\"Right\" Style=\"{DynamicResource SearchWindowActionButton}\"\r\n                          Command=\"{Binding SecondaryActionCommand}\"\r\n                          Content=\"{Binding SelectedSearchItem.SecondaryAction.Name}\"\r\n                          IsChecked=\"{Binding SecondaryAction.Selected, Mode=OneWay}\"\r\n                          Visibility=\"{Binding SecondaryAction, Converter={StaticResource NullToVisibilityConverter}}\"/>\r\n            <ToggleButton DockPanel.Dock=\"Right\" Style=\"{DynamicResource SearchWindowActionButton}\"\r\n                          Command=\"{Binding PrimaryActionCommand}\"\r\n                          Content=\"{Binding SelectedSearchItem.PrimaryAction.Name}\"\r\n                          IsChecked=\"{Binding PrimaryAction.Selected, Mode=OneWay}\"\r\n                          Visibility=\"{Binding PrimaryAction, Converter={StaticResource NullToVisibilityConverter}}\"/>\r\n            <Grid DockPanel.Dock=\"Left\" VerticalAlignment=\"Center\">\r\n                <TextBox Text=\"{Binding SearchTerm, UpdateSourceTrigger=PropertyChanged}\"\r\n                         Style=\"{DynamicResource SearchWindowSearchBox}\"\r\n                         Name=\"TextSearchBox\">\r\n                    <i:Interaction.Triggers>\r\n                        <i:EventTrigger EventName=\"PreviewKeyDown\">\r\n                            <i:InvokeCommandAction Command=\"{Binding TextBoxKeyDownCommand}\" PassEventArgsToCommand=\"True\" />\r\n                        </i:EventTrigger>\r\n                        <i:EventTrigger EventName=\"PreviewKeyUp\">\r\n                            <i:InvokeCommandAction Command=\"{Binding TextBoxKeyUpCommand}\" PassEventArgsToCommand=\"True\" />\r\n                        </i:EventTrigger>\r\n                    </i:Interaction.Triggers>\r\n                </TextBox>\r\n                <TextBlock Style=\"{DynamicResource SearchWindowSearchDescription}\"\r\n                           IsHitTestVisible=\"False\"\r\n                           Visibility=\"{Binding SearchTerm, Converter={StaticResource StringNullOrEmptyToVisibilityConverter}, ConverterParameter=Inverted}\"\r\n                           Text=\"{Binding CurrentSearchProviderDescription}\"/>\r\n                <ContentControl Focusable=\"False\" Visibility=\"Collapsed\" Template=\"{DynamicResource SearchWindowFilterNotification}\"\r\n                                pbeh:AnimatedVisibility.Visibility=\"{Binding FilterHintVisible, Converter={pcon:BooleanToVisibilityConverter}}\"\r\n                                pbeh:AnimatedVisibility.Collapsed=\"{StaticResource HintVisibilityOff}\"\r\n                                Name=\"TextFilterHint\" Content=\"{Binding FilterHint}\"/>\r\n            </Grid>\r\n        </DockPanel>\r\n\r\n        <TextBlock DockPanel.Dock=\"Top\" \r\n                   Style=\"{DynamicResource SearchWindowSearchHint}\"\r\n                   Text=\"{Binding CurrentContextHint}\"\r\n                   Visibility=\"{Binding ContextHintVisible, Converter={pcon:BooleanToVisibilityConverter}}\"/>\r\n\r\n        <ListBox DockPanel.Dock=\"Top\"\r\n                 SelectionMode=\"Single\"\r\n                 pbeh:ScrollToSelectedBehavior.Enabled=\"True\"\r\n                 Style=\"{DynamicResource SearchWindowList}\"\r\n                 SelectedItem=\"{Binding SelectedSearchItem, Mode=TwoWay}\"\r\n                 ItemsSource=\"{Binding SearchResults}\"\r\n                 ItemTemplateSelector=\"{StaticResource SearchItemTemplateSelector}\">\r\n            <i:Interaction.Triggers>\r\n                <i:EventTrigger EventName=\"MouseDoubleClick\" >\r\n                    <i:InvokeCommandAction Command=\"{Binding PrimaryActionCommand}\" />\r\n                </i:EventTrigger>\r\n            </i:Interaction.Triggers>\r\n        </ListBox>\r\n    </DockPanel>    \r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/SearchWindow.xaml.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class SearchWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new SearchWindow();\r\n        }\r\n    }\r\n\r\n    public partial class SearchWindow : WindowBase\r\n    {\r\n        public SearchWindow() : base(\"SearchWindow\", false)\r\n        {\r\n            InitializeComponent();\r\n            Activated += SearchWindow_Activated;\r\n            Loaded += SearchWindow_Loaded;\r\n            TextSearchBox.IsEnabledChanged += TextSearchBox_IsEnabledChanged;\r\n        }\r\n\r\n        private void SearchWindow_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            // Needed because we use manual startup position and default one is \"random\".\r\n            // Manual is needed in case we open this window while Playnite is minimized.\r\n            if (!PositionHandler.HasSavedData())\r\n            {\r\n                var screen = Computer.GetPrimaryScreen();\r\n                var dpi = VisualTreeHelper.GetDpi(this);\r\n                Left = (screen.Bounds.X / dpi.DpiScaleX) + ((screen.Bounds.Width / dpi.DpiScaleX - Width) / 2);\r\n                Top = ((screen.Bounds.Y / dpi.DpiScaleY) + ((screen.Bounds.Height / 2) - Height - Height)) / dpi.DpiScaleY;\r\n            }\r\n        }\r\n\r\n        private void SearchWindow_Activated(object sender, System.EventArgs e)\r\n        {\r\n            this.RestoreWindow();   // Needed in case search is opened while Playnite is not active.\r\n            TextSearchBox.Focus();\r\n        }\r\n\r\n        private void TextSearchBox_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            if (TextSearchBox.IsEnabled)\r\n            {\r\n                TextSearchBox.Focus();\r\n            }\r\n        }\r\n    }\r\n\r\n    public class SearchItemTemplateSelector : DataTemplateSelector\r\n    {\r\n        private readonly DataTemplate gameTemplate;\r\n        private readonly DataTemplate genericTemplate;\r\n\r\n        public SearchItemTemplateSelector()\r\n        {\r\n            gameTemplate = ResourceProvider.GetResource<DataTemplate>(\"SearchWindowGameItemTemplate\");\r\n            genericTemplate = ResourceProvider.GetResource<DataTemplate>(\"SearchWindowSearchItemTemplate\");\r\n        }\r\n\r\n        public override DataTemplate SelectTemplate(object item, DependencyObject container)\r\n        {\r\n            if (item is GameSearchItem)\r\n            {\r\n                return gameTemplate;\r\n            }\r\n            else\r\n            {\r\n                return genericTemplate;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/SettingsWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.SettingsWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        WindowStartupLocation=\"CenterOwner\" ShowInTaskbar=\"False\"\r\n        Width=\"800\" Height=\"620\" MinWidth=\"800\" MinHeight=\"620\"   \r\n        AutomationProperties.AutomationId=\"WindowSettings\">\r\n\r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"Closing\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding WindowClosingCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n\r\n    <controls:WindowBase.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <x:Array Type=\"{x:Type sys:String}\" x:Key=\"DummyArray\">\r\n            <sys:String>Dummy</sys:String>\r\n        </x:Array>\r\n    </controls:WindowBase.Resources>\r\n\r\n    <DockPanel Margin=\"0,5,0,0\">\r\n        <Border DockPanel.Dock=\"Bottom\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{DynamicResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel LastChildFill=\"False\" Margin=\"5\">\r\n                <TextBlock Text=\"{DynamicResource LOCSettingsRestartNotification}\"\r\n                           Margin=\"5,0,0,0\" DockPanel.Dock=\"Left\" VerticalAlignment=\"Center\"\r\n                           Style=\"{DynamicResource BaseTextBlockStyle}\" />\r\n                <Button Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\"\r\n                            Style=\"{StaticResource BottomButton}\" IsCancel=\"True\"\r\n                            Command=\"{Binding CancelCommand}\"/>\r\n                <Button Name=\"ButtonOK\" Content=\"{DynamicResource LOCSaveLabel}\" DockPanel.Dock=\"Right\" \r\n                            Style=\"{StaticResource BottomButton}\"\r\n                            Command=\"{Binding ConfirmCommand}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n\r\n        <Border BorderThickness=\"0,1,0,0\" BorderBrush=\"{DynamicResource WindowPanelSeparatorBrush}\"\r\n                DockPanel.Dock=\"Left\">\r\n            <TreeView MinWidth=\"160\" BorderThickness=\"0\" ScrollViewer.CanContentScroll=\"False\">\r\n                <i:Interaction.Triggers>\r\n                    <i:EventTrigger EventName=\"SelectedItemChanged\" >\r\n                        <prism:InvokeCommandAction Command=\"{Binding SettingsTreeSelectedItemChangedCommand}\" />\r\n                    </i:EventTrigger>\r\n                </i:Interaction.Triggers>\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsGeneralLabel}\" IsSelected=\"True\" Tag=\"{x:Static p:DesktopSettingsPage.General}\" />\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsAppearanceLabel}\" IsExpanded=\"True\" Tag=\"{x:Static p:DesktopSettingsPage.AppearanceGeneral}\">\r\n                    <TreeViewItem Header=\"{DynamicResource LOCSettingsGeneralLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.AppearanceGeneral}\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCSettingsAdvancedLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.AppearanceAdvanced}\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCDetailsViewLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.AppearanceDetailsView}\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCGridViewLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.AppearanceGridView}\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCListViewLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.AppearanceListView}\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCSettingsLayoutLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.AppearanceLayout}\" />\r\n                    <TreeViewItem Header=\"{DynamicResource LOCSettingsTopPanelLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.AppearanceTopPanel}\" />\r\n                </TreeViewItem>\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsSearch}\" Tag=\"{x:Static p:DesktopSettingsPage.Search}\" />\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsUpdating}\" Tag=\"{x:Static p:DesktopSettingsPage.Updates}\" />\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsMetadataLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.Metadata}\" />\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsSortingLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.Sorting}\" />\r\n                <TreeViewItem Header=\"{DynamicResource LOCScripts}\" Tag=\"{x:Static p:DesktopSettingsPage.Scripting}\" />\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsAutoCloseSection}\" Tag=\"{x:Static p:DesktopSettingsPage.ClientShutdown}\" />\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsImportExclusionList}\" Tag=\"{x:Static p:DesktopSettingsPage.ImportExlusionList}\" />\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsBackup}\" Tag=\"{x:Static p:DesktopSettingsPage.Backup}\" />\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsForDevelopers}\" Tag=\"{x:Static p:DesktopSettingsPage.Development}\" />\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsInputLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.Input}\" />\r\n                <TreeViewItem Header=\"{DynamicResource LOCSettingsAdvancedLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.GeneralAdvanced}\" IsExpanded=\"True\">\r\n                    <TreeViewItem Header=\"{DynamicResource LOCSettingsPerformanceLabel}\" Tag=\"{x:Static p:DesktopSettingsPage.Performance}\" />\r\n                </TreeViewItem>\r\n            </TreeView>\r\n        </Border>\r\n\r\n        <Border DockPanel.Dock=\"Left\" BorderThickness=\"1,1,0,0\"\r\n                BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <ContentControl Content=\"{Binding SelectedSectionView}\"/>\r\n        </Border>\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/SettingsWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System.Collections;\r\nusing System.Collections.Generic;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class SettingsWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new SettingsWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for Configuration.xaml\r\n    /// </summary>\r\n    public partial class SettingsWindow : WindowBase\r\n    {\r\n        private WindowPositionHandler positionManager;\r\n\r\n        public SettingsWindow() : base(nameof(SettingsWindow), true)\r\n        {\r\n            InitializeComponent();\r\n            if (PlayniteApplication.Current.AppSettings != null)\r\n            {\r\n                positionManager = new WindowPositionHandler(this, \"SettingsWindow\", PlayniteApplication.Current.AppSettings.WindowPositions);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/SingleItemSelectionWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.SingleItemSelectionWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n        xmlns:pcmd=\"clr-namespace:Playnite.Commands;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        WindowStartupLocation=\"CenterOwner\" SizeToContent=\"WidthAndHeight\"\r\n        d:DesignHeight=\"200\" d:DesignWidth=\"350\" MinWidth=\"300\" MaxHeight=\"700\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\">\r\n\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/SingleItemSelectionWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for AboutWindow.xaml\r\n    /// </summary>\r\n    public partial class SingleItemSelectionWindow : WindowBase\r\n    {\r\n        public SingleItemSelectionWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ToolsConfigWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.ToolsConfigWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.DesktopApp.Markup\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.DesktopApp.Controls\"\r\n        xmlns:sdkModel=\"clr-namespace:Playnite.SDK.Models;assembly=Playnite.SDK\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCMenuSoftwareTools}\"\r\n        WindowStartupLocation=\"CenterOwner\" ShowInTaskbar=\"False\"\r\n        Height=\"600\" Width=\"800\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\">\r\n\r\n    <controls:WindowBase.Resources>\r\n        <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        <Thickness x:Key=\"EditSeparatorMargin\">5,5,5,7</Thickness>\r\n    </controls:WindowBase.Resources>\r\n\r\n    <DockPanel>\r\n        <Border DockPanel.Dock=\"Bottom\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{DynamicResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel LastChildFill=\"False\" Margin=\"5\">\r\n                <Button Name=\"ButtonCancel\" Content=\"{DynamicResource LOCCancelLabel}\" DockPanel.Dock=\"Right\"\r\n                        Style=\"{StaticResource BottomButton}\" IsCancel=\"True\"\r\n                        Command=\"{Binding CancelCommand}\"/>\r\n                <Button Name=\"ButtonOK\" Content=\"{DynamicResource LOCSaveLabel}\" DockPanel.Dock=\"Right\" \r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding ConfirmCommand}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n        \r\n        <Grid Margin=\"5\" DockPanel.Dock=\"Top\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"4*\"/>\r\n                <ColumnDefinition Width=\"7*\"/>\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition />\r\n            </Grid.RowDefinitions>\r\n\r\n            <DockPanel Grid.Column=\"0\">\r\n                <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\r\n                    <Button Content=\"{DynamicResource LOCAddTitle}\"\r\n                            Margin=\"0,5,0,5\"\r\n                            Command=\"{Binding AddAppCommand}\"/>\r\n                    <Button Content=\"{DynamicResource LOCAddFromExe}\"\r\n                            Margin=\"5,5,0,5\"\r\n                            Command=\"{Binding AddAppFromExeCommand}\"/>\r\n                    <Button Content=\"{DynamicResource LOCRemoveTitle}\"\r\n                            Margin=\"5,5,0,5\"\r\n                            Command=\"{Binding RemoveAppCommand}\"\r\n                            CommandParameter=\"{Binding SelectedApp}\"/>\r\n                </StackPanel>\r\n                <ListBox DockPanel.Dock=\"Top\" Name=\"ListTools\"\r\n                         DisplayMemberPath=\"Name\"\r\n                         ItemsSource=\"{Binding EditingApps}\"\r\n                         SelectedItem=\"{Binding SelectedApp, Mode=TwoWay}\"/>\r\n            </DockPanel>\r\n\r\n            <DockPanel Grid.Column=\"1\" DataContext=\"{Binding SelectedApp}\" Margin=\"5,0,0,0\"\r\n                        IsEnabled=\"{Binding SelectedItem, ElementName=ListTools, Converter={StaticResource NullToBoolConverter}}\">\r\n                <TextBlock Text=\"{DynamicResource LOCTypeLabel}\" Margin=\"5,5,5,0\" DockPanel.Dock=\"Top\"  />\r\n                <ComboBox Margin=\"5\" DockPanel.Dock=\"Top\"\r\n                          SelectedValue=\"{Binding AppType}\"\r\n                          pbeh:SelectorBehaviors.EnumSource=\"{x:Type sdkModel:AppSoftwareType}\"/>\r\n\r\n                <TextBlock Text=\"{DynamicResource LOCNameLabel}\" Margin=\"5,0,5,0\" DockPanel.Dock=\"Top\"  />\r\n                <TextBox Margin=\"5\" DockPanel.Dock=\"Top\"\r\n                         Text=\"{Binding Name, UpdateSourceTrigger=PropertyChanged}\"/>\r\n\r\n                <TextBlock Text=\"{DynamicResource LOCPathLabel}\" Margin=\"5,0,5,0\" DockPanel.Dock=\"Top\"\r\n                           Visibility=\"{Binding AppType, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static sdkModel:AppSoftwareType.Standard}}\"  />\r\n                <pctrls:PathSelectionBox Margin=\"5\" ShowFileSelector=\"True\" DockPanel.Dock=\"Top\"\r\n                                         Text=\"{Binding Path, UpdateSourceTrigger=PropertyChanged}\"\r\n                           Visibility=\"{Binding AppType, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static sdkModel:AppSoftwareType.Standard}}\"/>\r\n\r\n                <TextBlock Text=\"{DynamicResource LOCArgumentsTitle}\" Margin=\"5,0,5,0\" DockPanel.Dock=\"Top\"\r\n                           Visibility=\"{Binding AppType, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static sdkModel:AppSoftwareType.Standard}}\"  />\r\n                <TextBox Margin=\"5\" DockPanel.Dock=\"Top\"\r\n                         Text=\"{Binding Arguments, UpdateSourceTrigger=PropertyChanged}\"\r\n                           Visibility=\"{Binding AppType, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static sdkModel:AppSoftwareType.Standard}}\"/>\r\n\r\n                <TextBlock Text=\"{DynamicResource LOCWorkingDirTitle}\" Margin=\"5,0,5,0\" DockPanel.Dock=\"Top\"\r\n                           Visibility=\"{Binding AppType, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static sdkModel:AppSoftwareType.Standard}}\"  />\r\n                <pctrls:PathSelectionBox Margin=\"5\" ShowDirectorySelector=\"True\" DockPanel.Dock=\"Top\"\r\n                                         Text=\"{Binding WorkingDir, UpdateSourceTrigger=PropertyChanged}\"\r\n                           Visibility=\"{Binding AppType, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static sdkModel:AppSoftwareType.Standard}}\"/>\r\n\r\n                <CheckBox Content=\"{DynamicResource LOCToolsShowOnSidebar}\" Margin=\"5\" DockPanel.Dock=\"Top\"\r\n                          IsChecked=\"{Binding ShowOnSidebar}\" />\r\n\r\n                <TextBlock Text=\"{DynamicResource LOCGameIconTitle}\" Margin=\"5,5,5,0\" DockPanel.Dock=\"Top\" />    \r\n                <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\">\r\n                    <Button Content=\"{DynamicResource LOCSelectIconTitle}\"\r\n                            Margin=\"5\" MaxWidth=\"160\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Top\"\r\n                            Command=\"{Binding DataContext.SelectIconCommand, RelativeSource={RelativeSource AncestorType=Grid}}\"\r\n                            CommandParameter=\"{Binding}\"/>\r\n                    <Button Content=\"{DynamicResource LOCRemoveLabel}\" Margin=\"5\" VerticalAlignment=\"Top\"\r\n                            Command=\"{Binding DataContext.RemoveIconCommand, RelativeSource={RelativeSource AncestorType=Grid}}\"\r\n                            CommandParameter=\"{Binding}\"/>\r\n                    <Image Stretch=\"Uniform\" StretchDirection=\"DownOnly\"\r\n                        RenderOptions.BitmapScalingMode=\"Fant\"\r\n                        Margin=\"5,5,0,0\"\r\n                        MaxHeight=\"64\" MaxWidth=\"64\" HorizontalAlignment=\"Left\"\r\n                        Source=\"{Binding Icon, Mode=OneWay, Converter={StaticResource ImageStringToImageConverterCached}}\" />\r\n                </StackPanel>\r\n                <TextBlock Text=\"{DynamicResource LOCGameActionTypeScript}\" DockPanel.Dock=\"Top\" Margin=\"5,0,5,0\"\r\n                           Visibility=\"{Binding AppType, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static sdkModel:AppSoftwareType.Script}}\"/>\r\n                <TextBox AcceptsReturn=\"True\" DockPanel.Dock=\"Top\" Margin=\"5\"\r\n                         FontFamily=\"{DynamicResource MonospaceFontFamily}\"\r\n                         HorizontalScrollBarVisibility=\"Auto\"\r\n                         VerticalScrollBarVisibility=\"Visible\"\r\n                         Text=\"{Binding Script, UpdateSourceTrigger=PropertyChanged}\"\r\n                         Visibility=\"{Binding AppType, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static sdkModel:AppSoftwareType.Script}}\" />\r\n            </DockPanel>            \r\n        </Grid>\r\n    </DockPanel>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/ToolsConfigWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    public class ToolsConfigWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new ToolsConfigWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for ToolsConfigWindow.xaml\r\n    /// </summary>\r\n    public partial class ToolsConfigWindow : WindowBase\r\n    {\r\n        public ToolsConfigWindow() : base(nameof(ToolsConfigWindow), true)\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/UpdateWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.DesktopApp.Windows.UpdateWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:html=\"clr-namespace:TheArtOfDev.HtmlRenderer.WPF;assembly=HtmlRenderer.WPF\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"                     \r\n        d:DesignStyle=\"{StaticResource WindowDesignStyle}\"\r\n        Style=\"{DynamicResource StandardWindowStyle}\"\r\n        Title=\"{DynamicResource LOCUpdaterWindowTitle}\" Height=\"500\" Width=\"600\" WindowStartupLocation=\"CenterOwner\"\r\n        ShowInTaskbar=\"True\" ShowCloseButton=\"False\" ShowMaximizeButton=\"False\" ShowMinimizeButton=\"False\">\r\n    \r\n    <Grid>\r\n        <Grid.RowDefinitions>\r\n            <RowDefinition Height=\"*\"/>\r\n            <RowDefinition Height=\"Auto\"/>\r\n        </Grid.RowDefinitions>\r\n\r\n        <DockPanel Background=\"{StaticResource ControlBackgroundBrush}\" Grid.Row=\"0\" Margin=\"5,5,5,0\">\r\n            <TextBlock Text=\"{DynamicResource LOCUpdaterChangesInfo}\"\r\n                       Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                       Margin=\"10\" DockPanel.Dock=\"Top\"/>\r\n            <ScrollViewer DockPanel.Dock=\"Top\">\r\n                <ItemsControl Name=\"ItemsNotes\" ItemsSource=\"{Binding ReleaseNotes}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <DockPanel Margin=\"10,5,10,15\">\r\n                                <Border BorderThickness=\"0,0,0,1\" BorderBrush=\"{StaticResource NormalBorderBrush}\" DockPanel.Dock=\"Top\">\r\n                                    <TextBlock Text=\"{Binding Version}\"  Margin=\"0,5,0,5\"\r\n                                               Style=\"{DynamicResource BaseTextBlockStyle}\" FontWeight=\"Bold\" />\r\n                                </Border>\r\n                                <html:HtmlPanel Text=\"{Binding Note}\" Foreground=\"White\" Margin=\"0,10,0,0\"\r\n                                            Background=\"Transparent\" DockPanel.Dock=\"Top\"\r\n                                            ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\r\n                                            ScrollViewer.VerticalScrollBarVisibility=\"Disabled\"\r\n                                            HorizontalAlignment=\"Left\"/>\r\n                            </DockPanel>\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n            </ScrollViewer>\r\n        </DockPanel>\r\n        <Border Grid.Column=\"0\" Grid.Row=\"1\" BorderThickness=\"0,1,0,0\" BorderBrush=\"{StaticResource WindowPanelSeparatorBrush}\">\r\n            <DockPanel LastChildFill=\"False\" Margin=\"5\">\r\n                <ProgressBar Value=\"{Binding UpdateProgress}\" Maximum=\"100\" Height=\"25\"\r\n                             Visibility=\"{Binding ShowProgress, Converter={pcon:BooleanToVisibilityConverter}}\"\r\n                             DockPanel.Dock=\"Top\" Margin=\"5\"/>\r\n                <Button Name=\"ButtonClose\" Content=\"{DynamicResource LOCCloseLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                        IsEnabled=\"{Binding ShowProgress, Converter={pcon:NegateConverter}}\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding CloseCommand}\"/>\r\n                <Button Name=\"ButtonInstall\" Content=\"{DynamicResource LOCUpdaterInstallUpdate}\" DockPanel.Dock=\"Right\"\r\n                        IsEnabled=\"{Binding ShowProgress, Converter={pcon:NegateConverter}}\"\r\n                        Style=\"{StaticResource BottomButton}\"\r\n                        Command=\"{Binding InstallUpdateCommand}\"/>\r\n            </DockPanel>\r\n        </Border>\r\n    </Grid>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/Windows/UpdateWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\n\r\nnamespace Playnite.DesktopApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for UpdateWindow.xaml\r\n    /// </summary>\r\n    public partial class UpdateWindow : WindowBase\r\n    {\r\n        public UpdateWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/app.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n  <assemblyIdentity version=\"1.0.0.0\" name=\"Playnite.DesktopApp\"/>\r\n  <trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\">\r\n    <security>\r\n      <requestedPrivileges xmlns=\"urn:schemas-microsoft-com:asm.v3\">\r\n        <requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\r\n      </requestedPrivileges>\r\n    </security>\r\n  </trustInfo>\r\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\r\n    <windowsSettings xmlns:ws2=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">\r\n      <ws2:longPathAware>true</ws2:longPathAware>\r\n    </windowsSettings>\r\n  </application>\r\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\r\n    <application>\r\n      <!-- Windows 7 -->\r\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" />\r\n      <!-- Windows 8 -->\r\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" />\r\n      <!-- Windows 8.1 -->\r\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" />\r\n      <!-- Windows 10 -->\r\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />\r\n    </application>\r\n  </compatibility>\r\n</assembly>\r\n"
  },
  {
    "path": "source/Playnite.DesktopApp/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"CommandLineParser\" version=\"2.8.0\" targetFramework=\"net462\" />\r\n  <package id=\"CommonServiceLocator\" version=\"1.3\" targetFramework=\"net462\" />\r\n  <package id=\"Expression.Blend.Sdk\" version=\"1.0.2\" targetFramework=\"net462\" />\r\n  <package id=\"Hardcodet.NotifyIcon.Wpf\" version=\"1.0.8\" targetFramework=\"net462\" />\r\n  <package id=\"LargeAddressAware\" version=\"1.0.5\" targetFramework=\"net462\" />\r\n  <package id=\"Microsoft.Xaml.Behaviors.Wpf\" version=\"1.1.39\" targetFramework=\"net462\" />\r\n  <package id=\"Prism.Core\" version=\"6.3.0\" targetFramework=\"net462\" />\r\n  <package id=\"Prism.Wpf\" version=\"6.3.0\" targetFramework=\"net462\" />\r\n  <package id=\"System.IO.Abstractions\" version=\"2.1.0.227\" targetFramework=\"net462\" />\r\n  <package id=\"System.ValueTuple\" version=\"4.5.0\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Api/MainViewAPI.cs",
    "content": "﻿using Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Threading;\r\n\r\nnamespace Playnite.FullscreenApp.API\r\n{\r\n    public class MainViewAPI : IMainViewAPI\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private FullscreenAppViewModel mainModel;\r\n\r\n        public IEnumerable<Game> SelectedGames\r\n        {\r\n            get\r\n            {\r\n                if (mainModel.SelectedGames == null && mainModel.SelectedGame != null)\r\n                {\r\n                    return new List<Game>() { mainModel.SelectedGame.Game };\r\n                }\r\n                else\r\n                {\r\n                    return mainModel.SelectedGames?.Where(a => a != null).Select(a => a.Game).ToList();\r\n                }\r\n            }\r\n        }\r\n\r\n        public DesktopView ActiveDesktopView\r\n        {\r\n            get => DesktopView.Details;\r\n            set { }\r\n        }\r\n\r\n        public FullscreenView ActiveFullscreenView\r\n        {\r\n            get => mainModel.GameDetailsVisible ? FullscreenView.Details : FullscreenView.List;\r\n        }\r\n\r\n        public SortOrder SortOrder\r\n        {\r\n            get => mainModel.AppSettings.Fullscreen.ViewSettings.SortingOrder;\r\n            set => mainModel.AppSettings.Fullscreen.ViewSettings.SortingOrder = value;\r\n        }\r\n\r\n        public SortOrderDirection SortOrderDirection\r\n        {\r\n            get => mainModel.AppSettings.Fullscreen.ViewSettings.SortingOrderDirection;\r\n            set => mainModel.AppSettings.Fullscreen.ViewSettings.SortingOrderDirection = value;\r\n        }\r\n\r\n        public GroupableField Grouping\r\n        {\r\n            get => GroupableField.None;\r\n            set { }\r\n        }\r\n\r\n        public List<Game> FilteredGames => mainModel.GamesView.CollectionView.Cast<GamesCollectionViewEntry>().Select(a => a.Game).Distinct().ToList();\r\n\r\n        public Dispatcher UIDispatcher => PlayniteApplication.CurrentNative.Dispatcher;\r\n\r\n        public MainViewAPI(FullscreenAppViewModel mainModel)\r\n        {\r\n            this.mainModel = mainModel;\r\n        }\r\n\r\n        public bool OpenPluginSettings(Guid pluginId)\r\n        {\r\n            throw new NotSupportedInFullscreenException(\"Cannot open plugin settings in Fullscreen mode.\");\r\n        }\r\n\r\n        public void SwitchToLibraryView()\r\n        {\r\n            throw new NotSupportedInFullscreenException();\r\n        }\r\n\r\n        public void SelectGame(Guid gameId)\r\n        {\r\n            var game = mainModel.Database.Games.Get(gameId);\r\n            if (game == null)\r\n            {\r\n                logger.Error($\"Can't select game, game ID {gameId} not found.\");\r\n            }\r\n            else\r\n            {\r\n                mainModel.SelectGame(game.Id);\r\n            }\r\n        }\r\n\r\n        public void SelectGames(IEnumerable<Guid> gameIds)\r\n        {\r\n            throw new NotSupportedInFullscreenException();\r\n        }\r\n\r\n        public void ApplyFilterPreset(Guid filterId)\r\n        {\r\n            mainModel.ApplyFilterPreset(filterId);\r\n        }\r\n\r\n        public void ApplyFilterPreset(FilterPreset preset)\r\n        {\r\n            mainModel.ActiveFilterPreset = preset;\r\n        }\r\n\r\n        public Guid GetActiveFilterPreset()\r\n        {\r\n            return mainModel.AppSettings.Fullscreen.SelectedFilterPreset;\r\n        }\r\n\r\n        public FilterPresetSettings GetCurrentFilterSettings()\r\n        {\r\n            return mainModel.AppSettings.Fullscreen.FilterSettings.AsPresetSettings();\r\n        }\r\n\r\n        public void OpenSearch(string searchTerm)\r\n        {\r\n            throw new NotSupportedInFullscreenException();\r\n        }\r\n\r\n        public void OpenSearch(SearchContext context, string searchTerm)\r\n        {\r\n            throw new NotSupportedInFullscreenException();\r\n        }\r\n\r\n        public bool? OpenEditDialog(Guid gameId)\r\n        {\r\n            throw new NotSupportedInFullscreenException();\r\n        }\r\n\r\n        public bool? OpenEditDialog(List<Guid> gameIds)\r\n        {\r\n            throw new NotSupportedInFullscreenException();\r\n        }\r\n\r\n        public List<FilterPreset> GetSortedFilterPresets()\r\n        {\r\n            return mainModel.SortedFilterPresets.ToList();\r\n        }\r\n\r\n        public List<FilterPreset> GetSortedFilterFullscreenPresets()\r\n        {\r\n            return mainModel.SortedFilterFullscreenPresets.ToList();\r\n        }\r\n\r\n        public void ToggleFullscreenView()\r\n        {\r\n            UIDispatcher.Invoke(() => mainModel.ToggleGameDetailsCommand?.Execute(null));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n  <startup> \r\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\" />\r\n  </startup>\r\n  <appSettings file=\"Common.config\">\r\n  </appSettings>\r\n  <runtime>\r\n    <enforceFIPSPolicy enabled=\"false\" />\r\n    <loadFromRemoteSources enabled=\"True\" />\r\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.4.0\" newVersion=\"4.1.4.0\" />\r\n      </dependentAssembly>\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Runtime.InteropServices.RuntimeInformation\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.2.0\" newVersion=\"4.0.2.0\" />\r\n      </dependentAssembly>\r\n    </assemblyBinding>\r\n  </runtime>\r\n</configuration>"
  },
  {
    "path": "source/Playnite.FullscreenApp/App.xaml",
    "content": "﻿<Application x:Class=\"Playnite.FullscreenApp.App\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n    \r\n    <Application.Resources>\r\n        <ResourceDictionary>\r\n            <ResourceDictionary.MergedDictionaries>\r\n                <ResourceDictionary Source=\"/Playnite;component/Localization/LocSource.xaml\"/>\r\n                <ResourceDictionary Source=\"GlobalResources.xaml\" />\r\n                <ResourceDictionary Source=\"ControlGalleryView.xaml\" />\r\n                <ResourceDictionary Source=\"HiddenStyles.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Constants.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Media.xaml\" />\r\n                \r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Images/ButtonPrompts/Xbox/Xbox.xaml\" />\r\n\r\n                <!--Default Controls-->\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DefaultControls/TextBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DefaultControls/Slider.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DefaultControls/CheckBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DefaultControls/ComboBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DefaultControls/Button.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DefaultControls/ScrollViewer.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DefaultControls/ToolTip.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DefaultControls/ProgressBar.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DefaultControls/ToggleButton.xaml\" />\r\n\r\n                <!--Custom Controls-->\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/CustomControls/FilterEnumListSelection.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/CustomControls/FilterStringListSelection.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/CustomControls/FilterDbItemtSelection.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/CustomControls/FilterPresetSelector.xaml\" />\r\n\r\n                <!--Derived Styles-->\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DerivedStyles/ListGameItemStyle.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DerivedStyles/ListGameItemTemplate.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DerivedStyles/ButtonBottomMenu.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/DerivedStyles/ButtonTopMenu.xaml\" />\r\n\r\n                <!--Views-->\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/FiltersAdditional.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/FiltersView.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/GameDetails.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/GameMenu.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/GameStatus.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/Main.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/MainMenu.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/HelpMenu.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/MessageBox.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/NotificationsMenu.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/SettingsMenus.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/TextInput.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/ItemSelection.xaml\" />\r\n                <ResourceDictionary Source=\"Themes/Fullscreen/Default/Views/CustomMenus.xaml\" />\r\n            </ResourceDictionary.MergedDictionaries>\r\n        </ResourceDictionary>\r\n    </Application.Resources>\r\n</Application>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/App.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Configuration;\r\nusing System.Data;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for App.xaml\r\n    /// </summary>\r\n    public partial class App : Application\r\n    {\r\n        public App()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Commands/GlobalCommands.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp\r\n{\r\n    public class NavigateUrlCommand : RelayCommand<object>\r\n    {\r\n        public NavigateUrlCommand() : base(Navigate)\r\n        {\r\n        }\r\n\r\n        public static void Navigate(object link)\r\n        {\r\n            if (FullscreenApplication.Current.Dialogs.ShowMessage(\r\n                string.Format(ResourceProvider.GetString(\"LOCUrlNavigationMessage\"), link.ToString()),\r\n                string.Empty,\r\n                MessageBoxButton.YesNo) == MessageBoxResult.Yes)\r\n            {\r\n                GlobalCommands.NavigateUrl(link);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ControlGalleryView.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"ControlGalleryContentStyle\" TargetType=\"{x:Type ContentControl}\">        \r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ContentControl}\">\r\n                    <DockPanel Background=\"{DynamicResource MainBackgourndBrush}\"\r\n                               d:DesignWidth=\"800\" d:DesignHeight=\"700\">\r\n                        <StackPanel>\r\n                            <pctrls:ButtonEx Content=\"Test\" Margin=\"10\" />\r\n                            <pctrls:CheckBoxEx Content=\"Test\" Margin=\"10\" />\r\n                            <pctrls:ComboBoxEx Margin=\"10\" />\r\n                            <pctrls:SliderEx Minimum=\"0\" MaxHeight=\"10\" Value=\"5\" Margin=\"10\" />\r\n                            <pctrls:ToggleButtonEx Content=\"Test\" Margin=\"10\" />\r\n                        </StackPanel>\r\n                    </DockPanel>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/ButtonEx.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\nusing Playnite.Input;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    public class ButtonEx : Button\r\n    {\r\n        public string TooltipEx\r\n        {\r\n            get\r\n            {\r\n                return (string)GetValue(TooltipExProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(TooltipExProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty TooltipExProperty = DependencyProperty.Register(\r\n            nameof(TooltipEx),\r\n            typeof(string),\r\n            typeof(ButtonEx),\r\n            new PropertyMetadata(null));\r\n\r\n        public object InputHint\r\n        {\r\n            get\r\n            {\r\n                return (string)GetValue(InputHintProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(InputHintProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty InputHintProperty = DependencyProperty.Register(\r\n            nameof(InputHint),\r\n            typeof(object),\r\n            typeof(ButtonEx),\r\n            new PropertyMetadata(null));\r\n\r\n        static ButtonEx()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ButtonEx), new FrameworkPropertyMetadata(typeof(ButtonEx)));\r\n        }\r\n\r\n        public ButtonEx() : base()\r\n        {\r\n            KeyDown += Ex_KeyDown;\r\n            GotFocus += ButtonEx_GotFocus;\r\n            LostFocus += ButtonEx_LostFocus;\r\n        }\r\n\r\n        private void ButtonEx_LostFocus(object sender, RoutedEventArgs e)\r\n        {\r\n            if (!TooltipEx.IsNullOrEmpty() && ToolTip is ToolTip tooltip)\r\n            {\r\n                tooltip.StaysOpen = false;\r\n                tooltip.IsOpen = false;\r\n                ToolTip = null;\r\n            }\r\n        }\r\n\r\n        private void ButtonEx_GotFocus(object sender, RoutedEventArgs e)\r\n        {\r\n            if (!TooltipEx.IsNullOrEmpty())\r\n            {\r\n                var tooltipObj = new ToolTip\r\n                {\r\n                    Content = TooltipEx,\r\n                    StaysOpen = true,\r\n                    IsOpen = true,\r\n                    PlacementTarget = this,\r\n                    Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom\r\n                };\r\n\r\n                ToolTip = tooltipObj;\r\n            }\r\n        }\r\n\r\n        private void Ex_KeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            if (e is GameControllerInputEventArgs controllerInput)\r\n            {\r\n                if (controllerInput.Button == GameControllerGesture.ConfirmationBinding)\r\n                {\r\n                    OnClick();\r\n                    e.Handled = true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/CheckBoxEx.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\nusing Playnite.Input;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    public class CheckBoxEx : CheckBox\r\n    {\r\n        static CheckBoxEx()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(CheckBoxEx), new FrameworkPropertyMetadata(typeof(CheckBoxEx)));\r\n        }\r\n\r\n        public CheckBoxEx() : base()\r\n        {\r\n            KeyDown += Ex_KeyDown;\r\n        }\r\n\r\n        private void Ex_KeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            if (e is GameControllerInputEventArgs controllerInput)\r\n            {\r\n                if (controllerInput.Button == GameControllerGesture.ConfirmationBinding)\r\n                {\r\n                    OnClick();\r\n                    e.Handled = true;\r\n                }\r\n            }\r\n            else if (e.Key == Key.Enter)\r\n            {\r\n                OnClick();\r\n                e.Handled = true;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/ComboBoxEx.cs",
    "content": "﻿using Playnite.Input;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    public class ComboBoxEx : ComboBox\r\n    {\r\n        static ComboBoxEx()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ComboBoxEx), new FrameworkPropertyMetadata(typeof(ComboBoxEx)));\r\n        }\r\n\r\n        public ComboBoxEx() : base()\r\n        {\r\n            PreviewKeyDown += ComboBoxEx_PreviewKeyDown;\r\n            KeyDown += ComboBoxEx_KeyDown;\r\n        }\r\n\r\n        private void ComboBoxEx_KeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            if (e is GameControllerInputEventArgs controllerInput)\r\n            {\r\n                if (controllerInput.Button == GameControllerGesture.ConfirmationBinding)\r\n                {\r\n                    if (IsDropDownOpen)\r\n                    {\r\n                        OnKeyDown(new KeyEventArgs(e.KeyboardDevice, e.InputSource, e.Timestamp, Key.Enter) { RoutedEvent = Keyboard.KeyDownEvent });\r\n                    }\r\n                    else\r\n                    {\r\n                        OnKeyDown(new KeyEventArgs(e.KeyboardDevice, e.InputSource, e.Timestamp, Key.F4) { RoutedEvent = Keyboard.KeyDownEvent });\r\n                    }\r\n                    e.Handled = true;\r\n                }\r\n                else if (controllerInput.Button == GameControllerGesture.CancellationBinding)\r\n                {\r\n                    if (IsDropDownOpen)\r\n                    {\r\n                        OnKeyDown(new KeyEventArgs(e.KeyboardDevice, e.InputSource, e.Timestamp, Key.Escape) { RoutedEvent = Keyboard.KeyDownEvent });\r\n                        e.Handled = true;\r\n                    }\r\n                }\r\n            }\r\n            else if (e.Key == Key.Enter)\r\n            {\r\n                IsDropDownOpen = !IsDropDownOpen;\r\n                e.Handled = true;\r\n            }\r\n        }\r\n\r\n        private void ComboBoxEx_PreviewKeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            if (e.Key == Key.Down && !IsDropDownOpen)\r\n            {\r\n                MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));\r\n                e.Handled = true;\r\n            }\r\n            else if (e.Key == Key.Up && !IsDropDownOpen)\r\n            {\r\n                MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));\r\n                e.Handled = true;\r\n            }\r\n            else if (e.Key == Key.Space && !IsDropDownOpen)\r\n            {\r\n                IsDropDownOpen = true;\r\n                e.Handled = true;\r\n            }\r\n            else if (e.Key == Key.Back && IsDropDownOpen)\r\n            {\r\n                IsDropDownOpen = false;\r\n                e.Handled = true;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/FilterDbItemtSelection.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.Input;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Automation;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\nusing System.Xml.Linq;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_MenuHost\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ButtonBack\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ButtonClear\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ItemsHost\", Type = typeof(ItemsControl))]\r\n    public class FilterDbItemtSelection : Control, IDisposable\r\n    {\r\n        private bool isPrimaryFilter = false;\r\n        private FullscreenAppViewModel mainModel;\r\n        private FrameworkElement MenuHost;\r\n        private ButtonBase ButtonBack;\r\n        private ButtonBase ButtonClear;\r\n        private ItemsControl ItemsHost;\r\n\r\n        internal bool IgnoreChanges { get; set; }\r\n        public string Title { get; set; }\r\n\r\n        public SelectableIdItemList ItemsList\r\n        {\r\n            get\r\n            {\r\n                return (SelectableIdItemList)GetValue(ItemsListProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ItemsListProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ItemsListProperty = DependencyProperty.Register(\r\n            nameof(ItemsList),\r\n            typeof(SelectableIdItemList),\r\n            typeof(FilterDbItemtSelection),\r\n            new PropertyMetadata(null, ItemsListPropertyChangedCallback));\r\n\r\n        private static void ItemsListPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var box = sender as FilterDbItemtSelection;\r\n            if (box.IgnoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var list = (SelectableIdItemList)e.NewValue;\r\n            if (list == null)\r\n            {\r\n                var oldList = (SelectableIdItemList)e.OldValue;\r\n                oldList.SelectionChanged -= box.List_SelectionChanged;\r\n            }\r\n            else\r\n            {\r\n                box.IgnoreChanges = true;\r\n                list.SelectionChanged += box.List_SelectionChanged;\r\n                if (box.FilterProperties != null)\r\n                {\r\n                    list.SetSelection(box.FilterProperties.Ids);\r\n                }\r\n\r\n                box.IgnoreChanges = false;\r\n            }\r\n        }\r\n\r\n        public void List_SelectionChanged(object sender, EventArgs e)\r\n        {\r\n            if (!IgnoreChanges)\r\n            {\r\n                IgnoreChanges = true;\r\n                FilterProperties = new IdItemFilterItemProperties { Ids = ItemsList.GetSelectedIds() };\r\n                IgnoreChanges = false;\r\n            }\r\n        }\r\n\r\n        public IdItemFilterItemProperties FilterProperties\r\n        {\r\n            get\r\n            {\r\n                return (IdItemFilterItemProperties)GetValue(FilterPropertiesProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(FilterPropertiesProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty FilterPropertiesProperty = DependencyProperty.Register(\r\n            nameof(FilterProperties),\r\n            typeof(IdItemFilterItemProperties),\r\n            typeof(FilterDbItemtSelection),\r\n            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, FilterPropertiesPropertyChangedCallback));\r\n\r\n        private static void FilterPropertiesPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var box = sender as FilterDbItemtSelection;\r\n            if (box.IgnoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            box.IgnoreChanges = true;\r\n            if (box.FilterProperties != null && box.FilterProperties.Text.IsNullOrEmpty())\r\n            {\r\n                box.ItemsList?.SetSelection(box.FilterProperties.Ids);\r\n            }\r\n            else if (box.FilterProperties == null)\r\n            {\r\n                box.ItemsList?.SetSelection(null);\r\n            }\r\n\r\n            box.IgnoreChanges = false;\r\n        }\r\n\r\n        static FilterDbItemtSelection()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(FilterDbItemtSelection), new FrameworkPropertyMetadata(typeof(FilterDbItemtSelection)));\r\n        }\r\n\r\n        public FilterDbItemtSelection() : this(FullscreenApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public FilterDbItemtSelection(FullscreenAppViewModel mainModel, bool isPrimaryFilter = false) : base()\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                Title = \"Design Title\";\r\n                var games = new List<Game>()\r\n                {\r\n                    new Game(\"Game 1\"),\r\n                    new Game(\"Game 2\"),\r\n                    new Game(\"Game 3\")\r\n                };\r\n\r\n                ItemsList = new SelectableIdItemList<Game>(games, a => a.Id);\r\n            }\r\n\r\n            this.isPrimaryFilter = isPrimaryFilter;\r\n            this.mainModel = mainModel;\r\n            DataContext = this;\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            if (Template != null)\r\n            {\r\n                var closeCommand = isPrimaryFilter ? mainModel.CloseSubFilterCommand : mainModel.CloseAdditionalFilterCommand;\r\n                MenuHost = Template.FindName(\"PART_MenuHost\", this) as FrameworkElement;\r\n                if (MenuHost != null)\r\n                {\r\n                    MenuHost.InputBindings.Add(new KeyBinding(closeCommand, new KeyGesture(Key.Back)));\r\n                    MenuHost.InputBindings.Add(new KeyBinding(closeCommand, new KeyGesture(Key.Escape)));\r\n                    var backInput = new GameControllerInputBinding { Command = closeCommand };\r\n                    BindingTools.SetBinding(backInput,\r\n                        GameControllerInputBinding.ButtonProperty,\r\n                        null,\r\n                        typeof(GameControllerGesture).GetProperty(nameof(GameControllerGesture.CancellationBinding)));\r\n                    MenuHost.InputBindings.Add(backInput);\r\n                }\r\n\r\n                ButtonBack = Template.FindName(\"PART_ButtonBack\", this) as ButtonBase;\r\n                if (ButtonBack != null)\r\n                {\r\n                    ButtonBack.Command = closeCommand;\r\n                    AutomationProperties.SetName(ButtonBack, LOC.BackLabel.GetLocalized());\r\n                }\r\n\r\n                ButtonClear = Template.FindName(\"PART_ButtonClear\", this) as ButtonBase;\r\n                if (ButtonClear != null)\r\n                {\r\n                    ButtonClear.Command = new RelayCommand<object>(a =>\r\n                    {\r\n                        FilterProperties = null;\r\n                        IgnoreChanges = true;\r\n                        ItemsList?.SetSelection(null);\r\n                        IgnoreChanges = false;\r\n                    });\r\n                    BindingTools.SetBinding(ButtonClear,\r\n                         FocusBahaviors.FocusBindingProperty,\r\n                         mainModel,\r\n                         nameof(mainModel.SubFilterVisible));\r\n                }\r\n\r\n                ItemsHost = Template.FindName(\"PART_ItemsHost\", this) as ItemsControl;\r\n                if (ItemsHost != null)\r\n                {\r\n                    AssignItemListPanel(ItemsHost);\r\n                    BindingTools.SetBinding(\r\n                        ItemsHost,\r\n                        ItemsControl.ItemsSourceProperty,\r\n                        this,\r\n                        nameof(ItemsList));\r\n                }\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            if (ItemsList != null)\r\n            {\r\n                ItemsList.SelectionChanged -= List_SelectionChanged;\r\n                ItemsList.SetSelection(null);\r\n            }\r\n\r\n            BindingOperations.ClearBinding(this, ItemsListProperty);\r\n            BindingOperations.ClearBinding(this, FilterPropertiesProperty);\r\n            ItemsList = null;\r\n            FilterProperties = null;\r\n        }\r\n\r\n        public static void AssignItemListPanel(ItemsControl itemsHost)\r\n        {\r\n            XNamespace pns = \"http://schemas.microsoft.com/winfx/2006/xaml/presentation\";\r\n            itemsHost.ItemsPanel = Xaml.FromString<ItemsPanelTemplate>(new XDocument(\r\n                new XElement(pns + nameof(ItemsPanelTemplate),\r\n                    new XElement(pns + nameof(VirtualizingStackPanel)))\r\n            ).ToString());\r\n\r\n            itemsHost.Template = Xaml.FromString<ControlTemplate>(new XDocument(\r\n                 new XElement(pns + nameof(ControlTemplate),\r\n                    new XElement(pns + nameof(ScrollViewer),\r\n                        new XAttribute(nameof(ScrollViewer.Focusable), false),\r\n                        new XAttribute(nameof(ScrollViewer.HorizontalScrollBarVisibility), ScrollBarVisibility.Disabled),\r\n                        new XAttribute(nameof(ScrollViewer.VerticalScrollBarVisibility), ScrollBarVisibility.Auto),\r\n                        new XAttribute(nameof(ScrollViewer.CanContentScroll), true),\r\n                        new XElement(pns + nameof(ItemsPresenter))))\r\n            ).ToString());\r\n\r\n            itemsHost.ItemTemplate = Xaml.FromString<DataTemplate>(new XDocument(\r\n                new XElement(pns + nameof(DataTemplate),\r\n                    new XElement(pns + nameof(CheckBoxEx),\r\n                        new XAttribute(nameof(CheckBoxEx.IsChecked), \"{Binding Selected}\"),\r\n                        new XAttribute(nameof(CheckBoxEx.Content), \"{Binding Item.Name}\"),\r\n                        new XAttribute(nameof(CheckBoxEx.Style), $\"{{DynamicResource FilterItemtSelectionStyle}}\")))\r\n            ).ToString());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/FilterEnumListSelection.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.Input;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Automation;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_MenuHost\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ButtonBack\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ButtonClear\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ItemsHost\", Type = typeof(ItemsControl))]\r\n    public class FilterEnumListSelection : Control, IDisposable\r\n    {\r\n        public class SelectionObject\r\n        {\r\n            public string Name { get; }\r\n            public int Value { get; }\r\n\r\n            public SelectionObject(Enum enumValue)\r\n            {\r\n                Value = Convert.ToInt32(enumValue);\r\n                Name = enumValue.GetDescription();\r\n            }\r\n        }\r\n\r\n        private bool isPrimaryFilter = false;\r\n        private FullscreenAppViewModel mainModel;\r\n        private FrameworkElement MenuHost;\r\n        private ButtonBase ButtonBack;\r\n        private ButtonBase ButtonClear;\r\n        private ItemsControl ItemsHost;\r\n\r\n        internal bool IgnoreChanges { get; set; }\r\n        public string Title { get; set; }\r\n        public List<SelectableItem<SelectionObject>> ItemsList { get; set; }\r\n\r\n        public Type EnumType\r\n        {\r\n            get\r\n            {\r\n                return (Type)GetValue(EnumTypeProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(EnumTypeProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty EnumTypeProperty = DependencyProperty.Register(\r\n            nameof(EnumType),\r\n            typeof(Type),\r\n            typeof(FilterEnumListSelection),\r\n            new PropertyMetadata(null, EnumTypePropertyChangedCallback));\r\n\r\n        private static void EnumTypePropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as FilterEnumListSelection;\r\n            var list = (Type)e.NewValue;\r\n            var items = new List<SelectableItem<SelectionObject>>();\r\n            foreach (Enum en in list.GetEnumValues())\r\n            {\r\n                var newItem = new SelectableItem<SelectionObject>(new SelectionObject(en));\r\n                if (obj.FilterProperties != null)\r\n                {\r\n                    newItem.Selected = obj.FilterProperties.Values?.Contains(newItem.Item.Value) == true;\r\n                }\r\n\r\n                newItem.PropertyChanged += (s, args) =>\r\n                {\r\n                    if (obj.IgnoreChanges)\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    if (args.PropertyName == nameof(newItem.Selected))\r\n                    {\r\n                        var selected = obj.ItemsList.Where(a => a.Selected == true);\r\n                        if (selected.HasItems())\r\n                        {\r\n                            obj.FilterProperties = new EnumFilterItemProperties(selected.Select(a => a.Item.Value).ToList());\r\n                        }\r\n                        else\r\n                        {\r\n                            obj.FilterProperties = null;\r\n                        }\r\n                    }\r\n                };\r\n\r\n                items.Add(newItem);\r\n            }\r\n\r\n            obj.ItemsList = items;\r\n        }\r\n\r\n        public EnumFilterItemProperties FilterProperties\r\n        {\r\n            get\r\n            {\r\n                return (EnumFilterItemProperties)GetValue(FilterPropertiesProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(FilterPropertiesProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty FilterPropertiesProperty = DependencyProperty.Register(\r\n            nameof(FilterProperties),\r\n            typeof(EnumFilterItemProperties),\r\n            typeof(FilterEnumListSelection),\r\n            new PropertyMetadata(null, FilterPropertiesPropertyChangedCallback));\r\n\r\n        private static void FilterPropertiesPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as FilterEnumListSelection;\r\n            if (obj.IgnoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            obj.IgnoreChanges = true;\r\n            if (obj.FilterProperties?.IsSet != true)\r\n            {\r\n                obj.ItemsList?.ForEach(a => a.Selected = false);\r\n            }\r\n            else\r\n            {\r\n                obj.ItemsList?.ForEach(a => a.Selected = obj.FilterProperties.Values.Contains(a.Item.Value));\r\n            }\r\n\r\n            obj.IgnoreChanges = false;\r\n        }\r\n\r\n        static FilterEnumListSelection()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(FilterEnumListSelection), new FrameworkPropertyMetadata(typeof(FilterEnumListSelection)));\r\n        }\r\n\r\n        public FilterEnumListSelection() : this(FullscreenApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public FilterEnumListSelection(FullscreenAppViewModel mainModel, bool isPrimaryFilter = false) : base()\r\n        {\r\n            this.isPrimaryFilter = isPrimaryFilter;\r\n            this.mainModel = mainModel;\r\n            DataContext = this;\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            if (Template != null)\r\n            {\r\n                var closeCommand = isPrimaryFilter ? mainModel.CloseSubFilterCommand : mainModel.CloseAdditionalFilterCommand;\r\n                MenuHost = Template.FindName(\"PART_MenuHost\", this) as FrameworkElement;\r\n                if (MenuHost != null)\r\n                {\r\n                    MenuHost.InputBindings.Add(new KeyBinding(closeCommand, new KeyGesture(Key.Back)));\r\n                    MenuHost.InputBindings.Add(new KeyBinding(closeCommand, new KeyGesture(Key.Escape)));\r\n                    var backInput = new GameControllerInputBinding { Command = closeCommand };\r\n                    BindingTools.SetBinding(backInput,\r\n                        GameControllerInputBinding.ButtonProperty,\r\n                        null,\r\n                        typeof(GameControllerGesture).GetProperty(nameof(GameControllerGesture.CancellationBinding)));\r\n                    MenuHost.InputBindings.Add(backInput);\r\n                }\r\n\r\n                ButtonBack = Template.FindName(\"PART_ButtonBack\", this) as ButtonBase;\r\n                if (ButtonBack != null)\r\n                {\r\n                    ButtonBack.Command = closeCommand;\r\n                    AutomationProperties.SetName(ButtonBack, LOC.BackLabel.GetLocalized());\r\n                }\r\n\r\n                ButtonClear = Template.FindName(\"PART_ButtonClear\", this) as ButtonBase;\r\n                if (ButtonClear != null)\r\n                {\r\n                    ButtonClear.Command = new RelayCommand<object>(a =>\r\n                    {\r\n                        FilterProperties = null;\r\n                        IgnoreChanges = true;\r\n                        ItemsList?.ForEach(b => b.Selected = false);\r\n                        IgnoreChanges = false;\r\n                    });\r\n                    BindingTools.SetBinding(ButtonClear,\r\n                         FocusBahaviors.FocusBindingProperty,\r\n                         mainModel,\r\n                         nameof(mainModel.SubFilterVisible));\r\n                }\r\n\r\n                ItemsHost = Template.FindName(\"PART_ItemsHost\", this) as ItemsControl;\r\n                if (ItemsHost != null)\r\n                {\r\n                    FilterDbItemtSelection.AssignItemListPanel(ItemsHost);\r\n                    BindingTools.SetBinding(\r\n                        ItemsHost,\r\n                        ItemsControl.ItemsSourceProperty,\r\n                        this,\r\n                        nameof(ItemsList));\r\n                }\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            BindingOperations.ClearBinding(this, EnumTypeProperty);\r\n            BindingOperations.ClearBinding(this, FilterPropertiesProperty);\r\n            ItemsList = null;\r\n            FilterProperties = null;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/FilterPresetSelector.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Automation;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_ItemsFilterPresets\", Type = typeof(ItemsControl))]\r\n    public class FilterPresetSelector : Control\r\n    {\r\n        private readonly FullscreenAppViewModel mainModel;\r\n        private ItemsControl ItemsFilterPresets;\r\n\r\n        static FilterPresetSelector()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(FilterPresetSelector), new FrameworkPropertyMetadata(typeof(FilterPresetSelector)));\r\n        }\r\n\r\n        public FilterPresetSelector() : this(FullscreenApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public FilterPresetSelector(FullscreenAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n                mainModel.PropertyChanged += MainModel_PropertyChanged;\r\n            }\r\n        }\r\n\r\n        private void MainModel_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (ItemsFilterPresets == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (e.PropertyName == nameof(MainViewModelBase.SortedFilterFullscreenPresets))\r\n            {\r\n                ItemsFilterPresets.Items.Clear();\r\n                foreach (var preset in mainModel.SortedFilterFullscreenPresets)\r\n                {\r\n                    var item = new CheckBoxEx\r\n                    {\r\n                        Style = ResourceProvider.GetResource<Style>(\"ItemFilterQuickPreset\"),\r\n                        Command = mainModel.ApplyFilterPresetCommand,\r\n                        CommandParameter = preset,\r\n                        DataContext = preset\r\n                    };\r\n\r\n                    BindingTools.SetBinding(item,\r\n                         AutomationProperties.NameProperty,\r\n                         preset,\r\n                         nameof(preset.Name));\r\n                     BindingTools.SetBinding(item,\r\n                        CheckBox.IsCheckedProperty,\r\n                        mainModel,\r\n                        nameof(mainModel.ActiveFilterPreset),\r\n                        converter: new Converters.ObjectEqualityToBoolConverter(),\r\n                        converterParameter: preset,\r\n                        mode: BindingMode.OneWay);\r\n                    ItemsFilterPresets.Items.Add(item);\r\n                }\r\n            }\r\n\r\n            if (e.PropertyName == nameof(MainViewModelBase.ActiveFilterPreset) && mainModel.ActiveFilterPreset != null)\r\n            {\r\n                foreach (CheckBoxEx item in ItemsFilterPresets.Items)\r\n                {\r\n                    if (item.DataContext == mainModel.ActiveFilterPreset)\r\n                    {\r\n                        ItemsFilterPresets.ScrollIntoView(item);\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n            if (Template == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            ItemsFilterPresets = Template.FindName(\"PART_ItemsFilterPresets\", this) as ItemsControl;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/FilterStringListSelection.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.Input;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Automation;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_MenuHost\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ButtonBack\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ButtonClear\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ItemsHost\", Type = typeof(ItemsControl))]\r\n    public class FilterStringListSelection : Control, IDisposable\r\n    {\r\n        private bool isPrimaryFilter;\r\n        private FullscreenAppViewModel mainModel;\r\n        private FrameworkElement MenuHost;\r\n        private ButtonBase ButtonBack;\r\n        private ButtonBase ButtonClear;\r\n        private ItemsControl ItemsHost;\r\n\r\n        internal bool IgnoreChanges { get; set; }\r\n        public string Title { get; set; }\r\n\r\n        public SelectableObjectList<NamedObject<string>> ItemsList\r\n        {\r\n            get\r\n            {\r\n                return (SelectableObjectList<NamedObject<string>>)GetValue(ItemsListProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ItemsListProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ItemsListProperty = DependencyProperty.Register(\r\n            nameof(ItemsList),\r\n            typeof(SelectableObjectList<NamedObject<string>>),\r\n            typeof(FilterStringListSelection),\r\n            new PropertyMetadata(null, ItemsListPropertyChangedCallback));\r\n\r\n        private static void ItemsListPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var box = sender as FilterStringListSelection;\r\n            if (box.IgnoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var list = (SelectableObjectList<NamedObject<string>>)e.NewValue;\r\n            if (list == null)\r\n            {\r\n                var oldList = (SelectableObjectList<NamedObject<string>>)e.OldValue;\r\n                oldList.SelectionChanged -= box.List_SelectionChanged;\r\n            }\r\n            else\r\n            {\r\n                box.IgnoreChanges = true;\r\n                list.SelectionChanged += box.List_SelectionChanged;\r\n                if (box.FilterProperties != null)\r\n                {\r\n                    list.SetSelection(box.FilterProperties.Values?.Select(a => new NamedObject<string>(a)));\r\n                }\r\n\r\n                box.IgnoreChanges = false;\r\n            }\r\n        }\r\n\r\n        public void List_SelectionChanged(object sender, EventArgs e)\r\n        {\r\n            if (!IgnoreChanges)\r\n            {\r\n                IgnoreChanges = true;\r\n                FilterProperties = new StringFilterItemProperties(ItemsList.GetSelectedItems().Select(a => a.Value).ToList());\r\n                IgnoreChanges = false;\r\n            }\r\n        }\r\n\r\n        public StringFilterItemProperties FilterProperties\r\n        {\r\n            get\r\n            {\r\n                return (StringFilterItemProperties)GetValue(FilterPropertiesProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(FilterPropertiesProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty FilterPropertiesProperty = DependencyProperty.Register(\r\n            nameof(FilterProperties),\r\n            typeof(StringFilterItemProperties),\r\n            typeof(FilterStringListSelection),\r\n            new PropertyMetadata(null, FilterPropertiesPropertyChangedCallback));\r\n\r\n        private static void FilterPropertiesPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var obj = sender as FilterStringListSelection;\r\n            if (obj.IgnoreChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            obj.IgnoreChanges = true;\r\n            if (obj.FilterProperties?.IsSet != true)\r\n            {\r\n                obj.ItemsList?.SetSelection(null);\r\n            }\r\n            else\r\n            {\r\n                obj.ItemsList?.SetSelection(obj.FilterProperties.Values?.Select(a => new NamedObject<string>(a)));\r\n            }\r\n            obj.IgnoreChanges = false;\r\n        }\r\n\r\n        static FilterStringListSelection()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(FilterStringListSelection), new FrameworkPropertyMetadata(typeof(FilterStringListSelection)));\r\n        }\r\n\r\n        public FilterStringListSelection() : this(FullscreenApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public FilterStringListSelection(FullscreenAppViewModel mainModel, bool isPrimaryFilter = false) : base()\r\n        {\r\n            this.isPrimaryFilter = isPrimaryFilter;\r\n            this.mainModel = mainModel;\r\n            DataContext = this;\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            if (Template != null)\r\n            {\r\n                var closeCommand = isPrimaryFilter ? mainModel.CloseSubFilterCommand : mainModel.CloseAdditionalFilterCommand;\r\n                MenuHost = Template.FindName(\"PART_MenuHost\", this) as FrameworkElement;\r\n                if (MenuHost != null)\r\n                {\r\n                    MenuHost.InputBindings.Add(new KeyBinding(closeCommand, new KeyGesture(Key.Back)));\r\n                    MenuHost.InputBindings.Add(new KeyBinding(closeCommand, new KeyGesture(Key.Escape)));\r\n                    var backInput = new GameControllerInputBinding { Command = closeCommand };\r\n                    BindingTools.SetBinding(backInput,\r\n                        GameControllerInputBinding.ButtonProperty,\r\n                        null,\r\n                        typeof(GameControllerGesture).GetProperty(nameof(GameControllerGesture.CancellationBinding)));\r\n                    MenuHost.InputBindings.Add(backInput);\r\n                }\r\n\r\n                ButtonBack = Template.FindName(\"PART_ButtonBack\", this) as ButtonBase;\r\n                if (ButtonBack != null)\r\n                {\r\n                    ButtonBack.Command = closeCommand;\r\n                    AutomationProperties.SetName(ButtonBack, LOC.BackLabel.GetLocalized());\r\n                }\r\n\r\n                ButtonClear = Template.FindName(\"PART_ButtonClear\", this) as ButtonBase;\r\n                if (ButtonClear != null)\r\n                {\r\n                    ButtonClear.Command = new RelayCommand<object>(a =>\r\n                    {\r\n                        FilterProperties = null;\r\n                        IgnoreChanges = true;\r\n                        ItemsList?.SetSelection(null);\r\n                        IgnoreChanges = false;\r\n                    });\r\n                    BindingTools.SetBinding(ButtonClear,\r\n                         FocusBahaviors.FocusBindingProperty,\r\n                         mainModel,\r\n                         nameof(mainModel.SubFilterVisible));\r\n                }\r\n\r\n                ItemsHost = Template.FindName(\"PART_ItemsHost\", this) as ItemsControl;\r\n                if (ItemsHost != null)\r\n                {\r\n                    FilterDbItemtSelection.AssignItemListPanel(ItemsHost);\r\n                    BindingTools.SetBinding(\r\n                        ItemsHost,\r\n                        ItemsControl.ItemsSourceProperty,\r\n                        this,\r\n                        nameof(ItemsList));\r\n                }\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            if (ItemsList != null)\r\n            {\r\n                ItemsList.SelectionChanged -= List_SelectionChanged;\r\n                ItemsList.SetSelection(null);\r\n            }\r\n\r\n            BindingOperations.ClearBinding(this, ItemsListProperty);\r\n            BindingOperations.ClearBinding(this, FilterPropertiesProperty);\r\n            ItemsList = null;\r\n            FilterProperties = null;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/FullscreenTilePanel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.Specialized;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Animation;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    public class InternalChildrenGeneratedArgs\r\n    {\r\n    }\r\n\r\n    public class FullscreenTilePanel : VirtualizingPanel, IScrollInfo\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        internal ItemsControl itemsControl => ItemsControl.GetItemsOwner(this);\r\n        private int itemCount => itemsControl?.HasItems == true ? itemsControl.Items.Count : 0;\r\n        private double itemWidth;\r\n        private double itemHeight;\r\n        private double centerMargin;\r\n        private int computedRows;\r\n        private int computedColumns;\r\n        private const double marginOffset = 0.5;\r\n\r\n        public event EventHandler<InternalChildrenGeneratedArgs> InternalChildrenGenerated;\r\n\r\n        private void OnInternalChildrenGenerated()\r\n        {\r\n            InternalChildrenGenerated?.Invoke(this, new InternalChildrenGeneratedArgs());\r\n        }\r\n\r\n        private IRecyclingItemContainerGenerator itemContainerGenerator;\r\n        protected IRecyclingItemContainerGenerator generator\r\n        {\r\n            get\r\n            {\r\n                if (itemContainerGenerator is null)\r\n                {\r\n                    /* Because of a bug in the framework the ItemContainerGenerator\r\n                     * is null until InternalChildren accessed at least one time. */\r\n                    var children = InternalChildren;\r\n                    itemContainerGenerator = (IRecyclingItemContainerGenerator)base.ItemContainerGenerator;\r\n                }\r\n                return itemContainerGenerator;\r\n            }\r\n        }\r\n\r\n        public int Columns\r\n        {\r\n            get\r\n            {\r\n                return (int)GetValue(ColumnsProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ColumnsProperty, value);\r\n            }\r\n        }\r\n\r\n        public static DependencyProperty VerticalOffsetProperty = DependencyProperty.RegisterAttached(\r\n            \"VerticalOffset\",\r\n            typeof(double),\r\n            typeof(FullscreenTilePanel),\r\n            new PropertyMetadata(0.0, OnVerticalOffsetChanged));\r\n\r\n        public static void SetVerticalOffset(FrameworkElement target, double value)\r\n        {\r\n            target.SetValue(VerticalOffsetProperty, value);\r\n        }\r\n\r\n        public static double GetVerticalOffset(FrameworkElement target)\r\n        {\r\n            return (double)target.GetValue(VerticalOffsetProperty);\r\n        }\r\n\r\n        private static void OnVerticalOffsetChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            if (target is FullscreenTilePanel panel)\r\n            {\r\n                panel.SetVerticalOffset((double)e.NewValue);\r\n            }\r\n        }\r\n\r\n        public static DependencyProperty HorizontalOffsetProperty = DependencyProperty.RegisterAttached(\r\n            \"HorizontalOffset\",\r\n            typeof(double),\r\n            typeof(FullscreenTilePanel),\r\n            new PropertyMetadata(0.0, OnHorizontalOffsetChanged));\r\n\r\n        public static void SetHorizontalOffset(FrameworkElement target, double value)\r\n        {\r\n            target.SetValue(HorizontalOffsetProperty, value);\r\n        }\r\n\r\n        public static double GetHorizontalOffset(FrameworkElement target)\r\n        {\r\n            return (double)target.GetValue(HorizontalOffsetProperty);\r\n        }\r\n\r\n        private static void OnHorizontalOffsetChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            if (target is FullscreenTilePanel panel)\r\n            {\r\n                panel.SetHorizontalOffset((double)e.NewValue);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty SmoothScrollEnabledProperty = DependencyProperty.RegisterAttached(\r\n            nameof(SmoothScrollEnabled),\r\n            typeof(bool),\r\n            typeof(FullscreenTilePanel),\r\n            new FrameworkPropertyMetadata(false));\r\n\r\n        public bool SmoothScrollEnabled\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(SmoothScrollEnabledProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(SmoothScrollEnabledProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ColumnsProperty = DependencyProperty.RegisterAttached(\r\n            nameof(Columns),\r\n            typeof(int),\r\n            typeof(FullscreenTilePanel),\r\n            new FrameworkPropertyMetadata(4, OnLayoutPropertyChanged));\r\n\r\n        public AspectRatio ItemAspectRatio\r\n        {\r\n            get\r\n            {\r\n                return (AspectRatio)GetValue(ItemAspectRatioProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ItemAspectRatioProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ItemAspectRatioProperty = DependencyProperty.RegisterAttached(\r\n            nameof(ItemAspectRatio),\r\n            typeof(AspectRatio),\r\n            typeof(FullscreenTilePanel),\r\n            new FrameworkPropertyMetadata(new AspectRatio(92, 43), OnLayoutPropertyChanged));\r\n\r\n        public bool UseHorizontalLayout\r\n        {\r\n            get\r\n            {\r\n                return (bool)GetValue(UseHorizontalLayoutProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(UseHorizontalLayoutProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty UseHorizontalLayoutProperty = DependencyProperty.RegisterAttached(\r\n            nameof(UseHorizontalLayout),\r\n            typeof(bool),\r\n            typeof(FullscreenTilePanel),\r\n            new FrameworkPropertyMetadata(false, OnLayoutPropertyChanged));\r\n\r\n        public int Rows\r\n        {\r\n            get\r\n            {\r\n                return (int)GetValue(RowsProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(RowsProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty RowsProperty = DependencyProperty.RegisterAttached(\r\n            nameof(Rows),\r\n            typeof(int),\r\n            typeof(FullscreenTilePanel),\r\n            new FrameworkPropertyMetadata(4, OnLayoutPropertyChanged));\r\n\r\n        public int ItemSpacing\r\n        {\r\n            get\r\n            {\r\n                return (int)GetValue(ItemSpacingProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(ItemSpacingProperty, value);\r\n            }\r\n        }\r\n\r\n        public static readonly DependencyProperty ItemSpacingProperty = DependencyProperty.RegisterAttached(\r\n            nameof(ItemSpacing),\r\n            typeof(int),\r\n            typeof(FullscreenTilePanel),\r\n            new FrameworkPropertyMetadata(10, OnLayoutPropertyChanged));\r\n\r\n        // This has to be lower than key delay from ListBoxEx, because layout will get desynced otherwise.\r\n        // TODO: fix the desync.\r\n        private readonly TimeSpan animationLength = new TimeSpan(0, 0, 0, 0, 140);\r\n        private readonly DoubleAnimation scrollAnimation = new DoubleAnimation();\r\n\r\n        public FullscreenTilePanel() : base()\r\n        {\r\n            RenderTransform = trans;\r\n        }\r\n\r\n        private static void OnLayoutPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var panel = obj as FullscreenTilePanel;\r\n            if (panel.itemsControl == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            panel.InvalidateMeasure();\r\n            panel.ScrollOwner?.InvalidateScrollInfo();\r\n        }\r\n        protected override Size MeasureOverride(Size availableSize)\r\n        {\r\n            if (itemsControl == null)\r\n            {\r\n                return new Size(0, 0);\r\n            }\r\n\r\n            UpdateScrollInfo(availableSize);\r\n            GetVisibleRange(out var firstItemIndex, out var lastItemIndex);\r\n            if (lastItemIndex < 0)\r\n            {\r\n                return new Size(0, 0);\r\n            }\r\n\r\n            var startPos = generator.GeneratorPositionFromIndex(firstItemIndex);\r\n            var childIndex = (startPos.Offset == 0) ? startPos.Index : startPos.Index + 1;\r\n            var anyItemsGenerated = false;\r\n            using (generator.StartAt(startPos, GeneratorDirection.Forward, true))\r\n            {\r\n                for (int itemIndex = firstItemIndex; itemIndex <= lastItemIndex; ++itemIndex, ++childIndex)\r\n                {\r\n                    UIElement child = generator.GenerateNext(out var newlyRealized) as UIElement;\r\n                    if (child == null)\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    if (newlyRealized)\r\n                    {\r\n                        if (childIndex >= InternalChildren.Count)\r\n                        {\r\n                            AddInternalChild(child);\r\n                        }\r\n                        else\r\n                        {\r\n                            InsertInternalChild(childIndex, child);\r\n                        }\r\n\r\n                        generator.PrepareItemContainer(child);\r\n                        anyItemsGenerated = true;\r\n                    }\r\n                    else if (!InternalChildren.Contains(child))\r\n                    {\r\n                        InsertInternalChild(childIndex, child);\r\n                        ItemContainerGenerator.PrepareItemContainer(child);\r\n                        anyItemsGenerated = true;\r\n                    }\r\n\r\n                    child.Measure(new Size(itemWidth, itemHeight));\r\n                }\r\n            }\r\n\r\n            CleanUpItems(firstItemIndex, lastItemIndex);\r\n            if (anyItemsGenerated)\r\n            {\r\n                OnInternalChildrenGenerated();\r\n            }\r\n\r\n            if (double.IsPositiveInfinity(availableSize.Width) || double.IsPositiveInfinity(availableSize.Height))\r\n            {\r\n                return GetExtent();\r\n            }\r\n            else\r\n            {\r\n                return availableSize;\r\n            }\r\n        }\r\n\r\n        protected override Size ArrangeOverride(Size finalSize)\r\n        {\r\n            UpdateScrollInfo(finalSize);\r\n\r\n            for (int i = 0; i < Children.Count; i++)\r\n            {\r\n                var child = Children[i];\r\n                var itemIndex = generator.IndexFromGeneratorPosition(new GeneratorPosition(i, 0));\r\n                if (itemIndex < 0)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                child.Arrange(GetItemRect(itemIndex));\r\n            }\r\n\r\n            return finalSize;\r\n        }\r\n\r\n        private Rect GetItemRect(int itemIndex)\r\n        {\r\n            if (UseHorizontalLayout)\r\n            {\r\n                if (computedRows == 0)\r\n                    return new Rect(\r\n                        itemWidth * 0.25,\r\n                        centerMargin,\r\n                        itemWidth,\r\n                        itemHeight);\r\n\r\n                var row = itemIndex % computedRows;\r\n                var column = itemIndex < row ? 0 : (int)Math.Floor(itemIndex / (double)computedRows);\r\n                return new Rect(\r\n                    (column * itemWidth) + (itemWidth * 0.25),\r\n                    centerMargin + (row * itemHeight),\r\n                    itemWidth,\r\n                    itemHeight);\r\n            }\r\n            else\r\n            {\r\n                if (computedColumns == 0)\r\n                    return new Rect(\r\n                        centerMargin,\r\n                        (marginOffset / 2) * itemHeight,\r\n                        itemWidth,\r\n                        itemHeight);\r\n\r\n                var column = itemIndex % computedColumns;\r\n                var row = itemIndex < column ? 0 : (int)Math.Floor(itemIndex / (double)computedColumns);\r\n                return new Rect(\r\n                    centerMargin + (column * itemWidth),\r\n                    (row * itemHeight) + ((marginOffset / 2) * itemHeight),\r\n                    itemWidth,\r\n                    itemHeight);\r\n            }\r\n        }\r\n\r\n        private void GetVisibleRange(out int firstIndex, out int lastIndex)\r\n        {\r\n            if (itemCount == 0)\r\n            {\r\n                firstIndex = -1;\r\n                lastIndex = -1;\r\n                return;\r\n            }\r\n\r\n            if (UseHorizontalLayout)\r\n            {\r\n                var previousColumns = (int)Math.Ceiling((offset.X - (itemWidth * (marginOffset / 2))) / itemWidth);\r\n                firstIndex = (int)Math.Ceiling((double)previousColumns * computedRows) - computedRows;\r\n                if (firstIndex < 0)\r\n                {\r\n                    firstIndex = 0;\r\n                }\r\n\r\n                lastIndex = (previousColumns * computedRows) + (computedRows * (Columns + 1)) - 1;\r\n                if (lastIndex >= itemCount)\r\n                {\r\n                    lastIndex = itemCount;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var previousRows = (int)Math.Ceiling((offset.Y - (itemHeight * (marginOffset / 2))) / itemHeight);\r\n                firstIndex = (int)Math.Ceiling((double)previousRows * computedColumns) - computedColumns;\r\n                if (firstIndex < 0)\r\n                {\r\n                    firstIndex = 0;\r\n                }\r\n\r\n                lastIndex = (previousRows * computedColumns) + (computedColumns * (Rows + 1)) - 1;\r\n                if (lastIndex >= itemCount)\r\n                {\r\n                    lastIndex = itemCount;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void CleanUpItems(int firstIndex, int lastIndex)\r\n        {\r\n            for (int i = InternalChildren.Count - 1; i >= 0; i--)\r\n            {\r\n                GeneratorPosition childGeneratorPos = new GeneratorPosition(i, 0);\r\n                int itemIndex = generator.IndexFromGeneratorPosition(childGeneratorPos);\r\n                var child = InternalChildren[i];\r\n                if ((itemIndex < firstIndex || itemIndex > lastIndex) && itemIndex > 0)\r\n                {\r\n                    generator.Recycle(childGeneratorPos, 1);\r\n                    RemoveInternalChildRange(i, 1);\r\n                }\r\n                else if (child.ToString().Contains(\"{DisconnectedItem}\"))\r\n                {\r\n                    try\r\n                    {\r\n                        generator.Remove(childGeneratorPos, 1);\r\n                    }\r\n                    catch (Exception e)\r\n                    {\r\n                        // Looks like some issue in WPF.\r\n                        // This sometimes throws \"null reference\" even when the items still exists.\r\n                        logger.Error(e, \"Cleaning up DisconnectedItem failed.\");\r\n                    }\r\n\r\n                    RemoveInternalChildRange(i, 1);\r\n                }\r\n            }\r\n        }\r\n\r\n        protected override void OnItemsChanged(object sender, ItemsChangedEventArgs args)\r\n        {\r\n            switch (args.Action)\r\n            {\r\n                case NotifyCollectionChangedAction.Remove:\r\n                case NotifyCollectionChangedAction.Replace:\r\n                    RemoveInternalChildRange(args.Position.Index, args.ItemUICount);\r\n                    break;\r\n                case NotifyCollectionChangedAction.Move:\r\n                    RemoveInternalChildRange(args.OldPosition.Index, args.ItemUICount);\r\n                    break;\r\n            }\r\n        }\r\n\r\n        internal Size GetExtent()\r\n        {\r\n            if (itemCount == 0)\r\n            {\r\n                return new Size(0, 0);\r\n            }\r\n\r\n            if (UseHorizontalLayout)\r\n            {\r\n                if (computedRows == 0)\r\n                    return new Size(centerMargin * 2, viewport.Height);\r\n\r\n                var totalColumns = (int)Math.Ceiling(itemCount / (double)computedRows);\r\n                return new Size(\r\n                    (totalColumns * itemWidth) + (centerMargin * 2),\r\n                    viewport.Height);\r\n            }\r\n            else\r\n            {\r\n                if (computedColumns == 0)\r\n                    return new Size(viewport.Width, 0);\r\n\r\n                var totalRows = (int)Math.Ceiling(itemCount / (double)computedColumns);\r\n                return new Size(\r\n                    viewport.Width,\r\n                    (totalRows + marginOffset) * itemHeight);\r\n            }\r\n        }\r\n\r\n        internal double GetItemHeight()\r\n        {\r\n            if (UseHorizontalLayout)\r\n            {\r\n                return ItemAspectRatio.GetHeight(GetItemWidth());\r\n            }\r\n            else\r\n            {\r\n                return viewport.Height / (Rows + marginOffset);\r\n            }\r\n        }\r\n\r\n        internal double GetItemWidth()\r\n        {\r\n            if (UseHorizontalLayout)\r\n            {\r\n                return viewport.Width / (Columns + marginOffset);\r\n            }\r\n            else\r\n            {\r\n                return ItemAspectRatio.GetWidth(GetItemHeight());\r\n            }\r\n        }\r\n\r\n        internal double GetCenterMargin()\r\n        {\r\n            if (UseHorizontalLayout)\r\n            {\r\n                return (viewport.Height - (computedRows * itemHeight)) / 2;\r\n            }\r\n            else\r\n            {\r\n                return (viewport.Width - (computedColumns * itemWidth)) / 2;\r\n            }\r\n        }\r\n\r\n        #region IScrollInfo\r\n\r\n        private Size viewport = new Size(0, 0);\r\n        private Point offset = new Point(0, 0);\r\n        private Size extent = new Size(0, 0);\r\n        private TranslateTransform trans = new TranslateTransform();\r\n\r\n        public bool CanVerticallyScroll { get; set; } = false;\r\n        public bool CanHorizontallyScroll { get; set; } = false;\r\n        public double ExtentWidth => extent.Width;\r\n        public double ExtentHeight => extent.Height;\r\n        public double ViewportWidth => viewport.Width;\r\n        public double ViewportHeight => viewport.Height;\r\n        public double HorizontalOffset => offset.X;\r\n        public double VerticalOffset => offset.Y;\r\n        public ScrollViewer ScrollOwner { get; set; }\r\n\r\n        internal void UpdateScrollInfo(Size availableSize)\r\n        {\r\n            if (availableSize != viewport)\r\n            {\r\n                viewport = availableSize;\r\n                ScrollOwner?.InvalidateScrollInfo();\r\n            }\r\n\r\n            if (UseHorizontalLayout)\r\n            {\r\n                itemHeight = GetItemHeight();\r\n                if (itemHeight > viewport.Height)\r\n                {\r\n                    itemHeight = viewport.Height;\r\n                    itemWidth = ItemAspectRatio.GetWidth(itemHeight);\r\n                }\r\n                else\r\n                {\r\n                    itemWidth = GetItemWidth();\r\n                }\r\n\r\n                computedRows = (int)Math.Floor(viewport.Height / itemHeight);\r\n            }\r\n            else\r\n            {\r\n                itemWidth = GetItemWidth();\r\n                if (itemWidth > viewport.Width)\r\n                {\r\n                    itemWidth = viewport.Width;\r\n                    itemHeight = ItemAspectRatio.GetHeight(itemWidth);\r\n                }\r\n                else\r\n                {\r\n                    itemHeight = GetItemHeight();\r\n                }\r\n\r\n                computedColumns = (int)Math.Floor(viewport.Width / itemWidth);\r\n            }\r\n\r\n            centerMargin = GetCenterMargin();\r\n\r\n            var newExtent = GetExtent();\r\n            if (extent != newExtent)\r\n            {\r\n                extent = newExtent;\r\n                ScrollOwner?.InvalidateScrollInfo();\r\n            }\r\n\r\n            if (offset.Y > extent.Height)\r\n            {\r\n                offset.Y = 0;\r\n                trans.Y = 0;\r\n                ScrollOwner?.InvalidateScrollInfo();\r\n            }\r\n\r\n            if (offset.X > extent.Width)\r\n            {\r\n                offset.X = 0;\r\n                trans.X = 0;\r\n                ScrollOwner?.InvalidateScrollInfo();\r\n            }\r\n        }\r\n\r\n        public void BeginAnimation(double from, double to, TimeSpan speed, DependencyProperty property)\r\n        {\r\n            scrollAnimation.From = from;\r\n            scrollAnimation.To = to;\r\n            scrollAnimation.Duration = new Duration(speed);\r\n            BeginAnimation(property, scrollAnimation);\r\n        }\r\n\r\n        public void SetHorizontalOffset(double newOffset)\r\n        {\r\n            if (newOffset < 0 || viewport.Width >= extent.Width)\r\n            {\r\n                newOffset = 0;\r\n            }\r\n            else\r\n            {\r\n                if (newOffset + viewport.Width >= extent.Width)\r\n                {\r\n                    newOffset = extent.Width - viewport.Width;\r\n                }\r\n            }\r\n\r\n            offset.X = newOffset;\r\n            trans.X = -newOffset;\r\n            ScrollOwner?.InvalidateScrollInfo();\r\n            InvalidateMeasure();\r\n        }\r\n\r\n        public void SetVerticalOffset(double newOffset)\r\n        {\r\n            if (newOffset < 0 || viewport.Height >= extent.Height)\r\n            {\r\n                newOffset = 0;\r\n            }\r\n            else\r\n            {\r\n                if (newOffset + viewport.Height >= extent.Height)\r\n                {\r\n                    newOffset = extent.Height - viewport.Height;\r\n                }\r\n            }\r\n\r\n            offset.Y = newOffset;\r\n            trans.Y = -newOffset;\r\n            ScrollOwner?.InvalidateScrollInfo();\r\n            InvalidateMeasure();\r\n        }\r\n\r\n        public void ScrollToItem(object item)\r\n        {\r\n            var index = itemsControl.Items.IndexOf(item);\r\n            var itemRect = GetItemRect(index);\r\n            if (UseHorizontalLayout)\r\n            {\r\n                SetHorizontalOffset(itemRect.X);\r\n            }\r\n            else\r\n            {\r\n                SetVerticalOffset(itemRect.Y);\r\n            }\r\n        }\r\n\r\n        public Rect MakeVisible(Visual visual, Rect rectangle)\r\n        {\r\n            var index = ((ItemContainerGenerator)generator).IndexFromContainer(visual);\r\n            if (index < 0)\r\n            {\r\n                return rectangle;\r\n            }\r\n\r\n            var itemRect = GetItemRect(index);\r\n            if (UseHorizontalLayout)\r\n            {\r\n                var movedViewport = new Rect(offset.X, 0, offset.X + viewport.Width, 0);\r\n                if (itemRect.X > movedViewport.X && itemRect.X + itemWidth < movedViewport.Width)\r\n                {\r\n                    return rectangle;\r\n                }\r\n                else if (itemRect.X > movedViewport.X && itemRect.X + itemWidth > movedViewport.Width && itemRect.X < movedViewport.Width)\r\n                {\r\n                    LineRight();\r\n                    return rectangle;\r\n                }\r\n                else if (itemRect.X < movedViewport.X && itemRect.X + itemWidth > movedViewport.X)\r\n                {\r\n                    LineLeft();\r\n                    return rectangle;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                var movedViewport = new Rect(0, offset.Y, 0, offset.Y + viewport.Height);\r\n                if (itemRect.Y > movedViewport.Y && itemRect.Y + itemHeight < movedViewport.Height)\r\n                {\r\n                    return rectangle;\r\n                }\r\n                else if (itemRect.Y > movedViewport.Y && itemRect.Y + itemHeight > movedViewport.Height && itemRect.Y < movedViewport.Height)\r\n                {\r\n                    LineDown();\r\n                    return rectangle;\r\n                }\r\n                else if (itemRect.Y < movedViewport.Y && itemRect.Y + itemHeight > movedViewport.Y)\r\n                {\r\n                    LineUp();\r\n                    return rectangle;\r\n                }\r\n            }\r\n\r\n            return rectangle;\r\n        }\r\n\r\n        public void LineLeft()\r\n        {\r\n            if (SmoothScrollEnabled)\r\n            {\r\n                BeginAnimation(HorizontalOffset, HorizontalOffset - itemWidth, animationLength, HorizontalOffsetProperty);\r\n            }\r\n            else\r\n            {\r\n                SetHorizontalOffset(HorizontalOffset - itemWidth);\r\n            }\r\n        }\r\n\r\n        public void LineRight()\r\n        {\r\n            if (SmoothScrollEnabled)\r\n            {\r\n                BeginAnimation(HorizontalOffset, HorizontalOffset + itemWidth, animationLength, HorizontalOffsetProperty);\r\n            }\r\n            else\r\n            {\r\n                SetHorizontalOffset(HorizontalOffset + itemWidth);\r\n            }\r\n        }\r\n\r\n        public void LineUp()\r\n        {\r\n            if (SmoothScrollEnabled)\r\n            {\r\n                BeginAnimation(VerticalOffset, VerticalOffset - itemHeight, animationLength, VerticalOffsetProperty);\r\n            }\r\n            else\r\n            {\r\n                SetVerticalOffset(VerticalOffset - itemHeight);\r\n            }\r\n        }\r\n\r\n        public void LineDown()\r\n        {\r\n            if (SmoothScrollEnabled)\r\n            {\r\n                BeginAnimation(VerticalOffset, VerticalOffset + itemHeight, animationLength, VerticalOffsetProperty);\r\n            }\r\n            else\r\n            {\r\n                SetVerticalOffset(VerticalOffset + itemHeight);\r\n            }\r\n        }\r\n\r\n        public void MouseWheelDown()\r\n        {\r\n        }\r\n\r\n        public void MouseWheelLeft()\r\n        {\r\n        }\r\n\r\n        public void MouseWheelRight()\r\n        {\r\n        }\r\n\r\n        public void MouseWheelUp()\r\n        {\r\n        }\r\n\r\n        public void PageLeft()\r\n        {\r\n            SetHorizontalOffset(HorizontalOffset - (itemWidth * Columns));\r\n        }\r\n\r\n        public void PageRight()\r\n        {\r\n            SetHorizontalOffset(HorizontalOffset + (itemWidth * Columns));\r\n        }\r\n\r\n        public void PageUp()\r\n        {\r\n            if (UseHorizontalLayout)\r\n            {\r\n                PageLeft();\r\n            }\r\n            else\r\n            {\r\n                SetVerticalOffset(VerticalOffset - (itemHeight * Rows));\r\n            }\r\n        }\r\n\r\n        public void PageDown()\r\n        {\r\n            if (UseHorizontalLayout)\r\n            {\r\n                PageRight();\r\n            }\r\n            else\r\n            {\r\n                SetVerticalOffset(VerticalOffset + (itemHeight * Rows));\r\n            }\r\n        }\r\n\r\n        #endregion IScrollInfo\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/GameListItem.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.Converters;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.Extensions;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\nusing BooleanToVisibilityConverter = Playnite.Converters.BooleanToVisibilityConverter;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    [TemplatePart(Name = \"PART_ImageCover\", Type = typeof(Image))]\r\n    public class GameListItem : Control\r\n    {\r\n        private readonly FullscreenAppViewModel mainModel;\r\n        private Image ImageCover;\r\n\r\n        static GameListItem()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(GameListItem), new FrameworkPropertyMetadata(typeof(GameListItem)));\r\n        }\r\n\r\n        public GameListItem() : this(FullscreenApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public GameListItem(FullscreenAppViewModel mainModel)\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n                // Done via event instead of input binding because input binding disables item select on righ-click.\r\n                PreviewMouseRightButtonUp += GameListItem_MouseRightButtonUp;\r\n            }\r\n        }\r\n\r\n        private void GameListItem_MouseRightButtonUp(object sender, MouseButtonEventArgs e)\r\n        {\r\n            if (mainModel.OpenGameMenuCommand.CanExecute())\r\n            {\r\n                mainModel.OpenGameMenuCommand.Execute();\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            ImageCover = Template.FindName(\"PART_ImageCover\", this) as Image;\r\n            if (ImageCover != null)\r\n            {\r\n                var sourceBinding = new PriorityBinding();\r\n                sourceBinding.Bindings.Add(new Binding()\r\n                {\r\n                    Path = new PropertyPath(nameof(GamesCollectionViewEntry.FullscreenListItemCoverObject)),\r\n                    IsAsync = mainModel.AppSettings.Fullscreen.AsyncImageLoading,\r\n                    Converter = new NullToDependencyPropertyUnsetConverter(),\r\n                    Mode = BindingMode.OneWay\r\n                });\r\n                sourceBinding.Bindings.Add(new Binding()\r\n                {\r\n                    Path = new PropertyPath(nameof(GamesCollectionViewEntry.DefaultFullscreenListItemCoverObject)),\r\n                    Converter = new NullToDependencyPropertyUnsetConverter(),\r\n                    Mode = BindingMode.OneWay\r\n                });\r\n\r\n                BindingOperations.SetBinding(ImageCover, Image.SourceProperty, sourceBinding);\r\n            }\r\n\r\n            ControlTemplateTools.InitializePluginControls(\r\n                mainModel.Extensions,\r\n                Template,\r\n                this,\r\n                ApplicationMode.Fullscreen,\r\n                this,\r\n                $\"DataContext.{nameof(GamesCollectionViewEntry.Game)}\");\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/ItemsControlEx.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    public class ItemsControlEx : ItemsControl\r\n    {\r\n        public bool HorizontalLayout\r\n        {\r\n            get { return (bool)GetValue(HorizontalLayoutProperty); }\r\n            set { SetValue(HorizontalLayoutProperty, value); }\r\n        }\r\n\r\n        public static readonly DependencyProperty HorizontalLayoutProperty =\r\n            DependencyProperty.Register(\r\n                nameof(HorizontalLayout),\r\n                typeof(bool),\r\n                typeof(ItemsControlEx));\r\n\r\n        static ItemsControlEx()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ItemsControlEx), new FrameworkPropertyMetadata(typeof(ItemsControlEx)));\r\n        }\r\n\r\n        public ItemsControlEx() : base()\r\n        {\r\n            PreviewKeyDown += ItemsControlEx_PreviewKeyDown;\r\n        }\r\n\r\n        private void ItemsControlEx_PreviewKeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            var focusedElem = Keyboard.FocusedElement as FrameworkElement;\r\n\r\n            if (HorizontalLayout)\r\n            {\r\n                if (e.Key == Key.Up)\r\n                {\r\n                    focusedElem?.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));\r\n                    e.Handled = true;\r\n                }\r\n                else if (e.Key == Key.Down)\r\n                {\r\n                    focusedElem?.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));\r\n                    e.Handled = true;\r\n                }\r\n                else if (e.Key == Key.Right && Items.Count > 0)\r\n                {\r\n                    var currentElem = (FrameworkElement)Keyboard.FocusedElement;\r\n                    var lastItem = ItemContainerGenerator.ContainerFromIndex(Items.Count - 1);\r\n                    if (lastItem != null)\r\n                    {\r\n                        if (lastItem is ContentPresenter)\r\n                        {\r\n                            lastItem = VisualTreeHelper.GetChild(lastItem, 0);\r\n                        }\r\n\r\n                        if (lastItem == currentElem)\r\n                        {\r\n                            focusedElem?.MoveFocus(new TraversalRequest(FocusNavigationDirection.Right));\r\n                            e.Handled = true;\r\n                        }\r\n                    }\r\n                }\r\n                else if (e.Key == Key.Left && Items.Count > 0)\r\n                {\r\n                    var currentElem = (FrameworkElement)Keyboard.FocusedElement;\r\n                    var firstElem = ItemContainerGenerator.ContainerFromIndex(0);\r\n                    if (firstElem != null)\r\n                    {\r\n                        if (firstElem is ContentPresenter)\r\n                        {\r\n                            firstElem = VisualTreeHelper.GetChild(firstElem, 0);\r\n                        }\r\n\r\n                        if (firstElem == currentElem)\r\n                        {\r\n                            focusedElem?.MoveFocus(new TraversalRequest(FocusNavigationDirection.Left));\r\n                            e.Handled = true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (e.Key == Key.Right)\r\n                {\r\n                    focusedElem?.MoveFocus(new TraversalRequest(FocusNavigationDirection.Right));\r\n                    e.Handled = true;\r\n                }\r\n                else if (e.Key == Key.Left)\r\n                {\r\n                    focusedElem?.MoveFocus(new TraversalRequest(FocusNavigationDirection.Left));\r\n                    e.Handled = true;\r\n                }\r\n                else if (e.Key == Key.Down && Items.Count > 0)\r\n                {\r\n                    var currentElem = (FrameworkElement)Keyboard.FocusedElement;\r\n                    var lastItem = ItemContainerGenerator.ContainerFromIndex(Items.Count - 1);\r\n                    if (lastItem != null)\r\n                    {\r\n                        if (lastItem is ContentPresenter)\r\n                        {\r\n                            lastItem = VisualTreeHelper.GetChild(lastItem, 0);\r\n                        }\r\n\r\n                        if (lastItem == currentElem)\r\n                        {\r\n                            focusedElem?.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));\r\n                            e.Handled = true;\r\n                        }\r\n                    }\r\n                }\r\n                else if (e.Key == Key.Up && Items.Count > 0)\r\n                {\r\n                    var currentElem = (FrameworkElement)Keyboard.FocusedElement;\r\n                    var firstElem = ItemContainerGenerator.ContainerFromIndex(0);\r\n                    if (firstElem != null)\r\n                    {\r\n                        if (firstElem is ContentPresenter)\r\n                        {\r\n                            firstElem = VisualTreeHelper.GetChild(firstElem, 0);\r\n                        }\r\n\r\n                        if (firstElem == currentElem)\r\n                        {\r\n                            focusedElem?.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));\r\n                            e.Handled = true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/ListBoxEx.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.Specialized;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\nusing Playnite.Input;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    public class ListBoxEx : ListBox\r\n    {\r\n        private FullscreenTilePanel itemsPanel;\r\n        private bool ignoreKeyRepeat = false;\r\n        private bool ignoreMouseRepeat = false;\r\n        private readonly System.Timers.Timer keyRepeatTimer = new System.Timers.Timer { AutoReset = false, Interval = 150 };\r\n        private readonly System.Timers.Timer mouseRepeatTimer = new System.Timers.Timer { AutoReset = false, Interval = 150 };\r\n\r\n        static ListBoxEx()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ListBoxEx), new FrameworkPropertyMetadata(typeof(ListBoxEx)));\r\n        }\r\n\r\n        public ListBoxEx() : base()\r\n        {\r\n            SelectionChanged += ListBoxEx_SelectionChanged;\r\n            GotFocus += ListBoxEx_GotFocus;\r\n            Loaded += ListBoxEx_Loaded;\r\n            Unloaded += ListBoxEx_Unloaded;\r\n            PreviewMouseWheel += ListBoxEx_MouseWheel;\r\n\r\n            PreviewKeyDown += ListBoxEx_PreviewKeyDown;\r\n\r\n            keyRepeatTimer.Elapsed += (_, __) => ignoreKeyRepeat = false;\r\n            mouseRepeatTimer.Elapsed += (_, __) => ignoreMouseRepeat = false;\r\n        }\r\n\r\n        private void ListBoxEx_PreviewKeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            if (e.Key == Key.Left ||\r\n                e.Key == Key.Right ||\r\n                e.Key == Key.Up ||\r\n                e.Key == Key.Down  ||\r\n                e.Key == Key.PageDown ||\r\n                e.Key == Key.PageUp)\r\n            {\r\n                if (ignoreKeyRepeat)\r\n                {\r\n                    e.Handled = true;\r\n                    return;\r\n                }\r\n\r\n                ignoreKeyRepeat = true;\r\n                keyRepeatTimer.Stop();\r\n                keyRepeatTimer.Start();\r\n            }\r\n        }\r\n\r\n        private void ListBoxEx_MouseWheel(object sender, MouseWheelEventArgs e)\r\n        {\r\n            if (itemsPanel == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (ignoreMouseRepeat)\r\n            {\r\n                e.Handled = true;\r\n                return;\r\n            }\r\n\r\n            ignoreMouseRepeat = true;\r\n            mouseRepeatTimer.Stop();\r\n            mouseRepeatTimer.Start();\r\n\r\n            // Not sure how this can happen since it's not null even if no physical keyboard is connected.\r\n            // However there was one crash report with this happening.\r\n            if (Keyboard.PrimaryDevice.ActiveSource == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (e.Delta < 0)\r\n            {\r\n                var eventArgs = new KeyEventArgs(\r\n                    InputManager.Current.PrimaryKeyboardDevice,\r\n                    Keyboard.PrimaryDevice.ActiveSource,\r\n                    e.Timestamp,\r\n                    itemsPanel.UseHorizontalLayout ? Key.Right : Key.Down);\r\n                eventArgs.RoutedEvent = Keyboard.KeyDownEvent;\r\n                OnKeyDown(eventArgs);\r\n                eventArgs.RoutedEvent = Keyboard.KeyUpEvent;\r\n                OnKeyUp(eventArgs);\r\n            }\r\n            else\r\n            {\r\n                var eventArgs = new KeyEventArgs(\r\n                    InputManager.Current.PrimaryKeyboardDevice,\r\n                    Keyboard.PrimaryDevice.ActiveSource,\r\n                    e.Timestamp,\r\n                    itemsPanel.UseHorizontalLayout ? Key.Left : Key.Up);\r\n                eventArgs.RoutedEvent = Keyboard.KeyDownEvent;\r\n                OnKeyDown(eventArgs);\r\n                eventArgs.RoutedEvent = Keyboard.KeyUpEvent;\r\n                OnKeyUp(eventArgs);\r\n            }\r\n        }\r\n\r\n        private void ListBoxEx_Unloaded(object sender, RoutedEventArgs e)\r\n        {\r\n            if (itemsPanel != null)\r\n            {\r\n                itemsPanel.InternalChildrenGenerated -= ItemsPanel_InternalChildrenGenerated;\r\n            }\r\n        }\r\n\r\n        private void ListBoxEx_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            itemsPanel = ElementTreeHelper.FindVisualChildren<FullscreenTilePanel>(this).FirstOrDefault();\r\n            if (itemsPanel != null)\r\n            {\r\n                itemsPanel.InternalChildrenGenerated += ItemsPanel_InternalChildrenGenerated;\r\n            }\r\n        }\r\n\r\n        private void ItemsPanel_InternalChildrenGenerated(object sender, InternalChildrenGeneratedArgs e)\r\n        {\r\n            FocusSelected();\r\n        }\r\n\r\n        private void ListBoxEx_GotFocus(object sender, RoutedEventArgs e)\r\n        {\r\n            FocusSelected();\r\n        }\r\n\r\n        private void ListBoxEx_SelectionChanged(object sender, SelectionChangedEventArgs e)\r\n        {\r\n            FocusSelected();\r\n        }\r\n\r\n        private void FocusSelected()\r\n        {\r\n            if (IsFocused)\r\n            {\r\n                if (SelectedItem == null && Items.Count > 0)\r\n                {\r\n                    SelectedItem = Items[0];\r\n                }\r\n\r\n                if (SelectedItem != null)\r\n                {\r\n                    var selItem = ItemContainerGenerator.ContainerFromItem(SelectedItem) as FrameworkElement;\r\n                    if (selItem != null && !selItem.IsFocused)\r\n                    {\r\n                        selItem.Focus();\r\n                        selItem.BringIntoView();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/ScrollViewerEx.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    public class ScrollViewerEx : ScrollViewer\r\n    {\r\n        static ScrollViewerEx()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ScrollViewerEx), new FrameworkPropertyMetadata(typeof(ScrollViewerEx)));\r\n        }\r\n\r\n        public ScrollViewerEx() : base()\r\n        {\r\n            Loaded += ScrollViewerEx_Loaded;\r\n            Unloaded += ScrollViewerEx_Unloaded;\r\n        }\r\n\r\n        private void ScrollViewerEx_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            ScrollChanged += ScrollViewerEx_ScrollChanged;\r\n            PreviewKeyDown += ScrollViewerEx_PreviewKeyDown;\r\n        }\r\n\r\n        private void ScrollViewerEx_Unloaded(object sender, RoutedEventArgs e)\r\n        {\r\n            ScrollChanged -= ScrollViewerEx_ScrollChanged;\r\n            PreviewKeyDown -= ScrollViewerEx_PreviewKeyDown;\r\n        }\r\n\r\n        private void ScrollViewerEx_PreviewKeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            if (ComputedHorizontalScrollBarVisibility != Visibility.Visible)\r\n            {\r\n                if (e.Key == Key.Left)\r\n                {\r\n                    MoveFocus(new TraversalRequest(FocusNavigationDirection.Left));\r\n                    e.Handled = true;\r\n                    return;\r\n                }\r\n                else if (e.Key == Key.Right)\r\n                {\r\n                    MoveFocus(new TraversalRequest(FocusNavigationDirection.Right));\r\n                    e.Handled = true;\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (e.Key == Key.Up && VerticalOffset == 0)\r\n            {\r\n                MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));\r\n                e.Handled = true;\r\n                return;\r\n            }\r\n            else if (e.Key == Key.Down && VerticalOffset >= ScrollableHeight)\r\n            {\r\n                MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));\r\n                e.Handled = true;\r\n                return;\r\n            }\r\n        }\r\n\r\n        private void ScrollViewerEx_ScrollChanged(object sender, ScrollChangedEventArgs e)\r\n        {\r\n            if (e.VerticalChange == 0 && e.HorizontalChange == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (VerticalOffset == 0)\r\n            {\r\n                MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));\r\n                e.Handled = true;\r\n            }\r\n            else if (VerticalOffset >= ScrollableHeight)\r\n            {\r\n                MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));\r\n                e.Handled = true;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/Audio.xaml",
    "content": "﻿<local:SettingsSectionControl x:Class=\"Playnite.FullscreenApp.Controls.SettingsSections.Audio\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Controls.SettingsSections\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\">\r\n    <StackPanel>        \r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsInterfaceVolume}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"/>\r\n            <pctrls:SliderEx x:Name=\"SliderInterfaceVolume\" DockPanel.Dock=\"Right\"\r\n                             pbeh:FocusBahaviors.OnVisibilityFocus=\"True\"\r\n                             Style=\"{DynamicResource SettingsSectionSlider}\" />\r\n        </DockPanel>\r\n\r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsMusiVolume}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"/>\r\n            <pctrls:SliderEx x:Name=\"SliderMusicVolume\" DockPanel.Dock=\"Right\"\r\n                             Style=\"{DynamicResource SettingsSectionSlider}\" />\r\n        </DockPanel>\r\n\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleMuteInBackground\"\r\n                            Style=\"{DynamicResource SettingsSectionCheckbox}\"\r\n                            Content=\"{DynamicResource LOCSettingsMuteBackground}\" />\r\n    </StackPanel>\r\n</local:SettingsSectionControl>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/Audio.xaml.cs",
    "content": "﻿using Playnite.Audio;\r\nusing Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Visuals.xaml\r\n    /// </summary>\r\n    public partial class Audio : SettingsSectionControl\r\n    {\r\n        public Audio()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        public Audio(FullscreenAppViewModel mainModel)\r\n        {\r\n            InitializeComponent();\r\n\r\n            SliderInterfaceVolume.Minimum = 0;\r\n            SliderInterfaceVolume.Maximum = 1;\r\n            SliderInterfaceVolume.SmallChange = 0.05;\r\n            SliderInterfaceVolume.LargeChange = 0.05;\r\n            SliderInterfaceVolume.TickFrequency = 0.05;\r\n            SliderInterfaceVolume.IsSnapToTickEnabled = true;\r\n            BindingTools.SetBinding(\r\n                SliderInterfaceVolume,\r\n                Slider.ValueProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.InterfaceVolume),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            SliderMusicVolume.Minimum = 0;\r\n            SliderMusicVolume.Maximum = 1;\r\n            SliderMusicVolume.SmallChange = 0.05;\r\n            SliderMusicVolume.LargeChange = 0.05;\r\n            SliderMusicVolume.TickFrequency = 0.05;\r\n            SliderMusicVolume.IsSnapToTickEnabled = true;\r\n            BindingTools.SetBinding(\r\n                SliderMusicVolume,\r\n                Slider.ValueProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.BackgroundVolume),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleMuteInBackground,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MuteInBackground),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/General.xaml",
    "content": "﻿<local:SettingsSectionControl x:Class=\"Playnite.FullscreenApp.Controls.SettingsSections.General\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Controls.SettingsSections\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"550\" d:DesignWidth=\"800\">\r\n    <StackPanel>\r\n        <StackPanel.Resources>\r\n            <Style TargetType=\"pctrls:CheckBoxEx\" BasedOn=\"{StaticResource SettingsSectionCheckbox}\" />\r\n            <Style TargetType=\"pctrls:ComboBoxEx\" BasedOn=\"{StaticResource SettingsSectionCombobox}\" />\r\n        </StackPanel.Resources>\r\n\r\n        <DockPanel LastChildFill=\"False\"\r\n                   IsEnabled=\"{Binding IsChecked, ElementName=TogglePrimaryDisplayOnly, Converter={StaticResource NegateConverter}}\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsTargetDisplay}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\" />\r\n            <pctrls:ComboBoxEx x:Name=\"SelectMonitor\" DockPanel.Dock=\"Right\" />\r\n        </DockPanel>\r\n\r\n        <pctrls:CheckBoxEx x:Name=\"TogglePrimaryDisplayOnly\"\r\n                           pbeh:FocusBahaviors.OnVisibilityFocus=\"True\"\r\n                           Content=\"{DynamicResource LOCSettingsAlwaysUsePrimaryDisplay}\"  />\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleBattery\"\r\n                           Content=\"{DynamicResource LOCSettingsShowBatteryStatus}\"  />\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleBatteryPercentage\"\r\n                           Content=\"{DynamicResource LOCSettingsShowBatteryPercentage}\"  />\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleClock\"\r\n                           Content=\"{DynamicResource LOCSettingsShowClock}\"  />\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleMinimizeAfterGame\"\r\n                           Content=\"{DynamicResource LOCSettingsMinimizeAfterStartingGame}\"\r\n                           Tag=\"{DynamicResource LOCSettingsMinimizeAfterStartingGameDescription}\"/>\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleAsyncImageLoad\"\r\n                           Content=\"{DynamicResource LOCSettingsAsyncImageLoading}\"\r\n                           ContentStringFormat=\"{}{0} *\"\r\n                           Tag=\"{DynamicResource LOCSettingsAsyncImageLoadingTooltip}\"/>\r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsImageScalerMode}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\" />\r\n            <pctrls:ComboBoxEx x:Name=\"SelectImageScaler\" DockPanel.Dock=\"Right\"\r\n                               Tag=\"{DynamicResource LOCSettingsImageScalerModeTooltip}\"/>\r\n        </DockPanel>\r\n    </StackPanel>\r\n</local:SettingsSectionControl>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/General.xaml.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Visuals.xaml\r\n    /// </summary>\r\n    public partial class General : SettingsSectionControl\r\n    {\r\n        public General()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        public General(FullscreenAppViewModel mainModel)\r\n        {\r\n            InitializeComponent();\r\n\r\n            SelectMonitor.ItemsSource = mainModel.AppSettings.Fullscreen.AvailableScreens;\r\n            SelectMonitor.DisplayMemberPath = nameof(System.Windows.Forms.Screen.DeviceName);\r\n            BindingTools.SetBinding(\r\n                SelectMonitor,\r\n                Selector.SelectedIndexProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.Monitor),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleBattery,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.ShowBattery),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleBatteryPercentage,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.ShowBatteryPercentage),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleClock,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.ShowClock),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                TogglePrimaryDisplayOnly,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.UsePrimaryDisplay),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleAsyncImageLoad,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.AsyncImageLoading),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleMinimizeAfterGame,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MinimizeAfterGameStartup),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                SelectImageScaler,\r\n                Selector.SelectedValueProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.ImageScalerMode),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n            SelectorBehaviors.SetEnumSource(SelectImageScaler, typeof(Playnite.ImageLoadScaling));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/Input.xaml",
    "content": "﻿<local:SettingsSectionControl x:Class=\"Playnite.FullscreenApp.Controls.SettingsSections.Input\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Controls.SettingsSections\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n             mc:Ignorable=\"d\"             \r\n             d:DesignHeight=\"550\" d:DesignWidth=\"800\">\r\n    <StackPanel>\r\n        <StackPanel.Resources>\r\n            <Style TargetType=\"pctrls:CheckBoxEx\" BasedOn=\"{StaticResource SettingsSectionCheckbox}\" />\r\n        </StackPanel.Resources>\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleMouseCursor\"\r\n                           pbeh:FocusBahaviors.OnVisibilityFocus=\"True\"\r\n                           Content=\"{DynamicResource LOCSettingsHideMouseCursor}\"  />\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleSwapXA\"\r\n                           IsEnabled=\"{Binding IsChecked, ElementName=ToggleControllerInput}\"\r\n                           Content=\"{DynamicResource LOCSettingsSwapMainViewXAButtons}\"\r\n                           Tag=\"{DynamicResource LOCSettingsSwapMainViewXAButtonsDescriptions}\"/>\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleSwapConfirmCancel\"\r\n                           IsEnabled=\"{Binding IsChecked, ElementName=ToggleControllerInput}\"\r\n                           Content=\"{DynamicResource LOCSettingsSwapConfirmCancelButtons}\"\r\n                           Tag=\"{DynamicResource LOCSettingsSwapConfirmCancelButtonsDescriptions}\"/>\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleGuideFocus\"\r\n                           IsEnabled=\"{Binding IsChecked, ElementName=ToggleControllerInput}\"\r\n                           Content=\"{DynamicResource LOCSettingsRefocusOnGuidButton}\"/>\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleControllerInput\"\r\n                           Content=\"{DynamicResource LOCSettingsXInputProcessing}\"\r\n                           Tag=\"{DynamicResource LOCSettingsXInputProcessingDescription}\"/>\r\n        <StackPanel Name=\"StackControllers\" Margin=\"50,0,0,0\"\r\n                    IsEnabled=\"{Binding IsChecked, ElementName=ToggleControllerInput}\" />\r\n    </StackPanel>\r\n</local:SettingsSectionControl>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/Input.xaml.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\nusing static Playnite.Input.GameControllerManager;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Visuals.xaml\r\n    /// </summary>\r\n    public partial class Input : SettingsSectionControl\r\n    {\r\n        private FullscreenApplication app;\r\n\r\n        public Input()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        public Input(FullscreenAppViewModel mainModel)\r\n        {\r\n            InitializeComponent();\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleMouseCursor,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.HideMouserCursor),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleControllerInput,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.EnableGameControllerSupport),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleSwapXA,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.SwapStartDetailsAction),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleSwapConfirmCancel,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.SwapConfirmCancelButtons),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleGuideFocus,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.GuideButtonFocus),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            app = mainModel.App as FullscreenApplication;\r\n            if (app.GameController != null)\r\n            {\r\n                LoadControllers();\r\n                app.GameController.ControllersChanged += GameController_ControllersChanged;\r\n            }\r\n        }\r\n\r\n        private void LoadControllers()\r\n        {\r\n            StackControllers.Children.Clear();\r\n            if (app.GameController.Controllers.Count == 0)\r\n            {\r\n                StackControllers.Children.Add(new TextBlock\r\n                {\r\n                    Text = LOC.NoControllersDetected.GetLocalized(),\r\n                    Style = FindResource(\"TextBlockBaseStyle\") as Style\r\n                });\r\n                return;\r\n            }\r\n\r\n            foreach (var controller in app.GameController.Controllers)\r\n            {\r\n                var check = new CheckBoxEx()\r\n                {\r\n                    Content = controller.Name\r\n                };\r\n\r\n                BindingTools.SetBinding(\r\n                    check,\r\n                    CheckBox.IsCheckedProperty,\r\n                    controller,\r\n                    nameof(LoadedGameController.Enabled),\r\n                    BindingMode.TwoWay,\r\n                    UpdateSourceTrigger.PropertyChanged);\r\n\r\n                StackControllers.Children.Add(check);\r\n            }\r\n        }\r\n\r\n        private void GameController_ControllersChanged(object sender, EventArgs e)\r\n        {\r\n            LoadControllers();\r\n            ToggleControllerInput.Focus();\r\n        }\r\n\r\n        public override void Dispose()\r\n        {\r\n            if (app.GameController != null)\r\n            {\r\n                app.GameController.ControllersChanged -= GameController_ControllersChanged;\r\n                var newList = app.AppSettings.Fullscreen.DisabledGameControllers.GetClone();\r\n                foreach (var controller in app.GameController.Controllers)\r\n                {\r\n                    if (controller.Enabled && newList.Contains(controller.Path))\r\n                    {\r\n                        newList.Remove(controller.Path);\r\n                    }\r\n                    else if (!controller.Enabled)\r\n                    {\r\n                        newList.AddMissing(controller.Path);\r\n                    }\r\n                }\r\n\r\n                app.AppSettings.Fullscreen.DisabledGameControllers = newList;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/Layout.xaml",
    "content": "﻿<local:SettingsSectionControl x:Class=\"Playnite.FullscreenApp.Controls.SettingsSections.Layout\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Controls.SettingsSections\"             \r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\r\n    <StackPanel>\r\n        <StackPanel.Resources>\r\n            <Style TargetType=\"pctrls:CheckBoxEx\" BasedOn=\"{StaticResource SettingsSectionCheckbox}\" />\r\n            <Style TargetType=\"pctrls:ComboBoxEx\" BasedOn=\"{StaticResource SettingsSectionCombobox}\" />\r\n            <Style TargetType=\"pctrls:SliderEx\" BasedOn=\"{StaticResource SettingsSectionSlider}\" />\r\n        </StackPanel.Resources>\r\n        \r\n        <pctrls:CheckBoxEx x:Name=\"ToggleHorizontalLayout\"\r\n                           Content=\"{DynamicResource LOCSettingsFullscreenHorizontalScrolling}\"\r\n                           pbeh:FocusBahaviors.OnVisibilityFocus=\"True\"/>\r\n\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleSmoothScrolling\"\r\n                           Content=\"{DynamicResource LOCSmoothScrolling}\" />\r\n\r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCColumns}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\" />\r\n            <pctrls:SliderEx x:Name=\"SliderColumns\" DockPanel.Dock=\"Right\" />\r\n            <TextBlock Text=\"{Binding Value, ElementName=SliderColumns}\" VerticalAlignment=\"Center\" DockPanel.Dock=\"Right\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"\r\n                       TextAlignment=\"Right\" Margin=\"0,0,10,0\"/>\r\n        </DockPanel>\r\n\r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCRows}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"/>\r\n            <pctrls:SliderEx x:Name=\"SliderRows\" DockPanel.Dock=\"Right\"/>\r\n            <TextBlock Text=\"{Binding Value, ElementName=SliderRows}\" DockPanel.Dock=\"Right\"\r\n                       VerticalAlignment=\"Center\" Style=\"{DynamicResource SettingsSectionText}\"\r\n                       TextAlignment=\"Right\" Margin=\"0,0,10,0\"/>\r\n        </DockPanel>\r\n\r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsGridItemSpacing}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"/>\r\n            <pctrls:SliderEx x:Name=\"SliderItemSpacing\" DockPanel.Dock=\"Right\" />\r\n            <TextBlock Text=\"{Binding Value, ElementName=SliderItemSpacing}\" DockPanel.Dock=\"Right\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"\r\n                       TextAlignment=\"Right\" Margin=\"0,0,10,0\"/>\r\n        </DockPanel>\r\n    </StackPanel>\r\n</local:SettingsSectionControl>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/Layout.xaml.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Visuals.xaml\r\n    /// </summary>\r\n    public partial class Layout : SettingsSectionControl\r\n    {\r\n        public Layout()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        public Layout(FullscreenAppViewModel mainModel)\r\n        {\r\n            InitializeComponent();\r\n\r\n            SliderColumns.Minimum = 1;\r\n            SliderColumns.Maximum = 50;\r\n            SliderColumns.TickFrequency = 1;\r\n            SliderColumns.IsSnapToTickEnabled = true;\r\n            BindingTools.SetBinding(\r\n                SliderColumns,\r\n                Slider.ValueProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.Columns),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n            BindingTools.SetBinding(\r\n                    SliderColumns,\r\n                    Slider.IsEnabledProperty,\r\n                    mainModel.AppSettings.Fullscreen,\r\n                    nameof(FullscreenSettings.HorizontalLayout),\r\n                    BindingMode.OneWay,\r\n                    UpdateSourceTrigger.PropertyChanged);\r\n\r\n            SliderRows.Minimum = 1;\r\n            SliderRows.Maximum = 50;\r\n            SliderRows.TickFrequency = 1;\r\n            SliderRows.IsSnapToTickEnabled = true;\r\n            BindingTools.SetBinding(\r\n                SliderRows,\r\n                Slider.ValueProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.Rows),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n            BindingTools.SetBinding(\r\n                    SliderRows,\r\n                    Slider.IsEnabledProperty,\r\n                    mainModel.AppSettings.Fullscreen,\r\n                    nameof(FullscreenSettings.HorizontalLayout),\r\n                    BindingMode.OneWay,\r\n                    UpdateSourceTrigger.PropertyChanged,\r\n                    new InvertedBoolenConverter());\r\n\r\n            SliderItemSpacing.Minimum = 0;\r\n            SliderItemSpacing.Maximum = 200;\r\n            SliderItemSpacing.TickFrequency = 1;\r\n            SliderItemSpacing.IsSnapToTickEnabled = true;\r\n            BindingTools.SetBinding(\r\n                SliderItemSpacing,\r\n                Slider.ValueProperty,\r\n                mainModel.AppSettings,\r\n                nameof(PlayniteSettings.FullscreenItemSpacing),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleHorizontalLayout,\r\n                CheckBox.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.HorizontalLayout),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleSmoothScrolling,\r\n                CheckBox.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.SmoothScrolling),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/Menus.xaml",
    "content": "﻿<local:SettingsSectionControl x:Class=\"Playnite.FullscreenApp.Controls.SettingsSections.Menus\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Controls.SettingsSections\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n             mc:Ignorable=\"d\"             \r\n             d:DesignHeight=\"550\" d:DesignWidth=\"800\">\r\n    <StackPanel>\r\n        <StackPanel.Resources>\r\n            <Style TargetType=\"pctrls:CheckBoxEx\" BasedOn=\"{StaticResource SettingsSectionCheckbox}\" />\r\n        </StackPanel.Resources>\r\n\r\n        <TextBlock Text=\"{DynamicResource LOCSettingsShowItemsMainMenuHeader}\"\r\n                   Style=\"{StaticResource SettingsSectionText}\" />\r\n        <StackPanel Margin=\"50,0,0,0\">\r\n            <pctrls:CheckBoxEx x:Name=\"ToggleClients\" Content=\"{DynamicResource LOCMenuClients}\"\r\n                               pbeh:FocusBahaviors.OnVisibilityFocus=\"True\" />\r\n            <pctrls:CheckBoxEx x:Name=\"ToggleExtensions\" Content=\"{DynamicResource LOCExtensions}\"  />\r\n            <pctrls:CheckBoxEx x:Name=\"ToogleTools\" Content=\"{DynamicResource LOCMenuTools}\"  />\r\n            <pctrls:CheckBoxEx x:Name=\"ToggleShutdownSystem\" Content=\"{DynamicResource LOCMenuShutdownSystem}\" />\r\n            <pctrls:CheckBoxEx x:Name=\"ToggleRestartSystem\" Content=\"{DynamicResource LOCMenuRestartSystem}\"  />\r\n            <pctrls:CheckBoxEx x:Name=\"ToggleSuspendSystem\" Content=\"{DynamicResource LOCMenuSuspendSystem}\"  />\r\n            <pctrls:CheckBoxEx x:Name=\"ToggleHibernateSystem\" Content=\"{DynamicResource LOCMenuHibernateSystem}\"  />\r\n            <pctrls:CheckBoxEx x:Name=\"ToggleLockSystem\" Content=\"{DynamicResource LOCMenuLockSystem}\"  />\r\n            <pctrls:CheckBoxEx x:Name=\"ToggleLogoutUser\" Content=\"{DynamicResource LOCMenuLogoutUser}\"  />\r\n            <pctrls:CheckBoxEx x:Name=\"ToggleMinimize\" Content=\"{DynamicResource LOCMinimize}\"  />\r\n        </StackPanel>\r\n    </StackPanel>\r\n</local:SettingsSectionControl>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/Menus.xaml.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Visuals.xaml\r\n    /// </summary>\r\n    public partial class Menus : SettingsSectionControl\r\n    {\r\n        public Menus()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        public Menus(FullscreenAppViewModel mainModel)\r\n        {\r\n            InitializeComponent();\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleHibernateSystem,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainMenuShowHibernate),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleRestartSystem,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainMenuShowRestart),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleShutdownSystem,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainMenuShowShutdown),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleSuspendSystem,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainMenuShowSuspend),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleMinimize,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainMenuShowMinimize),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleLockSystem,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainMenuShowLock),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleLogoutUser,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainMenuShowLogout),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleExtensions,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainMenuShowExtensions),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToogleTools,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainMenuShowTools),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleClients,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainMenuShowClients),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/SettingsSectionControl.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.SettingsSections\r\n{\r\n    public class SettingsSectionControl : UserControl, IDisposable\r\n    {\r\n        public virtual void Dispose()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/Visuals.xaml",
    "content": "﻿<local:SettingsSectionControl x:Class=\"Playnite.FullscreenApp.Controls.SettingsSections.Visuals\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Controls.SettingsSections\"\r\n             xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n             xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\">\r\n    <StackPanel>\r\n        <StackPanel.Resources>\r\n            <Style TargetType=\"pctrls:CheckBoxEx\" BasedOn=\"{StaticResource SettingsSectionCheckbox}\" />\r\n            <Style TargetType=\"pctrls:ComboBoxEx\" BasedOn=\"{StaticResource SettingsSectionCombobox}\" />\r\n            <Style TargetType=\"pctrls:SliderEx\" BasedOn=\"{StaticResource SettingsSectionSlider}\" />\r\n        </StackPanel.Resources>\r\n\r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsSkin}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"/>\r\n            <TextBlock Text=\"*\" Margin=\"5,0,0,0\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\" />\r\n            <pctrls:ComboBoxEx x:Name=\"SelectTheme\" pbeh:FocusBahaviors.OnVisibilityFocus=\"True\" \r\n                               DockPanel.Dock=\"Right\" />\r\n        </DockPanel>\r\n\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleDarkenUninstalled\"\r\n                           Content=\"{DynamicResource LOCSettingsDarkenUninstalledGridCovers}\" />\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleBackgroundOnMain\"\r\n                           Content=\"{DynamicResource LOCSettingsFullscreenBackgroundOnMainScreen}\" />\r\n\r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsBlurWindowBackgrounImage}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"/>\r\n            <pctrls:SliderEx x:Name=\"SliderBackgroundBlurAmount\" DockPanel.Dock=\"Right\" />\r\n        </DockPanel>\r\n\r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsDarkenWindowBackghrounImage}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"/>\r\n            <pctrls:SliderEx x:Name=\"SliderBackgroundDarkenAmount\" DockPanel.Dock=\"Right\" />\r\n        </DockPanel>\r\n\r\n        <pctrls:CheckBoxEx x:Name=\"ToggleGameTitles\"\r\n                           Content=\"{DynamicResource LOCSettingsFullscreenShowGameTitles}\"  />\r\n\r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsFontSize}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"/>\r\n            <TextBlock Text=\"*\" Margin=\"5,0,0,0\"                       \r\n                       Style=\"{DynamicResource SettingsSectionText}\" />\r\n            <pctrls:SliderEx x:Name=\"SliderFontSize\" DockPanel.Dock=\"Right\" />\r\n            <TextBlock Text=\"{Binding Value, ElementName=SliderFontSize}\" DockPanel.Dock=\"Right\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"\r\n                       TextAlignment=\"Right\" Margin=\"0,0,10,0\"/>\r\n        </DockPanel>\r\n\r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsFontSizeSmall}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"/>\r\n            <TextBlock Text=\"*\" Margin=\"5,0,0,0\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\" />\r\n            <pctrls:SliderEx x:Name=\"SliderFontSizeSmall\" DockPanel.Dock=\"Right\" />\r\n            <TextBlock Text=\"{Binding Value, ElementName=SliderFontSizeSmall}\" DockPanel.Dock=\"Right\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\"\r\n                       TextAlignment=\"Right\" Margin=\"0,0,10,0\"/>\r\n        </DockPanel>\r\n\r\n        <DockPanel LastChildFill=\"False\">\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsFullscreenButtonPrompts}\"\r\n                       Style=\"{DynamicResource SettingsSectionText}\" />\r\n            <pctrls:ComboBoxEx x:Name=\"SelectButtonPrompts\" DockPanel.Dock=\"Right\" />\r\n        </DockPanel>\r\n    </StackPanel>\r\n</local:SettingsSectionControl>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SettingsSections/Visuals.xaml.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.SettingsSections\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for Visuals.xaml\r\n    /// </summary>\r\n    public partial class Visuals : SettingsSectionControl\r\n    {\r\n        public Visuals()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        public Visuals(FullscreenAppViewModel mainModel)\r\n        {\r\n            InitializeComponent();\r\n\r\n            SelectTheme.ItemsSource = mainModel.AppSettings.Fullscreen.AvailableThemes;\r\n            SelectTheme.DisplayMemberPath = nameof(ThemeManifest.Name);\r\n            SelectTheme.SelectedValuePath = nameof(ThemeManifest.Id);\r\n            BindingTools.SetBinding(\r\n                SelectTheme,\r\n                Selector.SelectedValueProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.Theme),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            SelectButtonPrompts.ItemsSource = ItemsSource.GetEnumSources(typeof(FullscreenButtonPrompts));\r\n            SelectButtonPrompts.DisplayMemberPath = nameof(ItemsSource.EnumItem.Name);\r\n            SelectButtonPrompts.SelectedValuePath = nameof(ItemsSource.EnumItem.Value);\r\n            BindingTools.SetBinding(\r\n                SelectButtonPrompts,\r\n                Selector.SelectedValueProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.ButtonPrompts),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleGameTitles,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.ShowGameTitles),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleDarkenUninstalled,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.DarkenUninstalledGamesGrid),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            BindingTools.SetBinding(\r\n                ToggleBackgroundOnMain,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.EnableMainBackgroundImage),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            SliderBackgroundDarkenAmount.Minimum = 0;\r\n            SliderBackgroundDarkenAmount.Maximum = 100;\r\n            SliderBackgroundDarkenAmount.TickFrequency = 5;\r\n            SliderBackgroundDarkenAmount.IsSnapToTickEnabled = true;\r\n            BindingTools.SetBinding(\r\n                SliderBackgroundDarkenAmount,\r\n                Slider.ValueProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainBackgroundImageDarkAmount),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n            BindingTools.SetBinding(\r\n                    SliderBackgroundDarkenAmount,\r\n                    Slider.IsEnabledProperty,\r\n                    mainModel.AppSettings.Fullscreen,\r\n                    nameof(FullscreenSettings.EnableMainBackgroundImage),\r\n                    BindingMode.OneWay,\r\n                    UpdateSourceTrigger.PropertyChanged);\r\n\r\n            SliderBackgroundBlurAmount.Minimum = 0;\r\n            SliderBackgroundBlurAmount.Maximum = 100;\r\n            SliderBackgroundBlurAmount.TickFrequency = 5;\r\n            SliderBackgroundBlurAmount.IsSnapToTickEnabled = true;\r\n            BindingTools.SetBinding(\r\n                SliderBackgroundBlurAmount,\r\n                Slider.ValueProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.MainBackgroundImageBlurAmount),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n            BindingTools.SetBinding(\r\n                    SliderBackgroundBlurAmount,\r\n                    Slider.IsEnabledProperty,\r\n                    mainModel.AppSettings.Fullscreen,\r\n                    nameof(FullscreenSettings.EnableMainBackgroundImage),\r\n                    BindingMode.OneWay,\r\n                    UpdateSourceTrigger.PropertyChanged);\r\n\r\n            SliderFontSize.Minimum = 10;\r\n            SliderFontSize.Maximum = 40;\r\n            SliderFontSize.TickFrequency = 1;\r\n            SliderFontSize.IsSnapToTickEnabled = true;\r\n            BindingTools.SetBinding(\r\n                SliderFontSize,\r\n                Slider.ValueProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.FontSize),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n\r\n            SliderFontSizeSmall.Minimum = 10;\r\n            SliderFontSizeSmall.Maximum = 40;\r\n            SliderFontSizeSmall.TickFrequency = 1;\r\n            SliderFontSizeSmall.IsSnapToTickEnabled = true;\r\n            BindingTools.SetBinding(\r\n                SliderFontSizeSmall,\r\n                Slider.ValueProperty,\r\n                mainModel.AppSettings.Fullscreen,\r\n                nameof(FullscreenSettings.FontSizeSmall),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/SliderEx.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    public class SliderEx : Slider\r\n    {\r\n        static SliderEx()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(SliderEx), new FrameworkPropertyMetadata(typeof(SliderEx)));\r\n        }\r\n\r\n        public SliderEx() : base()\r\n        {\r\n            PreviewKeyDown += ComboBoxEx_PreviewKeyDown;\r\n        }\r\n\r\n        private void ComboBoxEx_PreviewKeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            if (e.Key == Key.Left || e.Key == Key.Right)\r\n            {\r\n\r\n            }\r\n            else if (e.Key == Key.Down)\r\n            {\r\n                MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));\r\n                e.Handled = true;\r\n            }\r\n            else if (e.Key == Key.Up)\r\n            {\r\n                MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));\r\n                e.Handled = true;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/ToggleButtonEx.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Input;\r\nusing Playnite.Input;\r\n\r\nnamespace Playnite.FullscreenApp.Controls\r\n{\r\n    public class ToggleButtonEx : ToggleButton\r\n    {\r\n        static ToggleButtonEx()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(ToggleButtonEx), new FrameworkPropertyMetadata(typeof(ToggleButtonEx)));\r\n        }\r\n\r\n        public ToggleButtonEx() : base()\r\n        {\r\n            KeyDown += Ex_KeyDown;\r\n        }\r\n\r\n        private void Ex_KeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            if (e is GameControllerInputEventArgs controllerInput)\r\n            {\r\n                if (controllerInput.Button == GameControllerGesture.ConfirmationBinding)\r\n                {\r\n                    OnClick();\r\n                    e.Handled = true;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/Views/Filters.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.Input;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Automation;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ItemsHost\", Type = typeof(ItemsControl))]\r\n    public class Filters : Control\r\n    {\r\n        private FullscreenAppViewModel mainModel;\r\n        private ItemsControl PanelItemsHost;\r\n\r\n        static Filters()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(Filters), new FrameworkPropertyMetadata(typeof(Filters)));\r\n        }\r\n\r\n        public Filters() : this(FullscreenApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public Filters(FullscreenAppViewModel mainModel) : base()\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n            if (Template == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            PanelItemsHost = Template.FindName(\"PART_ItemsHost\", this) as ItemsControl;\r\n            if (PanelItemsHost == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            PanelItemsHost.InputBindings.Add(new KeyBinding(mainModel.ToggleFiltersCommand, new KeyGesture(Key.Back)));\r\n            PanelItemsHost.InputBindings.Add(new KeyBinding(mainModel.ToggleFiltersCommand, new KeyGesture(Key.Escape)));\r\n            var backInput = new GameControllerInputBinding { Command = mainModel.ToggleFiltersCommand };\r\n            BindingTools.SetBinding(backInput,\r\n                GameControllerInputBinding.ButtonProperty,\r\n                null,\r\n                typeof(GameControllerGesture).GetProperty(nameof(GameControllerGesture.CancellationBinding)));\r\n            PanelItemsHost.InputBindings.Add(backInput);\r\n            BindingTools.SetBinding(PanelItemsHost,\r\n                FocusBahaviors.FocusBindingProperty,\r\n                mainModel,\r\n                nameof(mainModel.FilterPanelVisible));\r\n\r\n            var ButtonClear = new ButtonEx();\r\n            ButtonClear.Command = mainModel.ClearFiltersCommand;\r\n            ButtonClear.Content = ResourceProvider.GetString(LOC.ClearLabel);\r\n            ButtonClear.SetResourceReference(ButtonEx.StyleProperty, \"FilterPanelButtonEx\");\r\n            PanelItemsHost.Items.Add(ButtonClear);\r\n\r\n            AssignBoolFilter(nameof(FilterSettings.IsInstalled), LOC.GameIsInstalledTitle);\r\n            AssignBoolFilter(nameof(FilterSettings.IsUnInstalled), LOC.GameIsUnInstalledTitle);\r\n            AssignBoolFilter(nameof(FilterSettings.Favorite), LOC.GameFavoriteTitle);\r\n            AssignBoolFilter(nameof(FilterSettings.Hidden), LOC.GameHiddenTitle);\r\n            AssignBoolFilter(nameof(FilterSettings.UseAndFilteringStyle), LOC.UseFilterStyleAndTitle);\r\n            AssignFilter(GameField.PluginId, nameof(FilterSettings.Library), LOC.Library);\r\n            AssignFilter(GameField.Platforms, nameof(FilterSettings.Platform), LOC.PlatformTitle);\r\n            AssignFilter(GameField.Categories, nameof(FilterSettings.Category), LOC.CategoryLabel);\r\n\r\n            var ButtonAdditional = new ButtonEx();\r\n            ButtonAdditional.Command = mainModel.OpenAdditionalFiltersCommand;\r\n            ButtonAdditional.Content = ResourceProvider.GetString(LOC.AditionalFilters);\r\n            ButtonAdditional.SetResourceReference(ButtonEx.StyleProperty, \"FilterPanelNagivationButton\");\r\n            BindingTools.SetBinding(\r\n                ButtonAdditional,\r\n                ButtonBase.TagProperty,\r\n                mainModel.AppSettings.Fullscreen.FilterSettings,\r\n                nameof(FullscreenFilterSettings.IsSubAdditionalFilterActive));\r\n            PanelItemsHost.Items.Add(ButtonAdditional);\r\n\r\n            var desc = new TextBlock();\r\n            desc.Text = ResourceProvider.GetString(LOC.MenuSortByTitle);\r\n            desc.SetResourceReference(ButtonEx.StyleProperty, \"FilterPanelText\");\r\n            PanelItemsHost.Items.Add(desc);\r\n\r\n            var SelectSortBy = new ComboBoxEx();\r\n            SelectSortBy.SetResourceReference(ComboBoxEx.StyleProperty, \"FilterPanelComboBoxEx\");\r\n            SelectSortBy.ItemsSource = ItemsSource.GetEnumSources(typeof(SortOrder));\r\n            SelectSortBy.DisplayMemberPath = nameof(ItemsSource.EnumItem.Name);\r\n            SelectSortBy.SelectedValuePath = nameof(ItemsSource.EnumItem.Value);\r\n            BindingTools.SetBinding(\r\n                SelectSortBy,\r\n                Selector.SelectedValueProperty,\r\n                mainModel.AppSettings.Fullscreen.ViewSettings,\r\n                nameof(FullscreenViewSettings.SortingOrder),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n            PanelItemsHost.Items.Add(SelectSortBy);\r\n            AutomationProperties.SetName(SelectSortBy, LOC.MenuSortByTitle.GetLocalized());\r\n\r\n            var SelectSortDirection = new ComboBoxEx();\r\n            SelectSortDirection.SetResourceReference(ComboBoxEx.StyleProperty, \"FilterPanelComboBoxEx\");\r\n            SelectSortDirection.ItemsSource = ItemsSource.GetEnumSources(typeof(SortOrderDirection));\r\n            SelectSortDirection.DisplayMemberPath = nameof(ItemsSource.EnumItem.Name);\r\n            SelectSortDirection.SelectedValuePath = nameof(ItemsSource.EnumItem.Value);\r\n            BindingTools.SetBinding(\r\n                SelectSortDirection,\r\n                Selector.SelectedValueProperty,\r\n                mainModel.AppSettings.Fullscreen.ViewSettings,\r\n                nameof(FullscreenViewSettings.SortingOrderDirection),\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n            PanelItemsHost.Items.Add(SelectSortDirection);\r\n            AutomationProperties.SetName(SelectSortDirection, LOC.MenuSortByDirection.GetLocalized());\r\n\r\n            desc = new TextBlock();\r\n            desc.Text = ResourceProvider.GetString(LOC.SettingsTopPanelFilterPresetsItem);\r\n            desc.SetResourceReference(ButtonEx.StyleProperty, \"FilterPanelText\");\r\n            PanelItemsHost.Items.Add(desc);\r\n\r\n            var ComboFilterPresets = new ComboBoxEx();\r\n            ComboFilterPresets.SetResourceReference(ComboBoxEx.StyleProperty, \"FilterPanelComboBoxEx\");\r\n            BindingTools.SetBinding(ComboFilterPresets,\r\n                ComboBox.ItemsSourceProperty,\r\n                mainModel,\r\n                nameof(mainModel.SortedFilterPresets));\r\n            BindingTools.SetBinding(ComboFilterPresets,\r\n                ComboBox.SelectedItemProperty,\r\n                mainModel,\r\n                nameof(mainModel.ActiveFilterPreset),\r\n                mode: BindingMode.TwoWay);\r\n            ComboFilterPresets.DisplayMemberPath = nameof(FilterPreset.Name);\r\n            PanelItemsHost.Items.Add(ComboFilterPresets);\r\n            AutomationProperties.SetName(ComboFilterPresets, LOC.SettingsTopPanelFilterPresetsItem.GetLocalized());\r\n\r\n            var ButtonSaveFilter = new ButtonEx();\r\n            BindingTools.SetBinding(ButtonSaveFilter,\r\n                ButtonBase.CommandProperty,\r\n                mainModel,\r\n                nameof(mainModel.AddFilterPresetCommand));\r\n            ButtonSaveFilter.SetResourceReference(ButtonEx.ContentTemplateProperty, \"FilterPanelAddPresetTemplate\");\r\n            ButtonSaveFilter.SetResourceReference(ButtonEx.StyleProperty, \"FilterPanelFilterPresetActionButton\");\r\n            AutomationProperties.SetName(ButtonSaveFilter, LOC.FilterPresetSave.GetLocalized());\r\n\r\n            var ButtonRenameFilter = new ButtonEx();\r\n            BindingTools.SetBinding(ButtonRenameFilter,\r\n                ButtonBase.CommandProperty,\r\n                mainModel,\r\n                nameof(mainModel.RenameFilterPresetCommand));\r\n            BindingTools.SetBinding(ButtonRenameFilter,\r\n                ButtonBase.CommandParameterProperty,\r\n                mainModel,\r\n                nameof(mainModel.ActiveFilterPreset));\r\n            ButtonRenameFilter.SetResourceReference(ButtonEx.ContentTemplateProperty, \"FilterPanelRenamePresetTemplate\");\r\n            ButtonRenameFilter.SetResourceReference(ButtonEx.StyleProperty, \"FilterPanelFilterPresetActionButton\");\r\n            AutomationProperties.SetName(ButtonRenameFilter, LOC.RenameTitle.GetLocalized());\r\n\r\n            var ButtonDeleteFilter = new ButtonEx();\r\n            BindingTools.SetBinding(ButtonDeleteFilter,\r\n                ButtonBase.CommandProperty,\r\n                mainModel,\r\n                nameof(mainModel.RemoveFilterPresetCommand));\r\n            BindingTools.SetBinding(ButtonDeleteFilter,\r\n                ButtonBase.CommandParameterProperty,\r\n                mainModel,\r\n                nameof(mainModel.ActiveFilterPreset));\r\n            ButtonDeleteFilter.SetResourceReference(ButtonEx.ContentTemplateProperty, \"FilterPanelRemovePresetTemplate\");\r\n            ButtonDeleteFilter.SetResourceReference(ButtonEx.StyleProperty, \"FilterPanelFilterPresetActionButton\");\r\n            AutomationProperties.SetName(ButtonDeleteFilter, LOC.DeleteAction.GetLocalized());\r\n\r\n            var filterButtonGrid = new UniformGrid { Columns = 3 };\r\n            filterButtonGrid.Children.Add(ButtonSaveFilter);\r\n            filterButtonGrid.Children.Add(ButtonRenameFilter);\r\n            filterButtonGrid.Children.Add(ButtonDeleteFilter);\r\n            PanelItemsHost.Items.Add(filterButtonGrid);\r\n        }\r\n\r\n        private void AssignBoolFilter(string bindBased, string text)\r\n        {\r\n            var check = new CheckBoxEx();\r\n            check.Content = ResourceProvider.GetString(text);\r\n            check.SetResourceReference(CheckBoxEx.StyleProperty, \"FilterPanelCheckBoxEx\");\r\n            BindingTools.SetBinding(\r\n                check,\r\n                ToggleButton.IsCheckedProperty,\r\n                mainModel.AppSettings.Fullscreen.FilterSettings,\r\n                bindBased,\r\n                BindingMode.TwoWay,\r\n                UpdateSourceTrigger.PropertyChanged);\r\n            PanelItemsHost.Items.Add(check);\r\n        }\r\n\r\n        private void AssignFilter(GameField field, string bindBased, string text)\r\n        {\r\n            var button = new ButtonEx();\r\n            button.Content = ResourceProvider.GetString(text);\r\n            button.SetResourceReference(ButtonEx.StyleProperty, \"FilterPanelNagivationButton\");\r\n            button.Command = mainModel.LoadSubFilterCommand;\r\n            button.CommandParameter = field;\r\n            BindingTools.SetBinding(\r\n                button,\r\n                ButtonBase.TagProperty,\r\n                mainModel.AppSettings.Fullscreen.FilterSettings,\r\n                $\"{bindBased}.{nameof(IdItemFilterItemProperties.IsSet)}\");\r\n            PanelItemsHost.Items.Add(button);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/Views/FiltersAdditional.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.Input;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Automation;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\nusing System.Xml.Linq;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_MenuHost\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ButtonBack\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ItemsHost\", Type = typeof(ItemsControl))]\r\n    public class FiltersAdditional : Control, IDisposable\r\n    {\r\n        private FullscreenAppViewModel mainModel;\r\n        private FrameworkElement MenuHost;\r\n        private ButtonBase ButtonBack;\r\n        private ItemsControl ItemsHost;\r\n\r\n        static FiltersAdditional()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(FiltersAdditional), new FrameworkPropertyMetadata(typeof(FiltersAdditional)));\r\n        }\r\n\r\n        public FiltersAdditional() : this(FullscreenApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public FiltersAdditional(FullscreenAppViewModel mainModel) : base()\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n\r\n            if (Template != null)\r\n            {\r\n                MenuHost = Template.FindName(\"PART_MenuHost\", this) as FrameworkElement;\r\n                if (MenuHost != null)\r\n                {\r\n                    MenuHost.InputBindings.Add(new KeyBinding(mainModel.CloseAdditionalFiltersCommand, new KeyGesture(Key.Back)));\r\n                    MenuHost.InputBindings.Add(new KeyBinding(mainModel.CloseAdditionalFiltersCommand, new KeyGesture(Key.Escape)));\r\n                    MenuHost.InputBindings.Add(new KeyBinding() { Command = mainModel.ToggleFiltersCommand, Key = Key.F });\r\n                    var backInput = new GameControllerInputBinding { Command = mainModel.CloseAdditionalFiltersCommand };\r\n                    BindingTools.SetBinding(backInput,\r\n                        GameControllerInputBinding.ButtonProperty,\r\n                        null,\r\n                        typeof(GameControllerGesture).GetProperty(nameof(GameControllerGesture.CancellationBinding)));\r\n                    MenuHost.InputBindings.Add(backInput);\r\n                }\r\n\r\n                ButtonBack = Template.FindName(\"PART_ButtonBack\", this) as ButtonBase;\r\n                if (ButtonBack != null)\r\n                {\r\n                    ButtonBack.Command = mainModel.CloseAdditionalFiltersCommand;\r\n                    BindingTools.SetBinding(ButtonBack,\r\n                         FocusBahaviors.FocusBindingProperty,\r\n                         mainModel,\r\n                         nameof(mainModel.FilterAdditionalPanelVisible));\r\n                    AutomationProperties.SetName(ButtonBack, LOC.BackLabel.GetLocalized());\r\n                }\r\n\r\n                ItemsHost = Template.FindName(\"PART_ItemsHost\", this) as ItemsControl;\r\n                if (ItemsHost != null)\r\n                {\r\n                    XNamespace pns = \"http://schemas.microsoft.com/winfx/2006/xaml/presentation\";\r\n                    ItemsHost.ItemsPanel = Xaml.FromString<ItemsPanelTemplate>(new XDocument(\r\n                        new XElement(pns + nameof(ItemsPanelTemplate),\r\n                            new XElement(pns + nameof(VirtualizingStackPanel)))\r\n                    ).ToString());\r\n                    ItemsHost.Template = Xaml.FromString<ControlTemplate>(new XDocument(\r\n                         new XElement(pns + nameof(ControlTemplate),\r\n                            new XElement(pns + nameof(ScrollViewer),\r\n                                new XAttribute(nameof(ScrollViewer.Focusable), false),\r\n                                new XAttribute(nameof(ScrollViewer.HorizontalScrollBarVisibility), ScrollBarVisibility.Disabled),\r\n                                new XAttribute(nameof(ScrollViewer.VerticalScrollBarVisibility), ScrollBarVisibility.Auto),\r\n                                new XAttribute(nameof(ScrollViewer.CanContentScroll), true),\r\n                                new XElement(pns + nameof(ItemsPresenter))))\r\n                    ).ToString());\r\n\r\n                    AssignFilter(\"LOCGenreLabel\", \"PART_ButtonGenre\", GameField.Genres, nameof(FilterSettings.Genre));\r\n                    AssignFilter(\"LOCGameReleaseYearTitle\", \"PART_ButtonReleaseYear\", GameField.ReleaseYear, nameof(FilterSettings.ReleaseYear));\r\n                    AssignFilter(\"LOCDeveloperLabel\", \"PART_ButtonDeveloper\", GameField.Developers, nameof(FilterSettings.Developer));\r\n                    AssignFilter(\"LOCPublisherLabel\", \"PART_ButtonPublisher\", GameField.Publishers, nameof(FilterSettings.Publisher));\r\n                    AssignFilter(\"LOCFeatureLabel\", \"PART_ButtonFeature\", GameField.Features, nameof(FilterSettings.Feature));\r\n                    AssignFilter(\"LOCTagLabel\", \"PART_ButtonTag\", GameField.Tags, nameof(FilterSettings.Tag));\r\n                    AssignFilter(\"LOCTimePlayed\", \"PART_ButtonPlayTime\", GameField.Playtime, nameof(FilterSettings.PlayTime));\r\n                    AssignFilter(\"LOCInstallSizeLabel\", \"PART_ButtonInstallSize\", GameField.InstallSize, nameof(FilterSettings.InstallSize));\r\n                    AssignFilter(\"LOCCompletionStatus\", \"PART_ButtonCompletionStatus\", GameField.CompletionStatus, nameof(FilterSettings.CompletionStatuses));\r\n                    AssignFilter(\"LOCSeriesLabel\", \"PART_ButtonSeries\", GameField.Series, nameof(FilterSettings.Series));\r\n                    AssignFilter(\"LOCRegionLabel\", \"PART_ButtonRegion\", GameField.Regions, nameof(FilterSettings.Region));\r\n                    AssignFilter(\"LOCSourceLabel\", \"PART_ButtonSource\", GameField.Source, nameof(FilterSettings.Source));\r\n                    AssignFilter(\"LOCAgeRatingLabel\", \"PART_ButtonAgeRating\", GameField.AgeRatings, nameof(FilterSettings.AgeRating));\r\n                    AssignFilter(\"LOCUserScore\", \"PART_ButtonUserScore\", GameField.UserScore, nameof(FilterSettings.UserScore));\r\n                    AssignFilter(\"LOCCommunityScore\", \"PART_ButtonCommunityScore\", GameField.CommunityScore, nameof(FilterSettings.CommunityScore));\r\n                    AssignFilter(\"LOCCriticScore\", \"PART_ButtonCriticScore\", GameField.CriticScore, nameof(FilterSettings.CriticScore));\r\n                    AssignFilter(\"LOCGameLastActivityTitle\", \"PART_ButtonLastActivity\", GameField.LastActivity, nameof(FilterSettings.LastActivity));\r\n                    AssignFilter(\"LOCRecentActivityLabel\", \"PART_ButtonRecentActivity\", GameField.RecentActivity, nameof(FilterSettings.RecentActivity));\r\n                    AssignFilter(\"LOCAddedLabel\", \"PART_ButtonAdded\", GameField.Added, nameof(FilterSettings.Added));\r\n                    AssignFilter(\"LOCModifiedLabel\", \"PART_ButtonModified\", GameField.Modified, nameof(FilterSettings.Modified));\r\n                }\r\n            }\r\n        }\r\n\r\n        private void AssignFilter(string title, string partId, GameField field, string bindBased)\r\n        {\r\n            var button = new ButtonEx();\r\n            button.SetResourceReference(ButtonBase.ContentProperty, title);\r\n            button.SetResourceReference(ButtonBase.StyleProperty, \"FilterPanelNagivationButton\");\r\n            button.Command = mainModel.LoadSubFilterCommand;\r\n            button.CommandParameter = field;\r\n            BindingTools.SetBinding(\r\n                button,\r\n                ButtonBase.TagProperty,\r\n                mainModel.AppSettings.Fullscreen.FilterSettings,\r\n                $\"{bindBased}.{nameof(IdItemFilterItemProperties.IsSet)}\");\r\n\r\n            ItemsHost.Items.Add(button);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/Views/GameDetails.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.Converters;\r\nusing Playnite.FullscreenApp.Markup;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.Input;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Events;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ViewHost\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ButtonContext\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ButtonOptions\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ImageCover\", Type = typeof(Image))]\r\n    [TemplatePart(Name = \"PART_ImageBackground\", Type = typeof(FadeImage))]\r\n    [TemplatePart(Name = \"PART_HtmlDescription\", Type = typeof(HtmlTextView))]\r\n    [TemplatePart(Name = \"PART_ScrollHtmlDescription\", Type = typeof(ScrollViewer))]\r\n    public class GameDetails : Control\r\n    {\r\n        private FullscreenAppViewModel mainModel;\r\n        private FrameworkElement ViewHost;\r\n        private ButtonBase ButtonContext;\r\n        private ButtonBase ButtonOptions;\r\n        private Image ImageCover;\r\n        private FadeImage ImageBackground;\r\n        private HtmlTextView HtmlDescription;\r\n        private ScrollViewer ScrollHtmlDescription;\r\n\r\n        static GameDetails()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(GameDetails), new FrameworkPropertyMetadata(typeof(GameDetails)));\r\n        }\r\n\r\n        public GameDetails() : this(FullscreenApplication.Current?.MainModel)\r\n        {\r\n            DataContextChanged += GameDetails_DataContextChanged;\r\n        }\r\n\r\n        private void GameDetails_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            // Scrollview not resseting causes some incidental issues elswhere, see #2663\r\n            ScrollHtmlDescription?.ScrollToTop();\r\n        }\r\n\r\n        public GameDetails(FullscreenAppViewModel mainModel) : base()\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                var designModel = DesignMainViewModel.DesignIntance;\r\n                this.mainModel = designModel;\r\n                DataContext = designModel.GamesView.Items[0];\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n                this.mainModel.PropertyChanged += MainModel_PropertyChanged;\r\n            }\r\n        }\r\n\r\n        private void MainModel_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(mainModel.SelectedGame) &&\r\n                mainModel.GameDetailsVisible &&\r\n                mainModel.SelectedGame == null)\r\n            {\r\n                // This takes care of case where game is modified in a way that would remove it from current list.\r\n                // Changing favorite status, removing it etc. It would result in empty game details #2458\r\n                // TODO handle properly in future via TODO from SelectedGame property\r\n                if (mainModel.GamesView.CollectionView.Count > 0)\r\n                {\r\n                    if (mainModel.LastValidSelectedGameIndex + 1 > mainModel.GamesView.CollectionView.Count)\r\n                    {\r\n                        mainModel.SelectedGame = mainModel.GamesView.CollectionView.GetItemAt(mainModel.LastValidSelectedGameIndex - 1) as GamesCollectionViewEntry;\r\n                    }\r\n                    else\r\n                    {\r\n                        mainModel.SelectedGame = mainModel.GamesView.CollectionView.GetItemAt(mainModel.LastValidSelectedGameIndex) as GamesCollectionViewEntry;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mainModel.ToggleGameDetailsCommand.Execute(null);\r\n                }\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n            if (Template != null)\r\n            {\r\n                ViewHost = Template.FindName(\"PART_ViewHost\", this) as FrameworkElement;\r\n                if (ViewHost != null)\r\n                {\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.ToggleGameDetailsCommand, Key = Key.Back });\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.ToggleGameDetailsCommand, Key = Key.Escape });\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.SelectPrevGameCommand, Key = Key.F2 });\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.SelectNextGameCommand, Key = Key.F3 });\r\n                    ViewHost.InputBindings.Add(new GameControllerInputBinding(mainModel.SelectPrevGameCommand, ControllerInput.LeftShoulder));\r\n                    ViewHost.InputBindings.Add(new GameControllerInputBinding(mainModel.SelectNextGameCommand, ControllerInput.RightShoulder));\r\n\r\n                    var backInput = new GameControllerInputBinding { Command = mainModel.ToggleGameDetailsCommand };\r\n                    BindingTools.SetBinding(backInput,\r\n                        GameControllerInputBinding.ButtonProperty,\r\n                        null,\r\n                        typeof(GameControllerGesture).GetProperty(nameof(GameControllerGesture.CancellationBinding)));\r\n                    ViewHost.InputBindings.Add(backInput);\r\n\r\n                    BindingTools.SetBinding(ViewHost,\r\n                         FocusBahaviors.FocusBindingProperty,\r\n                         mainModel,\r\n                         nameof(mainModel.GameDetailsFocused));\r\n                }\r\n\r\n                ButtonContext = Template.FindName(\"PART_ButtonContext\", this) as ButtonBase;\r\n                if (ButtonContext != null)\r\n                {\r\n                    BindingTools.SetBinding(\r\n                        ButtonContext,\r\n                        ButtonBase.CommandProperty,\r\n                        mainModel,\r\n                        $\"{nameof(mainModel.SelectedGameDetails)}.{nameof(mainModel.SelectedGameDetails.ContextActionCommand)}\");\r\n                    BindingTools.SetBinding(\r\n                        ButtonContext,\r\n                        ButtonBase.ContentProperty,\r\n                        mainModel,\r\n                        $\"{nameof(mainModel.SelectedGameDetails)}.{nameof(mainModel.SelectedGameDetails.ContextActionDescription)}\");\r\n                }\r\n\r\n                ButtonOptions = Template.FindName(\"PART_ButtonOptions\", this) as ButtonBase;\r\n                if (ButtonOptions != null)\r\n                {\r\n                    ButtonOptions.Command = mainModel.OpenGameMenuCommand;\r\n                }\r\n\r\n                ImageCover = Template.FindName(\"PART_ImageCover\", this) as Image;\r\n                if (ImageCover != null)\r\n                {\r\n                    var sourceBinding = new PriorityBinding();\r\n                    sourceBinding.Bindings.Add(new Binding()\r\n                    {\r\n                        Path = new PropertyPath(nameof(GamesCollectionViewEntry.CoverImageObject)),\r\n                        Converter = new NullToDependencyPropertyUnsetConverter()\r\n                    });\r\n                    sourceBinding.Bindings.Add(new Binding()\r\n                    {\r\n                        Path = new PropertyPath(nameof(GamesCollectionViewEntry.DefaultCoverImageObject)),\r\n                        Converter = new NullToDependencyPropertyUnsetConverter()\r\n                    });\r\n\r\n                    BindingOperations.SetBinding(ImageCover, Image.SourceProperty, sourceBinding);\r\n                }\r\n\r\n                ImageBackground = Template.FindName(\"PART_ImageBackground\", this) as FadeImage;\r\n                if (ImageBackground != null)\r\n                {\r\n                    ImageBackground.SourceUpdateDelay = 100;\r\n                    BindingTools.SetBinding(ImageBackground,\r\n                        FadeImage.SourceProperty,\r\n                        nameof(GamesCollectionViewEntry.DisplayBackgroundImageObject));\r\n                }\r\n\r\n                HtmlDescription = Template.FindName(\"PART_HtmlDescription\", this) as HtmlTextView;\r\n                if (HtmlDescription != null)\r\n                {\r\n                    BindingTools.SetBinding(HtmlDescription,\r\n                        HtmlTextView.HtmlTextProperty,\r\n                        nameof(GamesCollectionViewEntry.Description));\r\n                    HtmlDescription.TemplatePath = ThemeFile.GetFilePath(\"DescriptionView.html\");\r\n                }\r\n\r\n                ControlTemplateTools.InitializePluginControls(\r\n                    mainModel.Extensions,\r\n                    Template,\r\n                    this,\r\n                    ApplicationMode.Fullscreen,\r\n                    mainModel,\r\n                    $\"{nameof(FullscreenAppViewModel.SelectedGameDetails)}.{nameof(GameDetailsViewModel.Game)}.{nameof(GameDetailsViewModel.Game.Game)}\");\r\n\r\n                ScrollHtmlDescription = Template.FindName(\"PART_ScrollHtmlDescription\", this) as ScrollViewer;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/Views/GameStatus.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.Converters;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ViewHost\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_PanelActionButtons\", Type = typeof(Panel))]\r\n    [TemplatePart(Name = \"PART_TextStatus\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_ImageCover\", Type = typeof(Image))]\r\n    public class GameStatus : Control\r\n    {\r\n        private FullscreenAppViewModel mainModel;\r\n        private FrameworkElement ViewHost;\r\n        private Panel PanelActionButtons;\r\n        private TextBlock TextStatus;\r\n        private Image ImageCover;\r\n\r\n        static GameStatus()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(GameStatus), new FrameworkPropertyMetadata(typeof(GameStatus)));\r\n        }\r\n\r\n        public GameStatus() : this(FullscreenApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public GameStatus(FullscreenAppViewModel mainModel) : base()\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n            if (Template == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            ViewHost = Template.FindName(\"PART_ViewHost\", this) as FrameworkElement;\r\n            if (ViewHost != null)\r\n            {\r\n                BindingTools.SetBinding(ViewHost,\r\n                     FocusBahaviors.FocusBindingProperty,\r\n                     mainModel,\r\n                     nameof(mainModel.GameStatusVisible));\r\n            }\r\n\r\n            PanelActionButtons = Template.FindName(\"PART_PanelActionButtons\", this) as Panel;\r\n            if (PanelActionButtons != null)\r\n            {\r\n                var buttonClose = new ButtonEx();\r\n                buttonClose.Content = ResourceProvider.GetString(LOC.CloseLabel);\r\n                buttonClose.SetResourceReference(ButtonEx.StyleProperty, \"ButtonGameStatusAction\");\r\n                buttonClose.Command = mainModel.CloseGameStatusCommand;\r\n                PanelActionButtons.Children.Add(buttonClose);\r\n            }\r\n\r\n            TextStatus = Template.FindName(\"PART_TextStatus\", this) as TextBlock;\r\n            if (TextStatus != null)\r\n            {\r\n                BindingTools.SetBinding(TextStatus,\r\n                     TextBlock.TextProperty,\r\n                     nameof(GameStatusViewModel.GameStatusText));\r\n            }\r\n\r\n            ImageCover = Template.FindName(\"PART_ImageCover\", this) as Image;\r\n            if (ImageCover != null)\r\n            {\r\n                var sourceBinding = new PriorityBinding();\r\n                sourceBinding.Bindings.Add(new Binding()\r\n                {\r\n                    Path = new PropertyPath($\"{nameof(GameStatusViewModel.Game)}.{nameof(GamesCollectionViewEntry.CoverImageObject)}\"),\r\n                    Converter = new NullToDependencyPropertyUnsetConverter()\r\n                });\r\n                sourceBinding.Bindings.Add(new Binding()\r\n                {\r\n                    Path = new PropertyPath($\"{nameof(GameStatusViewModel.Game)}.{nameof(GamesCollectionViewEntry.DefaultCoverImageObject)}\"),\r\n                    Converter = new NullToDependencyPropertyUnsetConverter()\r\n                });\r\n\r\n                BindingOperations.SetBinding(ImageCover, Image.SourceProperty, sourceBinding);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Controls/Views/Main.cs",
    "content": "﻿using Playnite.Behaviors;\r\nusing Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.Converters;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.Input;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Events;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Automation;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Controls.Primitives;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Xml.Linq;\r\n\r\nnamespace Playnite.FullscreenApp.Controls.Views\r\n{\r\n    [TemplatePart(Name = \"PART_ViewHost\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_MainHost\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ButtonMainMenu\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_ButtonNotifications\", Type = typeof(ButtonBase))]\r\n    [TemplatePart(Name = \"PART_TextClock\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_TextBatteryPercentage\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_ElemBatteryStatus\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_TextProgressTooltip\", Type = typeof(TextBlock))]\r\n    [TemplatePart(Name = \"PART_ElemProgressIndicator\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemExtraFilterActive\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemSearchActive\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ListGameItems\", Type = typeof(ListBox))]\r\n    [TemplatePart(Name = \"PART_ButtonInstall\", Type = typeof(ButtonEx))]\r\n    [TemplatePart(Name = \"PART_ButtonPlay\", Type = typeof(ButtonEx))]\r\n    [TemplatePart(Name = \"PART_ButtonSearch\", Type = typeof(ButtonEx))]\r\n    [TemplatePart(Name = \"PART_ButtonFilter\", Type = typeof(ButtonEx))]\r\n    [TemplatePart(Name = \"PART_ButtonDetails\", Type = typeof(ButtonEx))]\r\n    [TemplatePart(Name = \"PART_ButtonGameOptions\", Type = typeof(ButtonEx))]\r\n    [TemplatePart(Name = \"PART_ElemFilters\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ElemFiltersAdditional\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ContentFilterItems\", Type = typeof(ContentControl))]\r\n    [TemplatePart(Name = \"PART_ElemGameDetails\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ImageBackground\", Type = typeof(FadeImage))]\r\n    [TemplatePart(Name = \"PART_FilterPresetSelector\", Type = typeof(FilterPresetSelector))]\r\n    [TemplatePart(Name = \"PART_ElemGameStatus\", Type = typeof(FrameworkElement))]\r\n    [TemplatePart(Name = \"PART_ButtonProgramUpdate\", Type = typeof(ButtonBase))]\r\n    public class Main : Control\r\n    {\r\n        private FullscreenAppViewModel mainModel;\r\n        private FrameworkElement ViewHost;\r\n        private FrameworkElement MainHost;\r\n        private ButtonBase ButtonMainMenu;\r\n        private ButtonBase ButtonNotifications;\r\n        private ButtonBase ButtonProgramUpdate;\r\n        private TextBlock TextClock;\r\n        private TextBlock TextBatteryPercentage;\r\n        private FrameworkElement ElemBatteryStatus;\r\n        private TextBlock TextProgressTooltip;\r\n        private FrameworkElement ElemProgressIndicator;\r\n        private FrameworkElement ElemExtraFilterActive;\r\n        private FrameworkElement ElemSearchActive;\r\n        private ListBox ListGameItems;\r\n        private ButtonEx ButtonInstall;\r\n        private ButtonEx ButtonPlay;\r\n        private ButtonEx ButtonSearch;\r\n        private ButtonEx ButtonFilter;\r\n        private ButtonEx ButtonDetails;\r\n        private ButtonEx ButtonGameOptions;\r\n        private FrameworkElement ElemFilters;\r\n        private FrameworkElement ElemFiltersAdditional;\r\n        private ContentControl ContentFilterItems;\r\n        private FrameworkElement ElemGameDetails;\r\n        private FadeImage ImageBackground;\r\n        private FrameworkElement ElemGameStatus;\r\n\r\n        static Main()\r\n        {\r\n            DefaultStyleKeyProperty.OverrideMetadata(typeof(Main), new FrameworkPropertyMetadata(typeof(Main)));\r\n        }\r\n\r\n        public Main() : this(FullscreenApplication.Current?.MainModel)\r\n        {\r\n        }\r\n\r\n        public Main(FullscreenAppViewModel mainModel) : base()\r\n        {\r\n            if (DesignerProperties.GetIsInDesignMode(this))\r\n            {\r\n                this.mainModel = DesignMainViewModel.DesignIntance;\r\n                DataContext = this.mainModel;\r\n            }\r\n            else if (mainModel != null)\r\n            {\r\n                this.mainModel = mainModel;\r\n            }\r\n\r\n            this.mainModel.AppSettings.Fullscreen.PropertyChanged += Fullscreen_PropertyChanged;\r\n            this.mainModel.PropertyChanged += MainModel_PropertyChanged;\r\n        }\r\n\r\n        private void MainModel_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(FullscreenAppViewModel.GameDetailsVisible))\r\n            {\r\n                SetDetailsElemBindings();\r\n            }\r\n\r\n            if (e.PropertyName == nameof(FullscreenAppViewModel.ActiveFilterPreset))\r\n            {\r\n                var panel = ElementTreeHelper.FindVisualChildren<FullscreenTilePanel>(ListGameItems).FirstOrDefault();\r\n                if (panel == null)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                if (panel.UseHorizontalLayout)\r\n                {\r\n                    panel.SetHorizontalOffset(0);\r\n                }\r\n                else\r\n                {\r\n                    panel.SetVerticalOffset(0);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Fullscreen_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(FullscreenSettings.EnableMainBackgroundImage))\r\n            {\r\n                SetBackgroundBinding();\r\n            }\r\n            else if (e.PropertyName == nameof(FullscreenSettings.MainBackgroundImageBlurAmount) ||\r\n                     e.PropertyName == nameof(FullscreenSettings.MainBackgroundImageDarkAmount))\r\n            {\r\n                SetBackgroundEffect();\r\n            }\r\n            else if (e.PropertyName == nameof(FullscreenSettings.SwapStartDetailsAction))\r\n            {\r\n                SetListCommandBindings();\r\n            }\r\n        }\r\n\r\n        private void SetListCommandBindings()\r\n        {\r\n            if (ListGameItems == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var swapStartInput = mainModel.AppSettings.Fullscreen.SwapStartDetailsAction;\r\n            ListGameItems.InputBindings.Clear();\r\n            ListGameItems.InputBindings.Add(new KeyBinding() { Command = mainModel.OpenGameMenuCommand, Key = swapStartInput ? Key.A : Key.X });\r\n            ListGameItems.InputBindings.Add(new KeyBinding() { Command = mainModel.ToggleGameDetailsCommand, Key = swapStartInput ? Key.X : Key.A });\r\n            ListGameItems.InputBindings.Add(new KeyBinding() { Command = mainModel.ActivateSelectedCommand, Key = Key.Enter });\r\n            ListGameItems.InputBindings.Add(new GameControllerInputBinding(mainModel.OpenGameMenuCommand, ControllerInput.Start));\r\n            ListGameItems.InputBindings.Add(new GameControllerInputBinding(mainModel.ToggleGameDetailsCommand, swapStartInput ? ControllerInput.X : ControllerInput.A));\r\n            ListGameItems.InputBindings.Add(new GameControllerInputBinding(mainModel.ActivateSelectedCommand, swapStartInput ? ControllerInput.A : ControllerInput.X));\r\n\r\n            ButtonPlay?.SetResourceReference(ButtonEx.InputHintProperty, swapStartInput ? \"ButtonPromptA\" : \"ButtonPromptX\");\r\n            ButtonInstall?.SetResourceReference(ButtonEx.InputHintProperty, swapStartInput ? \"ButtonPromptA\" : \"ButtonPromptX\");\r\n            ButtonDetails?.SetResourceReference(ButtonEx.InputHintProperty, swapStartInput ? \"ButtonPromptX\" : \"ButtonPromptA\");\r\n        }\r\n\r\n        private void SetBackgroundBinding()\r\n        {\r\n            if (ImageBackground == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (mainModel.AppSettings.Fullscreen.EnableMainBackgroundImage)\r\n            {\r\n                ImageBackground.SourceUpdateDelay = 300;\r\n                BindingTools.SetBinding(ImageBackground,\r\n                    FadeImage.SourceProperty,\r\n                    mainModel,\r\n                    $\"{nameof(mainModel.SelectedGame)}.{nameof(GamesCollectionViewEntry.DisplayBackgroundImageObject)}\");\r\n            }\r\n            else\r\n            {\r\n                ImageBackground.Source = null;\r\n            }\r\n        }\r\n\r\n        private void SetBackgroundEffect()\r\n        {\r\n            if (ImageBackground == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (mainModel.AppSettings.Fullscreen.MainBackgroundImageDarkAmount > 0)\r\n            {\r\n                ImageBackground.ImageDarkeningBrush = null;\r\n                ImageBackground.ImageDarkeningBrush = new SolidColorBrush(new Color()\r\n                {\r\n                    ScA = mainModel.AppSettings.Fullscreen.MainBackgroundImageDarkAmount / 100,\r\n                    ScR = 0,\r\n                    ScG = 0,\r\n                    ScB = 0\r\n                });\r\n            }\r\n            else\r\n            {\r\n                ImageBackground.ImageDarkeningBrush = null;\r\n            }\r\n\r\n            if (mainModel.AppSettings.Fullscreen.MainBackgroundImageBlurAmount > 0)\r\n            {\r\n                ImageBackground.IsBlurEnabled = true;\r\n                ImageBackground.HighQualityBlur = true;\r\n                ImageBackground.BlurAmount = mainModel.AppSettings.Fullscreen.MainBackgroundImageBlurAmount;\r\n            }\r\n            else\r\n            {\r\n                ImageBackground.IsBlurEnabled = false;\r\n            }\r\n        }\r\n\r\n        public override void OnApplyTemplate()\r\n        {\r\n            base.OnApplyTemplate();\r\n            if (Template != null)\r\n            {\r\n                ViewHost = Template.FindName(\"PART_ViewHost\", this) as FrameworkElement;\r\n                if (ViewHost != null)\r\n                {\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.OpenMainMenuCommand, Key = Key.F1 });\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.SelectRandomGameCommand, Key = Key.F6 });\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.PrevFilterViewCommand, Key = Key.F2 });\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.NextFilterViewCommand, Key = Key.F3 });\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.OpenSearchCommand, Key = Key.Y });\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.ToggleFiltersCommand, Key = Key.F });\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.SwitchToDesktopCommand, Key = Key.F11 });\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.SelectFilterPresetCommand, Key = Key.R });\r\n                    ViewHost.InputBindings.Add(new KeyBinding() { Command = mainModel.StartInteractivePowerShellCommand, Key = Key.P, Modifiers = ModifierKeys.Control | ModifierKeys.Shift });\r\n\r\n                    ViewHost.InputBindings.Add(new GameControllerInputBinding(mainModel.PrevFilterViewCommand, ControllerInput.LeftShoulder));\r\n                    ViewHost.InputBindings.Add(new GameControllerInputBinding(mainModel.NextFilterViewCommand, ControllerInput.RightShoulder));\r\n                    ViewHost.InputBindings.Add(new GameControllerInputBinding(mainModel.OpenSearchCommand, ControllerInput.Y));\r\n                    ViewHost.InputBindings.Add(new GameControllerInputBinding(mainModel.ToggleFiltersCommand, ControllerInput.RightStick));\r\n                    ViewHost.InputBindings.Add(new GameControllerInputBinding(mainModel.OpenMainMenuCommand, ControllerInput.Back));\r\n                    ViewHost.InputBindings.Add(new GameControllerInputBinding(mainModel.SelectFilterPresetCommand, ControllerInput.LeftStick));\r\n                }\r\n\r\n                MainHost = Template.FindName(\"PART_MainHost\", this) as FrameworkElement;\r\n                if (MainHost != null)\r\n                {\r\n                    BindingTools.SetBinding(MainHost, FrameworkElement.WidthProperty, mainModel, nameof(FullscreenAppViewModel.ViewportWidth));\r\n                    BindingTools.SetBinding(MainHost, FrameworkElement.HeightProperty, mainModel, nameof(FullscreenAppViewModel.ViewportHeight));\r\n                }\r\n\r\n                AssignButtonWithCommand(ref ButtonProgramUpdate, \"PART_ButtonProgramUpdate\", mainModel.OpenUpdatesCommand);\r\n                AssignButtonWithCommand(ref ButtonMainMenu, \"PART_ButtonMainMenu\", mainModel.OpenMainMenuCommand);\r\n                AssignButtonWithCommand(ref ButtonNotifications, \"PART_ButtonNotifications\", mainModel.OpenNotificationsMenuCommand);\r\n                if (ButtonProgramUpdate != null) AutomationProperties.SetName(ButtonProgramUpdate, LOC.UpdateIsAvailableNotificationBody.GetLocalized());\r\n                if (ButtonMainMenu != null) AutomationProperties.SetName(ButtonMainMenu, LOC.ApplicationMenu.GetLocalized());\r\n                if (ButtonNotifications != null) AutomationProperties.SetName(ButtonNotifications, LOC.Notifications.GetLocalized());\r\n\r\n                if (ButtonProgramUpdate != null)\r\n                {\r\n                    BindingTools.SetBinding(ButtonProgramUpdate,\r\n                         Button.VisibilityProperty,\r\n                         mainModel,\r\n                         nameof(mainModel.UpdatesAvailable),\r\n                         converter: new Converters.BooleanToVisibilityConverter());\r\n                }\r\n\r\n                ImageBackground = Template.FindName(\"PART_ImageBackground\", this) as FadeImage;\r\n                if (ImageBackground != null)\r\n                {\r\n                    ImageBackground.SourceUpdateDelay = 300;\r\n                    SetBackgroundBinding();\r\n                    SetBackgroundEffect();\r\n                }\r\n\r\n                TextClock = Template.FindName(\"PART_TextClock\", this) as TextBlock;\r\n                if (TextClock != null)\r\n                {\r\n                    BindingTools.SetBinding(TextClock, TextBlock.TextProperty, mainModel.CurrentTime, nameof(ObservableTime.Time));\r\n                    BindingTools.SetBinding(\r\n                        TextClock,\r\n                        TextBlock.VisibilityProperty,\r\n                        mainModel.AppSettings.Fullscreen,\r\n                        nameof(FullscreenSettings.ShowClock),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                }\r\n\r\n                TextBatteryPercentage = Template.FindName(\"PART_TextBatteryPercentage\", this) as TextBlock;\r\n                if (TextBatteryPercentage != null)\r\n                {\r\n                    BindingTools.SetBinding(TextBatteryPercentage,\r\n                        TextBlock.TextProperty,\r\n                        mainModel.PowerStatus,\r\n                        nameof(ObservablePowerStatus.PercentCharge),\r\n                        stringFormat: \"{0}%\");\r\n                    BindingTools.SetBinding(TextBatteryPercentage,\r\n                        TextBlock.VisibilityProperty,\r\n                        mainModel.AppSettings.Fullscreen,\r\n                        nameof(FullscreenSettings.ShowBatteryPercentage),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                }\r\n\r\n                ElemBatteryStatus = Template.FindName(\"PART_ElemBatteryStatus\", this) as FrameworkElement;\r\n                if (ElemBatteryStatus != null)\r\n                {\r\n                    BindingTools.SetBinding(\r\n                        ElemBatteryStatus,\r\n                        TextBlock.VisibilityProperty,\r\n                        mainModel.AppSettings.Fullscreen,\r\n                        nameof(FullscreenSettings.ShowBattery),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                }\r\n\r\n                TextProgressTooltip = Template.FindName(\"PART_TextProgressTooltip\", this) as TextBlock;\r\n                if (TextProgressTooltip != null)\r\n                {\r\n                    BindingTools.SetBinding(TextProgressTooltip, TextBlock.TextProperty, mainModel, nameof(FullscreenAppViewModel.ProgressStatus));\r\n                    BindingTools.SetBinding(TextProgressTooltip,\r\n                        TextBlock.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.ProgressActive),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                }\r\n\r\n                ElemProgressIndicator = Template.FindName(\"PART_ElemProgressIndicator\", this) as FrameworkElement;\r\n                if (ElemProgressIndicator != null)\r\n                {\r\n                    BindingTools.SetBinding(ElemProgressIndicator,\r\n                        ToggleButton.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.ProgressActive),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                }\r\n\r\n                ElemExtraFilterActive = Template.FindName(\"PART_ElemExtraFilterActive\", this) as FrameworkElement;\r\n                if (ElemExtraFilterActive != null)\r\n                {\r\n                    BindingTools.SetBinding(ElemExtraFilterActive,\r\n                        FrameworkElement.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.IsExtraFilterActive),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                }\r\n\r\n                ElemSearchActive = Template.FindName(\"PART_ElemSearchActive\", this) as FrameworkElement;\r\n                if (ElemSearchActive != null)\r\n                {\r\n                    BindingTools.SetBinding(ElemSearchActive,\r\n                        FrameworkElement.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.IsSearchActive),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                }\r\n\r\n                ListGameItems = Template.FindName(\"PART_ListGameItems\", this) as ListBox;\r\n                if (ListGameItems != null)\r\n                {\r\n                    XNamespace pns = \"http://schemas.microsoft.com/winfx/2006/xaml/presentation\";\r\n                    ListGameItems.ItemsPanel = Xaml.FromString<ItemsPanelTemplate>(new XDocument(\r\n                        new XElement(pns + nameof(ItemsPanelTemplate),\r\n                            new XElement(pns + nameof(FullscreenTilePanel),\r\n                                new XAttribute(nameof(FullscreenTilePanel.Rows), \"{Settings Fullscreen.Rows}\"),\r\n                                new XAttribute(nameof(FullscreenTilePanel.Columns), \"{Settings Fullscreen.Columns}\"),\r\n                                new XAttribute(nameof(FullscreenTilePanel.UseHorizontalLayout), \"{Settings Fullscreen.HorizontalLayout}\"),\r\n                                new XAttribute(nameof(FullscreenTilePanel.ItemAspectRatio), \"{Settings CoverAspectRatio}\"),\r\n                                new XAttribute(nameof(FullscreenTilePanel.ItemSpacing), \"{Settings FullscreenItemSpacing}\"),\r\n                                new XAttribute(nameof(FullscreenTilePanel.SmoothScrollEnabled), \"{Settings Fullscreen.SmoothScrolling}\")))\r\n                    ).ToString());\r\n\r\n                    ListGameItems.ItemTemplate = Xaml.FromString<DataTemplate>(new XDocument(\r\n                        new XElement(pns + nameof(DataTemplate),\r\n                            new XElement(pns + nameof(GameListItem),\r\n                                new XAttribute(nameof(GameListItem.Style), \"{StaticResource ListGameItemTemplate}\")))\r\n                    ).ToString());\r\n\r\n                    ListGameItems.SetResourceReference(ListBoxEx.ItemContainerStyleProperty, \"ListGameItemStyle\");\r\n\r\n                    BindingTools.SetBinding(ListGameItems,\r\n                        ListBox.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.GameListVisible),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                    BindingTools.SetBinding(ListGameItems,\r\n                        ListBox.SelectedItemProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.SelectedGame),\r\n                        BindingMode.TwoWay);\r\n                    BindingTools.SetBinding(ListGameItems,\r\n                        ListBox.ItemsSourceProperty,\r\n                        mainModel,\r\n                        $\"{nameof(FullscreenAppViewModel.GamesView)}.{nameof(FullscreenCollectionView.CollectionView)}\");\r\n                    BindingTools.SetBinding(ListGameItems,\r\n                        FocusBahaviors.FocusBindingProperty,\r\n                        mainModel,\r\n                        nameof(mainModel.GameListFocused));\r\n                }\r\n\r\n                AssignButtonWithCommand(ref ButtonInstall, \"PART_ButtonInstall\", mainModel.ActivateSelectedCommand);\r\n                if (ButtonInstall != null)\r\n                {\r\n                    BindingTools.SetBinding(\r\n                        ButtonInstall,\r\n                        ButtonBase.VisibilityProperty,\r\n                        mainModel,\r\n                        $\"{nameof(FullscreenAppViewModel.SelectedGame)}.{nameof(GamesCollectionViewEntry.IsInstalled)}\",\r\n                        converter: new InvertedBooleanToVisibilityConverter(),\r\n                        fallBackValue: Visibility.Collapsed);\r\n                }\r\n\r\n                AssignButtonWithCommand(ref ButtonPlay, \"PART_ButtonPlay\", mainModel.ActivateSelectedCommand);\r\n                if (ButtonPlay != null)\r\n                {\r\n                    ButtonPlay.Command = mainModel.ActivateSelectedCommand;\r\n                    BindingTools.SetBinding(\r\n                        ButtonPlay,\r\n                        ButtonBase.VisibilityProperty,\r\n                        mainModel,\r\n                        $\"{nameof(FullscreenAppViewModel.SelectedGame)}.{nameof(GamesCollectionViewEntry.IsInstalled)}\",\r\n                        converter: new Converters.BooleanToVisibilityConverter(),\r\n                        fallBackValue: Visibility.Collapsed);\r\n                }\r\n\r\n                AssignButtonWithCommand(ref ButtonDetails, \"PART_ButtonDetails\", mainModel.ToggleGameDetailsCommand);\r\n                if (ButtonDetails != null)\r\n                {\r\n                    BindingTools.SetBinding(\r\n                        ButtonDetails,\r\n                        ButtonBase.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.GameDetailsButtonVisible),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                }\r\n\r\n                AssignButtonWithCommand(ref ButtonGameOptions, \"PART_ButtonGameOptions\", mainModel.OpenGameMenuCommand);\r\n                if (ButtonGameOptions != null)\r\n                {\r\n                    BindingTools.SetBinding(\r\n                        ButtonGameOptions,\r\n                        ButtonBase.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.GameDetailsButtonVisible),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                    ButtonGameOptions.SetResourceReference(ButtonEx.InputHintProperty, \"ButtonPromptStart\");\r\n                }\r\n\r\n                AssignButtonWithCommand(ref ButtonSearch, \"PART_ButtonSearch\", mainModel.OpenSearchCommand);\r\n                ButtonSearch?.SetResourceReference(ButtonEx.InputHintProperty, \"ButtonPromptY\");\r\n                AssignButtonWithCommand(ref ButtonFilter, \"PART_ButtonFilter\", mainModel.ToggleFiltersCommand);\r\n                ButtonFilter?.SetResourceReference(ButtonEx.InputHintProperty, \"ButtonPromptRS\");\r\n\r\n                ElemFilters = Template.FindName(\"PART_ElemFilters\", this) as FrameworkElement;\r\n                if (ElemFilters != null)\r\n                {\r\n                    BindingTools.SetBinding(ElemFilters,\r\n                        FrameworkElement.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.FilterPanelVisible),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                }\r\n\r\n                ElemFiltersAdditional = Template.FindName(\"PART_ElemFiltersAdditional\", this) as FrameworkElement;\r\n                if (ElemFiltersAdditional != null)\r\n                {\r\n                    BindingTools.SetBinding(ElemFiltersAdditional,\r\n                        FrameworkElement.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.FilterAdditionalPanelVisible),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                }\r\n\r\n                ContentFilterItems = Template.FindName(\"PART_ContentFilterItems\", this) as ContentControl;\r\n                if (ContentFilterItems != null)\r\n                {\r\n                    BindingTools.SetBinding(ContentFilterItems,\r\n                        ContentControl.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.SubFilterVisible),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                    BindingTools.SetBinding(ContentFilterItems,\r\n                        ContentControl.ContentProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.SubFilterControl));\r\n                }\r\n\r\n                ElemGameDetails = Template.FindName(\"PART_ElemGameDetails\", this) as FrameworkElement;\r\n                if (ElemGameDetails != null)\r\n                {\r\n                    BindingTools.SetBinding(ElemGameDetails,\r\n                        FrameworkElement.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.GameDetailsVisible),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                    SetDetailsElemBindings();\r\n                }\r\n\r\n                ElemGameStatus = Template.FindName(\"PART_ElemGameStatus\", this) as FrameworkElement;\r\n                if (ElemGameStatus != null)\r\n                {\r\n                    BindingTools.SetBinding(ElemGameStatus,\r\n                        FrameworkElement.VisibilityProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.GameStatusVisible),\r\n                        converter: new Converters.BooleanToVisibilityConverter());\r\n                    BindingTools.SetBinding(ElemGameStatus,\r\n                        FrameworkElement.DataContextProperty,\r\n                        mainModel,\r\n                        nameof(FullscreenAppViewModel.GameStatusView));\r\n                }\r\n\r\n                SetListCommandBindings();\r\n\r\n                ControlTemplateTools.InitializePluginControls(\r\n                    mainModel.Extensions,\r\n                    Template,\r\n                    this,\r\n                    ApplicationMode.Fullscreen,\r\n                    mainModel,\r\n                    $\"{nameof(FullscreenAppViewModel.SelectedGameDetails)}.{nameof(GameDetailsViewModel.Game)}.{nameof(GameDetailsViewModel.Game.Game)}\");\r\n            }\r\n        }\r\n\r\n        private void SetDetailsElemBindings()\r\n        {\r\n            if (ElemGameDetails == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (mainModel.GameDetailsVisible)\r\n            {\r\n                BindingTools.SetBinding(ElemGameDetails,\r\n                    FrameworkElement.DataContextProperty,\r\n                    mainModel,\r\n                    nameof(FullscreenAppViewModel.SelectedGame));\r\n            }\r\n            else\r\n            {\r\n                ElemGameDetails.DataContext = null;\r\n            }\r\n        }\r\n\r\n        private void AssignButtonWithCommand(ref ButtonEx button, string partId, ICommand command)\r\n        {\r\n            button = Template.FindName(partId, this) as ButtonEx;\r\n            if (button != null)\r\n            {\r\n                button.Command = command;\r\n            }\r\n        }\r\n\r\n        private void AssignButtonWithCommand(ref ButtonBase button, string partId, ICommand command)\r\n        {\r\n            button = Template.FindName(partId, this) as ButtonBase;\r\n            if (button != null)\r\n            {\r\n                button.Command = command;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/FullscreenActionSelector.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.FullscreenApp.Windows;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\n\r\nnamespace Playnite.FullscreenApp\r\n{\r\n    public class FullscreenActionSelector : IActionSelector\r\n    {\r\n        public object SelectPlayAction(List<PlayController> controllers, List<GameAction> actions)\r\n        {\r\n            var allActions = new List<SelectableNamedObject<object>>();\r\n            if (controllers.HasItems())\r\n            {\r\n                allActions.AddRange(controllers.Select(a => new SelectableNamedObject<object>(a, a.Name)));\r\n            }\r\n\r\n            if (actions.HasItems())\r\n            {\r\n                allActions.AddRange(actions.Select(a => new SelectableNamedObject<object>(a, a.Name)));\r\n            }\r\n\r\n            ItemSelector.SelectSingle(LOC.SelectActionTitle, \"\", allActions, out var selectedItem);\r\n            return selectedItem;\r\n        }\r\n\r\n        public InstallController SelectInstallAction(List<InstallController> pluginActions)\r\n        {\r\n            ItemSelector.SelectSingle(LOC.SelectActionTitle, \"\", pluginActions.Select(a => new SelectableNamedObject<InstallController>(a, a.Name)).ToList(), out var selectedItem);\r\n            return selectedItem;\r\n        }\r\n\r\n        public UninstallController SelectUninstallAction(List<UninstallController> pluginActions)\r\n        {\r\n            ItemSelector.SelectSingle(LOC.SelectActionTitle, \"\", pluginActions.Select(a => new SelectableNamedObject<UninstallController>(a, a.Name)).ToList(), out var selectedItem);\r\n            return selectedItem;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/FullscreenApplication.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Audio;\r\nusing Playnite.Common;\r\nusing Playnite.Controllers;\r\nusing Playnite.Database;\r\nusing Playnite.FullscreenApp.API;\r\nusing Playnite.FullscreenApp.Markup;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.FullscreenApp.Windows;\r\nusing Playnite.Input;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Events;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.WebView;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Input;\r\nusing static SDL2.SDL;\r\n\r\nnamespace Playnite.FullscreenApp\r\n{\r\n    public class FullscreenApplication : PlayniteApplication\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        private FullscreenAppViewModel mainModel;\r\n        public FullscreenAppViewModel MainModel\r\n        {\r\n            get => mainModel;\r\n            set\r\n            {\r\n                mainModel = value;\r\n                MainModelBase = value;\r\n            }\r\n        }\r\n\r\n        private SplashScreen splashScreen;\r\n        private bool sdlInitialized = false;\r\n        private TimeSpan audioSleepTimeout = new TimeSpan(0, 0, 45);\r\n        public static AudioEngine Audio { get; private set; }\r\n        public static IntPtr NavigateSound { get; private set; }\r\n        public static IntPtr ActivateSound { get; private set; }\r\n        public static IntPtr BackgroundMusic { get; private set; }\r\n        private bool exitSDLEventLoop = false;\r\n\r\n        public new static FullscreenApplication Current\r\n        {\r\n            get => PlayniteApplication.Current == null ? null : (FullscreenApplication)PlayniteApplication.Current;\r\n        }\r\n\r\n        public FullscreenApplication(Func<Application> appInitializer, SplashScreen splashScreen, CmdLineOptions cmdLine)\r\n            : base(appInitializer, ApplicationMode.Fullscreen, cmdLine)\r\n        {\r\n            this.splashScreen = splashScreen;\r\n        }\r\n\r\n        public override void ConfigureViews()\r\n        {\r\n            ProgressWindowFactory.SetWindowType<ProgressWindow>();\r\n            CrashHandlerWindowFactory.SetWindowType<CrashWindow>();\r\n            ExtensionCrashHandlerWindowFactory.SetWindowType<ExtensionCrashWindow>();\r\n            LicenseAgreementWindowFactory.SetWindowType<LicenseAgreementWindow>();\r\n            UpdateWindowFactory.SetWindowType<UpdateWindow>();\r\n            SingleItemSelectionWindowFactory.SetWindowType<SingleItemSelectionWindow>();\r\n            MultiItemSelectionWindowFactory.SetWindowType<MultiItemSelectionWindow>();\r\n            Dialogs = new FullscreenDialogs();\r\n            Playnite.Dialogs.SetHandler(Dialogs);\r\n        }\r\n\r\n        public override bool Startup()\r\n        {\r\n            if (!AppSettings.FirstTimeWizardComplete)\r\n            {\r\n                Dialogs.ShowErrorMessage(ResourceProvider.GetString(\"LOCFullscreenFirstTimeError\"), \"\");\r\n                ReleaseResources();\r\n                FileSystem.DeleteFile(PlaynitePaths.SafeStartupFlagFile);\r\n                ProcessStarter.StartProcess(PlaynitePaths.DesktopExecutablePath, new CmdLineOptions() { MasterInstance = true }.ToString());\r\n                CurrentNative.Shutdown(0);\r\n                return false;\r\n            }\r\n\r\n            if (!ConfigureApplication())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            InstantiateApp();\r\n            AppUriHandler = MainModel.ProcessUriRequest;\r\n            MigrateDatabase();\r\n#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed\r\n            InitSDL();\r\n            SetupInputs();\r\n            InitializeAudio();\r\n            OpenMainViewAsync();\r\n            StartUpdateCheckerAsync();\r\n#pragma warning restore CS4014\r\n            ProcessArguments();\r\n            PropertyChanged += FullscreenApplication_PropertyChanged;\r\n            return true;\r\n        }\r\n\r\n        public override void InstantiateApp()\r\n        {\r\n            Database = new GameDatabase();\r\n            Database.SetAsSingletonInstance();\r\n            Controllers = new GameControllerFactory(Database);\r\n            Extensions = new ExtensionFactory(Database, Controllers, GetApiInstance);\r\n            GamesEditor = new GamesEditor(\r\n                Database,\r\n                Controllers,\r\n                AppSettings,\r\n                Dialogs,\r\n                Extensions,\r\n                this,\r\n                new FullscreenActionSelector());\r\n            Game.DatabaseReference = Database;\r\n            ImageSourceManager.SetDatabase(Database);\r\n            MainModel = new FullscreenAppViewModel(\r\n                Database,\r\n                new MainWindowFactory(),\r\n                Dialogs,\r\n                new ResourceProvider(),\r\n                AppSettings,\r\n                GamesEditor,\r\n                Extensions,\r\n                this);\r\n            PlayniteApiGlobal = GetApiInstance();\r\n            SDK.API.Instance = PlayniteApiGlobal;\r\n        }\r\n\r\n        private void FullscreenApplication_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(PlayniteApplication.IsActive))\r\n            {\r\n                if (Audio != null && AppSettings.Fullscreen.BackgroundVolume > 0)\r\n                {\r\n                    if (AppSettings.Fullscreen.MuteInBackground && IsActive == false)\r\n                    {\r\n                        Audio.PauseMusic();\r\n                    }\r\n                    else if (AppSettings.Fullscreen.MuteInBackground && IsActive == true)\r\n                    {\r\n                        if (Audio.AudioClosed)\r\n                        {\r\n                            Audio.PlayMusic(BackgroundMusic);\r\n                            Audio.SetMusicVolume(AppSettings.Fullscreen.BackgroundVolume);\r\n                        }\r\n                        else\r\n                        {\r\n                            Audio.ResumeMusic();\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (GameController != null && AppSettings.Fullscreen.EnableGameControllerSupport)\r\n                {\r\n                    GameController.StandardProcessingEnabled = IsActive;\r\n                }\r\n            }\r\n        }\r\n\r\n        private async void OpenMainViewAsync()\r\n        {\r\n            Extensions.LoadPlugins(AppSettings.DisabledPlugins, CmdLine.SafeStartup, AppSettings.DevelExtenions.Where(a => a.Selected == true).Select(a => a.Item).ToList());\r\n            Extensions.LoadScripts(AppSettings.DisabledPlugins, CmdLine.SafeStartup, AppSettings.DevelExtenions.Where(a => a.Selected == true).Select(a => a.Item).ToList());\r\n            OnExtensionsLoaded();\r\n\r\n            try\r\n            {\r\n                MainModel.ThirdPartyTools = ThirdPartyToolsList.GetTools(Extensions.LibraryPlugins);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed to load third party tools.\");\r\n            }\r\n\r\n            splashScreen?.Close(new TimeSpan(0));\r\n            MainModel.OpenView();\r\n            CurrentNative.MainWindow = MainModel.Window.Window;\r\n            await MainModel.ProcessStartupLibUpdate();\r\n\r\n            // This is most likely safe place to consider application to be started properly\r\n            FileSystem.DeleteFile(PlaynitePaths.SafeStartupFlagFile);\r\n        }\r\n\r\n        public override void InitializeNative()\r\n        {\r\n            ((App)CurrentNative).InitializeComponent();\r\n        }\r\n\r\n        public override void Restore()\r\n        {\r\n            MainModel?.RestoreWindow();\r\n        }\r\n\r\n        public override void Minimize()\r\n        {\r\n            MainModel?.MinimizeWindow();\r\n        }\r\n\r\n        public override void Restart(bool saveSettings)\r\n        {\r\n            Restart(new CmdLineOptions { MasterInstance = true }, saveSettings);\r\n        }\r\n\r\n        public override void Restart(CmdLineOptions options, bool saveSettings)\r\n        {\r\n            options.MasterInstance = true;\r\n            options.UserDataDir = CmdLine.UserDataDir;\r\n            QuitAndStart(PlaynitePaths.FullscreenExecutablePath, options.ToString(), saveSettings: saveSettings);\r\n        }\r\n\r\n        public override void ShowWindowsNotification(string title, string body, Action action)\r\n        {\r\n            // Fullscreen mode shouldn't show anything since user has no way to interact with it\r\n        }\r\n\r\n        public override void SwitchAppMode(ApplicationMode mode)\r\n        {\r\n            if (mode == ApplicationMode.Desktop)\r\n            {\r\n                MainModel?.SwitchToDesktopMode();\r\n            }\r\n            else\r\n            {\r\n                Restore();\r\n            }\r\n        }\r\n\r\n        public override void ReleaseResources(bool releaseCefSharp = true)\r\n        {\r\n            if (ResourcesReleased)\r\n            {\r\n                return;\r\n            }\r\n\r\n            exitSDLEventLoop = true;\r\n            GameController?.Dispose();\r\n            if (Audio != null)\r\n            {\r\n                Audio.DisposeSound(NavigateSound);\r\n                Audio.DisposeSound(ActivateSound);\r\n                Audio.DisposeMusic(BackgroundMusic);\r\n                Audio.Dispose();\r\n            }\r\n\r\n            SDL_Quit();\r\n            base.ReleaseResources(releaseCefSharp);\r\n        }\r\n\r\n        public static void PlayNavigateSound()\r\n        {\r\n            if (Current.AppSettings.Fullscreen.InterfaceVolume == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            Audio?.PlaySound(NavigateSound);\r\n        }\r\n\r\n        public static void PlayActivateSound()\r\n        {\r\n            if (Current.AppSettings.Fullscreen.InterfaceVolume == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            Audio?.PlaySound(ActivateSound);\r\n        }\r\n\r\n        private void InitSDL()\r\n        {\r\n            if (SDL_Init(SDL_INIT_GAMECONTROLLER | SDL_INIT_AUDIO) < 0)\r\n            {\r\n                logger.Error(\"SDL2 failed to initialize:\");\r\n                logger.Error(SDL_GetError());\r\n                return;\r\n            }\r\n\r\n            if (SDL_GameControllerAddMappingsFromFile(\"gamecontrollerdb.txt\") == -1)\r\n            {\r\n                logger.Error(\"Failed to load game controller mappings:\");\r\n                logger.Error(SDL_GetError());\r\n            }\r\n\r\n            // This should fix some random XInput controller issues\r\n            // https://github.com/libsdl-org/SDL/issues/13047\r\n            // https://github.com/JosefNemec/Playnite/issues/3794\r\n            SDL_SetHint(SDL_HINT_JOYSTICK_RAWINPUT, \"0\");\r\n            SDL_GameControllerEventState(SDL_IGNORE);\r\n            SDLEventLoop();\r\n            sdlInitialized = true;\r\n        }\r\n\r\n\r\n        private void SDLEventLoop()\r\n        {\r\n            Task.Run(async () =>\r\n            {\r\n                while (!exitSDLEventLoop)\r\n                {\r\n                    while (SDL_PollEvent(out var sdlEvent) == 1)\r\n                    {\r\n                        if (sdlEvent.type == SDL_EventType.SDL_CONTROLLERDEVICEADDED)\r\n                        {\r\n                            GameController?.AddController(sdlEvent.cdevice.which, AppSettings.Fullscreen.DisabledGameControllers);\r\n                        }\r\n\r\n                        if (sdlEvent.type == SDL_EventType.SDL_CONTROLLERDEVICEREMOVED)\r\n                        {\r\n                            GameController?.RemoveController(sdlEvent.cdevice.which);\r\n                        }\r\n                    }\r\n\r\n                    GameController?.ProcessInputs();\r\n                    if (Audio?.AudioInitialized == true)\r\n                    {\r\n                        if (!Audio.AudioClosed &&\r\n                            (AppSettings.Fullscreen.BackgroundVolume <= 0 || Audio.GetIsMusicPaused()) &&\r\n                            DateTime.Now - Audio.LastAudioEvent > audioSleepTimeout)\r\n                            Audio.CloseAudio();\r\n                    }\r\n\r\n                    await Task.Delay(16);\r\n                }\r\n            });\r\n        }\r\n\r\n        public void SetupInputs()\r\n        {\r\n            if (!sdlInitialized)\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                if (GameController == null)\r\n                {\r\n                    GameController = new GameControllerManager(InputManager.Current, AppSettings.Fullscreen.DisabledGameControllers)\r\n                    {\r\n                        SimulateAllKeys = false,\r\n                        SimulateNavigationKeys = true,\r\n                        StandardProcessingEnabled = AppSettings.Fullscreen.EnableGameControllerSupport\r\n                    };\r\n                }\r\n\r\n                UpdateConfirmCancelBindings();\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                logger.Error(e, \"Failed intitialize game controller devices.\");\r\n            }\r\n        }\r\n\r\n        public void UpdateConfirmCancelBindings()\r\n        {\r\n            GameControllerGesture.ConfirmationBinding = AppSettings.Fullscreen.SwapConfirmCancelButtons ? ControllerInput.B : ControllerInput.A;\r\n            GameControllerGesture.CancellationBinding = AppSettings.Fullscreen.SwapConfirmCancelButtons ? ControllerInput.A : ControllerInput.B;\r\n        }\r\n\r\n        private void InitializeAudio()\r\n        {\r\n            if (!sdlInitialized)\r\n            {\r\n                return;\r\n            }\r\n\r\n            try\r\n            {\r\n                Audio = new AudioEngine();\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to initialize audio interface.\");\r\n                Dialogs.ShowErrorMessage(LOC.ErrorAudioInterfaceInit, \"\");\r\n                return;\r\n            }\r\n\r\n            var navigationFile = ThemeFile.GetFilePath($@\"audio\\\\navigation\\.({AudioEngine.SupportedFileTypesRegex})\", matchByRegex: true);\r\n            if (!navigationFile.IsNullOrEmpty())\r\n            {\r\n                try\r\n                {\r\n                    NavigateSound = Audio.LoadSound(navigationFile);\r\n                    Audio.SetSoundVolume(NavigateSound, AppSettings.Fullscreen.InterfaceVolume);\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to sound file {navigationFile}\");\r\n                }\r\n            }\r\n\r\n            var activationFile = ThemeFile.GetFilePath($@\"audio\\\\activation\\.({AudioEngine.SupportedFileTypesRegex})\", matchByRegex: true);\r\n            if (!activationFile.IsNullOrEmpty())\r\n            {\r\n                try\r\n                {\r\n                    ActivateSound = Audio.LoadSound(activationFile);\r\n                    Audio.SetSoundVolume(ActivateSound, AppSettings.Fullscreen.InterfaceVolume);\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to sound file {ActivateSound}\");\r\n                }\r\n            }\r\n\r\n            var backgroundSoundPath = ThemeFile.GetFilePath($@\"audio\\\\background\\.({AudioEngine.SupportedFileTypesRegex})\", matchByRegex: true);\r\n            if (!backgroundSoundPath.IsNullOrEmpty())\r\n            {\r\n                try\r\n                {\r\n                    BackgroundMusic = Audio.LoadMusic(backgroundSoundPath);\r\n                    Audio.SetMusicVolume(AppSettings.Fullscreen.BackgroundVolume);\r\n                    if (Current.AppSettings.Fullscreen.BackgroundVolume > 0)\r\n                    {\r\n                        Audio.PlayMusic(BackgroundMusic);\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to music file {ActivateSound}\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public override PlayniteAPI GetApiInstance(ExtensionManifest pluginOwner)\r\n        {\r\n            return new PlayniteAPI\r\n            {\r\n                Addons = new AddonsAPI(Extensions, AppSettings),\r\n                ApplicationInfo = new PlayniteInfoAPI(),\r\n                ApplicationSettings = new PlayniteSettingsAPI(AppSettings, Database),\r\n                Database = new DatabaseAPI(Database),\r\n                Dialogs = Dialogs,\r\n                Emulation = new Emulators.Emulation(),\r\n                MainView = new MainViewAPI(MainModel),\r\n                Notifications = Notifications,\r\n                Paths = new PlaynitePathsAPI(),\r\n                Resources = new ResourceProvider(),\r\n                RootApi = new PlayniteApiRoot(GamesEditor, Extensions, Database, MainModel),\r\n                UriHandler = UriHandler,\r\n                WebViews = new WebViewFactory(AppSettings)\r\n            };\r\n        }\r\n\r\n        public override PlayniteAPI GetApiInstance()\r\n        {\r\n            return new PlayniteAPI\r\n            {\r\n                Addons = new AddonsAPI(Extensions, AppSettings),\r\n                ApplicationInfo = new PlayniteInfoAPI(),\r\n                ApplicationSettings = new PlayniteSettingsAPI(AppSettings, Database),\r\n                Database = new DatabaseAPI(Database),\r\n                Dialogs = Dialogs,\r\n                Emulation = new Emulators.Emulation(),\r\n                MainView = new MainViewAPI(MainModel),\r\n                Notifications = Notifications,\r\n                Paths = new PlaynitePathsAPI(),\r\n                Resources = new ResourceProvider(),\r\n                RootApi = new PlayniteApiRoot(GamesEditor, Extensions, Database, MainModel),\r\n                UriHandler = UriHandler,\r\n                WebViews = new WebViewFactory(AppSettings)\r\n            };\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/FullscreenCollectionView.cs",
    "content": "﻿using Playnite.Database;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.FullscreenApp\r\n{\r\n    public class FullscreenCollectionView : BaseCollectionView\r\n    {\r\n        private PlayniteSettings settings;\r\n        private FullscreenViewSettings viewSettings;\r\n\r\n        public FullscreenCollectionView(\r\n            IGameDatabaseMain database,\r\n            PlayniteSettings settings,\r\n            ExtensionFactory extensions) : base(database, extensions, settings.Fullscreen.FilterSettings, settings)\r\n        {\r\n            this.settings = settings;\r\n            Database.Games.ItemCollectionChanged += Database_GamesCollectionChanged;\r\n            Database.Games.ItemUpdated += Database_GameUpdated;\r\n            viewSettings = settings.Fullscreen.ViewSettings;\r\n            viewSettings.PropertyChanged += ViewSettings_PropertyChanged;\r\n            using (CollectionView.DeferRefresh())\r\n            {\r\n                SetViewDescriptions();\r\n                Items.AddRange(Database.Games.Select(x => new GamesCollectionViewEntry(x, GetLibraryPlugin(x), settings)));\r\n            };\r\n        }\r\n\r\n        public override void Dispose()\r\n        {\r\n            base.Dispose();\r\n            Database.Games.ItemCollectionChanged -= Database_GamesCollectionChanged;\r\n            Database.Games.ItemUpdated -= Database_GameUpdated;\r\n            viewSettings.PropertyChanged -= ViewSettings_PropertyChanged;\r\n        }\r\n\r\n        private void ViewSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if ((new string[]\r\n            {\r\n                nameof(FullscreenViewSettings.SortingOrder),\r\n                nameof(FullscreenViewSettings.SortingOrderDirection)\r\n            }).Contains(e.PropertyName))\r\n            {\r\n                RefreshView();\r\n            }\r\n        }\r\n\r\n        private void SetViewDescriptions()\r\n        {\r\n            var sortDirection = viewSettings.SortingOrderDirection == SortOrderDirection.Ascending ? ListSortDirection.Ascending : ListSortDirection.Descending;\r\n            CollectionView.SortDescriptions.Add(new SortDescription(viewSettings.SortingOrder.ToString(), sortDirection));\r\n            if (viewSettings.SortingOrder != SortOrder.Name)\r\n            {\r\n                CollectionView.SortDescriptions.Add(new SortDescription(\"Name\", ListSortDirection.Ascending));\r\n            }\r\n        }\r\n\r\n        private void Database_GameUpdated(object sender, ItemUpdatedEventArgs<Game> args)\r\n        {\r\n            foreach (var update in args.UpdatedItems)\r\n            {\r\n                var existingItem = Items.FirstOrDefault(a => a.Game.Id == update.NewData.Id);\r\n                if (existingItem != null)\r\n                {\r\n                    // Forces CollectionView to re-sort items without full list refresh.\r\n                    Items.OnItemMoved(existingItem, 0, 0);\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Database_GamesCollectionChanged(object sender, ItemCollectionChangedEventArgs<Game> args)\r\n        {\r\n            // DO NOT use *Range methods for \"Items\" object.\r\n            // It can throw weird exceptions in virtualization panel, directly in WPF (without known fix from MS).\r\n            // https://github.com/JosefNemec/Playnite/issues/796\r\n\r\n            if (args.RemovedItems.Count > 0)\r\n            {\r\n                var removeIds = new HashSet<Guid>(args.RemovedItems.Select(a => a.Id));\r\n                var toRemove = Items.Where(a => removeIds.Contains(a.Id))?.ToList();\r\n                if (toRemove != null)\r\n                {\r\n                    foreach (var item in toRemove)\r\n                    {\r\n                        item.Dispose();\r\n                        Items.Remove(item);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var addList = new List<GamesCollectionViewEntry>();\r\n            foreach (var game in args.AddedItems)\r\n            {\r\n                addList.Add(new GamesCollectionViewEntry(game, GetLibraryPlugin(game), settings));\r\n            }\r\n\r\n            if (addList.Count > 0)\r\n            {\r\n                foreach (var item in addList)\r\n                {\r\n                    Items.Add(item);\r\n                }\r\n            }\r\n        }\r\n\r\n        public override void RefreshView()\r\n        {\r\n            if (IgnoreViewConfigChanges)\r\n            {\r\n                return;\r\n            }\r\n\r\n            Logger.Debug(\"Updating collection view settings.\");\r\n            using (CollectionView.DeferRefresh())\r\n            {\r\n                CollectionView.SortDescriptions.Clear();\r\n                SetViewDescriptions();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/FullscreenDialogs.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.FullscreenApp.Windows;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp\r\n{\r\n    public class FullscreenDialogs : IDialogsFactory\r\n    {\r\n        private readonly SynchronizationContext context;\r\n\r\n        public FullscreenDialogs()\r\n        {\r\n            context = SynchronizationContext.Current;\r\n        }\r\n\r\n        private T Invoke<T>(Func<T> action)\r\n        {\r\n            T result = default(T);\r\n            context.Send((a) =>\r\n            {\r\n                result = action();\r\n            }, null);\r\n\r\n            return result;\r\n        }\r\n\r\n        private void Invoke(Action action)\r\n        {\r\n            context.Send((a) =>\r\n            {\r\n                action();\r\n            }, null);\r\n        }\r\n\r\n        public string SaveFile(string filter)\r\n        {\r\n            return Invoke(() => SystemDialogs.SaveFile(WindowManager.CurrentWindow, filter));\r\n        }\r\n\r\n        public string SaveFile(string filter, string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SaveFile(WindowManager.CurrentWindow, filter, initialDir));\r\n        }\r\n\r\n        public string SaveFile(string filter, bool promptOverwrite)\r\n        {\r\n            return Invoke(() => SystemDialogs.SaveFile(WindowManager.CurrentWindow, filter, promptOverwrite));\r\n        }\r\n\r\n        public string SaveFile(string filter, bool promptOverwrite, string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SaveFile(WindowManager.CurrentWindow, filter, promptOverwrite, initialDir));\r\n        }\r\n\r\n        public string SelectFile(string filter)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFile(WindowManager.CurrentWindow, filter));\r\n        }\r\n\r\n        public string SelectFile(string filter, string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFile(WindowManager.CurrentWindow, filter, initialDir));\r\n        }\r\n\r\n        public List<string> SelectFiles(string filter)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFiles(WindowManager.CurrentWindow, filter));\r\n        }\r\n\r\n        public List<string> SelectFiles(string filter, string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFiles(WindowManager.CurrentWindow, filter, initialDir));\r\n        }\r\n\r\n        public string SelectFolder()\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFolder(WindowManager.CurrentWindow));\r\n        }\r\n\r\n        public string SelectFolder(string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectFolder(WindowManager.CurrentWindow, initialDir));\r\n        }\r\n\r\n        public string SelectIconFile()\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectIconFile(WindowManager.CurrentWindow));\r\n        }\r\n\r\n        public string SelectIconFile(string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectIconFile(WindowManager.CurrentWindow, initialDir));\r\n        }\r\n\r\n        public string SelectImagefile()\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectImageFile(WindowManager.CurrentWindow));\r\n        }\r\n\r\n        public string SelectImagefile(string initialDir)\r\n        {\r\n            return Invoke(() => SystemDialogs.SelectImageFile(WindowManager.CurrentWindow, initialDir));\r\n        }\r\n\r\n        public StringSelectionDialogResult SelectString(string messageBoxText, string caption, string defaultInput)\r\n        {\r\n            return Invoke(() => new TextInputWindow().ShowInput(WindowManager.CurrentWindow, messageBoxText, caption, defaultInput));\r\n        }\r\n\r\n        public StringSelectionDialogResult SelectString(string messageBoxText, string caption, string defaultInput, List<MessageBoxToggle> options)\r\n        {\r\n            return Invoke(() => new TextInputWindow().ShowInput(WindowManager.CurrentWindow, messageBoxText, caption, defaultInput, options));\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options)\r\n        {\r\n            return Invoke(() => new MessageBoxWindow().Show(WindowManager.CurrentWindow, messageBoxText, caption, button, icon, defaultResult, options));\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)\r\n        {\r\n            return ShowMessage(messageBoxText, caption, button, icon, defaultResult, MessageBoxOptions.None);\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon)\r\n        {\r\n            return ShowMessage(messageBoxText, caption, button, icon, MessageBoxResult.None, MessageBoxOptions.None);\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button)\r\n        {\r\n            return ShowMessage(messageBoxText, caption, button, MessageBoxImage.None, MessageBoxResult.None, MessageBoxOptions.None);\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText, string caption)\r\n        {\r\n            return ShowMessage(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxOptions.None);\r\n        }\r\n\r\n        public MessageBoxResult ShowMessage(string messageBoxText)\r\n        {\r\n            return ShowMessage(messageBoxText, string.Empty, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None, MessageBoxOptions.None);\r\n        }\r\n\r\n        public void ShowSelectableString(string messageBoxText, string caption, string inputText)\r\n        {\r\n            ShowMessage(messageBoxText + Environment.NewLine + inputText, caption);\r\n        }\r\n\r\n        public MessageBoxResult ShowErrorMessage(string messageBoxText, string caption)\r\n        {\r\n            return ShowMessage(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Error);\r\n        }\r\n\r\n        public MessageBoxResult ShowErrorMessage(string messageBoxText)\r\n        {\r\n            return ShowMessage(messageBoxText, string.Empty, MessageBoxButton.OK, MessageBoxImage.Error);\r\n        }\r\n\r\n        public MessageBoxOption ShowMessage(string messageBoxText, string caption, MessageBoxImage icon, List<MessageBoxOption> options)\r\n        {\r\n            return Invoke(() => new MessageBoxWindow().ShowCustom(WindowManager.CurrentWindow, messageBoxText, caption, icon, options));\r\n        }\r\n\r\n        public ImageFileOption ChooseImageFile(List<ImageFileOption> files, string caption = null, double itemWidth = 240, double itemHeight = 180)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public GenericItemOption ChooseItemWithSearch(List<GenericItemOption> items, Func<string, List<GenericItemOption>> searchFunction, string defaultSearch = null, string caption = null)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public GlobalProgressResult ActivateGlobalProgress(Action<GlobalProgressActionArgs> progresAction, GlobalProgressOptions progressArgs)\r\n        {\r\n            return Invoke(() => GlobalProgress.ActivateProgress(progresAction, progressArgs));\r\n        }\r\n\r\n        public GlobalProgressResult ActivateGlobalProgress(Func<GlobalProgressActionArgs, Task> progresAction, GlobalProgressOptions progressArgs)\r\n        {\r\n            return Invoke(() => GlobalProgress.ActivateProgress(progresAction, progressArgs));\r\n        }\r\n\r\n        public Window CreateWindow(WindowCreationOptions options)\r\n        {\r\n            return new WindowBase()\r\n            {\r\n                WindowStyle = WindowStyle.None,\r\n                Style = ResourceProvider.GetResource(\"ChildWindowStyle\") as Style\r\n            };\r\n        }\r\n\r\n        public Window GetCurrentAppWindow()\r\n        {\r\n            return WindowManager.CurrentWindow;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/GlobalResources.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n\r\n    <!--\r\n    THIS FILE IS NOT PART OF THE THEME, DO NOT MODIFY!\r\n    -->\r\n\r\n    <sys:Double x:Key=\"DesignWidth\">1920</sys:Double>\r\n    <sys:Double x:Key=\"DesignHeight\">1080</sys:Double>\r\n\r\n    <sys:Boolean x:Key=\"True\">True</sys:Boolean>\r\n    <sys:Boolean x:Key=\"False\">False</sys:Boolean>\r\n\r\n    <FontFamily x:Key=\"FontXboxOneController\">/Fonts/XBOXONE.ttf#XBOXONE</FontFamily>\r\n    <FontFamily x:Key=\"FontPlayStation4Controller\">/Fonts/PlayStation4.ttf#PlayStation4</FontFamily>\r\n    <FontFamily x:Key=\"FontTitilliumWeb\">/Fonts/TitilliumWeb-Regular.ttf#Titillium Web</FontFamily>\r\n    <FontFamily x:Key=\"FontTitilliumWebLight\">/Fonts/TitilliumWeb-Light.ttf#Titillium Web</FontFamily>\r\n    <FontFamily x:Key=\"FontTitilliumWebBold\">/Fonts/TitilliumWeb-Bold.ttf#Titillium Web</FontFamily>\r\n    <FontFamily x:Key=\"FontIcoFont\">/Fonts/icofont.ttf#icofont</FontFamily>\r\n\r\n    <pcon:BidirectionalEnumAndNumberConverter x:Key=\"BidirectionalEnumAndNumberConverter\" />\r\n    <pcon:BooleanToHiddenConverter x:Key=\"BooleanToHiddenConverter\" />\r\n    <pcon:BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n    <pcon:BoolToAutoWidthConverter x:Key=\"BoolToAutoWidthConverter\" />\r\n    <pcon:BoolToYesNoConverter x:Key=\"BoolToYesNoConverter\" />\r\n    <pcon:CoversZoomToPercentageConverter x:Key=\"CoversZoomToPercentageConverter\" />\r\n    <pcon:DateTimeToLastPlayedConverter x:Key=\"DateTimeToLastPlayedConverter\" />\r\n    <pcon:DockToStringConverter x:Key=\"DockToStringConverter\" />\r\n    <pcon:EnumToBooleanConverter x:Key=\"EnumToBooleanConverter\" />\r\n    <pcon:EnumToVisibilityConverter x:Key=\"EnumToVisibilityConverter\" />\r\n    <pcon:ICollectionNullOrEmptyToVisibilityConverter x:Key=\"ICollectionNullOrEmptyToVisibilityConverter\" />\r\n    <pcon:IconToImageSourceConverter x:Key=\"IconToImageSourceConverter\" />\r\n    <pcon:ImageStringToImageConverter x:Key=\"ImageStringToImageConverter\" />\r\n    <pcon:ImageStringToImageConverter x:Key=\"ImageStringToImageConverterCached\" Cached=\"True\" />\r\n    <pcon:InvertableBooleanToVisibilityConverter x:Key=\"InvertableBooleanToVisibilityConverter\" />\r\n    <pcon:InvertedBooleanToVisibilityConverter x:Key=\"InvertedBooleanToVisibilityConverter\" />\r\n    <pcon:InvertedBoolenConverter x:Key=\"InvertedBoolenConverter\" />\r\n    <pcon:ListToStringConverter x:Key=\"ListToStringConverter\" />\r\n    <pcon:PlayTimeToStringConverter x:Key=\"PlayTimeToStringConverter\" />\r\n    <pcon:NegateConverter x:Key=\"NegateConverter\" />\r\n    <pcon:NotificationIconConverter x:Key=\"NotificationIconConverter\" />\r\n    <pcon:NullableDateToStringConverter x:Key=\"NullableDateToStringConverter\" />\r\n    <pcon:NullableUlongBytesSizeToStringConverter x:Key=\"NullableUlongBytesSizeToStringConverter\" />\r\n    <pcon:NullToBoolConverter x:Key=\"NullToBoolConverter\" />\r\n    <pcon:NullToDependencyPropertyUnsetConverter x:Key=\"NullToDependencyPropertyUnsetConverter\" />\r\n    <pcon:NullToVisibilityConverter x:Key=\"NullToVisibilityConverter\" />\r\n    <pcon:ObjectToStringConverter x:Key=\"ObjectToStringConverter\" />\r\n    <pcon:OpacityBoolConverter x:Key=\"OpacityBoolConverter\" />\r\n    <pcon:ReleaseDateToStringConverter x:Key=\"ReleaseDateToStringConverter\" />\r\n    <pcon:SortingOrderToStringConverter x:Key=\"SortingOrderToStringConverter\" />\r\n    <pcon:StrechToStringConverter x:Key=\"StrechToStringConverter\" />\r\n    <pcon:StringNullOrEmptyToBoolConverter x:Key=\"StringNullOrEmptyToBoolConverter\" />\r\n    <pcon:StringNullOrEmptyToVisibilityConverter x:Key=\"StringNullOrEmptyToVisibilityConverter\" />\r\n    <pcon:StringToUpperCaseConverter x:Key=\"StringToUpperCaseConverter\" />\r\n    <pcon:ValueConverterGroup x:Key=\"ValueConverterGroup\" />\r\n    <pcon:WidthToFontSizeConverter x:Key=\"WidthToFontSizeConverter\" />\r\n    <pcon:IntToVisibilityConverter x:Key=\"IntToVisibilityConverter\" />\r\n    <pcon:InvertedIntToVisibilityConverter x:Key=\"InvertedIntToVisibilityConverter\" />\r\n    <pcon:ObjectEqualityToBoolConverter x:Key=\"ObjectEqualityToBoolConverter\" />\r\n    <pcon:ObjectEqualityToVisibilityConverter x:Key=\"ObjectEqualityToVisibilityConverter\" />\r\n    <pcon:InvertedObjectEqualityToBoolConverter x:Key=\"InvertedObjectEqualityToBoolConverter\" />\r\n    <pcon:InvertedObjectEqualityToVisibilityConverter x:Key=\"InvertedObjectEqualityToVisibilityConverter\" />\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/HiddenStyles.xaml",
    "content": "<ResourceDictionary\r\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n    xmlns:local=\"clr-namespace:Playnite.FullscreenApp\"\r\n    xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n    xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\">\r\n\r\n    <Style x:Key=\"ChildWindowStyle\" TargetType=\"WindowBase\">\r\n        <!-- 01000000 background is there for mouse hit detection and custom cursor\r\n             to work on transparent window area -->\r\n        <Setter Property=\"Background\" Value=\"#01000000\" />\r\n        <Setter Property=\"AllowsTransparency\" Value=\"True\" />\r\n        <Setter Property=\"BlockAltF4\" Value=\"True\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type WindowBase}\">\r\n                    <Border Background=\"{TemplateBinding Background}\">\r\n                        <AdornerDecorator>\r\n                            <ContentPresenter />\r\n                        </AdornerDecorator>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"MainWindowStyle\" TargetType=\"WindowBase\">\r\n        <Setter Property=\"Background\" Value=\"GhostWhite\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n        <Setter Property=\"WindowChrome.WindowChrome\">\r\n            <Setter.Value>\r\n                <WindowChrome CaptionHeight=\"0\" CornerRadius=\"0\" ResizeBorderThickness=\"0\"\r\n                              NonClientFrameEdges =\"None\" UseAeroCaptionButtons=\"False\" GlassFrameThickness=\"0\"/>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type WindowBase}\">\r\n                    <AdornerDecorator>\r\n                        <Grid Background=\"{TemplateBinding Background}\">\r\n                            <ContentPresenter />\r\n                            <Border Background=\"{DynamicResource OverlayBrush}\"\r\n                                    x:Name=\"BorderDim\" Visibility=\"Collapsed\" />\r\n                        </Grid>\r\n                    </AdornerDecorator>\r\n                    <ControlTemplate.Triggers>\r\n                        <DataTrigger Binding=\"{Binding ChildOpened, Delay=1000}\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderDim\"/>\r\n                        </DataTrigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Markup/Markups.cs",
    "content": "﻿using Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.FullscreenApp.Markup\r\n{\r\n    public class Api : Extensions.Markup.Api\r\n    {\r\n        public Api() : base()\r\n        {\r\n        }\r\n\r\n        public Api(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class MainViewModel : Extensions.Markup.MainViewModel<FullscreenAppViewModel, DesignMainViewModel, FullscreenApplication>\r\n    {\r\n        public MainViewModel() : base()\r\n        {\r\n        }\r\n\r\n        public MainViewModel(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class PluginSettings : Extensions.Markup.PluginSettings\r\n    {\r\n        public PluginSettings() : base()\r\n        {\r\n        }\r\n\r\n        public PluginSettings(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class Settings : Extensions.Markup.Settings\r\n    {\r\n        public Settings() : base()\r\n        {\r\n        }\r\n\r\n        public Settings(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class SettingsBinding : Extensions.Markup.SettingsBinding\r\n    {\r\n        public SettingsBinding() : base()\r\n        {\r\n        }\r\n\r\n        public SettingsBinding(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class ThemeFile : Extensions.Markup.ThemeFile\r\n    {\r\n        public ThemeFile() : base(ApplicationMode.Fullscreen)\r\n        {\r\n        }\r\n\r\n        public ThemeFile(string path) : base(path, ApplicationMode.Fullscreen)\r\n        {\r\n        }\r\n\r\n        public static ThemeManifest GetDesignTimeDefaultTheme()\r\n        {\r\n            return GetDesignTimeDefaultTheme(ApplicationMode.Fullscreen);\r\n        }\r\n    }\r\n\r\n    public class ThemeFileBinding : Extensions.Markup.ThemeFileBinding\r\n    {\r\n        public ThemeFileBinding() : base()\r\n        {\r\n        }\r\n\r\n        public ThemeFileBinding(string path) : base(path)\r\n        {\r\n        }\r\n    }\r\n\r\n    public class PluginStatus : Extensions.Markup.PluginStatus\r\n    {\r\n    }\r\n\r\n    public class PluginConverter : Extensions.Markup.PluginConverter\r\n    {\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Playnite.FullscreenApp.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}</ProjectGuid>\r\n    <OutputType>WinExe</OutputType>\r\n    <RootNamespace>Playnite.FullscreenApp</RootNamespace>\r\n    <AssemblyName>Playnite.FullscreenApp</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r\n    <WarningLevel>4</WarningLevel>\r\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\r\n    <Deterministic>true</Deterministic>\r\n    <NuGetPackageImportStamp>\r\n    </NuGetPackageImportStamp>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <LangVersion>7.3</LangVersion>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <LangVersion>7.3</LangVersion>\r\n    <DebugSymbols>true</DebugSymbols>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n    <DebugType>pdbonly</DebugType>\r\n    <DebugSymbols>true</DebugSymbols>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <StartupObject>Playnite.FullscreenApp.ProgramEntry</StartupObject>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <ApplicationIcon>Themes\\Fullscreen\\Default\\Images\\applogo.ico</ApplicationIcon>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <ApplicationManifest>app.manifest</ApplicationManifest>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"CommandLine, Version=2.8.0.0, Culture=neutral, PublicKeyToken=5a870481e358d379, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\CommandLineParser.2.8.0\\lib\\net461\\CommandLine.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"HtmlRenderer, Version=1.5.1.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\references\\HtmlRenderer.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"HtmlRenderer.WPF, Version=1.5.1.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\references\\HtmlRenderer.WPF.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\CommonServiceLocator.1.3\\lib\\portable-net4+sl5+netcore45+wpa81+wp8\\Microsoft.Practices.ServiceLocation.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.Xaml.Behaviors, Version=1.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Microsoft.Xaml.Behaviors.Wpf.1.1.39\\lib\\net45\\Microsoft.Xaml.Behaviors.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Prism, Version=6.3.0.0, Culture=neutral, PublicKeyToken=40ee6c3a2184dc59, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Prism.Core.6.3.0\\lib\\net45\\Prism.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Prism.Wpf, Version=6.3.0.0, Culture=neutral, PublicKeyToken=40ee6c3a2184dc59, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Prism.Wpf.6.3.0\\lib\\net45\\Prism.Wpf.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Drawing\" />\r\n    <Reference Include=\"System.IO.Abstractions, Version=2.1.0.227, Culture=neutral, PublicKeyToken=96bf224d23c43e59, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\System.IO.Abstractions.2.1.0.227\\lib\\net40\\System.IO.Abstractions.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\System.ValueTuple.4.5.0\\lib\\net461\\System.ValueTuple.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Windows.Forms\" />\r\n    <Reference Include=\"System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\r\n      <HintPath>..\\packages\\Prism.Wpf.6.3.0\\lib\\net45\\System.Windows.Interactivity.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"System.Xaml\">\r\n      <RequiredTargetFramework>4.0</RequiredTargetFramework>\r\n    </Reference>\r\n    <Reference Include=\"WindowsBase\" />\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ApplicationDefinition Include=\"App.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </ApplicationDefinition>\r\n    <Compile Include=\"Api\\MainViewAPI.cs\" />\r\n    <Compile Include=\"Commands\\GlobalCommands.cs\" />\r\n    <Compile Include=\"Controls\\SettingsSections\\SettingsSectionControl.cs\" />\r\n    <Compile Include=\"Controls\\ToggleButtonEx.cs\" />\r\n    <Compile Include=\"Controls\\FilterPresetSelector.cs\" />\r\n    <Compile Include=\"Controls\\GameListItem.cs\" />\r\n    <Compile Include=\"Controls\\ListBoxEx.cs\" />\r\n    <Compile Include=\"Controls\\CheckBoxEx.cs\" />\r\n    <Compile Include=\"Controls\\FilterStringListSelection.cs\" />\r\n    <Compile Include=\"Controls\\FilterEnumListSelection.cs\" />\r\n    <Compile Include=\"Controls\\FullscreenTilePanel.cs\" />\r\n    <Compile Include=\"Controls\\ScrollViewerEx.cs\" />\r\n    <Compile Include=\"Controls\\ItemsControlEx.cs\" />\r\n    <Compile Include=\"Controls\\ButtonEx.cs\" />\r\n    <Compile Include=\"Controls\\SettingsSections\\Menus.xaml.cs\">\r\n      <DependentUpon>Menus.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Input.xaml.cs\">\r\n      <DependentUpon>Input.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Layout.xaml.cs\">\r\n      <DependentUpon>Layout.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\General.xaml.cs\">\r\n      <DependentUpon>General.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Audio.xaml.cs\">\r\n      <DependentUpon>Audio.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SettingsSections\\Visuals.xaml.cs\">\r\n      <DependentUpon>Visuals.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Controls\\SliderEx.cs\" />\r\n    <Compile Include=\"Controls\\ComboBoxEx.cs\" />\r\n    <Compile Include=\"Controls\\FilterDbItemtSelection.cs\" />\r\n    <Compile Include=\"Controls\\Views\\FiltersAdditional.cs\" />\r\n    <Compile Include=\"Controls\\Views\\Filters.cs\" />\r\n    <Compile Include=\"Controls\\Views\\GameDetails.cs\" />\r\n    <Compile Include=\"Controls\\Views\\GameStatus.cs\" />\r\n    <Compile Include=\"Controls\\Views\\Main.cs\" />\r\n    <Compile Include=\"FullscreenActionSelector.cs\" />\r\n    <Compile Include=\"FullscreenCollectionView.cs\" />\r\n    <Compile Include=\"FullscreenDialogs.cs\" />\r\n    <Compile Include=\"Markup\\Markups.cs\" />\r\n    <Compile Include=\"ViewModels\\AddonsViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\DesignData\\DesignMainViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\FullscreenAppViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\FullscreenAppViewModel_Commands.cs\" />\r\n    <Compile Include=\"ViewModels\\ExtensionsMenuViewModels.cs\" />\r\n    <Compile Include=\"ViewModels\\SoftwareToolsMenuViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\GameDetailsViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\GameMenuViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\GameStatusViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\GameClientsMenuViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\HelpMenuViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\NotificationsViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\MainMenuViewModel.cs\" />\r\n    <Compile Include=\"ViewModels\\SettingsViewModel.cs\" />\r\n    <Compile Include=\"Windows\\ExtensionsMenuWindow.xaml.cs\">\r\n      <DependentUpon>ExtensionsMenuWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\SoftwareToolsMenuWindow.xaml.cs\">\r\n      <DependentUpon>SoftwareToolsMenuWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\MultiItemSelectionWindow.xaml.cs\">\r\n      <DependentUpon>MultiItemSelectionWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\GameClientsMenuWindow.xaml.cs\">\r\n      <DependentUpon>GameClientsMenuWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\SingleItemSelectionWindow.xaml.cs\">\r\n      <DependentUpon>SingleItemSelectionWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\LicenseAgreementWindow.xaml.cs\">\r\n      <DependentUpon>LicenseAgreementWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\ExtensionCrashWindow.xaml.cs\">\r\n      <DependentUpon>ExtensionCrashWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\CrashWindow.xaml.cs\">\r\n      <DependentUpon>CrashWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\HelpMenuWindow.xaml.cs\">\r\n      <DependentUpon>HelpMenuWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\NotificationsWindow.xaml.cs\">\r\n      <DependentUpon>NotificationsWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\MessageBoxWindow.xaml.cs\">\r\n      <DependentUpon>MessageBoxWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\GameMenuWindow.xaml.cs\">\r\n      <DependentUpon>GameMenuWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\MainMenuWindow.xaml.cs\">\r\n      <DependentUpon>MainMenuWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\SettingsWindow.xaml.cs\">\r\n      <DependentUpon>SettingsWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\RandomGameSelectWindow.xaml.cs\">\r\n      <DependentUpon>RandomGameSelectWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\TextInputWindow.xaml.cs\">\r\n      <DependentUpon>TextInputWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\MainWindow.xaml.cs\">\r\n      <DependentUpon>MainWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\ProgressWindow.xaml.cs\">\r\n      <DependentUpon>ProgressWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\AddonsUpdateWindow.xaml.cs\">\r\n      <DependentUpon>AddonsUpdateWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\UpdateWindow.xaml.cs\">\r\n      <DependentUpon>UpdateWindow.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Windows\\WindowTools.cs\" />\r\n    <SplashScreen Include=\"SplashScreen.png\" />\r\n    <Resource Include=\"..\\..\\references\\Fonts\\*.*\">\r\n      <Link>Fonts\\%(Filename)%(Extension)</Link>\r\n    </Resource>\r\n    <None Include=\"..\\Playnite\\license.txt\">\r\n      <Link>license.txt</Link>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\audio\\*.*\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <None Include=\"app.manifest\" />\r\n    <None Include=\"Themes\\Fullscreen\\Default\\Images\\custom_cover_background.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Fullscreen\\Default\\Images\\applogo.ico\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Fullscreen\\Default\\Images\\applogo_full.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Fullscreen\\Default\\theme.yaml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Page Include=\"ControlGalleryView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Menus.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Input.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Layout.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\General.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Audio.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Controls\\SettingsSections\\Visuals.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"HiddenStyles.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"GlobalResources.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Compile Include=\"App.xaml.cs\">\r\n      <DependentUpon>App.xaml</DependentUpon>\r\n      <SubType>Code</SubType>\r\n    </Compile>\r\n    <Compile Include=\"FullscreenApplication.cs\" />\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Constants.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\CustomControls\\FilterEnumListSelection.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\CustomControls\\FilterStringListSelection.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <None Include=\"Themes\\Fullscreen\\Default\\Images\\applogo_clean.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Themes\\Fullscreen\\Default\\DescriptionView.html\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\FiltersAdditional.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\NotificationsMenu.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Media.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\Main.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Images\\ButtonPrompts\\Xbox\\Xbox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Images\\ButtonPrompts\\PlayStation\\PlayStation.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DefaultControls\\ScrollViewer.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DefaultControls\\Button.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DerivedStyles\\ListGameItemStyle.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DerivedStyles\\ButtonBottomMenu.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DerivedStyles\\ButtonTopMenu.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DefaultControls\\ComboBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DefaultControls\\Slider.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DefaultControls\\CheckBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DefaultControls\\TextBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DefaultControls\\ToolTip.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DefaultControls\\ProgressBar.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DerivedStyles\\ListGameItemTemplate.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\CustomControls\\FilterPresetSelector.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\GameStatus.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\GameMenu.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\MainMenu.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\SettingsMenus.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\TextInput.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\MessageBox.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\DefaultControls\\ToggleButton.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\HelpMenu.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\ItemSelection.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\CustomMenus.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Page Include=\"Windows\\ExtensionsMenuWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\SoftwareToolsMenuWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\MultiItemSelectionWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\GameClientsMenuWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\SingleItemSelectionWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\LicenseAgreementWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\ExtensionCrashWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\GameMenuWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\HelpMenuWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\NotificationsWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\MainMenuWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\SettingsWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\RandomGameSelectWindow.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Windows\\AddonsUpdateWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\UpdateWindow.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <None Include=\"Themes\\Fullscreen\\Default\\Images\\applogo.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\GameDetails.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\Views\\FiltersView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Themes\\Fullscreen\\Default\\CustomControls\\FilterDbItemtSelection.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Page Include=\"Themes\\Generic.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\CrashWindow.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Windows\\MessageBoxWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\TextInputWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"Windows\\MainWindow.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"Windows\\ProgressWindow.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"ProgramEntry.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\r\n      <SubType>Code</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DesignTime>True</DesignTime>\r\n      <DependentUpon>Resources.resx</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DependentUpon>Settings.settings</DependentUpon>\r\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\r\n    </Compile>\r\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\r\n      <Generator>ResXFileCodeGenerator</Generator>\r\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\r\n    </EmbeddedResource>\r\n    <None Include=\"packages.config\" />\r\n    <None Include=\"Properties\\Settings.settings\">\r\n      <Generator>SettingsSingleFileGenerator</Generator>\r\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"App.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup />\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\PlayniteSDK\\Playnite.SDK.csproj\">\r\n      <Project>{19BC9097-5705-4352-90E2-99F0C63230D0}</Project>\r\n      <Name>Playnite.SDK</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\Playnite\\Playnite.csproj\">\r\n      <Project>{AD271E73-8A13-4C4E-BFDC-3076646B59E3}</Project>\r\n      <Name>Playnite</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>SETX PLAYNITE_SLN $(SolutionDir)</PostBuildEvent>\r\n    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>\r\n  </PropertyGroup>\r\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\r\n    <PropertyGroup>\r\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\r\n    </PropertyGroup>\r\n    <Error Condition=\"!Exists('..\\packages\\LargeAddressAware.1.0.5\\build\\LargeAddressAware.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\LargeAddressAware.1.0.5\\build\\LargeAddressAware.targets'))\" />\r\n  </Target>\r\n  <Import Project=\"..\\packages\\LargeAddressAware.1.0.5\\build\\LargeAddressAware.targets\" Condition=\"Exists('..\\packages\\LargeAddressAware.1.0.5\\build\\LargeAddressAware.targets')\" />\r\n  <PropertyGroup>\r\n    <LargeAddressAware>true</LargeAddressAware>\r\n  </PropertyGroup>\r\n</Project>"
  },
  {
    "path": "source/Playnite.FullscreenApp/ProgramEntry.cs",
    "content": "﻿using CommandLine;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Runtime;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp\r\n{\r\n    public class ProgramEntry\r\n    {\r\n        [STAThread]\r\n        public static void Main(string[] args)\r\n        {\r\n            var cmdLine = new CmdLineOptions();\r\n            var parsed = Parser.Default.ParseArguments<CmdLineOptions>(Environment.GetCommandLineArgs());\r\n            if (parsed is Parsed<CmdLineOptions> options)\r\n            {\r\n                cmdLine = options.Value;\r\n            }\r\n\r\n            if (!cmdLine.UserDataDir.IsNullOrWhiteSpace())\r\n            {\r\n                try\r\n                {\r\n                    cmdLine.UserDataDir = cmdLine.UserDataDir.TrimEnd(new char[] { '/', '\\\\', '\"' });\r\n                    FileSystem.CreateDirectory(cmdLine.UserDataDir, false);\r\n                    PlaynitePaths.UpdateUserDataDir(cmdLine.UserDataDir);\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    MessageBox.Show(\r\n                        $\"Failed to initialize in specified user data folder:\\n{e.Message}\",\r\n                        \"Startup Error\",\r\n                        MessageBoxButton.OK,\r\n                        MessageBoxImage.Error);\r\n                    return;\r\n                }\r\n            }\r\n\r\n            FileSystem.CreateDirectory(PlaynitePaths.JitProfilesPath);\r\n            ProfileOptimization.SetProfileRoot(PlaynitePaths.JitProfilesPath);\r\n            ProfileOptimization.StartProfile(\"fullscreen\");\r\n\r\n            if (Computer.WindowsVersion == WindowsVersion.Win7 || Computer.WindowsVersion == WindowsVersion.Win8)\r\n            {\r\n                MessageBox.Show(\r\n                     \"Windows 7 and Windows 8 are no longer supported. Please update your operating system or downgrade to older Playnite version.\",\r\n                     \"Startup Error\",\r\n                     MessageBoxButton.OK,\r\n                     MessageBoxImage.Error);\r\n                return;\r\n            }\r\n\r\n            if (PlaynitePaths.ProgramPath.Contains(@\"temp\\rar$\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                MessageBox.Show(\r\n                    \"Playnite is not allowed to run from temporary extracted archive.\\rInstall/Extract application properly before starting it.\",\r\n                    \"Startup Error\",\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n                return;\r\n            }\r\n            else if (PlaynitePaths.ProgramPath.Contains(\"#\"))\r\n            {\r\n                MessageBox.Show(\r\n                    \"Playnite is unable to run from current directory due to illegal character '#' in the path. Please use different directory.\",\r\n                    \"Startup Error\",\r\n                    MessageBoxButton.OK,\r\n                    MessageBoxImage.Error);\r\n                return;\r\n            }\r\n\r\n            SplashScreen splash = null;\r\n            var procCount = Process.GetProcesses().Where(a => PlayniteApplication.IsProcessPlayniteProcess(a)).Count();\r\n            if (cmdLine.Start.IsNullOrEmpty() && !cmdLine.HideSplashScreen && procCount == 1)\r\n            {\r\n                splash = new SplashScreen(\"SplashScreen.png\");\r\n                splash.Show(false);\r\n            }\r\n\r\n            PlayniteSettings.ConfigureLogger();\r\n            LogManager.GetLogger().Info($\"App arguments: '{string.Join(\",\", args)}'\");\r\n            var app = new FullscreenApplication(() => new App(), splash, cmdLine);\r\n            app.Run();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Resources;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\nusing System.Windows;\r\nusing System.Windows.Markup;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"Playnite Fullscreen Application\")]\r\n[assembly: AssemblyDescription(\"Playnite Fullscreen Application\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"Josef Nemec\")]\r\n[assembly: AssemblyProduct(\"Playnite\")]\r\n[assembly: AssemblyCopyright(\"Copyright © Josef Nemec 2019\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n//In order to begin building localizable applications, set\r\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\r\n//inside a <PropertyGroup>.  For example, if you are using US english\r\n//in your source files, set the <UICulture> to en-US.  Then uncomment\r\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\r\n//the line below to match the UICulture setting in the project file.\r\n\r\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\r\n\r\n\r\n[assembly: ThemeInfo(\r\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\r\n                                     //(used if a resource is not found in the page,\r\n                                     // or application resource dictionaries)\r\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\r\n                                              //(used if a resource is not found in the page,\r\n                                              // app, or any theme specific resource dictionaries)\r\n)]\r\n\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: InternalsVisibleTo(\"Playnite.FullscreenApp.Tests\")]\r\n\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.FullscreenApp.Controls\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.FullscreenApp.Controls.Views\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.FullscreenApp.Markup\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.FullscreenApp.ViewModels\")]\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace Playnite.FullscreenApp.Properties\r\n{\r\n\r\n\r\n    /// <summary>\r\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\r\n    /// </summary>\r\n    // This class was auto-generated by the StronglyTypedResourceBuilder\r\n    // class via a tool like ResGen or Visual Studio.\r\n    // To add or remove a member, edit your .ResX file then rerun ResGen\r\n    // with the /str option, or rebuild your VS project.\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\r\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    internal class Resources\r\n    {\r\n\r\n        private static global::System.Resources.ResourceManager resourceMan;\r\n\r\n        private static global::System.Globalization.CultureInfo resourceCulture;\r\n\r\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        internal Resources()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///   Returns the cached ResourceManager instance used by this class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Resources.ResourceManager ResourceManager\r\n        {\r\n            get\r\n            {\r\n                if ((resourceMan == null))\r\n                {\r\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"Playnite.FullscreenApp.Properties.Resources\", typeof(Resources).Assembly);\r\n                    resourceMan = temp;\r\n                }\r\n                return resourceMan;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///   Overrides the current thread's CurrentUICulture property for all\r\n        ///   resource lookups using this strongly typed resource class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Globalization.CultureInfo Culture\r\n        {\r\n            get\r\n            {\r\n                return resourceCulture;\r\n            }\r\n            set\r\n            {\r\n                resourceCulture = value;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace Playnite.FullscreenApp.Properties\r\n{\r\n\r\n\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"11.0.0.0\")]\r\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase\r\n    {\r\n\r\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\r\n\r\n        public static Settings Default\r\n        {\r\n            get\r\n            {\r\n                return defaultInstance;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\r\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\r\n  <Profiles>\r\n    <Profile Name=\"(Default)\" />\r\n  </Profiles>\r\n  <Settings />\r\n</SettingsFile>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Constants.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Color x:Key=\"BlackColor\">#FF000000</Color>\r\n    <Color x:Key=\"WhiteColor\">#FFFFFFFF</Color>\r\n    <Color x:Key=\"GlyphColor\">#FFEC6200</Color>\r\n    <Color x:Key=\"GlyphLightColor\">#FFFFAA00</Color>\r\n    <Color x:Key=\"SelectionLightColor\">#FF8D919D</Color>\r\n    <Color x:Key=\"OverlayColor\">#BB000000</Color>\r\n    \r\n    <Color x:Key=\"ControlBackgroundColor\">#FF2B354D</Color>\r\n    <Color x:Key=\"ControlBackgroundColorDark\">#FF121830</Color>\r\n\r\n    <Color x:Key=\"TextColor\">#FFEBEBEB</Color>\r\n    <Color x:Key=\"TextColorDark\">#FF757575</Color>\r\n\r\n    <SolidColorBrush x:Key=\"TextBrush\" Color=\"{DynamicResource TextColor}\" />\r\n    <SolidColorBrush x:Key=\"TextBrushDark\" Color=\"{DynamicResource TextColorDark}\" />\r\n    <SolidColorBrush x:Key=\"GlyphBrush\" Color=\"{DynamicResource GlyphColor}\" />\r\n    <SolidColorBrush x:Key=\"GlyphLightBrush\" Color=\"{DynamicResource GlyphLightColor}\" />\r\n    <SolidColorBrush x:Key=\"ControlBackgroundBrush\" Color=\"{DynamicResource ControlBackgroundColor}\" />\r\n    <SolidColorBrush x:Key=\"ControlBackgroundDarkBrush\" Color=\"{DynamicResource ControlBackgroundColorDark}\" />\r\n    <SolidColorBrush x:Key=\"SelectionLightBrush\" Color=\"{DynamicResource SelectionLightColor}\" />\r\n    <SolidColorBrush x:Key=\"OverlayBrush\" Color=\"{DynamicResource OverlayColor}\" />\r\n    <SolidColorBrush x:Key=\"CheckBoxCheckMarkBkBrush\" Color=\"{DynamicResource ControlBackgroundColorDark}\" />\r\n\r\n    <sys:Double x:Key=\"FontSizeSmall\">18</sys:Double>\r\n    <sys:Double x:Key=\"FontSize\">22</sys:Double>\r\n\r\n    <sys:Double x:Key=\"FilterPanelWidth\">300</sys:Double>\r\n    \r\n    <GridLength x:Key=\"ProgressWindowWidth\">640</GridLength>\r\n    \r\n    <Style x:Key=\"TextBlockBaseStyle\" TargetType=\"TextBlock\">\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontTitilliumWebLight}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n    </Style>\r\n\r\n    <RadialGradientBrush x:Key=\"MainBackgourndBrush\" GradientOrigin=\"0.5,0.1\" Center=\"0.5,0.2\" RadiusX=\"0.5\" RadiusY=\"0.7\">\r\n        <RadialGradientBrush.GradientStops>\r\n            <GradientStop Color=\"#FF091F51\" Offset=\"0\" />\r\n            <GradientStop Color=\"#FF0B1027\" Offset=\"1.0\" />\r\n        </RadialGradientBrush.GradientStops>\r\n    </RadialGradientBrush>\r\n\r\n    <LinearGradientBrush x:Key=\"TopBarBackgroundBrush\" StartPoint=\"-0.5,0.5\" EndPoint=\"1,0.5\" >\r\n        <GradientStop Color=\"#FF091F51\" Offset=\"0\"/>\r\n        <GradientStop Color=\"#AA0B1027\" Offset=\"1.0\"/>\r\n    </LinearGradientBrush>\r\n\r\n    <LinearGradientBrush x:Key=\"BottomBarBackgroundBrush\" StartPoint=\"-0.5,0.5\" EndPoint=\"1.5,1\" >\r\n        <GradientStop Color=\"#FF091F51\" Offset=\"0\"/>\r\n        <GradientStop Color=\"#AA0B1027\" Offset=\"1.0\"/>\r\n    </LinearGradientBrush>\r\n\r\n    <LinearGradientBrush x:Key=\"OverlayMenuBackgroundBrush\" StartPoint=\"0.5,0\" EndPoint=\"0.5,1.5\" >\r\n        <GradientStop Color=\"#FF091F51\" Offset=\"0\"/>\r\n        <GradientStop Color=\"#FF000623\" Offset=\"1.0\"/>\r\n    </LinearGradientBrush>\r\n\r\n    <LinearGradientBrush x:Key=\"SelectionBrush\" StartPoint=\"0.5,-0.5\" EndPoint=\"1,1.5\" >\r\n        <GradientStop Color=\"{DynamicResource GlyphColor}\" Offset=\"0\"/>\r\n        <GradientStop Color=\"{DynamicResource GlyphLightColor}\" Offset=\"1.0\"/>\r\n    </LinearGradientBrush>\r\n\r\n    <LinearGradientBrush x:Key=\"GameDetailsBackgroundBrush\" StartPoint=\"0.5,0\" EndPoint=\"0.5,0.4\" >\r\n        <GradientStop Color=\"#00091F51\" Offset=\"0.0\"/>\r\n        <GradientStop Color=\"#EE0B1027\" Offset=\"0.8\"/>\r\n    </LinearGradientBrush>\r\n    \r\n    <SolidColorBrush x:Key=\"WarningBrush\" Color=\"#ff6b6b\" />\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/CustomControls/FilterDbItemtSelection.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type FilterDbItemtSelection}\">\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type FilterDbItemtSelection}\">\r\n                    <DockPanel Width=\"{DynamicResource FilterPanelWidth}\"\r\n                               Background=\"{DynamicResource OverlayMenuBackgroundBrush}\"\r\n                               x:Name=\"PART_MenuHost\">\r\n                        <ButtonEx DockPanel.Dock=\"Top\" Margin=\"15,5,15,5\" BorderThickness=\"2\"\r\n                                  x:Name=\"PART_ButtonBack\">\r\n                            <Button.Content>\r\n                                <StackPanel Orientation=\"Horizontal\">\r\n                                    <TextBlock Text=\"&#xeab5;\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                                               FontSize=\"20\" VerticalAlignment=\"Center\"\r\n                                               Margin=\"0,0,10,0\" />\r\n                                    <TextBlock Text=\"{Binding Title}\"\r\n                                               VerticalAlignment=\"Center\"\r\n                                               Style=\"{StaticResource TextBlockBaseStyle}\"/>\r\n                                </StackPanel>\r\n                            </Button.Content>\r\n                        </ButtonEx>\r\n\r\n                        <ButtonEx Content=\"{DynamicResource LOCClearLabel}\" DockPanel.Dock=\"Top\"\r\n                                  Margin=\"15,5,15,5\" BorderThickness=\"2\"\r\n                                  x:Name=\"PART_ButtonClear\"/>\r\n\r\n                        <ItemsControlEx x:Name=\"PART_ItemsHost\"\r\n                                        DockPanel.Dock=\"Top\" Focusable=\"False\"\r\n                                        KeyboardNavigation.DirectionalNavigation=\"Once\" />\r\n                    </DockPanel>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/CustomControls/FilterEnumListSelection.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type FilterEnumListSelection}\">\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type FilterEnumListSelection}\">\r\n                    <DockPanel Width=\"{DynamicResource FilterPanelWidth}\"\r\n                               Background=\"{DynamicResource OverlayMenuBackgroundBrush}\"\r\n                               x:Name=\"PART_MenuHost\">\r\n                        <ButtonEx DockPanel.Dock=\"Top\" Margin=\"15,5,15,5\" BorderThickness=\"2\"                                                             \r\n                                  x:Name=\"PART_ButtonBack\">\r\n                            <Button.Content>\r\n                                <StackPanel Orientation=\"Horizontal\">\r\n                                    <TextBlock Text=\"&#xeab5;\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                                               FontSize=\"20\" VerticalAlignment=\"Center\"\r\n                                               Margin=\"0,0,10,0\" />\r\n                                    <TextBlock Text=\"{Binding Title}\"\r\n                                               VerticalAlignment=\"Center\"\r\n                                               Style=\"{DynamicResource TextBlockBaseStyle}\"/>\r\n                                </StackPanel>\r\n                            </Button.Content>\r\n                        </ButtonEx>\r\n\r\n                        <ButtonEx Content=\"{DynamicResource LOCClearLabel}\" DockPanel.Dock=\"Top\"\r\n                                  Margin=\"15,5,15,5\" BorderThickness=\"2\"\r\n                                  x:Name=\"PART_ButtonClear\"/>\r\n\r\n                        <ItemsControlEx x:Name=\"PART_ItemsHost\"\r\n                                        DockPanel.Dock=\"Top\" Focusable=\"False\"\r\n                                        KeyboardNavigation.DirectionalNavigation=\"Once\" />\r\n                    </DockPanel>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/CustomControls/FilterPresetSelector.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"ItemFilterQuickPreset\" TargetType=\"CheckBoxEx\">\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"CheckBoxEx\">\r\n                    <Border Background=\"{TemplateBinding Background}\"\r\n                            Margin=\"10,0,10,0\">\r\n                        <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                   FontFamily=\"{DynamicResource FontTitilliumWeb}\"\r\n                                   x:Name=\"TextContent\">\r\n                            <Grid>\r\n                                <TextBlock Text=\"{Binding Name}\" FontWeight=\"SemiBold\" Visibility=\"Hidden\"/>\r\n                                <StackPanel>\r\n                                    <TextBlock Text=\"{Binding Name}\" HorizontalAlignment=\"Center\"\r\n                                               Foreground=\"{TemplateBinding Foreground}\" />\r\n                                    <TextBlock Text=\"&#x25CF;\" Style=\"{DynamicResource TextBlockBaseStyle}\"                                               \r\n                                               FontSize=\"12\"\r\n                                               HorizontalAlignment=\"Center\"\r\n                                               x:Name=\"SelectionBullet\" Visibility=\"Hidden\"/>\r\n                                </StackPanel>                                \r\n                            </Grid>\r\n                        </TextBlock>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"FontWeight\" Value=\"SemiBold\" TargetName=\"TextContent\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"SelectionBullet\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type FilterPresetSelector}\">\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type FilterPresetSelector}\">\r\n                    <ItemsControlEx x:Name=\"PART_ItemsFilterPresets\" Focusable=\"False\"\r\n                                    KeyboardNavigation.DirectionalNavigation=\"Once\"\r\n                                    HorizontalLayout=\"True\">\r\n                        <ItemsControl.ItemsPanel>                            \r\n                            <ItemsPanelTemplate>\r\n                                <StackPanel Orientation=\"Horizontal\" />\r\n                            </ItemsPanelTemplate>\r\n                        </ItemsControl.ItemsPanel>\r\n                        <ItemsControl.Template>\r\n                            <ControlTemplate>\r\n                                <ScrollViewer Focusable=\"False\"\r\n                                              HorizontalScrollBarVisibility=\"Hidden\"\r\n                                              VerticalScrollBarVisibility=\"Disabled\"\r\n                                              CanContentScroll=\"True\">\r\n                                    <ItemsPresenter />\r\n                                </ScrollViewer>\r\n                            </ControlTemplate>\r\n                        </ItemsControl.Template>\r\n                    </ItemsControlEx>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/CustomControls/FilterStringListSelection.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type FilterStringListSelection}\">\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type FilterStringListSelection}\">\r\n                    <DockPanel Width=\"{DynamicResource FilterPanelWidth}\"\r\n                               Background=\"{DynamicResource OverlayMenuBackgroundBrush}\"\r\n                               x:Name=\"PART_MenuHost\">\r\n                        <ButtonEx DockPanel.Dock=\"Top\" Margin=\"15,5,15,5\" BorderThickness=\"2\"                                                             \r\n                                  x:Name=\"PART_ButtonBack\">\r\n                            <Button.Content>\r\n                                <StackPanel Orientation=\"Horizontal\">\r\n                                    <TextBlock Text=\"&#xeab5;\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                                               FontSize=\"20\" VerticalAlignment=\"Center\"\r\n                                               Margin=\"0,0,10,0\" />\r\n                                    <TextBlock Text=\"{Binding Title}\"\r\n                                               VerticalAlignment=\"Center\"\r\n                                               Style=\"{DynamicResource TextBlockBaseStyle}\"/>\r\n                                </StackPanel>\r\n                            </Button.Content>\r\n                        </ButtonEx>\r\n\r\n                        <ButtonEx Content=\"{DynamicResource LOCClearLabel}\" DockPanel.Dock=\"Top\"\r\n                                  Margin=\"15,5,15,5\" BorderThickness=\"2\"\r\n                                  x:Name=\"PART_ButtonClear\"/>\r\n\r\n                        <ItemsControlEx x:Name=\"PART_ItemsHost\"\r\n                                        DockPanel.Dock=\"Top\" Focusable=\"False\"\r\n                                        KeyboardNavigation.DirectionalNavigation=\"Once\" />\r\n                    </DockPanel>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/Button.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n    \r\n    <Style TargetType=\"Button\">\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"12,5,12,5\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource SelectionLightBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"Button\">\r\n                    <Grid Background=\"{TemplateBinding Background}\">\r\n                        <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                   Foreground=\"{TemplateBinding Foreground}\"\r\n                                   HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                   VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                   Margin=\"{TemplateBinding Padding}\">                            \r\n                                <ContentPresenter />\r\n                        </TextBlock>\r\n\r\n                        <Border BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                                BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                                x:Name=\"BorderStandard\" />\r\n                        \r\n                        <Border x:Name=\"BorderFocus\" Margin=\"-3\"\r\n                                SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"\r\n                                BorderBrush=\"{DynamicResource SelectionBrush}\"\r\n                                BorderThickness=\"3\" Visibility=\"Hidden\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />                            \r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"BorderStandard\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"BorderStandard\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDark}\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"ButtonEx\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/CheckBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"CheckBox\">\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"5,5,12,5\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"CheckBox\">\r\n                    <Grid Background=\"{TemplateBinding Background}\">\r\n                        <Grid Margin=\"{TemplateBinding Padding}\">\r\n                            <Grid.ColumnDefinitions>\r\n                                <ColumnDefinition Width=\"Auto\" />\r\n                                <ColumnDefinition Width=\"*\" />\r\n                            </Grid.ColumnDefinitions>\r\n\r\n                            <Border Background=\"{DynamicResource CheckBoxCheckMarkBkBrush}\"\r\n                                    VerticalAlignment=\"Center\"\r\n                                    BorderThickness=\"2\" BorderBrush=\"{DynamicResource ControlBackgroundBrush}\"\r\n                                    Grid.Column=\"0\" Margin=\"0,0,10,0\" Width=\"24\" Height=\"24\">\r\n                                <Viewbox x:Name=\"CheckIcon\" Visibility=\"Collapsed\">\r\n                                    <TextBlock Text=\"b\" FontFamily=\"Marlett\" Foreground=\"White\"\r\n                                               HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                </Viewbox>\r\n                            </Border>\r\n                            <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                        FontFamily=\"{DynamicResource FontTitilliumWeb}\"\r\n                                        Foreground=\"{TemplateBinding Foreground}\"\r\n                                        HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                        VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                        Grid.Column=\"1\" TextTrimming=\"WordEllipsis\">\r\n                                <ContentPresenter RecognizesAccessKey=\"True\" />\r\n                            </TextBlock>\r\n                        </Grid>\r\n                        <Border x:Name=\"BorderFocus\" Margin=\"-3\"\r\n                                SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"\r\n                                BorderBrush=\"{DynamicResource SelectionBrush}\"\r\n                                BorderThickness=\"3\" Visibility=\"Hidden\" />\r\n\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"CheckIcon\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"CheckBoxEx\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ComboBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"ComboBox\">\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"12,5,12,5\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"ComboBox\">\r\n                    <Grid Background=\"{TemplateBinding Background}\">\r\n                        <ToggleButton x:Name=\"ToggleButton\" Focusable=\"False\" ClickMode=\"Press\"\r\n                                      VerticalAlignment=\"Center\" Margin=\"0,0,12,0\"\r\n                                      IsChecked=\"{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}\">\r\n                            <ToggleButton.Template>\r\n                                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\r\n                                    <DockPanel LastChildFill=\"False\" Background=\"Transparent\">\r\n                                        <Viewbox DockPanel.Dock=\"Right\" Height=\"20\">\r\n                                            <TextBlock Text=\"&#xeab2;\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                                                       Foreground=\"{DynamicResource TextBrush}\"\r\n                                                       FontSize=\"{DynamicResource FontSize}\"\r\n                                                       VerticalAlignment=\"Center\"/>\r\n                                        </Viewbox>\r\n                                    </DockPanel>\r\n                                </ControlTemplate>\r\n                            </ToggleButton.Template>\r\n                        </ToggleButton>\r\n\r\n                        <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                   IsHitTestVisible=\"False\"\r\n                                   HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                   VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                   x:Name=\"TextContent\" Margin=\"{TemplateBinding Padding}\">\r\n                            <ContentPresenter IsHitTestVisible=\"False\"\r\n                                              Content=\"{TemplateBinding SelectionBoxItem}\"\r\n                                              ContentTemplate=\"{TemplateBinding SelectionBoxItemTemplate}\"\r\n                                              ContentTemplateSelector=\"{TemplateBinding ItemTemplateSelector}\"/>\r\n                        </TextBlock>\r\n         \r\n                        <Popup x:Name=\"Popup\" IsOpen=\"{TemplateBinding IsDropDownOpen}\"\r\n                               Placement=\"Bottom\" Focusable=\"False\" AllowsTransparency=\"True\">\r\n                            <Grid MaxHeight=\"{TemplateBinding MaxDropDownHeight}\"\r\n                                  MinWidth=\"{TemplateBinding ActualWidth}\"\r\n                                  SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\">\r\n                                <Border BorderBrush=\"{DynamicResource SelectionLightBrush}\"                                        \r\n                                        Background=\"{DynamicResource ControlBackgroundDarkBrush}\"\r\n                                        BorderThickness=\"2\">\r\n                                    <ScrollViewer HorizontalScrollBarVisibility=\"Disabled\"\r\n                                                  VerticalScrollBarVisibility=\"Auto\">\r\n                                        <StackPanel IsItemsHost=\"True\" KeyboardNavigation.DirectionalNavigation=\"Contained\"/>\r\n                                    </ScrollViewer>\r\n                                </Border>\r\n                            </Grid>\r\n                        </Popup>\r\n\r\n                        <Border x:Name=\"BorderStandard\"\r\n                                BorderBrush=\"{DynamicResource SelectionLightBrush}\"\r\n                                BorderThickness=\"2\" Margin=\"-2\" />\r\n\r\n                        <Border x:Name=\"BorderFocus\" Margin=\"-3\" SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"\r\n                                BorderBrush=\"{DynamicResource SelectionBrush}\"\r\n                                BorderThickness=\"3\" Visibility=\"Hidden\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n                            <Setter Property=\"Foreground\" Value=\"Black\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"BorderStandard\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n                            <Setter Property=\"Foreground\" Value=\"Black\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"BorderStandard\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type ComboBoxItem}\">\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"12,5,12,5\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ComboBoxItem}\">\r\n                    <Grid Background=\"{TemplateBinding Background}\" >\r\n                        <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"                                   \r\n                                   HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                   VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                   x:Name=\"TextContent\" Margin=\"{TemplateBinding Padding}\">\r\n                            <ContentPresenter />\r\n                        </TextBlock>\r\n\r\n                        <Border x:Name=\"BorderFocus\"\r\n                                SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"\r\n                                BorderBrush=\"{DynamicResource SelectionBrush}\"\r\n                                BorderThickness=\"3\" Visibility=\"Hidden\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n                            <Setter Property=\"Foreground\" Value=\"Black\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n                            <Setter Property=\"Foreground\" Value=\"Black\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"ComboBoxEx\" BasedOn=\"{StaticResource {x:Type ComboBox}}\">\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ProgressBar.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type ProgressBar}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSizeSmall}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource SelectionLightBrush}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"ProgressWindowProgressBarStyle\" TargetType=\"ProgressBar\" BasedOn=\"{StaticResource {x:Type ProgressBar}}\">\r\n        <Setter Property=\"Height\" Value=\"40\" />\r\n        <Setter Property=\"Margin\" Value=\"0,20,0,0\" />\r\n    </Style>\r\n</ResourceDictionary>  "
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ScrollViewer.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n\r\n    <Style x:Key=\"ScrollBarTrackButton\" TargetType=\"{x:Type RepeatButton}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"true\" />\r\n        <Setter Property=\"IsTabStop\" Value=\"False\" />\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type RepeatButton}\">\r\n                    <Border Background=\"Transparent\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type Thumb}\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Thumb}\">\r\n                    <Rectangle x:Name=\"HoverRectangle\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\"\r\n                                Width=\"Auto\" Height=\"Auto\" Stroke=\"{x:Null}\"\r\n                                Margin=\"4.5,1,4.5,1\" MinHeight=\"20\"\r\n                                Fill=\"{TemplateBinding Background}\" />                \r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Fill\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"HoverRectangle\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type ScrollBar}\">\r\n        <Setter Property=\"Stylus.IsFlicksEnabled\" Value=\"False\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />        \r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ScrollBar}\">\r\n                    <Track x:Name=\"PART_Track\" Orientation=\"Vertical\" IsDirectionReversed=\"True\"\r\n                           Width=\"17\">\r\n                        <Track.Resources>\r\n                            <sys:Double x:Key=\"{x:Static SystemParameters.VerticalScrollBarButtonHeightKey}\">42</sys:Double>\r\n                        </Track.Resources>\r\n                        <Track.Thumb>\r\n                            <Thumb Width=\"60\" Background=\"{TemplateBinding ScrollViewer.Background}\" />\r\n                        </Track.Thumb>\r\n                        <Track.DecreaseRepeatButton>\r\n                            <RepeatButton Style=\"{DynamicResource ScrollBarTrackButton}\"\r\n                                          Command=\"ScrollBar.PageUpCommand\" />\r\n                        </Track.DecreaseRepeatButton>\r\n                        <Track.IncreaseRepeatButton>\r\n                            <RepeatButton Style=\"{DynamicResource ScrollBarTrackButton}\"\r\n                                          Command=\"ScrollBar.PageDownCommand\" />\r\n                        </Track.IncreaseRepeatButton>\r\n                    </Track>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"Orientation\" Value=\"Horizontal\">\r\n                            <Setter Property=\"LayoutTransform\" TargetName=\"PART_Track\">\r\n                                <Setter.Value>\r\n                                    <RotateTransform Angle=\"-90\" />\r\n                                </Setter.Value>\r\n                            </Setter>\r\n                            <Setter TargetName=\"PART_Track\" Property=\"Orientation\" Value=\"Vertical\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n    \r\n    <Style TargetType=\"ScrollViewer\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ScrollViewer}\">\r\n                    <Grid>\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"*\"/>\r\n                            <ColumnDefinition Width=\"Auto\"/>\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"*\"/>\r\n                            <RowDefinition Height=\"Auto\"/>\r\n                        </Grid.RowDefinitions>\r\n                        <ScrollContentPresenter x:Name=\"PART_ScrollContentPresenter\" Grid.Column=\"0\"\r\n                                                CanContentScroll=\"{TemplateBinding CanContentScroll}\"\r\n                                                CanHorizontallyScroll=\"False\" CanVerticallyScroll=\"False\"\r\n                                                ContentTemplate=\"{TemplateBinding ContentTemplate}\"\r\n                                                Content=\"{TemplateBinding Content}\" />\r\n                        <ScrollBar x:Name=\"PART_VerticalScrollBar\"\r\n                                   Grid.Column=\"1\" Grid.Row=\"0\" \r\n                                   Value=\"{TemplateBinding VerticalOffset}\"\r\n                                   Maximum=\"{TemplateBinding ScrollableHeight}\" Minimum=\"0\"\r\n                                   ViewportSize=\"{TemplateBinding ViewportHeight}\"\r\n                                   Visibility=\"{TemplateBinding ComputedVerticalScrollBarVisibility}\"/>\r\n                        <ScrollBar x:Name=\"PART_HorizontalScrollBar\"\r\n                                Orientation=\"Horizontal\"\r\n                                Grid.Row=\"1\" Grid.Column=\"0\"\r\n                                Value=\"{TemplateBinding HorizontalOffset}\"\r\n                                Maximum=\"{TemplateBinding ScrollableWidth}\" Minimum=\"0\"\r\n                                ViewportSize=\"{TemplateBinding ViewportWidth}\"\r\n                                Visibility=\"{TemplateBinding ComputedHorizontalScrollBarVisibility}\"/>\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsKeyboardFocusWithin\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"PART_VerticalScrollBar\" />\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"PART_HorizontalScrollBar\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"ScrollViewerEx\" BasedOn=\"{StaticResource {x:Type ScrollViewer}}\" />\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/Slider.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"SliderTrackButton\" TargetType=\"{x:Type RepeatButton}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"true\" />\r\n        <Setter Property=\"IsTabStop\" Value=\"False\" />\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type RepeatButton}\">\r\n                    <Border Background=\"Transparent\" />\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"SliderThumb\" TargetType=\"Thumb\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"Thumb\">\r\n                    <Rectangle  Width=\"{TemplateBinding Width}\" Height=\"Auto\"\r\n                                Fill=\"{TemplateBinding Foreground}\" />\r\n          \r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"Slider\">\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"Height\" Value=\"38\" />\r\n        <Setter Property=\"Padding\" Value=\"0\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"Slider\">\r\n                    <Grid Background=\"{TemplateBinding Background}\">\r\n                        <Border Height=\"6\" Background=\"{DynamicResource ControlBackgroundBrush}\" />\r\n                        <Border Height=\"6\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\r\n                                Background=\"{DynamicResource GlyphBrush}\" \r\n                                Width=\"{Binding ActualWidth, ElementName=ButtonDecrease}\" />\r\n                        <Track Grid.Row=\"1\" x:Name=\"PART_Track\" Margin=\"0,3,0,3\" >\r\n                            <Track.Thumb>\r\n                                <Thumb Width=\"8\" Foreground=\"{TemplateBinding Foreground}\"\r\n                                       Style=\"{DynamicResource SliderThumb}\"/>\r\n                            </Track.Thumb>\r\n                            <Track.DecreaseRepeatButton>\r\n                                <RepeatButton x:Name=\"ButtonDecrease\"\r\n                                              Style=\"{StaticResource SliderTrackButton}\"\r\n                                              Command=\"Slider.DecreaseLarge\" />\r\n                            </Track.DecreaseRepeatButton>\r\n                            <Track.IncreaseRepeatButton>\r\n                                <RepeatButton x:Name=\"ButtonIncrease\"\r\n                                              Style=\"{StaticResource SliderTrackButton}\"\r\n                                              Command=\"Slider.IncreaseLarge\" />\r\n                            </Track.IncreaseRepeatButton>\r\n                        </Track>\r\n                        <Border x:Name=\"BorderFocus\" Margin=\"-3\" SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"\r\n                                BorderBrush=\"{DynamicResource SelectionBrush}\"\r\n                                BorderThickness=\"3\" Visibility=\"Hidden\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"SliderEx\" BasedOn=\"{StaticResource {x:Type Slider}}\">\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/TextBox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"TextBox\">\r\n        <Setter Property=\"KeyboardNavigation.TabNavigation\" Value=\"None\" />\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"12,5,12,5\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontTitilliumWeb}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"TextBox\">                    \r\n                    <Grid Background=\"{TemplateBinding Background}\">  \r\n                        <ScrollViewer x:Name=\"PART_ContentHost\"\r\n                                      VerticalScrollBarVisibility=\"{TemplateBinding VerticalScrollBarVisibility}\"\r\n                                      HorizontalScrollBarVisibility=\"{TemplateBinding HorizontalScrollBarVisibility}\"/>\r\n\r\n                        <Border x:Name=\"BorderStandard\"\r\n                                BorderBrush=\"{DynamicResource SelectionLightBrush}\"\r\n                                BorderThickness=\"2\" Margin=\"-2\" />\r\n\r\n                        <Border x:Name=\"BorderFocus\" Margin=\"-3\" SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"\r\n                                BorderBrush=\"{DynamicResource SelectionBrush}\"\r\n                                BorderThickness=\"3\" Visibility=\"Hidden\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />                            \r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"BorderStandard\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"BorderStandard\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ToggleButton.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n    \r\n    <Style TargetType=\"ToggleButton\">\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"12,5,12,5\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource SelectionLightBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"ToggleButton\">\r\n                    <Grid Background=\"{TemplateBinding Background}\">\r\n                        <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                   Foreground=\"{TemplateBinding Foreground}\"\r\n                                   HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                   VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                   Margin=\"{TemplateBinding Padding}\">                            \r\n                                <ContentPresenter />\r\n                        </TextBlock>\r\n\r\n                        <Border BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                                BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                                x:Name=\"BorderStandard\" />\r\n                        \r\n                        <Border x:Name=\"BorderFocus\" Margin=\"-3\"\r\n                                SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"\r\n                                BorderBrush=\"{DynamicResource SelectionBrush}\"\r\n                                BorderThickness=\"3\" Visibility=\"Hidden\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />                            \r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"BorderStandard\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"BorderStandard\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource SelectionBrush}\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"ToggleButtonEx\" BasedOn=\"{StaticResource {x:Type ToggleButton}}\">\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ToolTip.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type ToolTip}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource SelectionLightBrush}\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ButtonBottomMenu.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"ButtonBottomMenu\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Focusable\" Value=\"False\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"ButtonEx\">\r\n                    <Border Background=\"{TemplateBinding Background}\"\r\n                            Margin=\"20,0,20,0\">\r\n                        <StackPanel Orientation=\"Horizontal\">\r\n                            <ContentControl ContentTemplate=\"{TemplateBinding InputHint}\"\r\n                                            Height=\"30\" VerticalAlignment=\"Center\"\r\n                                            Margin=\"0,0,10,0\" Focusable=\"False\"/>\r\n                            <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                       FontFamily=\"{DynamicResource FontTitilliumWeb}\"\r\n                                       VerticalAlignment=\"Center\">\r\n                                <ContentPresenter />\r\n                            </TextBlock>\r\n                        </StackPanel>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ButtonTopMenu.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"ButtonTopMenu\" TargetType=\"Button\">\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"Button\">\r\n                    <Border Background=\"{TemplateBinding Background}\"\r\n                            BorderBrush=\"Transparent\" BorderThickness=\"3\"\r\n                            x:Name=\"MainBorder\">                        \r\n                            <ContentPresenter />\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"MainBorder\" />   \r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ListGameItemStyle.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"ListGameItemStyle\" TargetType=\"ListBoxItem\">        \r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"ListBoxItem\">\r\n                    <ControlTemplate.Resources>\r\n                        <Storyboard x:Key=\"FocusedOn\">\r\n                            <DoubleAnimation Storyboard.TargetName=\"ScaleTransform\"\r\n                                             Storyboard.TargetProperty=\"ScaleX\"\r\n                                             From=\"1\" To=\"1.06\" Duration=\"0:0:0.1\"/>\r\n                            <DoubleAnimation Storyboard.TargetName=\"ScaleTransform\"\r\n                                             Storyboard.TargetProperty=\"ScaleY\"\r\n                                             From=\"1\" To=\"1.06\" Duration=\"0:0:0.1\"/>\r\n                        </Storyboard>\r\n                        <Storyboard x:Key=\"FocusedOff\">\r\n                            <DoubleAnimation Storyboard.TargetName=\"ScaleTransform\"\r\n                                             Storyboard.TargetProperty=\"ScaleX\"\r\n                                             From=\"1.06\" To=\"1\" Duration=\"0:0:0.2\"/>\r\n                            <DoubleAnimation Storyboard.TargetName=\"ScaleTransform\"\r\n                                             Storyboard.TargetProperty=\"ScaleY\"\r\n                                             From=\"1.06\" To=\"1\" Duration=\"0:0:0.2\"/>\r\n                        </Storyboard>\r\n                    </ControlTemplate.Resources>\r\n                    <Grid Margin=\"{Settings FullscreenItemSpacingMargin}\"\r\n                          RenderTransformOrigin=\"0.5,0.5\"\r\n                          d:DataContext=\"{x:Static DesignMainViewModel.DesignSelectedGameIntance}\">\r\n                        <Grid.RenderTransform>\r\n                            <ScaleTransform x:Name=\"ScaleTransform\" ScaleX=\"1\" ScaleY=\"1\" />\r\n                        </Grid.RenderTransform>\r\n                        <ContentPresenter />\r\n                        <Border CornerRadius=\"3\" BorderThickness=\"3\" BorderBrush=\"{DynamicResource ControlBackgroundBrush}\"\r\n                                Margin=\"-3\"/>\r\n                        <Border x:Name=\"MainBorder\" BorderThickness=\"5\" BorderBrush=\"{DynamicResource SelectionBrush}\"\r\n                                Margin=\"-5\" Visibility=\"Collapsed\" CornerRadius=\"3\">\r\n                            <Border.Effect>\r\n                                <DropShadowEffect ShadowDepth=\"0\" Opacity=\"1\"\r\n                                                  Color=\"{DynamicResource GlyphColor}\"                                                  \r\n                                                  RenderingBias=\"Quality\" BlurRadius=\"20\"/>\r\n                            </Border.Effect>\r\n                        </Border>\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"MainBorder\" />\r\n                            <Setter Property=\"Canvas.ZIndex\" Value=\"90\" />\r\n                            <Trigger.ExitActions>\r\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOff}\" />\r\n                            </Trigger.ExitActions>\r\n                            <Trigger.EnterActions>\r\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOn}\" />\r\n                            </Trigger.EnterActions>\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ListGameItemTemplate.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"ListGameItemTemplate\" TargetType=\"{x:Type GameListItem}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GameListItem}\">\r\n                    <Grid>\r\n                        <Image x:Name=\"PART_ImageCover\"\r\n                               RenderOptions.BitmapScalingMode=\"Fant\" StretchDirection=\"Both\"\r\n                               VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"\r\n                               Stretch=\"{Settings CoverArtStretch}\" />\r\n                        <Border Background=\"#AA000000\" x:Name=\"BorderDarken\" Visibility=\"Collapsed\" />\r\n                        <TextBlock Text=\"{Binding DisplayName}\" TextTrimming=\"CharacterEllipsis\"\r\n                                   Visibility=\"{Settings Fullscreen.ShowGameTitles}\"\r\n                                   Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                   FontSize=\"{DynamicResource FontSizeSmall}\"\r\n                                   HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Bottom\"\r\n                                   TextAlignment=\"Center\" Padding=\"5\"                                    \r\n                                   Background=\"{DynamicResource ControlBackgroundDarkBrush}\"/>\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <MultiDataTrigger>\r\n                            <MultiDataTrigger.Conditions>\r\n                                <Condition Binding=\"{Binding IsInstalled}\" Value=\"False\" />\r\n                                <Condition Binding=\"{Settings Fullscreen.DarkenUninstalledGamesGrid}\" Value=\"True\" />\r\n                            </MultiDataTrigger.Conditions>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderDarken\" />\r\n                        </MultiDataTrigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/DescriptionView.html",
    "content": "﻿<!DOCTYPE html>\r\n<html>\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <style type=\"text/css\">\r\n        HTML,BODY\r\n        {\r\n            color: {foreground};\r\n            font-family: \"{font_family}\";\r\n            font-size: {font_size}px;\r\n            margin: 0;\r\n            padding: 0;\r\n        }\r\n\r\n        a {\r\n            color: {link_foreground};\r\n            text-decoration: none;\r\n        }\r\n\r\n        img {\r\n            max-width: 100%;\r\n        }\r\n    </style>\r\n    <title>Game Description</title>\r\n</head>\r\n<body>\r\n<div>\r\n{text}\r\n</div>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Images/ButtonPrompts/PlayStation/PlayStation.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptA\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"e\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptB\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"q\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptX\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"t\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptY\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"u\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptLB\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"f\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptRB\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"l\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptLT\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"g\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptRT\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"z\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptBack\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"c\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptStart\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"j\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptLS\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"h\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptRS\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontPlayStation4Controller}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"x\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Images/ButtonPrompts/Xbox/Xbox.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptA\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                       Foreground=\"{DynamicResource TextBrush}\"\r\n                       Text=\"q\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptB\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"e\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptX\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                       Foreground=\"{DynamicResource TextBrush}\"\r\n                       Text=\"t\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptY\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"u\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptLB\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"f\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptRB\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"z\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptLT\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"j\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptRT\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"v\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptBack\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"b\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptStart\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"k\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptLS\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"g\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"ButtonPromptRS\">\r\n        <Viewbox>\r\n            <TextBlock FontFamily=\"{DynamicResource FontXboxOneController}\"\r\n                        Foreground=\"{DynamicResource TextBrush}\"\r\n                        Text=\"x\" />\r\n        </Viewbox>\r\n    </DataTemplate>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Media.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:popt=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation/options\">\r\n\r\n    <BitmapImage x:Key=\"DefaultGameIcon\" UriSource=\"{ThemeFile 'Images/applogo_clean.png'}\" popt:Freeze=\"True\" />\r\n    <BitmapImage x:Key=\"DefaultGameCover\" UriSource=\"{ThemeFile 'Images/custom_cover_background.png'}\" popt:Freeze=\"True\" />\r\n\r\n    <TextBlock x:Key=\"BatteryStatusCritical\" Text=\"&#xeeb1;\" FontFamily=\"{StaticResource FontIcoFont}\" />\r\n    <TextBlock x:Key=\"BatteryStatusLow\" Text=\"&#xeeb4;\" FontFamily=\"{StaticResource FontIcoFont}\" />\r\n    <TextBlock x:Key=\"BatteryStatusMedium\" Text=\"&#xeeb3;\" FontFamily=\"{StaticResource FontIcoFont}\" />\r\n    <TextBlock x:Key=\"BatteryStatusHigh\" Text=\"&#xeeb2;\" FontFamily=\"{StaticResource FontIcoFont}\" />\r\n    <TextBlock x:Key=\"BatteryStatusCharging\" Text=\"&#xeed4;\" FontFamily=\"{StaticResource FontIcoFont}\" />\r\n\r\n    <Style x:Key=\"ProgressIndicator\" TargetType=\"ContentControl\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"ContentControl\">\r\n                    <Grid>\r\n                        <Ellipse HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\"\r\n                    Fill=\"Transparent\"\r\n                    StrokeThickness=\"4\"\r\n                    Stroke=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n\r\n                        <Ellipse HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\"\r\n                    Fill=\"Transparent\" RenderTransformOrigin=\"0.5,0.5\"\r\n                    StrokeThickness=\"4\"\r\n                    Stroke=\"{DynamicResource GlyphBrush}\">\r\n                            <Ellipse.Resources>\r\n                                <Storyboard x:Key=\"VisibleOn\">\r\n                                    <DoubleAnimation Storyboard.TargetProperty=\"(Rectangle.RenderTransform).(RotateTransform.Angle)\"\r\n                                        To=\"360\" Duration=\"0:0:05\" RepeatBehavior=\"Forever\" />\r\n                                </Storyboard>\r\n                                <Storyboard x:Key=\"VisibleOff\">\r\n                                    <DoubleAnimation Storyboard.TargetProperty=\"(Rectangle.RenderTransform).(RotateTransform.Angle)\"\r\n                                        To=\"0\" Duration=\"0:0:0\"/>\r\n                                </Storyboard>\r\n                            </Ellipse.Resources>\r\n                            <Ellipse.RenderTransform>\r\n                                <RotateTransform />\r\n                            </Ellipse.RenderTransform>\r\n                            <Ellipse.Style>\r\n                                <Style TargetType=\"Ellipse\">\r\n                                    <Style.Triggers>\r\n                                        <MultiTrigger>\r\n                                            <MultiTrigger.Conditions>\r\n                                                <Condition Property=\"IsVisible\" Value=\"True\"/>\r\n                                            </MultiTrigger.Conditions>\r\n                                            <MultiTrigger.EnterActions>\r\n                                                <BeginStoryboard Storyboard=\"{StaticResource VisibleOn}\"/>\r\n                                            </MultiTrigger.EnterActions>\r\n                                            <MultiTrigger.ExitActions>\r\n                                                <BeginStoryboard Storyboard=\"{StaticResource VisibleOff}\"/>\r\n                                            </MultiTrigger.ExitActions>\r\n                                        </MultiTrigger>\r\n                                    </Style.Triggers>\r\n                                </Style>\r\n                            </Ellipse.Style>\r\n                            <Ellipse.Clip>\r\n                                <RectangleGeometry Rect=\"0,0,10,20\"/>\r\n                            </Ellipse.Clip>\r\n                        </Ellipse>\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"ProgressHeaderStyle\" TargetType=\"ContentControl\">\n        <Setter Property=\"Width\" Value=\"Auto\" />\n        <Setter Property=\"Height\" Value=\"Auto\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"ContentControl\">\n                    <Image RenderOptions.BitmapScalingMode=\"Fant\"\n                       Stretch=\"Uniform\"\n                       MaxHeight=\"200\"\n                       Source=\"{ThemeFile 'Images/applogo_clean.png'}\" />\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\r\n\r\n\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/CustomMenus.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"GameClientMenuButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Margin\" Value=\"5\" />\r\n        <Setter Property=\"ContentTemplate\">\r\n            <Setter.Value>\r\n                <DataTemplate>\r\n                    <StackPanel Orientation=\"Horizontal\">\r\n                        <ContentControl Content=\"{Binding Icon}\" Width=\"24\" Focusable=\"False\"\r\n                                        VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n                        <TextBlock Text=\"{Binding Name}\" VerticalAlignment=\"Center\" />\r\n                    </StackPanel>\r\n                </DataTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"GameClientsBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"CornerRadius\" Value=\"3\" />\r\n        <Setter Property=\"Width\" Value=\"400\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource OverlayMenuBackgroundBrush}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"SoftwareToolMenuButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Margin\" Value=\"5\" />\r\n        <Setter Property=\"ContentTemplate\">\r\n            <Setter.Value>\r\n                <DataTemplate>\r\n                    <StackPanel Orientation=\"Horizontal\">\r\n                        <Image Source=\"{Binding Icon, Converter={StaticResource ImageStringToImageConverter}}\" Width=\"24\" Focusable=\"False\"\r\n                               VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n                        <TextBlock Text=\"{Binding Name}\" VerticalAlignment=\"Center\" />\r\n                    </StackPanel>\r\n                </DataTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"SoftwareToolsBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"CornerRadius\" Value=\"3\" />\r\n        <Setter Property=\"Width\" Value=\"400\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource OverlayMenuBackgroundBrush}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"ExtensionMenuButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Margin\" Value=\"5\" />\r\n        <Setter Property=\"ContentTemplate\">\r\n            <Setter.Value>\r\n                <DataTemplate>\r\n                    <DockPanel>\r\n                        <ContentControl Content=\"{Binding Icon}\" Width=\"24\" Focusable=\"False\"\r\n                                        VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"\r\n                                        DockPanel.Dock=\"Left\"/>\r\n                        <TextBlock Text=\">\" Margin=\"15,0,0,0\" DockPanel.Dock=\"Right\" VerticalAlignment=\"Center\"\r\n                                   Visibility=\"{Binding Children, Converter={StaticResource NullToVisibilityConverter}}\"/>\r\n                        <TextBlock Text=\"{Binding Header}\" VerticalAlignment=\"Center\"\r\n                                   DockPanel.Dock=\"Left\"/>\r\n                    </DockPanel>\r\n                </DataTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"ExtensionsBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"CornerRadius\" Value=\"3\" />\r\n        <Setter Property=\"Width\" Value=\"400\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource OverlayMenuBackgroundBrush}\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/FiltersAdditional.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style TargetType=\"{x:Type FiltersAdditional}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type FiltersAdditional}\">\r\n                    <DockPanel Background=\"{DynamicResource OverlayMenuBackgroundBrush}\"\r\n                                Width=\"{DynamicResource FilterPanelWidth}\"\r\n                                x:Name=\"PART_MenuHost\">\r\n                        <ButtonEx BorderThickness=\"2\" DockPanel.Dock=\"Top\"\r\n                                  Margin=\"15,5,15,5\"\r\n                                  x:Name=\"PART_ButtonBack\">\r\n                            <Button.Content>\r\n                                <StackPanel Orientation=\"Horizontal\">\r\n                                    <TextBlock Text=\"&#xeab5;\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                                            FontSize=\"20\" VerticalAlignment=\"Center\"\r\n                                            Margin=\"0,0,10,0\" />\r\n                                    <TextBlock Text=\"{DynamicResource LOCFilters}\"\r\n                                            VerticalAlignment=\"Center\"\r\n                                            Style=\"{DynamicResource TextBlockBaseStyle}\"/>\r\n                                </StackPanel>\r\n                            </Button.Content>\r\n                        </ButtonEx>\r\n                        <ItemsControlEx x:Name=\"PART_ItemsHost\"\r\n                                        DockPanel.Dock=\"Top\" Focusable=\"False\"\r\n                                        KeyboardNavigation.DirectionalNavigation=\"Once\" />\r\n                    </DockPanel>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/FiltersView.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"FilterPanelNagivationButton\" TargetType=\"Button\" BasedOn=\"{StaticResource {x:Type Button}}\">\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"6,5,6,5\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n        <Setter Property=\"Margin\" Value=\"15,5,15,5\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"Button\">\r\n                    <Grid Background=\"{TemplateBinding Background}\">\r\n                        <DockPanel Margin=\"{TemplateBinding Padding}\">\r\n                            <TextBlock Text=\"&#xeab8;\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                                       DockPanel.Dock=\"Right\"\r\n                                       Foreground=\"{TemplateBinding Foreground}\"\r\n                                       FontSize=\"20\"\r\n                                       VerticalAlignment=\"Center\"/>\r\n                            <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                       DockPanel.Dock=\"Left\"\r\n                                       Foreground=\"{TemplateBinding Foreground}\"\r\n                                       HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                       VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\">                            \r\n                                <ContentPresenter />\r\n                            </TextBlock>\r\n                        </DockPanel>\r\n\r\n                        <Border BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                                BorderBrush=\"{TemplateBinding BorderBrush}\"\r\n                                x:Name=\"BorderStandard\" />\r\n\r\n                        <Border x:Name=\"BorderFocus\" Margin=\"-3\"\r\n                                SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"\r\n                                BorderBrush=\"{DynamicResource SelectionBrush}\"\r\n                                BorderThickness=\"3\" Visibility=\"Hidden\" />\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"BorderStandard\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"BorderStandard\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"Tag\" Value=\"{StaticResource True}\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphLightBrush}\" />\r\n                            <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"FilterItemtSelectionStyle\" TargetType=\"CheckBoxEx\" BasedOn=\"{StaticResource {x:Type CheckBoxEx}}\">\r\n        <Setter Property=\"Margin\" Value=\"15,5,15,5\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"FilterPanelCheckBoxEx\" TargetType=\"CheckBoxEx\" BasedOn=\"{StaticResource {x:Type CheckBoxEx}}\">\r\n        <Setter Property=\"Margin\" Value=\"15,5,15,5\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"FilterPanelButtonEx\" TargetType=\"ButtonEx\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\">\r\n        <Setter Property=\"Margin\" Value=\"15,5,15,5\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"2\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"Tag\" Value=\"{StaticResource True}\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphLightBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n\r\n    <Style x:Key=\"FilterPanelComboBoxEx\" TargetType=\"ComboBoxEx\" BasedOn=\"{StaticResource {x:Type ComboBoxEx}}\">\r\n        <Setter Property=\"Margin\" Value=\"15,5,15,5\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"FilterPanelText\" TargetType=\"TextBlock\" BasedOn=\"{StaticResource TextBlockBaseStyle}\">\r\n        <Setter Property=\"Margin\" Value=\"15,20,15,5\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"FilterPanelFilterPresetActionButton\" TargetType=\"ButtonEx\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\">\r\n        <Setter Property=\"Margin\" Value=\"15,5,15,5\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\r\n    </Style>\r\n\r\n    <DataTemplate x:Key=\"FilterPanelAddPresetTemplate\">\r\n        <TextBlock Text=\"&#xee00;\" TextAlignment=\"Center\"\r\n                   FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                   FontSize=\"20\" Foreground=\"{DynamicResource TextBrush}\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"FilterPanelRenamePresetTemplate\">\r\n        <TextBlock Text=\"&#xec55;\" TextAlignment=\"Center\"\r\n                   FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                   FontSize=\"20\" Foreground=\"{DynamicResource TextBrush}\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"FilterPanelRemovePresetTemplate\">\r\n        <TextBlock Text=\"&#xec53;\" TextAlignment=\"Center\"\r\n                   FontFamily=\"{DynamicResource FontIcoFont}\"\r\n                   FontSize=\"20\" Foreground=\"{DynamicResource TextBrush}\"\r\n                   VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/>\r\n    </DataTemplate>\r\n\r\n    <Style TargetType=\"{x:Type Filters}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Filters}\">\r\n                    <Border Background=\"{DynamicResource OverlayMenuBackgroundBrush}\"\r\n                            MinWidth=\"{DynamicResource FilterPanelWidth}\">\r\n                        <ItemsControlEx x:Name=\"PART_ItemsHost\" Focusable=\"False\"\r\n                                        KeyboardNavigation.DirectionalNavigation=\"Once\">\r\n                            <ItemsControl.ItemsPanel>\r\n                                <ItemsPanelTemplate>\r\n                                    <StackPanel />\r\n                                </ItemsPanelTemplate>\r\n                            </ItemsControl.ItemsPanel>\r\n                            <ItemsControl.Template>\r\n                                <ControlTemplate>\r\n                                    <ScrollViewer Focusable=\"False\"\r\n                                                  HorizontalScrollBarVisibility=\"Disabled\"\r\n                                                  VerticalScrollBarVisibility=\"Auto\"\r\n                                                  CanContentScroll=\"True\">\r\n                                        <ItemsPresenter />\r\n                                    </ScrollViewer>\r\n                                </ControlTemplate>\r\n                            </ItemsControl.Template>\r\n                        </ItemsControlEx>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameDetails.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"                    \r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type GameDetails}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GameDetails}\">\r\n                    <Grid Background=\"{DynamicResource MainBackgourndBrush}\"\r\n                          x:Name=\"PART_ViewHost\"\r\n                          d:DesignWidth=\"{StaticResource DesignWidth}\"\r\n                          d:DesignHeight=\"{StaticResource DesignHeight}\"\r\n                          d:DataContext=\"{x:Static DesignMainViewModel.DesignSelectedGameIntance}\"\r\n                          KeyboardNavigation.DirectionalNavigation=\"Contained\"\r\n                          KeyboardNavigation.TabNavigation=\"Cycle\"\r\n                          KeyboardNavigation.ControlTabNavigation=\"Cycle\">\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"*\" />\r\n                            <ColumnDefinition Width=\"350\" />\r\n                            <ColumnDefinition Width=\"6*\" />\r\n                            <ColumnDefinition Width=\"*\" />\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"3*\" />\r\n                            <RowDefinition Height=\"4*\" />\r\n                        </Grid.RowDefinitions>\r\n                        \r\n                        <FadeImage HorizontalAlignment=\"Center\" VerticalAlignment=\"Top\"\r\n                                   Grid.ColumnSpan=\"4\" Grid.RowSpan=\"2\"\r\n                                   x:Name=\"PART_ImageBackground\" />\r\n\r\n                        <Border Background=\"{DynamicResource GameDetailsBackgroundBrush}\"\r\n                                Grid.ColumnSpan=\"4\" Grid.Row=\"1\" />\r\n\r\n                        <Border CornerRadius=\"3\" BorderThickness=\"3\" BorderBrush=\"{DynamicResource ControlBackgroundBrush}\"\r\n                                Margin=\"14\" Grid.Column=\"1\" Grid.Row=\"1\"\r\n                                VerticalAlignment=\"Top\"\r\n                                HorizontalAlignment=\"Right\">\r\n                            <Image x:Name=\"PART_ImageCover\" />\r\n                        </Border>\r\n\r\n                        <Image Grid.Column=\"1\" Grid.Row=\"1\"\r\n                               VerticalAlignment=\"Top\"\r\n                               HorizontalAlignment=\"Right\"\r\n                               Margin=\"24\"\r\n                               Source=\"{Binding LibraryPlugin.LibraryIcon}\"\r\n                               Height=\"48\" RenderOptions.BitmapScalingMode=\"Fant\">\r\n                            <Image.Effect>\r\n                                <DropShadowEffect Color=\"White\" BlurRadius=\"20\" ShadowDepth=\"0\"\r\n                                                  RenderingBias=\"Quality\" Opacity=\"1\"/>\r\n                            </Image.Effect>\r\n                        </Image>\r\n\r\n                        <DockPanel Grid.Column=\"2\" Grid.Row=\"1\"\r\n                                   Margin=\"20\"\r\n                                   HorizontalAlignment=\"Left\">\r\n\r\n                            <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                       Text=\"{Binding DisplayName}\"\r\n                                       Foreground=\"White\" FontFamily=\"{DynamicResource FontTitilliumWebBold}\"\r\n                                       FontSize=\"38\" DockPanel.Dock=\"Top\">\r\n                                <TextBlock.Effect>\r\n                                    <DropShadowEffect ShadowDepth=\"2\" Color=\"Black\"\r\n                                                      RenderingBias=\"Quality\" Opacity=\"1\"/>\r\n                                </TextBlock.Effect>\r\n                            </TextBlock>\r\n\r\n                            <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\" Margin=\"0,20,20,20\">\r\n                                <StackPanel>\r\n                                    <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                               FontFamily=\"{DynamicResource FontTitilliumWebBold}\"\r\n                                               Text=\"{DynamicResource LOCTimePlayed}\"\r\n                                               Margin=\"0,0,0,10\" />\r\n                                    <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                               Text=\"{Binding Playtime, Converter={StaticResource PlayTimeToStringConverter}}\" />\r\n                                </StackPanel>\r\n                                \r\n                                <StackPanel Margin=\"50,0,0,0\">\r\n                                    <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                               FontFamily=\"{DynamicResource FontTitilliumWebBold}\"\r\n                                               Text=\"{DynamicResource LOCGameLastActivityTitle}\"\r\n                                               Margin=\"0,0,0,10\" />\r\n                                    <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                               Text=\"{Binding LastActivity, Converter={StaticResource DateTimeToLastPlayedConverter}}\" />\r\n                                </StackPanel>\r\n\r\n                                <StackPanel Margin=\"50,0,0,0\">\r\n                                    <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                               FontFamily=\"{DynamicResource FontTitilliumWebBold}\"\r\n                                               Text=\"{DynamicResource LOCGameReleaseDateTitle}\"\r\n                                               Margin=\"0,0,0,10\" />\r\n                                    <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                               Text=\"{Binding ReleaseDate}\" />\r\n                                </StackPanel>\r\n\r\n                                <StackPanel Margin=\"50,0,0,0\">\r\n                                    <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                               FontFamily=\"{DynamicResource FontTitilliumWebBold}\"\r\n                                               Text=\"{DynamicResource LOCGamePlatformTitle}\"\r\n                                               Margin=\"0,0,0,10\" />\r\n                                    <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                               Text=\"{Binding Platforms, Converter={StaticResource ListToStringConverter}}\" />\r\n                                </StackPanel>\r\n                            </StackPanel>\r\n                            \r\n                            <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Top\">\r\n                                <ButtonEx x:Name=\"PART_ButtonContext\"\r\n                                          Margin=\"2\" BorderThickness=\"2\" MinWidth=\"220\" HorizontalContentAlignment=\"Center\" />\r\n                                <ButtonEx x:Name=\"PART_ButtonOptions\"\r\n                                          Content=\"{DynamicResource LOCGameOptions}\"\r\n                                          Margin=\"5,2,2,2\" BorderThickness=\"2\" MinWidth=\"220\" HorizontalContentAlignment=\"Center\" />\r\n                            </StackPanel>\r\n      \r\n                            <ScrollViewerEx Margin=\"0,20,0,0\" DockPanel.Dock=\"Top\"\r\n                                            x:Name=\"PART_ScrollHtmlDescription\">\r\n                                <HtmlTextView x:Name=\"PART_HtmlDescription\"\r\n                                                HtmlFontSize=\"16\"\r\n                                                HtmlForeground=\"{DynamicResource TextColor}\"\r\n                                                LinkForeground=\"{DynamicResource GlyphColor}\"\r\n                                                FocusVisualStyle=\"{x:Null}\" />\r\n                            </ScrollViewerEx>\r\n                        </DockPanel>\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameMenu.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"GameMenuButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Margin\" Value=\"5\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"GameMenuBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"CornerRadius\" Value=\"3\" />\r\n        <Setter Property=\"Width\" Value=\"400\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource OverlayMenuBackgroundBrush}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"GameMenuHeaderText\" BasedOn=\"{StaticResource TextBlockBaseStyle}\" TargetType=\"TextBlock\" >\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Bottom\" />\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"TextWrapping\" Value=\"Wrap\" />\r\n        <Setter Property=\"Padding\" Value=\"15,15,15,15\" />\r\n        <Setter Property=\"Background\" Value=\"#AA000000\" />\r\n    </Style>\r\n\r\n    <DataTemplate x:Key=\"GameMenuHeaderTemplate\">\r\n        <TextBlock Text=\"{Binding Name}\"\r\n                   Style=\"{DynamicResource GameMenuHeaderText}\" />\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"GameMenuPlayButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xec74;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\" Width=\"25\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"GameMenuInstallButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xef08;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\" Width=\"25\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"GameMenuFavoriesButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xf000;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\" Width=\"25\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"GameMenuVisibilityButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xef21;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\" Width=\"25\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"GameMenuHdrButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xeef2;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\" Width=\"25\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"GameMenuRemoveButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xeee4;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\" Width=\"25\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"GameMenuUninstallButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xec53;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\" Width=\"25\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"GameMenuCustomActionButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Width=\"25\" Margin=\"0,0,10,0\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />\r\n            <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"GameMenuCompletionStatusTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Width=\"25\" Margin=\"0,0,10,0\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />\r\n            <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"GameMenuSetFieldsTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xeded;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\" Width=\"25\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"GameMenuExtensionsTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xefc7;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\" Width=\"25\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{Binding}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameStatus.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"                    \r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style x:Key=\"ButtonGameStatusAction\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Margin\" Value=\"0,5,0,5\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"MinWidth\" Value=\"100\" />\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type GameStatus}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type GameStatus}\">\r\n                    <Grid Background=\"{DynamicResource MainBackgourndBrush}\"\r\n                          x:Name=\"PART_ViewHost\"\r\n                          d:DesignWidth=\"{StaticResource DesignWidth}\"\r\n                          d:DesignHeight=\"{StaticResource DesignHeight}\"\r\n                          d:DataContext=\"{x:Static DesignMainViewModel.DesignSelectedGameIntance}\"\r\n                          KeyboardNavigation.DirectionalNavigation=\"Contained\"\r\n                          KeyboardNavigation.TabNavigation=\"Cycle\"\r\n                          KeyboardNavigation.ControlTabNavigation=\"Cycle\">\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"2*\" />\r\n                            <ColumnDefinition Width=\"3*\" />\r\n                            <ColumnDefinition Width=\"2*\" />\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"*\" />\r\n                            <RowDefinition Height=\"Auto\" />\r\n                            <RowDefinition Height=\"Auto\" />\r\n                            <RowDefinition Height=\"Auto\" />\r\n                            <RowDefinition Height=\"*\" />\r\n                        </Grid.RowDefinitions>\r\n\r\n                        <Image Name=\"PART_ImageCover\"\r\n                               RenderOptions.BitmapScalingMode=\"Fant\"\r\n                               Height=\"350\" HorizontalAlignment=\"Center\"\r\n                               Grid.Row=\"1\" Grid.Column=\"1\"/>\r\n\r\n                        <TextBlock Name=\"PART_TextStatus\" TextWrapping=\"Wrap\"\r\n                                   Style=\"{StaticResource TextBlockBaseStyle}\"\r\n                                   HorizontalAlignment=\"Center\" Margin=\"0,20,0,20\"                                   \r\n                                   Grid.Row=\"2\" Grid.Column=\"1\"/>\r\n\r\n                        <StackPanel Name=\"PART_PanelActionButtons\" Orientation=\"Horizontal\"\r\n                                    HorizontalAlignment=\"Center\"\r\n                                    Grid.Row=\"3\" Grid.Column=\"1\"/>\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/HelpMenu.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:pmrk=\"clr-namespace:Playnite.FullscreenApp.Markup;assembly=Playnite.FullscreenApp\">\r\n    \r\n    <Style x:Key=\"HelpMenuBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource OverlayMenuBackgroundBrush}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"HelpMenuButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Margin\" Value=\"0,5,0,5\" />\r\n        <Setter Property=\"Padding\" Value=\"20,3,20,3\" />\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\r\n    </Style>\r\n\r\n    <DataTemplate x:Key=\"HelpMenuHeaderTemplate\">\r\n        <TextBlock Text=\"{DynamicResource LOCMenuHelpTitle}\"\r\n                   FontSize=\"36\" Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                   Margin=\"20,30,40,30\" />\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"HelpMenuRestartPlayniteButtonTemplate\">\r\n        <TextBlock Text=\"{DynamicResource LOCCrashRestartPlaynite}\" VerticalAlignment=\"Center\" />\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"HelpMenuSafeModeButtonTemplate\">\r\n        <TextBlock Text=\"{DynamicResource LOCCrashRestartSafe}\" VerticalAlignment=\"Center\" />\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"HelpMenuFeedbackButtonTemplate\">\r\n        <TextBlock Text=\"{DynamicResource LOCMenuIssues}\" VerticalAlignment=\"Center\" />\r\n    </DataTemplate>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/ItemSelection.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n\r\n    <Style x:Key=\"ItemSelectionButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Margin\" Value=\"5\" />\r\n        <Setter Property=\"ContentTemplate\">\r\n            <Setter.Value>\r\n                <DataTemplate>\r\n                    <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\" TextTrimming=\"CharacterEllipsis\"\r\n                               Text=\"{Binding}\" />\r\n                </DataTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"ItemSelectionCheckBox\" BasedOn=\"{StaticResource {x:Type CheckBoxEx}}\" TargetType=\"CheckBoxEx\">\r\n        <Setter Property=\"Margin\" Value=\"5\" />\r\n        <Setter Property=\"ContentTemplate\">\r\n            <Setter.Value>\r\n                <DataTemplate>\r\n                    <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\" TextTrimming=\"CharacterEllipsis\"\r\n                               Text=\"{Binding}\" />\r\n                </DataTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"ItemSelectionBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"CornerRadius\" Value=\"3\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource OverlayMenuBackgroundBrush}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"ItemSelectionFooterBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"Background\" Value=\"#AA000000\" />\r\n        <Setter Property=\"Padding\" Value=\"0,10,0,10\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"ItemSelectionFooterButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Focusable\" Value=\"False\" />        \r\n    </Style>\r\n\r\n    <Style x:Key=\"ItemSelectionHeaderText\" BasedOn=\"{StaticResource TextBlockBaseStyle}\" TargetType=\"TextBlock\" >\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Bottom\" />\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"TextWrapping\" Value=\"Wrap\" />\r\n        <Setter Property=\"Padding\" Value=\"15,15,15,15\" />\r\n        <Setter Property=\"Background\" Value=\"#AA000000\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/Main.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type Main}\">\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Main}\">\r\n                    <Grid x:Name=\"PART_MainHost\"\r\n                          d:DesignWidth=\"{StaticResource DesignWidth}\"\r\n                          d:DesignHeight=\"{StaticResource DesignHeight}\"\r\n                          d:DataContext=\"{x:Static DesignMainViewModel.DesignIntance}\">\r\n                        <Grid x:Name=\"PART_ViewHost\" Background=\"{DynamicResource MainBackgourndBrush}\">\r\n                            <Grid.RowDefinitions>\r\n                                <RowDefinition Height=\"Auto\" />\r\n                                <RowDefinition Height=\"*\" />\r\n                                <RowDefinition Height=\"Auto\" />\r\n                            </Grid.RowDefinitions>\r\n\r\n                            <FadeImage x:Name=\"PART_ImageBackground\" Grid.RowSpan=\"3\"\r\n                                       HorizontalAlignment=\"Center\" VerticalAlignment=\"Top\"/>\r\n\r\n                            <Grid Grid.Row=\"0\" Background=\"{DynamicResource TopBarBackgroundBrush}\"\r\n                                  Height=\"110\">\r\n                                <Grid.ColumnDefinitions>\r\n                                    <ColumnDefinition Width=\"100\" />\r\n                                    <ColumnDefinition Width=\"*\" />\r\n                                    <ColumnDefinition Width=\"Auto\" />\r\n                                    <ColumnDefinition Width=\"Auto\" />\r\n                                    <ColumnDefinition Width=\"Auto\" />\r\n                                    <ColumnDefinition Width=\"Auto\" />\r\n                                    <ColumnDefinition Width=\"Auto\" />\r\n                                    <ColumnDefinition Width=\"Auto\" />\r\n                                    <ColumnDefinition Width=\"100\" />\r\n                                </Grid.ColumnDefinitions>\r\n\r\n                                <FilterPresetSelector x:Name=\"PART_FilterPresetSelector\" Grid.Column=\"1\" Margin=\"0,0,50,0\" />\r\n\r\n                                <ContentControl x:Name=\"PART_ElemBatteryStatus\" Focusable=\"False\" FontSize=\"42\"\r\n                                            VerticalAlignment=\"Center\" Margin=\"10,0,10,0\"\r\n                                            Grid.Column=\"2\">\r\n                                    <ContentControl.Style>\r\n                                        <Style TargetType=\"ContentControl\">\r\n                                            <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n                                            <Style.Triggers>\r\n                                                <DataTrigger Binding=\"{Binding PowerStatus.Charge}\" Value=\"Critical\">\r\n                                                    <Setter Property=\"Content\" Value=\"{DynamicResource BatteryStatusCritical}\" />\r\n                                                    <Setter Property=\"Foreground\" Value=\"Red\" />\r\n                                                </DataTrigger>\r\n                                                <DataTrigger Binding=\"{Binding PowerStatus.Charge}\" Value=\"Low\">\r\n                                                    <Setter Property=\"Content\" Value=\"{DynamicResource BatteryStatusLow}\" />\r\n                                                </DataTrigger>\r\n                                                <DataTrigger Binding=\"{Binding PowerStatus.Charge}\" Value=\"Medium\">\r\n                                                    <Setter Property=\"Content\" Value=\"{DynamicResource BatteryStatusMedium}\" />\r\n                                                </DataTrigger>\r\n                                                <DataTrigger Binding=\"{Binding PowerStatus.Charge}\" Value=\"High\">\r\n                                                    <Setter Property=\"Content\" Value=\"{DynamicResource BatteryStatusHigh}\" />\r\n                                                </DataTrigger>\r\n                                                <DataTrigger Binding=\"{Binding PowerStatus.IsCharging}\" Value=\"True\">\r\n                                                    <Setter Property=\"Content\" Value=\"{DynamicResource BatteryStatusCharging}\" />\r\n                                                </DataTrigger>\r\n                                            </Style.Triggers>\r\n                                        </Style>\r\n                                    </ContentControl.Style>\r\n                                </ContentControl>\r\n\r\n                                <TextBlock x:Name=\"PART_TextBatteryPercentage\" Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                       VerticalAlignment=\"Center\" Margin=\"0,0,20,0\"\r\n                                       Grid.Column=\"3\"/>\r\n\r\n                                <TextBlock x:Name=\"PART_TextClock\" Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                       VerticalAlignment=\"Center\" Margin=\"20,0,20,0\"\r\n                                       Grid.Column=\"4\"/>\r\n\r\n                                <ButtonEx x:Name=\"PART_ButtonProgramUpdate\" VerticalAlignment=\"Center\"\r\n                                          Margin=\"10,0,10,0\" Height=\"48\" MinWidth=\"48\"\r\n                                          Style=\"{DynamicResource ButtonTopMenu}\"                                          \r\n                                          Grid.Column=\"5\">\r\n                                    <ButtonEx.Content>\r\n                                        <TextBlock Text=\"&#xef08;\" FontFamily=\"{StaticResource FontIcoFont}\"                                                   \r\n                                                   HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Margin=\"2\"\r\n                                                   Foreground=\"{DynamicResource GlyphLightBrush}\" FontSize=\"30\" />\r\n                                    </ButtonEx.Content>\r\n                                </ButtonEx>\r\n\r\n                                <ButtonEx x:Name=\"PART_ButtonNotifications\" VerticalAlignment=\"Center\"\r\n                                          Margin=\"10,0,10,0\" Height=\"48\" MinWidth=\"48\"\r\n                                          Grid.Column=\"6\">\r\n                                    <Button.Content>\r\n                                        <Grid>\r\n                                            <TextBlock Text=\"&#xeea3;\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                                                       HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Margin=\"2\"\r\n                                                       Foreground=\"White\" FontSize=\"30\" />\r\n                                            <TextBlock Text=\"&#x25CF;\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                       HorizontalAlignment=\"Right\" VerticalAlignment=\"Bottom\"\r\n                                                       FontSize=\"24\" Margin=\"0,0,5,0\" />\r\n                                        </Grid>\r\n                                    </Button.Content>\r\n                                    <Button.Style>\r\n                                        <Style TargetType=\"Button\" BasedOn=\"{StaticResource ButtonTopMenu}\">\r\n                                            <Style.Triggers>\r\n                                                <DataTrigger Binding=\"{Api Notifications.Count}\" Value=\"0\">\r\n                                                    <Setter Property=\"Visibility\" Value=\"Collapsed\"/>\r\n                                                </DataTrigger>\r\n                                            </Style.Triggers>\r\n                                        </Style>\r\n                                    </Button.Style>\r\n                                </ButtonEx>\r\n\r\n                                <ButtonEx x:Name=\"PART_ButtonMainMenu\" VerticalAlignment=\"Center\"\r\n                                          Style=\"{DynamicResource ButtonTopMenu}\"\r\n                                          Margin=\"10,0,10,0\" Height=\"48\" MinWidth=\"48\"\r\n                                          Grid.Column=\"7\">\r\n                                    <Button.Content>\r\n                                        <Image RenderOptions.BitmapScalingMode=\"Fant\" Margin=\"2\"\r\n                                           Source=\"{ThemeFile 'Images/applogo_clean.png'}\" />\r\n                                    </Button.Content>\r\n                                </ButtonEx>\r\n                            </Grid>\r\n\r\n                            <DockPanel Grid.Row=\"1\">\r\n                                <Filters x:Name=\"PART_ElemFilters\"\r\n                                         DockPanel.Dock=\"Left\" Focusable=\"False\" />\r\n\r\n                                <FiltersAdditional x:Name=\"PART_ElemFiltersAdditional\"\r\n                                                   DockPanel.Dock=\"Left\" Focusable=\"False\" />\r\n\r\n                                <ContentControl x:Name=\"PART_ContentFilterItems\"\r\n                                            DockPanel.Dock=\"Left\" Focusable=\"False\" />\r\n\r\n                                <ListBoxEx x:Name=\"PART_ListGameItems\" Margin=\"25,0,25,0\"\r\n                                           Background=\"Transparent\" BorderThickness=\"0\"\r\n                                           DockPanel.Dock=\"Right\"\r\n                                           KeyboardNavigation.DirectionalNavigation=\"Once\" />\r\n                            </DockPanel>\r\n\r\n                            <TextBlock Grid.Row=\"1\" FontSize=\"40\"\r\n                                       Text=\"{DynamicResource LOCNoGamesFound}\"\r\n                                       TextAlignment=\"Center\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\r\n                                <TextBlock.Style>\r\n                                    <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource TextBlockBaseStyle}\">\r\n                                        <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                                        <Style.Triggers>\r\n                                            <DataTrigger Binding=\"{Binding Items.Count, ElementName=PART_ListGameItems}\" Value=\"0\">\r\n                                                <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                                            </DataTrigger>\r\n                                        </Style.Triggers>\r\n                                    </Style>\r\n                                </TextBlock.Style>\r\n                            </TextBlock>\r\n\r\n                            <Grid Grid.Row=\"2\" Background=\"{DynamicResource TopBarBackgroundBrush}\"\r\n                              Height=\"100\">\r\n                                <Grid.ColumnDefinitions>\r\n                                    <ColumnDefinition Width=\"100\" />\r\n                                    <ColumnDefinition Width=\"Auto\" />\r\n                                    <ColumnDefinition Width=\"*\" />\r\n                                    <ColumnDefinition Width=\"Auto\" />\r\n                                    <ColumnDefinition Width=\"100\" />\r\n                                </Grid.ColumnDefinitions>\r\n\r\n                                <StackPanel Grid.Column=\"1\" Orientation=\"Horizontal\" VerticalAlignment=\"Center\">\r\n                                    <!--Install-->\r\n                                    <ButtonEx x:Name=\"PART_ButtonInstall\"\r\n                                              Style=\"{DynamicResource ButtonBottomMenu}\"\r\n                                              Content=\"{DynamicResource LOCInstallGame}\" />\r\n                                    <!--Play-->\r\n                                    <ButtonEx x:Name=\"PART_ButtonPlay\"\r\n                                              Style=\"{DynamicResource ButtonBottomMenu}\"\r\n                                              Content=\"{DynamicResource LOCPlayGame}\" />\r\n                                    <!--Details-->\r\n                                    <ButtonEx x:Name=\"PART_ButtonDetails\"\r\n                                              Style=\"{DynamicResource ButtonBottomMenu}\"\r\n                                              Content=\"{DynamicResource LOCGameDetails}\" />\r\n                                    <!--Options-->\r\n                                    <ButtonEx x:Name=\"PART_ButtonGameOptions\"\r\n                                              Style=\"{DynamicResource ButtonBottomMenu}\"\r\n                                              Content=\"{DynamicResource LOCGameOptions}\" />\r\n                                    <!--Search-->\r\n                                    <ButtonEx x:Name=\"PART_ButtonSearch\"\r\n                                              Style=\"{DynamicResource ButtonBottomMenu}\"\r\n                                              Content=\"{DynamicResource LOCSearchLabel}\" />\r\n                                    <!--Filter-->\r\n                                    <ButtonEx x:Name=\"PART_ButtonFilter\"\r\n                                              Style=\"{DynamicResource ButtonBottomMenu}\"\r\n                                              Content=\"{DynamicResource LOCFilter}\" />\r\n                                </StackPanel>\r\n\r\n                                <StackPanel Grid.Column=\"2\" x:Name=\"PART_ElemSearchActive\"\r\n                                            VerticalAlignment=\"Top\" HorizontalAlignment=\"Stretch\"\r\n                                            Margin=\"0,15,0,0\">\r\n                                    <TextBlock  FontSize=\"18\"                                                \r\n                                                TextAlignment=\"Center\"\r\n                                                Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                                Text=\"{DynamicResource LOCGameListSearchResults}\"/>\r\n                                    <TextBlock  Foreground=\"White\"\r\n                                                TextAlignment=\"Center\"\r\n                                                Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                                Text=\"{Binding AppSettings.Fullscreen.FilterSettings.Name}\"/>\r\n                                </StackPanel>\r\n\r\n                                <TextBlock Grid.Column=\"2\" x:Name=\"PART_ElemExtraFilterActive\"\r\n                                       FontSize=\"20\"\r\n                                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Stretch\"\r\n                                       TextAlignment=\"Center\"\r\n                                       Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                       Text=\"{DynamicResource LOCGameListExtraFiltered}\"/>\r\n\r\n                                <StackPanel x:Name=\"PART_ElemProgressIndicator\" Orientation=\"Horizontal\"\r\n                                        Grid.Column=\"3\" VerticalAlignment=\"Center\">\r\n                                    <TextBlock x:Name=\"PART_TextProgressTooltip\" \r\n                                           Margin=\"0,0,15,0\" FontSize=\"20\" VerticalAlignment=\"Center\"\r\n                                           Style=\"{DynamicResource TextBlockBaseStyle}\"/>\r\n                                    <ContentControl Style=\"{DynamicResource ProgressIndicator}\" Focusable=\"False\"\r\n                                                Height=\"38\" Width=\"38\" VerticalAlignment=\"Center\" />\r\n                                </StackPanel>\r\n                            </Grid>\r\n                        </Grid>\r\n\r\n                        <GameDetails x:Name=\"PART_ElemGameDetails\" Grid.RowSpan=\"3\"\r\n                                     HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\"/>\r\n\r\n                        <GameStatus x:Name=\"PART_ElemGameStatus\" Grid.RowSpan=\"3\"\r\n                                     HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\"/>\r\n                    </Grid>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/MainMenu.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:pmrk=\"clr-namespace:Playnite.FullscreenApp.Markup;assembly=Playnite.FullscreenApp\">\r\n    \r\n    <Style x:Key=\"MainMenuBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource OverlayMenuBackgroundBrush}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"MainMenuButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Margin\" Value=\"0,5,0,5\" />\r\n        <Setter Property=\"Padding\" Value=\"20,3,20,3\" />\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\r\n    </Style>\r\n\r\n    <DataTemplate x:Key=\"MainMenuHeaderTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Left\" Margin=\"20,30,40,30\">\r\n            <Image Source=\"{pmrk:ThemeFile 'Images/applogo_clean.png'}\" Height=\"48\"\r\n                   RenderOptions.BitmapScalingMode=\"Fant\" />\r\n            <TextBlock Text=\"Playnite\" FontSize=\"36\" Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                       Margin=\"20,0,0,0\"/>\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuSettingsButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xef3a;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsLabel}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuLibUpdateButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xefd1;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuReloadLibrary}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuCancelLibUpdateButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xecb1;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuCancelLibraryUpdate}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuExitPlayniteButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xef16;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCExitPlaynite}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuSwithDesktopButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xef1d;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCBackToDesktopMode}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuRandomGameButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xefcf;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuSelectRandomGame}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuShutdowButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xefc4;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuShutdownSystem}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuSuspendButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xef9e;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuSuspendSystem}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuHibernateButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xefc4;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuHibernateSystem}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n    \r\n    <DataTemplate x:Key=\"MainMenuRestartButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xef80;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuRestartSystem}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuHelpButtonTemplate\">\r\n\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xefca;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuHelpTitle}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n    \r\n    <DataTemplate x:Key=\"MainMenuPatreonButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"{DynamicResource LOCMenuPatreonSupport}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuKofiButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"{DynamicResource LOCMenuKofiSupport}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuMinimizeButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"{DynamicResource LOCMinimize}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuLockSystemButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xef7a;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuLockSystem}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuLogoutUserButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xefe9;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuLogoutUser}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuClientsButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xec84;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuOpenClient}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuToolsButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xf013;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCMenuTools}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"MainMenuExtensionsButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xefc7;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCExtensions}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/MessageBox.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"MessageBoxBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource OverlayMenuBackgroundBrush}\" />\r\n        <Setter Property=\"CornerRadius\" Value=\"3\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"MessageBoxCaptionText\" BasedOn=\"{StaticResource TextBlockBaseStyle}\" TargetType=\"TextBlock\" >\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontTitilliumWebBold}\" />\r\n        <Setter Property=\"FontSize\" Value=\"26\" />\r\n        <Setter Property=\"Margin\" Value=\"0,0,0,15\" />\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Left\" />\r\n        <Setter Property=\"TextAlignment\" Value=\"Left\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"MessageBoxMessageText\" BasedOn=\"{StaticResource TextBlockBaseStyle}\" TargetType=\"TextBlock\" >\r\n    </Style>\r\n\r\n    <Style x:Key=\"MessageBoxButton\" BasedOn=\"{StaticResource {x:Type Button}}\" TargetType=\"Button\">\r\n        <Setter Property=\"Margin\" Value=\"5\" />\r\n        <Setter Property=\"MinWidth\" Value=\"150\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"2\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource SelectionLightBrush}\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/NotificationsMenu.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"NotificationsMenuBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource OverlayMenuBackgroundBrush}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"NotificationsMenuItemButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Margin\" Value=\"10,5,10,5\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"2\" />\r\n    </Style>\r\n    \r\n    <Style x:Key=\"NotificationsMenuDismissButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Margin\" Value=\"10,5,10,20\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"NotificationsMenuHeaderText\" BasedOn=\"{StaticResource TextBlockBaseStyle}\" TargetType=\"TextBlock\" >\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontTitilliumWebBold}\" />\r\n        <Setter Property=\"FontSize\" Value=\"36\" />\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Right\" />\r\n        <Setter Property=\"Margin\" Value=\"0,0,20,0\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/SettingsMenus.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"SettingsMenuBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource OverlayMenuBackgroundBrush}\" />\r\n    </Style>\r\n    \r\n    <Style x:Key=\"SettingsSectionBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource OverlayMenuBackgroundBrush}\" />\r\n        <Setter Property=\"CornerRadius\" Value=\"3\" />\r\n        <Setter Property=\"Margin\" Value=\"0,0,20,0\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"SettingsMenuButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Margin\" Value=\"0,5,0,5\" />\r\n        <Setter Property=\"Padding\" Value=\"20,3,20,3\" />\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\r\n    </Style>\r\n\r\n    <DataTemplate x:Key=\"SettingsMenuHeaderTemplate\">\r\n        <TextBlock Text=\"{DynamicResource LOCSettingsLabel}\"\r\n                   FontSize=\"36\" Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                   Margin=\"20,30,40,30\" />\r\n    </DataTemplate>\r\n\r\n    <Thickness x:Key=\"SettingsSectionItemSpacing\">0,10,10,10</Thickness>\r\n    \r\n    <Style x:Key=\"SettingsSectionSlider\" TargetType=\"SliderEx\" BasedOn=\"{StaticResource {x:Type SliderEx}}\">\r\n        <Setter Property=\"Width\" Value=\"300\" />\r\n        <Setter Property=\"Margin\" Value=\"{DynamicResource SettingsSectionItemSpacing}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"SettingsSectionCheckbox\" TargetType=\"CheckBoxEx\">\r\n        <Setter Property=\"Margin\" Value=\"{DynamicResource SettingsSectionItemSpacing}\" />\r\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"Transparent\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Right\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"CheckBox\">\r\n                    <Grid Background=\"{TemplateBinding Background}\">\r\n                        <Grid Margin=\"{TemplateBinding Padding}\">\r\n                            <Grid.ColumnDefinitions>\r\n                                <ColumnDefinition Width=\"*\" />\r\n                                <ColumnDefinition Width=\"Auto\" />\r\n                            </Grid.ColumnDefinitions>\r\n                            <TextBlock Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                        FontFamily=\"{DynamicResource FontTitilliumWeb}\"\r\n                                        Foreground=\"{TemplateBinding Foreground}\"\r\n                                        HorizontalAlignment=\"Left\"\r\n                                        VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                        Grid.Column=\"0\" TextTrimming=\"WordEllipsis\">\r\n                                <ContentPresenter RecognizesAccessKey=\"True\" />\r\n                            </TextBlock>\r\n                            <Border Background=\"{DynamicResource CheckBoxCheckMarkBkBrush}\"\r\n                                    VerticalAlignment=\"Center\"\r\n                                    BorderThickness=\"2\" BorderBrush=\"{DynamicResource ControlBackgroundBrush}\"\r\n                                    Grid.Column=\"1\" Width=\"26\" Height=\"26\">\r\n                                <Viewbox x:Name=\"CheckIcon\" Visibility=\"Collapsed\">\r\n                                    <TextBlock Text=\"b\" FontFamily=\"Marlett\" Foreground=\"White\"\r\n                                               HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                </Viewbox>\r\n                            </Border>\r\n                            <Border x:Name=\"BorderFocus\"\r\n                                    Grid.Column=\"1\" Width=\"26\" Height=\"26\"\r\n                                    SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\"\r\n                                    BorderBrush=\"{DynamicResource SelectionBrush}\"\r\n                                    BorderThickness=\"3\" Visibility=\"Hidden\" />\r\n                        </Grid>\r\n                    </Grid>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"CheckIcon\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphLightBrush}\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphLightBrush}\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BorderFocus\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style x:Key=\"SettingsSectionCombobox\" TargetType=\"ComboBoxEx\" BasedOn=\"{StaticResource {x:Type ComboBoxEx}}\">\r\n        <Setter Property=\"MinWidth\" Value=\"200\" />        \r\n        <Setter Property=\"Margin\" Value=\"{DynamicResource SettingsSectionItemSpacing}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"SettingsSectionText\" TargetType=\"TextBlock\" BasedOn=\"{StaticResource TextBlockBaseStyle}\">\r\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\" />\r\n    </Style>\r\n\r\n    <DataTemplate x:Key=\"SettingsMenuGeneralButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xefb0;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsFSSectionGeneral}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"SettingsMenuVisualsButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xeef2;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsFSSectionVisuals}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"SettingsMenuAudioButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xeea8;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsFSSectionAudio}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"SettingsMenuLayoutButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xef5d;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsFSSectionLayout}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"SettingsMenuMenusButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xefa2;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsFSSectionMenus}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n\r\n    <DataTemplate x:Key=\"SettingsMenuInputButtonTemplate\">\r\n        <StackPanel Orientation=\"Horizontal\">\r\n            <TextBlock Text=\"&#xea30;\" FontFamily=\"{DynamicResource FontIcoFont}\" FontSize=\"24\"\r\n                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" Margin=\"0,0,10,0\"/>\r\n            <TextBlock Text=\"{DynamicResource LOCSettingsFSSection}\" VerticalAlignment=\"Center\" />\r\n        </StackPanel>\r\n    </DataTemplate>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/TextInput.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n\r\n    <Style x:Key=\"TextInputButton\" BasedOn=\"{StaticResource {x:Type ButtonEx}}\" TargetType=\"ButtonEx\">\r\n        <Setter Property=\"Padding\" Value=\"25,15,25,15\" />\r\n        <Setter Property=\"Margin\" Value=\"2\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource SelectionLightBrush}\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\r\n        <Setter Property=\"MinWidth\" Value=\"70\" />\r\n        <Setter Property=\"MinHeight\" Value=\"70\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"TextInputCheckbox\" BasedOn=\"{StaticResource {x:Type CheckBoxEx}}\" TargetType=\"CheckBoxEx\">\r\n        <Setter Property=\"Margin\" Value=\"0,8,0,8\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"TextInputTextbox\" BasedOn=\"{StaticResource {x:Type TextBox}}\" TargetType=\"TextBox\">\r\n        <Setter Property=\"Margin\" Value=\"0,0,0,50\" />\r\n        <Setter Property=\"FontSize\" Value=\"26\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"TextInputOptionsBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n        <Setter Property=\"CornerRadius\" Value=\"3\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"TextInputKeysBorder\" TargetType=\"Border\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundDarkBrush}\" />\r\n        <Setter Property=\"CornerRadius\" Value=\"3\" />\r\n    </Style>\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Fullscreen/Default/theme.yaml",
    "content": "﻿Id: Playnite_builtin_DefaultFullscreen\r\nName: Default\r\nAuthor: Playnite\r\nVersion: 1.0\r\nMode: Fullscreen\r\nThemeApiVersion: 2.0.0"
  },
  {
    "path": "source/Playnite.FullscreenApp/Themes/Generic.xaml",
    "content": "<ResourceDictionary\r\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n    xmlns:local=\"clr-namespace:Playnite.FullscreenApp\"\r\n    xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n    xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\">\r\n\r\n    <Style TargetType=\"pctrls:ItemsControlEx\" BasedOn=\"{StaticResource {x:Type ItemsControl}}\">\r\n    </Style>\r\n\r\n    <Style TargetType=\"pctrls:ListBoxEx\" BasedOn=\"{StaticResource {x:Type ListBox}}\">\r\n    </Style>\r\n\r\n    <Style TargetType=\"WindowBase\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource WindowBackgourndBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type WindowBase}\">\r\n                    <Border Background=\"{TemplateBinding Background}\">\r\n                        <AdornerDecorator>\r\n                            <ContentPresenter />\r\n                        </AdornerDecorator>\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/AddonsViewModel.cs",
    "content": "﻿using Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.Services;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class AddonsViewModel : Playnite.ViewModels.AddonsViewModelBase\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n        private IWindowFactory window;\r\n        private ServicesClient serviceClient;\r\n        private PlayniteSettings settings;\r\n        private PlayniteApplication application;\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ConfirmDialog();\r\n            });\r\n        }\r\n\r\n        public new RelayCommand<AddonManifest> UpdateAddonsCommand\r\n        {\r\n            get => new RelayCommand<AddonManifest>((a) =>\r\n            {\r\n                UpdateAddons();\r\n                if (UpdateAddonList.All(add => add.Status == AddonUpdateStatus.Downloaded))\r\n                {\r\n                    if (dialogs.ShowMessage(\r\n                       LOC.SettingsRestartAskMessage,\r\n                       LOC.SettingsRestartTitle,\r\n                       MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n                    {\r\n                        application.Restart(new CmdLineOptions() { SkipLibUpdate = true });\r\n                    }\r\n                    else\r\n                    {\r\n                        window.Close(true);\r\n                    }\r\n                }\r\n            });\r\n        }\r\n\r\n        public AddonsViewModel(\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ServicesClient serviceClient,\r\n            ExtensionFactory extensions,\r\n            PlayniteSettings settings,\r\n            PlayniteApplication application,\r\n            List<AddonUpdate> addonUpdates) : base(dialogs, resources)\r\n        {\r\n            this.window = window;\r\n            this.serviceClient = serviceClient;\r\n            this.settings = settings;\r\n            this.application = application;\r\n            UpdateAddonList = addonUpdates;\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void ConfirmDialog()\r\n        {\r\n            if (IsRestartRequired)\r\n            {\r\n                if (dialogs.ShowMessage(\r\n                       LOC.SettingsRestartAskMessage,\r\n                       LOC.SettingsRestartTitle,\r\n                       MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n                {\r\n                    application.Restart(new CmdLineOptions() { SkipLibUpdate = true });\r\n                }\r\n            }\r\n\r\n            window.Close(true);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/DesignData/DesignMainViewModel.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Controllers;\r\nusing Playnite.Database;\r\nusing Playnite.FullscreenApp.Markup;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class DesignMainViewModel : FullscreenAppViewModel\r\n    {\r\n        public new GamesCollectionViewEntry SelectedGame { get; set; }\r\n        public new bool GameDetailsButtonVisible { get; set; } = true;\r\n\r\n        private static DesignMainViewModel designIntance;\r\n        public static DesignMainViewModel DesignIntance\r\n        {\r\n            get\r\n            {\r\n                if (!DesignerTools.IsInDesignMode)\r\n                {\r\n                    return null;\r\n                }\r\n                else\r\n                {\r\n                    if (designIntance == null)\r\n                    {\r\n                        designIntance = new DesignMainViewModel();\r\n                    }\r\n\r\n                    return designIntance;\r\n                }\r\n            }\r\n        }\r\n\r\n        public static GameDetailsViewModel DesignSelectedGameDetailsIntance\r\n        {\r\n            get\r\n            {\r\n                return DesignIntance?.SelectedGameDetails;\r\n            }\r\n        }\r\n\r\n        public static GamesCollectionViewEntry DesignSelectedGameIntance\r\n        {\r\n            get\r\n            {\r\n                return DesignIntance?.SelectedGame;\r\n            }\r\n        }\r\n\r\n        public static NotificationMessage DesignNotificationIntance\r\n        {\r\n            get\r\n            {\r\n                return new NotificationMessage(\"1\", \"Some testing notification message.\", NotificationType.Info);\r\n            }\r\n        }\r\n\r\n        public DesignMainViewModel() : base(new InMemoryGameDatabase(), null, null, new ResourceProvider(), null)\r\n        {\r\n            GameListVisible = true;\r\n            GameDetailsVisible  = false;\r\n            FilterPanelVisible = true;\r\n            ProgressStatus = \"Status example in progress...\";\r\n            ProgressValue = 50;\r\n            ProgressTotal = 100;\r\n            ProgressActive = true;\r\n\r\n            Game.DatabaseReference = Database;\r\n            GameDatabase.GenerateSampleData(Database);\r\n            var designGame = Database.Games.First();\r\n            designGame.CoverImage = \"pack://application:,,,/Playnite;component/Resources/Images/DesignCover.jpg\";\r\n            designGame.BackgroundImage = \"pack://application:,,,/Playnite;component/Resources/Images/DesignBackground.jpg\";\r\n            designGame.Icon = \"pack://application:,,,/Playnite;component/Resources/Images/DesignIcon.png\";\r\n\r\n            AppSettings = new PlayniteSettings();\r\n            AppSettings.Fullscreen.ShowBattery = true;\r\n            AppSettings.Fullscreen.ShowBatteryPercentage = true;\r\n            AppSettings.Fullscreen.ShowClock = true;\r\n\r\n            Extensions = new ExtensionFactory(Database, new GameControllerFactory(), null);\r\n            GamesView = new FullscreenCollectionView(Database, AppSettings, Extensions);\r\n            SelectedGame = GamesView.Items[0];\r\n            SelectedGameDetails = new GameDetailsViewModel(GamesView.Items[0]);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/ExtensionsMenuViewModels.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.FullscreenApp.Windows;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class ExtensionsMenuViewModels : ObservableObject\r\n    {\r\n        public class MainMenuItemWrapper\r\n        {\r\n            private readonly ICommand switchListCommand;\r\n\r\n            public string Header { get; set; }\r\n            public object Icon { get; set; }\r\n            public List<MainMenuItemWrapper> Children { get; set; }\r\n            public ICommand Command { get; set; }\r\n            public object CommandParameter { get; set; }\r\n\r\n            public MainMenuItemWrapper(List<MenuItem> items, ICommand switchListCommand)\r\n            {\r\n                this.switchListCommand = switchListCommand;\r\n                if (items.Count == 0)\r\n                    return;\r\n\r\n                Children = new List<MainMenuItemWrapper>();\r\n                foreach (var item in items)\r\n                {\r\n                    if (item is MenuItem mI)\r\n                        Children.Add(new MainMenuItemWrapper(mI, switchListCommand));\r\n                }\r\n            }\r\n\r\n            public MainMenuItemWrapper(MenuItem menuItem, ICommand switchListCommand)\r\n            {\r\n                this.switchListCommand = switchListCommand;\r\n                Command = menuItem.Command;\r\n                Header = menuItem.Header?.ToString() ?? \"missing name\";\r\n                Icon = menuItem.Icon;\r\n                if (menuItem.Items.Count > 0)\r\n                {\r\n                    Command = switchListCommand;\r\n                    CommandParameter = this;\r\n                    PopulateChildren(this, menuItem);\r\n                }\r\n            }\r\n\r\n            private void PopulateChildren(MainMenuItemWrapper wrapper, MenuItem items)\r\n            {\r\n                wrapper.Children = new List<MainMenuItemWrapper>();\r\n                foreach (var item in items.Items)\r\n                {\r\n                    if (item is MenuItem mI)\r\n                        wrapper.Children.Add(new MainMenuItemWrapper(mI, switchListCommand));\r\n                }\r\n            }\r\n        }\r\n\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private readonly MainMenuItemWrapper rootItem;\r\n        private readonly Stack<MainMenuItemWrapper> itemsStack = new Stack<MainMenuItemWrapper>();\r\n        public FullscreenAppViewModel MainModel { get; }\r\n\r\n        private List<MainMenuItemWrapper> items = new List<MainMenuItemWrapper>();\r\n        public List<MainMenuItemWrapper> Items { get => items; set => SetValue(ref items, value); }\r\n\r\n        public RelayCommand CloseCommand { get; }\r\n        public RelayCommand<MainMenuItemWrapper> SwitchListCommand { get; }\r\n\r\n\r\n        public ExtensionsMenuViewModels(\r\n            IWindowFactory window,\r\n            FullscreenAppViewModel mainModel,\r\n            Game game)\r\n        {\r\n            this.window = window;\r\n            this.MainModel = mainModel;\r\n            CloseCommand = new RelayCommand(Close);\r\n            SwitchListCommand = new RelayCommand<MainMenuItemWrapper>(SwitchList);\r\n\r\n            var args = new GetGameMenuItemsArgs() { Games = new List<Game>() { game } };\r\n            var toAdd = new List<GameMenuItem>();\r\n            var rootMenu = new MenuItem();\r\n\r\n            foreach (var plugin in mainModel.Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    var items = plugin.Plugin.GetGameMenuItems(args);\r\n                    if (items.HasItems())\r\n                    {\r\n                        toAdd.AddRange(items);\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get menu items from plugin {plugin.Description.Name}\");\r\n                }\r\n            }\r\n\r\n            foreach (var script in mainModel.Extensions.Scripts)\r\n            {\r\n                if (script.SupportedMenus.Contains(Scripting.SupportedMenuMethods.GameMenu))\r\n                {\r\n                    try\r\n                    {\r\n                        var items = script.GetGameMenuItems(args);\r\n                        if (items.HasItems())\r\n                        {\r\n                            foreach (var item in items)\r\n                            {\r\n                                var newItem = GameMenuItem.FromScriptGameMenuItem(item);\r\n                                newItem.Action = (a) =>\r\n                                {\r\n                                    script.InvokeFunction(item.FunctionName, new List<object>\r\n                                    {\r\n                                        new ScriptGameMenuItemActionArgs\r\n                                        {\r\n                                            Games = a.Games,\r\n                                            SourceItem = item\r\n                                        }\r\n                                    });\r\n                                };\r\n\r\n                                toAdd.Add(newItem);\r\n                            }\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to get menu items from script {script.Name}\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (toAdd.Count == 0)\r\n                toAdd.Add(new GameMenuItem()\r\n                {\r\n                    Description = LOC.NoItemsFound.GetLocalized(),\r\n                    Action = (_) => { }\r\n                });\r\n\r\n            var menuItems = new Dictionary<string, MenuItem>();\r\n            foreach (var item in toAdd)\r\n            {\r\n                object newItem = null;\r\n                if (item.Description == \"-\")\r\n                {\r\n                    newItem = new Separator();\r\n                }\r\n                else\r\n                {\r\n                    newItem = new MenuItem()                        {\r\n                        Header = item.Description,\r\n                        Icon = MenuHelpers.GetIcon(item.Icon)\r\n                    };\r\n\r\n                    if (item.Action != null)\r\n                    {\r\n                        ((MenuItem)newItem).Command = new RelayCommand(() =>\r\n                        {\r\n                            try\r\n                            {\r\n                                window.Close(true);\r\n                                item.Action(new GameMenuItemActionArgs\r\n                                {\r\n                                    Games = args.Games,\r\n                                    SourceItem = item\r\n                                });\r\n                            }\r\n                            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                            {\r\n                                logger.Error(e, \"Game menu extension action failed.\");\r\n                                Dialogs.ShowErrorMessage(\r\n                                    ResourceProvider.GetString(LOC.MenuActionExecError) +\r\n                                    Environment.NewLine + Environment.NewLine +\r\n                                    e.Message, \"\");\r\n                            }\r\n                        });\r\n                    }\r\n                }\r\n\r\n                if (item.MenuSection.IsNullOrEmpty())\r\n                {\r\n                    rootMenu.Items.Add(newItem);\r\n                }\r\n                else\r\n                {\r\n                    var parent = MenuHelpers.GenerateMenuParents(menuItems, item.MenuSection, rootMenu.Items);\r\n                    parent?.Items.Add(newItem);\r\n                }\r\n            }\r\n\r\n            // The above monstrosity and insanity is copied from Desktop mode's menu\r\n            // We'll just wrap that shit in here to something digastable by Fullscreen view\r\n\r\n            var temp = new List<MenuItem>();\r\n            foreach (var item in rootMenu.Items)\r\n            {\r\n                if (item is MenuItem menuItem)\r\n                    temp.Add(menuItem);\r\n            }\r\n\r\n            rootItem = new MainMenuItemWrapper(temp, SwitchListCommand);\r\n            itemsStack.Push(rootItem);\r\n            Items = rootItem.Children;\r\n        }\r\n\r\n\r\n        public ExtensionsMenuViewModels(\r\n            IWindowFactory window,\r\n            FullscreenAppViewModel mainModel)\r\n        {\r\n            this.window = window;\r\n            this.MainModel = mainModel;\r\n            CloseCommand = new RelayCommand(Close);\r\n            SwitchListCommand = new RelayCommand<MainMenuItemWrapper>(SwitchList);\r\n\r\n            var args = new GetMainMenuItemsArgs();\r\n            var toAdd = new List<MainMenuItem>();\r\n            foreach (var plugin in mainModel.Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    var items = plugin.Plugin.GetMainMenuItems(args);\r\n                    if (items.HasItems())\r\n                    {\r\n                        toAdd.AddRange(items);\r\n                    }\r\n                }\r\n                catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                {\r\n                    logger.Error(e, $\"Failed to get menu items from plugin {plugin.Description.Name}\");\r\n                }\r\n            }\r\n\r\n            foreach (var script in mainModel.Extensions.Scripts)\r\n            {\r\n                if (script.SupportedMenus.Contains(Scripting.SupportedMenuMethods.MainMenu))\r\n                {\r\n                    try\r\n                    {\r\n                        var items = script.GetMainMenuItems(args);\r\n                        if (items.HasItems())\r\n                        {\r\n                            foreach (var item in items)\r\n                            {\r\n                                var newItem = MainMenuItem.FromScriptMainMenuItem(item);\r\n                                newItem.Action = (a) =>\r\n                                {\r\n                                    script.InvokeFunction(item.FunctionName, new List<object>\r\n                                    {\r\n                                        new ScriptMainMenuItemActionArgs()\r\n                                    });\r\n                                };\r\n\r\n                                toAdd.Add(newItem);\r\n                            }\r\n                        }\r\n                    }\r\n                    catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                    {\r\n                        logger.Error(e, $\"Failed to get menu items from script {script.Name}\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (toAdd.Count == 0)\r\n                toAdd.Add(new MainMenuItem()\r\n                {\r\n                    Description = LOC.NoItemsFound.GetLocalized(),\r\n                    Action = (_) => { }\r\n                });\r\n\r\n            var rootMenu = new MenuItem();\r\n            var extensionsMenu = new MenuItem();\r\n            var menuItems = new Dictionary<string, MenuItem>();\r\n            var menuExtensionItems = new Dictionary<string, MenuItem>();\r\n            foreach (var item in toAdd)\r\n            {\r\n                object newItem = null;\r\n                if (item.Description == \"-\")\r\n                {\r\n                    newItem = new Separator();\r\n                }\r\n                else\r\n                {\r\n                    newItem = new MenuItem()\r\n                    {\r\n                        Header = item.Description,\r\n                        Icon = MenuHelpers.GetIcon(item.Icon)\r\n                    };\r\n\r\n                    if (item.Action != null)\r\n                    {\r\n                        ((MenuItem)newItem).Command = new RelayCommand(() =>\r\n                        {\r\n                            try\r\n                            {\r\n                                window.Close(true);\r\n                                item.Action(new MainMenuItemActionArgs());\r\n                            }\r\n                            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n                            {\r\n                                logger.Error(e, \"Main menu extension action failed.\");\r\n                                Dialogs.ShowErrorMessage(\r\n                                    ResourceProvider.GetString(\"LOCMenuActionExecError\") +\r\n                                    Environment.NewLine + Environment.NewLine +\r\n                                    e.Message, \"\");\r\n                            }\r\n                        });\r\n                    }\r\n                }\r\n\r\n                if (item.MenuSection.IsNullOrEmpty())\r\n                {\r\n                    rootMenu.Items.Insert(0, newItem);\r\n                }\r\n                else\r\n                {\r\n                    if (item.MenuSection == \"@\")\r\n                    {\r\n                        extensionsMenu.Items.Add(newItem);\r\n                    }\r\n                    else if (item.MenuSection.StartsWith(\"@\"))\r\n                    {\r\n                        var parent = MenuHelpers.GenerateMenuParents(menuExtensionItems, item.MenuSection.Substring(1), extensionsMenu.Items);\r\n                        parent?.Items.Add(newItem);\r\n                    }\r\n                    else\r\n                    {\r\n                        var parent = MenuHelpers.GenerateMenuParents(menuItems, item.MenuSection, rootMenu.Items, 0);\r\n                        parent?.Items.Add(newItem);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // The above monstrosity and insanity is copied from Desktop mode's menu\r\n            // We'll just wrap that shit in here to something digastable by Fullscreen view\r\n\r\n            var temp = new List<MenuItem>();\r\n            foreach (var item in rootMenu.Items)\r\n            {\r\n                if (item is MenuItem menuItem)\r\n                    temp.Add(menuItem);\r\n            }\r\n\r\n            foreach (var item in extensionsMenu.Items)\r\n            {\r\n                if (item is MenuItem menuItem)\r\n                    temp.Add(menuItem);\r\n            }\r\n\r\n            rootItem = new MainMenuItemWrapper(temp, SwitchListCommand);\r\n            itemsStack.Push(rootItem);\r\n            Items = rootItem.Children;\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n            if (itemsStack.Count > 0)\r\n                itemsStack.Pop();\r\n\r\n            if (itemsStack.Count == 0)\r\n            {\r\n                window.Close(true);\r\n                return;\r\n            }\r\n\r\n            Items = itemsStack.Peek().Children;\r\n        }\r\n\r\n        public void SwitchList(MainMenuItemWrapper item)\r\n        {\r\n            Items = item.Children;\r\n            itemsStack.Push(item);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/FullscreenAppViewModel.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Audio;\r\nusing Playnite.Commands;\r\nusing Playnite.Common;\r\nusing Playnite.Controls;\r\nusing Playnite.Database;\r\nusing Playnite.FullscreenApp.Controls;\r\nusing Playnite.FullscreenApp.Controls.Views;\r\nusing Playnite.FullscreenApp.Windows;\r\nusing Playnite.Input;\r\nusing Playnite.Metadata;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Events;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public partial class FullscreenAppViewModel : MainViewModelBase, IDisposable, IMainViewModelBase\r\n    {\r\n        private static object gamesLock = new object();\r\n        private readonly SynchronizationContext context;\r\n        private bool isInitialized = false;\r\n        protected bool ignoreCloseActions = false;\r\n        private readonly FullscreenApplication app;\r\n        private AudioEngine audio => FullscreenApplication.Audio;\r\n\r\n        public GamesEditor GamesEditor { get; }\r\n        public bool IsFullScreen { get; private set; } = true;\r\n        public ObservableTime CurrentTime { get; } = new ObservableTime();\r\n        public ObservablePowerStatus PowerStatus { get; } = new ObservablePowerStatus();\r\n\r\n        private GameStatusViewModel gameStatusView;\r\n        public GameStatusViewModel GameStatusView\r\n        {\r\n            get => gameStatusView;\r\n            set\r\n            {\r\n                gameStatusView = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double windowLeft = 0;\r\n        public double WindowLeft\r\n        {\r\n            get => windowLeft;\r\n            set\r\n            {\r\n                windowLeft = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double windowTop = 0;\r\n        public double WindowTop\r\n        {\r\n            get => windowTop;\r\n            set\r\n            {\r\n                windowTop = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double windowWidth = 1920;\r\n        public double WindowWidth\r\n        {\r\n            get => windowWidth;\r\n            set\r\n            {\r\n                windowWidth = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double windowHeight = 1080;\r\n        public double WindowHeight\r\n        {\r\n            get => windowHeight;\r\n            set\r\n            {\r\n                windowHeight = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double viewportWidth = 1920;\r\n        public double ViewportWidth\r\n        {\r\n            get => viewportWidth;\r\n            set\r\n            {\r\n                viewportWidth = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double viewportHeight = 1080;\r\n        public double ViewportHeight\r\n        {\r\n            get => viewportHeight;\r\n            set\r\n            {\r\n                viewportHeight = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private GameDetailsViewModel selectedGameDetails;\r\n        public GameDetailsViewModel SelectedGameDetails\r\n        {\r\n            get => selectedGameDetails;\r\n            set\r\n            {\r\n                selectedGameDetails = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        internal int LastValidSelectedGameIndex;\r\n\r\n        public List<GamesCollectionViewEntry> SelectedGames\r\n        {\r\n            get => SelectedGame != null ? null : new List<GamesCollectionViewEntry>(1) { SelectedGame };\r\n            set\r\n            {\r\n                if (SelectedGames.HasItems())\r\n                {\r\n                    SelectedGame = value[0];\r\n                }\r\n                else\r\n                {\r\n                    SelectedGame = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        private GamesCollectionViewEntry selectedGame;\r\n        public GamesCollectionViewEntry SelectedGame\r\n        {\r\n            get => selectedGame;\r\n            set\r\n            {\r\n                var oldValue = selectedGame;\r\n                // TODO completely rework and decouple selected game from main view and game details\r\n                if (value == selectedGame)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                SelectedGameDetails?.Dispose();\r\n                if (value == null)\r\n                {\r\n                    SelectedGameDetails = null;\r\n                }\r\n                else\r\n                {\r\n                    LastValidSelectedGameIndex = GamesView.CollectionView.IndexOf(value);\r\n                    SelectedGameDetails = new GameDetailsViewModel(value, Resources, GamesEditor, this, Dialogs);\r\n                }\r\n\r\n                selectedGame = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(GameDetailsButtonVisible));\r\n\r\n                if (!IsDisposing)\r\n                {\r\n                    Extensions.InvokeOnGameSelected(\r\n                        oldValue == null ? null : new List<Game> { oldValue.Game },\r\n                        selectedGame == null ? null : new List<Game> { selectedGame.Game });\r\n                }\r\n            }\r\n        }\r\n\r\n        private bool gameListFocused = false;\r\n        public bool GameListFocused\r\n        {\r\n            get => gameListFocused;\r\n            set\r\n            {\r\n                gameListFocused = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool gameListVisible = true;\r\n        public bool GameListVisible\r\n        {\r\n            get => gameListVisible;\r\n            set\r\n            {\r\n                gameListVisible = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool gameDetailsFocused = false;\r\n        public bool GameDetailsFocused\r\n        {\r\n            get => gameDetailsFocused;\r\n            set\r\n            {\r\n                gameDetailsFocused = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool gameDetailsVisible = false;\r\n        public bool GameDetailsVisible\r\n        {\r\n            get => gameDetailsVisible;\r\n            set\r\n            {\r\n                gameDetailsVisible = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(GameDetailsButtonVisible));\r\n            }\r\n        }\r\n\r\n        private bool gameStatusVisible = false;\r\n        public bool GameStatusVisible\r\n        {\r\n            get => gameStatusVisible;\r\n            set\r\n            {\r\n                gameStatusVisible = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public bool GameDetailsButtonVisible => GameDetailsVisible == false && SelectedGame != null;\r\n\r\n        private DatabaseExplorer databaseExplorer;\r\n        public DatabaseExplorer DatabaseExplorer\r\n        {\r\n            get => databaseExplorer;\r\n            private set\r\n            {\r\n                databaseExplorer = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private System.Windows.Controls.Control subFilterControl;\r\n        public System.Windows.Controls.Control SubFilterControl\r\n        {\r\n            get => subFilterControl;\r\n            set\r\n            {\r\n                subFilterControl = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(SubFilterVisible));\r\n            }\r\n        }\r\n\r\n        public bool SubFilterVisible\r\n        {\r\n            get => SubFilterControl != null;\r\n        }\r\n\r\n        private bool filterPanelVisible = false;\r\n        public bool FilterPanelVisible\r\n        {\r\n            get => filterPanelVisible;\r\n            set\r\n            {\r\n                filterPanelVisible = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool filterAdditionalPanelVisible = false;\r\n        public bool FilterAdditionalPanelVisible\r\n        {\r\n            get => filterAdditionalPanelVisible;\r\n            set\r\n            {\r\n                filterAdditionalPanelVisible = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool GenerateAudio { get; set; } = true;\r\n\r\n        private bool childOpened = false;\r\n        public bool ChildOpened\r\n        {\r\n            get => childOpened;\r\n            set\r\n            {\r\n                childOpened = value;\r\n                GenerateAudio = !value;\r\n                if (value == false)\r\n                {\r\n                    // Super ugly hack to remove posibility of window dimming not showing up for a moment,\r\n                    // when child window opens another child window and also closes itself.\r\n                    Task.Factory.StartNew(() =>\r\n                    {\r\n                        Thread.Sleep(10);\r\n                        context.Send((_) => OnPropertyChanged(), null);\r\n                    });\r\n                }\r\n                else\r\n                {\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n        }\r\n\r\n        public bool IsSearchActive\r\n        {\r\n            get => !AppSettings.Fullscreen.FilterSettings.Name.IsNullOrEmpty();\r\n        }\r\n\r\n        public bool IsExtraFilterActive\r\n        {\r\n            get\r\n            {\r\n                if (ActiveFilterPreset != null)\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                if (!AppSettings.Fullscreen.FilterSettings.Name.IsNullOrEmpty())\r\n                {\r\n                    return false;\r\n                }\r\n\r\n                if (AppSettings.Fullscreen.FilterSettings.IsActive && ActiveFilterPreset == null)\r\n                {\r\n                    return true;\r\n                }\r\n                else if (ActiveFilterPreset != null)\r\n                {\r\n                    var preset = ActiveFilterPreset.Settings.GetClone();\r\n                    preset.Name = null;\r\n                    var current = AppSettings.Fullscreen.FilterSettings.GetClone();\r\n                    current.Name = null;\r\n                    return !preset.IsEqualJson(current);\r\n                }\r\n\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// This constructor should be used on from <see cref=\"DesignMainViewModel\"/> for Blend usage!\r\n        /// </summary>\r\n        public FullscreenAppViewModel(\r\n            IGameDatabaseMain database,\r\n            PlayniteApplication app,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            ExtensionFactory extensions) : base(database, app, dialogs, resources, extensions, null)\r\n        {\r\n            InitializeCommands();\r\n        }\r\n\r\n        public FullscreenAppViewModel(\r\n            GameDatabase database,\r\n            IWindowFactory window,\r\n            IDialogsFactory dialogs,\r\n            IResourceProvider resources,\r\n            PlayniteSettings settings,\r\n            GamesEditor gamesEditor,\r\n            ExtensionFactory extensions,\r\n            FullscreenApplication app) : base(database, app, dialogs, resources, extensions, window)\r\n        {\r\n            this.app = app;\r\n            context = SynchronizationContext.Current;\r\n            GamesEditor = gamesEditor;\r\n            AppSettings = settings;\r\n            IsFullScreen = !PlayniteEnvironment.IsDebuggerAttached;\r\n            settings.Fullscreen.PropertyChanged += Fullscreen_PropertyChanged;\r\n            settings.Fullscreen.FilterSettings.FilterChanged += FilterSettings_FilterChanged;\r\n            ThemeManager.ApplyFullscreenButtonPrompts(PlayniteApplication.CurrentNative, AppSettings.Fullscreen.ButtonPrompts);\r\n            InitializeCommands();\r\n            UpdateCursorSettings();\r\n            EventManager.RegisterClassHandler(typeof(WindowBase), WindowBase.ClosedRoutedEvent, new RoutedEventHandler(WindowBaseCloseHandler));\r\n            EventManager.RegisterClassHandler(typeof(WindowBase), WindowBase.LoadedRoutedEvent, new RoutedEventHandler(WindowBaseLoadedHandler));\r\n            EventManager.RegisterClassHandler(typeof(CheckBox), CheckBox.CheckedEvent, new RoutedEventHandler(ElemestateChangedHander));\r\n            EventManager.RegisterClassHandler(typeof(CheckBox), CheckBox.UncheckedEvent, new RoutedEventHandler(ElemestateChangedHander));\r\n            EventManager.RegisterClassHandler(typeof(Slider), Slider.ValueChangedEvent, new RoutedEventHandler(ElemestateChangedHander));\r\n            EventManager.RegisterClassHandler(typeof(UIElement), UIElement.GotFocusEvent, new RoutedEventHandler(ElementGotFocusHandler));\r\n            app.Controllers.Started += Controllers_Started;\r\n            app.Controllers.Starting += Controllers_Starting;\r\n            app.Controllers.Stopped += Controllers_Stopped;\r\n            app.Controllers.StartupCancelled += Controllers_StartupCancelled;\r\n            Microsoft.Win32.SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged;\r\n        }\r\n\r\n        private void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e)\r\n        {\r\n            Logger.Info(\"Detected screen settings changes, adjusting window.\");\r\n            SetViewSizeAndPosition(IsFullScreen);\r\n            AdjustGameItemsToScreenChanges();\r\n        }\r\n\r\n        private void GameControllerInputButtonChanged(object sender, OnControllerButtonStateChangedArgs e)\r\n        {\r\n            if (AppSettings.Fullscreen.EnableGameControllerSupport &&\r\n                AppSettings.Fullscreen.GuideButtonFocus &&\r\n                e.Button == ControllerInput.Guide &&\r\n                e.State == ControllerInputState.Released)\r\n            {\r\n                RestoreWindow();\r\n            }\r\n\r\n            foreach (var plugin in Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnControllerButtonStateChanged(e);\r\n                }\r\n                catch (Exception exc)\r\n                {\r\n                    Logger.Error(exc, $\"Plugin {plugin.Description.Id} failed to process controller input.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private void GameControllerOnControllerDisconnected(object sender, OnControllerDisconnectedArgs e)\r\n        {\r\n            foreach (var plugin in Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnControllerDisconnected(e);\r\n                }\r\n                catch (Exception exc)\r\n                {\r\n                    Logger.Error(exc, $\"Plugin {plugin.Description.Id} failed to process controller connected event.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private void GameControllerOnControllerConnected(object sender, OnControllerConnectedArgs e)\r\n        {\r\n            foreach (var plugin in Extensions.Plugins.Values)\r\n            {\r\n                try\r\n                {\r\n                    plugin.Plugin.OnControllerConnected(e);\r\n                }\r\n                catch (Exception exc)\r\n                {\r\n                    Logger.Error(exc, $\"Plugin {plugin.Description.Id} failed to process controller disconnected event.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        private void Controllers_StartupCancelled(object sender, OnGameStartupCancelledEventArgs e)\r\n        {\r\n            Controllers_Stopped(sender, new GameStoppedEventArgs());\r\n        }\r\n\r\n        private void Controllers_Stopped(object sender, GameStoppedEventArgs e)\r\n        {\r\n            if (GameStatusVisible)\r\n            {\r\n                GameStatusVisible = false;\r\n                if (GameDetailsVisible)\r\n                {\r\n                    GameDetailsFocused = true;\r\n                }\r\n                else\r\n                {\r\n                    GameListFocused = true;\r\n                }\r\n            }\r\n\r\n            GameStatusView = null;\r\n        }\r\n\r\n        private void Controllers_Starting(object sender, OnGameStartingEventArgs e)\r\n        {\r\n            if (GameDetailsVisible)\r\n            {\r\n                GameDetailsFocused = false;\r\n            }\r\n            else\r\n            {\r\n                GameListFocused = false;\r\n            }\r\n\r\n            if (SelectedGame?.Game.Id == e.Game.Id)\r\n            {\r\n                GameStatusView = new GameStatusViewModel(SelectedGame);\r\n            }\r\n            else\r\n            {\r\n                GameStatusView = new GameStatusViewModel(new GamesCollectionViewEntry(\r\n                    e.Game,\r\n                    GamesView.GetLibraryPlugin(e.Game),\r\n                    AppSettings));\r\n            }\r\n\r\n            GameStatusVisible = true;\r\n            GameStatusView.GameStatusText = ResourceProvider.GetString(LOC.GameIsStarting).Format(e.Game.Name);\r\n        }\r\n\r\n        private void Controllers_Started(object sender, GameStartedEventArgs e)\r\n        {\r\n            if (GameStatusView != null)\r\n            {\r\n                GameStatusView.GameStatusText = ResourceProvider.GetString(LOC.GameIsRunning).Format(e.Source.Game.Name);\r\n            }\r\n        }\r\n\r\n        private void ElementGotFocusHandler(object sender, RoutedEventArgs e)\r\n        {\r\n            // This prevents \"double-click\" sounds when using mouse to open child menus.\r\n            // There's probably a better way how to detect if focus was caused by mouse input, but I haven't found it.\r\n            var mouseInput = InputManager.Current?.PrimaryMouseDevice;\r\n            if (mouseInput != null && mouseInput.LeftButton == MouseButtonState.Pressed)\r\n            {\r\n                if (e.OriginalSource is ListBoxItem listItem && listItem.DataContext is GamesCollectionViewEntry)\r\n                {\r\n                    // Click selecting a game on the main view is an exception\r\n                }\r\n                else\r\n                {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (sender is UIElement elem && elem.IsVisible)\r\n            {\r\n                switch (sender)\r\n                {\r\n                    case Button _:\r\n                    case ListBoxItem _:\r\n                    case CheckBox _:\r\n                    case Slider _:\r\n                    case ComboBox _:\r\n                    case TextBox _:\r\n                    case HtmlTextView _:\r\n                        FullscreenApplication.PlayNavigateSound();\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void ElemestateChangedHander(object sender, RoutedEventArgs e)\r\n        {\r\n            if (sender is UIElement check && check.IsFocused)\r\n            {\r\n                FullscreenApplication.PlayActivateSound();\r\n            }\r\n        }\r\n        private void WindowBaseCloseHandler(object sender, RoutedEventArgs e)\r\n        {\r\n            ChildOpened = Window.Window.HasChildWindow;\r\n        }\r\n\r\n        private void WindowBaseLoadedHandler(object sender, RoutedEventArgs e)\r\n        {\r\n            ChildOpened = Window.Window.HasChildWindow;\r\n        }\r\n\r\n        private void Fullscreen_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(FullscreenSettings.Monitor) || e.PropertyName == nameof(FullscreenSettings.UsePrimaryDisplay))\r\n            {\r\n                SetViewSizeAndPosition(IsFullScreen);\r\n            }\r\n            else if (e.PropertyName == nameof(FullscreenSettings.ButtonPrompts))\r\n            {\r\n                ThemeManager.ApplyFullscreenButtonPrompts(PlayniteApplication.CurrentNative, AppSettings.Fullscreen.ButtonPrompts);\r\n            }\r\n            else if (e.PropertyName == nameof(FullscreenSettings.HideMouserCursor))\r\n            {\r\n                UpdateCursorSettings();\r\n            }\r\n            else if (e.PropertyName == nameof(FullscreenSettings.EnableGameControllerSupport))\r\n            {\r\n                if (app.GameController != null)\r\n                {\r\n                    app.GameController.StandardProcessingEnabled = AppSettings.Fullscreen.EnableGameControllerSupport;\r\n                }\r\n            }\r\n            else if (e.PropertyName == nameof(FullscreenSettings.InterfaceVolume))\r\n            {\r\n                audio.SetSoundVolume(FullscreenApplication.ActivateSound, AppSettings.Fullscreen.InterfaceVolume);\r\n                audio.SetSoundVolume(FullscreenApplication.NavigateSound, AppSettings.Fullscreen.InterfaceVolume);\r\n            }\r\n            else if (e.PropertyName == nameof(FullscreenSettings.BackgroundVolume))\r\n            {\r\n                if (AppSettings.Fullscreen.BackgroundVolume <= 0)\r\n                {\r\n                    audio.StopMusic();\r\n                }\r\n                else\r\n                {\r\n                    audio.SetMusicVolume(AppSettings.Fullscreen.BackgroundVolume);\r\n                    if (!audio.GetIsMusicPlaying())\r\n                    {\r\n                        audio.PlayMusic(FullscreenApplication.BackgroundMusic);\r\n                    }\r\n\r\n                    if (audio.GetIsMusicPaused())\r\n                    {\r\n                        audio.ResumeMusic();\r\n                    }\r\n                }\r\n            }\r\n            else if (e.PropertyName == nameof(FullscreenSettings.IsMusicMuted))\r\n            {\r\n                if (AppSettings.Fullscreen.BackgroundVolume <= 0)\r\n                    return;\r\n\r\n                if (AppSettings.Fullscreen.IsMusicMuted)\r\n                {\r\n                    audio.PauseMusic();\r\n                }\r\n                else\r\n                {\r\n                    if (audio.AudioClosed)\r\n                    {\r\n                        audio.PlayMusic(FullscreenApplication.BackgroundMusic);\r\n                        audio.SetMusicVolume(AppSettings.Fullscreen.BackgroundVolume);\r\n                    }\r\n                    else if (audio.GetIsMusicPaused())\r\n                    {\r\n                        audio.ResumeMusic();\r\n                    }\r\n                    else\r\n                    {\r\n                        audio.PlayMusic(FullscreenApplication.BackgroundMusic);\r\n                        audio.SetMusicVolume(AppSettings.Fullscreen.BackgroundVolume);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (e.PropertyName == nameof(FullscreenSettings.HorizontalLayout) ||\r\n                e.PropertyName == nameof(FullscreenSettings.Columns) ||\r\n                e.PropertyName == nameof(FullscreenSettings.Rows) ||\r\n                e.PropertyName == nameof(FullscreenSettings.ImageScalerMode) ||\r\n                e.PropertyName == nameof(FullscreenSettings.UsePrimaryDisplay) ||\r\n                e.PropertyName == nameof(FullscreenSettings.Monitor))\r\n            {\r\n                AdjustGameItemsToScreenChanges();\r\n            }\r\n\r\n            if (e.PropertyName == nameof(FullscreenSettings.SwapConfirmCancelButtons))\r\n            {\r\n                app.UpdateConfirmCancelBindings();\r\n            }\r\n        }\r\n\r\n        private void FilterSettings_FilterChanged(object sender, FilterChangedEventArgs e)\r\n        {\r\n            if (!IgnoreFilterChanges)\r\n            {\r\n                ActiveFilterPreset = null;\r\n            }\r\n\r\n            OnPropertyChanged(nameof(IsSearchActive));\r\n            OnPropertyChanged(nameof(IsExtraFilterActive));\r\n        }\r\n\r\n        private void AdjustGameItemsToScreenChanges()\r\n        {\r\n            var oldSettings = GamesCollectionViewEntry.FullscreenListCoverProperties;\r\n            GamesCollectionViewEntry.InitItemViewProperties(App, AppSettings);\r\n            if (oldSettings != GamesCollectionViewEntry.FullscreenListCoverProperties)\r\n            {\r\n                GamesView.NotifyItemPropertyChanges(\r\n                    nameof(GamesCollectionViewEntry.FullscreenListItemCoverObject),\r\n                    nameof(GamesCollectionViewEntry.DefaultFullscreenListItemCoverObject));\r\n            }\r\n        }\r\n\r\n        private void UpdateCursorSettings()\r\n        {\r\n            Computer.SetMouseCursorVisibility(!AppSettings.Fullscreen.HideMouserCursor);\r\n            WindowManager.SetEnableMouseInput(!AppSettings.Fullscreen.HideMouserCursor);\r\n        }\r\n\r\n        public void OpenMainMenu()\r\n        {\r\n            var vm = new MainMenuViewModel(new MainMenuWindowFactory(), this);\r\n            vm.OpenView();\r\n            GameListFocused = false;\r\n            GameListFocused = true;\r\n        }\r\n\r\n        public void OpenNotificationsMenu()\r\n        {\r\n            var vm = new NotificationsViewModel(new NotificationsWindowFactory(), this);\r\n            vm.OpenView();\r\n            GameListFocused = false;\r\n            GameListFocused = true;\r\n        }\r\n\r\n        public void OpenGameMenu()\r\n        {\r\n            var vm = new GameMenuViewModel(new GameMenuWindowFactory(), this, SelectedGame.Game, GamesEditor);\r\n            vm.OpenView();\r\n        }\r\n\r\n        public void SwitchToDesktopMode()\r\n        {\r\n            Logger.Info(\"Switching to Desktop mode.\");\r\n            if (GlobalTaskHandler.IsActive)\r\n            {\r\n                if (Dialogs.ShowMessage(\r\n                    Resources.GetString(LOC.BackgroundProgressCancelAskSwitchMode),\r\n                    Resources.GetString(LOC.BackToDesktopMode),\r\n                    MessageBoxButton.YesNo) != MessageBoxResult.Yes)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                var dialogRes = Dialogs.ActivateGlobalProgress((_) =>\r\n                    {\r\n                        var waitRes = GlobalTaskHandler.CancelAndWait(30_000);\r\n                        if (waitRes == false)\r\n                        {\r\n                            Logger.Error(\"Active global task failed to finish in time when switching to desktop mode.\");\r\n                        }\r\n                    },\r\n                    new GlobalProgressOptions(LOC.OpeningDesktopModeMessage));\r\n                if (dialogRes.Error != null)\r\n                {\r\n                    Logger.Error(dialogRes.Error, \"Cancelling global task when switching to desktop mode failed.\");\r\n                }\r\n            }\r\n\r\n            CloseView();\r\n            App.QuitAndStart(\r\n                PlaynitePaths.DesktopExecutablePath,\r\n                new CmdLineOptions()\r\n                {\r\n                    SkipLibUpdate = true,\r\n                    StartInDesktop = true,\r\n                    MasterInstance = true,\r\n                    SafeStartup = App.CmdLine.SafeStartup,\r\n                    UserDataDir = App.CmdLine.UserDataDir\r\n                }.ToString());\r\n        }\r\n\r\n        private void SearchText_PropertyChanged(object sender, PropertyChangedEventArgs e)\r\n        {\r\n            if (e.PropertyName == nameof(Windows.TextInputWindow.InputText))\r\n            {\r\n                var input = sender as Windows.TextInputWindow;\r\n                if (AppSettings.Fullscreen.FilterSettings.Name != input.InputText)\r\n                {\r\n                    if (AppSettings.Fullscreen.FilterSettings.Name.IsNullOrEmpty() && input.InputText.IsNullOrEmpty())\r\n                    {\r\n                        return;\r\n                    }\r\n\r\n                    AppSettings.Fullscreen.FilterSettings.Name = input.InputText;\r\n                }\r\n            }\r\n        }\r\n\r\n        private void OpenSubEnumFilter(string title, Type enumType, string filterPropertiesPath, bool isPrimaryFilter = false)\r\n        {\r\n            SubFilterControl = new FilterEnumListSelection(this, isPrimaryFilter)\r\n            {\r\n                Title = title.StartsWith(\"LOC\", StringComparison.Ordinal) ? ResourceProvider.GetString(title) : title,\r\n                EnumType = enumType\r\n            };\r\n\r\n            BindingOperations.SetBinding(SubFilterControl, FilterEnumListSelection.FilterPropertiesProperty, new Binding()\r\n            {\r\n                Source = AppSettings.Fullscreen.FilterSettings,\r\n                Path = new PropertyPath(filterPropertiesPath),\r\n                Mode = BindingMode.TwoWay\r\n            });\r\n\r\n            FilterAdditionalPanelVisible = false;\r\n            FilterPanelVisible = false;\r\n        }\r\n\r\n        private void OpenSubStringFilter(string title, string itemsListPath, string filterPropertiesPath, bool isPrimaryFilter = false)\r\n        {\r\n            SubFilterControl = new FilterStringListSelection(this, isPrimaryFilter)\r\n            {\r\n                Title = title.StartsWith(\"LOC\", StringComparison.Ordinal) ? ResourceProvider.GetString(title) : title\r\n            };\r\n\r\n            BindingOperations.SetBinding(SubFilterControl, FilterStringListSelection.ItemsListProperty, new Binding()\r\n            {\r\n                Source = DatabaseFilters,\r\n                Path = new PropertyPath(itemsListPath)\r\n            });\r\n\r\n            BindingOperations.SetBinding(SubFilterControl, FilterStringListSelection.FilterPropertiesProperty, new Binding()\r\n            {\r\n                Source = AppSettings.Fullscreen.FilterSettings,\r\n                Path = new PropertyPath(filterPropertiesPath),\r\n                Mode = BindingMode.TwoWay\r\n            });\r\n\r\n            FilterAdditionalPanelVisible = false;\r\n            FilterPanelVisible = false;\r\n        }\r\n\r\n        private void OpenSubFilter(string title, string itemsListPath, string filterPropertiesPath, bool isPrimaryFilter = false)\r\n        {\r\n            SubFilterControl = new FilterDbItemtSelection(this, isPrimaryFilter)\r\n            {\r\n                Title = title.StartsWith(\"LOC\", StringComparison.Ordinal) ? ResourceProvider.GetString(title) : title\r\n            };\r\n\r\n            BindingOperations.SetBinding(SubFilterControl, FilterDbItemtSelection.ItemsListProperty, new Binding()\r\n            {\r\n                Source = DatabaseFilters,\r\n                Path = new PropertyPath(itemsListPath)\r\n            });\r\n\r\n            BindingOperations.SetBinding(SubFilterControl, FilterDbItemtSelection.FilterPropertiesProperty, new Binding()\r\n            {\r\n                Source = AppSettings.Fullscreen.FilterSettings,\r\n                Path = new PropertyPath(filterPropertiesPath),\r\n                Mode = BindingMode.TwoWay\r\n            });\r\n\r\n            FilterAdditionalPanelVisible = false;\r\n            FilterPanelVisible = false;\r\n        }\r\n\r\n        public void OpenView()\r\n        {\r\n            Window.Show(this);\r\n            SetViewSizeAndPosition(IsFullScreen);\r\n            App.UpdateScreenInformation(Window.Window);\r\n            Window.Window.LocationChanged += Window_LocationChanged;\r\n            Window.Window.StateChanged += Window_StateChanged;\r\n            InitializeView();\r\n        }\r\n\r\n        public override void CloseView()\r\n        {\r\n            ignoreCloseActions = true;\r\n            Window.Close();\r\n            Dispose();\r\n            ignoreCloseActions = false;\r\n        }\r\n\r\n        public void ToggleFullscreen()\r\n        {\r\n            if (IsFullScreen)\r\n            {\r\n                IsFullScreen = false;\r\n                SetViewSizeAndPosition(IsFullScreen);\r\n            }\r\n            else\r\n            {\r\n                IsFullScreen = true;\r\n                SetViewSizeAndPosition(IsFullScreen);\r\n            }\r\n        }\r\n\r\n        public void SetViewSizeAndPosition(bool fullscreen)\r\n        {\r\n            ComputerScreen screen = null;\r\n            var screens = Computer.GetScreens();\r\n            if (AppSettings.Fullscreen.UsePrimaryDisplay)\r\n            {\r\n                screen = screens.FirstOrDefault(a => a.Primary);\r\n            }\r\n            else\r\n            {\r\n                var screenIndex = AppSettings.Fullscreen.Monitor;\r\n                if (screenIndex + 1 > screens.Count || screenIndex < 0)\r\n                {\r\n                    screenIndex = 0;\r\n                }\r\n\r\n                screen = screens[screenIndex];\r\n            }\r\n\r\n            if (screen == null)\r\n            {\r\n                screen = screens[0];\r\n            }\r\n\r\n            var dpi = VisualTreeHelper.GetDpi(Window.Window);\r\n            if (App.CmdLine.FullscreenHeight > 0 && App.CmdLine.FullscreenWidth > 0)\r\n            {\r\n                var width = App.CmdLine.FullscreenWidth;\r\n                var height = App.CmdLine.FullscreenHeight;\r\n                var ratio = Sizes.GetAspectRatio(width, height);\r\n                ViewportWidth = ratio.GetWidth(ViewportHeight);\r\n                WindowWidth = width;\r\n                WindowHeight = height;\r\n                WindowLeft = screen.Bounds.X / dpi.DpiScaleX;\r\n                WindowTop = screen.Bounds.Y / dpi.DpiScaleY;\r\n            }\r\n            else\r\n            {\r\n                var ratio = Sizes.GetAspectRatio(screen.Bounds);\r\n                ViewportWidth = ratio.GetWidth(ViewportHeight);\r\n                if (fullscreen)\r\n                {\r\n                    WindowLeft = screen.Bounds.X / dpi.DpiScaleX;\r\n                    WindowTop = screen.Bounds.Y / dpi.DpiScaleY;\r\n                    WindowWidth = screen.Bounds.Width / dpi.DpiScaleX;\r\n                    WindowHeight = screen.Bounds.Height / dpi.DpiScaleY;\r\n                }\r\n                else\r\n                {\r\n                    WindowWidth = screen.Bounds.Width / 1.5;\r\n                    WindowHeight = screen.Bounds.Height / 1.5;\r\n                    WindowLeft = screen.Bounds.X + ((screen.Bounds.Width - WindowWidth) / 2);\r\n                    WindowTop = screen.Bounds.Y + ((screen.Bounds.Height - WindowHeight) / 2);\r\n                }\r\n            }\r\n        }\r\n\r\n        protected void InitializeView()\r\n        {\r\n            if (app.GameController != null)\r\n            {\r\n                app.GameController.ButtonChanged += GameControllerInputButtonChanged;\r\n                app.GameController.ControllerConnected += GameControllerOnControllerConnected;\r\n                app.GameController.ControllerDisconnected += GameControllerOnControllerDisconnected;\r\n            }\r\n\r\n            GamesCollectionViewEntry.InitItemViewProperties(App, AppSettings);\r\n            DatabaseFilters = new DatabaseFilter(Database, Extensions, AppSettings, AppSettings.Fullscreen.FilterSettings);\r\n            DatabaseExplorer = new DatabaseExplorer(Database, Extensions, AppSettings, this);\r\n            var openProgress = new ProgressViewViewModel(\r\n                new ProgressWindowFactory(),\r\n                new GlobalProgressOptions(LOC.OpeningDatabase));\r\n\r\n            if (openProgress.ActivateProgress(_ =>\r\n            {\r\n                if (!Database.IsOpen)\r\n                {\r\n                    Database.SetDatabasePath(AppSettings.DatabasePath);\r\n                    Database.OpenDatabase();\r\n                }\r\n            }).Result != true)\r\n            {\r\n                Logger.Error(openProgress.FailException, \"Failed to open library database.\");\r\n                var message = Resources.GetString(\"LOCDatabaseOpenError\") + $\"\\n{openProgress.FailException?.Message}\";\r\n                Dialogs.ShowErrorMessage(message, \"\");\r\n                return;\r\n            }\r\n\r\n            GamesView = new FullscreenCollectionView(Database, AppSettings, Extensions);\r\n            BindingOperations.EnableCollectionSynchronization(GamesView.Items, gamesLock);\r\n            if (GamesView.CollectionView.Count > 0)\r\n            {\r\n                SelectGameIndex(0);\r\n            }\r\n            else\r\n            {\r\n                SelectedGame = null;\r\n            }\r\n\r\n            GameListFocused = true;\r\n            isInitialized = true;\r\n            RunStartupScript();\r\n            Extensions.NotifiyOnApplicationStarted();\r\n\r\n            try\r\n            {\r\n                App.Discord = new DiscordManager(AppSettings.DiscordPresenceEnabled);\r\n            }\r\n            catch (Exception e) when (!PlayniteEnvironment.ThrowAllErrors)\r\n            {\r\n                Logger.Error(e, \"Failed to initialize Discord manager.\");\r\n            }\r\n\r\n            OnPropertyChanged(nameof(SortedFilterPresets));\r\n            OnPropertyChanged(nameof(SortedFilterFullscreenPresets));\r\n            if (AppSettings.Fullscreen.SelectedFilterPreset != Guid.Empty)\r\n            {\r\n                ActiveFilterPreset = Database.FilterPresets.FirstOrDefault(a => a.Id == AppSettings.Fullscreen.SelectedFilterPreset);\r\n            }\r\n        }\r\n\r\n        public override void SelectGame(Guid id, bool restoreView = false)\r\n        {\r\n            var viewEntry = GamesView.Items.FirstOrDefault(a => a.Game.Id == id);\r\n            SelectedGame = viewEntry;\r\n        }\r\n\r\n        public void SelectGameIndex(int index)\r\n        {\r\n            if (!Database.IsOpen)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (GamesView.CollectionView.Count > index)\r\n            {\r\n                var viewEntry = GamesView.CollectionView.GetItemAt(index) as GamesCollectionViewEntry;\r\n                SelectedGame = viewEntry;\r\n            }\r\n        }\r\n\r\n        public override NotificationMessage GetAddonUpdatesFoundMessage(List<AddonUpdate> updates)\r\n        {\r\n            return new NotificationMessage(\"AddonUpdateAvailable\", Resources.GetString(LOC.AddonUpdatesAvailable), NotificationType.Info, () =>\r\n            {\r\n                new AddonsViewModel(\r\n                        new AddonsUpdateWindowFactory(),\r\n                        Dialogs,\r\n                        Resources,\r\n                        App.ServicesClient,\r\n                        Extensions,\r\n                        AppSettings,\r\n                        App,\r\n                        updates).OpenView();\r\n            });\r\n        }\r\n\r\n        private void OnFileDropped(DragEventArgs args)\r\n        {\r\n            if (args.Data.GetDataPresent(DataFormats.FileDrop))\r\n            {\r\n                var files = (string[])args.Data.GetData(DataFormats.FileDrop);\r\n                if (files.Count() == 1)\r\n                {\r\n                    Window.RestoreWindow();\r\n\r\n                    var path = files[0];\r\n                    if (File.Exists(path))\r\n                    {\r\n                        var ext = Path.GetExtension(path).ToLower();\r\n                        if (ext.Equals(PlaynitePaths.PackedThemeFileExtention, StringComparison.OrdinalIgnoreCase))\r\n                        {\r\n                            App.InstallThemeFile(path);\r\n                        }\r\n                        else if (ext.Equals(PlaynitePaths.PackedExtensionFileExtention, StringComparison.OrdinalIgnoreCase))\r\n                        {\r\n                            App.InstallExtensionFile(path);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        public void RestoreWindow()\r\n        {\r\n            Window.RestoreWindow();\r\n        }\r\n\r\n        public void MinimizeWindow()\r\n        {\r\n            Window.Window.WindowState = WindowState.Minimized;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            IsDisposing = true;\r\n            GamesView?.Dispose();\r\n            Window.Window.LocationChanged -= Window_LocationChanged;\r\n            Window.Window.StateChanged -= Window_StateChanged;\r\n            Microsoft.Win32.SystemEvents.DisplaySettingsChanged -= SystemEvents_DisplaySettingsChanged;\r\n        }\r\n\r\n        private void Window_LocationChanged(object sender, EventArgs e)\r\n        {\r\n            App.UpdateScreenInformation(Window.Window);\r\n        }\r\n\r\n        // This is workaround for https://github.com/JosefNemec/Playnite/issues/4064\r\n        // There's really no good way to handle this via some MVVM binding without breaking theme changes to GameStatus view.\r\n        private void Window_StateChanged(object sender, EventArgs e)\r\n        {\r\n            if (GameStatusVisible && Window.Window.WindowState != WindowState.Minimized)\r\n            {\r\n                var gameStatusScreen = ElementTreeHelper.FindVisualChildren<GameStatus>(Window.Window).FirstOrDefault();\r\n                if (gameStatusScreen is null)\r\n                    return;\r\n\r\n                if (gameStatusScreen.Template.FindName(\"PART_PanelActionButtons\", gameStatusScreen) is Panel actionButtons &&\r\n                    actionButtons.Children.Count > 0)\r\n                {\r\n                    var child = actionButtons.Children[0];\r\n                    if (!child.IsFocused && child.Focusable)\r\n                        actionButtons.Children[0].Focus();\r\n                }\r\n            }\r\n        }\r\n\r\n        internal void ProcessUriRequest(PlayniteUriEventArgs args)\r\n        {\r\n            var arguments = args.Arguments;\r\n            if (args.Arguments.Count() == 0)\r\n            {\r\n                return;\r\n            }\r\n\r\n            var command = arguments[0];\r\n            switch (command)\r\n            {\r\n                case UriCommands.Restore:\r\n                    if (WindowManager.LastActiveWindow != Window.Window)\r\n                        WindowManager.LastActiveWindow.Close();\r\n\r\n                    Window.Window.RestoreWindow();\r\n                    break;\r\n\r\n                default:\r\n                    Logger.Warn($\"Uknown URI command {command}\");\r\n                    break;\r\n            }\r\n        }\r\n\r\n        public override void OpenSettings(int settingsPageIndex)\r\n        {\r\n        }\r\n\r\n        public override void EditGame(Game game)\r\n        {\r\n        }\r\n\r\n        public override void AssignCategories(Game game)\r\n        {\r\n        }\r\n\r\n        private void SelectFilterPreset()\r\n        {\r\n            if (!Database.FilterPresets.HasItems())\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (ItemSelector.SelectSingle<FilterPreset>(\r\n                LOC.SettingsTopPanelFilterPresetsItem,\r\n                \"\",\r\n                Database.FilterPresets.OrderBy(a => a.Name).Select(a => new SelectableNamedObject<FilterPreset>(a, a.Name)).ToList(),\r\n                out var selectedPreset))\r\n            {\r\n                ActiveFilterPreset = selectedPreset;\r\n            }\r\n        }\r\n\r\n        public void SelectRandomGame()\r\n        {\r\n            var model = new RandomGameSelectViewModel(\r\n               Database,\r\n               GamesView,\r\n               new RandomGameSelectWindowFactory(),\r\n               Resources);\r\n            model.OpenView();\r\n            if (model.SelectedAction == RandomGameSelectAction.Play)\r\n            {\r\n                SelectGame(model.SelectedGame.Id);\r\n                GamesEditor.PlayGame(model.SelectedGame, true);\r\n            }\r\n            else if (model.SelectedAction == RandomGameSelectAction.Navigate)\r\n            {\r\n                ToggleGameDetailsCommand.Execute(null);\r\n                SelectGame(model.SelectedGame.Id);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/FullscreenAppViewModel_Commands.cs",
    "content": "﻿using Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public partial class FullscreenAppViewModel\r\n    {\r\n        public RelayCommand<CancelEventArgs> WindowClosingCommand { get; private set; }\r\n        public RelayCommand<EventArgs> WindowGotFocusCommand { get; private set; }\r\n        public RelayCommand<object> ToggleFullscreenCommand { get; private set; }\r\n        public RelayCommand<object> OpenMainMenuCommand { get; private set; }\r\n        public RelayCommand<object> OpenNotificationsMenuCommand { get; private set; }\r\n        public RelayCommand OpenGameMenuCommand { get; private set; }\r\n        public RelayCommand<object> ToggleGameDetailsCommand { get; private set; }\r\n        public RelayCommand<object> ToggleFiltersCommand { get; private set; }\r\n        public RelayCommand<GameField> LoadSubFilterCommand { get; private set; }\r\n        public RelayCommand<object> CloseSubFilterCommand { get; private set; }\r\n        public RelayCommand<object> CloseAdditionalFilterCommand { get; private set; }\r\n        public RelayCommand<object> ClearFiltersCommand { get; private set; }\r\n        public RelayCommand<object> OpenAdditionalFiltersCommand { get; private set; }\r\n        public RelayCommand<object> CloseAdditionalFiltersCommand { get; private set; }\r\n        public RelayCommand<object> ActivateSelectedCommand { get; private set; }\r\n        public RelayCommand<object> OpenSearchCommand { get; private set; }\r\n        public RelayCommand<object> NextFilterViewCommand { get; private set; }\r\n        public RelayCommand<object> PrevFilterViewCommand { get; private set; }\r\n        public RelayCommand<object> SelectPrevGameCommand { get; private set; }\r\n        public RelayCommand<object> SelectNextGameCommand { get; private set; }\r\n        public RelayCommand<DragEventArgs> FileDroppedCommand { get; private set; }\r\n        public RelayCommand<object> CloseGameStatusCommand { get; private set; }\r\n        public RelayCommand SwitchToDesktopCommand { get; private set; }\r\n        public RelayCommand SelectFilterPresetCommand { get; private set; }\r\n        public RelayCommand MinimizeCommand { get; private set; }\r\n        public RelayCommand SelectRandomGameCommand { get; private set; }\r\n\r\n        private void InitializeCommands()\r\n        {\r\n            WindowClosingCommand = new RelayCommand<CancelEventArgs>((a) =>\r\n            {\r\n                if (!ignoreCloseActions)\r\n                {\r\n                    Dispose();\r\n                    App.Quit();\r\n                }\r\n            });\r\n\r\n            WindowGotFocusCommand = new RelayCommand<EventArgs>((a) =>\r\n            {\r\n                if (Keyboard.FocusedElement == Window.Window && isInitialized && !ignoreCloseActions)\r\n                {\r\n                    Logger.Warn(\"Lost keyboard focus from known controls, trying to focus something.\");\r\n                    foreach (var child in ElementTreeHelper.FindVisualChildren<FrameworkElement>(Window.Window))\r\n                    {\r\n                        if (child.Focusable && child.IsVisible)\r\n                        {\r\n                            Logger.Debug($\"Focusing {child}\");\r\n                            child.Focus();\r\n                            return;\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n\r\n            ToggleFullscreenCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ToggleFullscreen();\r\n            });\r\n\r\n            OpenGameMenuCommand = new RelayCommand(() =>\r\n            {\r\n                OpenGameMenu();\r\n            }, () => SelectedGameDetails != null);\r\n\r\n            ToggleGameDetailsCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                GameDetailsVisible = !GameDetailsVisible;\r\n                GameListVisible = !GameListVisible;\r\n\r\n                if (!GameDetailsVisible)\r\n                {\r\n                    GameDetailsFocused = false;\r\n                    GameListFocused = true;\r\n                }\r\n                else\r\n                {\r\n                    GameDetailsFocused = true;\r\n                    GameListFocused = false;\r\n                }\r\n            }, (a) => SelectedGame != null);\r\n\r\n            LoadSubFilterCommand = new RelayCommand<GameField>((gameField) =>\r\n            {\r\n                switch (gameField)\r\n                {\r\n                    case GameField.PluginId:\r\n                        OpenSubFilter(\"LOCLibrary\", nameof(DatabaseFilter.Libraries), nameof(FilterSettings.Library), true);\r\n                        break;\r\n                    case GameField.Categories:\r\n                        OpenSubFilter(\"LOCCategoryLabel\", nameof(DatabaseFilter.Categories), nameof(FilterSettings.Category), true);\r\n                        break;\r\n                    case GameField.Platforms:\r\n                        OpenSubFilter(\"LOCPlatformTitle\", nameof(DatabaseFilter.Platforms), nameof(FilterSettings.Platform), true);\r\n                        break;\r\n                    case GameField.CompletionStatus:\r\n                        OpenSubFilter(\"LOCCompletionStatus\", nameof(DatabaseFilter.CompletionStatuses), nameof(FilterSettings.CompletionStatuses));\r\n                        break;\r\n                    case GameField.ReleaseYear:\r\n                        OpenSubStringFilter(\"LOCGameReleaseYearTitle\", nameof(DatabaseFilter.ReleaseYears), nameof(FilterSettings.ReleaseYear));\r\n                        break;\r\n                    case GameField.Genres:\r\n                        OpenSubFilter(\"LOCGenreLabel\", nameof(DatabaseFilter.Genres), nameof(FilterSettings.Genre));\r\n                        break;\r\n                    case GameField.Developers:\r\n                        OpenSubFilter(\"LOCDeveloperLabel\", nameof(DatabaseFilter.Developers), nameof(FilterSettings.Developer));\r\n                        break;\r\n                    case GameField.Publishers:\r\n                        OpenSubFilter(\"LOCPublisherLabel\", nameof(DatabaseFilter.Publishers), nameof(FilterSettings.Publisher));\r\n                        break;\r\n                    case GameField.Features:\r\n                        OpenSubFilter(\"LOCFeatureLabel\", nameof(DatabaseFilter.Features), nameof(FilterSettings.Feature));\r\n                        break;\r\n                    case GameField.Tags:\r\n                        OpenSubFilter(\"LOCTagLabel\", nameof(DatabaseFilter.Tags), nameof(FilterSettings.Tag));\r\n                        break;\r\n                    case GameField.Playtime:\r\n                        OpenSubEnumFilter(\"LOCTimePlayed\", typeof(PlaytimeCategory), nameof(FilterSettings.PlayTime));\r\n                        break;\r\n                    case GameField.InstallSize:\r\n                        OpenSubEnumFilter(\"LOCInstallSizeLabel\", typeof(InstallSizeGroup), nameof(FilterSettings.InstallSize));\r\n                        break;\r\n                    case GameField.Series:\r\n                        OpenSubFilter(\"LOCSeriesLabel\", nameof(DatabaseFilter.Series), nameof(FilterSettings.Series));\r\n                        break;\r\n                    case GameField.Regions:\r\n                        OpenSubFilter(\"LOCRegionLabel\", nameof(DatabaseFilter.Regions), nameof(FilterSettings.Region));\r\n                        break;\r\n                    case GameField.Source:\r\n                        OpenSubFilter(\"LOCSourceLabel\", nameof(DatabaseFilter.Sources), nameof(FilterSettings.Source));\r\n                        break;\r\n                    case GameField.AgeRatings:\r\n                        OpenSubFilter(\"LOCAgeRatingLabel\", nameof(DatabaseFilter.AgeRatings), nameof(FilterSettings.AgeRating));\r\n                        break;\r\n                    case GameField.UserScore:\r\n                        OpenSubEnumFilter(\"LOCUserScore\", typeof(ScoreGroup), nameof(FilterSettings.UserScore));\r\n                        break;\r\n                    case GameField.CommunityScore:\r\n                        OpenSubEnumFilter(\"LOCCommunityScore\", typeof(ScoreGroup), nameof(FilterSettings.CommunityScore));\r\n                        break;\r\n                    case GameField.CriticScore:\r\n                        OpenSubEnumFilter(\"LOCCriticScore\", typeof(ScoreGroup), nameof(FilterSettings.CriticScore));\r\n                        break;\r\n                    case GameField.LastActivity:\r\n                        OpenSubEnumFilter(\"LOCGameLastActivityTitle\", typeof(PastTimeSegment), nameof(FilterSettings.LastActivity));\r\n                        break;\r\n                    case GameField.RecentActivity:\r\n                        OpenSubEnumFilter(\"LOCRecentActivityLabel\", typeof(PastTimeSegment), nameof(FilterSettings.RecentActivity));\r\n                        break;\r\n                    case GameField.Added:\r\n                        OpenSubEnumFilter(\"LOCAddedLabel\", typeof(PastTimeSegment), nameof(FilterSettings.Added));\r\n                        break;\r\n                    case GameField.Modified:\r\n                        OpenSubEnumFilter(\"LOCModifiedLabel\", typeof(PastTimeSegment), nameof(FilterSettings.Modified));\r\n                        break;\r\n                }\r\n            });\r\n\r\n            OpenAdditionalFiltersCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                FilterPanelVisible = false;\r\n                FilterAdditionalPanelVisible = true;\r\n            });\r\n\r\n            CloseAdditionalFiltersCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                FilterAdditionalPanelVisible = false;\r\n                FilterPanelVisible = true;\r\n            });\r\n\r\n            CloseAdditionalFilterCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                ((IDisposable)SubFilterControl).Dispose();\r\n                SubFilterControl = null;\r\n                FilterAdditionalPanelVisible = true;\r\n            });\r\n\r\n            CloseSubFilterCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                if (SubFilterControl != null)\r\n                {\r\n                    FilterPanelVisible = true;\r\n                    ((IDisposable)SubFilterControl).Dispose();\r\n                    SubFilterControl = null;\r\n                }\r\n            });\r\n\r\n            ToggleFiltersCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                if (SubFilterVisible)\r\n                {\r\n                    ((IDisposable)SubFilterControl).Dispose();\r\n                    SubFilterControl = null;\r\n                    FilterPanelVisible = false;\r\n                }\r\n                else if (FilterAdditionalPanelVisible)\r\n                {\r\n                    FilterAdditionalPanelVisible = false;\r\n                }\r\n                else\r\n                {\r\n                    FilterPanelVisible = !FilterPanelVisible;\r\n                }\r\n\r\n                if (FilterPanelVisible)\r\n                {\r\n                    GameListFocused = false;\r\n                }\r\n                else\r\n                {\r\n                    GameListFocused = true;\r\n                }\r\n            });\r\n\r\n            ClearFiltersCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                AppSettings.Fullscreen.FilterSettings.ClearFilters();\r\n                ActiveFilterPreset = null;\r\n            });\r\n\r\n            ActivateSelectedCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                if (SelectedGame?.IsInstalled == true)\r\n                {\r\n                    GamesEditor.PlayGame(SelectedGame.Game, true);\r\n                }\r\n                else if (SelectedGame?.IsInstalled == false)\r\n                {\r\n                    GamesEditor.InstallGame(SelectedGame.Game);\r\n                }\r\n            }, (a) => Database?.IsOpen == true);\r\n\r\n            OpenSearchCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                GameListFocused = false;\r\n                var oldSearch = AppSettings.Fullscreen.FilterSettings.Name;\r\n                var input = new Windows.TextInputWindow();\r\n                input.PropertyChanged += SearchText_PropertyChanged;\r\n                var res = input.ShowInput(WindowManager.CurrentWindow, \"\", \"\", AppSettings.Fullscreen.FilterSettings.Name);\r\n                input.PropertyChanged -= SearchText_PropertyChanged;\r\n                if (res.Result != true)\r\n                {\r\n                    AppSettings.Fullscreen.FilterSettings.Name = oldSearch;\r\n                }\r\n\r\n                GameListFocused = true;\r\n            });\r\n\r\n            NextFilterViewCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                var presets = SortedFilterFullscreenPresets;\r\n                if (!presets.HasItems())\r\n                {\r\n                    return;\r\n                }\r\n\r\n                if (ActiveFilterPreset == null)\r\n                {\r\n                    ActiveFilterPreset = presets[0];\r\n                }\r\n                else\r\n                {\r\n                    var curIndex = presets.IndexOf(ActiveFilterPreset);\r\n                    if (curIndex < (presets.Count - 1))\r\n                    {\r\n                        ActiveFilterPreset = presets[curIndex + 1];\r\n                    }\r\n                }\r\n            }, (a) => Database?.IsOpen == true);\r\n\r\n            PrevFilterViewCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                var presets = SortedFilterFullscreenPresets;\r\n                if (!presets.HasItems())\r\n                {\r\n                    return;\r\n                }\r\n\r\n                if (ActiveFilterPreset == null)\r\n                {\r\n                    ActiveFilterPreset = presets[0];\r\n                }\r\n                else\r\n                {\r\n                    var curIndex = presets.IndexOf(ActiveFilterPreset);\r\n                    if (curIndex > 0)\r\n                    {\r\n                        ActiveFilterPreset = presets[curIndex - 1];\r\n                    }\r\n                }\r\n            }, (a) => Database?.IsOpen == true);\r\n\r\n            SelectPrevGameCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                var currIndex = GamesView.CollectionView.IndexOf(SelectedGame);\r\n                var prevIndex = currIndex - 1;\r\n                if (prevIndex >= 0)\r\n                {\r\n                    SelectedGame = GamesView.CollectionView.GetItemAt(prevIndex) as GamesCollectionViewEntry;\r\n                }\r\n            }, (a) => Database?.IsOpen == true);\r\n\r\n            SelectNextGameCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                var currIndex = GamesView.CollectionView.IndexOf(SelectedGame);\r\n                var nextIndex = currIndex + 1;\r\n                if (nextIndex < GamesView.CollectionView.Count)\r\n                {\r\n                    SelectedGame = GamesView.CollectionView.GetItemAt(nextIndex) as GamesCollectionViewEntry;\r\n                }\r\n            }, (a) => Database?.IsOpen == true);\r\n\r\n            FileDroppedCommand = new RelayCommand<DragEventArgs>((args) =>\r\n            {\r\n                OnFileDropped(args);\r\n            });\r\n\r\n            OpenMainMenuCommand = new RelayCommand<object>((_) => OpenMainMenu());\r\n            OpenNotificationsMenuCommand = new RelayCommand<object>((_) => OpenNotificationsMenu());\r\n\r\n            CloseGameStatusCommand = new RelayCommand<object>((_) =>\r\n            {\r\n                GameStatusVisible = false;\r\n                GameListFocused = true;\r\n            });\r\n\r\n            SwitchToDesktopCommand = new RelayCommand(() => SwitchToDesktopMode());\r\n            SelectFilterPresetCommand = new RelayCommand(() => SelectFilterPreset());\r\n            MinimizeCommand = new RelayCommand(() => MinimizeWindow());\r\n            SelectRandomGameCommand = new RelayCommand(() => SelectRandomGame());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/GameClientsMenuViewModel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.FullscreenApp.Windows;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class GameClientsMenuViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private readonly ThirdPartyTool noClient = new ThirdPartyTool { Name = LOC.NoItemsFound.GetLocalized() };\r\n        public FullscreenAppViewModel MainModel { get; }\r\n        public List<ThirdPartyTool> Clients { get; }\r\n\r\n        public RelayCommand CloseCommand => new RelayCommand(() => Close());\r\n        public RelayCommand<ThirdPartyTool> OpenClientCommand => new RelayCommand<ThirdPartyTool>((c) =>\r\n        {\r\n            Close();\r\n            if (c != noClient)\r\n                MainModel.StartThirdPartyTool(c);\r\n        });\r\n\r\n        public GameClientsMenuViewModel(\r\n            IWindowFactory window,\r\n            FullscreenAppViewModel mainModel)\r\n        {\r\n            this.window = window;\r\n            this.MainModel = mainModel;\r\n            Clients = mainModel.ThirdPartyTools;\r\n            if (Clients.Count == 0)\r\n                Clients = new List<ThirdPartyTool> { noClient };\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n            window.Close(true);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/GameDetailsViewModel.cs",
    "content": "﻿using Playnite.Commands;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class GameDetailsViewModel : ObservableObject, IDisposable\r\n    {\r\n        private readonly IResourceProvider resources;\r\n        private readonly GamesEditor gamesEditor;\r\n        private readonly FullscreenAppViewModel mainModel;\r\n        private IDialogsFactory dialogs;\r\n\r\n        private GamesCollectionViewEntry game;\r\n        public GamesCollectionViewEntry Game\r\n        {\r\n            get => game;\r\n            set\r\n            {\r\n                game = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public string ContextActionDescription\r\n        {\r\n            get\r\n            {\r\n                if (Game?.IsRunning == true)\r\n                {\r\n                    return resources.GetString(\"LOCGameRunning\");\r\n                }\r\n                else if (Game?.IsLaunching == true)\r\n                {\r\n                    return resources.GetString(\"LOCGameLaunching\");\r\n                }\r\n                else if (Game?.IsInstalling == true)\r\n                {\r\n                    return resources.GetString(\"LOCSetupRunning\");\r\n                }\r\n                else if (Game?.IsUninstalling == true)\r\n                {\r\n                    return resources.GetString(\"LOCUninstalling\");\r\n                }\r\n                else if (Game?.IsInstalled == false)\r\n                {\r\n                    return resources.GetString(\"LOCInstallGame\");\r\n                }\r\n                else if (Game?.IsInstalled == true)\r\n                {\r\n                    return resources.GetString(\"LOCPlayGame\");\r\n                }\r\n\r\n                return \"<ErrorState>\";\r\n            }\r\n        }\r\n\r\n        #region Game Commands\r\n\r\n        public RelayCommand<object> ContextActionCommand { get; private set; }\r\n        #endregion\r\n\r\n        public GameDetailsViewModel(\r\n            GamesCollectionViewEntry gameView)\r\n        {\r\n            Game = gameView;\r\n            resources = new ResourceProvider();\r\n        }\r\n\r\n        public GameDetailsViewModel(\r\n            GamesCollectionViewEntry gameView,\r\n            IResourceProvider resources,\r\n            GamesEditor gamesEditor,\r\n            FullscreenAppViewModel mainModel,\r\n            IDialogsFactory dialogs)\r\n        {\r\n            this.resources = resources;\r\n            this.gamesEditor = gamesEditor;\r\n            this.mainModel = mainModel;\r\n            this.dialogs = dialogs;\r\n            Game = gameView;\r\n            Game.Game.PropertyChanged += Game_PropertyChanged;\r\n            InitializeCommands();\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            Game.Game.PropertyChanged -= Game_PropertyChanged;\r\n        }\r\n\r\n        private void Game_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)\r\n        {\r\n            OnPropertyChanged(nameof(ContextActionDescription));\r\n        }\r\n\r\n        public void InitializeCommands()\r\n        {\r\n            ContextActionCommand = new RelayCommand<object>((a) =>\r\n            {\r\n                if (Game?.IsInstalling == true || Game?.IsUninstalling == true)\r\n                {\r\n                    CheckSetup();\r\n                }\r\n                else if (Game?.IsRunning == true || Game?.IsLaunching == true)\r\n                {\r\n                    CheckExecution();\r\n                }\r\n                else if (Game?.IsInstalled == false)\r\n                {\r\n                    gamesEditor.InstallGame(Game.Game);\r\n                }\r\n                else if (Game?.IsInstalled == true)\r\n                {\r\n                    gamesEditor.PlayGame(Game.Game, true);\r\n                }\r\n            });\r\n        }\r\n\r\n        public void CheckSetup()\r\n        {\r\n            if (dialogs.ShowMessage(\r\n                resources.GetString(\"LOCCancelMonitoringSetupAsk\"),\r\n                resources.GetString(\"LOCCancelMonitoringAskTitle\"),\r\n                MessageBoxButton.YesNo) == MessageBoxResult.Yes)\r\n            {\r\n                gamesEditor.CancelGameMonitoring(Game.Game);\r\n            }\r\n        }\r\n\r\n        public void CheckExecution()\r\n        {\r\n            if (dialogs.ShowMessage(\r\n                resources.GetString(\"LOCCancelMonitoringExecutionAsk\"),\r\n                resources.GetString(\"LOCCancelMonitoringAskTitle\"),\r\n                MessageBoxButton.YesNo) == MessageBoxResult.Yes)\r\n            {\r\n                gamesEditor.CancelGameMonitoring(Game.Game);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/GameMenuViewModel.cs",
    "content": "﻿using Playnite.FullscreenApp.Windows;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing static Playnite.FullscreenApp.ViewModels.GameDetailsViewModel;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class GameActionItem\r\n    {\r\n        public RelayCommandBase Command { get; set; }\r\n        public object CommandParameter { get; set; }\r\n        public string Title { get; set; }\r\n        public object Template { get; set; }\r\n\r\n        public GameActionItem(RelayCommandBase command, string title)\r\n        {\r\n            Command = command;\r\n            Title = title;\r\n        }\r\n\r\n        public GameActionItem(RelayCommandBase command, string title, string templateName)\r\n        {\r\n            Command = command;\r\n            Title = title;\r\n            Template = ResourceProvider.GetResource(templateName) ?? DependencyProperty.UnsetValue;\r\n        }\r\n\r\n        public GameActionItem(RelayCommandBase command, object commandParameter, string title)\r\n        {\r\n            Command = command;\r\n            CommandParameter = commandParameter;\r\n            Title = title;\r\n        }\r\n\r\n        public GameActionItem(RelayCommandBase command, object commandParameter, string title, string templateName)\r\n        {\r\n            Command = command;\r\n            CommandParameter = commandParameter;\r\n            Title = title;\r\n            Template = ResourceProvider.GetResource(templateName) ?? DependencyProperty.UnsetValue;\r\n        }\r\n    }\r\n\r\n    public class GameMenuViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private readonly FullscreenAppViewModel mainModel;\r\n        private readonly GamesEditor gamesEditor;\r\n\r\n        public Game Game { get; }\r\n        public List<GameActionItem> GameItems { get; }\r\n\r\n        public RelayCommand CloseCommand => new RelayCommand(() => Close());\r\n        public RelayCommand StartGameCommand => new RelayCommand(() => StartGame());\r\n        public RelayCommand InstallGameCommand => new RelayCommand(() => InstallGame());\r\n        public RelayCommand UninstallGameCommand => new RelayCommand(() => UninstallGame());\r\n        public RelayCommand ToggleFavoritesCommand => new RelayCommand(() => ToggleFavorites());\r\n        public RelayCommand ToggleVisibilityCommand => new RelayCommand(() => ToggleVisibility());\r\n        public RelayCommand ToggleHdrCommand => new RelayCommand(() => ToggleHdr());\r\n        public RelayCommand RemoveGameCommand => new RelayCommand(() => RemoveGame());\r\n        public RelayCommand<GameAction> ActivateActionCommand => new RelayCommand<GameAction>((a) => ActivateAction(a));\r\n        public RelayCommand SetFieldsCommand => new RelayCommand(() => SetFields());\r\n        public RelayCommand OpenExtensionCommand => new RelayCommand(() => OpenExtensions());\r\n\r\n        public GameMenuViewModel(\r\n            IWindowFactory window,\r\n            FullscreenAppViewModel mainModel,\r\n            Game game,\r\n            GamesEditor gamesEditor)\r\n        {\r\n            this.window = window;\r\n            this.mainModel = mainModel;\r\n            this.gamesEditor = gamesEditor;\r\n            Game = game;\r\n            var items = new List<GameActionItem>();\r\n            if (game.IsInstalled)\r\n            {\r\n                items.Add(new GameActionItem(StartGameCommand, ResourceProvider.GetString(LOC.PlayGame), \"GameMenuPlayButtonTemplate\"));\r\n            }\r\n            else\r\n            {\r\n                items.Add(new GameActionItem(InstallGameCommand, ResourceProvider.GetString(LOC.InstallGame), \"GameMenuInstallButtonTemplate\"));\r\n            }\r\n\r\n            game.GameActions?.Where(a => !a.IsPlayAction).ForEach(a => items.Add(new GameActionItem(ActivateActionCommand, a, a.Name, \"GameMenuCustomActionButtonTemplate\")));\r\n\r\n            items.Add(new GameActionItem(ToggleFavoritesCommand, game.Favorite ? ResourceProvider.GetString(LOC.RemoveFavoriteGame) : ResourceProvider.GetString(LOC.FavoriteGame), \"GameMenuFavoriesButtonTemplate\"));\r\n            items.Add(new GameActionItem(ToggleVisibilityCommand, game.Hidden ? ResourceProvider.GetString(LOC.UnHideGame) : ResourceProvider.GetString(LOC.HideGame), \"GameMenuVisibilityButtonTemplate\"));\r\n            if (HdrUtilities.IsHdrSupported())\r\n            {\r\n                items.Add(new GameActionItem(ToggleHdrCommand, game.EnableSystemHdr ? ResourceProvider.GetString(LOC.DisableHdr) : ResourceProvider.GetString(LOC.EnableHdr), \"GameMenuHdrButtonTemplate\"));\r\n            }\r\n            items.Add(new GameActionItem(SetFieldsCommand, ResourceProvider.GetString(LOC.MenuSetFields), \"GameMenuSetFieldsTemplate\"));\r\n            items.Add(new GameActionItem(OpenExtensionCommand, ResourceProvider.GetString(LOC.Extensions), \"GameMenuExtensionsTemplate\"));\r\n            items.Add(new GameActionItem(RemoveGameCommand, ResourceProvider.GetString(LOC.RemoveGame), \"GameMenuRemoveButtonTemplate\"));\r\n\r\n            if (!game.IsCustomGame && game.IsInstalled)\r\n            {\r\n                items.Add(new GameActionItem(UninstallGameCommand, ResourceProvider.GetString(LOC.UninstallGame), \"GameMenuUninstallButtonTemplate\"));\r\n            }\r\n\r\n            GameItems = items;\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n            window.Close(true);\r\n        }\r\n\r\n        public void ActivateAction(GameAction action)\r\n        {\r\n            Close();\r\n            gamesEditor.ActivateAction(Game, action);\r\n        }\r\n\r\n        public void StartGame()\r\n        {\r\n            Close();\r\n            gamesEditor.PlayGame(Game, true);\r\n        }\r\n\r\n        public void InstallGame()\r\n        {\r\n            Close();\r\n            gamesEditor.InstallGame(Game);\r\n        }\r\n\r\n        public void UninstallGame()\r\n        {\r\n            Close();\r\n            gamesEditor.UnInstallGame(Game);\r\n        }\r\n\r\n        public void ToggleFavorites()\r\n        {\r\n            Close();\r\n            gamesEditor.ToggleFavoriteGame(Game);\r\n        }\r\n\r\n        public void ToggleVisibility()\r\n        {\r\n            Close();\r\n            gamesEditor.ToggleHideGame(Game);\r\n        }\r\n\r\n        public void ToggleHdr()\r\n        {\r\n            Close();\r\n            gamesEditor.ToggleHdrGame(Game);\r\n        }\r\n\r\n        public void RemoveGame()\r\n        {\r\n            Close();\r\n            gamesEditor.RemoveGame(Game);\r\n        }\r\n\r\n        private void SelectSingleAndSet<T>(IItemCollection<T> dbCollection, string header, Action<Guid> setter, Guid preselectedItem) where T : DatabaseObject, new()\r\n        {\r\n            var items = dbCollection.Select(a => new SelectableNamedObject<T>(a, a.Name)).OrderBy(a => a.Name).ToList();\r\n            items.Insert(0, new SelectableNamedObject<T>(new T() { Id = Guid.Empty }, ResourceProvider.GetString(LOC.None)));\r\n            items.ForEach(a => a.Selected = preselectedItem == a.Value.Id);\r\n            var passed = ItemSelector.SelectSingle(header, \"\", items, out var selectedItem);\r\n            if (passed)\r\n            {\r\n                setter(selectedItem.Id);\r\n                mainModel.Database.Games.Update(Game);\r\n            }\r\n        }\r\n\r\n        private void SelectMultiAndSet<T>(IItemCollection<T> dbCollection, string header, Action<List<Guid>> setter, List<Guid> preselectedItems) where T : DatabaseObject\r\n        {\r\n            var passed = ItemSelector.SelectMultiple(\r\n               header,\r\n               \"\",\r\n               dbCollection.Select(a => new SelectableNamedObject<T>(a, a.Name, preselectedItems?.Contains(a.Id) == true)).OrderByDescending(a => a.Selected).ThenBy(a => a.Name).ToList(),\r\n               out var selectedItems);\r\n            if (passed)\r\n            {\r\n                setter(selectedItems.HasItems() ? selectedItems.Select(a => a.Id).ToList() : null);\r\n                mainModel.Database.Games.Update(Game);\r\n            }\r\n        }\r\n\r\n        private void AssignScore(string header, Action<int?> setter)\r\n        {\r\n            var items = new List<SelectableNamedObject<int?>> { new SelectableNamedObject<int?>(null, ResourceProvider.GetString(LOC.None)) };\r\n            Enumerable.Range(0, 101).Reverse().ForEach(a => items.Add(new SelectableNamedObject<int?>(a)));\r\n            var passed = ItemSelector.SelectSingle(header, \"\", items, out var selectedItem);\r\n            if (passed)\r\n            {\r\n                setter(selectedItem);\r\n                mainModel.Database.Games.Update(Game);\r\n            }\r\n        }\r\n\r\n        private void SetFields()\r\n        {\r\n            Close();\r\n            var selected = ItemSelector.SelectSingle(\r\n                LOC.MenuSetFields,\r\n                \"\",\r\n                new List<SelectableNamedObject<GameField>>\r\n                {\r\n                    new SelectableNamedObject<GameField>(GameField.CompletionStatus, ResourceProvider.GetString(LOC.CompletionStatus)),\r\n                    new SelectableNamedObject<GameField>(GameField.UserScore, ResourceProvider.GetString(LOC.UserScore)),\r\n                    new SelectableNamedObject<GameField>(GameField.Categories,ResourceProvider.GetString(LOC.CategoryLabel)),\r\n                    new SelectableNamedObject<GameField>(GameField.Tags, ResourceProvider.GetString(LOC.TagLabel)),\r\n                    new SelectableNamedObject<GameField>(GameField.Features, ResourceProvider.GetString(LOC.FeatureLabel)),\r\n                    new SelectableNamedObject<GameField>(GameField.Platforms, ResourceProvider.GetString(LOC.PlatformTitle)),\r\n                    new SelectableNamedObject<GameField>(GameField.Genres, ResourceProvider.GetString(LOC.GenreLabel)),\r\n                    new SelectableNamedObject<GameField>(GameField.Developers, ResourceProvider.GetString(LOC.DeveloperLabel)),\r\n                    new SelectableNamedObject<GameField>(GameField.Publishers, ResourceProvider.GetString(LOC.PublisherLabel)),\r\n                    new SelectableNamedObject<GameField>(GameField.Series, ResourceProvider.GetString(LOC.SeriesLabel)),\r\n                    new SelectableNamedObject<GameField>(GameField.AgeRatings, ResourceProvider.GetString(LOC.AgeRatingLabel)),\r\n                    new SelectableNamedObject<GameField>(GameField.Regions, ResourceProvider.GetString(LOC.RegionLabel)),\r\n                    new SelectableNamedObject<GameField>(GameField.Source, ResourceProvider.GetString(LOC.SourceLabel)),\r\n                },\r\n                out var selectedField);\r\n            if (selected)\r\n            {\r\n                switch (selectedField)\r\n                {\r\n                    case GameField.CompletionStatus:\r\n                        SelectSingleAndSet(mainModel.Database.CompletionStatuses, LOC.CompletionStatuses, (val) => Game.CompletionStatusId = val, Game.CompletionStatusId);\r\n                        break;\r\n                    case GameField.Categories:\r\n                        SelectMultiAndSet(mainModel.Database.Categories, LOC.CategoriesLabel, (val) => Game.CategoryIds = val, Game.CategoryIds);\r\n                        break;\r\n                    case GameField.Tags:\r\n                        SelectMultiAndSet(mainModel.Database.Tags, LOC.TagsLabel, (val) => Game.TagIds = val, Game.TagIds);\r\n                        break;\r\n                    case GameField.Features:\r\n                        SelectMultiAndSet(mainModel.Database.Features, LOC.FeaturesLabel, (val) => Game.FeatureIds = val, Game.FeatureIds);\r\n                        break;\r\n                    case GameField.Platforms:\r\n                        SelectMultiAndSet(mainModel.Database.Platforms, LOC.PlatformsTitle, (val) => Game.PlatformIds = val, Game.PlatformIds);\r\n                        break;\r\n                    case GameField.Genres:\r\n                        SelectMultiAndSet(mainModel.Database.Genres, LOC.GenresLabel, (val) => Game.GenreIds = val, Game.GenreIds);\r\n                        break;\r\n                    case GameField.Developers:\r\n                        SelectMultiAndSet(mainModel.Database.Companies, LOC.DevelopersLabel, (val) => Game.DeveloperIds = val, Game.DeveloperIds);\r\n                        break;\r\n                    case GameField.Publishers:\r\n                        SelectMultiAndSet(mainModel.Database.Companies, LOC.PublishersLabel, (val) => Game.PublisherIds = val, Game.PublisherIds);\r\n                        break;\r\n                    case GameField.Series:\r\n                        SelectMultiAndSet(mainModel.Database.Series, LOC.SeriesLabel, (val) => Game.SeriesIds = val, Game.SeriesIds);\r\n                        break;\r\n                    case GameField.AgeRatings:\r\n                        SelectMultiAndSet(mainModel.Database.AgeRatings, LOC.AgeRatingsLabel, (val) => Game.AgeRatingIds = val, Game.AgeRatingIds);\r\n                        break;\r\n                    case GameField.Regions:\r\n                        SelectMultiAndSet(mainModel.Database.Regions, LOC.RegionsLabel, (val) => Game.RegionIds = val, Game.RegionIds);\r\n                        break;\r\n                    case GameField.Source:\r\n                        SelectSingleAndSet(mainModel.Database.Sources, LOC.SourceLabel, (val) => Game.SourceId = val, Game.SourceId);\r\n                        break;\r\n                    case GameField.UserScore:\r\n                        AssignScore(LOC.UserScore, (val) => Game.UserScore = val);\r\n                        break;\r\n                    default:\r\n                        throw new NotImplementedException();\r\n                }\r\n            }\r\n        }\r\n\r\n        public void OpenExtensions()\r\n        {\r\n            Close();\r\n            var vm = new ExtensionsMenuViewModels(new ExtensionsMenuWindowFactory(), mainModel, Game);\r\n            vm.OpenView();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/GameStatusViewModel.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class GameStatusViewModel : ObservableObject\r\n    {\r\n        private string gameStatusText;\r\n        public string GameStatusText\r\n        {\r\n            get => gameStatusText;\r\n            set\r\n            {\r\n                gameStatusText = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public GamesCollectionViewEntry Game { get; }\r\n\r\n        public GameStatusViewModel(GamesCollectionViewEntry game)\r\n        {\r\n            Game = game;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/HelpMenuViewModel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.FullscreenApp.Windows;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class HelpMenuViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        public FullscreenAppViewModel MainModel { get; }\r\n\r\n        public RelayCommand CloseCommand => new RelayCommand(() => Close());\r\n        public RelayCommand SendFeedbackCommand => new RelayCommand(() => SendFeedback());\r\n        public RelayCommand RestartAppCommand => new RelayCommand(() => RestartApp());\r\n        public RelayCommand RestartInSafeModeCommand => new RelayCommand(() => RestartInSafeMode());\r\n\r\n        public HelpMenuViewModel(\r\n            IWindowFactory window,\r\n            FullscreenAppViewModel mainModel)\r\n        {\r\n            this.window = window;\r\n            this.MainModel = mainModel;\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n            window.Close(true);\r\n        }\r\n\r\n        public void SendFeedback()\r\n        {\r\n            Close();\r\n            NavigateUrlCommand.Navigate(PlayniteEnvironment.ReleaseChannel == ReleaseChannel.Beta ? UrlConstants.IssuesTesting : UrlConstants.Issues);\r\n        }\r\n\r\n        public void RestartApp()\r\n        {\r\n            Close();\r\n            MainModel.RestartAppSkipLibUpdate();\r\n        }\r\n\r\n        public void RestartInSafeMode()\r\n        {\r\n            Close();\r\n            MainModel.RestartAppSafe();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/MainMenuViewModel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.FullscreenApp.Windows;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class MainMenuViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        public FullscreenAppViewModel MainModel { get; }\r\n\r\n        public RelayCommand CloseCommand => new RelayCommand(() => Close());\r\n        public RelayCommand ExitCommand => new RelayCommand(() => Shutdown());\r\n        public RelayCommand SwitchToDesktopCommand => new RelayCommand(() => SwitchToDesktopMode());\r\n        public RelayCommand OpenSettingsCommand => new RelayCommand(() => OpenSettings());\r\n        public RelayCommand SelectRandomGameCommand => new RelayCommand(() => PlayRandomGame(), () => MainModel.Database?.IsOpen == true);\r\n        public RelayCommand OpenPatreonCommand => new RelayCommand(() => OpenPatreon());\r\n        public RelayCommand OpenKofiCommand => new RelayCommand(() => OpenKofi());\r\n        public RelayCommand ShutdownSystemCommand => new RelayCommand(() => ShutdownSystem());\r\n        public RelayCommand HibernateSystemCommand => new RelayCommand(() => HibernateSystem());\r\n        public RelayCommand SleepSystemCommand => new RelayCommand(() => SleepSystem());\r\n        public RelayCommand RestartSystemCommand => new RelayCommand(() => RestartSystem());\r\n        public RelayCommand LockSystemCommand => new RelayCommand(() => LockSystem());\r\n        public RelayCommand LogoutUserCommand => new RelayCommand(() => LogoutUser());\r\n        public RelayCommand OpenClientsCommand => new RelayCommand(() => OpenClients());\r\n        public RelayCommand OpenToolsCommand => new RelayCommand(() => OpenTools());\r\n        public RelayCommand OpenExtensionsCommand => new RelayCommand(() => OpenExtensions());\r\n        public RelayCommand UpdateGamesCommand => new RelayCommand(async () =>\r\n        {\r\n            Close();\r\n            await MainModel.UpdateLibrary(MainModel.AppSettings.DownloadMetadataOnImport, true, true);\r\n        }, () => !MainModel.ProgressActive);\r\n        public RelayCommand CancelProgressCommand => new RelayCommand(() => CancelProgress(), () => GlobalTaskHandler.CancelToken?.IsCancellationRequested == false);\r\n        public RelayCommand OpenHelpCommand => new RelayCommand(() => OpenHelp());\r\n        public RelayCommand MinimizeCommand => new RelayCommand(() =>\r\n        {\r\n            Close();\r\n            MainModel.MinimizeWindow();\r\n        });\r\n\r\n        public MainMenuViewModel(\r\n            IWindowFactory window,\r\n            FullscreenAppViewModel mainModel)\r\n        {\r\n            this.window = window;\r\n            this.MainModel = mainModel;\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n            window.Close(true);\r\n        }\r\n\r\n        public void Shutdown()\r\n        {\r\n            Close();\r\n            MainModel.CloseView();\r\n            MainModel.App.Quit();\r\n        }\r\n\r\n        public void SwitchToDesktopMode()\r\n        {\r\n            Close();\r\n            MainModel.SwitchToDesktopMode();\r\n        }\r\n\r\n        public void CancelProgress()\r\n        {\r\n            Close();\r\n            MainModel.CancelProgress();\r\n        }\r\n\r\n        public void PlayRandomGame()\r\n        {\r\n            Close();\r\n            MainModel.SelectRandomGame();\r\n        }\r\n\r\n        public void OpenSettings()\r\n        {\r\n            Close();\r\n            var vm = new SettingsViewModel(new SettingsWindowFactory(), MainModel);\r\n            vm.OpenView();\r\n        }\r\n\r\n        public void OpenHelp()\r\n        {\r\n            Close();\r\n            var vm = new HelpMenuViewModel(new HelpMenuWindowFactory(), MainModel);\r\n            vm.OpenView();\r\n        }\r\n\r\n        public void OpenPatreon()\r\n        {\r\n            Close();\r\n            NavigateUrlCommand.Navigate(UrlConstants.Patreon);\r\n        }\r\n\r\n        public void OpenKofi()\r\n        {\r\n            Close();\r\n            NavigateUrlCommand.Navigate(UrlConstants.Kofi);\r\n        }\r\n\r\n        public void ShutdownSystem()\r\n        {\r\n            Close();\r\n            if (Dialogs.ShowMessage(LOC.ConfirumationAskGeneric, LOC.MenuShutdownSystem, MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (!PlayniteEnvironment.IsDebuggerAttached)\r\n            {\r\n                MainModel.App.QuitAndExecute(Computer.Shutdown);\r\n            }\r\n        }\r\n\r\n        public void HibernateSystem()\r\n        {\r\n            Close();\r\n            if (Dialogs.ShowMessage(LOC.ConfirumationAskGeneric, LOC.MenuHibernateSystem, MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (!PlayniteEnvironment.IsDebuggerAttached)\r\n            {\r\n                try\r\n                {\r\n                    Computer.Hibernate();\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    Dialogs.ShowErrorMessage(e.Message, \"\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void SleepSystem()\r\n        {\r\n            Close();\r\n            if (Dialogs.ShowMessage(LOC.ConfirumationAskGeneric, LOC.MenuSuspendSystem, MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (!PlayniteEnvironment.IsDebuggerAttached)\r\n            {\r\n                try\r\n                {\r\n                    Computer.Sleep();\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    Dialogs.ShowErrorMessage(e.Message, \"\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void RestartSystem()\r\n        {\r\n            Close();\r\n            if (Dialogs.ShowMessage(LOC.ConfirumationAskGeneric, LOC.MenuRestartSystem, MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (!PlayniteEnvironment.IsDebuggerAttached)\r\n            {\r\n                MainModel.App.QuitAndStart(Computer.RestartCmd.path, Computer.RestartCmd.args);\r\n            }\r\n        }\r\n\r\n        public void LockSystem()\r\n        {\r\n            Close();\r\n            if (Dialogs.ShowMessage(LOC.ConfirumationAskGeneric, LOC.MenuLockSystem, MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (!PlayniteEnvironment.IsDebuggerAttached)\r\n            {\r\n                try\r\n                {\r\n                    Computer.Lock();\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    Dialogs.ShowErrorMessage(e.Message, \"\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public void LogoutUser()\r\n        {\r\n            Close();\r\n            if (Dialogs.ShowMessage(LOC.ConfirumationAskGeneric, LOC.MenuLogoutUser, MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)\r\n            {\r\n                return;\r\n            }\r\n\r\n            if (!PlayniteEnvironment.IsDebuggerAttached)\r\n            {\r\n                try\r\n                {\r\n                    Computer.Logout();\r\n                    Shutdown();\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    Dialogs.ShowErrorMessage(e.Message, \"\");\r\n                }\r\n            }\r\n        }\r\n\r\n        public async void CancelLibraryUpdate()\r\n        {\r\n            await GlobalTaskHandler.CancelAndWaitAsync();\r\n        }\r\n\r\n        public void OpenClients()\r\n        {\r\n            Close();\r\n            var vm = new GameClientsMenuViewModel(new GameClientsMenuWindowFactory(), MainModel);\r\n            vm.OpenView();\r\n        }\r\n\r\n        public void OpenTools()\r\n        {\r\n            Close();\r\n            var vm = new SoftwareToolsMenuViewModel(new SoftwareToolsMenuWindowFactory(), MainModel);\r\n            vm.OpenView();\r\n        }\r\n\r\n        public void OpenExtensions()\r\n        {\r\n            Close();\r\n            var vm = new ExtensionsMenuViewModels(new ExtensionsMenuWindowFactory(), MainModel);\r\n            vm.OpenView();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/NotificationsViewModel.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.FullscreenApp.Windows;\r\nusing Playnite.SDK;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class NotificationsViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        public FullscreenAppViewModel MainModel { get; set; }\r\n\r\n        public RelayCommand CloseCommand => new RelayCommand(() => Close());\r\n        public RelayCommand ClearNotificationsCommand => new RelayCommand(() =>\r\n        {\r\n            MainModel.App.Notifications.RemoveAll();\r\n            Close();\r\n        });\r\n\r\n        public NotificationsViewModel(\r\n            IWindowFactory window,\r\n            FullscreenAppViewModel mainModel)\r\n        {\r\n            this.window = window;\r\n            MainModel = mainModel;\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            MainModel.App.Notifications.ActivationRequested += FullscreenAppViewModel_ActivationRequested;\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n            MainModel.App.Notifications.ActivationRequested -= FullscreenAppViewModel_ActivationRequested;\r\n            window.Close(true);\r\n        }\r\n\r\n        private void FullscreenAppViewModel_ActivationRequested(object sender, NotificationsAPI.MessageEventArgs e)\r\n        {\r\n            MainModel.App.Notifications.Remove(e.Message.Id);\r\n            Close();\r\n            e.Message.ActivationAction();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/SettingsViewModel.cs",
    "content": "﻿using Playnite.FullscreenApp.Controls.SettingsSections;\r\nusing Playnite.SDK;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class SettingsViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private readonly Dictionary<int, SettingsSectionControl> sectionViews;\r\n        private IInputElement oldFocus;\r\n        private List<string> editedFields = new List<string>();\r\n\r\n        private SettingsSectionControl selectedSectionView;\r\n        public SettingsSectionControl SelectedSectionView\r\n        {\r\n            get => selectedSectionView;\r\n            set\r\n            {\r\n                selectedSectionView = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(IsSubMenuOpened));\r\n            }\r\n        }\r\n\r\n        public bool IsSubMenuOpened { get => SelectedSectionView != null; }\r\n\r\n        private bool isMenuEnabled = true;\r\n        public bool IsMenuEnabled\r\n        {\r\n            get => isMenuEnabled;\r\n            set\r\n            {\r\n                isMenuEnabled = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string optionDescription;\r\n        public string OptionDescription\r\n        {\r\n            get => optionDescription;\r\n            set\r\n            {\r\n                optionDescription = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<KeyboardFocusChangedEventArgs> PreviewGotKeyboardFocusCommand\r\n        {\r\n            get => new RelayCommand<KeyboardFocusChangedEventArgs>((args) =>\r\n            {\r\n                PreviewGotKeyboardFocus(args);\r\n            });\r\n        }\r\n\r\n        public RelayCommand CloseCommand\r\n        {\r\n            get => new RelayCommand(() =>\r\n            {\r\n                Close();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<string> OpenSectionCommand\r\n        {\r\n            get => new RelayCommand<string>((a) => OpenSection(a));\r\n        }\r\n\r\n        public SettingsViewModel(\r\n            IWindowFactory window,\r\n            FullscreenAppViewModel mainModel)\r\n        {\r\n            this.window = window;\r\n            mainModel.AppSettings.Fullscreen.PropertyChanged += (_, e) => editedFields.AddMissing(e.PropertyName);\r\n            sectionViews = new Dictionary<int, SettingsSectionControl>()\r\n            {\r\n                { 0, new Controls.SettingsSections.General(mainModel) { DataContext = this } },\r\n                { 1, new Controls.SettingsSections.Visuals(mainModel) { DataContext = this } },\r\n                { 2, new Controls.SettingsSections.Layout(mainModel) { DataContext = this } },\r\n                { 3, new Controls.SettingsSections.Menus(mainModel) { DataContext = this } },\r\n                { 4, new Controls.SettingsSections.Input(mainModel) { DataContext = this } },\r\n                { 5, new Controls.SettingsSections.Audio(mainModel) { DataContext = this } },\r\n            };\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n            if (SelectedSectionView == null)\r\n            {\r\n                if (editedFields?.Any(a => typeof(FullscreenSettings).HasPropertyAttribute<RequiresRestartAttribute>(a)) == true)\r\n                {\r\n                    if (Dialogs.ShowMessage(\r\n                        LOC.SettingsRestartAskMessage, LOC.SettingsRestartTitle,\r\n                        MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)\r\n                    {\r\n                        PlayniteApplication.Current.Restart(new CmdLineOptions() { SkipLibUpdate = true });\r\n                    }\r\n                }\r\n\r\n                window.Close(true);\r\n            }\r\n            else\r\n            {\r\n                SelectedSectionView.Dispose();\r\n                SelectedSectionView = null;\r\n                IsMenuEnabled = true;\r\n                oldFocus?.Focus();\r\n            }\r\n        }\r\n\r\n        private void OpenSection(string section)\r\n        {\r\n            oldFocus = Keyboard.FocusedElement;\r\n            var sec = int.Parse(section);\r\n            IsMenuEnabled = false;\r\n            SelectedSectionView = sectionViews[sec];\r\n            SelectedSectionView.Focus();\r\n        }\r\n\r\n        private void PreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)\r\n        {\r\n            if (e.NewFocus is ComboBoxItem comboItem)\r\n            {\r\n                var cb = ItemsControl.ItemsControlFromItemContainer(comboItem) as ComboBox;\r\n                OptionDescription = cb?.Tag?.ToString();\r\n            }\r\n            else if (e.NewFocus is FrameworkElement frm)\r\n            {\r\n                OptionDescription = frm.Tag?.ToString();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/ViewModels/SoftwareToolsMenuViewModel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.FullscreenApp.Windows;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp.ViewModels\r\n{\r\n    public class SoftwareToolsMenuViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly IWindowFactory window;\r\n        private readonly AppSoftware noApp = new AppSoftware(LOC.NoItemsFound.GetLocalized());\r\n        public FullscreenAppViewModel MainModel { get; }\r\n        public List<AppSoftware> Tools { get; }\r\n\r\n        public RelayCommand CloseCommand => new RelayCommand(() => Close());\r\n        public RelayCommand<AppSoftware> OpenToolCommand => new RelayCommand<AppSoftware>((c) =>\r\n        {\r\n            Close();\r\n            if (c != noApp)\r\n                MainModel.StartSoftwareTool(c);\r\n        });\r\n\r\n        public SoftwareToolsMenuViewModel(\r\n            IWindowFactory window,\r\n            FullscreenAppViewModel mainModel)\r\n        {\r\n            this.window = window;\r\n            this.MainModel = mainModel;\r\n            Tools = mainModel.Database.SoftwareApps.OrderBy(a => a.Name).ToList();\r\n            if (Tools.Count == 0)\r\n                Tools = new List<AppSoftware> { noApp };\r\n        }\r\n\r\n        public bool? OpenView()\r\n        {\r\n            return window.CreateAndOpenDialog(this);\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n            window.Close(true);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/AddonsUpdateWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.AddonsUpdateWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:html=\"clr-namespace:TheArtOfDev.HtmlRenderer.WPF;assembly=HtmlRenderer.WPF\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding ConfirmCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding ConfirmCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\"/>\r\n                <ColumnDefinition Width=\"*\"/>\r\n                <ColumnDefinition Width=\"*\"/>\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"1*\"/>\r\n                <RowDefinition Height=\"2*\"/>\r\n                <RowDefinition Height=\"Auto\"/>\r\n                <RowDefinition Height=\"1*\"/>\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Background=\"{StaticResource ControlBackgroundDarkBrush}\" CornerRadius=\"3\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\">\r\n                <DockPanel>\r\n                    <TextBlock Text=\"{DynamicResource LOCAddonSelectToUpdate}\"\r\n                               Style=\"{StaticResource TextBlockBaseStyle}\"     \r\n                               Margin=\"20\" DockPanel.Dock=\"Top\"/>\r\n                    <pctrls:ItemsControlEx x:Name=\"ItemsNotes\" ItemsSource=\"{Binding UpdateAddonList}\"   \r\n                                          FocusVisualStyle=\"{x:Null}\" DockPanel.Dock=\"Top\"\r\n                                          Focusable=\"False\"\r\n                                          KeyboardNavigation.DirectionalNavigation=\"Once\">\r\n                        <ItemsControl.Template>\r\n                            <ControlTemplate>\r\n                                <ScrollViewer Focusable=\"False\"\r\n                                            HorizontalScrollBarVisibility=\"Disabled\"\r\n                                            VerticalScrollBarVisibility=\"Auto\"\r\n                                            CanContentScroll=\"True\">\r\n                                    <ItemsPresenter />\r\n                                </ScrollViewer>\r\n                            </ControlTemplate>\r\n                        </ItemsControl.Template>\r\n                        <ItemsControl.ItemTemplate>\r\n                            <DataTemplate>\r\n                                <pctrls:CheckBoxEx IsChecked=\"{Binding Selected}\"\r\n                                                    Margin=\"5\">\r\n                                    <pctrls:CheckBoxEx.Content>\r\n                                        <StackPanel DockPanel.Dock=\"Left\" Margin=\"5,0,0,0\">\r\n                                            <TextBlock Text=\"{Binding Item.Name}\" Margin=\"0,5,5,5\"\r\n                                                       Style=\"{StaticResource TextBlockBaseStyle}\"/>\r\n                                            <TextBlock Text=\"{Binding UpdateInfo}\" Margin=\"0,0,0,0\"\r\n                                                       FontSize=\"{StaticResource FontSizeSmall}\">\r\n                                                <TextBlock.Style>\r\n                                                    <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource TextBlockBaseStyle}\">\r\n                                                        <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                                                        <Style.Triggers>\r\n                                                            <DataTrigger Binding=\"{Binding Status}\" Value=\"0\">\r\n                                                                <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                                                            </DataTrigger>\r\n                                                        </Style.Triggers>\r\n                                                    </Style>\r\n                                                </TextBlock.Style>\r\n                                            </TextBlock>\r\n                                            <TextBlock Text=\"{Binding Status, Converter={StaticResource ObjectToStringConverter}}\"\r\n                                                       VerticalAlignment=\"Center\" Margin=\"0,0,0,0\">\r\n                                                <TextBlock.Style>\r\n                                                    <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource TextBlockBaseStyle}\">\r\n                                                        <Style.Triggers>\r\n                                                            <DataTrigger Binding=\"{Binding Status}\" Value=\"2\">\r\n                                                                <Setter Property=\"Foreground\" Value=\"{DynamicResource WarningBrush}\" />\r\n                                                            </DataTrigger>\r\n                                                            <DataTrigger Binding=\"{Binding Status}\" Value=\"3\">\r\n                                                                <Setter Property=\"Foreground\" Value=\"{DynamicResource WarningBrush}\" />\r\n                                                            </DataTrigger>\r\n                                                            <DataTrigger Binding=\"{Binding Status}\" Value=\"0\">\r\n                                                                <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                                                            </DataTrigger>\r\n                                                        </Style.Triggers>\r\n                                                    </Style>\r\n                                                </TextBlock.Style>\r\n                                            </TextBlock>\r\n                                        </StackPanel>\r\n                                    </pctrls:CheckBoxEx.Content>\r\n                                </pctrls:CheckBoxEx>\r\n                            </DataTemplate>\r\n                        </ItemsControl.ItemTemplate>\r\n                    </pctrls:ItemsControlEx>\r\n                </DockPanel>\r\n            </Border>\r\n            <Border Grid.Column=\"1\" Grid.Row=\"2\"\r\n                    Background=\"{StaticResource ControlBackgroundDarkBrush}\" CornerRadius=\"3\">\r\n                <DockPanel LastChildFill=\"False\" Margin=\"20\">\r\n                    <pctrls:ButtonEx x:Name=\"ButtonClose\" Content=\"{DynamicResource LOCCloseLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                            Style=\"{StaticResource MessageBoxButton}\"\r\n                            Command=\"{Binding ConfirmCommand}\" />\r\n                    <pctrls:ButtonEx x:Name=\"ButtonInstall\" Content=\"{DynamicResource LOCAddonUpdateAddons}\" DockPanel.Dock=\"Right\"\r\n                            pbeh:FocusBahaviors.OnVisibilityFocus=\"True\"\r\n                            Style=\"{StaticResource MessageBoxButton}\"\r\n                            Command=\"{Binding UpdateAddonsCommand}\"/>\r\n                </DockPanel>\r\n            </Border>\r\n        </Grid>            \r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/AddonsUpdateWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public class AddonsUpdateWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new AddonsUpdateWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for UpdateWindow.xaml\r\n    /// </summary>\r\n    public partial class AddonsUpdateWindow : WindowBase\r\n    {\r\n        public AddonsUpdateWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/CrashWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.CrashWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\"/>\r\n                <ColumnDefinition Width=\"2*\"/>\r\n                <ColumnDefinition Width=\"*\"/>\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\"/>\r\n                <RowDefinition Height=\"Auto\"/>\r\n                <RowDefinition Height=\"*\"/>\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Background=\"{StaticResource ControlBackgroundDarkBrush}\" CornerRadius=\"3\"\r\n                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\">\r\n                <StackPanel Margin=\"30\">\r\n                    <TextBlock Text=\"{DynamicResource LOCCrashDescriptionFullscreen}\"\r\n                               Style=\"{StaticResource TextBlockBaseStyle}\"\r\n                               VerticalAlignment=\"Center\" Margin=\"5,0,5,25\"\r\n                               TextWrapping=\"Wrap\" Foreground=\"{StaticResource TextBrush}\" />\r\n                    <DockPanel LastChildFill=\"False\">\r\n                        <pctrls:ButtonEx Content=\"{DynamicResource LOCAboutSendDiagButton}\"  \r\n                                Style=\"{StaticResource MessageBoxButton}\"\r\n                                Command=\"{Binding CreateDiagPackageCommand}\"\r\n                                x:Name=\"ButtonGeneratePackage\" />\r\n                        <pctrls:ButtonEx Content=\"{DynamicResource LOCCrashRestartPlaynite}\"                       \r\n                                Style=\"{StaticResource MessageBoxButton}\"\r\n                                Command=\"{Binding RestartCommand}\"\r\n                                x:Name=\"ButtonRestart\" />\r\n                        <pctrls:ButtonEx Content=\"{DynamicResource LOCCrashRestartSafe}\"  \r\n                                TooltipEx=\"{DynamicResource LOCCrashRestartSafeTooltip}\"                     \r\n                                Style=\"{StaticResource MessageBoxButton}\"\r\n                                Command=\"{Binding RestartSafeCommand}\"\r\n                                DockPanel.Dock=\"Right\"/>\r\n                    </DockPanel>\r\n                </StackPanel>\r\n\r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/CrashWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for CrashWindow.xaml\r\n    /// </summary>\r\n    public partial class CrashWindow : WindowBase\r\n    {\r\n        public CrashWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n            Loaded += CrashWindow_Loaded;\r\n        }\r\n\r\n        private void CrashWindow_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            ButtonGeneratePackage.Focus();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/ExtensionCrashWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.ExtensionCrashWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\"/>\r\n                <ColumnDefinition Width=\"2*\"/>\r\n                <ColumnDefinition Width=\"*\"/>\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\"/>\r\n                <RowDefinition Height=\"Auto\"/>\r\n                <RowDefinition Height=\"*\"/>\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Background=\"{StaticResource ControlBackgroundDarkBrush}\" CornerRadius=\"3\"\r\n                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\">\r\n                <StackPanel Margin=\"30\">\r\n                    <TextBlock Text=\"{Binding ExtCrashDescription}\"\r\n                               Style=\"{StaticResource TextBlockBaseStyle}\"\r\n                               VerticalAlignment=\"Center\" Margin=\"5,0,0,25\"\r\n                               TextWrapping=\"Wrap\" Foreground=\"{StaticResource TextBrush}\" />\r\n                    <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Left\">\r\n                        <pctrls:ButtonEx Content=\"{DynamicResource LOCCrashRestartPlaynite}\"                       \r\n                                Style=\"{StaticResource MessageBoxButton}\"\r\n                                Command=\"{Binding RestartCommand}\"\r\n                                x:Name=\"ButtonRestart\" />\r\n                        <pctrls:CheckBoxEx Content=\"{DynamicResource LOCCrashDisableExtension}\"\r\n                                           IsChecked=\"{Binding DisableExtension}\"\r\n                                           Visibility=\"{Binding ShowDisableCheck, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                           VerticalAlignment=\"Center\" Margin=\"20,0,0,0\"/>\r\n                    </StackPanel>\r\n                </StackPanel>\r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/ExtensionCrashWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for CrashWindow.xaml\r\n    /// </summary>\r\n    public partial class ExtensionCrashWindow : WindowBase\r\n    {\r\n        public ExtensionCrashWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n            Loaded += CrashWindow_Loaded;\r\n        }\r\n\r\n        private void CrashWindow_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            ButtonRestart.Focus();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/ExtensionsMenuWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.ExtensionsMenuWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\"\r\n        Name=\"WindowExtensionsMenuWindow\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CloseCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CloseCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CloseCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\" />\r\n                <ColumnDefinition Width=\"Auto\"/>\r\n                <ColumnDefinition Width=\"*\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\" />\r\n                <RowDefinition Height=\"6*\" />\r\n                <RowDefinition Height=\"*\" />\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Style=\"{DynamicResource ExtensionsBorder}\"\r\n                    Width=\"500\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\"\r\n                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\r\n                <DockPanel>\r\n                    <pctrls:ItemsControlEx x:Name=\"PART_ItemsHost\" Focusable=\"False\"\r\n                                           KeyboardNavigation.DirectionalNavigation=\"Cycle\"\r\n                                           LayoutUpdated=\"PART_ItemsHost_LayoutUpdated\"\r\n                                           ItemsSource=\"{Binding Items}\" \r\n                                           DockPanel.Dock=\"Top\">\r\n                        <ItemsControl.ItemTemplate>\r\n                            <DataTemplate>\r\n                                <pctrls:ButtonEx MaxWidth=\"500\"\r\n                                                 Content=\"{Binding}\"\r\n                                                 Command=\"{Binding Command}\"\r\n                                                 CommandParameter=\"{Binding CommandParameter}\"\r\n                                                 Style=\"{DynamicResource ExtensionMenuButton}\"/>\r\n                            </DataTemplate>\r\n                        </ItemsControl.ItemTemplate>\r\n                        <ItemsControl.Template>\r\n                            <ControlTemplate>\r\n                                <ScrollViewer Focusable=\"False\"\r\n                                              KeyboardNavigation.DirectionalNavigation=\"None\"\r\n                                              HorizontalScrollBarVisibility=\"Disabled\"\r\n                                              VerticalScrollBarVisibility=\"Auto\"\r\n                                              CanContentScroll=\"True\">\r\n                                    <ItemsPresenter />\r\n                                </ScrollViewer>\r\n                            </ControlTemplate>\r\n                        </ItemsControl.Template>\r\n                        <ItemsControl.ItemsPanel>\r\n                            <ItemsPanelTemplate>\r\n                                <VirtualizingStackPanel IsVirtualizing=\"True\"\r\n                                                        VirtualizationMode=\"Recycling\" />\r\n                            </ItemsPanelTemplate>\r\n                        </ItemsControl.ItemsPanel>\r\n                    </pctrls:ItemsControlEx>\r\n                </DockPanel>\r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/ExtensionsMenuWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.FullscreenApp.Controls;\r\nusing Playnite.FullscreenApp.ViewModels;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\nusing System.Windows.Threading;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public class ExtensionsMenuWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new ExtensionsMenuWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for UpdateWindow.xaml\r\n    /// </summary>\r\n    public partial class ExtensionsMenuWindow : WindowBase\r\n    {\r\n        private object lastUpdatedSource = null;\r\n\r\n        public ExtensionsMenuWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n\r\n        // This is practically the only place where we can refocus new items\r\n        // afters virtualized panel finished making new buttons after items list change.\r\n        private void PART_ItemsHost_LayoutUpdated(object sender, EventArgs e)\r\n        {\r\n            if (lastUpdatedSource == PART_ItemsHost.ItemsSource)\r\n                return;\r\n\r\n            lastUpdatedSource = PART_ItemsHost.ItemsSource;\r\n            var button = ElementTreeHelper.FindVisualChildren<ButtonEx>(PART_ItemsHost).FirstOrDefault();\r\n            if (button != null && !button.IsFocused)\r\n                button.Focus();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/GameClientsMenuWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.GameClientsMenuWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\"\r\n        Name=\"WindowGameClientsMenuWindow\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CloseCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CloseCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CloseCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\" />\r\n                <ColumnDefinition Width=\"Auto\"/>\r\n                <ColumnDefinition Width=\"*\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\" />\r\n                <RowDefinition Height=\"6*\" />\r\n                <RowDefinition Height=\"*\" />\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Style=\"{DynamicResource GameClientsBorder}\"\r\n                    Width=\"500\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\"\r\n                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\r\n                <DockPanel>\r\n                    <pctrls:ItemsControlEx x:Name=\"PART_ItemsHost\" Focusable=\"False\"\r\n                                           KeyboardNavigation.DirectionalNavigation=\"Once\"\r\n                                           pbeh:FocusBahaviors.FocusBinding=\"True\"\r\n                                           DockPanel.Dock=\"Top\"\r\n                                           ItemsSource=\"{Binding Clients}\">\r\n                        <ItemsControl.ItemTemplate>\r\n                            <DataTemplate>\r\n                                <pctrls:ButtonEx MaxWidth=\"500\"\r\n                                                 Content=\"{Binding}\"\r\n                                                 Command=\"{Binding DataContext.OpenClientCommand, RelativeSource={RelativeSource AncestorType=c:WindowBase}}\"\r\n                                                 CommandParameter=\"{Binding}\"\r\n                                                 Style=\"{DynamicResource GameClientMenuButton}\"/>\r\n                            </DataTemplate>\r\n                        </ItemsControl.ItemTemplate>\r\n                        <ItemsControl.Template>\r\n                            <ControlTemplate>\r\n                                <ScrollViewer Focusable=\"False\"\r\n                                              KeyboardNavigation.DirectionalNavigation=\"None\"\r\n                                              HorizontalScrollBarVisibility=\"Disabled\"\r\n                                              VerticalScrollBarVisibility=\"Auto\"\r\n                                              CanContentScroll=\"True\">\r\n                                    <ItemsPresenter />\r\n                                </ScrollViewer>\r\n                            </ControlTemplate>\r\n                        </ItemsControl.Template>\r\n                        <ItemsControl.ItemsPanel>\r\n                            <ItemsPanelTemplate>\r\n                                <VirtualizingStackPanel IsVirtualizing=\"True\"\r\n                                                        VirtualizationMode=\"Recycling\" />\r\n                            </ItemsPanelTemplate>\r\n                        </ItemsControl.ItemsPanel>\r\n                    </pctrls:ItemsControlEx>\r\n                </DockPanel>\r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/GameClientsMenuWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\nusing System.Windows.Threading;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public class GameClientsMenuWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new GameClientsMenuWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for UpdateWindow.xaml\r\n    /// </summary>\r\n    public partial class GameClientsMenuWindow : WindowBase\r\n    {\r\n        public GameClientsMenuWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/GameMenuWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.GameMenuWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.FullscreenApp.Markup\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n    \r\n    <c:WindowBase.InputBindings>\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CloseCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CloseCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CloseCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n    \r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\" />\r\n                <ColumnDefinition Width=\"Auto\" />\r\n                <ColumnDefinition Width=\"*\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\" />\r\n                <RowDefinition Height=\"3*\" />\r\n                <RowDefinition Height=\"*\" />\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Style=\"{DynamicResource GameMenuBorder}\"\r\n                    MinWidth=\"400\" Width=\"Auto\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\"\r\n                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\r\n                <DockPanel>\r\n                    <ContentControl Focusable=\"False\" DockPanel.Dock=\"Top\"\r\n                                    Content=\"{Binding Game}\"\r\n                                    ContentTemplate=\"{DynamicResource GameMenuHeaderTemplate}\" />\r\n                    <pctrls:ItemsControlEx x:Name=\"PART_ItemsHost\" Focusable=\"False\"\r\n                                           KeyboardNavigation.DirectionalNavigation=\"Once\"\r\n                                           pbeh:FocusBahaviors.FocusBinding=\"True\"\r\n                                           ItemsSource=\"{Binding GameItems}\">\r\n                        <ItemsControl.ItemTemplate>\r\n                            <DataTemplate>\r\n                                <pctrls:ButtonEx Content=\"{Binding Title}\"\r\n                                                 Command=\"{Binding Command}\"\r\n                                                 ContentTemplate=\"{Binding Template}\"\r\n                                                 CommandParameter=\"{Binding CommandParameter}\"\r\n                                                 Style=\"{DynamicResource GameMenuButton}\" />\r\n                            </DataTemplate>\r\n                        </ItemsControl.ItemTemplate>\r\n                        <ItemsControl.Template>\r\n                            <ControlTemplate>\r\n                                <ScrollViewer Focusable=\"False\"\r\n                                              KeyboardNavigation.DirectionalNavigation=\"None\"\r\n                                              HorizontalScrollBarVisibility=\"Disabled\"\r\n                                              VerticalScrollBarVisibility=\"Auto\"\r\n                                              CanContentScroll=\"True\">\r\n                                    <ItemsPresenter />\r\n                                </ScrollViewer>\r\n                            </ControlTemplate>\r\n                        </ItemsControl.Template>\r\n                    </pctrls:ItemsControlEx>\r\n                </DockPanel>\r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/GameMenuWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public class GameMenuWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new GameMenuWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for GameMenuWindow.xaml\r\n    /// </summary>\r\n    public partial class GameMenuWindow : WindowBase\r\n    {\r\n        public GameMenuWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/HelpMenuWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.HelpMenuWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.FullscreenApp.Markup\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CloseCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CloseCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CloseCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\" />\r\n                <ColumnDefinition MinWidth=\"400\" Width=\"Auto\" />\r\n                <ColumnDefinition Width=\"100\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\" />\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Grid.Column=\"1\"\r\n                    KeyboardNavigation.TabNavigation=\"Cycle\"\r\n                    KeyboardNavigation.DirectionalNavigation=\"Cycle\"\r\n                    Style=\"{DynamicResource HelpMenuBorder}\">\r\n                <StackPanel>\r\n                    <StackPanel.Resources>\r\n                        <Style TargetType=\"pctrls:ButtonEx\" BasedOn=\"{StaticResource HelpMenuButton}\" />\r\n                    </StackPanel.Resources>\r\n\r\n                    <ContentControl ContentTemplate=\"{DynamicResource HelpMenuHeaderTemplate}\"\r\n                                    Focusable=\"False\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\" />\r\n\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonRestartPlaynite\"\r\n                                     ContentTemplate=\"{DynamicResource HelpMenuRestartPlayniteButtonTemplate}\"\r\n                                     Command=\"{Binding RestartAppCommand}\"\r\n                                     pbeh:FocusBahaviors.OnVisibilityFocus=\"True\" />\r\n\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonSafeMode\"\r\n                                     ContentTemplate=\"{DynamicResource HelpMenuSafeModeButtonTemplate}\"\r\n                                     Command=\"{Binding RestartInSafeModeCommand}\" />\r\n\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonFeedback\"\r\n                                     ContentTemplate=\"{DynamicResource HelpMenuFeedbackButtonTemplate}\"\r\n                                     Command=\"{Binding SendFeedbackCommand}\" />\r\n                </StackPanel>\r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/HelpMenuWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public class HelpMenuWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new HelpMenuWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for HelpMenuWindowMenuWindow.xaml\r\n    /// </summary>\r\n    public partial class HelpMenuWindow : WindowBase\r\n    {\r\n        public HelpMenuWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/LicenseAgreementWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.LicenseAgreementWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:html=\"clr-namespace:TheArtOfDev.HtmlRenderer.WPF;assembly=HtmlRenderer.WPF\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding DeclineCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding DeclineCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"1*\"/>\r\n                <ColumnDefinition Width=\"1*\"/>\r\n                <ColumnDefinition Width=\"1*\"/>\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"1*\"/>\r\n                <RowDefinition Height=\"2*\"/>\r\n                <RowDefinition Height=\"Auto\"/>\r\n                <RowDefinition Height=\"1*\"/>\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Background=\"{StaticResource ControlBackgroundDarkBrush}\" CornerRadius=\"3\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\">\r\n                <DockPanel>\r\n                    <TextBlock Text=\"{Binding LicenseTitle}\" TextWrapping=\"Wrap\"\r\n                               Style=\"{StaticResource TextBlockBaseStyle}\"     \r\n                               Margin=\"20\" DockPanel.Dock=\"Top\"/>\r\n                    <pctrls:ScrollViewerEx DockPanel.Dock=\"Top\" Margin=\"10\">\r\n                        <TextBlock TextWrapping=\"Wrap\" Text=\"{Binding License}\"\r\n                                   Style=\"{DynamicResource TextBlockBaseStyle}\"\r\n                                   FocusVisualStyle=\"{x:Null}\"\r\n                                   Focusable=\"True\"/>\r\n                    </pctrls:ScrollViewerEx>\r\n                </DockPanel>\r\n            </Border>\r\n            <Border Grid.Column=\"1\" Grid.Row=\"2\"\r\n                    Background=\"{StaticResource ControlBackgroundDarkBrush}\" CornerRadius=\"3\">\r\n                <StackPanel Orientation=\"Horizontal\" Margin=\"20\" HorizontalAlignment=\"Center\">\r\n                    <pctrls:ButtonEx x:Name=\"ButtonAccept\" Content=\"{DynamicResource LOCLicenseAccept}\" DockPanel.Dock=\"Right\"\r\n                            pbeh:FocusBahaviors.OnVisibilityFocus=\"True\"\r\n                            Style=\"{StaticResource MessageBoxButton}\"\r\n                            Command=\"{Binding AcceptCommnad}\"/>\r\n                    <pctrls:ButtonEx x:Name=\"ButtonDecline\" Content=\"{DynamicResource LOCLicenseDecline}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                            Style=\"{StaticResource MessageBoxButton}\"\r\n                            Command=\"{Binding DeclineCommand}\" />\r\n                </StackPanel>\r\n            </Border>\r\n        </Grid>            \r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/LicenseAgreementWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for UpdateWindow.xaml\r\n    /// </summary>\r\n    public partial class LicenseAgreementWindow : WindowBase\r\n    {\r\n        public LicenseAgreementWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/MainMenuWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.MainMenuWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.FullscreenApp.Markup\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CloseCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CloseCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CloseCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\" />\r\n                <ColumnDefinition MinWidth=\"400\" Width=\"Auto\" />\r\n                <ColumnDefinition Width=\"100\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\" />\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Grid.Column=\"1\"\r\n                    KeyboardNavigation.TabNavigation=\"Cycle\"\r\n                    KeyboardNavigation.DirectionalNavigation=\"Cycle\"\r\n                    Style=\"{DynamicResource MainMenuBorder}\">\r\n                <StackPanel>\r\n                    <StackPanel.Resources>\r\n                        <Style TargetType=\"pctrls:ButtonEx\" BasedOn=\"{StaticResource MainMenuButton}\" />\r\n                    </StackPanel.Resources>\r\n\r\n                    <ContentControl ContentTemplate=\"{DynamicResource MainMenuHeaderTemplate}\"\r\n                                    Focusable=\"False\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\" />\r\n\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonPickRandomGame\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuRandomGameButtonTemplate}\"\r\n                                     Command=\"{Binding SelectRandomGameCommand}\"\r\n                                     pbeh:FocusBahaviors.OnVisibilityFocus=\"True\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuSelectRandomGame}\"/>\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonUpdateLibrary\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuLibUpdateButtonTemplate}\"\r\n                                     Command=\"{Binding UpdateGamesCommand}\"\r\n                                     Visibility=\"{Binding MainModel.ProgressActive, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuReloadLibrary}\"/>\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonCancelLibraryUpdate\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuCancelLibUpdateButtonTemplate}\"\r\n                                     Command=\"{Binding CancelProgressCommand}\"\r\n                                     Visibility=\"{Binding MainModel.ProgressActive, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuCancelLibraryUpdate}\"/>\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonSettings\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuSettingsButtonTemplate}\"\r\n                                     Command=\"{Binding OpenSettingsCommand}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCSettingsLabel}\"/>\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonClients\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuClientsButtonTemplate}\"\r\n                                     Command=\"{Binding OpenClientsCommand}\"\r\n                                     Visibility=\"{pmrk:SettingsBinding Fullscreen.MainMenuShowClients, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuOpenClient}\"/>\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonTools\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuToolsButtonTemplate}\"\r\n                                     Command=\"{Binding OpenToolsCommand}\"\r\n                                     Visibility=\"{pmrk:SettingsBinding Fullscreen.MainMenuShowTools, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuTools}\"/>\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonExtensions\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuExtensionsButtonTemplate}\"\r\n                                     Visibility=\"{pmrk:SettingsBinding Fullscreen.MainMenuShowExtensions, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                     Command=\"{Binding OpenExtensionsCommand}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCExtensions}\"/>\r\n                    <Canvas Height=\"20\" />\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonExitPlaynite\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuExitPlayniteButtonTemplate}\"\r\n                                     Command=\"{Binding ExitCommand}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCExitPlaynite}\" />\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonSwitchToDesktop\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuSwithDesktopButtonTemplate}\"\r\n                                     Command=\"{Binding SwitchToDesktopCommand}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCBackToDesktopMode}\"  />\r\n                    <Canvas Height=\"20\" />\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonShutdownSystem\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuShutdowButtonTemplate}\"\r\n                                     Command=\"{Binding ShutdownSystemCommand}\"\r\n                                     Visibility=\"{pmrk:SettingsBinding Fullscreen.MainMenuShowShutdown, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuShutdownSystem}\"/>\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonSleepSystem\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuSuspendButtonTemplate}\"\r\n                                     Command=\"{Binding SleepSystemCommand}\"\r\n                                     Visibility=\"{pmrk:SettingsBinding Fullscreen.MainMenuShowSuspend, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuSuspendSystem}\" />\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonHibernateSystem\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuHibernateButtonTemplate}\"\r\n                                     Command=\"{Binding HibernateSystemCommand}\"\r\n                                     Visibility=\"{pmrk:SettingsBinding Fullscreen.MainMenuShowHibernate, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuHibernateSystem}\" />\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonRestartSystem\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuRestartButtonTemplate}\"\r\n                                     Command=\"{Binding RestartSystemCommand}\"\r\n                                     Visibility=\"{pmrk:SettingsBinding Fullscreen.MainMenuShowRestart, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuRestartSystem}\"/>\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonLockSystem\"\r\n                                  ContentTemplate=\"{DynamicResource MainMenuLockSystemButtonTemplate}\"\r\n                                  Command=\"{Binding LockSystemCommand}\"\r\n                                  Visibility=\"{pmrk:SettingsBinding Fullscreen.MainMenuShowLock, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                  AutomationProperties.Name=\"{DynamicResource LOCMenuRestartSystem}\"/>\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonLogoutUser\"\r\n                                  ContentTemplate=\"{DynamicResource MainMenuLogoutUserButtonTemplate}\"\r\n                                  Command=\"{Binding LogoutUserCommand}\"\r\n                                  Visibility=\"{pmrk:SettingsBinding Fullscreen.MainMenuShowLogout, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                  AutomationProperties.Name=\"{DynamicResource LOCMenuRestartSystem}\"/>\r\n\r\n                    <Canvas Height=\"40\" />\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonFeedback\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuHelpButtonTemplate}\"\r\n                                     Command=\"{Binding OpenHelpCommand}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuHelpTitle}\" />\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonPatreon\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuPatreonButtonTemplate}\"\r\n                                     Command=\"{Binding OpenPatreonCommand}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuPatreonSupport}\" />\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonKofi\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuKofiButtonTemplate}\"\r\n                                     Command=\"{Binding OpenKofiCommand}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMenuKofiSupport}\" />\r\n                    <pctrls:ButtonEx x:Name=\"PART_ButtonMinimize\"\r\n                                     ContentTemplate=\"{DynamicResource MainMenuMinimizeButtonTemplate}\"\r\n                                     Command=\"{Binding MinimizeCommand}\"                                     \r\n                                     Visibility=\"{pmrk:SettingsBinding Fullscreen.MainMenuShowMinimize, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCMinimize}\" />\r\n                </StackPanel>\r\n            </Border>\r\n\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/MainMenuWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public class MainMenuWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new MainMenuWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for MainMenuWindow.xaml\r\n    /// </summary>\r\n    public partial class MainMenuWindow : WindowBase\r\n    {\r\n        public MainMenuWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/MainWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.MainWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:views=\"clr-namespace:Playnite.FullscreenApp.Controls.Views\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.FullscreenApp.Markup\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:p=\"clr-namespace:Playnite;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource MainWindowStyle}\"\r\n        d:DesignStyle=\"{StaticResource MainWindowStyle}\"\r\n        Title=\"Playnite\"\r\n        Width=\"{Binding WindowWidth, Mode=TwoWay}\"\r\n        Height=\"{Binding WindowHeight, Mode=TwoWay}\"\r\n        Left=\"{Binding WindowLeft, Mode=TwoWay}\"             \r\n        Top=\"{Binding WindowTop, Mode=TwoWay}\"\r\n        d:DesignWidth=\"1920\"\r\n        d:DesignHeight=\"1080\"\r\n        ResizeMode=\"NoResize\"\r\n        AllowDrop=\"True\">\r\n    \r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"Closing\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding WindowClosingCommand}\" />\r\n        </i:EventTrigger>\r\n        <i:EventTrigger EventName=\"GotKeyboardFocus\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding WindowGotFocusCommand}\" />\r\n        </i:EventTrigger>\r\n        <i:EventTrigger EventName=\"Drop\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding FileDroppedCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <KeyBinding Gesture=\"ALT+ENTER\" Command=\"{Binding ToggleFullscreenCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <views:Main Focusable=\"False\" />\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/MainWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n\r\n    public class MainWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new MainWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for MainWindow.xaml\r\n    /// </summary>\r\n    public partial class MainWindow : WindowBase\r\n    {\r\n        public MainWindow() : base()\r\n        {            \r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/MessageBoxWindow.xaml",
    "content": "﻿<controls:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.MessageBoxWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:controls=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        x:Name=\"WindowMessageBox\"                     \r\n        Title=\"{Binding Caption, ElementName=WindowMessageBox}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">    \r\n    <controls:WindowBase.Resources>\r\n        <BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n    </controls:WindowBase.Resources>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"2*\" />\r\n                <ColumnDefinition Width=\"3*\" />\r\n                <ColumnDefinition Width=\"2*\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\" />\r\n                <RowDefinition Height=\"Auto\" />\r\n                <RowDefinition Height=\"*\" />\r\n            </Grid.RowDefinitions>\r\n            <Border Style=\"{DynamicResource MessageBoxBorder}\"\r\n                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\">\r\n                <StackPanel Margin=\"30\">\r\n                    <TextBlock Text=\"{Binding Caption, ElementName=WindowMessageBox}\"\r\n                               Style=\"{StaticResource MessageBoxCaptionText}\"\r\n                               Visibility=\"{Binding Caption, ElementName=WindowMessageBox, Converter={pcon:StringNullOrEmptyToVisibilityConverter}}\"/>\r\n                    <TextBlock Text=\"{Binding Text, ElementName=WindowMessageBox}\"\r\n                               Style=\"{StaticResource MessageBoxMessageText}\"\r\n                               MaxWidth=\"900\" TextWrapping=\"Wrap\"/>\r\n                    <StackPanel Name=\"StackButtons\" Orientation=\"Horizontal\" Margin=\"0,25,0,0\"\r\n                                KeyboardNavigation.DirectionalNavigation=\"Contained\"\r\n                                HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\">\r\n                        <pctrls:ButtonEx Content=\"{DynamicResource LOCOKLabel}\" x:Name=\"ButtonOK\" Click=\"ButtonOK_Click\"\r\n                                Style=\"{StaticResource MessageBoxButton}\"\r\n                                Visibility=\"{Binding ShowOKButton, ElementName=WindowMessageBox, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n                        <pctrls:ButtonEx Content=\"{DynamicResource LOCYesLabel}\" x:Name=\"ButtonYes\" Click=\"ButtonYes_Click\"\r\n                                Style=\"{StaticResource MessageBoxButton}\"                                \r\n                                Visibility=\"{Binding ShowYesButton, ElementName=WindowMessageBox, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n                        <pctrls:ButtonEx Content=\"{DynamicResource LOCNoLabel}\" x:Name=\"ButtonNo\" Click=\"ButtonNo_Click\"\r\n                                Style=\"{StaticResource MessageBoxButton}\"                                \r\n                                Visibility=\"{Binding ShowNoButton, ElementName=WindowMessageBox, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n                        <pctrls:ButtonEx Content=\"{DynamicResource LOCCancelLabel}\" x:Name=\"ButtonCancel\" Click=\"ButtonCancel_Click\"\r\n                                Style=\"{StaticResource MessageBoxButton}\"                                \r\n                                Visibility=\"{Binding ShowCancelButton, ElementName=WindowMessageBox, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n                    </StackPanel>\r\n                </StackPanel>                \r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>\r\n</controls:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/MessageBoxWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.FullscreenApp.Controls;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public partial class MessageBoxWindow : WindowBase\r\n    {\r\n        private MessageBoxResult result;\r\n        private MessageBoxOption resultCustom;\r\n\r\n        private string text = string.Empty;\r\n        public string Text\r\n        {\r\n            get => text;\r\n            set\r\n            {\r\n                text = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string caption = string.Empty;\r\n        public string Caption\r\n        {\r\n            get => caption;\r\n            set\r\n            {\r\n                caption = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showOKButton = false;\r\n        public bool ShowOKButton\r\n        {\r\n            get => showOKButton;\r\n            set\r\n            {\r\n                showOKButton = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showYesButton = false;\r\n        public bool ShowYesButton\r\n        {\r\n            get => showYesButton;\r\n            set\r\n            {\r\n                showYesButton = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showNoButton = false;\r\n        public bool ShowNoButton\r\n        {\r\n            get => showNoButton;\r\n            set\r\n            {\r\n                showNoButton = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showCancelButton = false;\r\n        public bool ShowCancelButton\r\n        {\r\n            get => showCancelButton;\r\n            set\r\n            {\r\n                showCancelButton = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showInputField = false;\r\n        public bool ShowInputField\r\n        {\r\n            get => showInputField;\r\n            set\r\n            {\r\n                showInputField = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string inputText = string.Empty;\r\n        public string InputText\r\n        {\r\n            get => inputText;\r\n            set\r\n            {\r\n                inputText = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private MessageBoxImage displayIcon;\r\n        public MessageBoxImage DisplayIcon\r\n        {\r\n            get => displayIcon;\r\n            set\r\n            {\r\n                displayIcon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public MessageBoxWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n\r\n        public MessageBoxResult Show(Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options)\r\n        {\r\n            if (owner == null)\r\n            {\r\n                WindowStartupLocation = WindowStartupLocation.CenterScreen;\r\n            }\r\n\r\n            if (this != owner)\r\n            {\r\n                Height = owner.ActualHeight;\r\n                Width = owner.ActualWidth;\r\n                Owner = owner;\r\n            }\r\n\r\n            result = defaultResult;\r\n            SetStrings(messageBoxText, caption);\r\n            DisplayIcon = icon;\r\n\r\n            switch (button)\r\n            {\r\n                case MessageBoxButton.OK:\r\n                    ButtonOK.Focus();\r\n                    ShowOKButton = true;\r\n                    break;\r\n                case MessageBoxButton.OKCancel:\r\n                    ButtonOK.Focus();\r\n                    ShowOKButton = true;\r\n                    ShowCancelButton = true;\r\n                    break;\r\n                case MessageBoxButton.YesNoCancel:\r\n                    ButtonYes.Focus();\r\n                    ShowYesButton = true;\r\n                    ShowNoButton = true;\r\n                    ShowCancelButton = true;\r\n                    break;\r\n                case MessageBoxButton.YesNo:\r\n                    ButtonYes.Focus();\r\n                    ShowYesButton = true;\r\n                    ShowNoButton = true;\r\n                    break;\r\n                default:\r\n                    ShowOKButton = true;\r\n                    break;\r\n            }\r\n\r\n            if (ShowOKButton)\r\n            {\r\n                ButtonOK.Focus();\r\n            }\r\n\r\n            ShowDialog();\r\n            return result;\r\n        }\r\n\r\n        public MessageBoxOption ShowCustom(\r\n            Window owner,\r\n            string messageBoxText,\r\n            string caption,\r\n            MessageBoxImage icon,\r\n            List<MessageBoxOption> options)\r\n        {\r\n            if (owner == null)\r\n            {\r\n                WindowStartupLocation = WindowStartupLocation.CenterScreen;\r\n            }\r\n\r\n            if (this != owner)\r\n            {\r\n                Height = owner.ActualHeight;\r\n                Width = owner.ActualWidth;\r\n                Owner = owner;\r\n            }\r\n\r\n            SetStrings(messageBoxText, caption);\r\n            DisplayIcon = icon;\r\n            ShowOKButton = false;\r\n            ShowYesButton = false;\r\n            ShowNoButton = false;\r\n            ShowCancelButton = false;\r\n\r\n            ButtonEx toFocus = null;\r\n            foreach (var option in options)\r\n            {\r\n                var title = option.Title;\r\n                var button = new ButtonEx();\r\n                button.Content = title.StartsWith(\"LOC\", StringComparison.Ordinal) ? ResourceProvider.GetString(title) : title;\r\n                button.Style = ResourceProvider.GetResource(\"MessageBoxButton\") as Style;\r\n                button.Tag = option;\r\n                button.Click += (s, __) =>\r\n                {\r\n                    resultCustom = (s as ButtonEx).Tag as MessageBoxOption;\r\n                    Close();\r\n                };\r\n\r\n                StackButtons.Children.Add(button);\r\n                if (option.IsDefault)\r\n                {\r\n                    toFocus = button;\r\n                    toFocus.Focus();\r\n                }\r\n            }\r\n\r\n            if (toFocus == null)\r\n            {\r\n                StackButtons.Children[0].Focus();\r\n            }\r\n\r\n            ShowDialog();\r\n            return resultCustom;\r\n        }\r\n\r\n        private void SetStrings(string messageText, string messageCaption)\r\n        {\r\n            if (messageText?.StartsWith(\"LOC\", StringComparison.Ordinal) == true)\r\n            {\r\n                Text = ResourceProvider.GetString(messageText);\r\n            }\r\n            else\r\n            {\r\n                Text = messageText;\r\n            }\r\n\r\n            if (messageCaption?.StartsWith(\"LOC\", StringComparison.Ordinal) == true)\r\n            {\r\n                Caption = ResourceProvider.GetString(messageCaption);\r\n            }\r\n            else\r\n            {\r\n                Caption = messageCaption;\r\n            }\r\n        }\r\n\r\n        private void ButtonOK_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            result = MessageBoxResult.OK;\r\n            Close();\r\n        }\r\n\r\n        private void ButtonYes_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            result = MessageBoxResult.Yes;\r\n            Close();\r\n        }\r\n\r\n        private void ButtonNo_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            result = MessageBoxResult.No;\r\n            Close();\r\n        }\r\n\r\n        private void ButtonCancel_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            result = MessageBoxResult.Cancel;\r\n            Close();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/MultiItemSelectionWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.MultiItemSelectionWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\"\r\n        Name=\"WindowMultiItemSelectionWindow\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <pin:GameControllerInputBinding Button=\"Y\" Command=\"{Binding ToggleSelectionCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CancelCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"Start\" Command=\"{Binding ConfirmCommand}\" />\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CancelCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CancelCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\" />\r\n                <ColumnDefinition Width=\"Auto\"/>\r\n                <ColumnDefinition Width=\"*\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\" />\r\n                <RowDefinition Height=\"6*\" />\r\n                <RowDefinition Height=\"*\" />\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Style=\"{DynamicResource ItemSelectionBorder}\"\r\n                    Width=\"500\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\"\r\n                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\r\n                <DockPanel>\r\n                    <TextBlock Text=\"{Binding HeaderText}\"\r\n                               Style=\"{DynamicResource ItemSelectionHeaderText}\"\r\n                               DockPanel.Dock=\"Top\"/>\r\n                    <Border Style=\"{DynamicResource ItemSelectionFooterBorder}\" DockPanel.Dock=\"Bottom\">\r\n                        <StackPanel>\r\n                            <pctrls:ButtonEx Command=\"{Binding ConfirmCommand}\"\r\n                                             Style=\"{DynamicResource ItemSelectionFooterButton}\">\r\n                                <pctrls:ButtonEx.Content>\r\n                                    <StackPanel Orientation=\"Horizontal\">\r\n                                        <ContentControl ContentTemplate=\"{DynamicResource ButtonPromptStart}\" VerticalAlignment=\"Center\"\r\n                                                        Focusable=\"False\" Height=\"22\" Margin=\"0,0,15,0\"/>\r\n                                        <TextBlock Text=\"{DynamicResource LOCConfirmLabel}\" VerticalAlignment=\"Center\"                                           \r\n                                                   Style=\"{StaticResource TextBlockBaseStyle}\" />\r\n                                    </StackPanel>\r\n                                </pctrls:ButtonEx.Content>\r\n                            </pctrls:ButtonEx>\r\n                            <pctrls:ButtonEx Command=\"{Binding ToggleSelectionCommand}\"\r\n                                             Style=\"{DynamicResource ItemSelectionFooterButton}\">\r\n                                <pctrls:ButtonEx.Content>\r\n                                    <StackPanel Orientation=\"Horizontal\">\r\n                                        <ContentControl ContentTemplate=\"{DynamicResource ButtonPromptY}\" VerticalAlignment=\"Center\"\r\n                                                        Focusable=\"False\" Height=\"22\" Margin=\"0,0,15,0\"/>\r\n                                        <TextBlock Text=\"{DynamicResource LOCItemSelectionSelectDeselectAll}\" VerticalAlignment=\"Center\"                                           \r\n                                                   Style=\"{StaticResource TextBlockBaseStyle}\" />\r\n                                    </StackPanel>\r\n                                </pctrls:ButtonEx.Content>\r\n                            </pctrls:ButtonEx>\r\n                        </StackPanel>\r\n                    </Border>\r\n                    <pctrls:ItemsControlEx x:Name=\"PART_ItemsHost\" Focusable=\"False\"\r\n                                           KeyboardNavigation.DirectionalNavigation=\"Once\"\r\n                                           pbeh:FocusBahaviors.FocusBinding=\"True\"\r\n                                           DockPanel.Dock=\"Top\"\r\n                                           ItemsSource=\"{Binding Items}\">\r\n                        <ItemsControl.ItemTemplate>\r\n                            <DataTemplate>\r\n                                <pctrls:CheckBoxEx Content=\"{Binding Name}\"\r\n                                                   MaxWidth=\"500\"\r\n                                                   IsChecked=\"{Binding Selected}\"\r\n                                                   Style=\"{DynamicResource ItemSelectionCheckBox}\"/>\r\n                            </DataTemplate>\r\n                        </ItemsControl.ItemTemplate>\r\n                        <ItemsControl.Template>\r\n                            <ControlTemplate>\r\n                                <ScrollViewer Focusable=\"False\"\r\n                                              KeyboardNavigation.DirectionalNavigation=\"None\"\r\n                                              HorizontalScrollBarVisibility=\"Disabled\"\r\n                                              VerticalScrollBarVisibility=\"Auto\"\r\n                                              CanContentScroll=\"True\">\r\n                                    <ItemsPresenter />\r\n                                </ScrollViewer>\r\n                            </ControlTemplate>\r\n                        </ItemsControl.Template>\r\n                        <ItemsControl.ItemsPanel>\r\n                            <ItemsPanelTemplate>\r\n                                <VirtualizingStackPanel IsVirtualizing=\"True\"\r\n                                                        VirtualizationMode=\"Recycling\" />\r\n                            </ItemsPanelTemplate>\r\n                        </ItemsControl.ItemsPanel>\r\n                    </pctrls:ItemsControlEx>\r\n                </DockPanel>\r\n            </Border>\r\n        </Grid>            \r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/MultiItemSelectionWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for UpdateWindow.xaml\r\n    /// </summary>\r\n    public partial class MultiItemSelectionWindow : WindowBase\r\n    {\r\n        public MultiItemSelectionWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/NotificationsWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.NotificationsWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.FullscreenApp.Markup\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CloseCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CloseCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CloseCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\" />\r\n                <ColumnDefinition Width=\"440\" />\r\n                <ColumnDefinition Width=\"100\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\" />\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Grid.Column=\"1\"\r\n                    KeyboardNavigation.TabNavigation=\"Cycle\"\r\n                    KeyboardNavigation.DirectionalNavigation=\"Cycle\"\r\n                    Style=\"{DynamicResource NotificationsMenuBorder}\">\r\n                <StackPanel>\r\n                    <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Right\" Margin=\"30,30,40,30\">\r\n                        <TextBlock Text=\"{DynamicResource LOCNotifications}\"\r\n                                   Style=\"{DynamicResource NotificationsMenuHeaderText}\" />\r\n                        <TextBlock Text=\"&#xeea3;\" FontFamily=\"{StaticResource FontIcoFont}\"\r\n                                   VerticalAlignment=\"Center\"\r\n                                   HorizontalAlignment=\"Center\" Margin=\"2\"\r\n                                   Foreground=\"{DynamicResource TextBrush}\" FontSize=\"30\"/>\r\n                    </StackPanel>\r\n\r\n                    <pctrls:ButtonEx Content=\"{DynamicResource LOCDismissAll}\"\r\n                                     Command=\"{Binding ClearNotificationsCommand}\"\r\n                                     Style=\"{DynamicResource NotificationsMenuDismissButton}\"\r\n                                     pbeh:FocusBahaviors.OnVisibilityFocus=\"True\"/>\r\n\r\n                    <ItemsControl Focusable=\"False\"\r\n                                  ItemsSource=\"{Binding MainModel.App.Notifications.Messages}\">\r\n                        <ItemsControl.ItemTemplate>\r\n                            <DataTemplate>\r\n                                <pctrls:ButtonEx Style=\"{DynamicResource NotificationsMenuItemButton}\"\r\n                                                 Command=\"{Binding ActivateCommand}\">\r\n                                    <Button.Content>\r\n                                        <TextBlock Text=\"{Binding Text}\" TextWrapping=\"Wrap\"\r\n                                                   Style=\"{DynamicResource TextBlockBaseStyle}\" />\r\n                                    </Button.Content>\r\n                                </pctrls:ButtonEx>\r\n                            </DataTemplate>\r\n                        </ItemsControl.ItemTemplate>\r\n                    </ItemsControl>\r\n                </StackPanel>\r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/NotificationsWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public class NotificationsWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new NotificationsWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for NotificationsWindow.xaml\r\n    /// </summary>\r\n    public partial class NotificationsWindow : WindowBase\r\n    {\r\n        public NotificationsWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/ProgressWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.ProgressWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.FullscreenApp.Markup\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource ChildWindowStyle}\" BlockAltF4=\"True\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        Background=\"{StaticResource MainBackgourndBrush}\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"32\" />\r\n                <ColumnDefinition Width=\"1*\" />\r\n                <ColumnDefinition Width=\"{StaticResource ProgressWindowWidth}\" />\r\n                <ColumnDefinition Width=\"1*\" />\r\n                <ColumnDefinition Width=\"32\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"1*\" />\r\n                <RowDefinition Height=\"Auto\" />\r\n                <RowDefinition Height=\"Auto\" />\r\n                <RowDefinition Height=\"Auto\" />\r\n                <RowDefinition Height=\"Auto\" />\r\n                <RowDefinition Height=\"Auto\" />\r\n                <RowDefinition Height=\"1*\" />\r\n            </Grid.RowDefinitions>\r\n            <ContentControl Style=\"{StaticResource ProgressHeaderStyle}\" Grid.Column=\"2\" Grid.Row=\"1\"/>\r\n            <ContentControl Style=\"{StaticResource ProgressIndicator}\" Focusable=\"False\" Grid.Column=\"2\" Grid.Row=\"2\"\r\n                                Height=\"38\" Width=\"38\"\r\n                                Visibility=\"{Binding ProgressArgs.IsIndeterminate, Converter={StaticResource BooleanToVisibilityConverter}}\"/>\r\n            <TextBlock Text=\"{Binding ProgressArgs.Text}\"\r\n                           Grid.Column=\"1\" Grid.Row=\"3\"\r\n                           Grid.ColumnSpan=\"3\"\r\n                           HorizontalAlignment=\"Center\" \r\n                           TextAlignment=\"Left\"\r\n                           VerticalAlignment=\"Bottom\"\r\n                           Style=\"{StaticResource TextBlockBaseStyle}\" \r\n                           TextWrapping=\"Wrap\" />\r\n\r\n                <ProgressBar IsIndeterminate=\"{Binding ProgressArgs.IsIndeterminate}\"\r\n                             Value=\"{Binding ProgressArgs.CurrentProgressValue}\"\r\n                             Maximum=\"{Binding ProgressArgs.ProgressMaxValue}\"\r\n                             Visibility=\"{Binding ProgressArgs.IsIndeterminate, Converter={StaticResource InvertedBooleanToVisibilityConverter}}\"\r\n                             Style=\"{StaticResource ProgressWindowProgressBarStyle}\"\r\n                             Grid.Column=\"2\"\r\n                             Grid.Row=\"4\"/>\r\n\r\n            <pctrls:ButtonEx Content=\"{DynamicResource LOCCancelLabel}\"\r\n                                 HorizontalAlignment=\"Center\" MinWidth=\"180\"\r\n                                 pbeh:FocusBahaviors.FocusBinding=\"{Binding Cancelable}\"\r\n                                 Command=\"{Binding CancelCommand}\"\r\n                                 Visibility=\"{Binding Cancelable, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                                 HorizontalContentAlignment=\"Center\"\r\n                                 Margin=\"0,20,0,0\" \r\n                             Grid.Column=\"2\"\r\n                             Grid.Row=\"5\"/>\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/ProgressWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for ProgressWindow.xaml\r\n    /// </summary>\r\n    public partial class ProgressWindow : WindowBase\r\n    {\r\n        public ProgressWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/RandomGameSelectWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.RandomGameSelectWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CloseCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CloseCommand}\" />\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CloseCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\"/>\r\n                <ColumnDefinition Width=\"Auto\" />\r\n                <ColumnDefinition Width=\"*\"/>\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"1*\"/>\r\n                <RowDefinition Height=\"Auto\"/>\r\n                <RowDefinition Height=\"1*\"/>\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Background=\"{StaticResource ControlBackgroundDarkBrush}\" CornerRadius=\"3\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\"\r\n                    KeyboardNavigation.TabNavigation=\"Cycle\"\r\n                    KeyboardNavigation.DirectionalNavigation=\"Cycle\">\r\n                <StackPanel Margin=\"20\">\r\n                    <Image Stretch=\"Uniform\" StretchDirection=\"Both\" RenderOptions.BitmapScalingMode=\"Fant\"\r\n                           Height=\"300\" HorizontalAlignment=\"Center\">\r\n                        <Image.Source>\r\n                            <PriorityBinding>\r\n                                <Binding Path=\"SelectedGame.CoverImage\" Converter=\"{StaticResource ImageStringToImageConverterCached}\" />\r\n                                <Binding Source=\"{StaticResource DefaultGameCover}\" />\r\n                            </PriorityBinding>\r\n                        </Image.Source>\r\n                    </Image>\r\n                    \r\n                    <TextBlock Text=\"{Binding SelectedGame.Name}\" HorizontalAlignment=\"Center\" Margin=\"0,10,0,20\" \r\n                               Style=\"{StaticResource TextBlockBaseStyle}\" \r\n                               TextTrimming=\"CharacterEllipsis\" />\r\n                    <pctrls:CheckBoxEx Content=\"{DynamicResource LOCRandomGameLimistToFilter}\" HorizontalAlignment=\"Center\"\r\n                                IsChecked=\"{Binding IsLimitedToFilter}\"/>\r\n                    <StackPanel Orientation=\"Horizontal\" Margin=\"0,15,0,0\" HorizontalAlignment=\"Center\">\r\n                        <pctrls:ButtonEx Content=\"{DynamicResource LOCGameSearchItemActionSwitchTo}\" MinWidth=\"200\"\r\n                                         Style=\"{StaticResource MessageBoxButton}\"\r\n                                         Command=\"{Binding NavigateToGameCommand}\"/>\r\n                        <pctrls:ButtonEx Content=\"{DynamicResource LOCRandomGamePickAnother}\" MinWidth=\"200\"\r\n                                         Style=\"{StaticResource MessageBoxButton}\"\r\n                                         Command=\"{Binding PickAnotherCommand}\" />\r\n                    </StackPanel>\r\n                    <pctrls:ButtonEx Content=\"{DynamicResource LOCPlayGame}\" HorizontalAlignment=\"Center\"\r\n                                     x:Name=\"ButtonPlay\" Margin=\"0,10,0,0\"\r\n                                     Style=\"{StaticResource MessageBoxButton}\"\r\n                                     Command=\"{Binding PlayGameCommand}\" MinWidth=\"200\" />\r\n                </StackPanel>\r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/RandomGameSelectWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public class RandomGameSelectWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new RandomGameSelectWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for RandomGameSelectWindow.xaml\r\n    /// </summary>\r\n    public partial class RandomGameSelectWindow : WindowBase\r\n    {\r\n        public RandomGameSelectWindow()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n            Loaded += RandomGameSelectWindow_Loaded;\r\n        }\r\n\r\n        private void RandomGameSelectWindow_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            ButtonPlay.Focus();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/SettingsWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.SettingsWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pmrk=\"clr-namespace:Playnite.FullscreenApp.Markup\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"     \r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n    \r\n    <i:Interaction.Triggers>\r\n        <i:EventTrigger EventName=\"PreviewGotKeyboardFocus\" >\r\n            <prism:InvokeCommandAction Command=\"{Binding PreviewGotKeyboardFocusCommand}\" />\r\n        </i:EventTrigger>\r\n    </i:Interaction.Triggers>\r\n    \r\n    <c:WindowBase.InputBindings>\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CloseCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CloseCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CloseCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n    \r\n    <Viewbox>\r\n        <Grid Name=\"GridMain\" Height=\"1080\" Width=\"1920\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"2*\" />\r\n                <ColumnDefinition Width=\"3*\" />\r\n                <ColumnDefinition Width=\"400\" />\r\n                <ColumnDefinition Width=\"100\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"150\" />\r\n                <RowDefinition Height=\"*\" />\r\n                <RowDefinition Height=\"150\" />\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Grid.Column=\"2\" Grid.RowSpan=\"3\"\r\n                    VerticalAlignment=\"Stretch\"\r\n                    KeyboardNavigation.TabNavigation=\"Cycle\"\r\n                    KeyboardNavigation.DirectionalNavigation=\"Cycle\"\r\n                    IsEnabled=\"{Binding IsMenuEnabled}\"\r\n                    Style=\"{DynamicResource SettingsMenuBorder}\">\r\n                <StackPanel>\r\n                    <StackPanel.Resources>\r\n                        <Style TargetType=\"pctrls:ButtonEx\" BasedOn=\"{StaticResource SettingsMenuButton}\">\r\n                            <Setter Property=\"Command\" Value=\"{Binding OpenSectionCommand}\" />\r\n                        </Style>\r\n                    </StackPanel.Resources>                    \r\n                    \r\n                    <ContentControl ContentTemplate=\"{DynamicResource SettingsMenuHeaderTemplate}\"\r\n                                    Focusable=\"False\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\" />\r\n                    \r\n                    <pctrls:ButtonEx ContentTemplate=\"{DynamicResource SettingsMenuGeneralButtonTemplate}\" CommandParameter=\"0\"\r\n                                     pbeh:FocusBahaviors.OnVisibilityFocus=\"True\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCSettingsLabel}\"/>\r\n                    <pctrls:ButtonEx ContentTemplate=\"{DynamicResource SettingsMenuVisualsButtonTemplate}\" CommandParameter=\"1\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCSettingsFSSectionVisuals}\" />\r\n                    <pctrls:ButtonEx ContentTemplate=\"{DynamicResource SettingsMenuAudioButtonTemplate}\" CommandParameter=\"5\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCSettingsFSSectionAudio}\" />\r\n                    <pctrls:ButtonEx ContentTemplate=\"{DynamicResource SettingsMenuLayoutButtonTemplate}\" CommandParameter=\"2\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCSettingsFSSectionLayout}\" />\r\n                    <pctrls:ButtonEx ContentTemplate=\"{DynamicResource SettingsMenuMenusButtonTemplate}\" CommandParameter=\"3\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCSettingsFSSectionMenus}\" />\r\n                    <pctrls:ButtonEx ContentTemplate=\"{DynamicResource SettingsMenuInputButtonTemplate}\" CommandParameter=\"4\"\r\n                                     AutomationProperties.Name=\"{DynamicResource LOCSettingsFSSection}\" />\r\n\r\n                    <TextBlock Style=\"{StaticResource TextBlockBaseStyle}\"\r\n                               Text=\"{DynamicResource LOCSettingsRestartNotification}\"\r\n                               Visibility=\"{Binding IsSubMenuOpened, Converter={StaticResource BooleanToVisibilityConverter}}\"\r\n                               HorizontalAlignment=\"Right\"\r\n                               Margin=\"10,20,20,0\"/>\r\n\r\n                    <TextBlock Text=\"{Binding OptionDescription}\"\r\n                               Margin=\"20,50,20,10\" TextWrapping=\"Wrap\">\r\n                        <TextBlock.Style>\r\n                            <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource TextBlockBaseStyle}\">\r\n                                <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                                <Style.Triggers>\r\n                                    <DataTrigger Binding=\"{Binding OptionDescription}\" Value=\"{x:Null}\">\r\n                                        <Setter Property=\"Visibility\" Value=\"Hidden\" />\r\n                                    </DataTrigger>\r\n                                </Style.Triggers>\r\n                            </Style>\r\n                        </TextBlock.Style>\r\n                    </TextBlock>\r\n                </StackPanel>\r\n            </Border>\r\n\r\n            <Border Grid.Column=\"1\" Grid.Row=\"1\" Focusable=\"False\">\r\n                <Border.Style>\r\n                    <Style TargetType=\"Border\" BasedOn=\"{StaticResource SettingsSectionBorder}\">\r\n                        <Style.Triggers>\r\n                            <DataTrigger Binding=\"{Binding Content, ElementName=ContentSettings}\" Value=\"{x:Null}\">\r\n                                <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                            </DataTrigger>\r\n                        </Style.Triggers>\r\n                    </Style>\r\n                </Border.Style>\r\n                <ContentControl Name=\"ContentSettings\" Content=\"{Binding SelectedSectionView}\"\r\n                                Margin=\"20\" Focusable=\"False\"/>\r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/SettingsWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public class SettingsWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new SettingsWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for ProgressWindow.xaml\r\n    /// </summary>\r\n    public partial class SettingsWindow : WindowBase\r\n    {\r\n        public SettingsWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/SingleItemSelectionWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.SingleItemSelectionWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\"\r\n        Name=\"WindowSingleItemSelectionWindow\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CancelCommand}\" />\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CancelCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CancelCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\" />\r\n                <ColumnDefinition Width=\"Auto\"/>\r\n                <ColumnDefinition Width=\"*\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\" />\r\n                <RowDefinition Height=\"6*\" />\r\n                <RowDefinition Height=\"*\" />\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Style=\"{DynamicResource ItemSelectionBorder}\"\r\n                    Width=\"500\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\"\r\n                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\r\n                <DockPanel>\r\n                    <TextBlock Text=\"{Binding HeaderText}\"\r\n                               Style=\"{DynamicResource ItemSelectionHeaderText}\"\r\n                               DockPanel.Dock=\"Top\"/>\r\n                    <pctrls:ItemsControlEx x:Name=\"PART_ItemsHost\" Focusable=\"False\"\r\n                                           KeyboardNavigation.DirectionalNavigation=\"Once\"\r\n                                           Loaded=\"PART_ItemsHost_Loaded\"\r\n                                           ItemsSource=\"{Binding Items}\"\r\n                                           Tag=\"{Binding StartIndex}\">\r\n                        <ItemsControl.ItemTemplate>\r\n                            <DataTemplate>\r\n                                <pctrls:ButtonEx Content=\"{Binding Name}\"\r\n                                                 MaxWidth=\"500\"\r\n                                                 Command=\"{Binding DataContext.SelectItemCommand, ElementName=WindowSingleItemSelectionWindow}\"\r\n                                                 CommandParameter=\"{Binding}\"\r\n                                                 pbeh:FocusBahaviors.FocusBinding=\"{Binding Selected}\"\r\n                                                 Style=\"{DynamicResource ItemSelectionButton}\"/>\r\n                            </DataTemplate>\r\n                        </ItemsControl.ItemTemplate>\r\n                        <ItemsControl.Template>\r\n                            <ControlTemplate>\r\n                                <ScrollViewer Focusable=\"False\"\r\n                                              KeyboardNavigation.DirectionalNavigation=\"None\"\r\n                                              HorizontalScrollBarVisibility=\"Disabled\"\r\n                                              VerticalScrollBarVisibility=\"Auto\"\r\n                                              CanContentScroll=\"True\">\r\n                                    <ItemsPresenter />\r\n                                </ScrollViewer>\r\n                            </ControlTemplate>\r\n                        </ItemsControl.Template>\r\n                        <ItemsControl.ItemsPanel>\r\n                            <ItemsPanelTemplate>\r\n                                <VirtualizingStackPanel IsVirtualizing=\"True\"\r\n                                                        VirtualizationMode=\"Recycling\" />\r\n                            </ItemsPanelTemplate>\r\n                        </ItemsControl.ItemsPanel>\r\n                    </pctrls:ItemsControlEx>\r\n                </DockPanel>\r\n            </Border>\r\n        </Grid>            \r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/SingleItemSelectionWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\nusing System.Windows.Threading;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for UpdateWindow.xaml\r\n    /// </summary>\r\n    public partial class SingleItemSelectionWindow : WindowBase\r\n    {\r\n        public SingleItemSelectionWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n\r\n        private void PART_ItemsHost_Loaded(object sender, RoutedEventArgs e)\r\n        {\r\n            // Needed because we use virtualized items panel and selected item might not be realized,\r\n            // which would prevent it from getting focus.\r\n            if (PART_ItemsHost.Tag is int selectedItemIndex)\r\n            {\r\n                var itemsPanel = ElementTreeHelper.FindVisualChildren<VirtualizingStackPanel>(PART_ItemsHost).FirstOrDefault();\r\n                itemsPanel?.BringIndexIntoViewPublic(selectedItemIndex);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/SoftwareToolsMenuWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.SoftwareToolsMenuWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\"\r\n        Name=\"WindowSoftwareToolsMenuWindow\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CloseCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CloseCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CloseCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\" />\r\n                <ColumnDefinition Width=\"Auto\"/>\r\n                <ColumnDefinition Width=\"*\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\" />\r\n                <RowDefinition Height=\"6*\" />\r\n                <RowDefinition Height=\"*\" />\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Style=\"{DynamicResource SoftwareToolsBorder}\"\r\n                    Width=\"500\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\"\r\n                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\r\n                <DockPanel>\r\n                    <pctrls:ItemsControlEx x:Name=\"PART_ItemsHost\" Focusable=\"False\"\r\n                                           KeyboardNavigation.DirectionalNavigation=\"Once\"\r\n                                           pbeh:FocusBahaviors.FocusBinding=\"True\"\r\n                                           DockPanel.Dock=\"Top\"\r\n                                           ItemsSource=\"{Binding Tools}\">\r\n                        <ItemsControl.ItemTemplate>\r\n                            <DataTemplate>\r\n                                <pctrls:ButtonEx MaxWidth=\"500\"\r\n                                                 Content=\"{Binding}\"\r\n                                                 Command=\"{Binding DataContext.OpenToolCommand, RelativeSource={RelativeSource AncestorType=c:WindowBase}}\"\r\n                                                 CommandParameter=\"{Binding}\"\r\n                                                 Style=\"{DynamicResource SoftwareToolMenuButton}\"/>\r\n                            </DataTemplate>\r\n                        </ItemsControl.ItemTemplate>\r\n                        <ItemsControl.Template>\r\n                            <ControlTemplate>\r\n                                <ScrollViewer Focusable=\"False\"\r\n                                              KeyboardNavigation.DirectionalNavigation=\"None\"\r\n                                              HorizontalScrollBarVisibility=\"Disabled\"\r\n                                              VerticalScrollBarVisibility=\"Auto\"\r\n                                              CanContentScroll=\"True\">\r\n                                    <ItemsPresenter />\r\n                                </ScrollViewer>\r\n                            </ControlTemplate>\r\n                        </ItemsControl.Template>\r\n                        <ItemsControl.ItemsPanel>\r\n                            <ItemsPanelTemplate>\r\n                                <VirtualizingStackPanel IsVirtualizing=\"True\"\r\n                                                        VirtualizationMode=\"Recycling\" />\r\n                            </ItemsPanelTemplate>\r\n                        </ItemsControl.ItemsPanel>\r\n                    </pctrls:ItemsControlEx>\r\n                </DockPanel>\r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/SoftwareToolsMenuWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\nusing System.Windows.Threading;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public class SoftwareToolsMenuWindowFactory : WindowFactory\r\n    {\r\n        public override WindowBase CreateNewWindowInstance()\r\n        {\r\n            return new SoftwareToolsMenuWindow();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Interaction logic for UpdateWindow.xaml\r\n    /// </summary>\r\n    public partial class SoftwareToolsMenuWindow : WindowBase\r\n    {\r\n        public SoftwareToolsMenuWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/TextInputWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.TextInputWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n        xmlns:prism=\"clr-namespace:Prism.Interactivity;assembly=Prism.Wpf\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        mc:Ignorable=\"d\"                     \r\n        x:Name=\"WindowMessageBox\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <pin:GameControllerInputBinding Button=\"Y\" Command=\"{Binding AddSpaceCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"X\" Command=\"{Binding BackSpaceCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CancelCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"Start\" Command=\"{Binding ConfirmCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"LeftShoulder\" Command=\"{Binding ClearTextCommand}\" />\r\n        <pin:GameControllerInputBinding Button=\"RightStick\" Command=\"{Binding ToggleCapsCommand}\" />\r\n        <KeyBinding Key=\"Esc\" Command=\"{Binding CancelCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n    \r\n    <c:WindowBase.Resources>\r\n        <BooleanToVisibilityConverter x:Key=\"BooleanToVisibilityConverter\" />\r\n    </c:WindowBase.Resources>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\" />\r\n                <ColumnDefinition Width=\"Auto\" />\r\n                <ColumnDefinition Width=\"*\" />\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"*\"/>\r\n                <RowDefinition Height=\"Auto\"/>                \r\n                <RowDefinition Height=\"Auto\"/>\r\n                <RowDefinition Height=\"Auto\"/>\r\n                <RowDefinition Height=\"*\"/>\r\n            </Grid.RowDefinitions>\r\n\r\n            <TextBox Name=\"TextInputText\" Grid.Row=\"1\" Grid.Column=\"1\"\r\n                     Style=\"{DynamicResource TextInputTextbox}\"                     \r\n                     PreviewKeyDown=\"TextInputText_PreviewKeyDown\"\r\n                     Text=\"{Binding InputText, UpdateSourceTrigger=PropertyChanged}\">\r\n                <TextBox.InputBindings>\r\n                    <pin:GameControllerInputBinding Button=\"X\" Command=\"{Binding BackSpaceCommand}\" />\r\n                    <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CancelCommand}\" />\r\n                    <pin:GameControllerInputBinding Button=\"Start\" Command=\"{Binding ConfirmCommand}\" />\r\n                    <pin:GameControllerInputBinding Button=\"LeftShoulder\" Command=\"{Binding ClearTextCommand}\" />\r\n                </TextBox.InputBindings>\r\n            </TextBox>\r\n\r\n            <Border Style=\"{DynamicResource TextInputOptionsBorder}\"\r\n                    Grid.Row=\"2\" Grid.Column=\"1\" Margin=\"0,0,0,20\">\r\n                <ItemsControl Focusable=\"False\" Margin=\"10\"\r\n                              Name=\"ItemsToggleOptions\" Visibility=\"Collapsed\"\r\n                              ItemsSource=\"{Binding ToggleOptions}\">\r\n                    <ItemsControl.ItemTemplate>\r\n                        <DataTemplate>\r\n                            <pctrls:CheckBoxEx Content=\"{Binding Title}\"\r\n                                               Style=\"{DynamicResource TextInputCheckbox}\"\r\n                                               IsChecked=\"{Binding Selected}\" />\r\n                        </DataTemplate>\r\n                    </ItemsControl.ItemTemplate>\r\n                </ItemsControl>\r\n            </Border>\r\n\r\n            <Border Grid.Row=\"3\" Grid.Column=\"1\"\r\n                    Style=\"{DynamicResource TextInputKeysBorder}\"\r\n                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\r\n                <i:Interaction.Triggers>\r\n                    <i:EventTrigger EventName=\"PreviewKeyUp\" >\r\n                        <prism:InvokeCommandAction Command=\"{Binding PreviewKeyUpDownCommand}\" />\r\n                    </i:EventTrigger>\r\n                    <i:EventTrigger EventName=\"PreviewKeyDown\" >\r\n                        <prism:InvokeCommandAction Command=\"{Binding PreviewKeyUpDownCommand}\" />\r\n                    </i:EventTrigger>\r\n                    <i:EventTrigger EventName=\"PreviewTextInput\" >\r\n                        <prism:InvokeCommandAction Command=\"{Binding PreviewTextInputCommand}\" />\r\n                    </i:EventTrigger>\r\n                </i:Interaction.Triggers>\r\n                <StackPanel>\r\n                    <Grid HorizontalAlignment=\"Center\" Name=\"GridInput\">\r\n                        <Grid.ColumnDefinitions>\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                            <ColumnDefinition Width=\"Auto\" />\r\n                        </Grid.ColumnDefinitions>\r\n                        <Grid.RowDefinitions>\r\n                            <RowDefinition Height=\"Auto\" />\r\n                            <RowDefinition Height=\"Auto\" />\r\n                            <RowDefinition Height=\"Auto\" />\r\n                            <RowDefinition Height=\"Auto\" />\r\n                            <RowDefinition Height=\"Auto\" />\r\n                        </Grid.RowDefinitions>\r\n                        <Grid.Resources>\r\n                            <Style TargetType=\"pctrls:ButtonEx\" BasedOn=\"{StaticResource TextInputButton}\">\r\n                                <EventSetter Event=\"Click\" Handler=\"Button_Click\" />\r\n                            </Style>\r\n                        </Grid.Resources>\r\n\r\n                        <pctrls:ButtonEx Grid.Row=\"0\" Grid.Column=\"0\" Content=\"1\" x:Name=\"Button1\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"0\" Grid.Column=\"1\" Content=\"2\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"0\" Grid.Column=\"2\" Content=\"3\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"0\" Grid.Column=\"3\" Content=\"4\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"0\" Grid.Column=\"4\" Content=\"5\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"0\" Grid.Column=\"5\" Content=\"6\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"0\" Grid.Column=\"6\" Content=\"7\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"0\" Grid.Column=\"7\" Content=\"8\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"0\" Grid.Column=\"8\" Content=\"9\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"0\" Grid.Column=\"9\" Content=\"0\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"0\" Grid.Column=\"10\" Command=\"{Binding BackSpaceCommand}\">\r\n                            <pctrls:ButtonEx.Content>\r\n                                <StackPanel Orientation=\"Horizontal\">\r\n                                    <ContentControl ContentTemplate=\"{DynamicResource ButtonPromptX}\"\r\n                                                    Focusable=\"False\" Height=\"22\" Margin=\"0,0,5,0\"/>\r\n                                    <TextBlock Text=\"⌫\"\r\n                                               Style=\"{StaticResource TextBlockBaseStyle}\" />\r\n                                </StackPanel>\r\n                            </pctrls:ButtonEx.Content>\r\n                        </pctrls:ButtonEx>\r\n\r\n                        <pctrls:ButtonEx Grid.Row=\"1\" Grid.Column=\"0\" Content=\"q\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"1\" Grid.Column=\"1\" Content=\"w\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"1\" Grid.Column=\"2\" Content=\"e\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"1\" Grid.Column=\"3\" Content=\"r\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"1\" Grid.Column=\"4\" Content=\"t\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"1\" Grid.Column=\"5\" Content=\"y\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"1\" Grid.Column=\"6\" Content=\"u\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"1\" Grid.Column=\"7\" Content=\"i\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"1\" Grid.Column=\"8\" Content=\"o\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"1\" Grid.Column=\"9\" Content=\"p\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"1\" Grid.Column=\"10\" Grid.RowSpan=\"2\" Command=\"{Binding ConfirmCommand}\">\r\n                            <pctrls:ButtonEx.Content>\r\n                                <StackPanel>\r\n                                    <ContentControl ContentTemplate=\"{DynamicResource ButtonPromptStart}\"\r\n                                                    Focusable=\"False\" Height=\"22\" Margin=\"0,0,0,5\"/>\r\n                                    <TextBlock Text=\"{DynamicResource LOCDoneCapLabel}\"\r\n                                               Style=\"{StaticResource TextBlockBaseStyle}\" />\r\n                                </StackPanel>\r\n                            </pctrls:ButtonEx.Content>\r\n                        </pctrls:ButtonEx>\r\n\r\n                        <pctrls:ButtonEx Grid.Row=\"2\" Grid.Column=\"0\" Content=\"a\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"2\" Grid.Column=\"1\" Content=\"s\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"2\" Grid.Column=\"2\" Content=\"d\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"2\" Grid.Column=\"3\" Content=\"f\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"2\" Grid.Column=\"4\" Content=\"g\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"2\" Grid.Column=\"5\" Content=\"h\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"2\" Grid.Column=\"6\" Content=\"j\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"2\" Grid.Column=\"7\" Content=\"k\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"2\" Grid.Column=\"8\" Content=\"l\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"2\" Grid.Column=\"9\" Content=\"-\" />\r\n\r\n                        <pctrls:ButtonEx Grid.Row=\"3\" Grid.Column=\"0\" Content=\"z\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"3\" Grid.Column=\"1\" Content=\"x\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"3\" Grid.Column=\"2\" Content=\"c\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"3\" Grid.Column=\"3\" Content=\"v\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"3\" Grid.Column=\"4\" Content=\"b\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"3\" Grid.Column=\"5\" Content=\"n\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"3\" Grid.Column=\"6\" Content=\"m\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"3\" Grid.Column=\"7\" Content=\";\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"3\" Grid.Column=\"8\" Content=\":\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"3\" Grid.Column=\"9\" Content=\"!\" />\r\n                        <pctrls:ButtonEx Grid.Row=\"3\" Grid.Column=\"10\" Grid.RowSpan=\"2\" Command=\"{Binding CancelCommand}\">\r\n                            <pctrls:ButtonEx.Content>\r\n                                <StackPanel>\r\n                                    <ContentControl ContentTemplate=\"{DynamicResource ButtonPromptB}\"\r\n                                                    Focusable=\"False\" Height=\"22\" Margin=\"0,0,0,5\"/>\r\n                                    <TextBlock Text=\"{DynamicResource LOCCancelLabel}\"\r\n                                               Style=\"{StaticResource TextBlockBaseStyle}\" />\r\n                                </StackPanel>\r\n                            </pctrls:ButtonEx.Content>\r\n                        </pctrls:ButtonEx>\r\n\r\n                        <pctrls:ButtonEx Grid.Row=\"4\" Grid.Column=\"8\" Grid.ColumnSpan=\"2\" Command=\"{Binding ClearTextCommand}\">\r\n                            <pctrls:ButtonEx.Content>\r\n                                <StackPanel Orientation=\"Horizontal\">\r\n                                    <ContentControl ContentTemplate=\"{DynamicResource ButtonPromptLB}\"\r\n                                                    Focusable=\"False\" Height=\"22\" Margin=\"0,0,5,0\"/>\r\n                                    <TextBlock Text=\"{DynamicResource LOCClearLabel}\"\r\n                                               Style=\"{StaticResource TextBlockBaseStyle}\" />\r\n                                </StackPanel>\r\n                            </pctrls:ButtonEx.Content>\r\n                        </pctrls:ButtonEx>\r\n\r\n                        <pctrls:ButtonEx Grid.Row=\"4\" Grid.Column=\"2\" Grid.ColumnSpan=\"6\" Command=\"{Binding AddSpaceCommand}\">\r\n                            <pctrls:ButtonEx.Content>\r\n                                <StackPanel Orientation=\"Horizontal\">\r\n                                    <ContentControl ContentTemplate=\"{DynamicResource ButtonPromptY}\"\r\n                                                    Focusable=\"False\" Height=\"22\" Margin=\"0,0,5,0\"/>\r\n                                    <TextBlock Text=\"{DynamicResource LOCTextInputSpace}\"\r\n                                               Style=\"{StaticResource TextBlockBaseStyle}\" />\r\n                                </StackPanel>\r\n                            </pctrls:ButtonEx.Content>\r\n                        </pctrls:ButtonEx>\r\n\r\n                        <pctrls:ButtonEx Grid.Row=\"4\" Grid.Column=\"0\" Grid.ColumnSpan=\"2\" Command=\"{Binding ToggleCapsCommand}\">\r\n                            <pctrls:ButtonEx.Content>\r\n                                <StackPanel Orientation=\"Horizontal\">\r\n                                    <ContentControl ContentTemplate=\"{DynamicResource ButtonPromptRS}\"\r\n                                                    Focusable=\"False\" Height=\"22\" Margin=\"0,0,5,0\"/>\r\n                                    <TextBlock Text=\"{DynamicResource LOCTextInputCapitalize}\"\r\n                                               Style=\"{StaticResource TextBlockBaseStyle}\" />\r\n                                </StackPanel>\r\n                            </pctrls:ButtonEx.Content>\r\n                        </pctrls:ButtonEx>\r\n                    </Grid>\r\n                </StackPanel>\r\n            </Border>\r\n        </Grid>\r\n    </Viewbox>    \r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/TextInputWindow.xaml.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.Commands;\r\nusing Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\nusing System.Runtime.CompilerServices;\r\nusing Playnite.FullscreenApp.Controls;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public partial class TextInputWindow : WindowBase\r\n    {\r\n        private MessageBoxResult result;\r\n        private bool capsEnabled = false;\r\n\r\n        private string text = string.Empty;\r\n        public string Text\r\n        {\r\n            get => text;\r\n            set\r\n            {\r\n                text = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string inputText = string.Empty;\r\n        public string InputText\r\n        {\r\n            get => inputText;\r\n            set\r\n            {\r\n                inputText = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> BackSpaceCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                BackSpace();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ClearTextCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ClearText();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ToggleCapsCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                ToggleCaps();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> ConfirmCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                Confirm();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                Cancel();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> AddSpaceCommand\r\n        {\r\n            get => new RelayCommand<object>((a) =>\r\n            {\r\n                AddSpace();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<KeyEventArgs> PreviewKeyUpDownCommand\r\n        {\r\n            get => new RelayCommand<KeyEventArgs>((a) =>\r\n            {\r\n                ProcessPreviewKeyUpDown(a);\r\n            });\r\n        }\r\n\r\n        public RelayCommand<TextCompositionEventArgs> PreviewTextInputCommand\r\n        {\r\n            get => new RelayCommand<TextCompositionEventArgs>((a) =>\r\n            {\r\n                ProcessTextInput(a);\r\n            });\r\n        }\r\n\r\n        private List<MessageBoxToggle> toggleOptions;\r\n        public List<MessageBoxToggle> ToggleOptions\r\n        {\r\n            get => toggleOptions;\r\n            set\r\n            {\r\n                toggleOptions = value;\r\n                OnPropertyChanged(nameof(ToggleOptions));\r\n            }\r\n        }\r\n\r\n        public TextInputWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n            DataContext = this;\r\n        }\r\n\r\n        public StringSelectionDialogResult ShowInput(\r\n            Window owner,\r\n            string messageBoxText,\r\n            string caption,\r\n            string defaultInput,\r\n            List<MessageBoxToggle> options = null)\r\n        {\r\n            if (owner == null)\r\n            {\r\n                WindowStartupLocation = WindowStartupLocation.CenterScreen;\r\n            }\r\n\r\n            if (this != owner)\r\n            {\r\n                Owner = owner;\r\n            }\r\n\r\n            Button1.Focus();\r\n            Text = messageBoxText;\r\n            InputText = defaultInput ?? string.Empty;\r\n            ToggleOptions = options;\r\n            if (options.HasItems())\r\n            {\r\n                ItemsToggleOptions.Visibility = Visibility.Visible;\r\n            }\r\n\r\n            ShowDialog();\r\n\r\n            if (result == MessageBoxResult.Cancel)\r\n            {\r\n                return new StringSelectionDialogResult(false, InputText);\r\n            }\r\n            else\r\n            {\r\n                return new StringSelectionDialogResult(true, InputText);\r\n            }\r\n        }\r\n\r\n        public void Confirm()\r\n        {\r\n            result = MessageBoxResult.OK;\r\n            Close();\r\n        }\r\n\r\n        public void Cancel()\r\n        {\r\n            result = MessageBoxResult.Cancel;\r\n            Close();\r\n        }\r\n\r\n        private void Button_Click(object sender, RoutedEventArgs e)\r\n        {\r\n            var button = (Button)sender;\r\n            if (button.Command == null)\r\n            {\r\n                var text = button.Content?.ToString();\r\n                InputText += text;\r\n            }\r\n        }\r\n\r\n        public void BackSpace()\r\n        {\r\n            if (!string.IsNullOrEmpty(InputText))\r\n            {\r\n                InputText = InputText.Substring(0, InputText.Length - 1);\r\n            }\r\n        }\r\n\r\n        public void ClearText()\r\n        {\r\n            InputText = string.Empty;\r\n        }\r\n\r\n        private void TextInputText_PreviewKeyDown(object sender, KeyEventArgs e)\r\n        {\r\n            if (e.Key == Key.Up)\r\n            {\r\n                TextInputText.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));\r\n                e.Handled = true;\r\n                return;\r\n            }\r\n            else if (e.Key == Key.Down)\r\n            {\r\n                TextInputText.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));\r\n                e.Handled = true;\r\n                return;\r\n            }\r\n            else if (e.Key == Key.Return)\r\n            {\r\n                e.Handled = true;\r\n                Confirm();\r\n            }\r\n        }\r\n\r\n        private void ToggleCaps()\r\n        {\r\n            foreach (var child in GridInput.Children)\r\n            {\r\n                if (child is ButtonEx button)\r\n                {\r\n                    var cont = button.Content?.ToString();\r\n                    if (cont.IsNullOrEmpty() || cont.Length > 1)\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    button.Content = capsEnabled ? cont.ToLower() : cont.ToUpper();\r\n                }\r\n            }\r\n\r\n            capsEnabled = !capsEnabled;\r\n        }\r\n\r\n        private void AddSpace()\r\n        {\r\n            InputText += \" \";\r\n        }\r\n\r\n        private void ProcessPreviewKeyUpDown(KeyEventArgs a)\r\n        {\r\n            if (a.Key == Key.Space)\r\n            {\r\n                a.Handled = true;\r\n                AddSpace();\r\n            }\r\n        }\r\n\r\n        private void ProcessTextInput(TextCompositionEventArgs a)\r\n        {\r\n            if (a.Text == \"\\b\")\r\n            {\r\n                BackSpace();\r\n            }\r\n            else if (a.Text == \"\\t\")\r\n            {\r\n            }\r\n            else\r\n            {\r\n                InputText += a.Text;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/UpdateWindow.xaml",
    "content": "﻿<c:WindowBase x:Class=\"Playnite.FullscreenApp.Windows.UpdateWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n        xmlns:local=\"clr-namespace:Playnite.FullscreenApp.Windows\"\r\n        xmlns:c=\"clr-namespace:Playnite.Controls;assembly=Playnite\"\r\n        xmlns:pbeh=\"clr-namespace:Playnite.Behaviors;assembly=Playnite\"\r\n        xmlns:pcon=\"clr-namespace:Playnite.Converters;assembly=Playnite\"\r\n        xmlns:html=\"clr-namespace:TheArtOfDev.HtmlRenderer.WPF;assembly=HtmlRenderer.WPF\"\r\n        xmlns:pctrls=\"clr-namespace:Playnite.FullscreenApp.Controls\"\r\n        xmlns:pin=\"clr-namespace:Playnite.Input;assembly=Playnite\"\r\n        mc:Ignorable=\"d\"\r\n        ShowMinimizeButton=\"False\" ShowMaximizeButton=\"False\" ShowCloseButton=\"False\"\r\n        ShowInTaskbar=\"False\" WindowStyle=\"None\"\r\n        ResizeMode=\"NoResize\" WindowStartupLocation=\"CenterOwner\"\r\n        Style=\"{StaticResource ChildWindowStyle}\"\r\n        d:DesignWidth=\"1920\" d:DesignHeight=\"1080\">\r\n\r\n    <c:WindowBase.InputBindings>\r\n        <pin:GameControllerInputBinding Button=\"{Binding Path=(pin:GameControllerGesture.CancellationBinding)}\" Command=\"{Binding CloseCommand}\" />\r\n        <KeyBinding Key=\"Return\" Command=\"{Binding InstallUpdateCommand}\" />\r\n        <KeyBinding Key=\"Backspace\" Command=\"{Binding CloseCommand}\" />\r\n    </c:WindowBase.InputBindings>\r\n\r\n    <Viewbox>\r\n        <Grid Height=\"1080\" Width=\"1920\" Name=\"GridMain\">\r\n            <Grid.ColumnDefinitions>\r\n                <ColumnDefinition Width=\"*\"/>\r\n                <ColumnDefinition Width=\"*\"/>\r\n                <ColumnDefinition Width=\"*\"/>\r\n            </Grid.ColumnDefinitions>\r\n            <Grid.RowDefinitions>\r\n                <RowDefinition Height=\"1*\"/>\r\n                <RowDefinition Height=\"2*\"/>\r\n                <RowDefinition Height=\"Auto\"/>\r\n                <RowDefinition Height=\"1*\"/>\r\n            </Grid.RowDefinitions>\r\n\r\n            <Border Background=\"{StaticResource ControlBackgroundDarkBrush}\" CornerRadius=\"3\"\r\n                    Grid.Column=\"1\" Grid.Row=\"1\">\r\n                <DockPanel>\r\n                    <TextBlock Text=\"{DynamicResource LOCUpdaterChangesInfo}\"\r\n                           Style=\"{StaticResource TextBlockBaseStyle}\"     \r\n                           Margin=\"20\" DockPanel.Dock=\"Top\"/>\r\n                    <pctrls:ScrollViewerEx DockPanel.Dock=\"Top\">\r\n                        <ItemsControl x:Name=\"ItemsNotes\" ItemsSource=\"{Binding ReleaseNotes}\"   \r\n                                      FocusVisualStyle=\"{x:Null}\"\r\n                                      KeyboardNavigation.DirectionalNavigation=\"Once\">\r\n                            <ItemsControl.ItemTemplate>\r\n                                <DataTemplate>\r\n                                    <DockPanel Margin=\"0,5,0,0\">\r\n                                        <Border BorderThickness=\"0,0,0,2\" DockPanel.Dock=\"Top\">\r\n                                            <TextBlock Text=\"{Binding Version}\" Margin=\"15,5,0,5\"\r\n                                                       Style=\"{StaticResource TextBlockBaseStyle}\"\r\n                                                       FontSize=\"18\" />\r\n                                        </Border>\r\n                                        <html:HtmlPanel Text=\"{Binding Note}\" Foreground=\"White\" Margin=\"15,5,10,0\"\r\n                                                        Background=\"Transparent\" DockPanel.Dock=\"Top\"\r\n                                                        ScrollViewer.HorizontalScrollBarVisibility=\"Disabled\"\r\n                                                        ScrollViewer.VerticalScrollBarVisibility=\"Disabled\"\r\n                                                        HorizontalAlignment=\"Left\"\r\n                                                        Focusable=\"False\"/>\r\n                                    </DockPanel>\r\n                                </DataTemplate>\r\n                            </ItemsControl.ItemTemplate>\r\n                        </ItemsControl>\r\n                    </pctrls:ScrollViewerEx>\r\n                </DockPanel>\r\n            </Border>\r\n            <Border Grid.Column=\"1\" Grid.Row=\"2\"\r\n                    Background=\"{StaticResource ControlBackgroundDarkBrush}\" CornerRadius=\"3\">\r\n                <DockPanel LastChildFill=\"False\" Margin=\"20\">\r\n                    <ProgressBar Value=\"{Binding UpdateProgress}\" Maximum=\"100\" Height=\"35\"\r\n                             Visibility=\"{Binding ShowProgress, Converter={pcon:BooleanToVisibilityConverter}}\"\r\n                             DockPanel.Dock=\"Top\" Margin=\"5\"/>\r\n                    <pctrls:ButtonEx x:Name=\"ButtonClose\" Content=\"{DynamicResource LOCCloseLabel}\" DockPanel.Dock=\"Right\" IsCancel=\"True\"\r\n                            Style=\"{StaticResource MessageBoxButton}\"\r\n                            IsEnabled=\"{Binding ShowProgress, Converter={pcon:NegateConverter}}\"\r\n                            Command=\"{Binding CloseCommand}\" />\r\n                    <pctrls:ButtonEx x:Name=\"ButtonInstall\" Content=\"{DynamicResource LOCUpdaterInstallUpdate}\" DockPanel.Dock=\"Right\"\r\n                            pbeh:FocusBahaviors.OnVisibilityFocus=\"True\"\r\n                            Style=\"{StaticResource MessageBoxButton}\"\r\n                            IsEnabled=\"{Binding ShowProgress, Converter={pcon:NegateConverter}}\"\r\n                            Command=\"{Binding InstallUpdateCommand}\"/>\r\n                </DockPanel>\r\n            </Border>\r\n        </Grid>            \r\n    </Viewbox>\r\n</c:WindowBase>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/UpdateWindow.xaml.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for UpdateWindow.xaml\r\n    /// </summary>\r\n    public partial class UpdateWindow : WindowBase\r\n    {\r\n        public UpdateWindow() : base()\r\n        {\r\n            InitializeComponent();\r\n            WindowTools.ConfigureChildWindow(this);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/Windows/WindowTools.cs",
    "content": "﻿using Playnite.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.FullscreenApp.Windows\r\n{\r\n    public class WindowTools\r\n    {\r\n        public static void ConfigureChildWindow(WindowBase window)\r\n        {\r\n            var model = FullscreenApplication.Current?.MainModel;\r\n            if (model != null)\r\n            {\r\n                window.Width = model.WindowWidth;\r\n                window.Height = model.WindowHeight;\r\n                if (window.FindName(\"GridMain\") is Grid mainGrid)\r\n                {\r\n                    mainGrid.Width = model.ViewportWidth;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/app.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n  <assemblyIdentity version=\"1.0.0.0\" name=\"Playnite.DesktopApp\"/>\r\n  <trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\">\r\n    <security>\r\n      <requestedPrivileges xmlns=\"urn:schemas-microsoft-com:asm.v3\">\r\n        <requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\r\n      </requestedPrivileges>\r\n    </security>\r\n  </trustInfo>\r\n  <application xmlns=\"urn:schemas-microsoft-com:asm.v3\">\r\n    <windowsSettings xmlns:ws2=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">\r\n      <ws2:longPathAware>true</ws2:longPathAware>\r\n    </windowsSettings>\r\n  </application>\r\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\r\n    <application>\r\n      <!-- Windows 7 -->\r\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" />\r\n      <!-- Windows 8 -->\r\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" />\r\n      <!-- Windows 8.1 -->\r\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" />\r\n      <!-- Windows 10 -->\r\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />\r\n    </application>\r\n  </compatibility>\r\n</assembly>\r\n"
  },
  {
    "path": "source/Playnite.FullscreenApp/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"CommandLineParser\" version=\"2.8.0\" targetFramework=\"net462\" />\r\n  <package id=\"CommonServiceLocator\" version=\"1.3\" targetFramework=\"net462\" />\r\n  <package id=\"Expression.Blend.Sdk\" version=\"1.0.2\" targetFramework=\"net462\" />\r\n  <package id=\"LargeAddressAware\" version=\"1.0.5\" targetFramework=\"net462\" />\r\n  <package id=\"Microsoft.Xaml.Behaviors.Wpf\" version=\"1.1.39\" targetFramework=\"net462\" />\r\n  <package id=\"Prism.Core\" version=\"6.3.0\" targetFramework=\"net462\" />\r\n  <package id=\"Prism.Wpf\" version=\"6.3.0\" targetFramework=\"net462\" />\r\n  <package id=\"System.IO.Abstractions\" version=\"2.1.0.227\" targetFramework=\"net462\" />\r\n  <package id=\"System.ValueTuple\" version=\"4.5.0\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Playnite.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio Version 17\r\nVisualStudioVersion = 17.4.33205.214\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Tests\", \"Tests\", \"{FBE3E4C8-611E-435D-B47C-FE006AAA8C4A}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Playnite\", \"Playnite\\Playnite.csproj\", \"{AD271E73-8A13-4C4E-BFDC-3076646B59E3}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Playnite.SDK\", \"PlayniteSDK\\Playnite.SDK.csproj\", \"{19BC9097-5705-4352-90E2-99F0C63230D0}\"\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Tools\", \"Tools\", \"{214A3A6E-C961-405E-8F5E-96314B672CF2}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"PlayniteInstaller\", \"Tools\\PlayniteInstaller\\PlayniteInstaller.csproj\", \"{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TestGameLibrary\", \"Tests\\TestGameLibrary\\TestGameLibrary.csproj\", \"{DB0E5B51-2960-4869-899D-5E0C65A697A6}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TestPlugin\", \"Tests\\TestPlugin\\TestPlugin.csproj\", \"{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Playnite.DesktopApp\", \"Playnite.DesktopApp\\Playnite.DesktopApp.csproj\", \"{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Playnite.FullscreenApp\", \"Playnite.FullscreenApp\\Playnite.FullscreenApp.csproj\", \"{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Playnite.Tests\", \"Tests\\Playnite.Tests\\Playnite.Tests.csproj\", \"{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286} = {94B6E43B-3907-4C1B-A804-AF1D1ADEF286}\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6} = {DB0E5B51-2960-4869-899D-5E0C65A697A6}\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6} = {AFE32BF4-E669-4E3F-8363-1D32BEB158F6}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Playnite.DesktopApp.Tests\", \"Tests\\Playnite.DesktopApp.Tests\\Playnite.DesktopApp.Tests.csproj\", \"{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Playnite.FullscreenApp.Tests\", \"Tests\\Playnite.FullscreenApp.Tests\\Playnite.FullscreenApp.Tests.csproj\", \"{AEDEC1D7-8C49-4A54-B265-F595CFD89247}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Playnite.Toolbox\", \"Tools\\Playnite.Toolbox\\Playnite.Toolbox.csproj\", \"{9C73C47E-64C2-4691-A602-A8463185E232}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Playnite.Toolbox.Tests\", \"Tests\\Playnite.Toolbox.Tests\\Playnite.Toolbox.Tests.csproj\", \"{256026D4-A05D-438C-BD11-2D3FBADB2B4C}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Playnite.Utilities\", \"Tools\\Playnite.Utilities\\Playnite.Utilities.csproj\", \"{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}\"\r\nEndProject\r\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{FE72013F-EC27-4857-A66B-20A2862F7446}\"\r\n\tProjectSection(SolutionItems) = preProject\r\n\t\t.editorconfig = .editorconfig\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TestMetadataPlugin\", \"Tests\\TestMetadataPlugin\\TestMetadataPlugin.csproj\", \"{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}\"\r\nEndProject\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TestApp\", \"Tests\\TestApp\\TestApp.csproj\", \"{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tDebug|x86 = Debug|x86\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\t\tRelease|x64 = Release|x64\r\n\t\tRelease|x86 = Release|x86\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{AD271E73-8A13-4C4E-BFDC-3076646B59E3}.Debug|Any CPU.ActiveCfg = Debug|x86\r\n\t\t{AD271E73-8A13-4C4E-BFDC-3076646B59E3}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{AD271E73-8A13-4C4E-BFDC-3076646B59E3}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{AD271E73-8A13-4C4E-BFDC-3076646B59E3}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{AD271E73-8A13-4C4E-BFDC-3076646B59E3}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{AD271E73-8A13-4C4E-BFDC-3076646B59E3}.Release|Any CPU.ActiveCfg = Release|x86\r\n\t\t{AD271E73-8A13-4C4E-BFDC-3076646B59E3}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{AD271E73-8A13-4C4E-BFDC-3076646B59E3}.Release|x64.Build.0 = Release|x64\r\n\t\t{AD271E73-8A13-4C4E-BFDC-3076646B59E3}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{AD271E73-8A13-4C4E-BFDC-3076646B59E3}.Release|x86.Build.0 = Release|x86\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Debug|x64.ActiveCfg = Debug|Any CPU\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Debug|x64.Build.0 = Debug|Any CPU\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Debug|x86.ActiveCfg = Debug|Any CPU\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Debug|x86.Build.0 = Debug|Any CPU\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Release|x64.ActiveCfg = Release|Any CPU\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Release|x64.Build.0 = Release|Any CPU\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Release|x86.ActiveCfg = Release|Any CPU\r\n\t\t{19BC9097-5705-4352-90E2-99F0C63230D0}.Release|x86.Build.0 = Release|Any CPU\r\n\t\t{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}.Debug|x64.ActiveCfg = Debug|Any CPU\r\n\t\t{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}.Debug|x64.Build.0 = Debug|Any CPU\r\n\t\t{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}.Debug|x86.ActiveCfg = Debug|Any CPU\r\n\t\t{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}.Debug|x86.Build.0 = Debug|Any CPU\r\n\t\t{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}.Release|x64.ActiveCfg = Release|Any CPU\r\n\t\t{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}.Release|x64.Build.0 = Release|Any CPU\r\n\t\t{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}.Release|x86.ActiveCfg = Release|Any CPU\r\n\t\t{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}.Release|x86.Build.0 = Release|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Debug|x64.ActiveCfg = Debug|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Debug|x64.Build.0 = Debug|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Debug|x86.ActiveCfg = Debug|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Debug|x86.Build.0 = Debug|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Release|x64.ActiveCfg = Release|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Release|x64.Build.0 = Release|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Release|x86.ActiveCfg = Release|Any CPU\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6}.Release|x86.Build.0 = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Debug|x64.ActiveCfg = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Debug|x64.Build.0 = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Debug|x86.ActiveCfg = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Debug|x86.Build.0 = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Release|x64.ActiveCfg = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Release|x64.Build.0 = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Release|x86.ActiveCfg = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}.Release|x86.Build.0 = Release|Any CPU\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Release|x64.Build.0 = Release|x64\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{26DCC539-E67F-4CB5-970F-F02C1F5C6E00}.Release|x86.Build.0 = Release|x86\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Release|x64.Build.0 = Release|x64\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{DF38BFD7-C6B8-4CF7-942F-378548ED76B6}.Release|x86.Build.0 = Release|x86\r\n\t\t{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}.Debug|Any CPU.ActiveCfg = Debug|x86\r\n\t\t{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}.Release|Any CPU.ActiveCfg = Release|x86\r\n\t\t{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}.Release|x64.Build.0 = Release|x64\r\n\t\t{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}.Release|x86.Build.0 = Release|x86\r\n\t\t{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}.Debug|Any CPU.ActiveCfg = Debug|x86\r\n\t\t{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}.Release|Any CPU.ActiveCfg = Release|x86\r\n\t\t{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}.Release|x64.Build.0 = Release|x64\r\n\t\t{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}.Release|x86.Build.0 = Release|x86\r\n\t\t{AEDEC1D7-8C49-4A54-B265-F595CFD89247}.Debug|Any CPU.ActiveCfg = Debug|x86\r\n\t\t{AEDEC1D7-8C49-4A54-B265-F595CFD89247}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{AEDEC1D7-8C49-4A54-B265-F595CFD89247}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{AEDEC1D7-8C49-4A54-B265-F595CFD89247}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{AEDEC1D7-8C49-4A54-B265-F595CFD89247}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{AEDEC1D7-8C49-4A54-B265-F595CFD89247}.Release|Any CPU.ActiveCfg = Release|x86\r\n\t\t{AEDEC1D7-8C49-4A54-B265-F595CFD89247}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{AEDEC1D7-8C49-4A54-B265-F595CFD89247}.Release|x64.Build.0 = Release|x64\r\n\t\t{AEDEC1D7-8C49-4A54-B265-F595CFD89247}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{AEDEC1D7-8C49-4A54-B265-F595CFD89247}.Release|x86.Build.0 = Release|x86\r\n\t\t{9C73C47E-64C2-4691-A602-A8463185E232}.Debug|Any CPU.ActiveCfg = Debug|x86\r\n\t\t{9C73C47E-64C2-4691-A602-A8463185E232}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{9C73C47E-64C2-4691-A602-A8463185E232}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{9C73C47E-64C2-4691-A602-A8463185E232}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{9C73C47E-64C2-4691-A602-A8463185E232}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{9C73C47E-64C2-4691-A602-A8463185E232}.Release|Any CPU.ActiveCfg = Release|x86\r\n\t\t{9C73C47E-64C2-4691-A602-A8463185E232}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{9C73C47E-64C2-4691-A602-A8463185E232}.Release|x64.Build.0 = Release|x64\r\n\t\t{9C73C47E-64C2-4691-A602-A8463185E232}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{9C73C47E-64C2-4691-A602-A8463185E232}.Release|x86.Build.0 = Release|x86\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Release|x64.Build.0 = Release|x64\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Release|x86.ActiveCfg = Release|Any CPU\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C}.Release|x86.Build.0 = Release|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Debug|x64.ActiveCfg = Debug|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Debug|x64.Build.0 = Debug|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Debug|x86.ActiveCfg = Debug|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Debug|x86.Build.0 = Debug|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Release|x64.ActiveCfg = Release|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Release|x64.Build.0 = Release|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Release|x86.ActiveCfg = Release|Any CPU\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}.Release|x86.Build.0 = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Debug|x64.ActiveCfg = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Debug|x64.Build.0 = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Debug|x86.ActiveCfg = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Debug|x86.Build.0 = Debug|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Release|x64.ActiveCfg = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Release|x64.Build.0 = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Release|x86.ActiveCfg = Release|Any CPU\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}.Release|x86.Build.0 = Release|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Debug|x64.ActiveCfg = Debug|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Debug|x64.Build.0 = Debug|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Debug|x86.ActiveCfg = Debug|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Debug|x86.Build.0 = Debug|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Release|x64.ActiveCfg = Release|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Release|x64.Build.0 = Release|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Release|x86.ActiveCfg = Release|Any CPU\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}.Release|x86.Build.0 = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(NestedProjects) = preSolution\r\n\t\t{62DDB6BD-36D1-42C1-BA38-6C7550EA366E} = {214A3A6E-C961-405E-8F5E-96314B672CF2}\r\n\t\t{DB0E5B51-2960-4869-899D-5E0C65A697A6} = {FBE3E4C8-611E-435D-B47C-FE006AAA8C4A}\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F6} = {FBE3E4C8-611E-435D-B47C-FE006AAA8C4A}\r\n\t\t{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B} = {FBE3E4C8-611E-435D-B47C-FE006AAA8C4A}\r\n\t\t{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69} = {FBE3E4C8-611E-435D-B47C-FE006AAA8C4A}\r\n\t\t{AEDEC1D7-8C49-4A54-B265-F595CFD89247} = {FBE3E4C8-611E-435D-B47C-FE006AAA8C4A}\r\n\t\t{9C73C47E-64C2-4691-A602-A8463185E232} = {214A3A6E-C961-405E-8F5E-96314B672CF2}\r\n\t\t{256026D4-A05D-438C-BD11-2D3FBADB2B4C} = {FBE3E4C8-611E-435D-B47C-FE006AAA8C4A}\r\n\t\t{BF51C274-61E9-4C47-94F4-1C2EF46EBB33} = {214A3A6E-C961-405E-8F5E-96314B672CF2}\r\n\t\t{AFE32BF4-E669-4E3F-8363-1D32BEB158F5} = {FBE3E4C8-611E-435D-B47C-FE006AAA8C4A}\r\n\t\t{94B6E43B-3907-4C1B-A804-AF1D1ADEF286} = {FBE3E4C8-611E-435D-B47C-FE006AAA8C4A}\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {3300FF38-9F6F-4C0F-87F3-776D6C64846D}\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\n\tGlobalSection(Performance) = preSolution\r\n\t\tHasPerformanceSessions = true\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "source/PlayniteSDK/ApplicationMode.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents Playnite's application mode.\r\n    /// </summary>\r\n    public enum ApplicationMode\r\n    {\r\n        /// <summary>\r\n        /// Desktop application mode.\r\n        /// </summary>\r\n        [Description(\"Desktop\")]\r\n        Desktop,\r\n\r\n        /// <summary>\r\n        /// Fullscreen application mode.\r\n        /// </summary>\r\n        [Description(\"Fullscreen\")]\r\n        Fullscreen\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/BuiltInExtensions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents built-in plugin distributed by default with Playnite installation.\r\n    /// </summary>\r\n    public enum BuiltinExtension\r\n    {\r\n        ///\r\n        Unknown,\r\n        ///\r\n        BattleNetLibrary,\r\n        ///\r\n        BethesdaLibrary,\r\n        ///\r\n        EpicLibrary,\r\n        ///\r\n        GogLibrary,\r\n        ///\r\n        ItchioLibrary,\r\n        ///\r\n        OriginLibrary,\r\n        ///\r\n        SteamLibrary,\r\n        ///\r\n        UplayLibrary,\r\n        ///\r\n        TwitchLibrary,\r\n        ///\r\n        IgdbMetadata,\r\n        ///\r\n        HumbleLibrary,\r\n        ///\r\n        XboxLibrary,\r\n        ///\r\n        AmazonGamesLibrary,\r\n        ///\r\n        PSNLibrary\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents class with utilities for built-in extensions.\r\n    /// </summary>\r\n    public class BuiltinExtensions\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public static string[] BuiltinExtensionIds { get; } = new string[]\r\n        {\r\n            \"AmazonLibrary_Builtin\",\r\n            \"BattlenetLibrary_Builtin\",\r\n            \"BethesdaLibrary_Builtin\",\r\n            \"EpicGamesLibrary_Builtin\",\r\n            \"GogLibrary_Builtin\",\r\n            \"HumbleLibrary_Builtin\",\r\n            \"IGDBMetadata_Builtin\",\r\n            \"ItchioLibrary_Builtin\",\r\n            \"LibraryExporterPS_Builtin\",\r\n            \"OriginLibrary_Builtin\",\r\n            \"PlayStationLibrary_Builtin\",\r\n            \"SteamLibrary_Builtin\",\r\n            \"TwitchLibrary_Builtin\",\r\n            \"UplayLibrary_Builtin\",\r\n            \"XboxLibrary_Builtin\"\r\n        };\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public static string[] BuiltinThemeIds { get; } = new string[]\r\n        {\r\n            \"Playnite_builtin_DefaultFullscreen\",\r\n            \"Playnite_builtin_DefaultDesktop\",\r\n        };\r\n\r\n        /// <summary>\r\n        /// Gets list of built-in extension plugins.\r\n        /// </summary>\r\n        public static Dictionary<Guid, BuiltinExtension> ExtensionList { get; } = new Dictionary<Guid, BuiltinExtension>\r\n        {\r\n            { Guid.Parse(\"E3C26A3D-D695-4CB7-A769-5FF7612C7EDD\"), BuiltinExtension.BattleNetLibrary },\r\n            { Guid.Parse(\"0E2E793E-E0DD-4447-835C-C44A1FD506EC\"), BuiltinExtension.BethesdaLibrary },\r\n            { Guid.Parse(\"00000002-DBD1-46C6-B5D0-B1BA559D10E4\"), BuiltinExtension.EpicLibrary },\r\n            { Guid.Parse(\"AEBE8B7C-6DC3-4A66-AF31-E7375C6B5E9E\"), BuiltinExtension.GogLibrary },\r\n            { Guid.Parse(\"00000001-EBB2-4EEC-ABCB-7C89937A42BB\"), BuiltinExtension.ItchioLibrary },\r\n            { Guid.Parse(\"85DD7072-2F20-4E76-A007-41035E390724\"), BuiltinExtension.OriginLibrary },\r\n            { Guid.Parse(\"CB91DFC9-B977-43BF-8E70-55F46E410FAB\"), BuiltinExtension.SteamLibrary },\r\n            { Guid.Parse(\"E2A7D494-C138-489D-BB3F-1D786BEEB675\"), BuiltinExtension.TwitchLibrary },\r\n            { Guid.Parse(\"C2F038E5-8B92-4877-91F1-DA9094155FC5\"), BuiltinExtension.UplayLibrary },\r\n            { Guid.Parse(\"000001DB-DBD1-46C6-B5D0-B1BA559D10E4\"), BuiltinExtension.IgdbMetadata },\r\n            { Guid.Parse(\"96e8c4bc-ec5c-4c8b-87e7-18ee5a690626\"), BuiltinExtension.HumbleLibrary },\r\n            { Guid.Parse(\"7e4fbb5e-2ae3-48d4-8ba0-6b30e7a4e287\"), BuiltinExtension.XboxLibrary },\r\n            { Guid.Parse(\"402674cd-4af6-4886-b6ec-0e695bfa0688\"), BuiltinExtension.AmazonGamesLibrary },\r\n            { Guid.Parse(\"e4ac81cb-1b1a-4ec9-8639-9a9633989a71\"), BuiltinExtension.PSNLibrary }\r\n        };\r\n\r\n        /// <summary>\r\n        /// Returns if specified plugin is built-in plugin.\r\n        /// </summary>\r\n        /// <param name=\"pluginId\"></param>\r\n        /// <returns></returns>\r\n        public static bool GetIsBuiltInPlugin(Guid pluginId)\r\n        {\r\n            return ExtensionList.ContainsKey(pluginId);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets extension plugin by plugin's ID.\r\n        /// </summary>\r\n        /// <param name=\"id\"></param>\r\n        /// <returns></returns>\r\n        public static BuiltinExtension GetExtensionFromId(Guid id)\r\n        {\r\n            if (ExtensionList.ContainsKey(id))\r\n            {\r\n                return ExtensionList[id];\r\n            }\r\n            else\r\n            {\r\n                return BuiltinExtension.Unknown;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets plugin ID for specified built-in extension.\r\n        /// </summary>\r\n        /// <param name=\"extension\"></param>\r\n        /// <returns></returns>\r\n        public static Guid GetIdFromExtension(BuiltinExtension extension)\r\n        {\r\n            if (ExtensionList.ContainsValue(extension))\r\n            {\r\n                return ExtensionList.First(a => a.Value == extension).Key;\r\n            }\r\n            else\r\n            {\r\n                return Guid.Empty;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Collections/ComparableList.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Data;\r\n\r\nnamespace System.Collections.Generic\r\n{\r\n    /// <summary>\r\n    /// Represents comparable database item collection.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\">Database object type.</typeparam>\r\n    public class ComparableDbItemList<T> : List<T>, IComparable where T : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of ComparableDbItemList.\r\n        /// </summary>\r\n        /// <param name=\"collection\">Intial collection.</param>\r\n        public ComparableDbItemList(IEnumerable<T> collection) : base(collection ?? new List<T>())\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public int CompareTo(object obj)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                return -1;\r\n            }\r\n\r\n            var list2 = (List<T>)obj;\r\n            if (Count == 0 && list2.Count == 0)\r\n            {\r\n                return 0;\r\n            }\r\n\r\n            if (list2.Any() == false && Count > 0)\r\n            {\r\n                return -1;\r\n            }\r\n\r\n            if (this.Any() == false && list2.Count > 0)\r\n            {\r\n                return 1;\r\n            }\r\n\r\n            var str1 = string.Join(\", \", this);\r\n            var str2 = string.Join(\", \", list2);\r\n            return str1.CompareTo(str2);\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Highly unoptimized, should not be used anywhere anymore in new code.\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class ComparableList<T>: List<T>, IComparable\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public ComparableList()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"count\"></param>\r\n        public ComparableList(int count) : base(count)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"collection\"></param>\r\n        public ComparableList(IEnumerable<T> collection) : base(collection ?? new List<T>())\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public int CompareTo(object obj)\r\n        {\r\n            if (obj == null)\r\n            {\r\n                return -1;\r\n            }\r\n\r\n            var list2 = obj as List<T>;\r\n            var str1 = string.Join(\", \", this);\r\n            var str2 = string.Join(\", \", list2);\r\n            return str1.CompareTo(str2);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Collections/ObservableConcurrentDictionary.cs",
    "content": "﻿//--------------------------------------------------------------------------\r\n//\r\n//  Copyright (c) Microsoft Corporation.  All rights reserved.\r\n//\r\n//  File: ObservableConcurrentDictionary.cs\r\n//\r\n//--------------------------------------------------------------------------\r\n\r\nusing System.Collections.Generic;\r\nusing System.Collections.Specialized;\r\nusing System.ComponentModel;\r\nusing System.Threading;\r\nusing System.Diagnostics;\r\n\r\nnamespace System.Collections.Concurrent\r\n{\r\n    /// <summary>\r\n    /// Provides a thread-safe dictionary for use with data binding.\r\n    /// </summary>\r\n    /// <typeparam name=\"TKey\">Specifies the type of the keys in this collection.</typeparam>\r\n    /// <typeparam name=\"TValue\">Specifies the type of the values in this collection.</typeparam>\r\n    [DebuggerDisplay(\"Count={Count}\")]\r\n    public class ObservableConcurrentDictionary<TKey, TValue> :\r\n        ICollection<KeyValuePair<TKey, TValue>>, IDictionary<TKey, TValue>,\r\n        INotifyCollectionChanged, INotifyPropertyChanged\r\n    {\r\n        private readonly SynchronizationContext _context;\r\n        private readonly ConcurrentDictionary<TKey, TValue> _dictionary;\r\n\r\n        /// <summary>\r\n        /// Initializes an instance of the ObservableConcurrentDictionary class.\r\n        /// </summary>\r\n        public ObservableConcurrentDictionary()\r\n        {\r\n            _context = AsyncOperationManager.SynchronizationContext;\r\n            _dictionary = new ConcurrentDictionary<TKey, TValue>();\r\n        }\r\n\r\n        /// <summary>Event raised when the collection changes.</summary>\r\n        public event NotifyCollectionChangedEventHandler CollectionChanged;\r\n        /// <summary>Event raised when a property in the collection changes.</summary>\r\n        public event PropertyChangedEventHandler PropertyChanged;\r\n\r\n        /// <summary>\r\n        /// Notifies observers of CollectionChanged or PropertyChanged of an update to the dictionary.\r\n        /// </summary>\r\n        private void NotifyObserversOfChange()\r\n        {\r\n            var collectionHandler = CollectionChanged;\r\n            var propertyHandler = PropertyChanged;\r\n            if (collectionHandler != null || propertyHandler != null)\r\n            {\r\n                _context.Send(s =>\r\n                {\r\n                    collectionHandler?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));\r\n\r\n                    if (propertyHandler != null)\r\n                    {\r\n                        propertyHandler(this, new PropertyChangedEventArgs(\"Count\"));\r\n                        propertyHandler(this, new PropertyChangedEventArgs(\"Keys\"));\r\n                        propertyHandler(this, new PropertyChangedEventArgs(\"Values\"));\r\n                    }\r\n                }, null);\r\n            }\r\n        }\r\n\r\n        /// <summary>Attempts to add an item to the dictionary, notifying observers of any changes.</summary>\r\n        /// <param name=\"item\">The item to be added.</param>\r\n        /// <returns>Whether the add was successful.</returns>\r\n        private bool TryAddWithNotification(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            return TryAddWithNotification(item.Key, item.Value);\r\n        }\r\n\r\n        /// <summary>Attempts to add an item to the dictionary, notifying observers of any changes.</summary>\r\n        /// <param name=\"key\">The key of the item to be added.</param>\r\n        /// <param name=\"value\">The value of the item to be added.</param>\r\n        /// <returns>Whether the add was successful.</returns>\r\n        private bool TryAddWithNotification(TKey key, TValue value)\r\n        {\r\n            bool result = _dictionary.TryAdd(key, value);\r\n            if (result)\r\n                NotifyObserversOfChange();\r\n            return result;\r\n        }\r\n\r\n        /// <summary>Attempts to remove an item from the dictionary, notifying observers of any changes.</summary>\r\n        /// <param name=\"key\">The key of the item to be removed.</param>\r\n        /// <param name=\"value\">The value of the item removed.</param>\r\n        /// <returns>Whether the removal was successful.</returns>\r\n        private bool TryRemoveWithNotification(TKey key, out TValue value)\r\n        {\r\n            bool result = _dictionary.TryRemove(key, out value);\r\n            if (result)\r\n                NotifyObserversOfChange();\r\n            return result;\r\n        }\r\n\r\n        /// <summary>Attempts to add or update an item in the dictionary, notifying observers of any changes.</summary>\r\n        /// <param name=\"key\">The key of the item to be updated.</param>\r\n        /// <param name=\"value\">The new value to set for the item.</param>\r\n        /// <returns>Whether the update was successful.</returns>\r\n        private void UpdateWithNotification(TKey key, TValue value)\r\n        {\r\n            _dictionary[key] = value;\r\n            NotifyObserversOfChange();\r\n        }\r\n\r\n        #region ICollection<KeyValuePair<TKey,TValue>> Members\r\n        void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            TryAddWithNotification(item);\r\n        }\r\n\r\n        void ICollection<KeyValuePair<TKey, TValue>>.Clear()\r\n        {\r\n            ((ICollection<KeyValuePair<TKey, TValue>>)_dictionary).Clear();\r\n            NotifyObserversOfChange();\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            return ((ICollection<KeyValuePair<TKey, TValue>>)_dictionary).Contains(item);\r\n        }\r\n\r\n        void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)\r\n        {\r\n            ((ICollection<KeyValuePair<TKey, TValue>>)_dictionary).CopyTo(array, arrayIndex);\r\n        }\r\n\r\n        int ICollection<KeyValuePair<TKey, TValue>>.Count\r\n        {\r\n            get\r\n            {\r\n                return ((ICollection<KeyValuePair<TKey, TValue>>)_dictionary).Count;\r\n            }\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly\r\n        {\r\n            get\r\n            {\r\n                return ((ICollection<KeyValuePair<TKey, TValue>>)_dictionary).IsReadOnly;\r\n            }\r\n        }\r\n\r\n        bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item)\r\n        {\r\n            return TryRemoveWithNotification(item.Key, out TValue temp);\r\n        }\r\n        #endregion\r\n\r\n        #region IEnumerable<KeyValuePair<TKey,TValue>> Members\r\n        IEnumerator<KeyValuePair<TKey, TValue>> IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator()\r\n        {\r\n            return ((ICollection<KeyValuePair<TKey, TValue>>)_dictionary).GetEnumerator();\r\n        }\r\n\r\n        IEnumerator IEnumerable.GetEnumerator()\r\n        {\r\n            return ((ICollection<KeyValuePair<TKey, TValue>>)_dictionary).GetEnumerator();\r\n        }\r\n        #endregion\r\n\r\n        #region IDictionary<TKey,TValue> Members\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"key\"></param>\r\n        /// <param name=\"value\"></param>\r\n        public void Add(TKey key, TValue value)\r\n        {\r\n            TryAddWithNotification(key, value);\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"key\"></param>\r\n        /// <returns></returns>\r\n        public bool ContainsKey(TKey key)\r\n        {\r\n            return _dictionary.ContainsKey(key);\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public ICollection<TKey> Keys\r\n        {\r\n            get\r\n            {\r\n                return _dictionary.Keys;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"key\"></param>\r\n        /// <returns></returns>\r\n        public bool Remove(TKey key)\r\n        {\r\n            return TryRemoveWithNotification(key, out TValue temp);\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"key\"></param>\r\n        /// <param name=\"value\"></param>\r\n        /// <returns></returns>\r\n        public bool TryGetValue(TKey key, out TValue value)\r\n        {\r\n            return _dictionary.TryGetValue(key, out value);\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public ICollection<TValue> Values\r\n        {\r\n            get\r\n            {\r\n                return _dictionary.Values;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"key\"></param>\r\n        /// <returns></returns>\r\n        public TValue this[TKey key]\r\n        {\r\n            get\r\n            {\r\n                return _dictionary[key];\r\n            }\r\n            set\r\n            {\r\n                UpdateWithNotification(key, value);\r\n            }\r\n        }\r\n        #endregion\r\n    }\r\n}"
  },
  {
    "path": "source/PlayniteSDK/Collections/ObservableObject.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System.Collections.Generic\r\n{\r\n    /// <summary>\r\n    /// Represents object implementing INotifyPropertyChanged.\r\n    /// </summary>\r\n    public abstract class ObservableObject : INotifyPropertyChanged\r\n    {\r\n        /// <summary>\r\n        /// If set to <c>true</c> no <see cref=\"PropertyChanged\"/> events will be fired.\r\n        /// </summary>\r\n        internal bool SuppressNotifications\r\n        {\r\n            get; set;\r\n        } = false;\r\n\r\n        /// <summary>\r\n        /// Occurs when a property value changes\r\n        /// </summary>\r\n        public event PropertyChangedEventHandler PropertyChanged;\r\n\r\n        /// <summary>\r\n        /// Invokes PropertyChanged events.\r\n        /// </summary>\r\n        /// <param name=\"name\">Name of property that changed.</param>\r\n        public void OnPropertyChanged([CallerMemberName]string name = null)\r\n        {\r\n            if (!SuppressNotifications)\r\n            {\r\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"property\"></param>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"propertyName\"></param>\r\n        protected void SetValue<T>(ref T property, T value, [CallerMemberName]string propertyName = null)\r\n        {\r\n            property = value;\r\n            OnPropertyChanged(propertyName);\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"property\"></param>\r\n        /// <param name=\"value\"></param>\r\n        /// <param name=\"propertyNames\"></param>\r\n        protected void SetValue<T>(ref T property, T value, params string[] propertyNames)\r\n        {\r\n            property = value;\r\n            foreach (var pro in propertyNames)\r\n            {\r\n                OnPropertyChanged(pro);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Collections/RangeObservableCollection.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Collections.Specialized;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System.Collections.Generic\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class RangeObservableCollection<T> : ObservableCollection<T>\r\n    {\r\n        private bool suppressNotification = false;\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"e\"></param>\r\n        public void OnCollectionChangedPublic(NotifyCollectionChangedEventArgs e)\r\n        {\r\n            OnCollectionChanged(e);\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"e\"></param>\r\n        protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)\r\n        {\r\n            if (!suppressNotification)\r\n            {\r\n                base.OnCollectionChanged(e);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"index\"></param>\r\n        /// <param name=\"oldIndex\"></param>\r\n        public void OnItemMoved(object obj, int index, int oldIndex)\r\n        {\r\n            if (!suppressNotification)\r\n            {\r\n                base.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, obj, index, oldIndex));\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"list\"></param>\r\n        public void AddRange(IEnumerable<T> list)\r\n        {\r\n            if (list == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            suppressNotification = true;\r\n            foreach (T item in list)\r\n            {\r\n                Add(item);\r\n            }\r\n\r\n            suppressNotification = false;\r\n            OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"list\"></param>\r\n        public void RemoveRange(IEnumerable<T> list)\r\n        {\r\n            if (list == null)\r\n            {\r\n                return;\r\n            }\r\n\r\n            suppressNotification = true;\r\n            foreach (T item in list)\r\n            {\r\n                Remove(item);\r\n            }\r\n\r\n            suppressNotification = false;\r\n            OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Controls/PluginUserControl.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.SDK.Controls\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class PluginUserControl : UserControl\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public Game GameContext\r\n        {\r\n            get\r\n            {\r\n                return (Game)GetValue(GameContextProperty);\r\n            }\r\n\r\n            set\r\n            {\r\n                SetValue(GameContextProperty, value);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public static readonly DependencyProperty GameContextProperty = DependencyProperty.Register(\r\n            nameof(GameContext),\r\n            typeof(Game),\r\n            typeof(PluginUserControl),\r\n            new PropertyMetadata(null, GameContextPropertyChangedCallback));\r\n\r\n        private static void GameContextPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)\r\n        {\r\n            var newContext = e.NewValue as Game;\r\n            var oldContext = e.OldValue as Game;\r\n            if (sender is PluginUserControl obj)\r\n            {\r\n                try\r\n                {\r\n                    obj.GameContextChanged(oldContext, newContext);\r\n                }\r\n                catch (Exception exc)\r\n                {\r\n                    logger.Error(exc, $\"GameContextChanged from {obj.GetType().Name} plugin control failed.\");\r\n                }\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"oldContext\"></param>\r\n        /// <param name=\"newContext\"></param>\r\n        public virtual void GameContextChanged(Game oldContext, Game newContext)\r\n        {\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/PlayniteSDK/Data/DataSerialization.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Data\r\n{\r\n    /// <summary>\r\n    /// Represents serialization attribute to indicate that object member should be ignored during serialization.\r\n    /// </summary>\r\n    public class DontSerializeAttribute : Attribute\r\n    {\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents serialization attribute to set a specific serialization member name.\r\n    /// </summary>\r\n    public class SerializationPropertyNameAttribute : Attribute\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets serialization member name.\r\n        /// </summary>\r\n        public string PropertyName { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"SerializationPropertyNameAttribute\"/>.\r\n        /// </summary>\r\n        /// <param name=\"propertyName\"></param>\r\n        public SerializationPropertyNameAttribute(string propertyName)\r\n        {\r\n            PropertyName = propertyName;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes data serializer.\r\n    /// </summary>\r\n    public interface IDataSerializer\r\n    {\r\n        /// <summary>\r\n        /// Serialize an object to YAML string.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        string ToYaml(object obj);\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from YAML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"yaml\"></param>\r\n        /// <returns></returns>\r\n        T FromYaml<T>(string yaml) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from YAML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"yaml\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromYaml<T>(string yaml, out T content) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from YAML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"yaml\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromYaml<T>(string yaml, out T content, out Exception error) where T : class;\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from a file containing YAML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <returns></returns>\r\n        T FromYamlFile<T>(string filePath) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to serialize an object to YAML file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromYamlFile<T>(string filePath, out T content) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to serialize an object to YAML file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromYamlFile<T>(string filePath, out T content, out Exception error) where T : class;\r\n\r\n        /// <summary>\r\n        /// Serialize an object to JSON string.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"formatted\"></param>\r\n        /// <returns></returns>\r\n        string ToJson(object obj, bool formatted = false);\r\n\r\n        /// <summary>\r\n        /// Serialize an object to JSON string written to a stream.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"stream\"></param>\r\n        /// <param name=\"formatted\"></param>\r\n        void ToJsonStream(object obj, Stream stream, bool formatted = false);\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from JSON string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"json\"></param>\r\n        /// <returns></returns>\r\n        T FromJson<T>(string json) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"json\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromJson<T>(string json, out T content) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"json\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromJson<T>(string json, out T content, out Exception error) where T : class;\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from JSON data stream.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"stream\"></param>\r\n        /// <returns></returns>\r\n        T FromJsonStream<T>(Stream stream) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON data stream.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"stream\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromJsonStream<T>(Stream stream, out T content) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON data stream.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"stream\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromJsonStream<T>(Stream stream, out T content, out Exception error) where T : class;\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from a file containing JSON string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <returns></returns>\r\n        T FromJsonFile<T>(string filePath) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromJsonFile<T>(string filePath, out T content) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromJsonFile<T>(string filePath, out T content, out Exception error) where T : class;\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from TOML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"toml\"></param>\r\n        /// <returns></returns>\r\n        T FromToml<T>(string toml) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from TOML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"toml\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromToml<T>(string toml, out T content) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from TOML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"toml\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromToml<T>(string toml, out T content, out Exception error) where T : class;\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from a file containing TOML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <returns></returns>\r\n        T FromTomlFile<T>(string filePath) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from TOML file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromTomlFile<T>(string filePath, out T content) where T : class;\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from TOML file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        bool TryFromTomlFile<T>(string filePath, out T content, out Exception error) where T : class;\r\n\r\n        /// <summary>\r\n        /// Creates clone of an object using json serialization.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <returns></returns>\r\n        T GetClone<T>(T source) where T : class;\r\n\r\n        /// <summary>\r\n        /// Creates clone of an object using json serialization.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <typeparam name=\"U\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <returns></returns>\r\n        U GetClone<T, U>(T source)\r\n            where T : class\r\n            where U : class;\r\n\r\n        /// <summary>\r\n        /// Compares two objects using json serialization.\r\n        /// </summary>\r\n        /// <param name=\"object1\"></param>\r\n        /// <param name=\"object2\"></param>\r\n        /// <returns></returns>\r\n        bool AreObjectsEqual(object object1, object object2);\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents data serialization utility.\r\n    /// </summary>\r\n    public class Serialization\r\n    {\r\n        private static IDataSerializer serializer;\r\n\r\n        internal static void Init(IDataSerializer dataSerializer)\r\n        {\r\n            serializer = dataSerializer;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Serialize an object to YAML string.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public static string ToYaml(object obj)\r\n        {\r\n            return serializer.ToYaml(obj);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from YAML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"yaml\"></param>\r\n        /// <returns></returns>\r\n        public static T FromYaml<T>(string yaml) where T : class\r\n        {\r\n            return serializer.FromYaml<T>(yaml);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from YAML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"yaml\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromYaml<T>(string yaml, out T content) where T : class\r\n        {\r\n            return serializer.TryFromYaml<T>(yaml, out content);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from YAML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"yaml\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromYaml<T>(string yaml, out T content, out Exception error) where T : class\r\n        {\r\n            return serializer.TryFromYaml<T>(yaml, out content, out error);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from a file containing YAML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <returns></returns>\r\n        public static T FromYamlFile<T>(string filePath) where T : class\r\n        {\r\n            return serializer.FromYamlFile<T>(filePath);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from YAML file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromYamlFile<T>(string filePath, out T content) where T : class\r\n        {\r\n            return serializer.TryFromYamlFile<T>(filePath, out content);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from YAML file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromYamlFile<T>(string filePath, out T content, out Exception error) where T : class\r\n        {\r\n            return serializer.TryFromYamlFile<T>(filePath, out content, out error);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Serialize an object to JSON string.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"formatted\"></param>\r\n        /// <returns></returns>\r\n        public static string ToJson(object obj, bool formatted = false)\r\n        {\r\n            return serializer.ToJson(obj, formatted);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Serialize an object to JSON string written to a stream.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <param name=\"stream\"></param>\r\n        /// <param name=\"formatted\"></param>\r\n        public static void ToJsonStream(object obj, Stream stream, bool formatted = false)\r\n        {\r\n            serializer.ToJsonStream(obj, stream, formatted);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from JSON string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"json\"></param>\r\n        /// <returns></returns>\r\n        public static T FromJson<T>(string json) where T : class\r\n        {\r\n            return serializer.FromJson<T>(json);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"json\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromJson<T>(string json, out T content) where T : class\r\n        {\r\n            return serializer.TryFromJson<T>(json, out content);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"json\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromJson<T>(string json, out T content, out Exception error) where T : class\r\n        {\r\n            return serializer.TryFromJson<T>(json, out content, out error);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from JSON data stream.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"stream\"></param>\r\n        /// <returns></returns>\r\n        public static T FromJsonStream<T>(Stream stream) where T : class\r\n        {\r\n            return serializer.FromJsonStream<T>(stream);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON data stream.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"stream\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromJsonStream<T>(Stream stream, out T content) where T : class\r\n        {\r\n            return serializer.TryFromJsonStream<T>(stream, out content);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON data stream.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"stream\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromJsonStream<T>(Stream stream, out T content, out Exception error) where T : class\r\n        {\r\n            return serializer.TryFromJsonStream<T>(stream, out content, out error);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from a file containing JSON string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <returns></returns>\r\n        public static T FromJsonFile<T>(string filePath) where T : class\r\n        {\r\n            return serializer.FromJsonFile<T>(filePath);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromJsonFile<T>(string filePath, out T content) where T : class\r\n        {\r\n            return serializer.TryFromJsonFile<T>(filePath, out content);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from JSON file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromJsonFile<T>(string filePath, out T content, out Exception error) where T : class\r\n        {\r\n            return serializer.TryFromJsonFile<T>(filePath, out content, out error);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from TOML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"toml\"></param>\r\n        /// <returns></returns>\r\n        public static T FromToml<T>(string toml) where T : class\r\n        {\r\n            return serializer.FromToml<T>(toml);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from TOML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"toml\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromToml<T>(string toml, out T content) where T : class\r\n        {\r\n            return serializer.TryFromToml<T>(toml, out content);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from TOML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"toml\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromToml<T>(string toml, out T content, out Exception error) where T : class\r\n        {\r\n            return serializer.TryFromToml<T>(toml, out content, out error);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Deserialize an object from a file containing TOML string.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <returns></returns>\r\n        public static T FromTomlFile<T>(string filePath) where T : class\r\n        {\r\n            return serializer.FromTomlFile<T>(filePath);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from TOML file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromTomlFile<T>(string filePath, out T content) where T : class\r\n        {\r\n            return serializer.TryFromTomlFile<T>(filePath, out content);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Tries to deserialize an object from TOML file.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"filePath\"></param>\r\n        /// <param name=\"content\"></param>\r\n        /// <param name=\"error\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryFromTomlFile<T>(string filePath, out T content, out Exception error) where T : class\r\n        {\r\n            return serializer.TryFromTomlFile<T>(filePath, out content, out error);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates clone of an object using json serialization.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <returns></returns>\r\n        public static T GetClone<T>(T source) where T : class\r\n        {\r\n            return serializer.GetClone<T>(source);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates clone of an object using json serialization.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <typeparam name=\"U\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <returns></returns>\r\n        public static U GetClone<T, U>(T source)\r\n            where T : class\r\n            where U : class\r\n        {\r\n            return serializer.GetClone<T, U>(source);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Compares two objects using json serialization.\r\n        /// </summary>\r\n        /// <param name=\"object1\"></param>\r\n        /// <param name=\"object2\"></param>\r\n        /// <returns></returns>\r\n        public static bool AreObjectsEqual(object object1, object object2)\r\n        {\r\n            return serializer.AreObjectsEqual(object1, object2);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Data/MarkupConverter.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Data\r\n{\r\n    /// <summary>\r\n    /// Describes markup converter.\r\n    /// </summary>\r\n    public interface IMarkupConverter\r\n    {\r\n        /// <summary>\r\n        /// Converts Markdown markup to HTML.\r\n        /// </summary>\r\n        /// <param name=\"markdown\"></param>\r\n        /// <returns></returns>\r\n        string MarkdownToHtml(string markdown);\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents markup converter.\r\n    /// </summary>\r\n    public class Markup\r\n    {\r\n        private static IMarkupConverter converter;\r\n\r\n        internal static void Init(IMarkupConverter textConverter)\r\n        {\r\n            converter = textConverter;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Converts Markdown markup to HTML.\r\n        /// </summary>\r\n        /// <param name=\"markdown\"></param>\r\n        /// <returns></returns>\r\n        public static string MarkdownToHtml(string markdown)\r\n        {\r\n            return converter.MarkdownToHtml(markdown);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Data/SQLite.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Data\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    [Flags]\r\n    public enum SqliteOpenFlags\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        ReadOnly = 1,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        ReadWrite = 2,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Create = 4,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        NoMutex = 32768,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        FullMutex = 65536,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        SharedCache = 131072,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        PrivateCache = 262144,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        ProtectionComplete = 1048576,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        ProtectionCompleteUnlessOpen = 2097152,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        ProtectionCompleteUntilFirstUserAuthentication = 3145728,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        ProtectionNone = 4194304\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public interface ISQLite : IDisposable\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"query\"></param>\r\n        /// <param name=\"args\"></param>\r\n        /// <returns></returns>\r\n        List<T> Query<T>(string query, params object[] args) where T : new();\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class SQLite\r\n    {\r\n        private static Func<string, SqliteOpenFlags, ISQLite> generatorFunc;\r\n\r\n        internal static void Init(Func<string, SqliteOpenFlags, ISQLite> func)\r\n        {\r\n            generatorFunc = func;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"dbPath\"></param>\r\n        /// <param name=\"openFlags\"></param>\r\n        /// <returns></returns>\r\n        public static ISQLite OpenDatabase(string dbPath, SqliteOpenFlags openFlags)\r\n        {\r\n            return generatorFunc(dbPath, openFlags);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Database/IGameDatabase.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents type of game database collection.\r\n    /// </summary>\r\n    public enum GameDatabaseCollection\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Uknown,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Games,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Platforms,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Emulators,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Genres,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Companies,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Tags,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Categories,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Series,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        AgeRatings,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Regions,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Sources,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Features,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        AppSoftware,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        GameScanners,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        FilterPresets,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        ImportExclusions,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        CompletionStatuses\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes game databse API.\r\n    /// </summary>\r\n    public interface IGameDatabase\r\n    {\r\n        /// <summary>\r\n        /// Gets collection of games.\r\n        /// </summary>\r\n        IItemCollection<Game> Games { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collections of platforms.\r\n        /// </summary>\r\n        IItemCollection<Platform> Platforms { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of emulators.\r\n        /// </summary>\r\n        IItemCollection<Emulator> Emulators { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of genres.\r\n        /// </summary>\r\n        IItemCollection<Genre> Genres { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of companies.\r\n        /// </summary>\r\n        IItemCollection<Company> Companies { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of tags.\r\n        /// </summary>\r\n        IItemCollection<Tag> Tags { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of categories.\r\n        /// </summary>\r\n        IItemCollection<Category> Categories { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of series.\r\n        /// </summary>\r\n        IItemCollection<Series> Series { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of age ratings.\r\n        /// </summary>\r\n        IItemCollection<AgeRating> AgeRatings { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of regions.\r\n        /// </summary>\r\n        IItemCollection<Region> Regions { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of sources.\r\n        /// </summary>\r\n        IItemCollection<GameSource> Sources { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of game features.\r\n        /// </summary>\r\n        IItemCollection<GameFeature> Features { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of game features.\r\n        /// </summary>\r\n        IItemCollection<GameScannerConfig> GameScanners { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of game statuses.\r\n        /// </summary>\r\n        IItemCollection<CompletionStatus> CompletionStatuses { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of import exclusions.\r\n        /// </summary>\r\n        IItemCollection<ImportExclusionItem> ImportExclusions { get; }\r\n\r\n        /// <summary>\r\n        /// Gets collection of filter presets.\r\n        /// </summary>\r\n        IItemCollection<FilterPreset> FilterPresets { get; }\r\n\r\n        /// <summary>\r\n        /// Gets value indicating whether database is opened.\r\n        /// </summary>\r\n        bool IsOpen { get; }\r\n\r\n        /// <summary>\r\n        /// Invoked when database is being opened.\r\n        /// </summary>\r\n        event EventHandler DatabaseOpened;\r\n\r\n        /// <summary>\r\n        /// Import new game into database.\r\n        /// </summary>\r\n        /// <param name=\"game\">Game data to import.</param>\r\n        /// <returns>Imported game.</returns>\r\n        Game ImportGame(GameMetadata game);\r\n\r\n        /// <summary>\r\n        /// Import new game into database from a library plugin.\r\n        /// </summary>\r\n        /// <param name=\"game\">Game data to import.</param>\r\n        /// <param name=\"sourcePlugin\">Source library plugin.</param>\r\n        /// <returns>Imported game.</returns>\r\n        Game ImportGame(GameMetadata game, LibraryPlugin sourcePlugin);\r\n\r\n        /// <summary>\r\n        /// Checks if the game matches specified filter settings.\r\n        /// </summary>\r\n        /// <param name=\"game\"></param>\r\n        /// <param name=\"filterSettings\"></param>\r\n        /// <returns></returns>\r\n        bool GetGameMatchesFilter(Game game, FilterPresetSettings filterSettings);\r\n\r\n        /// <summary>\r\n        /// Returns enumeration of all games matching specified filter settings.\r\n        /// </summary>\r\n        /// <param name=\"filterSettings\"></param>\r\n        /// <returns></returns>\r\n        IEnumerable<Game> GetFilteredGames(FilterPresetSettings filterSettings);\r\n\r\n        /// <summary>\r\n        /// Checks if the game matches specified filter settings.\r\n        /// </summary>\r\n        /// <param name=\"game\"></param>\r\n        /// <param name=\"filterSettings\"></param>\r\n        /// <param name=\"useFuzzyNameMatch\"></param>\r\n        /// <returns></returns>\r\n        bool GetGameMatchesFilter(Game game, FilterPresetSettings filterSettings, bool useFuzzyNameMatch);\r\n\r\n        /// <summary>\r\n        /// Returns enumeration of all games matching specified filter settings.\r\n        /// </summary>\r\n        /// <param name=\"filterSettings\"></param>\r\n        /// <param name=\"useFuzzyNameMatch\"></param>\r\n        /// <returns></returns>\r\n        IEnumerable<Game> GetFilteredGames(FilterPresetSettings filterSettings, bool useFuzzyNameMatch);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Database/IGameDatabaseAPI.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.SDK.Models;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes object providing game database API.\r\n    /// </summary>\r\n    public interface IGameDatabaseAPI : IGameDatabase\r\n    {\r\n        /// <summary>\r\n        /// Gets full path to database directory location.\r\n        /// </summary>\r\n        string DatabasePath { get; }\r\n\r\n        /// <summary>\r\n        /// Add file to data storage.\r\n        /// </summary>\r\n        /// <param name=\"path\">Path of the file to be added.</param>\r\n        /// <param name=\"parentId\">Databse item parent containning the file.</param>\r\n        /// <returns>Database id of added file.</returns>\r\n        string AddFile(string path, Guid parentId);\r\n\r\n        /// <summary>\r\n        /// Exports file from database.\r\n        /// </summary>\r\n        /// <param name=\"id\">File id.</param>\r\n        /// <param name=\"path\">Full path to target file.</param>\r\n        void SaveFile(string id, string path);\r\n\r\n        /// <summary>\r\n        /// Removes file from database.\r\n        /// </summary>\r\n        /// <param name=\"id\">File id.</param>\r\n        void RemoveFile(string id);\r\n\r\n        /// <summary>\r\n        /// Switches database to buffered mode. Suppresses all notification events until buffering is stopped.\r\n        /// </summary>\r\n        /// <returns>Buffer object.</returns>\r\n        IDisposable BufferedUpdate();\r\n\r\n        /// <summary>\r\n        /// Begins buffered update. Suppresses all notification events until buffering is stopped.\r\n        /// </summary>\r\n        void BeginBufferUpdate();\r\n\r\n        /// <summary>\r\n        /// Ends buffered update.\r\n        /// </summary>\r\n        void EndBufferUpdate();\r\n\r\n        /// <summary>\r\n        /// Returns full path to directory storing files for specified parent.\r\n        /// </summary>\r\n        /// <param name=\"parentId\">Id of parent object.</param>\r\n        /// <returns>Full path to directory.</returns>\r\n        string GetFileStoragePath(Guid parentId);\r\n\r\n        /// <summary>\r\n        /// Returns full path to a file based on database path.\r\n        /// </summary>\r\n        /// <param name=\"databasePath\">Database path as set to game's field.</param>\r\n        /// <returns>Full path to a file.</returns>\r\n        string GetFullFilePath(string databasePath);\r\n    }\r\n}"
  },
  {
    "path": "source/PlayniteSDK/Database/IItemCollection.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents event occuring when database are permanetly updated in database.\r\n    /// </summary>\r\n    /// <typeparam name=\"TItem\"></typeparam>\r\n    public class ItemUpdateEvent<TItem> where TItem : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets old item state.\r\n        /// </summary>\r\n        public TItem OldData\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets or sets new item state.\r\n        /// </summary>\r\n        public TItem NewData\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of ItemUpdateEvent.\r\n        /// </summary>\r\n        /// <param name=\"oldData\">Old state.</param>\r\n        /// <param name=\"newData\">New state.</param>\r\n        public ItemUpdateEvent(TItem oldData, TItem newData)\r\n        {\r\n            OldData = oldData;\r\n            NewData = newData;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for collection update events.\r\n    /// </summary>\r\n    /// <typeparam name=\"TItem\"></typeparam>\r\n    public class ItemUpdatedEventArgs<TItem> : EventArgs where TItem : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets list of update events.\r\n        /// </summary>\r\n        public List<ItemUpdateEvent<TItem>> UpdatedItems\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of ItemUpdatedEventArgs.\r\n        /// </summary>\r\n        /// <param name=\"oldData\">Old item state.</param>\r\n        /// <param name=\"newData\">New item state.</param>\r\n        public ItemUpdatedEventArgs(TItem oldData, TItem newData)\r\n        {\r\n            UpdatedItems = new List<ItemUpdateEvent<TItem>>() { new ItemUpdateEvent<TItem>(oldData, newData) };\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of ItemUpdatedEventArgs.\r\n        /// </summary>\r\n        /// <param name=\"updatedItems\">Update events list.</param>\r\n        public ItemUpdatedEventArgs(IEnumerable<ItemUpdateEvent<TItem>> updatedItems)\r\n        {\r\n            UpdatedItems = updatedItems.ToList();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for collection change events.\r\n    /// </summary>\r\n    /// <typeparam name=\"TItem\"></typeparam>\r\n    public class ItemCollectionChangedEventArgs<TItem> : EventArgs where TItem : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets list of added items.\r\n        /// </summary>\r\n        public List<TItem> AddedItems\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets or sets list of removed items.\r\n        /// </summary>\r\n        public List<TItem> RemovedItems\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of ItemCollectionChangedEventArgs.\r\n        /// </summary>\r\n        /// <param name=\"addedItems\">List of added items.</param>\r\n        /// <param name=\"removedItems\">List of removed items.</param>\r\n        public ItemCollectionChangedEventArgs(List<TItem> addedItems, List<TItem> removedItems)\r\n        {\r\n            AddedItems = addedItems;\r\n            RemovedItems = removedItems;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes collection of items for game database.\r\n    /// </summary>\r\n    public interface IItemCollection : IDisposable\r\n    {\r\n        /// <summary>\r\n        /// Gets item collection type.\r\n        /// </summary>\r\n        GameDatabaseCollection CollectionType { get; }\r\n\r\n        /// <summary>\r\n        /// Check if an item is in the collection.\r\n        /// </summary>\r\n        /// <param name=\"id\"></param>\r\n        /// <returns></returns>\r\n        bool ContainsItem(Guid id);\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes collection of items for game database.\r\n    /// </summary>\r\n    /// <typeparam name=\"TItem\"></typeparam>\r\n    public interface IItemCollection<TItem> : IItemCollection, ICollection<TItem> where TItem : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets item from collection.\r\n        /// </summary>\r\n        /// <param name=\"id\">Id of an item.</param>\r\n        /// <returns><c>null</c> if no item is found otherwise item represents by specified id.</returns>\r\n        TItem this[Guid id] { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets item from collection.\r\n        /// </summary>\r\n        /// <param name=\"id\">Id of an item.</param>\r\n        /// <returns><c>null</c> if no item is found otherwise item represents by specified id.</returns>\r\n        TItem Get(Guid id);\r\n\r\n        /// <summary>\r\n        /// Gets items from collection.\r\n        /// </summary>\r\n        /// <param name=\"ids\">Id of items.</param>\r\n        /// <returns>List of items from collection.</returns>\r\n        List<TItem> Get(IList<Guid> ids);\r\n\r\n        /// <summary>\r\n        /// Adds new item into collection.\r\n        /// </summary>\r\n        /// <param name=\"itemName\">Name of new item.</param>\r\n        /// <returns>Newly added item or existing item if one is present with the same name.</returns>\r\n        TItem Add(string itemName);\r\n\r\n        /// <summary>\r\n        /// Adds new item into collection.\r\n        /// </summary>\r\n        /// <param name=\"itemName\">Name of new item.</param>\r\n        /// <param name=\"existingComparer\">Method to detect existing item from database compared to new item.</param>\r\n        /// <returns>Newly added item or existing item if one is present with the same name.</returns>\r\n        TItem Add(string itemName, Func<TItem, string, bool> existingComparer);\r\n\r\n        /// <summary>\r\n        /// Adds new items into collection.\r\n        /// </summary>\r\n        /// <param name=\"items\">Names of items to be added.</param>\r\n        /// <returns>Newly added items or existing items if there are some present with the same names.</returns>\r\n        IEnumerable<TItem> Add(List<string> items);\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"property\"></param>\r\n        /// <returns></returns>\r\n        TItem Add(MetadataProperty property);\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"properties\"></param>\r\n        /// <returns></returns>\r\n        IEnumerable<TItem> Add(IEnumerable<MetadataProperty> properties);\r\n\r\n        /// <summary>\r\n        /// Adds new items into collection.\r\n        /// </summary>\r\n        /// <param name=\"items\">Names of items to be added.</param>\r\n        /// <param name=\"existingComparer\">Method to detect existing item from database compared to new item.</param>\r\n        /// <returns></returns>\r\n        IEnumerable<TItem> Add(List<string> items, Func<TItem, string, bool> existingComparer);\r\n\r\n        /// <summary>\r\n        /// Adds items to collection.\r\n        /// </summary>\r\n        /// <param name=\"items\">Item to be added.</param>\r\n        void Add(IEnumerable<TItem> items);\r\n\r\n        /// <summary>\r\n        /// Removes item from collection.\r\n        /// </summary>\r\n        /// <param name=\"id\">Id of an item to be removed.</param>\r\n        /// <returns></returns>\r\n        bool Remove(Guid id);\r\n\r\n        /// <summary>\r\n        /// Removes items from collection.\r\n        /// </summary>\r\n        /// <param name=\"items\">List of items to be removed.</param>\r\n        /// <returns></returns>\r\n        bool Remove(IEnumerable<TItem> items);\r\n\r\n        /// <summary>\r\n        /// Updates state of item in collection.\r\n        /// </summary>\r\n        /// <param name=\"item\">New state of an object.</param>\r\n        void Update(TItem item);\r\n\r\n        /// <summary>\r\n        /// Updates states of items in collection.\r\n        /// </summary>\r\n        /// <param name=\"items\">New states of items.</param>\r\n        void Update(IEnumerable<TItem> items);\r\n\r\n        /// <summary>\r\n        /// Switches collection to buffered mode. Suppresses all notification events until buffering is stopped.\r\n        /// </summary>\r\n        /// <returns>Buffer object.</returns>\r\n        IDisposable BufferedUpdate();\r\n\r\n        /// <summary>\r\n        /// Sets collection into buffered update state.\r\n        /// </summary>\r\n        void BeginBufferUpdate();\r\n\r\n        /// <summary>\r\n        /// Sets collection from buffered update state.\r\n        /// </summary>\r\n        void EndBufferUpdate();\r\n\r\n        /// <summary>\r\n        /// Gets clone of a collection.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        IEnumerable<TItem> GetClone();\r\n\r\n        /// <summary>\r\n        /// Occurs when items are added or removed.\r\n        /// </summary>\r\n        event EventHandler<ItemCollectionChangedEventArgs<TItem>> ItemCollectionChanged;\r\n\r\n        /// <summary>\r\n        /// Occurs when items are updated.\r\n        /// </summary>\r\n        event EventHandler<ItemUpdatedEventArgs<TItem>> ItemUpdated;\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Events/ApplicationEvents.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Events\r\n{\r\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\r\n    public enum ControllerInputState\r\n    {\r\n        Pressed,\r\n        Released\r\n    }\r\n\r\n    public enum ControllerInput\r\n    {\r\n        None,\r\n        Start,\r\n        Back,\r\n        LeftStick,\r\n        RightStick,\r\n        LeftShoulder,\r\n        RightShoulder,\r\n        Guide,\r\n        A,\r\n        B,\r\n        X,\r\n        Y,\r\n        DPadLeft,\r\n        DPadRight,\r\n        DPadUp,\r\n        DPadDown,\r\n        TriggerLeft,\r\n        TriggerRight,\r\n        LeftStickLeft,\r\n        LeftStickRight,\r\n        LeftStickUp,\r\n        LeftStickDown,\r\n        RightStickLeft,\r\n        RightStickRight,\r\n        RightStickUp,\r\n        RightStickDown\r\n    }\r\n\r\n    /// <summary>\r\n    /// Application wide events.\r\n    /// </summary>\r\n    public enum ApplicationEvent\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        OnApplicationStarted,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        OnApplicationStopped,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        OnLibraryUpdated,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        OnGameStarting,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        OnGameStarted,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        OnGameStopped,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        OnGameInstalled,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        OnGameUninstalled,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        OnGameSelected,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        OnGameStartupCancelled,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        OnGameInstallationCancelled\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents game selection change event.\r\n    /// </summary>\r\n    public class OnGameSelectedEventArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets previously selected games.\r\n        /// </summary>\r\n        public List<Game> OldValue { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Gets newly selected games.\r\n        /// </summary>\r\n        public List<Game> NewValue { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"OnGameSelectedEventArgs\"/>.\r\n        /// </summary>\r\n        /// <param name=\"oldValue\"></param>\r\n        /// <param name=\"newValue\"></param>\r\n        public OnGameSelectedEventArgs(List<Game> oldValue, List<Game> newValue)\r\n        {\r\n            OldValue = oldValue;\r\n            NewValue = newValue;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for the event when a game is starting.\r\n    /// </summary>\r\n    public class OnGameStartingEventArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets game object initiating the event.\r\n        /// </summary>\r\n        public Game Game { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Gets custom game action used to start the game.\r\n        /// </summary>\r\n        public GameAction SourceAction { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Gets ROM file selected when running a game with multiple ROMs assigned.\r\n        /// </summary>\r\n        public string SelectedRomFile { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether game startup should be interrupted.\r\n        /// </summary>\r\n        public bool CancelStartup { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for the event when a game starts running.\r\n    /// </summary>\r\n    public class OnGameStartedEventArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets game object initiating the event.\r\n        /// </summary>\r\n        public Game Game { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Gets custom game action used to start the game.\r\n        /// </summary>\r\n        public GameAction SourceAction { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Gets ROM file selected when running a game with multiple ROMs assigned.\r\n        /// </summary>\r\n        public string SelectedRomFile { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Gets started process ID. Might not be valid for all started games depending on how the game was started.\r\n        /// </summary>\r\n        public int StartedProcessId { get; internal set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for the event when a game is installed.\r\n    /// </summary>\r\n    public class OnGameStartupCancelledEventArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets game object initiating the event.\r\n        /// </summary>\r\n        public Game Game { get; internal set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for the event when a game stops running.\r\n    /// </summary>\r\n    public class OnGameStoppedEventArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets game object initiating the event.\r\n        /// </summary>\r\n        public Game Game { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets length of the game session in seconds.\r\n        /// </summary>\r\n        public ulong ElapsedSeconds { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Gets value indicated whether game tracking was manually stopped by a user.\r\n        /// </summary>\r\n        public bool ManuallyStopped { get; internal set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for the event when a game is installed.\r\n    /// </summary>\r\n    public class OnGameInstalledEventArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets game object initiating the event.\r\n        /// </summary>\r\n        public Game Game { get; internal set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// REpresents argumetns for the vent when game installation is cancelled.\r\n    /// </summary>\r\n    public class OnGameInstallationCancelledEventArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets game object initiating the event.\r\n        /// </summary>\r\n        public Game Game { get; internal set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for the event when a game is uninstalled.\r\n    /// </summary>\r\n    public class OnGameUninstalledEventArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets game object initiating the event.\r\n        /// </summary>\r\n        public Game Game { get; internal set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for the event when Playnite is started.\r\n    /// </summary>\r\n    public class OnApplicationStartedEventArgs\r\n    {\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for the event when Playnite is closing down.\r\n    /// </summary>\r\n    public class OnApplicationStoppedEventArgs\r\n    {\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for the event when the game library is updated.\r\n    /// </summary>\r\n    public class OnLibraryUpdatedEventArgs\r\n    {\r\n    }\r\n\r\n    public class OnControllerButtonStateChangedArgs\r\n    {\r\n        public ControllerInput Button { get; internal set; }\r\n        public ControllerInputState State { get; internal set; }\r\n        public GamepadController Controller { get; internal set; }\r\n\r\n        public OnControllerButtonStateChangedArgs()\r\n        {\r\n        }\r\n\r\n        public OnControllerButtonStateChangedArgs(ControllerInput input, ControllerInputState state)\r\n        {\r\n            Button = input;\r\n            State = state;\r\n        }\r\n    }\r\n\r\n    public class OnControllerConnectedArgs\r\n    {\r\n        public GamepadController Controller { get; internal set; }\r\n    }\r\n\r\n    public class OnControllerDisconnectedArgs\r\n    {\r\n        public GamepadController Controller { get; internal set; }\r\n    }\r\n\r\n    public class GamepadController\r\n    {\r\n        public int InstanceId { get; internal set; }\r\n        public string Path { get; internal set; }\r\n        public string Name { get; internal set; }\r\n        public bool Enabled { get; internal set; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Events/PlayniteUriEventArgs.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Events\r\n{\r\n    /// <summary>\r\n    /// Represents arguments for Playnite URI execution event.\r\n    /// </summary>\r\n    public class PlayniteUriEventArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets url arguments.\r\n        /// </summary>\r\n        public string[] Arguments { get; set; }\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Events/WebViewEvents.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Events\r\n{\r\n    /// <summary>\r\n    /// Represents loading event occuring in web view browser instance.\r\n    /// </summary>\r\n    public class WebViewLoadingChangedEventArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether the page is loading.\r\n        /// </summary>\r\n        public bool IsLoading { get; set; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Exceptions/LocalizedException.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents exception supporting localized message strings.\r\n    /// </summary>\r\n    public class LocalizedException : Exception\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"LocalizedException\"/>.\r\n        /// </summary>\r\n        public LocalizedException()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"LocalizedException\"/>.\r\n        /// </summary>\r\n        /// <param name=\"message\">Error message.</param>\r\n        public LocalizedException(string message) : base(message.StartsWith(\"LOC\", StringComparison.Ordinal) ? ResourceProvider.GetString(message) : message)\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Exceptions/ReferenceException.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents errors related to object references.\r\n    /// </summary>\r\n    public class ReferenceException : LocalizedException\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ReferenceException\"/>.\r\n        /// </summary>\r\n        public ReferenceException() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ReferenceException\"/>.\r\n        /// </summary>\r\n        /// <param name=\"message\">Error message.</param>\r\n        public ReferenceException(string message) : base(message)\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Exceptions/ScriptRuntimeException.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Exceptions\r\n{\r\n    /// <summary>\r\n    /// Represents exception from scripting runtime.\r\n    /// </summary>\r\n    public class ScriptRuntimeException : LocalizedException\r\n    {\r\n        /// <summary>\r\n        /// Gets script runtime stack trace.\r\n        /// </summary>\r\n        public string ScriptStackTrace { get; private set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ScriptRuntimeException\"/>.\r\n        /// </summary>\r\n        public ScriptRuntimeException() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ScriptRuntimeException\"/>.\r\n        /// </summary>\r\n        /// <param name=\"message\"></param>\r\n        public ScriptRuntimeException(string message) : base(message)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ScriptRuntimeException\"/>.\r\n        /// </summary>\r\n        /// <param name=\"message\"></param>\r\n        /// <param name=\"stackTrace\"></param>\r\n        public ScriptRuntimeException(string message, string stackTrace) : base(message)\r\n        {\r\n            ScriptStackTrace = stackTrace;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return base.ToString() + \"\\n--- script trace ---\\n\" + ScriptStackTrace;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Exceptions/TypeMismatchException.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents errors related to type mismatch use.\r\n    /// </summary>\r\n    public class TypeMismatchException : LocalizedException\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"TypeMismatchException\"/>.\r\n        /// </summary>\r\n        public TypeMismatchException() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"TypeMismatchException\"/>.\r\n        /// </summary>\r\n        /// <param name=\"message\">Error message.</param>\r\n        public TypeMismatchException(string message) : base(message)\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/ExpandableVariables.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents object with definitions of available expandable game variables.\r\n    /// </summary>\r\n    public class ExpandableVariables\r\n    {\r\n        /// <summary>\r\n        /// Gets variable name for game's installation directory path.\r\n        /// </summary>\r\n        public const string InstallationDirectory = \"{InstallDir}\";\r\n\r\n        /// <summary>\r\n        /// Gets variable name for game's installation directory name.\r\n        /// </summary>\r\n        public const string InstallationDirName = \"{InstallDirName}\";\r\n\r\n        /// <summary>\r\n        /// Gets variable name for game's image path.\r\n        /// </summary>\r\n        public const string ImagePath = \"{ImagePath}\";\r\n\r\n        /// <summary>\r\n        /// Gets variable name for game's image file name without extension.\r\n        /// </summary>\r\n        public const string ImageNameNoExtension = \"{ImageNameNoExt}\";\r\n\r\n        /// <summary>\r\n        /// Gets variable name for game's image file name.\r\n        /// </summary>\r\n        public const string ImageName = \"{ImageName}\";\r\n\r\n        /// <summary>\r\n        /// Gets variable name for Playnite's installation directory path.\r\n        /// </summary>\r\n        public const string PlayniteDirectory = \"{PlayniteDir}\";\r\n\r\n        /// <summary>\r\n        /// Gets variable for game's name.\r\n        /// </summary>\r\n        public const string Name = \"{Name}\";\r\n\r\n        /// <summary>\r\n        /// Gets variable for game's platform.\r\n        /// </summary>\r\n        public const string Platform = \"{Platform}\";\r\n\r\n        /// <summary>\r\n        /// Gets variable for game's ID.\r\n        /// </summary>\r\n        public const string GameId = \"{GameId}\";\r\n\r\n        /// <summary>\r\n        /// Gets variable for game's database ID.\r\n        /// </summary>\r\n        public const string DatabaseId = \"{DatabaseId}\";\r\n\r\n        /// <summary>\r\n        /// Gets variable for game's library plugin ID.\r\n        /// </summary>\r\n        public const string PluginId = \"{PluginId}\";\r\n\r\n        /// <summary>\r\n        /// Gets variable for game's version.\r\n        /// </summary>\r\n        public const string Version = \"{Version}\";\r\n\r\n        /// <summary>\r\n        /// Gets directory path of parent emulator object.\r\n        /// </summary>\r\n        public const string EmulatorDirectory = \"{EmulatorDir}\";\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/ExtensionFunction.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents executable function.\r\n    /// </summary>\r\n    public class ExtensionFunction\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets function name.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        private Action func;\r\n\r\n        /// <summary>\r\n        /// Creates new instance of ExtensionFunction with specified name.\r\n        /// </summary>\r\n        /// <param name=\"name\">Function name.</param>\r\n        public ExtensionFunction(string name)\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of ExtensionFunction with specified name and method to execute.\r\n        /// </summary>\r\n        /// <param name=\"name\">Function name.</param>\r\n        /// <param name=\"func\">Method to be executed.</param>\r\n        public ExtensionFunction(string name, Action func) : this(name)\r\n        {\r\n            this.func = func;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Invokes function.\r\n        /// </summary>\r\n        public virtual void Invoke()\r\n        {\r\n            func?.Invoke();\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Extensions/ListExtensions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System.Collections.Generic\r\n{\r\n    /// <summary>\r\n    /// Represents class with various extension methods for IEnumerable lists.\r\n    /// </summary>\r\n    public static class ListExtensions\r\n    {\r\n        /// <summary>\r\n        /// Converts collection to <see cref=\"ObservableCollection{T}\"/> collection.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <returns></returns>\r\n        public static ObservableCollection<T> ToObservable<T>(this IEnumerable<T> source)\r\n        {\r\n            if (source == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            return new ObservableCollection<T>(source);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Check if collection has any items.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <returns></returns>\r\n        public static bool HasItems<T>(this IEnumerable<T> source)\r\n        {\r\n            return source?.Any() == true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Check if collection has any items.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"predicate\"></param>\r\n        /// <returns></returns>\r\n        public static bool HasItems<T>(this IEnumerable<T> source, Func<T, bool> predicate)\r\n        {\r\n            return source?.Any(predicate) == true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Adds new item to the list only if it's not already part of the list.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"item\"></param>\r\n        /// <returns>True if item was added, false if it's already part of the list.</returns>\r\n        public static bool AddMissing<T>(this IList<T> source, T item)\r\n        {\r\n            if (!source.Contains(item))\r\n            {\r\n                source.Add(item);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Adds new items to the list only if they are not already part of the list.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"items\"></param>\r\n        /// <returns>True if an item was added, false if no item was added.</returns>\r\n        public static bool AddMissing<T>(this IList<T> source, IEnumerable<T> items)\r\n        {\r\n            if (items == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            var anyAdded = false;\r\n            foreach (var item in items)\r\n            {\r\n                if (AddMissing(source, item))\r\n                {\r\n                    anyAdded = true;\r\n                }\r\n            }\r\n\r\n            return anyAdded;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Checks if collection has any non-empty string items.\r\n        /// </summary>\r\n        /// <param name=\"source\"></param>\r\n        /// <returns></returns>\r\n        public static bool HasNonEmptyItems(this IEnumerable<string> source)\r\n        {\r\n            return source?.Any(a => !string.IsNullOrEmpty(a)) == true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Checks if source collection contains any items from target one, even if just partially.\r\n        /// </summary>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"target\"></param>\r\n        /// <param name=\"comparison\"></param>\r\n        /// <returns>True if target collection contains items that are also part of source collection.</returns>\r\n        public static bool IntersectsPartiallyWith(this IEnumerable<string> source, IEnumerable<string> target, StringComparison comparison = StringComparison.InvariantCultureIgnoreCase)\r\n        {\r\n            if (source == null && target == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if ((source == null && target != null) || (source != null && target == null))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            var intersects = false;\r\n            foreach (var sourceItem in source)\r\n            {\r\n                if (target.Any(a => a?.IndexOf(sourceItem, comparison) >= 0))\r\n                {\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            return intersects;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Checks if source collection contains any items from target one.\r\n        /// </summary>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"target\"></param>\r\n        /// <param name=\"comparison\"></param>\r\n        /// <returns>True if target collection contains items that are also part of source collection.</returns>\r\n        public static bool IntersectsExactlyWith(this IEnumerable<string> source, IEnumerable<string> target, StringComparison comparison = StringComparison.InvariantCultureIgnoreCase)\r\n        {\r\n            if (source == null && target == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if ((source == null && target != null) || (source != null && target == null))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            var intersects = false;\r\n            foreach (var sourceItem in source)\r\n            {\r\n                if (target.Any(a => a?.Equals(sourceItem, comparison) == true))\r\n                {\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            return intersects;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Checks if source collection contains specified string completely.\r\n        /// </summary>\r\n        public static bool ContainsString(this IEnumerable<string> source, string value, StringComparison comparison = StringComparison.InvariantCultureIgnoreCase)\r\n        {\r\n            return source?.Any(a => a?.Equals(value, comparison) == true) == true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Checks if part of specified string is part of the collection.\r\n        /// </summary>\r\n        public static bool ContainsStringPartial(this IEnumerable<string> source, string value, StringComparison comparison = StringComparison.InvariantCultureIgnoreCase)\r\n        {\r\n            return source?.Any(a => a?.IndexOf(value, comparison) >= 0) == true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Checks if source collection contains part of specified string.\r\n        /// </summary>\r\n        public static bool ContainsPartOfString(this IEnumerable<string> source, string value, StringComparison comparison = StringComparison.InvariantCultureIgnoreCase)\r\n        {\r\n            return source?.Any(a => value?.IndexOf(a, comparison) >= 0) == true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Checks if two collections contain the same items in any order.\r\n        /// </summary>\r\n        public static bool IsListEqual<T>(this IEnumerable<T> source, IEnumerable<T> target)\r\n        {\r\n            if (source == null && target == null)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if ((source == null && target != null) || (source != null && target == null))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (source.Count() != target.Count())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (source.Except(target).Any())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (target.Except(source).Any())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Checks if two collections contain the same items in any order.\r\n        /// </summary>\r\n        public static bool IsListEqual<T>(this IEnumerable<T> source, IEnumerable<T> target, IEqualityComparer<T> comparer)\r\n        {\r\n            if (source == null && target == null)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if ((source == null && target != null) || (source != null && target == null))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (source.Count() != target.Count())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (source.Except(target, comparer).Any())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (target.Except(source, comparer).Any())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Checks if two collections contain the same items in the same order.\r\n        /// </summary>\r\n        public static bool IsListEqualExact<T>(this IEnumerable<T> source, IEnumerable<T> target)\r\n        {\r\n            if (source == null && target == null)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if ((source == null && target != null) || (source != null && target == null))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (source.Count() != target.Count())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return source.SequenceEqual(target);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Check if collection contains all items from other collection (in any order).\r\n        /// </summary>\r\n        public static bool Contains<T>(this IEnumerable<T> source, IEnumerable<T> target)\r\n        {\r\n            if (source == null && target == null)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if ((source == null && target != null) || (source != null && target == null))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            var targetCount = target.Count();\r\n            if (targetCount > source.Count())\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return target.Intersect(source).Count() == targetCount;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets items contained in all colletions.\r\n        /// </summary>\r\n        public static HashSet<T> GetCommonItems<T>(IEnumerable<IEnumerable<T>> lists)\r\n        {\r\n            if (lists?.Any() != true || lists?.First()?.Any() != true)\r\n            {\r\n                return new HashSet<T>();\r\n            }\r\n\r\n            var set = new HashSet<T>(lists.First());\r\n            foreach (var list in lists)\r\n            {\r\n                if (list == null)\r\n                {\r\n                    set.IntersectWith(new List<T>());\r\n                }\r\n                else\r\n                {\r\n                    set.IntersectWith(list);\r\n                }\r\n            }\r\n\r\n            return set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets items distinct to all collections.\r\n        /// </summary>\r\n        public static HashSet<T> GetDistinctItems<T>(IEnumerable<IEnumerable<T>> lists)\r\n        {\r\n            if (lists?.Any() != true)\r\n            {\r\n                return new HashSet<T>();\r\n            }\r\n\r\n            var set = new List<T>();\r\n            foreach (var list in lists)\r\n            {\r\n                if (list != null)\r\n                {\r\n                    set.AddRange(list);\r\n                }\r\n            }\r\n\r\n            var listsCounts = lists.Count();\r\n            return new HashSet<T>(set.GroupBy(a => a).Where(a => a.Count() < listsCounts).Select(a => a.Key));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets items distinct to all collections.\r\n        /// </summary>\r\n        public static HashSet<T> GetDistinctItemsP<T>(params IEnumerable<T>[] lists)\r\n        {\r\n            if (lists?.Any() != true)\r\n            {\r\n                return new HashSet<T>();\r\n            }\r\n\r\n            return GetDistinctItems(lists.ToList());\r\n        }\r\n\r\n        /// <summary>\r\n        /// Merge collections together.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"lists\"></param>\r\n        /// <returns></returns>\r\n        public static List<T> Merge<T>(IEnumerable<IEnumerable<T>> lists)\r\n        {\r\n            var allItems = new List<T>();\r\n            foreach (var list in lists)\r\n            {\r\n                if (list.HasItems())\r\n                {\r\n                    allItems.AddRange(list);\r\n                }\r\n            }\r\n\r\n            return allItems;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Merge two collections together.\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"list1\"></param>\r\n        /// <param name=\"list2\"></param>\r\n        /// <returns></returns>\r\n        public static List<T> Merge<T>(IEnumerable<T> list1, IEnumerable<T> list2)\r\n        {\r\n            if (list1.HasItems() && list2.HasItems())\r\n            {\r\n                var allItems = new List<T>(list1.Count() + list2.Count());\r\n                allItems.AddRange(list1);\r\n                allItems.AddRange(list2);\r\n                return allItems;\r\n            }\r\n            else if (list1.HasItems() && !list2.HasItems())\r\n            {\r\n                return list1.ToList();\r\n            }\r\n            else if (!list1.HasItems() && list2.HasItems())\r\n            {\r\n                return list2.ToList();\r\n            }\r\n\r\n            return new List<T>();\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"action\"></param>\r\n        public static void ForEach<T>(this ObservableCollection<T> source, Action<T> action)\r\n        {\r\n            if (source.HasItems() != true)\r\n            {\r\n                return;\r\n            }\r\n\r\n            foreach (var item in source)\r\n            {\r\n                action(item);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"action\"></param>\r\n        public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)\r\n        {\r\n            if (source.HasItems() != true)\r\n            {\r\n                return;\r\n            }\r\n\r\n            foreach (var item in source)\r\n            {\r\n                action(item);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"source\"></param>\r\n        /// <returns></returns>\r\n        public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)\r\n        {\r\n            if (source == null)\r\n            {\r\n                return null;\r\n            }\r\n\r\n            if (!source.HasItems())\r\n            {\r\n                return new HashSet<T>();\r\n            }\r\n\r\n            return new HashSet<T>(source);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Extensions/StringExtensions.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace System\r\n{\r\n    /// <summary>\r\n    /// <see cref=\"string\"/> extension methods.\r\n    /// </summary>\r\n    public static class StrExtensions\r\n    {\r\n        /// <summary>\r\n        /// Returns localized version of string key.\r\n        /// </summary>\r\n        /// <param name=\"stringKey\">Localization string key starting with LOC.</param>\r\n        /// <returns></returns>\r\n        public static string GetLocalized(this string stringKey)\r\n        {\r\n            return stringKey.StartsWith(\"LOC\", StringComparison.Ordinal) ? ResourceProvider.GetString(stringKey) : stringKey;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/IAddons.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes addons API interface.\r\n    /// </summary>\r\n    public interface IAddons\r\n    {\r\n        /// <summary>\r\n        /// Gets ID list of disabled addons.\r\n        /// </summary>\r\n        List<string> DisabledAddons { get; }\r\n\r\n        /// <summary>\r\n        /// Gets ID list of currently installed addons.\r\n        /// </summary>\r\n        List<string> Addons { get; }\r\n\r\n        /// <summary>\r\n        /// Gets list of currently loaded plugins.\r\n        /// </summary>\r\n        List<Plugins.Plugin> Plugins { get; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/IDialogsFactory.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Threading;\r\n\r\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents message box response options.\r\n    /// </summary>\r\n    public class MessageBoxOption\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets title of response option.\r\n        /// </summary>\r\n        public string Title { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether this is default option.\r\n        /// </summary>\r\n        public bool IsDefault { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether this is option to cancel the request.\r\n        /// </summary>\r\n        public bool IsCancel { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"MessageBoxOption\"/>.\r\n        /// </summary>\r\n        /// <param name=\"title\"></param>\r\n        /// <param name=\"isDefault\"></param>\r\n        /// <param name=\"isCancel\"></param>\r\n        public MessageBoxOption(string title, bool isDefault = false, bool isCancel = false)\r\n        {\r\n            Title = title;\r\n            IsDefault = isDefault;\r\n            IsCancel = isCancel;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents message box toggle option.\r\n    /// </summary>\r\n    public class MessageBoxToggle : ObservableObject\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets title toggle option.\r\n        /// </summary>\r\n        public string Title { get; set; }\r\n\r\n        private bool selected;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether this is option is selected.\r\n        /// </summary>\r\n        public bool Selected\r\n        {\r\n            get => selected;\r\n            set\r\n            {\r\n                selected = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"title\"></param>\r\n        /// <param name=\"selected\"></param>\r\n        public MessageBoxToggle(string title, bool selected = false)\r\n        {\r\n            Title = title.StartsWith(\"LOC\", StringComparison.Ordinal) ? ResourceProvider.GetString(title) : title;\r\n            Selected = selected;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for global progress action.\r\n    /// </summary>\r\n    public class GlobalProgressActionArgs : ObservableObject\r\n    {\r\n        /// <summary>\r\n        /// Gets synchronization context of main thread.\r\n        /// </summary>\r\n        public SynchronizationContext MainContext { get; }\r\n\r\n        /// <summary>\r\n        /// Gets dispatcher for main UI thread.\r\n        /// </summary>\r\n        public Dispatcher MainDispatcher { get; }\r\n\r\n        /// <summary>\r\n        /// Gets cancelation token source.\r\n        /// </summary>\r\n        public CancellationToken CancelToken { get; }\r\n\r\n        private double progressMaxValue = 0;\r\n        /// <summary>\r\n        /// Gets or sets maximum value represented on progress track.\r\n        /// </summary>\r\n        public double ProgressMaxValue\r\n        {\r\n            get => progressMaxValue;\r\n            set\r\n            {\r\n                progressMaxValue = value;\r\n                MainDispatcher?.Invoke(() => OnPropertyChanged(), DispatcherPriority.Send);\r\n            }\r\n        }\r\n\r\n        private double currentProgressValue = 0;\r\n        /// <summary>\r\n        /// Gets or sets currect value represented on progress track.\r\n        /// </summary>\r\n        public double CurrentProgressValue\r\n        {\r\n            get => currentProgressValue;\r\n            set\r\n            {\r\n                currentProgressValue = value;\r\n                MainDispatcher?.Invoke(() => OnPropertyChanged(), DispatcherPriority.Send);\r\n            }\r\n        }\r\n\r\n        private string text;\r\n        /// <summary>\r\n        /// Gets or sets progress text.\r\n        /// </summary>\r\n        public string Text\r\n        {\r\n            get => text;\r\n            set\r\n            {\r\n                text = value?.GetLocalized();\r\n                MainDispatcher?.Invoke(() => OnPropertyChanged(), DispatcherPriority.Send);\r\n            }\r\n        }\r\n\r\n        private bool isIndeterminate;\r\n        /// <summary>\r\n        /// Gets or sets progress text.\r\n        /// </summary>\r\n        public bool IsIndeterminate\r\n        {\r\n            get => isIndeterminate;\r\n            set\r\n            {\r\n                isIndeterminate = value;\r\n                MainDispatcher?.Invoke(() => OnPropertyChanged(), DispatcherPriority.Send);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GlobalProgressActionArgs\"/>.\r\n        /// </summary>\r\n        /// <param name=\"mainContext\"></param>\r\n        /// <param name=\"mainDispatcher\"></param>\r\n        /// <param name=\"cancelToken\"></param>\r\n        public GlobalProgressActionArgs(SynchronizationContext mainContext, Dispatcher mainDispatcher, CancellationToken cancelToken)\r\n        {\r\n            MainContext = mainContext;\r\n            MainDispatcher = mainDispatcher;\r\n            CancelToken = cancelToken;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents result of global progress dialog.\r\n    /// </summary>\r\n    public class GlobalProgressResult\r\n    {\r\n        /// <summary>\r\n        /// Gets failure exception record.\r\n        /// </summary>\r\n        public Exception Error { get; }\r\n\r\n        /// <summary>\r\n        /// Gets execution result.\r\n        /// </summary>\r\n        public bool? Result { get; }\r\n\r\n        /// <summary>\r\n        /// Gets value indicating whether the action was canceled by user.\r\n        /// </summary>\r\n        public bool Canceled { get; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GlobalProgressResult\"/>.\r\n        /// </summary>\r\n        /// <param name=\"result\"></param>\r\n        /// <param name=\"canceled\"></param>\r\n        /// <param name=\"error\"></param>\r\n        public GlobalProgressResult(bool? result, bool canceled, Exception error)\r\n        {\r\n            Result = result;\r\n            Error = error;\r\n            Canceled = canceled;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents option for global progress dialog.\r\n    /// </summary>\r\n    public class GlobalProgressOptions\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets progress text.\r\n        /// </summary>\r\n        public string Text { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether the progress can be canceled.\r\n        /// </summary>\r\n        public bool Cancelable { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether the progress is indeterminated.\r\n        /// </summary>\r\n        public bool IsIndeterminate { get; set; } = true;\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GlobalProgressOptions\"/>.\r\n        /// </summary>\r\n        /// <param name=\"text\"></param>\r\n        public GlobalProgressOptions(string text)\r\n        {\r\n            Text = text;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GlobalProgressOptions\"/>.\r\n        /// </summary>\r\n        /// <param name=\"text\"></param>\r\n        /// <param name=\"cancelable\"></param>\r\n        public GlobalProgressOptions(string text, bool cancelable) : this(text)\r\n        {\r\n            Cancelable = cancelable;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents item for image selection dialog.\r\n    /// </summary>\r\n    public class ImageFileOption : GenericItemOption\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets image path or URL.\r\n        /// </summary>\r\n        public string Path { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ImageFileOption\"/>.\r\n        /// </summary>\r\n        public ImageFileOption() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ImageFileOption\"/>.\r\n        /// </summary>\r\n        /// <param name=\"path\"></param>\r\n        public ImageFileOption(string path)\r\n        {\r\n            Path = path;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents item for item selection dialogs.\r\n    /// </summary>\r\n    public class GenericItemOption\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets game name.\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets search result's description.\r\n        /// </summary>\r\n        public string Description { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GenericItemOption\"/>.\r\n        /// </summary>\r\n        public GenericItemOption()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GenericItemOption\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        /// <param name=\"description\"></param>\r\n        public GenericItemOption(string name, string description)\r\n        {\r\n            Name = name;\r\n            Description = description;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents result of selection string dialog operation.\r\n    /// </summary>\r\n    public class StringSelectionDialogResult\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets dialog result. True if user confirmed selected otherwise false.\r\n        /// </summary>\r\n        public bool Result { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets string selected by user.\r\n        /// </summary>\r\n        public string SelectedString { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of StringSelectionDialogResult.\r\n        /// </summary>\r\n        /// <param name=\"result\">Dialog result.</param>\r\n        /// <param name=\"selectedString\">Selected string.</param>\r\n        public StringSelectionDialogResult(bool result, string selectedString)\r\n        {\r\n            Result = result;\r\n            SelectedString = selectedString;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents option for new window creation.\r\n    /// </summary>\r\n    public class WindowCreationOptions\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether the minimize button should be shown.\r\n        /// </summary>\r\n        public bool ShowMinimizeButton { get; set; } = true;\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether the maximize button should be shown.\r\n        /// </summary>\r\n        public bool ShowMaximizeButton { get; set; } = true;\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether the close button should be shown.\r\n        /// </summary>\r\n        public bool ShowCloseButton { get; set; } = true;\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes object providing methods for dialog based actions.\r\n    /// </summary>\r\n    public interface IDialogsFactory\r\n    {\r\n        /// <summary>\r\n        /// Displays error dialog window with text message.\r\n        /// </summary>\r\n        /// <param name=\"messageBoxText\">Dialog message text.</param>\r\n        /// <returns></returns>\r\n        MessageBoxResult ShowErrorMessage(string messageBoxText);\r\n\r\n        /// <summary>\r\n        /// Displays error dialog window with text message.\r\n        /// </summary>\r\n        /// <param name=\"messageBoxText\">Dialog message text.</param>\r\n        /// <param name=\"caption\">Dialog window caption.</param>\r\n        /// <returns></returns>\r\n        MessageBoxResult ShowErrorMessage(string messageBoxText, string caption);\r\n\r\n        /// <summary>\r\n        /// Displays dialog window with text message.\r\n        /// </summary>\r\n        /// <param name=\"messageBoxText\">Dialog message text.</param>\r\n        /// <param name=\"caption\">Dialog window caption.</param>\r\n        /// <param name=\"button\">Available response button.</param>\r\n        /// <param name=\"icon\">Dialog icon.</param>\r\n        /// <returns>Selected dialog response.</returns>\r\n        MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon);\r\n\r\n        /// <summary>\r\n        /// Displays dialog window with text message.\r\n        /// </summary>\r\n        /// <param name=\"messageBoxText\">Dialog message text.</param>\r\n        /// <param name=\"caption\">Dialog window caption.</param>\r\n        /// <param name=\"button\">Available response button.</param>\r\n        /// <returns>Selected dialog response.</returns>\r\n        MessageBoxResult ShowMessage(string messageBoxText, string caption, MessageBoxButton button);\r\n\r\n        /// <summary>\r\n        /// Displays dialog window with text message.\r\n        /// </summary>\r\n        /// <param name=\"messageBoxText\">Dialog message text.</param>\r\n        /// <param name=\"caption\">Dialog window caption.</param>\r\n        /// <returns>Selected dialog response.</returns>\r\n        MessageBoxResult ShowMessage(string messageBoxText, string caption);\r\n\r\n        /// <summary>\r\n        /// Displays dialog window with text message.\r\n        /// </summary>\r\n        /// <param name=\"messageBoxText\">Dialog message text.</param>\r\n        /// <returns>Selected dialog response.</returns>\r\n        MessageBoxResult ShowMessage(string messageBoxText);\r\n\r\n        /// <summary>\r\n        /// Displays dialog window custom response options.\r\n        /// </summary>\r\n        /// <param name=\"messageBoxText\">Dialog message text.</param>\r\n        /// <param name=\"caption\">Dialog window caption.</param>\r\n        /// <param name=\"icon\">Dialog icon.</param>\r\n        /// <param name=\"options\">Response options.</param>\r\n        /// <returns>Selected dialog option.</returns>\r\n        MessageBoxOption ShowMessage(string messageBoxText, string caption, MessageBoxImage icon, List<MessageBoxOption> options);\r\n\r\n        /// <summary>\r\n        /// Displays system dialog for folder selection.\r\n        /// </summary>\r\n        /// <returns>Selected folder path or empty string if user cancels the dialog.</returns>\r\n        string SelectFolder();\r\n\r\n        string SelectFolder(string initialDir);\r\n\r\n        /// <summary>\r\n        /// Displays system open file dialog.\r\n        /// </summary>\r\n        /// <param name=\"filter\">File filter, for example \"ZIP Archive|*.zip\"</param>\r\n        /// <returns>Selected file path or empty string if user cancels the dialog.</returns>\r\n        string SelectFile(string filter);\r\n\r\n        string SelectFile(string filter, string initialDir);\r\n\r\n        /// <summary>\r\n        /// Displays system open file dialog allowing to select multiple files.\r\n        /// </summary>\r\n        /// <param name=\"filter\">File filter, for example \"ZIP Archive|*.zip\"</param>\r\n        /// <returns>List of paths or null if user cancels the dialog.</returns>\r\n        List<string> SelectFiles(string filter);\r\n\r\n        List<string> SelectFiles(string filter, string initialDir);\r\n\r\n        /// <summary>\r\n        /// Displays file open dialog with file filter set to show only image files used for icons.\r\n        /// </summary>\r\n        /// <returns>Selected icon path or empty string if user cancels the dialog.</returns>\r\n        string SelectIconFile();\r\n\r\n        string SelectIconFile(string initialDir);\r\n\r\n        /// <summary>\r\n        /// Displays file open dialog with file filter set to show only image files.\r\n        /// </summary>\r\n        /// <returns>Selected image path or empty string if user cancels the dialog.</returns>\r\n        string SelectImagefile();\r\n\r\n        string SelectImagefile(string initialDir);\r\n\r\n        /// <summary>\r\n        /// Displays system file save dialog.\r\n        /// </summary>\r\n        /// <param name=\"filter\">File filter, for example \"ZIP Archive|*.zip\"</param>\r\n        /// <returns>Selected file path or empty string if user cancels the dialog.</returns>\r\n        string SaveFile(string filter);\r\n\r\n        string SaveFile(string filter, string initialDir);\r\n\r\n        /// <summary>\r\n        /// Displays system file save dialog.\r\n        /// </summary>\r\n        /// <param name=\"filter\">File filter, for example \"ZIP Archive|*.zip\"</param>\r\n        /// <param name=\"promptOverwrite\">Indicates whether to ask user for file overrite if selected path exists.</param>\r\n        /// <returns>Selected file path or empty string if user cancels the dialog.</returns>\r\n        string SaveFile(string filter, bool promptOverwrite);\r\n\r\n        string SaveFile(string filter, bool promptOverwrite, string initialDir);\r\n\r\n        /// <summary>\r\n        /// Displays dialog asking user to input text string.\r\n        /// </summary>\r\n        /// <param name=\"messageBoxText\">Dialog message text.</param>\r\n        /// <param name=\"caption\">Dialog window caption.</param>\r\n        /// <param name=\"defaultInput\">Default string presented in input field.</param>\r\n        /// <returns>Selection result.</returns>\r\n        StringSelectionDialogResult SelectString(string messageBoxText, string caption, string defaultInput);\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"messageBoxText\"></param>\r\n        /// <param name=\"caption\"></param>\r\n        /// <param name=\"defaultInput\"></param>\r\n        /// <param name=\"options\"></param>\r\n        /// <returns></returns>\r\n        StringSelectionDialogResult SelectString(string messageBoxText, string caption, string defaultInput, List<MessageBoxToggle> options);\r\n\r\n        /// <summary>\r\n        /// Displays dialog with textbox allowing to select/copy text.\r\n        /// </summary>\r\n        /// <param name=\"messageBoxText\">Dialog message text.</param>\r\n        /// <param name=\"caption\">Dialog window caption.</param>\r\n        /// <param name=\"defaultInput\">String added into selectable field.</param>\r\n        /// <returns>Selection result.</returns>\r\n        void ShowSelectableString(string messageBoxText, string caption, string defaultInput);\r\n\r\n        /// <summary>\r\n        /// Displays dialog with an option to choose single image.\r\n        /// </summary>\r\n        /// <param name=\"files\"></param>\r\n        /// <param name=\"caption\"></param>\r\n        /// <param name=\"itemWidth\"></param>\r\n        /// <param name=\"itemHeight\"></param>\r\n        /// <returns>Null if dialog was canceled otherwise selected <see cref=\"ImageFileOption\"/> object.</returns>\r\n        ImageFileOption ChooseImageFile(List<ImageFileOption> files, string caption = null, double itemWidth = 240, double itemHeight = 180);\r\n\r\n        /// <summary>\r\n        /// Displays dialog with an option to choose single item and option to search for different items.\r\n        /// </summary>\r\n        /// <param name=\"items\"></param>\r\n        /// <param name=\"searchFunction\"></param>\r\n        /// <param name=\"defaultSearch\"></param>\r\n        /// <param name=\"caption\"></param>\r\n        /// <returns>Null if dialog was canceled otherwise selected <see cref=\"GenericItemOption\"/> object.</returns>\r\n        GenericItemOption ChooseItemWithSearch(List<GenericItemOption> items, Func<string, List<GenericItemOption>> searchFunction, string defaultSearch = null, string caption = null);\r\n\r\n        /// <summary>\r\n        /// Activates progress dialog blocking app interaction until progress is finished or canceled.\r\n        /// </summary>\r\n        /// <param name=\"progresAction\">Action to be executed.</param>\r\n        /// <param name=\"progressOptions\">Options for progress dialog.</param>\r\n        /// <returns>Status of the action execution.</returns>\r\n        GlobalProgressResult ActivateGlobalProgress(Action<GlobalProgressActionArgs> progresAction, GlobalProgressOptions progressOptions);\r\n\r\n        /// <summary>\r\n        /// Activates progress dialog blocking app interaction until progress is finished or canceled.\r\n        /// </summary>\r\n        /// <param name=\"progresAction\">Awaitable function to be executed.</param>\r\n        /// <param name=\"progressOptions\">Options for progress dialog.</param>\r\n        /// <returns>Status of the action execution.</returns>\r\n        GlobalProgressResult ActivateGlobalProgress(Func<GlobalProgressActionArgs, Task> progresAction, GlobalProgressOptions progressOptions);\r\n\r\n        /// <summary>\r\n        /// Creates new window with Playnite's default styling applied.\r\n        /// </summary>\r\n        /// <param name=\"options\">Custom window options.</param>\r\n        /// <returns>New window instance.</returns>\r\n        Window CreateWindow(WindowCreationOptions options);\r\n\r\n        /// <summary>\r\n        /// Gets currently active window. If no window is active, main window is returned instead.\r\n        /// </summary>\r\n        /// <returns>Window object.</returns>\r\n        Window GetCurrentAppWindow();\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/IEmulationAPI.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes emulation API.\r\n    /// </summary>\r\n    public interface IEmulationAPI\r\n    {\r\n        /// <summary>\r\n        /// Gets built-in platform definitions.\r\n        /// </summary>\r\n        IList<EmulatedPlatform> Platforms { get; }\r\n\r\n        /// <summary>\r\n        /// Gets built-in region definitions.\r\n        /// </summary>\r\n        IList<EmulatedRegion> Regions { get; }\r\n\r\n        /// <summary>\r\n        /// Gets list of built-in emulator definitions.\r\n        /// </summary>\r\n        IList<EmulatorDefinition> Emulators { get; }\r\n\r\n        /// <summary>\r\n        /// Gets specific platform by id.\r\n        /// </summary>\r\n        /// <param name=\"platformId\"></param>\r\n        /// <returns></returns>\r\n        EmulatedPlatform GetPlatform(string platformId);\r\n\r\n        /// <summary>\r\n        /// Gets specific region by id.\r\n        /// </summary>\r\n        /// <param name=\"regionId\"></param>\r\n        /// <returns></returns>\r\n        EmulatedRegion GetRegion(string regionId);\r\n\r\n        /// <summary>\r\n        /// Gets specific built-in emulator definition.\r\n        /// </summary>\r\n        /// <param name=\"emulatorDefinitionId\"></param>\r\n        /// <returns></returns>\r\n        EmulatorDefinition GetEmulator(string emulatorDefinitionId);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/ILogger.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes logger object used to write message into log file.\r\n    /// </summary>\r\n    public interface ILogger\r\n    {\r\n        /// <summary>\r\n        /// Writes message to log with Info severity.\r\n        /// </summary>\r\n        /// <param name=\"message\">Message to be added into log.</param>\r\n        void Info(string message);\r\n\r\n        /// <summary>\r\n        /// Writes message to log with Info severity, including parsed exception.\r\n        /// </summary>\r\n        /// <param name=\"exception\">Message to be added into log.</param>\r\n        /// <param name=\"message\">Exception to be added into log.</param>\r\n        void Info(Exception exception, string message);\r\n\r\n        /// <summary>\r\n        /// Writes message to log with Debug severity.\r\n        /// </summary>\r\n        /// <param name=\"message\">Message to be added into log.</param>\r\n        void Debug(string message);\r\n\r\n        /// <summary>\r\n        /// Writes message to log with Debug severity, including parsed exception.\r\n        /// </summary>\r\n        /// <param name=\"exception\">Message to be added into log.</param>\r\n        /// <param name=\"message\">Exception to be added into log.</param>\r\n        void Debug(Exception exception, string message);\r\n\r\n        /// <summary>\r\n        /// Writes message to log with Warning severity.\r\n        /// </summary>\r\n        /// <param name=\"message\">Message to be added into log.</param>\r\n        void Warn(string message);\r\n\r\n        /// <summary>\r\n        /// Writes message to log with Warning severity, including parsed exception.\r\n        /// </summary>\r\n        /// <param name=\"exception\">Message to be added into log.</param>\r\n        /// <param name=\"message\">Exception to be added into log.</param>\r\n        void Warn(Exception exception, string message);\r\n\r\n        /// <summary>\r\n        /// Writes message to log with Error severity.\r\n        /// </summary>\r\n        /// <param name=\"message\">Message to be added into log.</param>\r\n        void Error(string message);\r\n\r\n        /// <summary>\r\n        /// Writes message to log with Error severity, including parsed exception.\r\n        /// </summary>\r\n        /// <param name=\"exception\">Message to be added into log.</param>\r\n        /// <param name=\"message\">Exception to be added into log.</param>\r\n        void Error(Exception exception, string message);\r\n\r\n        /// <summary>\r\n        /// Writes message to log with Trace severity.\r\n        /// </summary>\r\n        /// <param name=\"message\">Message to be added into log.</param>\r\n        void Trace(string message);\r\n\r\n        /// <summary>\r\n        /// Writes message to log with Trace severity, including parsed exception.\r\n        /// </summary>\r\n        /// <param name=\"exception\">Message to be added into log.</param>\r\n        /// <param name=\"message\">Exception to be added into log.</param>\r\n        void Trace(Exception exception, string message);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/IMainViewAPI.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Threading;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public enum DesktopView : int\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Description(\"LOCDetailsViewLabel\")] Details = 0,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Description(\"LOCGridViewLabel\")] Grid = 1,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Description(\"LOCListViewLabel\")] List = 2\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public enum FullscreenView : int\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        List = 0,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Details = 1,\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes object providing API for main UI view.\r\n    /// </summary>\r\n    public interface IMainViewAPI\r\n    {\r\n        /// <summary>\r\n        /// Gets currently active Desktop mode view.\r\n        /// </summary>\r\n        DesktopView ActiveDesktopView { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets currently active Fullscreen mode view.\r\n        /// </summary>\r\n        FullscreenView ActiveFullscreenView { get; }\r\n\r\n        /// <summary>\r\n        /// Gets currently active sorting order.\r\n        /// </summary>\r\n        SortOrder SortOrder { get; }\r\n\r\n        /// <summary>\r\n        /// Gets currently active sorting order direction.\r\n        /// </summary>\r\n        SortOrderDirection SortOrderDirection { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets currently active grouping field.\r\n        /// </summary>\r\n        GroupableField Grouping { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets UI thread dispatcher.\r\n        /// </summary>\r\n        Dispatcher UIDispatcher { get; }\r\n\r\n        /// <summary>\r\n        /// Gets list of currently selected games.\r\n        /// </summary>\r\n        IEnumerable<Game> SelectedGames { get; }\r\n\r\n        /// <summary>\r\n        /// Gets list of games currently available in game list.\r\n        /// </summary>\r\n        List<Game> FilteredGames { get; }\r\n\r\n        /// <summary>\r\n        /// Opens settings view for specified plugin.\r\n        /// </summary>\r\n        /// <param name=\"pluginId\">Plugin ID.</param>\r\n        /// <returns>True if user saved any changes, False if dialog was canceled.</returns>\r\n        bool OpenPluginSettings(Guid pluginId);\r\n\r\n        /// <summary>\r\n        /// Switches Playnite to Library view.\r\n        /// </summary>\r\n        void SwitchToLibraryView();\r\n\r\n        /// <summary>\r\n        /// Selects game.\r\n        /// </summary>\r\n        /// <param name=\"gameId\">Game's database ID.</param>\r\n        void SelectGame(Guid gameId);\r\n\r\n        /// <summary>\r\n        /// Selects multiple games.\r\n        /// </summary>\r\n        /// <param name=\"gameIds\">List of game IDs to select.</param>\r\n        void SelectGames(IEnumerable<Guid> gameIds);\r\n\r\n        /// <summary>\r\n        /// Applies filter preset.\r\n        /// </summary>\r\n        /// <param name=\"filterId\">Filter ID.</param>\r\n        void ApplyFilterPreset(Guid filterId);\r\n\r\n        /// <summary>\r\n        /// Applies filter preset.\r\n        /// </summary>\r\n        /// <param name=\"preset\">Filter preset.</param>\r\n        void ApplyFilterPreset(FilterPreset preset);\r\n\r\n        /// <summary>\r\n        /// Gets ID of currently active filter preset.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        Guid GetActiveFilterPreset();\r\n\r\n        /// <summary>\r\n        /// Gets current filter settings.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        FilterPresetSettings GetCurrentFilterSettings();\r\n\r\n        /// <summary>\r\n        /// Opens global search view.\r\n        /// </summary>\r\n        /// <param name=\"searchTerm\">Default search term.</param>\r\n        void OpenSearch(string searchTerm);\r\n\r\n        /// <summary>\r\n        /// Opens global search view.\r\n        /// </summary>\r\n        /// <param name=\"context\">Search context to be activated after opening the view.</param>\r\n        /// <param name=\"searchTerm\">Default search term.</param>\r\n        void OpenSearch(SearchContext context, string searchTerm);\r\n\r\n        /// <summary>\r\n        /// Opens game edit dialog for specified game.\r\n        /// </summary>\r\n        /// <param name=\"gameId\"></param>\r\n        /// <returns>true if user made and saved changes. false if edit was cancelled, null when game was not found.</returns>\r\n        bool? OpenEditDialog(Guid gameId);\r\n\r\n        /// <summary>\r\n        /// Opens game edit dialog for specified games.\r\n        /// </summary>\r\n        /// <param name=\"gameIds\"></param>\r\n        /// <returns>true if user made and saved changes. false if edit was cancelled, null when game was not found.</returns>\r\n        bool? OpenEditDialog(List<Guid> gameIds);\r\n\r\n        /// <summary>\r\n        /// Gets list of filter presets in order set by a user.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        List<FilterPreset> GetSortedFilterPresets();\r\n\r\n        /// <summary>\r\n        /// Gets list of filter presets for Fullscreen mode in order set by a user.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        List<FilterPreset> GetSortedFilterFullscreenPresets();\r\n\r\n        /// <summary>\r\n        /// Toggles between details and list view in Fullscreen mode.\r\n        /// </summary>\r\n        void ToggleFullscreenView();\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/INotificationsAPI.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents notification message;\r\n    /// </summary>\r\n    public class NotificationMessage\r\n    {\r\n        /// <summary>\r\n        /// Ivokes when <see cref=\"ActivationAction\"/> is activated.\r\n        /// </summary>\r\n        public event EventHandler Activated;\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public event EventHandler Closed;\r\n\r\n        /// <summary>\r\n        /// Gets command to activate <see cref=\"ActivationAction\"/>.\r\n        /// </summary>\r\n        public ICommand ActivateCommand { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public ICommand CloseCommand { get; }\r\n\r\n        /// <summary>\r\n        /// Gets action to be invoked when notification is activated.\r\n        /// </summary>\r\n        public Action ActivationAction\r\n        {\r\n            get;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets notification id.\r\n        /// </summary>\r\n        public string Id\r\n        {\r\n            get;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets notification content text.\r\n        /// </summary>\r\n        public string Text\r\n        {\r\n            get;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets notification type.\r\n        /// </summary>\r\n        public NotificationType Type\r\n        {\r\n            get;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"NotificationMessage\"/>.\r\n        /// </summary>\r\n        /// <param name=\"id\">Notification id.</param>\r\n        /// <param name=\"text\">Notification text.</param>\r\n        /// <param name=\"type\">Notification type.</param>\r\n        public NotificationMessage(string id, string text, NotificationType type)\r\n        {\r\n            Id = id;\r\n            Text = text;\r\n            Type = type;\r\n            ActivateCommand = new RelayCommand(() =>\r\n            {\r\n                if (ActivationAction != null)\r\n                {\r\n                    Activated?.Invoke(this, null);\r\n                }\r\n            });\r\n\r\n            CloseCommand = new RelayCommand(() =>\r\n            {\r\n                Closed?.Invoke(this, null);\r\n            });\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"NotificationMessage\"/>.\r\n        /// </summary>\r\n        /// <param name=\"id\">Notification id.</param>\r\n        /// <param name=\"text\">Notification text.</param>\r\n        /// <param name=\"type\">Notification type.</param>\r\n        /// <param name=\"action\">Action to be invoked when notification is activated.</param>\r\n        public NotificationMessage(string id, string text, NotificationType type, Action action) : this(id, text, type)\r\n        {\r\n            ActivationAction = action;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Notification.\r\n    /// </summary>\r\n    public enum NotificationType\r\n    {\r\n        /// <summary>\r\n        /// Info severity.\r\n        /// </summary>\r\n        Info,\r\n        /// <summary>\r\n        /// Error severity.\r\n        /// </summary>\r\n        Error\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes notification API.\r\n    /// </summary>\r\n    public interface INotificationsAPI\r\n    {\r\n        /// <summary>\r\n        /// Gets list of all notification messages.\r\n        /// </summary>\r\n        ObservableCollection<NotificationMessage> Messages { get; }\r\n\r\n        /// <summary>\r\n        /// Gets notification count.\r\n        /// </summary>\r\n        int Count { get; }\r\n\r\n        /// <summary>\r\n        /// Adds new notification message.\r\n        /// </summary>\r\n        /// <param name=\"message\">Notification message</param>\r\n        void Add(NotificationMessage message);\r\n\r\n        /// <summary>\r\n        /// Adds new notification message.\r\n        /// </summary>\r\n        /// <param name=\"id\">Notification id.</param>\r\n        /// <param name=\"text\">Notification text.</param>\r\n        /// <param name=\"type\">Notification type.</param>\r\n        void Add(string id, string text, NotificationType type);\r\n\r\n        /// <summary>\r\n        /// Removes specific notification.\r\n        /// </summary>\r\n        /// <param name=\"id\">Notification id.</param>\r\n        void Remove(string id);\r\n\r\n        /// <summary>\r\n        /// Removes all notifications.\r\n        /// </summary>\r\n        void RemoveAll();\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/IPlayniteAPI.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.SDK.Events;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes object providing Playnite API.\r\n    /// </summary>\r\n    public interface IPlayniteAPI\r\n    {\r\n        /// <summary>\r\n        /// Gets main view API.\r\n        /// </summary>\r\n        IMainViewAPI MainView { get; }\r\n\r\n        /// <summary>\r\n        /// Gets database API.\r\n        /// </summary>\r\n        IGameDatabaseAPI Database { get; }\r\n\r\n        /// <summary>\r\n        /// Gets dialog API.\r\n        /// </summary>\r\n        IDialogsFactory Dialogs { get; }\r\n\r\n        /// <summary>\r\n        /// Gets paths API.\r\n        /// </summary>\r\n        IPlaynitePathsAPI Paths { get; }\r\n\r\n        /// <summary>\r\n        /// Gets notification API.\r\n        /// </summary>\r\n        INotificationsAPI Notifications { get; }\r\n\r\n        /// <summary>\r\n        /// Gets application info API.\r\n        /// </summary>\r\n        IPlayniteInfoAPI ApplicationInfo { get; }\r\n\r\n        /// <summary>\r\n        /// Gets web view API.\r\n        /// </summary>\r\n        IWebViewFactory WebViews { get; }\r\n\r\n        /// <summary>\r\n        /// Gets resources API.\r\n        /// </summary>\r\n        IResourceProvider Resources { get; }\r\n\r\n        /// <summary>\r\n        /// Gets URI handler API.\r\n        /// </summary>\r\n        IUriHandlerAPI UriHandler { get; }\r\n\r\n        /// <summary>\r\n        /// Get application settings API.\r\n        /// </summary>\r\n        IPlayniteSettingsAPI ApplicationSettings { get; }\r\n\r\n        /// <summary>\r\n        /// Gets addons API.\r\n        /// </summary>\r\n        IAddons Addons { get; }\r\n\r\n        /// <summary>\r\n        /// Gets emulation API.\r\n        /// </summary>\r\n        IEmulationAPI Emulation { get; }\r\n\r\n        /// <summary>\r\n        /// Expands dynamic game variables in specified string.\r\n        /// </summary>\r\n        /// <param name=\"game\">Game to use dynamic variables from.</param>\r\n        /// <param name=\"inputString\">String containing dynamic variables.</param>\r\n        /// <returns>String with replaces variables.</returns>\r\n        string ExpandGameVariables(Game game, string inputString);\r\n\r\n        /// <summary>\r\n        /// Expands dynamic game variables in specified string.\r\n        /// </summary>\r\n        /// <param name=\"game\">Game to use dynamic variables from.</param>\r\n        /// <param name=\"inputString\">String containing dynamic variables.</param>\r\n        /// <param name=\"emulatorDir\">String to be used to expand {EmulatorDir} variable if present.</param>\r\n        /// <returns>String with replaces variables.</returns>\r\n        string ExpandGameVariables(Game game, string inputString, string emulatorDir);\r\n\r\n        /// <summary>\r\n        /// Expands dynamic game variables in specified game action.\r\n        /// </summary>\r\n        /// <param name=\"game\">Game to use dynamic variables from.</param>\r\n        /// <param name=\"action\">Game action to expand variables to.</param>\r\n        /// <returns>Game action with expanded variables.</returns>\r\n        Models.GameAction ExpandGameVariables(Game game, Models.GameAction action);\r\n\r\n        /// <summary>\r\n        /// Starts game.\r\n        /// </summary>\r\n        /// <param name=\"gameId\">Game's database ID.</param>\r\n        void StartGame(Guid gameId);\r\n\r\n        /// <summary>\r\n        /// Installs game.\r\n        /// </summary>\r\n        /// <param name=\"gameId\">Game's database ID.</param>\r\n        void InstallGame(Guid gameId);\r\n\r\n        /// <summary>\r\n        /// Uninstalls game.\r\n        /// </summary>\r\n        /// <param name=\"gameId\">Game's database ID.</param>\r\n        void UninstallGame(Guid gameId);\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"args\"></param>\r\n        void AddCustomElementSupport(Plugin source, AddCustomElementSupportArgs args);\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"args\"></param>\r\n        void AddSettingsSupport(Plugin source, AddSettingsSupportArgs args);\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"source\"></param>\r\n        /// <param name=\"args\"></param>\r\n        void AddConvertersSupport(Plugin source, AddConvertersSupportArgs args);\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        List<GamepadController> GetConnectedControllers();\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents access class to API instances.\r\n    /// </summary>\r\n    public static class API\r\n    {\r\n        /// <summary>\r\n        /// Gets Playnite API.\r\n        /// </summary>\r\n        public static IPlayniteAPI Instance { get; internal set; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/IPlayniteInfoAPI.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes info API.\r\n    /// </summary>\r\n    public interface IPlayniteInfoAPI\r\n    {\r\n        /// <summary>\r\n        /// Gets Playnite version.\r\n        /// </summary>\r\n        System.Version ApplicationVersion { get; }\r\n\r\n        /// <summary>\r\n        /// Gets mode of curently running application.\r\n        /// </summary>\r\n        ApplicationMode Mode { get; }\r\n\r\n        /// <summary>\r\n        /// Indicates whether application is running in portable mode.\r\n        /// </summary>\r\n        bool IsPortable { get; }\r\n\r\n        /// <summary>\r\n        /// Indicates whether application is running in offline mode.\r\n        /// </summary>\r\n        bool InOfflineMode { get; }\r\n\r\n        /// <summary>\r\n        /// Indicates whether application was built in DEBUG configuration.\r\n        /// </summary>\r\n        bool IsDebugBuild { get; }\r\n\r\n        /// <summary>\r\n        /// Indicates whether application is configured to fail for most unhandled errors.\r\n        /// </summary>\r\n        bool ThrowAllErrors { get; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/IPlaynitePathsAPI.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes paths API.\r\n    /// </summary>\r\n    public interface IPlaynitePathsAPI\r\n    {\r\n        /// <summary>\r\n        /// Gets value indicating whether the application is running in portable mode.\r\n        /// </summary>\r\n        bool IsPortable { get; }\r\n\r\n        /// <summary>\r\n        /// Gets Playnite's installation path.\r\n        /// </summary>\r\n        string ApplicationPath { get; }\r\n\r\n        /// <summary>\r\n        /// Gets path where Playnite's configuration is stored.\r\n        /// </summary>\r\n        string ConfigurationPath { get; }\r\n\r\n        /// <summary>\r\n        /// Gets path dedicated for plugins to store data.\r\n        /// </summary>\r\n        string ExtensionsDataPath { get; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/IPlayniteSettingsAPI.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public enum PlaytimeImportMode\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Description(\"LOCSettingsPlaytimeImportModeAlways\")]\r\n        Always,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Description(\"LOCSettingsPlaytimeImportModeNewImportsOnly\")]\r\n        NewImportsOnly,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Description(\"LOCSettingsPlaytimeImportModeNever\")]\r\n        Never\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes interface for Fullscreen mode settings.\r\n    /// </summary>\r\n    public interface IFullscreenSettingsAPI\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool IsMusicMuted { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool SwapConfirmCancelButtons { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool SwapStartDetailsAction { get; }\r\n\r\n        /// <summary>\r\n        /// \r\n        /// </summary>\r\n        bool GuideButtonFocus { get; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes interface for completion status related settings.\r\n    /// </summary>\r\n    public interface ICompletionStatusSettignsApi\r\n    {\r\n        /// <summary>\r\n        /// Gets ID of status to be assigned to newly added games.\r\n        /// </summary>\r\n        Guid DefaultStatus { get; }\r\n\r\n        /// <summary>\r\n        /// Gets ID of status to be assigned when a game is played for the first time.\r\n        /// </summary>\r\n        Guid PlayedStatus { get; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes application settings API.\r\n    /// </summary>\r\n    public interface IPlayniteSettingsAPI\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        int Version { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        int GridItemWidthRatio { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        int GridItemHeightRatio { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool FirstTimeWizardComplete { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool DisableHwAcceleration { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool AsyncImageLoading { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool DownloadMetadataOnImport { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool StartInFullscreen { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        string DatabasePath { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool MinimizeToTray { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool CloseToTray { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool EnableTray { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        string Language { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool UpdateLibStartup { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        string DesktopTheme { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        string FullscreenTheme { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool StartMinimized { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool StartOnBoot { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Obsolete(\"Use new PlaytimeImportMode property instead.\")]\r\n        bool ForcePlayTimeSync { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        PlaytimeImportMode PlaytimeImportMode { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        string FontFamilyName { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool DiscordPresenceEnabled { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        ///\r\n        AgeRatingOrg AgeRatingOrgPriority { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        bool SidebarVisible { get; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Dock SidebarPosition { get; }\r\n\r\n        /// <summary>\r\n        /// Gets Fullscreen mode related settings.\r\n        /// </summary>\r\n        IFullscreenSettingsAPI Fullscreen { get; }\r\n\r\n        /// <summary>\r\n        /// Gets completion status related settings.\r\n        /// </summary>\r\n        ICompletionStatusSettignsApi CompletionStatus { get; }\r\n\r\n        /// <summary>\r\n        /// Checks if game is added on import exclusion list.\r\n        /// </summary>\r\n        /// <param name=\"gameId\">Game ID.</param>\r\n        /// <param name=\"libraryId\">Library plugin ID.</param>\r\n        /// <returns>True if game is on exclusion list.</returns>\r\n        bool GetGameExcludedFromImport(string gameId, Guid libraryId);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/ISettings.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes settings object.\r\n    /// </summary>\r\n    public interface ISettings : IEditableObject\r\n    {\r\n        /// <summary>\r\n        /// Verifies settings configuration.\r\n        /// </summary>\r\n        /// <param name=\"errors\">List of validation errors.</param>\r\n        /// <returns>true if validation passes, otherwise false.</returns>\r\n        bool VerifySettings(out List<string> errors);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/IUriHandlerAPI.cs",
    "content": "﻿using Playnite.SDK.Events;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes API for handling playnite:// URI.\r\n    /// </summary>\r\n    public interface IUriHandlerAPI\r\n    {\r\n        /// <summary>\r\n        /// Registers new URI source.\r\n        /// </summary>\r\n        /// <param name=\"source\">Source name.</param>\r\n        /// <param name=\"handler\">Method to be executed.</param>\r\n        void RegisterSource(string source, Action<PlayniteUriEventArgs> handler);\r\n\r\n        /// <summary>\r\n        /// Removes registered source.\r\n        /// </summary>\r\n        /// <param name=\"source\">Source name.</param>\r\n        void RemoveSource(string source);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/IWebView.cs",
    "content": "﻿using Playnite.SDK.Events;\r\nusing Playnite.SDK.WebViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Media;\r\n\r\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    public class WebViewResourceLoadedCallback\r\n    {\r\n        public Playnite.SDK.WebViewModels.Request Request { get; }\r\n        public Playnite.SDK.WebViewModels.Response Response { get; }\r\n        public Playnite.SDK.WebViewModels.UrlRequestStatus UrlRequestStatus { get; }\r\n        public System.IO.MemoryStream ResponseContent { get; set; }\r\n        public long ReceivedContentLength { get; set; }\r\n\r\n        public WebViewResourceLoadedCallback(\r\n            Request request,\r\n            Response response,\r\n            UrlRequestStatus urlRequestStatus,\r\n            long receivedContentLength)\r\n        {\r\n            Request = request;\r\n            Response = response;\r\n            UrlRequestStatus = urlRequestStatus;\r\n            ReceivedContentLength = receivedContentLength;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents browser view settings.\r\n    /// </summary>\r\n    public class WebViewSettings\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether JavaScript exection is enabled.\r\n        /// </summary>\r\n        public bool JavaScriptEnabled { get; set; } = true;\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether cache is enabled.\r\n        /// </summary>\r\n        [Obsolete(\"AppCache was removed from CEF\")]\r\n        public bool CacheEnabled { get; set; } = true;\r\n\r\n        /// <summary>\r\n        /// User agent to be used for specific browser instance. Leave empty to use default.\r\n        /// </summary>\r\n        public string UserAgent { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets window width.\r\n        /// </summary>\r\n        public int WindowWidth { get; set; } = 0;\r\n\r\n        /// <summary>\r\n        /// Gets or sets window height.\r\n        /// </summary>\r\n        public int WindowHeight { get; set; } = 0;\r\n\r\n        /// <summary>\r\n        /// Gets or sets window background color.\r\n        /// </summary>\r\n        public Color WindowBackground { get; set; } = Colors.Transparent;\r\n\r\n        /// <summary>\r\n        ///  Get or sets callback called when web view finishes loading web resource.\r\n        /// </summary>\r\n        public Action<WebViewResourceLoadedCallback> ResourceLoadedCallback { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets a value indicating whether response content strema should be passed to resource load callback.\r\n        /// </summary>\r\n        public bool PassResourceContentStreamToCallback { get; set; } = false;\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents JavaScript evaluation resut.\r\n    /// </summary>\r\n    public class JavaScriptEvaluationResult\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets error message.\r\n        /// </summary>\r\n        public string Message { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether the javascript executed successfully.\r\n        /// </summary>\r\n        public bool Success { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets result of script evaluation.\r\n        /// </summary>\r\n        public object Result { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes web view object.\r\n    /// </summary>\r\n    public interface IWebView : IDisposable\r\n    {\r\n        /// <summary>\r\n        /// Gets a flag that indicates if you can execute javascript in the main frame.\r\n        /// </summary>\r\n        bool CanExecuteJavascriptInMainFrame { get; }\r\n\r\n        /// <summary>\r\n        /// Open view.\r\n        /// </summary>\r\n        void Open();\r\n\r\n        /// <summary>\r\n        /// Open view as modal dialog.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        bool? OpenDialog();\r\n\r\n        /// <summary>\r\n        /// Navigates to url and wait for page to be loaded.\r\n        /// </summary>\r\n        /// <param name=\"url\">URL to load.</param>\r\n        void NavigateAndWait(string url);\r\n\r\n        /// <summary>\r\n        /// Navigates to url.\r\n        /// </summary>\r\n        /// <param name=\"url\">URL to load.</param>\r\n        void Navigate(string url);\r\n\r\n        /// <summary>\r\n        /// Gets page text.\r\n        /// </summary>\r\n        /// <returns>Page text.</returns>\r\n        string GetPageText();\r\n\r\n        /// <summary>\r\n        /// Gets page text.\r\n        /// </summary>\r\n        /// <returns>Page text.</returns>\r\n        Task<string> GetPageTextAsync();\r\n\r\n        /// <summary>\r\n        /// Gets document source.\r\n        /// </summary>\r\n        /// <returns>Document source.</returns>\r\n        string GetPageSource();\r\n\r\n        /// <summary>\r\n        /// Gets document source.\r\n        /// </summary>\r\n        /// <returns>Document source task.</returns>\r\n        Task<string> GetPageSourceAsync();\r\n\r\n        /// <summary>\r\n        /// Gets current URL address.\r\n        /// </summary>\r\n        /// <returns>URL address.</returns>\r\n        string GetCurrentAddress();\r\n\r\n        /// <summary>\r\n        /// Deletes all cookies from specified domain.\r\n        /// </summary>\r\n        /// <param name=\"domain\">Cookie domain.</param>\r\n        void DeleteDomainCookies(string domain);\r\n\r\n        /// <summary>\r\n        /// Deletes all cookies from domains matching specified regular expression.\r\n        /// </summary>\r\n        /// <param name=\"domainRegex\"></param>\r\n        void DeleteDomainCookiesRegex(string domainRegex);\r\n\r\n        /// <summary>\r\n        /// Deletes cookies.\r\n        /// </summary>\r\n        /// <param name=\"url\">Cookie URL.</param>\r\n        /// <param name=\"name\">Cookie name.</param>\r\n        void DeleteCookies(string url, string name);\r\n\r\n        /// <summary>\r\n        /// Gets all cookies.\r\n        /// </summary>\r\n        /// <returns>List of cookies.</returns>\r\n        List<HttpCookie> GetCookies();\r\n\r\n        /// <summary>\r\n        /// Sets cookie data.\r\n        /// </summary>\r\n        /// <param name=\"url\">Cookie URL.</param>\r\n        /// <param name=\"domain\">Cookie domain.</param>\r\n        /// <param name=\"name\">Cookie name.</param>\r\n        /// <param name=\"value\">Cookie value.</param>\r\n        /// <param name=\"path\">Cookie url path.</param>\r\n        /// <param name=\"expires\">Expiration date.</param>\r\n        void SetCookies(string url, string domain, string name, string value, string path, DateTime expires);\r\n\r\n        /// <summary>\r\n        /// Sets cookie data.\r\n        /// </summary>\r\n        /// <param name=\"url\">Cookie URL.</param>\r\n        /// <param name=\"cookie\">Cookie data.</param>\r\n        void SetCookies(string url, HttpCookie cookie);\r\n\r\n        /// <summary>\r\n        /// Closes view.\r\n        /// </summary>\r\n        void Close();\r\n\r\n        /// <summary>\r\n        /// Occurs when web view loading changes, for example when page is loaded.\r\n        /// </summary>\r\n        event EventHandler<WebViewLoadingChangedEventArgs> LoadingChanged;\r\n\r\n        /// <summary>\r\n        /// Evaluates JavaScript script in the browser instance.\r\n        /// </summary>\r\n        /// <param name=\"script\"></param>\r\n        /// <returns></returns>\r\n        Task<JavaScriptEvaluationResult> EvaluateScriptAsync(string script);\r\n\r\n        /// <summary>\r\n        /// Gets window host for the web view. Doesn't apply to off-screen views.\r\n        /// </summary>\r\n        Window WindowHost { get; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes web view factory provider.\r\n    /// </summary>\r\n    public interface IWebViewFactory\r\n    {\r\n        /// <summary>\r\n        /// Creates new offscreen web view.\r\n        /// </summary>\r\n        /// <returns>Offscreen web view.</returns>\r\n        IWebView CreateOffscreenView();\r\n\r\n        /// <summary>\r\n        /// Creates new offscreen web view with specific settings.\r\n        /// </summary>\r\n        /// <param name=\"settings\">Browser view settings.</param>\r\n        /// <returns></returns>\r\n        IWebView CreateOffscreenView(WebViewSettings settings);\r\n\r\n        /// <summary>\r\n        /// Creates new web view.\r\n        /// </summary>\r\n        /// <param name=\"width\">View widht.</param>\r\n        /// <param name=\"height\">View height.</param>\r\n        /// <returns>Web view.</returns>\r\n        IWebView CreateView(int width, int height);\r\n\r\n        /// <summary>\r\n        /// Creates new web view.\r\n        /// </summary>\r\n        /// <param name=\"width\">View widht.</param>\r\n        /// <param name=\"height\">View height.</param>\r\n        /// <param name=\"background\">View background color.</param>\r\n        /// <returns>Web view.</returns>\r\n        IWebView CreateView(int width, int height, Color background);\r\n\r\n        /// <summary>\r\n        /// Creates new web view.\r\n        /// </summary>\r\n        /// <param name=\"settings\">Browser view settings.</param>\r\n        /// <returns></returns>\r\n        IWebView CreateView(WebViewSettings settings);\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents web view cookie object.\r\n    /// </summary>\r\n    public class HttpCookie\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"HttpCookie\"/>.\r\n        /// </summary>\r\n        public HttpCookie()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// The cookie name.\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n\r\n        /// <summary>\r\n        /// The cookie value.\r\n        /// </summary>\r\n        public string Value { get; set; }\r\n\r\n        /// <summary>\r\n        /// The cookie domain.\r\n        /// </summary>\r\n        public string Domain { get; set; }\r\n\r\n        /// <summary>\r\n        /// The cookie path.\r\n        /// </summary>\r\n        public string Path { get; set; }\r\n\r\n        /// <summary>\r\n        /// The cookie expire date.\r\n        /// </summary>\r\n        public DateTime? Expires { get; set; }\r\n\r\n        /// <summary>\r\n        /// The cookie creation date.\r\n        /// </summary>\r\n        public DateTime Creation { get; set; }\r\n\r\n        /// <summary>\r\n        /// If true the cookie will only be sent for HTTPS requests.\r\n        /// </summary>\r\n        public bool Secure { get; set; }\r\n\r\n        /// <summary>\r\n        /// If true the cookie will only be sent for HTTP requests.\r\n        /// </summary>\r\n        public bool HttpOnly { get; set; }\r\n\r\n        /// <summary>\r\n        /// The cookie last access date. This is automatically populated by the system on access.\r\n        /// </summary>\r\n        public DateTime LastAccess { get; set; }\r\n\r\n        /// <summary>\r\n        /// Same site\r\n        /// </summary>\r\n        public CookieSameSite SameSite { get; set; }\r\n\r\n        /// <summary>\r\n        /// Priority\r\n        /// </summary>\r\n        public CookiePriority Priority { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Cookie same site values.\r\n    /// </summary>\r\n    /// <remarks>\r\n    /// See https://source.chromium.org/chromium/chromium/src/+/master:net/cookies/cookie_constants.h\r\n    /// </remarks>\r\n    public enum CookieSameSite\r\n    {\r\n        /// <summary>\r\n        /// Unspecified\r\n        /// </summary>\r\n        Unspecified = 0,\r\n        /// <summary>\r\n        /// Cookies will be sent in all contexts, i.e sending cross-origin is allowed. None\r\n        /// used to be the default value, but recent browser versions made Lax the default\r\n        /// value to have reasonably robust defense against some classes of cross-site request\r\n        /// forgery (CSRF) attacks.\r\n        /// </summary>\r\n        NoRestriction = 1,\r\n        /// <summary>\r\n        /// Cookies are allowed to be sent with top-level navigations and will be sent along\r\n        /// with GET request initiated by third party website. This is the default value\r\n        /// in modern browsers.\r\n        /// </summary>\r\n        LaxMode = 2,\r\n        /// <summary>\r\n        /// Cookies will only be sent in a first-party context and not be sent along with\r\n        /// requests initiated by third party websites.\r\n        /// </summary>\r\n        StrictMode = 3\r\n    }\r\n\r\n    /// <summary>\r\n    /// Cookie priority values.\r\n    /// </summary>\r\n    public enum CookiePriority\r\n    {\r\n        /// <summary>\r\n        /// Low Priority\r\n        /// </summary>\r\n        Low = -1,\r\n        /// <summary>\r\n        /// Medium Priority\r\n        /// </summary>\r\n        Medium = 0,\r\n        /// <summary>\r\n        /// High Priority\r\n        /// </summary>\r\n        High = 1\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/LibraryClient.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes library client application.\r\n    /// </summary>\r\n    public abstract class LibraryClient\r\n    {\r\n        /// <summary>\r\n        /// Gets value indicating whether the client is installed.\r\n        /// </summary>\r\n        public abstract bool IsInstalled { get; }\r\n\r\n        /// <summary>\r\n        /// \r\n        /// </summary>\r\n        public virtual string Icon { get; }\r\n\r\n        /// <summary>\r\n        /// Open client application.\r\n        /// </summary>\r\n        public abstract void Open();\r\n\r\n        /// <summary>\r\n        /// Shuts down client application\r\n        /// </summary>\r\n        public virtual void Shutdown()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/LogManager.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes logger not logging anywhere.\r\n    /// </summary>\r\n    public class NullLoggger : ILogger\r\n    {\r\n        /// <inheritdoc />\r\n        public void Debug(string message)\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public void Debug(Exception exception, string message)\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public void Error(string message)\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public void Error(Exception exception, string message)\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public void Info(string message)\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public void Info(Exception exception, string message)\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public void Warn(string message)\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public void Warn(Exception exception, string message)\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public void Trace(string message)\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc />\r\n        public void Trace(Exception exception, string message)\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes log provider.\r\n    /// </summary>\r\n    public interface ILogProvider\r\n    {\r\n        /// <summary>\r\n        /// Gets new logger.\r\n        /// </summary>\r\n        /// <param name=\"loggerName\">Logger name.</param>\r\n        /// <returns>Logger.</returns>\r\n        ILogger GetLogger(string loggerName);\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents log manager.\r\n    /// </summary>\r\n    public static class LogManager\r\n    {\r\n        private static ILogProvider logManager;\r\n\r\n        /// <summary>\r\n        /// Initializes log manager using specific log provider.\r\n        /// </summary>\r\n        /// <param name=\"manager\"></param>\r\n        public static void Init(ILogProvider manager)\r\n        {\r\n            logManager = manager;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets logger with name of calling class.\r\n        /// </summary>\r\n        /// <returns>Logger.</returns>\r\n        [MethodImpl(MethodImplOptions.NoInlining)]\r\n        public static ILogger GetLogger()\r\n        {\r\n            if (logManager != null)\r\n            {\r\n                var asmName = Assembly.GetCallingAssembly().GetName().Name;\r\n                var isCore = asmName == \"Playnite.DesktopApp\" || asmName == \"Playnite.FullscreenApp\" || asmName == \"Playnite\";\r\n                var className = (new StackFrame(1)).GetMethod().DeclaringType.Name;\r\n                if (isCore)\r\n                {\r\n                    return logManager.GetLogger(className);\r\n                }\r\n                else\r\n                {\r\n                    return logManager.GetLogger($\"{asmName}#{className}\");\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return new NullLoggger();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets logger with specific name.\r\n        /// </summary>\r\n        /// <param name=\"loggerName\">Logger name.</param>\r\n        /// <returns>Logger.</returns>\r\n        [MethodImpl(MethodImplOptions.NoInlining)]\r\n        public static ILogger GetLogger(string loggerName)\r\n        {\r\n            if (string.IsNullOrEmpty(loggerName))\r\n            {\r\n                throw new ArgumentNullException(nameof(loggerName));\r\n            }\r\n\r\n            if (logManager != null)\r\n            {\r\n                var asmName = Assembly.GetCallingAssembly().GetName().Name;\r\n                var isCore = asmName == \"Playnite.DesktopApp\" || asmName == \"Playnite.FullscreenApp\" || asmName == \"Playnite\";\r\n                if (isCore || loggerName.Contains(\"#\"))\r\n                {\r\n                    return logManager.GetLogger(loggerName);\r\n                }\r\n                else\r\n                {\r\n                    return logManager.GetLogger($\"{asmName}#{loggerName}\");\r\n                }\r\n            }\r\n            else\r\n            {\r\n                return new NullLoggger();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/MetadataProvider.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes metadata provider for library games.\r\n    /// </summary>\r\n    public abstract class LibraryMetadataProvider : IDisposable\r\n    {\r\n        /// <summary>\r\n        /// <inheritdoc/>\r\n        /// </summary>\r\n        public virtual void Dispose()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets metadata for specified games.\r\n        /// </summary>\r\n        /// <param name=\"game\">Game to get data for.</param>\r\n        /// <returns>Game metadata.</returns>\r\n        public abstract GameMetadata GetMetadata(Game game);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/AgeRating.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Describes age rating object.\r\n    /// </summary>\r\n    public class AgeRating : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"AgeRating\"/>.\r\n        /// </summary>\r\n        public AgeRating() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"AgeRating\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\">Rating name.</param>\r\n        public AgeRating(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty age rating.\r\n        /// </summary>\r\n        public static readonly AgeRating Empty = new AgeRating { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/AgeRatingOrg.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Represents content rating organization.\r\n    /// </summary>\r\n    public enum AgeRatingOrg\r\n    {\r\n        /// <summary>\r\n        /// PEGI - Pan European Game Information\r\n        /// </summary>\r\n        PEGI,\r\n        /// <summary>\r\n        /// ESRB - Entertainment Software Rating Board\r\n        /// </summary>\r\n        ESRB\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/AppSoftware.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public enum AppSoftwareType\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Description(\"LOCDefault\")]\r\n        Standard,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Description(\"LOCGameActionTypeScript\")]\r\n        Script\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents general application software.\r\n    /// </summary>\r\n    public class AppSoftware : DatabaseObject\r\n    {\r\n        private string icon;\r\n        /// <summary>\r\n        /// Gets or sets application icon.\r\n        /// </summary>\r\n        public string Icon\r\n        {\r\n            get => icon;\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string arguments;\r\n        /// <summary>\r\n        /// Gets or sets application arguments.\r\n        /// </summary>\r\n        public string Arguments\r\n        {\r\n            get => arguments;\r\n            set\r\n            {\r\n                arguments = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string path;\r\n        /// <summary>\r\n        /// Gets or sets application path.\r\n        /// </summary>\r\n        public string Path\r\n        {\r\n            get => path;\r\n            set\r\n            {\r\n                path = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string workingDir;\r\n        /// <summary>\r\n        /// Gets or sets application working directory.\r\n        /// </summary>\r\n        public string WorkingDir\r\n        {\r\n            get => workingDir;\r\n            set\r\n            {\r\n                workingDir = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showOnSidebar;\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public bool ShowOnSidebar\r\n        {\r\n            get => showOnSidebar;\r\n            set\r\n            {\r\n                showOnSidebar = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private AppSoftwareType appType = AppSoftwareType.Standard;\r\n        /// <summary>\r\n        /// Gets or sets type.\r\n        /// </summary>\r\n        public AppSoftwareType AppType\r\n        {\r\n            get => appType;\r\n            set\r\n            {\r\n                appType = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string script;\r\n        /// <summary>\r\n        /// Gets or sets script to execute if type is set to script type.\r\n        /// </summary>\r\n        public string Script\r\n        {\r\n            get => script;\r\n            set\r\n            {\r\n                script = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"AppSoftware\"/>.\r\n        /// </summary>\r\n        public AppSoftware() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"AppSoftware\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public AppSoftware(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override void CopyDiffTo(object target)\r\n        {\r\n            base.CopyDiffTo(target);\r\n\r\n            if (target is AppSoftware tro)\r\n            {\r\n                if (!string.Equals(Icon, tro.Icon, StringComparison.Ordinal))\r\n                {\r\n                    tro.Icon = Icon;\r\n                }\r\n\r\n                if (!string.Equals(Arguments, tro.Arguments, StringComparison.Ordinal))\r\n                {\r\n                    tro.Arguments = Arguments;\r\n                }\r\n\r\n                if (!string.Equals(Path, tro.Path, StringComparison.Ordinal))\r\n                {\r\n                    tro.Path = Path;\r\n                }\r\n\r\n                if (!string.Equals(WorkingDir, tro.WorkingDir, StringComparison.Ordinal))\r\n                {\r\n                    tro.WorkingDir = WorkingDir;\r\n                }\r\n\r\n                if (ShowOnSidebar != tro.ShowOnSidebar)\r\n                {\r\n                    tro.ShowOnSidebar = ShowOnSidebar;\r\n                }\r\n\r\n                if (AppType != tro.AppType)\r\n                {\r\n                    tro.AppType = AppType;\r\n                }\r\n\r\n                if (!string.Equals(Script, tro.Script, StringComparison.Ordinal))\r\n                {\r\n                    tro.Script = Script;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new ArgumentException($\"Target object has to be of type {GetType().Name}\");\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/Category.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Describes category object.\r\n    /// </summary>\r\n    public class Category : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Category\"/>.\r\n        /// </summary>\r\n        public Category() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Category\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\">Category name.</param>\r\n        public Category(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty category.\r\n        /// </summary>\r\n        public static readonly Category Empty = new Category { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/Company.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Describes Company object.\r\n    /// </summary>\r\n    public class Company : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Company\"/>.\r\n        /// </summary>\r\n        public Company() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Company\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Company(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public static readonly Company Empty = new Company { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes Developer object.\r\n    /// </summary>\r\n    public class Developer : Company\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Developer\"/>.\r\n        /// </summary>\r\n        public Developer() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Developer\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Developer(string name) : base(name)\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Describes Publisher object.\r\n    /// </summary>\r\n    public class Publisher : Company\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Publisher\"/>.\r\n        /// </summary>\r\n        public Publisher() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Publisher\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Publisher(string name) : base(name)\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/CompletionStatus.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Represents game completion status.\r\n    /// </summary>\r\n    public class CompletionStatus : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"CompletionStatus\"/>.\r\n        /// </summary>\r\n        public CompletionStatus() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"CompletionStatus\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public CompletionStatus(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty CompletionStatus.\r\n        /// </summary>\r\n        public static readonly CompletionStatus Empty = new CompletionStatus { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/DatabaseObject.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Represents base database object item.\r\n    /// </summary>\r\n    public class DatabaseObject : ObservableObject, IComparable, IIdentifiable\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets identifier of database object.\r\n        /// </summary>\r\n        public Guid Id { get; set; }\r\n\r\n        private string name;\r\n        /// <summary>\r\n        /// Gets or sets name.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get\r\n            {\r\n                return name;\r\n            }\r\n\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"DatabaseObject\"/>.\r\n        /// </summary>\r\n        public DatabaseObject()\r\n        {\r\n            Id = Guid.NewGuid();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Compares Names of database object.\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public int CompareTo(object obj)\r\n        {\r\n            // This is implemented for CollectionViewSource to do sorting properly.\r\n            // That's also the reason why this is not virtual for inherited classes to do comparsion of other fields.\r\n            var objName = (obj as DatabaseObject).Name;\r\n            if (string.IsNullOrEmpty(Name) && string.IsNullOrEmpty(objName))\r\n            {\r\n                return 0;\r\n            }\r\n\r\n            if (string.IsNullOrEmpty(Name))\r\n            {\r\n                return 1;\r\n            }\r\n\r\n            if (string.IsNullOrEmpty(objName))\r\n            {\r\n                return -1;\r\n            }\r\n\r\n            return string.Compare(Name, objName, true);\r\n        }\r\n\r\n        /// <summary>\r\n        /// DO NOT use for actual equality check, this only checks if db Ids are equal!\r\n        /// </summary>\r\n        /// <param name=\"obj\"></param>\r\n        /// <returns></returns>\r\n        public override bool Equals(object obj)\r\n        {\r\n            // This is implemented for CollectionViewSource to do grouping/sorting properly.\r\n            // That's also the reason why this is not virtual for inherited classes to do comparsion of other fields.\r\n            if (obj is DatabaseObject dbObj)\r\n            {\r\n                return dbObj.Id == Id;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override int GetHashCode()\r\n        {\r\n            if (Id == Guid.Empty)\r\n            {\r\n                return 0;\r\n            }\r\n            else\r\n            {\r\n                return Id.GetHashCode();\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name ?? string.Empty;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Copies differential properties to target object intance.\r\n        /// </summary>\r\n        /// <param name=\"target\">Target object instance to receive new data.</param>\r\n        public virtual void CopyDiffTo(object target)\r\n        {\r\n            if (target == null)\r\n            {\r\n                throw new ArgumentNullException(\"Cannot copy data to a null object.\");\r\n            }\r\n\r\n            if (ReferenceEquals(this, target))\r\n            {\r\n                throw new ReferenceException(\"Cannot copy data to itself.\");\r\n            }\r\n\r\n            if (target is DatabaseObject dbo)\r\n            {\r\n                if (!string.Equals(Name, dbo.Name, StringComparison.Ordinal))\r\n                {\r\n                    dbo.Name = Name;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new TypeMismatchException($\"Target object has to be of type {GetType().Name}\");\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/Emulator.cs",
    "content": "﻿using Playnite.SDK.Data;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class EmulatorDefinitionProfile\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public List<string> Platforms { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public List<string> ImageExtensions { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public List<string> ProfileFiles { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string InstallationFile { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string StartupArguments { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string StartupExecutable { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public bool ScriptStartup { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public bool ScriptGameImport { get; set; }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class EmulatorDefinition\r\n    {\r\n        internal string DirectoryName { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string Id { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string Website { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public List<EmulatorDefinitionProfile> Profiles { get; set; }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents built-in region definition.\r\n    /// </summary>\r\n    public class EmulatedRegion : IEquatable<EmulatedRegion>\r\n    {\r\n        /// <summary>\r\n        /// Gets region id.\r\n        /// </summary>\r\n        public string Id { get; set; }\r\n        /// <summary>\r\n        /// Gets region name.\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n        /// <summary>\r\n        /// Gets value indicating whether the region should be imported into new libraries.\r\n        /// </summary>\r\n        public bool DefaultImport { get; set; }\r\n        /// <summary>\r\n        /// Gets ID of the region on IGDB database.\r\n        /// </summary>\r\n        public ulong IgdbId { get; set; }\r\n        /// <summary>\r\n        /// Gets region codes.\r\n        /// </summary>\r\n        public List<string> Codes { get; set; }\r\n\r\n        /// <inheritdoc/>\r\n        public override int GetHashCode()\r\n        {\r\n            return Id?.GetHashCode() ?? 0;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(EmulatedRegion other)\r\n        {\r\n            return other.Id == Id;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override bool Equals(object obj)\r\n        {\r\n            if (obj is EmulatedRegion region)\r\n            {\r\n                return Equals(region);\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents built-in platform definition.\r\n    /// </summary>\r\n    public class EmulatedPlatform : IEquatable<EmulatedPlatform>\r\n    {\r\n        /// <summary>\r\n        /// Gets ID of the platform on IGDB database.\r\n        /// </summary>\r\n        public ulong IgdbId { get; set; }\r\n        /// <summary>\r\n        /// Gets platform name.\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n        /// <summary>\r\n        /// Gets platform id.\r\n        /// </summary>\r\n        public string Id { get; set; }\r\n        /// <summary>\r\n        /// Gets list of platform ROM database ids.\r\n        /// </summary>\r\n        public List<string> Databases { get; set; }\r\n        /// <summary>\r\n        /// Gets list of emulator IDs supporting this platform.\r\n        /// </summary>\r\n        public List<string> Emulators { get; set; }\r\n\r\n        /// <inheritdoc/>\r\n        public override int GetHashCode()\r\n        {\r\n            return Id?.GetHashCode() ?? 0;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(EmulatedPlatform other)\r\n        {\r\n            return other.Id == Id;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override bool Equals(object obj)\r\n        {\r\n            if (obj is EmulatedPlatform platform)\r\n            {\r\n                return Equals(platform);\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public abstract class EmulatorProfile : ObservableObject\r\n    {\r\n        private string id;\r\n        /// <summary>\r\n        /// Gets emulator profile ID.\r\n        /// </summary>\r\n        public string Id\r\n        {\r\n            get => id;\r\n            set\r\n            {\r\n                id = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string name;\r\n        /// <summary>\r\n        /// Gets profile name.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get => name;\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string preScript;\r\n        /// <summary>\r\n        /// Gets pre-execution script.\r\n        /// </summary>\r\n        public string PreScript\r\n        {\r\n            get => preScript;\r\n            set\r\n            {\r\n                preScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string postScript;\r\n        /// <summary>\r\n        /// Gets post-execution script.\r\n        /// </summary>\r\n        public string PostScript\r\n        {\r\n            get => postScript;\r\n            set\r\n            {\r\n                postScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string exitScript;\r\n        /// <summary>\r\n        /// Gets exit-execution script.\r\n        /// </summary>\r\n        public string ExitScript\r\n        {\r\n            get => exitScript;\r\n            set\r\n            {\r\n                exitScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets emulator profile object type.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public Type Type => GetType();\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents built-in emulator profile.\r\n    /// </summary>\r\n    public class BuiltInEmulatorProfile : EmulatorProfile, IEquatable<BuiltInEmulatorProfile>\r\n    {\r\n        internal static readonly string ProfilePrefix = \"#builtin_\";\r\n\r\n        private string builtInProfileName;\r\n        /// <summary>\r\n        /// Gets name of built-in profile represented by this definition.\r\n        /// </summary>\r\n        public string BuiltInProfileName\r\n        {\r\n            get => builtInProfileName;\r\n            set\r\n            {\r\n                builtInProfileName = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool overrideDefaultArgs;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether built-in arguments should be overriden.\r\n        /// </summary>\r\n        public bool OverrideDefaultArgs\r\n        {\r\n            get => overrideDefaultArgs;\r\n            set\r\n            {\r\n                overrideDefaultArgs = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string customArguments;\r\n        /// <summary>\r\n        /// Gets or set custom emulator arguments.\r\n        /// </summary>\r\n        public string CustomArguments\r\n        {\r\n            get => customArguments;\r\n            set\r\n            {\r\n                customArguments = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"BuiltInEmulatorProfile\"/>.\r\n        /// </summary>\r\n        public BuiltInEmulatorProfile() : base()\r\n        {\r\n            Id = ProfilePrefix + Guid.NewGuid();\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(BuiltInEmulatorProfile other)\r\n        {\r\n            if (other is null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(BuiltInProfileName, other.BuiltInProfileName, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Name, other.Name, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(ExitScript, other.ExitScript, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(PostScript, other.PostScript, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(PreScript, other.PreScript, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(CustomArguments, other.CustomArguments, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (OverrideDefaultArgs != other.OverrideDefaultArgs)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public BuiltInEmulatorProfile GetCopy()\r\n        {\r\n            return new BuiltInEmulatorProfile\r\n            {\r\n                Id = Id,\r\n                BuiltInProfileName = BuiltInProfileName,\r\n                Name = Name,\r\n                ExitScript = ExitScript,\r\n                PostScript = PostScript,\r\n                PreScript = PreScript,\r\n                CustomArguments = CustomArguments,\r\n                OverrideDefaultArgs = OverrideDefaultArgs,\r\n            };\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents emulator profile.\r\n    /// </summary>\r\n    public class CustomEmulatorProfile : EmulatorProfile, IEquatable<CustomEmulatorProfile>\r\n    {\r\n        internal static readonly string ProfilePrefix = \"#custom_\";\r\n\r\n        private string startupScript;\r\n        /// <summary>\r\n        /// Gets startup script.\r\n        /// </summary>\r\n        public string StartupScript\r\n        {\r\n            get => startupScript;\r\n            set\r\n            {\r\n                startupScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> platforms;\r\n        /// <summary>\r\n        /// Gets or sets platforms supported by profile.\r\n        /// </summary>\r\n        public List<Guid> Platforms\r\n        {\r\n            get => platforms;\r\n            set\r\n            {\r\n                platforms = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<string> imageExtensions;\r\n        /// <summary>\r\n        /// Gets or sets file extension supported by profile.\r\n        /// </summary>\r\n        public List<string> ImageExtensions\r\n        {\r\n            get => imageExtensions;\r\n            set\r\n            {\r\n                imageExtensions = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string executable;\r\n        /// <summary>\r\n        /// Gets or sets executable path used to launch emulator.\r\n        /// </summary>\r\n        public string Executable\r\n        {\r\n            get => executable;\r\n            set\r\n            {\r\n                executable = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string arguments;\r\n        /// <summary>\r\n        /// Gets or sets arguments for emulator executable.\r\n        /// </summary>\r\n        public string Arguments\r\n        {\r\n            get => arguments;\r\n            set\r\n            {\r\n                arguments = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string workingDirectory;\r\n        /// <summary>\r\n        /// Gets or sets working directory of emulator process.\r\n        /// </summary>\r\n        public string WorkingDirectory\r\n        {\r\n            get => workingDirectory;\r\n            set\r\n            {\r\n                workingDirectory = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private TrackingMode trackingMode = TrackingMode.Default;\r\n        /// <summary>\r\n        /// Gets or sets executable arguments for File type tasks.\r\n        /// </summary>\r\n        public TrackingMode TrackingMode\r\n        {\r\n            get => trackingMode;\r\n            set\r\n            {\r\n                trackingMode = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string trackingPath;\r\n        /// <summary>\r\n        /// Gets or sets executable arguments for File type tasks.\r\n        /// </summary>\r\n        public string TrackingPath\r\n        {\r\n            get => trackingPath;\r\n            set\r\n            {\r\n                trackingPath = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of EmulatorProfile.\r\n        /// </summary>\r\n        public CustomEmulatorProfile() : base()\r\n        {\r\n            Id = ProfilePrefix + Guid.NewGuid();\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(CustomEmulatorProfile other)\r\n        {\r\n            if (other is null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Id, other.Id, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Name, other.Name, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!Platforms.IsListEqual(other.Platforms))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!ImageExtensions.IsListEqual(other.ImageExtensions))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Executable, other.Executable, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Arguments, other.Arguments, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(WorkingDirectory, other.WorkingDirectory, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(ExitScript, other.ExitScript, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(PostScript, other.PostScript, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(PreScript, other.PreScript, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(StartupScript, other.StartupScript, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(TrackingPath, other.TrackingPath, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (TrackingMode != other.TrackingMode)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public CustomEmulatorProfile GetCopy()\r\n        {\r\n            return new CustomEmulatorProfile\r\n            {\r\n                Id = Id,\r\n                Name = Name,\r\n                Platforms = Platforms?.ToList(),\r\n                ImageExtensions = ImageExtensions?.ToList(),\r\n                Executable = Executable,\r\n                Arguments = Arguments,\r\n                WorkingDirectory = WorkingDirectory,\r\n                ExitScript = ExitScript,\r\n                PostScript = PostScript,\r\n                PreScript = PreScript,\r\n                StartupScript = StartupScript,\r\n                TrackingMode = TrackingMode,\r\n                TrackingPath = TrackingPath\r\n            };\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents system emulator.\r\n    /// </summary>\r\n    public class Emulator : DatabaseObject\r\n    {\r\n        private string builtInConfigId;\r\n        /// <summary>\r\n        /// Gets id of built-in emulator profile.\r\n        /// </summary>\r\n        public string BuiltInConfigId\r\n        {\r\n            get => builtInConfigId;\r\n            set\r\n            {\r\n                builtInConfigId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string installDir;\r\n        /// <summary>\r\n        /// Gets emulator installation directory.\r\n        /// </summary>\r\n        public string InstallDir\r\n        {\r\n            get => installDir;\r\n            set\r\n            {\r\n                installDir = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<BuiltInEmulatorProfile> builtinProfiles;\r\n        /// <summary>\r\n        /// Gets or sets list of emulator profiles.\r\n        /// </summary>\r\n        public ObservableCollection<BuiltInEmulatorProfile> BuiltinProfiles\r\n        {\r\n            get => builtinProfiles;\r\n            set\r\n            {\r\n                if (builtinProfiles != null)\r\n                {\r\n                    builtinProfiles.CollectionChanged -= Profiles_CollectionChanged;\r\n                }\r\n\r\n                builtinProfiles = value;\r\n                if (builtinProfiles != null)\r\n                {\r\n                    builtinProfiles.CollectionChanged += Profiles_CollectionChanged;\r\n                }\r\n\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(AllProfiles));\r\n                OnPropertyChanged(nameof(SelectableProfiles));\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<CustomEmulatorProfile> customProfiles;\r\n        /// <summary>\r\n        /// Gets or sets list of emulator profiles.\r\n        /// </summary>\r\n        public ObservableCollection<CustomEmulatorProfile> CustomProfiles\r\n        {\r\n            get => customProfiles;\r\n            set\r\n            {\r\n                if (customProfiles != null)\r\n                {\r\n                    customProfiles.CollectionChanged -= Profiles_CollectionChanged;\r\n                }\r\n\r\n                customProfiles = value;\r\n                if (customProfiles != null)\r\n                {\r\n                    customProfiles.CollectionChanged += Profiles_CollectionChanged;\r\n                }\r\n\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(AllProfiles));\r\n                OnPropertyChanged(nameof(SelectableProfiles));\r\n            }\r\n        }\r\n\r\n        private void Profiles_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)\r\n        {\r\n            OnPropertyChanged(nameof(AllProfiles));\r\n            OnPropertyChanged(nameof(SelectableProfiles));\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets list of all profiles including option for profile auto-select.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<EmulatorProfile> SelectableProfiles\r\n        {\r\n            get\r\n            {\r\n                var selProfiles = new List<EmulatorProfile>();\r\n                if (BuiltinProfiles.HasItems())\r\n                {\r\n                    selProfiles.AddRange(BuiltinProfiles.OrderBy(a => a.Name));\r\n                }\r\n\r\n                if (CustomProfiles.HasItems())\r\n                {\r\n                    selProfiles.AddRange(CustomProfiles.OrderBy(a => a.Name));\r\n                }\r\n\r\n                selProfiles.Insert(0, new CustomEmulatorProfile { Id = null, Name = ResourceProvider.GetString(\"LOCGameActionSelectOnStart\") });\r\n                return selProfiles;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets list of all profiles.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<EmulatorProfile> AllProfiles\r\n        {\r\n            get\r\n            {\r\n                var selProfiles = new List<EmulatorProfile>();\r\n                if (BuiltinProfiles.HasItems())\r\n                {\r\n                    selProfiles.AddRange(BuiltinProfiles.OrderBy(a => a.Name));\r\n                }\r\n\r\n                if (CustomProfiles.HasItems())\r\n                {\r\n                    selProfiles.AddRange(CustomProfiles.OrderBy(a => a.Name));\r\n                }\r\n\r\n                return selProfiles;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Emulator.\r\n        /// </summary>\r\n        public Emulator() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Emulator with specific name.\r\n        /// </summary>\r\n        /// <param name=\"name\">Emulator name.</param>\r\n        public Emulator(string name) : this()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets profile by id.\r\n        /// </summary>\r\n        /// <param name=\"profileId\"></param>\r\n        /// <returns></returns>\r\n        public EmulatorProfile GetProfile(string profileId)\r\n        {\r\n            var cus = CustomProfiles?.FirstOrDefault(a => a.Id == profileId);\r\n            if (cus != null)\r\n            {\r\n                return cus;\r\n            }\r\n\r\n            return BuiltinProfiles?.FirstOrDefault(a => a.Id == profileId);\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override void CopyDiffTo(object target)\r\n        {\r\n            base.CopyDiffTo(target);\r\n\r\n            if (target is Emulator tro)\r\n            {\r\n                if (!CustomProfiles.IsListEqualExact(tro.CustomProfiles))\r\n                {\r\n                    tro.CustomProfiles = CustomProfiles;\r\n                }\r\n\r\n                if (!BuiltinProfiles.IsListEqualExact(tro.BuiltinProfiles))\r\n                {\r\n                    tro.BuiltinProfiles = BuiltinProfiles;\r\n                }\r\n\r\n                if (!string.Equals(BuiltInConfigId, tro.BuiltInConfigId, StringComparison.Ordinal))\r\n                {\r\n                    tro.BuiltInConfigId = BuiltInConfigId;\r\n                }\r\n\r\n                if (!string.Equals(InstallDir, tro.InstallDir, StringComparison.Ordinal))\r\n                {\r\n                    tro.InstallDir = InstallDir;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new ArgumentException($\"Target object has to be of type {GetType().Name}\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public Emulator GetCopy()\r\n        {\r\n            return new Emulator\r\n            {\r\n                Id = Id,\r\n                Name = Name,\r\n                CustomProfiles = CustomProfiles?.Select(a => a.GetCopy()).ToObservable(),\r\n                BuiltinProfiles = BuiltinProfiles?.Select(a => a.GetCopy()).ToObservable(),\r\n                BuiltInConfigId = BuiltInConfigId,\r\n                InstallDir = InstallDir\r\n            };\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/FilterPreset.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\r\n    public enum SortOrder : int\r\n    {\r\n        [Description(\"LOCGameNameTitle\")] Name = 0,\r\n        [Description(\"LOCPlatformTitle\")] Platforms = 1,\r\n        [Description(\"LOCGameProviderTitle\")] Library = 2,\r\n        [Description(\"LOCCategoryLabel\")] Categories = 3,\r\n        [Description(\"LOCGameLastActivityTitle\")] LastActivity = 4,\r\n        [Description(\"LOCGenreLabel\")] Genres = 5,\r\n        [Description(\"LOCGameReleaseDateTitle\")] ReleaseDate = 6,\r\n        [Description(\"LOCDeveloperLabel\")] Developers = 7,\r\n        [Description(\"LOCPublisherLabel\")] Publishers = 8,\r\n        [Description(\"LOCTagLabel\")] Tags = 9,\r\n        [Description(\"LOCSeriesLabel\")] Series = 10,\r\n        [Description(\"LOCAgeRatingLabel\")] AgeRatings = 11,\r\n        [Description(\"LOCVersionLabel\")] Version = 12,\r\n        [Description(\"LOCRegionLabel\")] Regions = 13,\r\n        [Description(\"LOCSourceLabel\")] Source = 14,\r\n        [Description(\"LOCPlayCountLabel\")] PlayCount = 15,\r\n        [Description(\"LOCTimePlayed\")] Playtime = 16,\r\n        [Description(\"LOCCompletionStatus\")] CompletionStatus = 17,\r\n        [Description(\"LOCUserScore\")] UserScore = 18,\r\n        [Description(\"LOCCriticScore\")] CriticScore = 19,\r\n        [Description(\"LOCCommunityScore\")] CommunityScore = 20,\r\n        [Description(\"LOCDateAddedLabel\")] Added = 21,\r\n        [Description(\"LOCDateModifiedLabel\")] Modified = 22,\r\n        [Description(\"LOCGameInstallationStatus\")] IsInstalled = 23,\r\n        [Description(\"LOCGameHiddenTitle\")] Hidden = 24,\r\n        [Description(\"LOCGameFavoriteTitle\")] Favorite = 25,\r\n        [Description(\"LOCGameInstallDirTitle\")] InstallDirectory = 26,\r\n        [Description(\"LOCFeatureLabel\")] Features = 27,\r\n        [Description(\"LOCInstallSizeLabel\")] InstallSize = 28,\r\n        [Description(\"LOCRecentActivityLabel\")] RecentActivity = 29,\r\n        [Description(\"LOCGameROMTitle\")] RomList = 30,\r\n    }\r\n\r\n    public enum SortOrderDirection : int\r\n    {\r\n        [Description(\"LOCMenuSortAscending\")] Ascending = 0,\r\n        [Description(\"LOCMenuSortDescending\")] Descending = 1\r\n    }\r\n\r\n    public enum GroupableField : int\r\n    {\r\n        [Description(\"LOCMenuGroupDont\")] None = 0,\r\n        [Description(\"LOCPlatformTitle\")] Platform = 1,\r\n        [Description(\"LOCGameProviderTitle\")] Library = 2,\r\n        [Description(\"LOCCategoryLabel\")] Category = 3,\r\n        [Description(\"LOCGameLastActivityTitle\")] LastActivity = 4,\r\n        [Description(\"LOCGenreLabel\")] Genre = 5,\r\n        [Description(\"LOCGameReleaseYearTitle\")] ReleaseYear = 6,\r\n        [Description(\"LOCDeveloperLabel\")] Developer = 7,\r\n        [Description(\"LOCPublisherLabel\")] Publisher = 8,\r\n        [Description(\"LOCTagLabel\")] Tag = 9,\r\n        [Description(\"LOCSeriesLabel\")] Series = 10,\r\n        [Description(\"LOCAgeRatingLabel\")] AgeRating = 11,\r\n        [Description(\"LOCRegionLabel\")] Region = 12,\r\n        [Description(\"LOCSourceLabel\")] Source = 13,\r\n        [Description(\"LOCTimePlayed\")] PlayTime = 14,\r\n        [Description(\"LOCCompletionStatus\")] CompletionStatus = 15,\r\n        [Description(\"LOCUserScore\")] UserScore = 16,\r\n        [Description(\"LOCCriticScore\")] CriticScore = 17,\r\n        [Description(\"LOCCommunityScore\")] CommunityScore = 18,\r\n        [Description(\"LOCDateAddedLabel\")] Added = 19,\r\n        [Description(\"LOCDateModifiedLabel\")] Modified = 20,\r\n        [Description(\"LOCFeatureLabel\")] Feature = 21,\r\n        [Description(\"LOCGameInstallationStatus\")] InstallationStatus = 22,\r\n        [Description(\"LOCGameNameTitle\")] Name = 23,\r\n        [Description(\"LOCInstallDriveTitle\")] InstallDrive = 24,\r\n        [Description(\"LOCInstallSizeLabel\")] InstallSize = 25,\r\n        [Description(\"LOCRecentActivityLabel\")] RecentActivity = 26\r\n    }\r\n\r\n    public class FilterPresetSettings\r\n    {\r\n        public bool UseAndFilteringStyle { get; set; }\r\n        public bool IsInstalled { get; set; }\r\n        public bool IsUnInstalled { get; set; }\r\n        public bool Hidden { get; set; }\r\n        public bool Favorite { get; set; }\r\n        public string Name { get; set; }\r\n        public string Version { get; set; }\r\n        public StringFilterItemProperties ReleaseYear { get; set; }\r\n        public IdItemFilterItemProperties Genre { get; set; }\r\n        public IdItemFilterItemProperties Platform { get; set; }\r\n        public IdItemFilterItemProperties Publisher { get; set; }\r\n        public IdItemFilterItemProperties Developer { get; set; }\r\n        public IdItemFilterItemProperties Category { get; set; }\r\n        public IdItemFilterItemProperties Tag { get; set; }\r\n        public IdItemFilterItemProperties Series { get; set; }\r\n        public IdItemFilterItemProperties Region { get; set; }\r\n        public IdItemFilterItemProperties Source { get; set; }\r\n        public IdItemFilterItemProperties AgeRating { get; set; }\r\n        public IdItemFilterItemProperties Library { get; set; }\r\n        public IdItemFilterItemProperties CompletionStatuses { get; set; }\r\n        public IdItemFilterItemProperties Feature { get; set; }\r\n        public EnumFilterItemProperties UserScore { get; set; }\r\n        public EnumFilterItemProperties CriticScore { get; set; }\r\n        public EnumFilterItemProperties CommunityScore { get; set; }\r\n        public EnumFilterItemProperties LastActivity { get; set; }\r\n        public EnumFilterItemProperties RecentActivity { get; set; }\r\n        public EnumFilterItemProperties Added { get; set; }\r\n        public EnumFilterItemProperties Modified { get; set; }\r\n        public EnumFilterItemProperties PlayTime { get; set; }\r\n        public EnumFilterItemProperties InstallSize { get; set; }\r\n    }\r\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\r\n\r\n    /// <summary>\r\n    /// Represents filter for ID based fields.\r\n    /// </summary>\r\n    public class IdItemFilterItemProperties\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets list of item IDs to filter.\r\n        /// </summary>\r\n        public List<Guid> Ids { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets full text search to filter.\r\n        /// </summary>\r\n        public string Text { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"IdItemFilterItemProperties\"/>.\r\n        /// </summary>\r\n        public IdItemFilterItemProperties()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"IdItemFilterItemProperties\"/>.\r\n        /// </summary>\r\n        /// <param name=\"ids\"></param>\r\n        public IdItemFilterItemProperties(List<Guid> ids)\r\n        {\r\n            Ids = ids;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"IdItemFilterItemProperties\"/>.\r\n        /// </summary>\r\n        /// <param name=\"id\"></param>\r\n        public IdItemFilterItemProperties(Guid id)\r\n        {\r\n            Ids = new List<Guid>() { id };\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"IdItemFilterItemProperties\"/>.\r\n        /// </summary>\r\n        /// <param name=\"text\"></param>\r\n        public IdItemFilterItemProperties(string text)\r\n        {\r\n            Text = text;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents filter for string based fields.\r\n    /// </summary>\r\n    public class StringFilterItemProperties\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets values to filter.\r\n        /// </summary>\r\n        public List<string> Values { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"StringFilterItemProperties\"/>.\r\n        /// </summary>\r\n        public StringFilterItemProperties()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"StringFilterItemProperties\"/>.\r\n        /// </summary>\r\n        /// <param name=\"values\"></param>\r\n        public StringFilterItemProperties(List<string> values)\r\n        {\r\n            Values = values;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"StringFilterItemProperties\"/>.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        public StringFilterItemProperties(string value)\r\n        {\r\n            Values = new List<string>() { value };\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents filter for enum based fields.\r\n    /// </summary>\r\n    public class EnumFilterItemProperties\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets values to filter.\r\n        /// </summary>\r\n        public List<int> Values { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"EnumFilterItemProperties\"/>.\r\n        /// </summary>\r\n        public EnumFilterItemProperties()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"EnumFilterItemProperties\"/>.\r\n        /// </summary>\r\n        /// <param name=\"values\"></param>\r\n        public EnumFilterItemProperties(List<int> values)\r\n        {\r\n            Values = values;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"EnumFilterItemProperties\"/>.\r\n        /// </summary>\r\n        /// <param name=\"value\"></param>\r\n        public EnumFilterItemProperties(int value)\r\n        {\r\n            Values = new List<int>() { value };\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents filter preset.\r\n    /// </summary>\r\n    public class FilterPreset : DatabaseObject\r\n    {\r\n        private FilterPresetSettings settings;\r\n        /// <summary>\r\n        /// Gets or sets filter settings.\r\n        /// </summary>\r\n        public FilterPresetSettings Settings\r\n        {\r\n            get => settings;\r\n            set\r\n            {\r\n                settings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SortOrder? sortingOrder;\r\n        /// <summary>\r\n        /// Gets or sets view sorting order.\r\n        /// </summary>\r\n        public SortOrder? SortingOrder\r\n        {\r\n            get\r\n            {\r\n                return sortingOrder;\r\n            }\r\n\r\n            set\r\n            {\r\n                sortingOrder = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private SortOrderDirection? sortingOrderDirection;\r\n        /// <summary>\r\n        /// Gets or sets view sorting order direction.\r\n        /// </summary>\r\n        public SortOrderDirection? SortingOrderDirection\r\n        {\r\n            get\r\n            {\r\n                return sortingOrderDirection;\r\n            }\r\n\r\n            set\r\n            {\r\n                sortingOrderDirection = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private GroupableField? groupingOrder;\r\n        /// <summary>\r\n        /// Gets or sets view grouping.\r\n        /// </summary>\r\n        public GroupableField? GroupingOrder\r\n        {\r\n            get\r\n            {\r\n                return groupingOrder;\r\n            }\r\n\r\n            set\r\n            {\r\n                groupingOrder = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool showInFullscreeQuickSelection = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether a filter preset should be shown in FS mode quick filter list.\r\n        /// </summary>\r\n        public bool ShowInFullscreeQuickSelection\r\n        {\r\n            get => showInFullscreeQuickSelection;\r\n            set\r\n            {\r\n                showInFullscreeQuickSelection = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override void CopyDiffTo(object target)\r\n        {\r\n            base.CopyDiffTo(target);\r\n            if (target is FilterPreset tro)\r\n            {\r\n                if (!Data.Serialization.AreObjectsEqual(Settings, tro.Settings))\r\n                {\r\n                    tro.Settings = Settings;\r\n                }\r\n\r\n                if (SortingOrder != tro.SortingOrder)\r\n                {\r\n                    tro.SortingOrder = SortingOrder;\r\n                }\r\n\r\n                if (SortingOrderDirection != tro.SortingOrderDirection)\r\n                {\r\n                    tro.SortingOrderDirection = SortingOrderDirection;\r\n                }\r\n\r\n                if (GroupingOrder != tro.GroupingOrder)\r\n                {\r\n                    tro.GroupingOrder = GroupingOrder;\r\n                }\r\n\r\n                if (ShowInFullscreeQuickSelection != tro.ShowInFullscreeQuickSelection)\r\n                {\r\n                    tro.ShowInFullscreeQuickSelection = ShowInFullscreeQuickSelection;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new ArgumentException($\"Target object has to be of type {GetType().Name}\");\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/Game.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Collections.Concurrent;\r\nusing Playnite.SDK.Data;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Specifies <see cref=\"Game\"/> fields.\r\n    /// </summary>\r\n    public enum GameField : int\r\n    {\r\n        ///\r\n        BackgroundImage = 0,\r\n        ///\r\n        Description = 1,\r\n        ///\r\n        GenreIds = 2,\r\n        ///\r\n        Hidden = 3,\r\n        ///\r\n        Favorite = 4,\r\n        ///\r\n        Icon = 5,\r\n        ///\r\n        CoverImage = 6,\r\n        ///\r\n        InstallDirectory = 7,\r\n        ///\r\n        LastActivity = 9,\r\n        ///\r\n        SortingName = 10,\r\n        ///\r\n        Gameid = 11,\r\n        ///\r\n        PluginId = 12,\r\n        ///\r\n        PublisherIds = 16,\r\n        ///\r\n        DeveloperIds = 17,\r\n        ///\r\n        ReleaseDate = 18,\r\n        ///\r\n        CategoryIds = 19,\r\n        ///\r\n        TagIds = 20,\r\n        ///\r\n        Links = 21,\r\n        ///\r\n        IsInstalling = 22,\r\n        ///\r\n        IsUninstalling = 23,\r\n        ///\r\n        IsLaunching = 24,\r\n        ///\r\n        IsRunning = 25,\r\n        ///\r\n        IsInstalled = 26,\r\n        ///\r\n        IsCustomGame = 27,\r\n        ///\r\n        Playtime = 28,\r\n        ///\r\n        Added = 29,\r\n        ///\r\n        Modified = 30,\r\n        ///\r\n        PlayCount = 31,\r\n        ///\r\n        Version = 33,\r\n        ///\r\n        SourceId = 36,\r\n        ///\r\n        CompletionStatus = 37,\r\n        ///\r\n        UserScore = 38,\r\n        ///\r\n        CriticScore = 39,\r\n        ///\r\n        CommunityScore = 40,\r\n        ///\r\n        Genres = 41,\r\n        ///\r\n        Developers = 42,\r\n        ///\r\n        Publishers = 43,\r\n        ///\r\n        Tags = 44,\r\n        ///\r\n        Categories = 45,\r\n        ///\r\n        Source = 50,\r\n        ///\r\n        ReleaseYear = 51,\r\n        ///\r\n        PreScript = 53,\r\n        ///\r\n        PostScript = 54,\r\n        ///\r\n        Name = 55,\r\n        ///\r\n        Features = 56,\r\n        ///\r\n        FeatureIds = 57,\r\n        ///\r\n        UseGlobalPostScript = 58,\r\n        ///\r\n        UseGlobalPreScript = 59,\r\n        ///\r\n        UserScoreRating = 60,\r\n        ///\r\n        CommunityScoreRating = 61,\r\n        ///\r\n        CriticScoreRating = 62,\r\n        ///\r\n        UserScoreGroup = 63,\r\n        ///\r\n        CommunityScoreGroup = 64,\r\n        ///\r\n        CriticScoreGroup = 65,\r\n        ///\r\n        LastActivitySegment = 66,\r\n        ///\r\n        AddedSegment = 67,\r\n        ///\r\n        ModifiedSegment = 68,\r\n        ///\r\n        PlaytimeCategory = 69,\r\n        ///\r\n        InstallationStatus = 70,\r\n        ///\r\n        None = 71,\r\n        ///\r\n        GameStartedScript = 72,\r\n        ///\r\n        UseGlobalGameStartedScript = 73,\r\n        ///\r\n        Notes = 74,\r\n        ///\r\n        Manual = 75,\r\n        ///\r\n        GameActions = 76,\r\n        ///\r\n        IncludeLibraryPluginAction = 77,\r\n        ///\r\n        Roms = 78,\r\n        ///\r\n        AgeRatingIds = 79,\r\n        ///\r\n        AgeRatings = 80,\r\n        ///\r\n        SeriesIds = 81,\r\n        ///\r\n        Series = 82,\r\n        ///\r\n        RegionIds = 83,\r\n        ///\r\n        Regions = 84,\r\n        ///\r\n        PlatformIds = 85,\r\n        ///\r\n        Platforms = 86,\r\n        ///\r\n        CompletionStatusId = 87,\r\n        ///\r\n        OverrideInstallState = 88,\r\n        ///\r\n        InstallSize = 89,\r\n        ///\r\n        LastSizeScanDate = 90,\r\n        ///\r\n        RecentActivity = 91,\r\n        ///\r\n        EnableSystemHdr = 92\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents Playnite game object.\r\n    /// </summary>\r\n    public class Game : DatabaseObject\r\n    {\r\n        private string backgroundImage;\r\n        /// <summary>\r\n        /// Gets or sets background image. Local file path, HTTP URL or database file ids are supported.\r\n        /// </summary>\r\n        public string BackgroundImage\r\n        {\r\n            get\r\n            {\r\n                return backgroundImage;\r\n            }\r\n\r\n            set\r\n            {\r\n                backgroundImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string description;\r\n        /// <summary>\r\n        /// Gets or sets HTML game description.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string Description\r\n        {\r\n            get\r\n            {\r\n                return description;\r\n            }\r\n\r\n            set\r\n            {\r\n                description = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string notes;\r\n        /// <summary>\r\n        /// Gets or sets user notes.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string Notes\r\n        {\r\n            get\r\n            {\r\n                return notes;\r\n            }\r\n\r\n            set\r\n            {\r\n                notes = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> genreIds;\r\n        /// <summary>\r\n        /// Gets or sets list of genres.\r\n        /// </summary>\r\n        public List<Guid> GenreIds\r\n        {\r\n            get\r\n            {\r\n                return genreIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                genreIds = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Genres));\r\n            }\r\n        }\r\n\r\n        private bool enableSystemHdr;\r\n        /// <summary>\r\n        /// Gets or sets value indicating if the game is should enable HDR on the primary monitor while playing.\r\n        /// </summary>\r\n        public bool EnableSystemHdr\r\n        {\r\n            get\r\n            {\r\n                return enableSystemHdr;\r\n            }\r\n\r\n            set\r\n            {\r\n                enableSystemHdr = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool hidden;\r\n        /// <summary>\r\n        /// Gets or sets value indicating if the game is hidden in library.\r\n        /// </summary>\r\n        public bool Hidden\r\n        {\r\n            get\r\n            {\r\n                return hidden;\r\n            }\r\n\r\n            set\r\n            {\r\n                hidden = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool favorite;\r\n        /// <summary>\r\n        /// Gets or sets value indicating if the game is marked as favorite in library.\r\n        /// </summary>\r\n        public bool Favorite\r\n        {\r\n            get\r\n            {\r\n                return favorite;\r\n            }\r\n\r\n            set\r\n            {\r\n                favorite = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string icon;\r\n        /// <summary>\r\n        /// Gets or sets game icon. Local file path, HTTP URL or database file ids are supported.\r\n        /// </summary>\r\n        public string Icon\r\n        {\r\n            get\r\n            {\r\n                return icon;\r\n            }\r\n\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string coverImage;\r\n        /// <summary>\r\n        /// Gets or sets game cover image. Local file path, HTTP URL or database file ids are supported.\r\n        /// </summary>\r\n        public string CoverImage\r\n        {\r\n            get\r\n            {\r\n                return coverImage;\r\n            }\r\n\r\n            set\r\n            {\r\n                coverImage = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string installDirectory;\r\n        /// <summary>\r\n        /// Gets or sets game installation directory path.\r\n        /// </summary>\r\n        public string InstallDirectory\r\n        {\r\n            get\r\n            {\r\n                return installDirectory;\r\n            }\r\n\r\n            set\r\n            {\r\n                installDirectory = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateTime? lastActivity;\r\n        /// <summary>\r\n        /// Gets or sets last played date.\r\n        /// </summary>\r\n        public DateTime? LastActivity\r\n        {\r\n            get\r\n            {\r\n                return lastActivity;\r\n            }\r\n\r\n            set\r\n            {\r\n                lastActivity = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(LastActivitySegment));\r\n                OnPropertyChanged(nameof(RecentActivity));\r\n            }\r\n        }\r\n\r\n        private string sortingName;\r\n        /// <summary>\r\n        /// Gets or sets optional name used for sorting the game by name.\r\n        /// </summary>\r\n        public string SortingName\r\n        {\r\n            get\r\n            {\r\n                return sortingName;\r\n            }\r\n\r\n            set\r\n            {\r\n                sortingName = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string gameId;\r\n        /// <summary>\r\n        /// Gets or sets provider id. For example game's Steam ID.\r\n        /// </summary>\r\n        public string GameId\r\n        {\r\n            get\r\n            {\r\n                return gameId;\r\n            }\r\n\r\n            set\r\n            {\r\n                gameId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid pluginId = Guid.Empty;\r\n        /// <summary>\r\n        /// Gets or sets id of plugin responsible for handling this game.\r\n        /// </summary>\r\n        public Guid PluginId\r\n        {\r\n            get\r\n            {\r\n                return pluginId;\r\n            }\r\n\r\n            set\r\n            {\r\n                pluginId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool includeLibraryPluginAction = true;\r\n        /// <summary>\r\n        /// Gets or sets id of plugin responsible for handling this game.\r\n        /// </summary>\r\n        public bool IncludeLibraryPluginAction\r\n        {\r\n            get\r\n            {\r\n                return includeLibraryPluginAction;\r\n            }\r\n\r\n            set\r\n            {\r\n                includeLibraryPluginAction = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<GameAction> gameActions;\r\n        /// <summary>\r\n        /// Gets or sets list of additional game actions.\r\n        /// </summary>\r\n        public ObservableCollection<GameAction> GameActions\r\n        {\r\n            get\r\n            {\r\n                return gameActions;\r\n            }\r\n\r\n            set\r\n            {\r\n                gameActions = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> platformIds;\r\n        /// <summary>\r\n        /// Gets or sets platform id.\r\n        /// </summary>\r\n        public List<Guid> PlatformIds\r\n        {\r\n            get\r\n            {\r\n                return platformIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                platformIds = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Platforms));\r\n            }\r\n        }\r\n\r\n        private List<Guid> publisherIds;\r\n        /// <summary>\r\n        /// Gets or sets list of publishers.\r\n        /// </summary>\r\n        public List<Guid> PublisherIds\r\n        {\r\n            get\r\n            {\r\n                return publisherIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                publisherIds = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Publishers));\r\n            }\r\n        }\r\n\r\n        private List<Guid> developerIds;\r\n        /// <summary>\r\n        /// Gets or sets list of developers.\r\n        /// </summary>\r\n        public List<Guid> DeveloperIds\r\n        {\r\n            get\r\n            {\r\n                return developerIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                developerIds = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Developers));\r\n            }\r\n        }\r\n\r\n        private ReleaseDate? releaseDate;\r\n        /// <summary>\r\n        /// Gets or set game's release date.\r\n        /// </summary>\r\n        public ReleaseDate? ReleaseDate\r\n        {\r\n            get\r\n            {\r\n                return releaseDate;\r\n            }\r\n\r\n            set\r\n            {\r\n                releaseDate = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ReleaseYear));\r\n            }\r\n        }\r\n\r\n        private List<Guid> categoryIds;\r\n        /// <summary>\r\n        /// Gets or sets game categories.\r\n        /// </summary>\r\n        public List<Guid> CategoryIds\r\n        {\r\n            get\r\n            {\r\n                return categoryIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                categoryIds = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Categories));\r\n            }\r\n        }\r\n\r\n        private List<Guid> tagIds;\r\n        /// <summary>\r\n        /// Gets or sets list of tags.\r\n        /// </summary>\r\n        public List<Guid> TagIds\r\n        {\r\n            get\r\n            {\r\n                return tagIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                tagIds = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Tags));\r\n            }\r\n        }\r\n\r\n        private List<Guid> featureIds;\r\n        /// <summary>\r\n        /// Gets or sets list of game features.\r\n        /// </summary>\r\n        public List<Guid> FeatureIds\r\n        {\r\n            get\r\n            {\r\n                return featureIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                featureIds = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Features));\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<Link> links;\r\n        /// <summary>\r\n        /// Gets or sets list of game related web links.\r\n        /// </summary>\r\n        public ObservableCollection<Link> Links\r\n        {\r\n            get\r\n            {\r\n                return links;\r\n            }\r\n\r\n            set\r\n            {\r\n                links = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ObservableCollection<GameRom> roms;\r\n        /// <summary>\r\n        /// Gets or sets list of game ROM files.\r\n        /// </summary>\r\n        public ObservableCollection<GameRom> Roms\r\n        {\r\n            get\r\n            {\r\n                return roms;\r\n            }\r\n\r\n            set\r\n            {\r\n                roms = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isInstalling;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether a game is being installed.\r\n        /// </summary>\r\n        public bool IsInstalling\r\n        {\r\n            get => isInstalling;\r\n            set\r\n            {\r\n                isInstalling = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isUninstalling;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether a game is being uninstalled.\r\n        /// </summary>\r\n        public bool IsUninstalling\r\n        {\r\n            get => isUninstalling;\r\n            set\r\n            {\r\n                isUninstalling = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isLaunching;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether a game is being launched.\r\n        /// </summary>\r\n        public bool IsLaunching\r\n        {\r\n            get => isLaunching;\r\n            set\r\n            {\r\n                isLaunching = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isRunning;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether a game is currently running.\r\n        /// </summary>\r\n        public bool IsRunning\r\n        {\r\n            get => isRunning;\r\n            set\r\n            {\r\n                isRunning = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isInstalled;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether a game is installed.\r\n        /// </summary>\r\n        public bool IsInstalled\r\n        {\r\n            get => isInstalled;\r\n            set\r\n            {\r\n                isInstalled = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(InstallationStatus));\r\n            }\r\n        }\r\n\r\n        private bool overrideInstallState;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether installation state set by integration plugin should be ignored.\r\n        /// </summary>\r\n        public bool OverrideInstallState\r\n        {\r\n            get => overrideInstallState;\r\n            set\r\n            {\r\n                overrideInstallState = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ulong playtime = 0;\r\n        /// <summary>\r\n        /// Gets or sets played time in seconds.\r\n        /// </summary>\r\n        public ulong Playtime\r\n        {\r\n            get\r\n            {\r\n                return playtime;\r\n            }\r\n\r\n            set\r\n            {\r\n                playtime = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(PlaytimeCategory));\r\n            }\r\n        }\r\n\r\n        private DateTime? added;\r\n        /// <summary>\r\n        /// Gets or sets date when game was added to library.\r\n        /// </summary>\r\n        public DateTime? Added\r\n        {\r\n            get\r\n            {\r\n                return added;\r\n            }\r\n\r\n            set\r\n            {\r\n                added = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(AddedSegment));\r\n                OnPropertyChanged(nameof(RecentActivity));\r\n            }\r\n        }\r\n\r\n        private DateTime? modified;\r\n        /// <summary>\r\n        /// Gets or sets date of last modification made to a game.\r\n        /// </summary>\r\n        public DateTime? Modified\r\n        {\r\n            get\r\n            {\r\n                return modified;\r\n            }\r\n\r\n            set\r\n            {\r\n                modified = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(ModifiedSegment));\r\n            }\r\n        }\r\n\r\n        private ulong playCount = 0;\r\n        /// <summary>\r\n        /// Gets or sets a number indicating how many times the game has been played.\r\n        /// </summary>\r\n        public ulong PlayCount\r\n        {\r\n            get\r\n            {\r\n                return playCount;\r\n            }\r\n\r\n            set\r\n            {\r\n                playCount = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ulong? installSize = null;\r\n        /// <summary>\r\n        /// Gets or sets the install size in bytes of the game.\r\n        /// </summary>\r\n        public ulong? InstallSize\r\n        {\r\n            get\r\n            {\r\n                return installSize;\r\n            }\r\n\r\n            set\r\n            {\r\n                installSize = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private DateTime? lastSizeScanDate;\r\n        /// <summary>\r\n        /// Gets or sets date of last date of install size scan made to a game.\r\n        /// </summary>\r\n        public DateTime? LastSizeScanDate\r\n        {\r\n            get\r\n            {\r\n                return lastSizeScanDate;\r\n            }\r\n\r\n            set\r\n            {\r\n                lastSizeScanDate = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> seriesIds;\r\n        /// <summary>\r\n        /// Gets or sets game series.\r\n        /// </summary>\r\n        public List<Guid> SeriesIds\r\n        {\r\n            get\r\n            {\r\n                return seriesIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                seriesIds = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Series));\r\n            }\r\n        }\r\n\r\n        private string version;\r\n        /// <summary>\r\n        /// Gets or sets game version.\r\n        /// </summary>\r\n        public string Version\r\n        {\r\n            get\r\n            {\r\n                return version;\r\n            }\r\n\r\n            set\r\n            {\r\n                version = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<Guid> ageRatingIds;\r\n        /// <summary>\r\n        /// Gets or sets age rating for a game.\r\n        /// </summary>\r\n        public List<Guid> AgeRatingIds\r\n        {\r\n            get\r\n            {\r\n                return ageRatingIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                ageRatingIds = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(AgeRatings));\r\n            }\r\n        }\r\n\r\n        private List<Guid> regionIds;\r\n        /// <summary>\r\n        /// Gets or sets game region.\r\n        /// </summary>\r\n        public List<Guid> RegionIds\r\n        {\r\n            get\r\n            {\r\n                return regionIds;\r\n            }\r\n\r\n            set\r\n            {\r\n                regionIds = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Regions));\r\n            }\r\n        }\r\n\r\n        private Guid sourceId;\r\n        /// <summary>\r\n        /// Gets or sets source of the game.\r\n        /// </summary>\r\n        public Guid SourceId\r\n        {\r\n            get\r\n            {\r\n                return sourceId;\r\n            }\r\n\r\n            set\r\n            {\r\n                sourceId = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(Source));\r\n            }\r\n        }\r\n\r\n        private Guid completionStatusId;\r\n        /// <summary>\r\n        /// Gets or sets game completion status.\r\n        /// </summary>\r\n        public Guid CompletionStatusId\r\n        {\r\n            get\r\n            {\r\n                return completionStatusId;\r\n            }\r\n\r\n            set\r\n            {\r\n                completionStatusId = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(CompletionStatus));\r\n            }\r\n        }\r\n\r\n        private int? userScore = null;\r\n        /// <summary>\r\n        /// Gets or sets user's rating score.\r\n        /// </summary>\r\n        public int? UserScore\r\n        {\r\n            get\r\n            {\r\n                return userScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                userScore = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(UserScoreGroup));\r\n                OnPropertyChanged(nameof(UserScoreRating));\r\n            }\r\n        }\r\n\r\n        private int? criticScore = null;\r\n        /// <summary>\r\n        /// Gets or sets critic based rating score.\r\n        /// </summary>\r\n        public int? CriticScore\r\n        {\r\n            get\r\n            {\r\n                return criticScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                criticScore = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(CriticScoreGroup));\r\n                OnPropertyChanged(nameof(CriticScoreRating));\r\n            }\r\n        }\r\n\r\n        private int? communityScore = null;\r\n        /// <summary>\r\n        /// Gets or sets community rating score.\r\n        /// </summary>\r\n        public int? CommunityScore\r\n        {\r\n            get\r\n            {\r\n                return communityScore;\r\n            }\r\n\r\n            set\r\n            {\r\n                communityScore = value;\r\n                OnPropertyChanged();\r\n                OnPropertyChanged(nameof(CommunityScoreGroup));\r\n                OnPropertyChanged(nameof(CommunityScoreRating));\r\n            }\r\n        }\r\n\r\n        private string preScript;\r\n        /// <summary>\r\n        /// Gets or sets pre-action script.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string PreScript\r\n        {\r\n            get => preScript;\r\n            set\r\n            {\r\n                preScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string postScript;\r\n        /// <summary>\r\n        /// Gets or sets post-action script.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string PostScript\r\n        {\r\n            get => postScript;\r\n            set\r\n            {\r\n                postScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string gameStartedScript;\r\n        /// <summary>\r\n        /// Gets or sets script to be executed after game started.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string GameStartedScript\r\n        {\r\n            get => gameStartedScript;\r\n            set\r\n            {\r\n                gameStartedScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool useGlobalPostScript = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether global post script should be executed.\r\n        /// </summary>\r\n        [DefaultValue(true)]\r\n        public bool UseGlobalPostScript\r\n        {\r\n            get => useGlobalPostScript;\r\n            set\r\n            {\r\n                useGlobalPostScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool useGlobalPreScript = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether global pre script should be executed.\r\n        /// </summary>\r\n        [DefaultValue(true)]\r\n        public bool UseGlobalPreScript\r\n        {\r\n            get => useGlobalPreScript;\r\n            set\r\n            {\r\n                useGlobalPreScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool useGameStartedScript = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether global pre script should be executed.\r\n        /// </summary>\r\n        [DefaultValue(true)]\r\n        public bool UseGlobalGameStartedScript\r\n        {\r\n            get => useGameStartedScript;\r\n            set\r\n            {\r\n                useGameStartedScript = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string manual;\r\n        /// <summary>\r\n        /// Gets or sets game manual.\r\n        /// </summary>\r\n        [DefaultValue(\"\")]\r\n        public string Manual\r\n        {\r\n            get\r\n            {\r\n                return manual;\r\n            }\r\n\r\n            set\r\n            {\r\n                manual = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        #region Expanded\r\n\r\n        /// <summary>\r\n        /// Gets game's genres.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<Genre> Genres\r\n        {\r\n            get\r\n            {\r\n                if (genreIds?.Any() == true && DatabaseReference != null)\r\n                {\r\n                    return new List<Genre>(DatabaseReference?.Genres.Get(genreIds).OrderBy(a => a.Name));\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's developers.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<Company> Developers\r\n        {\r\n            get\r\n            {\r\n                if (developerIds?.Any() == true && DatabaseReference != null)\r\n                {\r\n                    return new List<Company>(DatabaseReference?.Companies.Get(developerIds).OrderBy(a => a.Name));\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's publishers.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<Company> Publishers\r\n        {\r\n            get\r\n            {\r\n                if (publisherIds?.Any() == true && DatabaseReference != null)\r\n                {\r\n                    return new List<Company>(DatabaseReference?.Companies.Get(publisherIds).OrderBy(a => a.Name));\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's tags.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<Tag> Tags\r\n        {\r\n            get\r\n            {\r\n                if (tagIds?.Any() == true && DatabaseReference != null)\r\n                {\r\n                    return new List<Tag>(DatabaseReference?.Tags.Get(tagIds).OrderBy(a => a.Name));\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's features.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<GameFeature> Features\r\n        {\r\n            get\r\n            {\r\n                if (featureIds?.Any() == true && DatabaseReference != null)\r\n                {\r\n                    return new List<GameFeature>(DatabaseReference?.Features.Get(featureIds).OrderBy(a => a.Name));\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's categories.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<Category> Categories\r\n        {\r\n            get\r\n            {\r\n                if (categoryIds?.Any() == true && DatabaseReference != null)\r\n                {\r\n                    return new List<Category>(DatabaseReference?.Categories.Get(categoryIds).OrderBy(a => a.Name));\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's platform.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<Platform> Platforms\r\n        {\r\n            get\r\n            {\r\n                if (platformIds?.Any() == true && DatabaseReference != null)\r\n                {\r\n                    return DatabaseReference?.Platforms.Get(platformIds).OrderBy(a => a.Name).ToList();\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's series.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<Series> Series\r\n        {\r\n            get\r\n            {\r\n                if (seriesIds?.Any() == true && DatabaseReference != null)\r\n                {\r\n                    return new List<Series>(DatabaseReference?.Series.Get(seriesIds).OrderBy(a => a.Name));\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's age rating.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<AgeRating> AgeRatings\r\n        {\r\n            get\r\n            {\r\n                if (ageRatingIds?.Any() == true && DatabaseReference != null)\r\n                {\r\n                    return new List<AgeRating>(DatabaseReference?.AgeRatings.Get(ageRatingIds).OrderBy(a => a.Name));\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's region.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public List<Region> Regions\r\n        {\r\n            get\r\n            {\r\n                if (regionIds?.Any() == true && DatabaseReference != null)\r\n                {\r\n                    return new List<Region>(DatabaseReference?.Regions.Get(regionIds).OrderBy(a => a.Name));\r\n                }\r\n\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's source.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public GameSource Source\r\n        {\r\n            get => DatabaseReference?.Sources[sourceId];\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's completion status.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public CompletionStatus CompletionStatus\r\n        {\r\n            get => DatabaseReference?.CompletionStatuses[completionStatusId];\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's release year.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public int? ReleaseYear\r\n        {\r\n            get => ReleaseDate?.Year;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets the most recent date between the last played and added dates.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public DateTime? RecentActivity\r\n        {\r\n            get => GetGameRecentActivity();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's user score rating.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public ScoreRating UserScoreRating\r\n        {\r\n            get => GetScoreRating(UserScore);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's community score rating.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public ScoreRating CommunityScoreRating\r\n        {\r\n            get => GetScoreRating(CommunityScore);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's critic score rating.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public ScoreRating CriticScoreRating\r\n        {\r\n            get => GetScoreRating(CriticScore);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's user score group.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public ScoreGroup UserScoreGroup\r\n        {\r\n            get => GetScoreGroup(UserScore);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's community score group.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public ScoreGroup CommunityScoreGroup\r\n        {\r\n            get => GetScoreGroup(CommunityScore);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's critic score group.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public ScoreGroup CriticScoreGroup\r\n        {\r\n            get => GetScoreGroup(CriticScore);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets time segment for games last activity.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public PastTimeSegment LastActivitySegment\r\n        {\r\n            get => GetPastTimeSegment(LastActivity);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets time segment for games recent activity.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public PastTimeSegment RecentActivitySegment\r\n        {\r\n            get => GetPastTimeSegment(RecentActivity);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets time segment for games added date.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public PastTimeSegment AddedSegment\r\n        {\r\n            get => GetPastTimeSegment(Added);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets time segment for games modified date..\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public PastTimeSegment ModifiedSegment\r\n        {\r\n            get => GetPastTimeSegment(Modified);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's play time category.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public PlaytimeCategory PlaytimeCategory\r\n        {\r\n            get => GetPlayTimeCategory(Playtime);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game's install size group.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public InstallSizeGroup InstallSizeGroup\r\n        {\r\n            get => GetInstallSizeGroup();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets value indicating whether the game is custom game.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public bool IsCustomGame\r\n        {\r\n            get => PluginId == Guid.Empty;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game installation state.\r\n        /// </summary>\r\n        [DontSerialize]\r\n        public InstallationStatus InstallationStatus\r\n        {\r\n            get => IsInstalled ? InstallationStatus.Installed : InstallationStatus.Uninstalled;\r\n        }\r\n\r\n        #endregion Expanded\r\n\r\n        /// <summary>\r\n        /// Gets the most recent date between the last played and added dates.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public DateTime? GetGameRecentActivity()\r\n        {\r\n            if (lastActivity == null)\r\n            {\r\n                return added;\r\n            }\r\n            else if (added == null || lastActivity > added)\r\n            {\r\n                return lastActivity;\r\n            }\r\n            else\r\n            {\r\n                return added;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets play time category.\r\n        /// </summary>\r\n        /// <param name=\"seconds\">Play time in seconds.</param>\r\n        /// <returns></returns>\r\n        private PlaytimeCategory GetPlayTimeCategory(ulong seconds)\r\n        {\r\n            if (seconds == 0)\r\n            {\r\n                return PlaytimeCategory.NotPlayed;\r\n            }\r\n\r\n            var hours = seconds / 3600;\r\n            if (hours < 1)\r\n            {\r\n                return PlaytimeCategory.LessThenHour;\r\n            }\r\n            else if (hours >= 1 && hours <= 10)\r\n            {\r\n                return PlaytimeCategory.O1_10;\r\n            }\r\n            else if (hours >= 10 && hours <= 100)\r\n            {\r\n                return PlaytimeCategory.O10_100;\r\n            }\r\n            else if (hours >= 100 && hours <= 500)\r\n            {\r\n                return PlaytimeCategory.O100_500;\r\n            }\r\n            else if (hours >= 500 && hours <= 1000)\r\n            {\r\n                return PlaytimeCategory.O500_1000;\r\n            }\r\n            else\r\n            {\r\n                return PlaytimeCategory.O1000plus;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets time segment.\r\n        /// </summary>\r\n        /// <param name=\"dateTime\">Date time to be measured.</param>\r\n        /// <returns></returns>\r\n        private PastTimeSegment GetPastTimeSegment(DateTime? dateTime)\r\n        {\r\n            if (dateTime == null)\r\n            {\r\n                return PastTimeSegment.Never;\r\n            }\r\n\r\n            if (dateTime.Value.Date == DateTime.Today)\r\n            {\r\n                return PastTimeSegment.Today;\r\n            }\r\n\r\n            if (dateTime.Value.Date.AddDays(1) == DateTime.Today)\r\n            {\r\n                return PastTimeSegment.Yesterday;\r\n            }\r\n\r\n            var diff = DateTime.Now - dateTime.Value;\r\n            if (diff.TotalDays < 7)\r\n            {\r\n                return PastTimeSegment.PastWeek;\r\n            }\r\n\r\n            if (diff.TotalDays < 31)\r\n            {\r\n                return PastTimeSegment.PastMonth;\r\n            }\r\n\r\n            if (diff.TotalDays < 365)\r\n            {\r\n                return PastTimeSegment.PastYear;\r\n            }\r\n\r\n            return PastTimeSegment.MoreThenYear;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets score rating.\r\n        /// </summary>\r\n        /// <param name=\"score\">Score.</param>\r\n        /// <returns></returns>\r\n        private ScoreRating GetScoreRating(int? score)\r\n        {\r\n            if (score == null)\r\n            {\r\n                return ScoreRating.None;\r\n            }\r\n            else if (score > 75)\r\n            {\r\n                return ScoreRating.Positive;\r\n            }\r\n            else if (score > 25)\r\n            {\r\n                return ScoreRating.Mixed;\r\n            }\r\n            else\r\n            {\r\n                return ScoreRating.Negative;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets score group.\r\n        /// </summary>\r\n        /// <param name=\"score\">Score.</param>\r\n        /// <returns></returns>\r\n        private ScoreGroup GetScoreGroup(int? score)\r\n        {\r\n            if (score >= 0 && score < 10)\r\n            {\r\n                return ScoreGroup.O0x;\r\n            }\r\n\r\n            if (score >= 10 && score < 20)\r\n            {\r\n                return ScoreGroup.O1x;\r\n            }\r\n\r\n            if (score >= 20 && score < 30)\r\n            {\r\n                return ScoreGroup.O2x;\r\n            }\r\n\r\n            if (score >= 30 && score < 40)\r\n            {\r\n                return ScoreGroup.O3x;\r\n            }\r\n\r\n            if (score >= 40 && score < 50)\r\n            {\r\n                return ScoreGroup.O4x;\r\n            }\r\n\r\n            if (score >= 50 && score < 60)\r\n            {\r\n                return ScoreGroup.O5x;\r\n            }\r\n\r\n            if (score >= 60 && score < 70)\r\n            {\r\n                return ScoreGroup.O6x;\r\n            }\r\n\r\n            if (score >= 70 && score < 80)\r\n            {\r\n                return ScoreGroup.O7x;\r\n            }\r\n\r\n            if (score >= 80 && score < 90)\r\n            {\r\n                return ScoreGroup.O8x;\r\n            }\r\n\r\n            if (score >= 90)\r\n            {\r\n                return ScoreGroup.O9x;\r\n            }\r\n\r\n            return ScoreGroup.None;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets or sets game database reference.\r\n        /// </summary>\r\n        internal static IGameDatabase DatabaseReference\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of a Game object.\r\n        /// </summary>\r\n        public Game() : base()\r\n        {\r\n            GameId = Guid.NewGuid().ToString();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of a Game object with specific name.\r\n        /// </summary>\r\n        /// <param name=\"name\">Game name.</param>\r\n        public Game(string name) : this()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public Game GetCopy()\r\n        {\r\n            return new Game\r\n            {\r\n                Id = Id,\r\n                GameId = GameId,\r\n                PluginId = PluginId,\r\n                Name = Name,\r\n                Icon = Icon,\r\n                CoverImage = CoverImage,\r\n                BackgroundImage = BackgroundImage,\r\n                Description = Description,\r\n                Notes = Notes,\r\n                EnableSystemHdr = EnableSystemHdr,\r\n                Hidden = Hidden,\r\n                Favorite = Favorite,\r\n                InstallDirectory = InstallDirectory,\r\n                LastActivity = LastActivity,\r\n                SortingName = SortingName,\r\n                ReleaseDate = ReleaseDate,\r\n                IsInstalled = IsInstalled,\r\n                IsInstalling = IsInstalling,\r\n                IsLaunching = IsLaunching,\r\n                IsUninstalling = IsUninstalling,\r\n                IsRunning = IsRunning,\r\n                Playtime = Playtime,\r\n                Added = Added,\r\n                Modified = Modified,\r\n                PlayCount = PlayCount,\r\n                InstallSize = InstallSize,\r\n                LastSizeScanDate = LastSizeScanDate,\r\n                Version = Version,\r\n                GenreIds = GenreIds?.ToList(),\r\n                PlatformIds = PlatformIds?.ToList(),\r\n                PublisherIds = PublisherIds?.ToList(),\r\n                DeveloperIds = DeveloperIds?.ToList(),\r\n                CategoryIds = CategoryIds?.ToList(),\r\n                TagIds = TagIds?.ToList(),\r\n                FeatureIds = FeatureIds?.ToList(),\r\n                SeriesIds = SeriesIds?.ToList(),\r\n                AgeRatingIds = AgeRatingIds?.ToList(),\r\n                RegionIds = RegionIds?.ToList(),\r\n                SourceId = SourceId,\r\n                CompletionStatusId = CompletionStatusId,\r\n                UserScore = UserScore,\r\n                CriticScore = CriticScore,\r\n                CommunityScore = CommunityScore,\r\n                PreScript = PreScript,\r\n                PostScript = PostScript,\r\n                GameStartedScript = GameStartedScript,\r\n                UseGlobalPostScript = UseGlobalPostScript,\r\n                UseGlobalPreScript = UseGlobalPreScript,\r\n                UseGlobalGameStartedScript = UseGlobalGameStartedScript,\r\n                Manual = Manual,\r\n                IncludeLibraryPluginAction = IncludeLibraryPluginAction,\r\n                OverrideInstallState = OverrideInstallState,\r\n                GameActions = GameActions?.Select(a => a.GetCopy()).ToObservable(),\r\n                Links = Links?.Select(a => a.GetCopy()).ToObservable(),\r\n                Roms = Roms?.Select(a => a.GetCopy()).ToObservable(),\r\n            };\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override void CopyDiffTo(object target)\r\n        {\r\n            base.CopyDiffTo(target);\r\n\r\n            if (target is Game tro)\r\n            {\r\n                if (!string.Equals(BackgroundImage, tro.BackgroundImage, StringComparison.Ordinal))\r\n                {\r\n                    tro.BackgroundImage = BackgroundImage;\r\n                }\r\n\r\n                if (!string.Equals(Description, tro.Description, StringComparison.Ordinal))\r\n                {\r\n                    tro.Description = Description;\r\n                }\r\n\r\n                if (!string.Equals(Notes, tro.Notes, StringComparison.Ordinal))\r\n                {\r\n                    tro.Notes = Notes;\r\n                }\r\n\r\n                if (!GenreIds.IsListEqual(tro.GenreIds))\r\n                {\r\n                    tro.GenreIds = GenreIds;\r\n                }\r\n\r\n                if (EnableSystemHdr != tro.EnableSystemHdr)\r\n                {\r\n                    tro.EnableSystemHdr = EnableSystemHdr;\r\n                }\r\n\r\n                if (Hidden != tro.Hidden)\r\n                {\r\n                    tro.Hidden = Hidden;\r\n                }\r\n\r\n                if (Favorite != tro.Favorite)\r\n                {\r\n                    tro.Favorite = Favorite;\r\n                }\r\n\r\n                if (!string.Equals(Icon, tro.Icon, StringComparison.Ordinal))\r\n                {\r\n                    tro.Icon = Icon;\r\n                }\r\n\r\n                if (!string.Equals(CoverImage, tro.CoverImage, StringComparison.Ordinal))\r\n                {\r\n                    tro.CoverImage = CoverImage;\r\n                }\r\n\r\n                if (!string.Equals(InstallDirectory, tro.InstallDirectory, StringComparison.Ordinal))\r\n                {\r\n                    tro.InstallDirectory = InstallDirectory;\r\n                }\r\n\r\n                if (LastActivity != tro.LastActivity)\r\n                {\r\n                    tro.LastActivity = LastActivity;\r\n                }\r\n\r\n                if (!string.Equals(SortingName, tro.SortingName, StringComparison.Ordinal))\r\n                {\r\n                    tro.SortingName = SortingName;\r\n                }\r\n\r\n                if (!string.Equals(GameId, tro.GameId, StringComparison.Ordinal))\r\n                {\r\n                    tro.GameId = GameId;\r\n                }\r\n\r\n                if (PluginId != tro.PluginId)\r\n                {\r\n                    tro.PluginId = PluginId;\r\n                }\r\n\r\n                if (!GameActions.IsListEqualExact(tro.GameActions))\r\n                {\r\n                    tro.GameActions = GameActions;\r\n                }\r\n\r\n                if (!PlatformIds.IsListEqual(tro.PlatformIds))\r\n                {\r\n                    tro.PlatformIds = PlatformIds;\r\n                }\r\n\r\n                if (!PublisherIds.IsListEqual(tro.PublisherIds))\r\n                {\r\n                    tro.PublisherIds = PublisherIds;\r\n                }\r\n\r\n                if (!DeveloperIds.IsListEqual(tro.DeveloperIds))\r\n                {\r\n                    tro.DeveloperIds = DeveloperIds;\r\n                }\r\n\r\n                if (ReleaseDate != tro.ReleaseDate)\r\n                {\r\n                    tro.ReleaseDate = ReleaseDate;\r\n                }\r\n\r\n                if (!CategoryIds.IsListEqual(tro.CategoryIds))\r\n                {\r\n                    tro.CategoryIds = CategoryIds;\r\n                }\r\n\r\n                if (!TagIds.IsListEqual(tro.TagIds))\r\n                {\r\n                    tro.TagIds = TagIds;\r\n                }\r\n\r\n                if (!FeatureIds.IsListEqual(tro.FeatureIds))\r\n                {\r\n                    tro.FeatureIds = FeatureIds;\r\n                }\r\n\r\n                if (!Links.IsListEqualExact(tro.Links))\r\n                {\r\n                    tro.Links = Links;\r\n                }\r\n\r\n                if (!Roms.IsListEqualExact(tro.Roms))\r\n                {\r\n                    tro.Roms = Roms;\r\n                }\r\n\r\n                if (IsInstalling != tro.IsInstalling)\r\n                {\r\n                    tro.IsInstalling = IsInstalling;\r\n                }\r\n\r\n                if (IsUninstalling != tro.IsUninstalling)\r\n                {\r\n                    tro.IsUninstalling = IsUninstalling;\r\n                }\r\n\r\n                if (IsLaunching != tro.IsLaunching)\r\n                {\r\n                    tro.IsLaunching = IsLaunching;\r\n                }\r\n\r\n                if (IsRunning != tro.IsRunning)\r\n                {\r\n                    tro.IsRunning = IsRunning;\r\n                }\r\n\r\n                if (IsInstalled != tro.IsInstalled)\r\n                {\r\n                    tro.IsInstalled = IsInstalled;\r\n                }\r\n\r\n                if (Playtime != tro.Playtime)\r\n                {\r\n                    tro.Playtime = Playtime;\r\n                }\r\n\r\n                if (Added != tro.Added)\r\n                {\r\n                    tro.Added = Added;\r\n                }\r\n\r\n                if (Modified != tro.Modified)\r\n                {\r\n                    tro.Modified = Modified;\r\n                }\r\n\r\n                if (PlayCount != tro.PlayCount)\r\n                {\r\n                    tro.PlayCount = PlayCount;\r\n                }\r\n\r\n                if (InstallSize != tro.InstallSize)\r\n                {\r\n                    tro.InstallSize = InstallSize;\r\n                }\r\n\r\n                if (LastSizeScanDate != tro.lastSizeScanDate)\r\n                {\r\n                    tro.LastSizeScanDate = LastSizeScanDate;\r\n                }\r\n\r\n                if (!SeriesIds.IsListEqual(tro.SeriesIds))\r\n                {\r\n                    tro.SeriesIds = SeriesIds;\r\n                }\r\n\r\n                if (Version != tro.Version)\r\n                {\r\n                    tro.Version = Version;\r\n                }\r\n\r\n                if (!AgeRatingIds.IsListEqual(tro.AgeRatingIds))\r\n                {\r\n                    tro.AgeRatingIds = AgeRatingIds;\r\n                }\r\n\r\n                if (!RegionIds.IsListEqual(tro.RegionIds))\r\n                {\r\n                    tro.RegionIds = RegionIds;\r\n                }\r\n\r\n                if (SourceId != tro.SourceId)\r\n                {\r\n                    tro.SourceId = SourceId;\r\n                }\r\n\r\n                if (CompletionStatusId != tro.CompletionStatusId)\r\n                {\r\n                    tro.CompletionStatusId = CompletionStatusId;\r\n                }\r\n\r\n                if (UserScore != tro.UserScore)\r\n                {\r\n                    tro.UserScore = UserScore;\r\n                }\r\n\r\n                if (CriticScore != tro.CriticScore)\r\n                {\r\n                    tro.CriticScore = CriticScore;\r\n                }\r\n\r\n                if (CommunityScore != tro.CommunityScore)\r\n                {\r\n                    tro.CommunityScore = CommunityScore;\r\n                }\r\n\r\n                if (!string.Equals(PreScript, tro.PreScript, StringComparison.Ordinal))\r\n                {\r\n                    tro.PreScript = PreScript;\r\n                }\r\n\r\n                if (!string.Equals(PostScript, tro.PostScript, StringComparison.Ordinal))\r\n                {\r\n                    tro.PostScript = PostScript;\r\n                }\r\n\r\n                if (!string.Equals(GameStartedScript, tro.GameStartedScript, StringComparison.Ordinal))\r\n                {\r\n                    tro.GameStartedScript = GameStartedScript;\r\n                }\r\n\r\n                if (UseGlobalPostScript != tro.UseGlobalPostScript)\r\n                {\r\n                    tro.UseGlobalPostScript = UseGlobalPostScript;\r\n                }\r\n\r\n                if (UseGlobalPreScript != tro.UseGlobalPreScript)\r\n                {\r\n                    tro.UseGlobalPreScript = UseGlobalPreScript;\r\n                }\r\n\r\n                if (UseGlobalGameStartedScript != tro.UseGlobalGameStartedScript)\r\n                {\r\n                    tro.UseGlobalGameStartedScript = UseGlobalGameStartedScript;\r\n                }\r\n\r\n                if (!string.Equals(Manual, tro.Manual, StringComparison.Ordinal))\r\n                {\r\n                    tro.Manual = Manual;\r\n                }\r\n\r\n                if (IncludeLibraryPluginAction != tro.IncludeLibraryPluginAction)\r\n                {\r\n                    tro.IncludeLibraryPluginAction = IncludeLibraryPluginAction;\r\n                }\r\n\r\n                if (OverrideInstallState != tro.OverrideInstallState)\r\n                {\r\n                    tro.OverrideInstallState = OverrideInstallState;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new ArgumentException($\"Target object has to be of type {GetType().Name}\");\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets differences in game objects.\r\n        /// </summary>\r\n        /// <param name=\"otherGame\">Game object to compare to.</param>\r\n        /// <returns>List of fields that differ.</returns>\r\n        public List<GameField> GetDifferences(Game otherGame)\r\n        {\r\n            var changes = new List<GameField>();\r\n            if (!string.Equals(BackgroundImage, otherGame.BackgroundImage, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.BackgroundImage);\r\n            }\r\n\r\n            if (!string.Equals(Description, otherGame.Description, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.Description);\r\n            }\r\n\r\n            if (!string.Equals(Notes, otherGame.Notes, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.Notes);\r\n            }\r\n\r\n            if (!GenreIds.IsListEqual(otherGame.GenreIds))\r\n            {\r\n                changes.Add(GameField.GenreIds);\r\n                changes.Add(GameField.Genres);\r\n            }\r\n\r\n            if (EnableSystemHdr != otherGame.enableSystemHdr)\r\n            {\r\n                changes.Add(GameField.EnableSystemHdr);\r\n            }\r\n\r\n            if (Hidden != otherGame.Hidden)\r\n            {\r\n                changes.Add(GameField.Hidden);\r\n            }\r\n\r\n            if (Favorite != otherGame.Favorite)\r\n            {\r\n                changes.Add(GameField.Favorite);\r\n            }\r\n\r\n            if (!string.Equals(Icon, otherGame.Icon, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.Icon);\r\n            }\r\n\r\n            if (!string.Equals(CoverImage, otherGame.CoverImage, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.CoverImage);\r\n            }\r\n\r\n            if (!string.Equals(InstallDirectory, otherGame.InstallDirectory, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.InstallDirectory);\r\n            }\r\n\r\n            if (LastActivity != otherGame.LastActivity)\r\n            {\r\n                changes.Add(GameField.LastActivity);\r\n                if (LastActivitySegment != otherGame.LastActivitySegment)\r\n                {\r\n                    changes.Add(GameField.LastActivitySegment);\r\n                }\r\n            }\r\n\r\n            if (!string.Equals(SortingName, otherGame.SortingName, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.SortingName);\r\n            }\r\n\r\n            if (!string.Equals(GameId, otherGame.GameId, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.Gameid);\r\n            }\r\n\r\n            if (PluginId != otherGame.PluginId)\r\n            {\r\n                changes.Add(GameField.PluginId);\r\n            }\r\n\r\n            if (!GameActions.IsListEqualExact(otherGame.GameActions))\r\n            {\r\n                changes.Add(GameField.GameActions);\r\n            }\r\n\r\n            if (!PlatformIds.IsListEqual(otherGame.PlatformIds))\r\n            {\r\n                changes.Add(GameField.PlatformIds);\r\n                changes.Add(GameField.Platforms);\r\n            }\r\n\r\n            if (!PublisherIds.IsListEqual(otherGame.PublisherIds))\r\n            {\r\n                changes.Add(GameField.PublisherIds);\r\n                changes.Add(GameField.Publishers);\r\n            }\r\n\r\n            if (!DeveloperIds.IsListEqual(otherGame.DeveloperIds))\r\n            {\r\n                changes.Add(GameField.DeveloperIds);\r\n                changes.Add(GameField.Developers);\r\n            }\r\n\r\n            if (ReleaseDate != otherGame.ReleaseDate)\r\n            {\r\n                changes.Add(GameField.ReleaseDate);\r\n                if (ReleaseYear != otherGame.ReleaseYear)\r\n                {\r\n                    changes.Add(GameField.ReleaseYear);\r\n                }\r\n            }\r\n\r\n            if (!CategoryIds.IsListEqual(otherGame.CategoryIds))\r\n            {\r\n                changes.Add(GameField.CategoryIds);\r\n                changes.Add(GameField.Categories);\r\n            }\r\n\r\n            if (!TagIds.IsListEqual(otherGame.TagIds))\r\n            {\r\n                changes.Add(GameField.TagIds);\r\n                changes.Add(GameField.Tags);\r\n            }\r\n\r\n            if (!FeatureIds.IsListEqual(otherGame.FeatureIds))\r\n            {\r\n                changes.Add(GameField.FeatureIds);\r\n                changes.Add(GameField.Features);\r\n            }\r\n\r\n            if (!Links.IsListEqualExact(otherGame.Links))\r\n            {\r\n                changes.Add(GameField.Links);\r\n            }\r\n\r\n            if (!Roms.IsListEqualExact(otherGame.Roms))\r\n            {\r\n                changes.Add(GameField.Roms);\r\n            }\r\n\r\n            if (IsInstalling != otherGame.IsInstalling)\r\n            {\r\n                changes.Add(GameField.IsInstalling);\r\n            }\r\n\r\n            if (IsUninstalling != otherGame.IsUninstalling)\r\n            {\r\n                changes.Add(GameField.IsUninstalling);\r\n            }\r\n\r\n            if (IsLaunching != otherGame.IsLaunching)\r\n            {\r\n                changes.Add(GameField.IsLaunching);\r\n            }\r\n\r\n            if (IsRunning != otherGame.IsRunning)\r\n            {\r\n                changes.Add(GameField.IsRunning);\r\n            }\r\n\r\n            if (IsInstalled != otherGame.IsInstalled)\r\n            {\r\n                changes.Add(GameField.IsInstalled);\r\n                changes.Add(GameField.InstallationStatus);\r\n            }\r\n\r\n            if (Playtime != otherGame.Playtime)\r\n            {\r\n                changes.Add(GameField.Playtime);\r\n                if (PlaytimeCategory != otherGame.PlaytimeCategory)\r\n                {\r\n                    changes.Add(GameField.PlaytimeCategory);\r\n                }\r\n            }\r\n\r\n            if (Added != otherGame.Added)\r\n            {\r\n                changes.Add(GameField.Added);\r\n                if (AddedSegment != otherGame.AddedSegment)\r\n                {\r\n                    changes.Add(GameField.AddedSegment);\r\n                }\r\n            }\r\n\r\n            if (Modified != otherGame.Modified)\r\n            {\r\n                changes.Add(GameField.Modified);\r\n                if (Modified != otherGame.Modified)\r\n                {\r\n                    changes.Add(GameField.ModifiedSegment);\r\n                }\r\n            }\r\n\r\n            if (PlayCount != otherGame.PlayCount)\r\n            {\r\n                changes.Add(GameField.PlayCount);\r\n            }\r\n\r\n            if (InstallSize != otherGame.InstallSize)\r\n            {\r\n                changes.Add(GameField.InstallSize);\r\n            }\r\n\r\n            if (LastSizeScanDate != otherGame.LastSizeScanDate)\r\n            {\r\n                changes.Add(GameField.LastSizeScanDate);\r\n            }\r\n\r\n            if (!SeriesIds.IsListEqual(otherGame.SeriesIds))\r\n            {\r\n                changes.Add(GameField.SeriesIds);\r\n                changes.Add(GameField.Series);\r\n            }\r\n\r\n            if (Version != otherGame.Version)\r\n            {\r\n                changes.Add(GameField.Version);\r\n            }\r\n\r\n            if (!AgeRatingIds.IsListEqual(otherGame.AgeRatingIds))\r\n            {\r\n                changes.Add(GameField.AgeRatingIds);\r\n                changes.Add(GameField.AgeRatings);\r\n            }\r\n\r\n            if (!RegionIds.IsListEqual(otherGame.RegionIds))\r\n            {\r\n                changes.Add(GameField.RegionIds);\r\n                changes.Add(GameField.Regions);\r\n            }\r\n\r\n            if (SourceId != otherGame.SourceId)\r\n            {\r\n                changes.Add(GameField.SourceId);\r\n                changes.Add(GameField.Source);\r\n            }\r\n\r\n            if (CompletionStatusId != otherGame.CompletionStatusId)\r\n            {\r\n                changes.Add(GameField.CompletionStatusId);\r\n                changes.Add(GameField.CompletionStatus);\r\n            }\r\n\r\n            if (UserScore != otherGame.UserScore)\r\n            {\r\n                changes.Add(GameField.UserScore);\r\n                if (UserScoreGroup != otherGame.UserScoreGroup)\r\n                {\r\n                    changes.Add(GameField.UserScoreGroup);\r\n                }\r\n\r\n                if (UserScoreRating != otherGame.UserScoreRating)\r\n                {\r\n                    changes.Add(GameField.UserScoreRating);\r\n                }\r\n            }\r\n\r\n            if (CriticScore != otherGame.CriticScore)\r\n            {\r\n                changes.Add(GameField.CriticScore);\r\n                if (CriticScoreGroup != otherGame.CriticScoreGroup)\r\n                {\r\n                    changes.Add(GameField.CriticScoreGroup);\r\n                }\r\n\r\n                if (CriticScoreRating != otherGame.CriticScoreRating)\r\n                {\r\n                    changes.Add(GameField.CriticScoreRating);\r\n                }\r\n            }\r\n\r\n            if (CommunityScore != otherGame.CommunityScore)\r\n            {\r\n                changes.Add(GameField.CommunityScore);\r\n                if (CommunityScoreGroup != otherGame.CommunityScoreGroup)\r\n                {\r\n                    changes.Add(GameField.CommunityScoreGroup);\r\n                }\r\n\r\n                if (CommunityScoreRating != otherGame.CommunityScoreRating)\r\n                {\r\n                    changes.Add(GameField.CommunityScoreRating);\r\n                }\r\n            }\r\n\r\n            if (!string.Equals(PreScript, otherGame.PreScript, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.PreScript);\r\n            }\r\n\r\n            if (!string.Equals(PostScript, otherGame.PostScript, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.PostScript);\r\n            }\r\n\r\n            if (!string.Equals(GameStartedScript, otherGame.GameStartedScript, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.GameStartedScript);\r\n            }\r\n\r\n            if (UseGlobalPostScript != otherGame.UseGlobalPostScript)\r\n            {\r\n                changes.Add(GameField.UseGlobalPostScript);\r\n            }\r\n\r\n            if (UseGlobalPreScript != otherGame.UseGlobalPreScript)\r\n            {\r\n                changes.Add(GameField.UseGlobalPreScript);\r\n            }\r\n\r\n            if (UseGlobalGameStartedScript != otherGame.UseGlobalGameStartedScript)\r\n            {\r\n                changes.Add(GameField.UseGlobalGameStartedScript);\r\n            }\r\n\r\n            if (!string.Equals(Manual, otherGame.Manual, StringComparison.Ordinal))\r\n            {\r\n                changes.Add(GameField.Manual);\r\n            }\r\n\r\n            if (IncludeLibraryPluginAction != otherGame.IncludeLibraryPluginAction)\r\n            {\r\n                changes.Add(GameField.IncludeLibraryPluginAction);\r\n            }\r\n\r\n            if (OverrideInstallState != otherGame.OverrideInstallState)\r\n            {\r\n                changes.Add(GameField.OverrideInstallState);\r\n            }\r\n\r\n            return changes;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public char GetNameGroup()\r\n        {\r\n            var nameMatch = string.IsNullOrEmpty(SortingName) ? Name : SortingName;\r\n            if (string.IsNullOrEmpty(nameMatch))\r\n            {\r\n                return '#';\r\n            }\r\n            else\r\n            {\r\n                var firstChar = char.ToUpper(nameMatch[0]);\r\n                return char.IsLetter(firstChar) ? firstChar : '#';\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game Install Size group.\r\n        /// </summary>\r\n        public InstallSizeGroup GetInstallSizeGroup()\r\n        {\r\n            if (installSize == null || installSize == 0)\r\n            {\r\n                return InstallSizeGroup.None;\r\n            }\r\n            else if (installSize <= 0x6400000) //100MB\r\n            {\r\n                return InstallSizeGroup.S0_0MB_100MB;\r\n            }\r\n            else if (installSize <= 0x40000000) //1GB\r\n            {\r\n                return InstallSizeGroup.S1_100MB_1GB;\r\n            }\r\n            else if (installSize <= 0x140000000) //5GB\r\n            {\r\n                return InstallSizeGroup.S2_1GB_5GB;\r\n            }\r\n            else if (installSize <= 0x280000000) //10GB\r\n            {\r\n                return InstallSizeGroup.S3_5GB_10GB;\r\n            }\r\n            else if (installSize <= 0x500000000) //20GB\r\n            {\r\n                return InstallSizeGroup.S4_10GB_20GB;\r\n            }\r\n            else if (installSize <= 0xA00000000) //40GB\r\n            {\r\n                return InstallSizeGroup.S5_20GB_40GB;\r\n            }\r\n            else if (installSize <= 0x1900000000) //100GB\r\n            {\r\n                return InstallSizeGroup.S6_40GB_100GB;\r\n            }\r\n\r\n            return InstallSizeGroup.S7_100GBPlus;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game Install Drive group.\r\n        /// </summary>\r\n        public string GetInstallDriveGroup()\r\n        {\r\n            var installDrive = GetInstallDrive();\r\n            if (string.IsNullOrEmpty(installDrive))\r\n            {\r\n                return ResourceProvider.GetString(\"LOCNone\");\r\n            }\r\n            else\r\n            {\r\n                return installDrive;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets game Install Drive.\r\n        /// </summary>\r\n        public string GetInstallDrive()\r\n        {\r\n            if (!isInstalled)\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            if (string.IsNullOrWhiteSpace(InstallDirectory))\r\n            {\r\n                return string.Empty;\r\n            }\r\n\r\n            try\r\n            {\r\n                return Path.GetPathRoot(InstallDirectory).ToUpperInvariant();\r\n            }\r\n            catch\r\n            {\r\n                return string.Empty;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/GameAction.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public enum TrackingMode : int\r\n    {\r\n        /// <summary>\r\n        /// Default tracking mode. Playnite will try to use the best one automatically.\r\n        /// </summary>\r\n        [Description(\"LOCActionTrackingModeDefault\")]\r\n        Default = 0,\r\n        /// <summary>\r\n        /// Origin process and all started child processes are tracked.\r\n        /// </summary>\r\n        [Description(\"LOCActionTrackingModeProcess\")]\r\n        Process = 1,\r\n        /// <summary>\r\n        /// Any process from specified directory is tracked.\r\n        /// </summary>\r\n        [Description(\"LOCActionTrackingModeDirectory\")]\r\n        Directory = 2,\r\n        /// <summary>\r\n        /// Only originally started process is being tracked.\r\n        /// </summary>\r\n        [Description(\"LOCActionTrackingOriginalProcess\")]\r\n        OriginalProcess = 3,\r\n        /// <summary>\r\n        /// Any process by given process name is being tracked.\r\n        /// </summary>\r\n        [Description(\"LOCActionTrackingProcessName\")]\r\n        ProcessName = 4\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents game action type.\r\n    /// </summary>\r\n    public enum GameActionType : int\r\n    {\r\n        /// <summary>\r\n        /// Game action executes a file.\r\n        /// </summary>\r\n        [Description(\"LOCGameActionTypeFile\")]\r\n        File = 0,\r\n        /// <summary>\r\n        /// Game action navigates to a web based URL.\r\n        /// </summary>\r\n        [Description(\"LOCGameActionTypeLink\")]\r\n        URL = 1,\r\n        /// <summary>\r\n        /// Game action starts an emulator.\r\n        /// </summary>\r\n        [Description(\"LOCGameActionTypeEmulator\")]\r\n        Emulator = 2,\r\n        /// <summary>\r\n        /// Game action startup is handled by a script.\r\n        /// </summary>\r\n        [Description(\"LOCGameActionTypeScript\")]\r\n        Script = 3\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents executable game action.\r\n    /// </summary>\r\n    public class GameAction : ObservableObject, IEquatable<GameAction>\r\n    {\r\n        private GameActionType type;\r\n        /// <summary>\r\n        /// Gets or sets task type.\r\n        /// </summary>\r\n        public GameActionType Type\r\n        {\r\n            get => type;\r\n            set\r\n            {\r\n                type = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string arguments;\r\n        /// <summary>\r\n        /// Gets or sets executable arguments for File type tasks.\r\n        /// </summary>\r\n        public string Arguments\r\n        {\r\n            get => arguments;\r\n            set\r\n            {\r\n                arguments = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string additionalArguments;\r\n        /// <summary>\r\n        /// Gets or sets additional executable arguments used for Emulator action type.\r\n        /// </summary>\r\n        public string AdditionalArguments\r\n        {\r\n            get => additionalArguments;\r\n            set\r\n            {\r\n                additionalArguments = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool overrideDefaultArgs;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether emulator arguments should be completely overwritten with action arguments.\r\n        /// Applies only to Emulator action type.\r\n        /// </summary>\r\n        public bool OverrideDefaultArgs\r\n        {\r\n            get => overrideDefaultArgs;\r\n            set\r\n            {\r\n                overrideDefaultArgs = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string path;\r\n        /// <summary>\r\n        /// Gets or sets executable path for File action type or URL for URL action type.\r\n        /// </summary>\r\n        public string Path\r\n        {\r\n            get => path;\r\n            set\r\n            {\r\n                path = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string workingDir;\r\n        /// <summary>\r\n        /// Gets or sets working directory for File action type executable.\r\n        /// </summary>\r\n        public string WorkingDir\r\n        {\r\n            get => workingDir;\r\n            set\r\n            {\r\n                workingDir = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string name;\r\n        /// <summary>\r\n        /// Gets or sets action name.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get => name;\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool isPlayAction;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether an action is play action.\r\n        /// </summary>\r\n        public bool IsPlayAction\r\n        {\r\n            get => isPlayAction;\r\n            set\r\n            {\r\n                isPlayAction = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid emulatorId;\r\n        /// <summary>\r\n        /// Gets or sets emulator id for Emulator action type execution.\r\n        /// </summary>\r\n        public Guid EmulatorId\r\n        {\r\n            get => emulatorId;\r\n            set\r\n            {\r\n                emulatorId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string emulatorProfileId;\r\n        /// <summary>\r\n        /// Gets or sets emulator profile id for Emulator action type execution.\r\n        /// </summary>\r\n        public string EmulatorProfileId\r\n        {\r\n            get => emulatorProfileId;\r\n            set\r\n            {\r\n                emulatorProfileId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private TrackingMode trackingMode = TrackingMode.Default;\r\n        /// <summary>\r\n        /// Gets or sets executable arguments for File type tasks.\r\n        /// </summary>\r\n        public TrackingMode TrackingMode\r\n        {\r\n            get => trackingMode;\r\n            set\r\n            {\r\n                trackingMode = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string trackingPath;\r\n        /// <summary>\r\n        /// Gets or sets executable arguments for File type tasks.\r\n        /// </summary>\r\n        public string TrackingPath\r\n        {\r\n            get => trackingPath;\r\n            set\r\n            {\r\n                trackingPath = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string script;\r\n        /// <summary>\r\n        /// Gets or sets startup script.\r\n        /// </summary>\r\n        public string Script\r\n        {\r\n            get => script;\r\n            set\r\n            {\r\n                script = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int initialTrackingDelay = 0;\r\n        /// <summary>\r\n        /// Gets or sets delay in milliseconds before tracking actually starts.\r\n        /// </summary>\r\n        public int InitialTrackingDelay\r\n        {\r\n            get => initialTrackingDelay;\r\n            set\r\n            {\r\n                initialTrackingDelay = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int trackingFrequency = 2000;\r\n        /// <summary>\r\n        /// Gets or sets delay in milliseconds before tracking actually starts.\r\n        /// </summary>\r\n        public int TrackingFrequency\r\n        {\r\n            get => trackingFrequency;\r\n            set\r\n            {\r\n                trackingFrequency = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            switch (Type)\r\n            {\r\n                case GameActionType.File:\r\n                    return $\"File: {Path}, {Arguments}, {WorkingDir}\";\r\n                case GameActionType.URL:\r\n                    return $\"Url: {Path}\";\r\n                case GameActionType.Emulator:\r\n                    return $\"Emulator: {EmulatorId}, {EmulatorProfileId}, {OverrideDefaultArgs}, {AdditionalArguments}\";\r\n                case GameActionType.Script:\r\n                    return \"Script\";\r\n                default:\r\n                    return Path;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Compares two <see cref=\"GameAction\"/> objects for equality.\r\n        /// </summary>\r\n        /// <param name=\"obj1\"></param>\r\n        /// <param name=\"obj2\"></param>\r\n        /// <returns></returns>\r\n        public static bool Equals(GameAction obj1, GameAction obj2)\r\n        {\r\n            if (obj1 == null && obj2 == null)\r\n            {\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return obj1?.Equals(obj2) == true;\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(GameAction other)\r\n        {\r\n            if (other is null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (Type != other.Type)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Arguments, other.Arguments, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(AdditionalArguments, other.AdditionalArguments, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Path, other.Path, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(WorkingDir, other.WorkingDir, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Name, other.Name, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (IsPlayAction != other.IsPlayAction)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (EmulatorId != other.EmulatorId)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(EmulatorProfileId, other.EmulatorProfileId, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (OverrideDefaultArgs != other.OverrideDefaultArgs)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(TrackingPath, other.TrackingPath, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (TrackingMode != other.TrackingMode)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Script, other.Script, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (InitialTrackingDelay != other.InitialTrackingDelay)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (TrackingFrequency != other.TrackingFrequency)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public GameAction GetCopy()\r\n        {\r\n            return new GameAction\r\n            {\r\n                AdditionalArguments = AdditionalArguments,\r\n                Arguments = Arguments,\r\n                EmulatorId = EmulatorId,\r\n                EmulatorProfileId = EmulatorProfileId,\r\n                IsPlayAction = IsPlayAction,\r\n                Name = Name,\r\n                OverrideDefaultArgs = OverrideDefaultArgs,\r\n                Path = Path,\r\n                Script = Script,\r\n                TrackingMode = TrackingMode,\r\n                TrackingPath = TrackingPath,\r\n                Type = Type,\r\n                WorkingDir = WorkingDir,\r\n                InitialTrackingDelay = InitialTrackingDelay,\r\n                TrackingFrequency = TrackingFrequency\r\n            };\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/GameFeature.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Describes game feature object.\r\n    /// </summary>\r\n    public class GameFeature : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GameFeature\"/>.\r\n        /// </summary>\r\n        public GameFeature() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GameFeature\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public GameFeature(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty tag.\r\n        /// </summary>\r\n        public static readonly GameFeature Empty = new GameFeature { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/GameMetadata.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Represents metadata file.\r\n    /// </summary>\r\n    public class MetadataFile\r\n    {\r\n        /// <summary>\r\n        /// Indicates whether metadata holds some content.\r\n        /// </summary>\r\n        public bool HasContent\r\n        {\r\n            get => !string.IsNullOrEmpty(FileName) && Content != null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Indicates whether there's some source information for the file (content or URL).\r\n        /// </summary>\r\n        public bool HasImageData\r\n        {\r\n            get => HasContent || !string.IsNullOrEmpty(Path);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets or sets file name.\r\n        /// </summary>\r\n        public string FileName\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets or sets file content.\r\n        /// </summary>\r\n        public byte[] Content\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets or sets original source url.\r\n        /// </summary>\r\n        public string Path\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"MetadataFile\"/>.\r\n        /// </summary>\r\n        public MetadataFile()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"MetadataFile\"/>.\r\n        /// </summary>\r\n        /// <param name=\"path\">Source path (URL, URI, system path).</param>\r\n        public MetadataFile(string path)\r\n        {\r\n            FileName = System.IO.Path.GetFileName(path);\r\n            Path = path;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"MetadataFile\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\">File name.</param>\r\n        /// <param name=\"data\">File content.</param>\r\n        public MetadataFile(string name, byte[] data) : this(name, data, null)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"MetadataFile\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\">File name.</param>\r\n        /// <param name=\"data\">File content.</param>\r\n        /// <param name=\"originalUrl\">Source url.</param>\r\n        public MetadataFile(string name, byte[] data, string originalUrl)\r\n        {\r\n            FileName = name;\r\n            Content = data;\r\n            Path = originalUrl;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents metadata property referencing database object by ID.\r\n    /// </summary>\r\n    public class MetadataIdProperty : MetadataProperty\r\n    {\r\n        /// <summary>\r\n        /// Gets ID of referenced object.\r\n        /// </summary>\r\n        public Guid Id { get; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"MetadataIdProperty\"/>.\r\n        /// </summary>\r\n        /// <param name=\"dbId\"></param>\r\n        public MetadataIdProperty(Guid dbId)\r\n        {\r\n            if (dbId == Guid.Empty)\r\n            {\r\n                throw new ArgumentNullException(nameof(dbId));\r\n            }\r\n\r\n            Id = dbId;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public override string ToString()\r\n        {\r\n            return Id.ToString();\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override bool Equals(object obj)\r\n        {\r\n            return Equals(obj as MetadataIdProperty);\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override int GetHashCode()\r\n        {\r\n            return Id.GetHashCode();\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(MetadataIdProperty other)\r\n        {\r\n            if (other == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Id == other.Id;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents metadata property referencing data by name.\r\n    /// </summary>\r\n    public class MetadataNameProperty : MetadataProperty, IEquatable<MetadataNameProperty>\r\n    {\r\n        /// <summary>\r\n        /// Property name value.\r\n        /// </summary>\r\n        public string Name { get; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"MetadataNameProperty\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public MetadataNameProperty(string name)\r\n        {\r\n            if (string.IsNullOrWhiteSpace(name))\r\n            {\r\n                throw new ArgumentNullException(nameof(name));\r\n            }\r\n\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override bool Equals(object obj)\r\n        {\r\n            return Equals(obj as MetadataNameProperty);\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override int GetHashCode()\r\n        {\r\n            return Name.GetHashCode();\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(MetadataNameProperty other)\r\n        {\r\n            if (other == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Name == other.Name;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents metadata property referencing specification object by id.\r\n    /// </summary>\r\n    public class MetadataSpecProperty : MetadataProperty, IEquatable<MetadataSpecProperty>\r\n    {\r\n        /// <summary>\r\n        /// Gets specification id.\r\n        /// </summary>\r\n        public string Id { get; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"MetadataSpecProperty\"/>.\r\n        /// </summary>\r\n        /// <param name=\"specId\"></param>\r\n        public MetadataSpecProperty(string specId)\r\n        {\r\n            if (string.IsNullOrWhiteSpace(specId))\r\n            {\r\n                throw new ArgumentNullException(nameof(specId));\r\n            }\r\n\r\n            Id = specId;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public override string ToString()\r\n        {\r\n            return Id;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override bool Equals(object obj)\r\n        {\r\n            return Equals(obj as MetadataSpecProperty);\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override int GetHashCode()\r\n        {\r\n            return Id.GetHashCode();\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(MetadataSpecProperty other)\r\n        {\r\n            if (other == null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return Id == other.Id;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents base metadata property.\r\n    /// </summary>\r\n    public abstract class MetadataProperty\r\n    {\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents importable game data.\r\n    /// </summary>\r\n    public class GameMetadata\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets Name.\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets custom game identifier.\r\n        /// </summary>\r\n        public string GameId { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Description.\r\n        /// </summary>\r\n        public string Description { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets installation directory.\r\n        /// </summary>\r\n        public string InstallDirectory { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets install size in bytes of the game.\r\n        /// </summary>\r\n        public ulong? InstallSize { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Sorting Name.\r\n        /// </summary>\r\n        public string SortingName { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Other Actions.\r\n        /// </summary>\r\n        public List<GameAction> GameActions { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets ReleaseDate.\r\n        /// </summary>\r\n        public ReleaseDate? ReleaseDate { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Links.\r\n        /// </summary>\r\n        public List<Link> Links { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Roms.\r\n        /// </summary>\r\n        public List<GameRom> Roms { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets whether the game is installed.\r\n        /// </summary>\r\n        public bool IsInstalled { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Playtime.\r\n        /// </summary>\r\n        public ulong Playtime { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets PlayCount.\r\n        /// </summary>\r\n        public ulong PlayCount { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets LastActivity.\r\n        /// </summary>\r\n        public DateTime? LastActivity { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets CompletionStatus.\r\n        /// </summary>\r\n        public MetadataProperty CompletionStatus { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets UserScore.\r\n        /// </summary>\r\n        public int? UserScore { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets CriticScore.\r\n        /// </summary>\r\n        public int? CriticScore { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets CommunityScore.\r\n        /// </summary>\r\n        public int? CommunityScore { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Icon.\r\n        /// </summary>\r\n        public MetadataFile Icon { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets CoverImage.\r\n        /// </summary>\r\n        public MetadataFile CoverImage { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets BackgroundImage.\r\n        /// </summary>\r\n        public MetadataFile BackgroundImage { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Hidden.\r\n        /// </summary>\r\n        public bool Hidden { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Favorite.\r\n        /// </summary>\r\n        public bool Favorite { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Version.\r\n        /// </summary>\r\n        public string Version { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Source.\r\n        /// </summary>\r\n        public MetadataProperty Source { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Series.\r\n        /// </summary>\r\n        public HashSet<MetadataProperty> Series { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets AgeRating.\r\n        /// </summary>\r\n        public HashSet<MetadataProperty> AgeRatings { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Region.\r\n        /// </summary>\r\n        public HashSet<MetadataProperty> Regions { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Platform.\r\n        /// </summary>\r\n        public HashSet<MetadataProperty> Platforms { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Developers.\r\n        /// </summary>\r\n        public HashSet<MetadataProperty> Developers { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Publishers.\r\n        /// </summary>\r\n        public HashSet<MetadataProperty> Publishers { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Genres.\r\n        /// </summary>\r\n        public HashSet<MetadataProperty> Genres { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Categories.\r\n        /// </summary>\r\n        public HashSet<MetadataProperty> Categories { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Tags.\r\n        /// </summary>\r\n        public HashSet<MetadataProperty> Tags { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets game Features.\r\n        /// </summary>\r\n        public HashSet<MetadataProperty> Features { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GameMetadata\"/>.\r\n        /// </summary>\r\n        public GameMetadata()\r\n        {\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/GameRom.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Represents game disk image.\r\n    /// </summary>\r\n    public class GameRom : ObservableObject, IEquatable<GameRom>\r\n    {\r\n        private string name;\r\n        /// <summary>\r\n        /// Gets ROM name.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get\r\n            {\r\n                return name;\r\n            }\r\n\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string path;\r\n        /// <summary>\r\n        /// Gets ROM path.\r\n        /// </summary>\r\n        public string Path\r\n        {\r\n            get\r\n            {\r\n                return path;\r\n            }\r\n\r\n            set\r\n            {\r\n                path = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GameRom\"/>.\r\n        /// </summary>\r\n        public GameRom()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GameRom\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        /// <param name=\"path\"></param>\r\n        public GameRom(string name, string path)\r\n        {\r\n            Name = name;\r\n            Path = path;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(GameRom other)\r\n        {\r\n            if (other is null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Name, other.Name, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Path, other.Path, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public GameRom GetCopy()\r\n        {\r\n            return new GameRom\r\n            {\r\n                Name = Name,\r\n                Path = Path\r\n            };\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/GameScannerConfig.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public enum ScannerConfigPlayActionSettings\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Description(\"LOCScannerConfigPlayActionSettingsScanner\")]\r\n        ScannerSettings,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Description(\"LOCScannerConfigPlayActionSettingsSelectProfile\")]\r\n        SelectProfiteOnStart,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        [Description(\"LOCScannerConfigPlayActionSettingsSelectEmulator\")]\r\n        SelectEmulatorOnStart\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents emulated game scanner configuration.\r\n    /// </summary>\r\n    public class GameScannerConfig : DatabaseObject\r\n    {\r\n        private Guid emulatorId;\r\n        /// <summary>\r\n        /// Gets or sets assigned emulator id.\r\n        /// </summary>\r\n        public Guid EmulatorId\r\n        {\r\n            get => emulatorId;\r\n            set\r\n            {\r\n                emulatorId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<string> crcExcludeFileTypes;\r\n        /// <summary>\r\n        /// Gets or sets list of file extensions that should be excluded from CRC check.\r\n        /// </summary>\r\n        public List<string> CrcExcludeFileTypes\r\n        {\r\n            get => crcExcludeFileTypes;\r\n            set\r\n            {\r\n                crcExcludeFileTypes = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string emulatorProfileId;\r\n        /// <summary>\r\n        /// Gets or sets assigned emulator profile id.\r\n        /// </summary>\r\n        public string EmulatorProfileId\r\n        {\r\n            get => emulatorProfileId;\r\n            set\r\n            {\r\n                emulatorProfileId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string directory;\r\n        /// <summary>\r\n        /// Gets or sets directory to scan.\r\n        /// </summary>\r\n        public string Directory\r\n        {\r\n            get => directory;\r\n            set\r\n            {\r\n                directory = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool inGlobalUpdate = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether this config should be included in global library update.\r\n        /// </summary>\r\n        public bool InGlobalUpdate\r\n        {\r\n            get => inGlobalUpdate;\r\n            set\r\n            {\r\n                inGlobalUpdate = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool excludeOnlineFiles = false;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether from cloud storage services should be scanned if not downloaded to a device.\r\n        /// </summary>\r\n        public bool ExcludeOnlineFiles\r\n        {\r\n            get => excludeOnlineFiles;\r\n            set\r\n            {\r\n                excludeOnlineFiles = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool useSimplifiedOnlineFileScan = false;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether online only cloud files should still be scanned without reading a file.\r\n        /// </summary>\r\n        public bool UseSimplifiedOnlineFileScan\r\n        {\r\n            get => useSimplifiedOnlineFileScan;\r\n            set\r\n            {\r\n                useSimplifiedOnlineFileScan = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool importWithRelativePaths = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether game ROMs should be imported under relative paths if possible.\r\n        /// </summary>\r\n        public bool ImportWithRelativePaths\r\n        {\r\n            get => importWithRelativePaths;\r\n            set\r\n            {\r\n                importWithRelativePaths = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool scanSubfolders = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether subfolders should be scanned.\r\n        /// </summary>\r\n        public bool ScanSubfolders\r\n        {\r\n            get => scanSubfolders;\r\n            set\r\n            {\r\n                scanSubfolders = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool scanInsideArchives = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether file archives should be scanned for content.\r\n        /// </summary>\r\n        public bool ScanInsideArchives\r\n        {\r\n            get => scanInsideArchives;\r\n            set\r\n            {\r\n                scanInsideArchives = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<string> excludedFiles;\r\n        /// <summary>\r\n        /// Gets or sets list of files excluded from scan.\r\n        /// </summary>\r\n        public List<string> ExcludedFiles\r\n        {\r\n            get => excludedFiles;\r\n            set\r\n            {\r\n                excludedFiles = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private List<string> excludedDirectories;\r\n        /// <summary>\r\n        /// Gets or sets list of folders excluded from scan.\r\n        /// </summary>\r\n        public List<string> ExcludedDirectories\r\n        {\r\n            get => excludedDirectories;\r\n            set\r\n            {\r\n                excludedDirectories = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Guid overridePlatformId;\r\n        /// <summary>\r\n        /// Gets or sets id of default platform to be assigned if auto detection fails.\r\n        /// </summary>\r\n        public Guid OverridePlatformId\r\n        {\r\n            get => overridePlatformId;\r\n            set\r\n            {\r\n                overridePlatformId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private ScannerConfigPlayActionSettings playActionSettings = ScannerConfigPlayActionSettings.ScannerSettings;\r\n        /// <summary>\r\n        /// Gets or sets play action settings for imported games.\r\n        /// </summary>\r\n        public ScannerConfigPlayActionSettings PlayActionSettings\r\n        {\r\n            get => playActionSettings;\r\n            set\r\n            {\r\n                playActionSettings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool mergeRelatedFiles = true;\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether related files, like individual game discs, should be merged under one game entry.\r\n        /// </summary>\r\n        public bool MergeRelatedFiles\r\n        {\r\n            get => mergeRelatedFiles;\r\n            set\r\n            {\r\n                mergeRelatedFiles = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override void CopyDiffTo(object target)\r\n        {\r\n            base.CopyDiffTo(target);\r\n            if (target is GameScannerConfig tro)\r\n            {\r\n                if (EmulatorId != tro.EmulatorId)\r\n                {\r\n                    tro.EmulatorId = EmulatorId;\r\n                }\r\n\r\n                if (InGlobalUpdate != tro.InGlobalUpdate)\r\n                {\r\n                    tro.InGlobalUpdate = InGlobalUpdate;\r\n                }\r\n\r\n                if (!string.Equals(EmulatorProfileId, tro.EmulatorProfileId, StringComparison.Ordinal))\r\n                {\r\n                    tro.EmulatorProfileId = EmulatorProfileId;\r\n                }\r\n\r\n                if (!string.Equals(Directory, tro.Directory, StringComparison.Ordinal))\r\n                {\r\n                    tro.Directory = Directory;\r\n                }\r\n\r\n                if (!CrcExcludeFileTypes.IsListEqual(tro.CrcExcludeFileTypes))\r\n                {\r\n                    tro.CrcExcludeFileTypes = CrcExcludeFileTypes;\r\n                }\r\n\r\n                if (ExcludeOnlineFiles != tro.ExcludeOnlineFiles)\r\n                {\r\n                    tro.ExcludeOnlineFiles = ExcludeOnlineFiles;\r\n                }\r\n\r\n                if (UseSimplifiedOnlineFileScan != tro.UseSimplifiedOnlineFileScan)\r\n                {\r\n                    tro.UseSimplifiedOnlineFileScan = UseSimplifiedOnlineFileScan;\r\n                }\r\n\r\n                if (ImportWithRelativePaths != tro.ImportWithRelativePaths)\r\n                {\r\n                    tro.ImportWithRelativePaths = ImportWithRelativePaths;\r\n                }\r\n\r\n                if (ScanSubfolders != tro.ScanSubfolders)\r\n                {\r\n                    tro.ScanSubfolders = ScanSubfolders;\r\n                }\r\n\r\n                if (ScanInsideArchives != tro.ScanInsideArchives)\r\n                {\r\n                    tro.ScanInsideArchives = ScanInsideArchives;\r\n                }\r\n\r\n                if (!ExcludedFiles.IsListEqual(tro.ExcludedFiles))\r\n                {\r\n                    tro.ExcludedFiles = ExcludedFiles;\r\n                }\r\n\r\n                if (!ExcludedDirectories.IsListEqual(tro.ExcludedDirectories))\r\n                {\r\n                    tro.ExcludedDirectories = ExcludedDirectories;\r\n                }\r\n\r\n                if (OverridePlatformId != tro.OverridePlatformId)\r\n                {\r\n                    tro.OverridePlatformId = OverridePlatformId;\r\n                }\r\n\r\n                if (PlayActionSettings != tro.PlayActionSettings)\r\n                {\r\n                    tro.PlayActionSettings = PlayActionSettings;\r\n                }\r\n\r\n                if (MergeRelatedFiles != tro.MergeRelatedFiles)\r\n                {\r\n                    tro.MergeRelatedFiles = MergeRelatedFiles;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new ArgumentException($\"Target object has to be of type {GetType().Name}\");\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/GameSource.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Describes GameSource object.\r\n    /// </summary>\r\n    public class GameSource : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GameSource\"/>.\r\n        /// </summary>\r\n        public GameSource() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GameSource\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public GameSource(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty game source.\r\n        /// </summary>\r\n        public static readonly GameSource Empty = new GameSource { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/Genre.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Describes Genre object.\r\n    /// </summary>\r\n    public class Genre : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Genre\"/>.\r\n        /// </summary>\r\n        public Genre() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Genre\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Genre(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty genre.\r\n        /// </summary>\r\n        public static readonly Genre Empty = new Genre { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/IIdentifiable.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Desribes object identifiable by an id.\r\n    /// </summary>\r\n    public interface IIdentifiable\r\n    {\r\n        /// <summary>\r\n        /// Gets unique object identifier.\r\n        /// </summary>\r\n        Guid Id { get; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/ImportExclusionList.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite\r\n{\r\n    /// <summary>\r\n    /// Represents import exclusion item.\r\n    /// </summary>\r\n    public class ImportExclusionItem : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets game's store ID.\r\n        /// </summary>\r\n        public string GameId { get; set; }\r\n        /// <summary>\r\n        /// Gets or sets source plugin ID.\r\n        /// </summary>\r\n        public Guid LibraryId { get; set; }\r\n        /// <summary>\r\n        /// Gets or sets source plugin name.\r\n        /// </summary>\r\n        public string LibraryName { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ImportExclusionItem\"/>.\r\n        /// </summary>\r\n        public ImportExclusionItem()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ImportExclusionItem\"/>.\r\n        /// </summary>\r\n        /// <param name=\"gameId\"></param>\r\n        /// <param name=\"gameName\"></param>\r\n        /// <param name=\"libraryId\"></param>\r\n        /// <param name=\"libraryName\"></param>\r\n        public ImportExclusionItem(string gameId, string gameName, Guid libraryId, string libraryName)\r\n        {\r\n            GameId = gameId;\r\n            Name = gameName;\r\n            LibraryId = libraryId;\r\n            LibraryName = libraryName;\r\n            Id = GetId();\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public Guid GetId()\r\n        {\r\n            return GetId(GameId, LibraryId);\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"gameId\"></param>\r\n        /// <param name=\"libraryId\"></param>\r\n        /// <returns></returns>\r\n        public static Guid GetId(string gameId, Guid libraryId)\r\n        {\r\n            var id = $\"{gameId}_{libraryId}\";\r\n            using (var provider = System.Security.Cryptography.MD5.Create())\r\n            return new Guid(provider.ComputeHash(Encoding.UTF8.GetBytes(id)));\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override void CopyDiffTo(object target)\r\n        {\r\n            base.CopyDiffTo(target);\r\n\r\n            if (target is ImportExclusionItem tro)\r\n            {\r\n                if (!string.Equals(GameId, tro.GameId, StringComparison.Ordinal))\r\n                {\r\n                    tro.GameId = GameId;\r\n                }\r\n\r\n                if (!string.Equals(LibraryName, tro.LibraryName, StringComparison.Ordinal))\r\n                {\r\n                    tro.LibraryName = LibraryName;\r\n                }\r\n\r\n                if (LibraryId != tro.LibraryId)\r\n                {\r\n                    tro.LibraryId = LibraryId;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new ArgumentException($\"Target object has to be of type {GetType().Name}\");\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/InstallSizeGroup.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Playnite.SDK.Models\n{\n    /// <summary>\n    /// Specifies Install Size categories.\n    /// </summary>\n    public enum InstallSizeGroup : int\n    {\n        /// <summary>\n        /// Not playtime.\n        /// </summary>\n        [Description(\"LOCNone\")]\n        None = 0,\n\n        /// <summary>\n        /// 0 to 100MB.\n        /// </summary>\n        [Description(\"LOCSizeZeroTo100Mb\")]\n        S0_0MB_100MB = 1,\n\n        /// <summary>\n        /// 100MB to 1GB.\n        /// </summary>\n        [Description(\"LOCSize100MbTo1Gb\")]\n        S1_100MB_1GB = 2,\n\n        /// <summary>\n        /// 1GB to 5GB.\n        /// </summary>\n        [Description(\"LOCSize1GbTo5Gb\")]\n        S2_1GB_5GB = 3,\n\n        /// <summary>\n        /// 5GB to 10GB.\n        /// </summary>\n        [Description(\"LOCSize5GbTo10Gb\")]\n        S3_5GB_10GB = 4,\n\n        /// <summary>\n        /// 10GB to 20GB.\n        /// </summary>\n        [Description(\"LOCSize10GbTo20Gb\")]\n        S4_10GB_20GB = 5,\n\n        /// <summary>\n        /// 20GB to 40GB.\n        /// </summary>\n        [Description(\"LOCSize20GbTo40Gb\")]\n        S5_20GB_40GB = 6,\n\n        /// <summary>\n        /// 40GB to 100GB.\n        /// </summary>\n        [Description(\"LOCSize40GbTo100Gb\")]\n        S6_40GB_100GB = 7,\n\n        /// <summary>\n        /// 100GB or more.\n        /// </summary>\n        [Description(\"LOCSizeMoreThan100Gb\")]\n        S7_100GBPlus = 8\n    }\n}"
  },
  {
    "path": "source/PlayniteSDK/Models/InstallationStatus.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Represents game installation status.\r\n    /// </summary>\r\n    public enum InstallationStatus : int\r\n    {\r\n        /// <summary>\r\n        /// Game is installed.\r\n        /// </summary>\r\n        [Description(\"LOCGameIsInstalledTitle\")]\r\n        Installed = 0,\r\n\r\n        /// <summary>\r\n        /// Game is not installed.\r\n        /// </summary>\r\n        [Description(\"LOCGameIsUnInstalledTitle\")]\r\n        Uninstalled = 1\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/Link.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Represents web link.\r\n    /// </summary>\r\n    public class Link : ObservableObject, IEquatable<Link>\r\n    {\r\n        private string name;\r\n        /// <summary>\r\n        /// Gets or sets name of the link.\r\n        /// </summary>\r\n        public string Name\r\n        {\r\n            get => name;\r\n            set\r\n            {\r\n                name = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string url;\r\n        /// <summary>\r\n        /// Gets or sets web based URL.\r\n        /// </summary>\r\n        public string Url\r\n        {\r\n            get => url;\r\n            set\r\n            {\r\n                url = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Link.\r\n        /// </summary>\r\n        public Link()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Link with specific values.\r\n        /// </summary>\r\n        /// <param name=\"name\">Link name.</param>\r\n        /// <param name=\"url\">Link URL.</param>\r\n        public Link(string name, string url)\r\n        {\r\n            Name = name;\r\n            Url = url;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(Link other)\r\n        {\r\n            if (other is null)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Name, other.Name, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (!string.Equals(Url, other.Url, StringComparison.Ordinal))\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public Link GetCopy()\r\n        {\r\n            return new Link\r\n            {\r\n                Name = Name,\r\n                Url = Url\r\n            };\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/PastTimeSegment.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Specifies past time segments.\r\n    /// </summary>\r\n    public enum PastTimeSegment : int\r\n    {\r\n        /// <summary>\r\n        /// Indicates time occuring today.\r\n        /// </summary>\r\n        [Description(\"LOCToday\")]\r\n        Today = 0,\r\n\r\n        /// <summary>\r\n        /// Indicates time occuring yesterday.\r\n        /// </summary>\r\n        [Description(\"LOCYesterday\")]\r\n        Yesterday = 1,\r\n\r\n        /// <summary>\r\n        /// Indicates time occuring past week.\r\n        /// </summary>\r\n        [Description(\"LOCInPast7Days\")]\r\n        PastWeek = 2,\r\n\r\n        /// <summary>\r\n        /// Indicates time occuring past month.\r\n        /// </summary>\r\n        [Description(\"LOCInPast31Days\")]\r\n        PastMonth = 3,\r\n\r\n        /// <summary>\r\n        /// Indicates time occuring past year.\r\n        /// </summary>\r\n        [Description(\"LOCInPast365Days\")]\r\n        PastYear = 4,\r\n\r\n        /// <summary>\r\n        /// Indicates time occuring past year.\r\n        /// </summary>\r\n        [Description(\"LOCMoreThan365DaysAgo\")]\r\n        MoreThenYear = 5,\r\n\r\n        /// <summary>\r\n        /// Indicates time that never happened.\r\n        /// </summary>\r\n        [Description(\"LOCNever\")]\r\n        Never = 6\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/Platform.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Represents game's platform.\r\n    /// </summary>\r\n    public class Platform : DatabaseObject\r\n    {\r\n        private string specificationId;\r\n        /// <summary>\r\n        /// Gets or sets specification identifier.\r\n        /// </summary>\r\n        public string SpecificationId\r\n        {\r\n            get => specificationId;\r\n            set\r\n            {\r\n                specificationId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string icon;\r\n        /// <summary>\r\n        /// Gets or sets platform icon.\r\n        /// </summary>\r\n        public string Icon\r\n        {\r\n            get => icon;\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string cover;\r\n        /// <summary>\r\n        /// Gets or sets default game cover.\r\n        /// </summary>\r\n        public string Cover\r\n        {\r\n            get => cover;\r\n            set\r\n            {\r\n                cover = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string background;\r\n        /// <summary>\r\n        /// Gets or sets default game background image.\r\n        /// </summary>\r\n        public string Background\r\n        {\r\n            get => background;\r\n            set\r\n            {\r\n                background = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Platform.\r\n        /// </summary>\r\n        public Platform() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of Platform with specific name.\r\n        /// </summary>\r\n        /// <param name=\"name\">Platform name.</param>\r\n        public Platform(string name) : this()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty platform.\r\n        /// </summary>\r\n        public static readonly Platform Empty = new Platform { Id = Guid.Empty, Name = string.Empty };\r\n\r\n        /// <inheritdoc/>\r\n        public override void CopyDiffTo(object target)\r\n        {\r\n            base.CopyDiffTo(target);\r\n\r\n            if (target is Platform tro)\r\n            {\r\n                if (!string.Equals(Icon, tro.Icon, StringComparison.Ordinal))\r\n                {\r\n                    tro.Icon = Icon;\r\n                }\r\n\r\n                if (!string.Equals(Cover, tro.Cover, StringComparison.Ordinal))\r\n                {\r\n                    tro.Cover = Cover;\r\n                }\r\n\r\n                if (!string.Equals(Background, tro.Background, StringComparison.Ordinal))\r\n                {\r\n                    tro.Background = Background;\r\n                }\r\n\r\n                if (!string.Equals(SpecificationId, tro.SpecificationId, StringComparison.Ordinal))\r\n                {\r\n                    tro.SpecificationId = SpecificationId;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new ArgumentException($\"Target object has to be of type {GetType().Name}\");\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/PlaytimeCategory.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Specifies play time categories.\r\n    /// </summary>\r\n    public enum PlaytimeCategory : int\r\n    {\r\n        /// <summary>\r\n        /// Not playtime.\r\n        /// </summary>\r\n        [Description(\"LOCPlayedNone\")]\r\n        NotPlayed = 0,\r\n\r\n        /// <summary>\r\n        /// Less than an hour played.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytimeLessThenAnHour\")]\r\n        LessThenHour = 1,\r\n\r\n        /// <summary>\r\n        /// Played 1 to 10 hours.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytime1to10\")]\r\n        O1_10 = 2,\r\n\r\n        /// <summary>\r\n        /// Played 10 to 100 hours.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytime10to100\")]\r\n        O10_100 = 3,\r\n\r\n        /// <summary>\r\n        /// Played 100 to 500 hours.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytime100to500\")]\r\n        O100_500 = 4,\r\n\r\n        /// <summary>\r\n        /// Played 500 to 1000 hours.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytime500to1000\")]\r\n        O500_1000 = 5,\r\n\r\n        /// <summary>\r\n        /// Played more then 1000 hours.\r\n        /// </summary>\r\n        [Description(\"LOCPLaytime1000plus\")]\r\n        O1000plus = 6\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/Region.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Describes Region object.\r\n    /// </summary>\r\n    public class Region : DatabaseObject\r\n    {\r\n        private string specificationId;\r\n        /// <summary>\r\n        /// Gets or sets specification identifier.\r\n        /// </summary>\r\n        public string SpecificationId\r\n        {\r\n            get => specificationId;\r\n            set\r\n            {\r\n                specificationId = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Region\"/>.\r\n        /// </summary>\r\n        public Region() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Region\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Region(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty region.\r\n        /// </summary>\r\n        public static readonly Region Empty = new Region { Id = Guid.Empty, Name = string.Empty };\r\n\r\n        /// <inheritdoc/>\r\n        public override void CopyDiffTo(object target)\r\n        {\r\n            base.CopyDiffTo(target);\r\n\r\n            if (target is Region tro)\r\n            {\r\n                if (!string.Equals(SpecificationId, tro.SpecificationId, StringComparison.Ordinal))\r\n                {\r\n                    tro.SpecificationId = SpecificationId;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                throw new ArgumentException($\"Target object has to be of type {GetType().Name}\");\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/ReleaseDate.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Runtime.Serialization;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Represents game release date.\r\n    /// </summary>\r\n    [Serializable]\r\n    public struct ReleaseDate : IComparable, IComparable<ReleaseDate>, IEquatable<ReleaseDate>, ISerializable\r\n    {\r\n        private static readonly char[] serSplitter = new char[] { '-' };\r\n        /// <summary>\r\n        /// Gets DateTime representation of release date.\r\n        /// </summary>\r\n        public readonly DateTime Date;\r\n\r\n        /// <summary>\r\n        /// Gets empty representation of release date.\r\n        /// </summary>\r\n        public static readonly ReleaseDate Empty = new ReleaseDate(0);\r\n        /// <summary>\r\n        /// Gets release day.\r\n        /// </summary>\r\n        public int? Day { get; private set; }\r\n        /// <summary>\r\n        /// Gets release month.\r\n        /// </summary>\r\n        public int? Month { get; private set; }\r\n        /// <summary>\r\n        /// Gets release year.\r\n        /// </summary>\r\n        public int Year { get; private set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ReleaseDate\"/>.\r\n        /// </summary>\r\n        /// <param name=\"year\"></param>\r\n        public ReleaseDate(int year)\r\n        {\r\n            if (year == default(int))\r\n            {\r\n                Year = default(int);\r\n                Month = default(int?);\r\n                Day = default(int?);\r\n                Date = default(DateTime);\r\n            }\r\n            else\r\n            {\r\n                Year = year;\r\n                Day = null;\r\n                Month = null;\r\n                Date = new DateTime(year, 1, 1);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ReleaseDate\"/>.\r\n        /// </summary>\r\n        /// <param name=\"year\"></param>\r\n        /// <param name=\"month\"></param>\r\n        public ReleaseDate(int year, int month)\r\n        {\r\n            Year = year;\r\n            Month = month;\r\n            Day = null;\r\n            Date = new DateTime(year, month, 1);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ReleaseDate\"/>.\r\n        /// </summary>\r\n        /// <param name=\"year\"></param>\r\n        /// <param name=\"month\"></param>\r\n        /// <param name=\"day\"></param>\r\n        public ReleaseDate(int year, int month, int day)\r\n        {\r\n            Year = year;\r\n            Month = month;\r\n            Day = day;\r\n            Date = new DateTime(year, month, day);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ReleaseDate\"/>.\r\n        /// </summary>\r\n        /// <param name=\"dateTime\"></param>\r\n        public ReleaseDate(DateTime dateTime) : this(dateTime.Year, dateTime.Month, dateTime.Day)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ReleaseDate\"/>.\r\n        /// </summary>\r\n        /// <param name=\"info\"></param>\r\n        /// <param name=\"context\"></param>\r\n        public ReleaseDate(SerializationInfo info, StreamingContext context)\r\n        {\r\n            var serDate = Deserialize(info.GetString(nameof(ReleaseDate)));\r\n            Year = serDate.Year;\r\n            Month = serDate.Month;\r\n            Day = serDate.Day;\r\n            if (Year == default(int))\r\n            {\r\n                Date = default(DateTime);\r\n            }\r\n            else\r\n            {\r\n                Date = new DateTime(Year, Month ?? 1, Day ?? 1);\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public int CompareTo(object obj)\r\n        {\r\n            if (obj is ReleaseDate date)\r\n            {\r\n                return CompareTo(date);\r\n            }\r\n            else\r\n            {\r\n                return 1;\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public int CompareTo(ReleaseDate other)\r\n        {\r\n            return Date.CompareTo(other.Date);\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override bool Equals(object obj)\r\n        {\r\n            if (obj is ReleaseDate date)\r\n            {\r\n                return Equals(date);\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public bool Equals(ReleaseDate other)\r\n        {\r\n            return Day == other.Day &&\r\n                Month == other.Month &&\r\n                Year == other.Year;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public static bool operator ==(ReleaseDate obj1, ReleaseDate obj2)\r\n        {\r\n            return obj1.Equals(obj2);\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public static bool operator !=(ReleaseDate obj1, ReleaseDate obj2)\r\n        {\r\n            return !obj1.Equals(obj2);\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override int GetHashCode()\r\n        {\r\n            return Year.GetHashCode() ^\r\n                (Month ?? 0).GetHashCode() ^\r\n                (Day ?? 0).GetHashCode();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets release date serialized to a string.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public string Serialize()\r\n        {\r\n            if (Day != null)\r\n            {\r\n                return $\"{Year}-{Month}-{Day}\";\r\n            }\r\n            else if (Month != null)\r\n            {\r\n                return $\"{Year}-{Month}\";\r\n            }\r\n            else\r\n            {\r\n                return Year.ToString();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Try to deserialize string to a release date.\r\n        /// </summary>\r\n        /// <param name=\"stringDate\"></param>\r\n        /// <param name=\"date\"></param>\r\n        /// <returns></returns>\r\n        public static bool TryDeserialize(string stringDate, out ReleaseDate date)\r\n        {\r\n            if (string.IsNullOrEmpty(stringDate))\r\n            {\r\n                date = Empty;\r\n                return false;\r\n            }\r\n\r\n            var split = stringDate.Split(serSplitter);\r\n            if (split.Length == 3)\r\n            {\r\n                if (DateTime.TryParseExact(stringDate, \"yyyy-M-d\", CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsedDate))\r\n                {\r\n                    date = new ReleaseDate(parsedDate.Year, parsedDate.Month, parsedDate.Day);\r\n                    return true;\r\n                }\r\n            }\r\n            else if (split.Length == 2)\r\n            {\r\n                if (DateTime.TryParseExact(stringDate, \"yyyy-M\", CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsedDate))\r\n                {\r\n                    date = new ReleaseDate(parsedDate.Year, parsedDate.Month);\r\n                    return true;\r\n                }\r\n            }\r\n            else if (split.Length == 1)\r\n            {\r\n                if (DateTime.TryParseExact(stringDate, \"yyyy\", CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsedDate))\r\n                {\r\n                    date = new ReleaseDate(parsedDate.Year);\r\n                    return true;\r\n                }\r\n            }\r\n\r\n            date = Empty;\r\n            return false;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Deserialize string to release date.\r\n        /// </summary>\r\n        /// <param name=\"stringDate\"></param>\r\n        /// <returns></returns>\r\n        public static ReleaseDate Deserialize(string stringDate)\r\n        {\r\n            if (string.IsNullOrEmpty(stringDate))\r\n            {\r\n                throw new ArgumentNullException(nameof(stringDate));\r\n            }\r\n\r\n            var split = stringDate.Split(serSplitter);\r\n            if (split.Length == 3)\r\n            {\r\n                return new ReleaseDate(int.Parse(split[0]), int.Parse(split[1]), int.Parse(split[2]));\r\n            }\r\n            else if (split.Length == 2)\r\n            {\r\n                return new ReleaseDate(int.Parse(split[0]), int.Parse(split[1]));\r\n            }\r\n            else if (split.Length == 1)\r\n            {\r\n                return new ReleaseDate(int.Parse(split[0]));\r\n            }\r\n            else\r\n            {\r\n                throw new NotSupportedException(\"Uknown ReleaseDate string format.\");\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            if (Day != null)\r\n            {\r\n                return Date.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern);\r\n            }\r\n            else if (Month != null)\r\n            {\r\n                return Date.ToString(CultureInfo.CurrentCulture.DateTimeFormat.YearMonthPattern);\r\n            }\r\n            else\r\n            {\r\n                return Year.ToString();\r\n            }\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public void GetObjectData(SerializationInfo info, StreamingContext context)\r\n        {\r\n            info.AddValue(nameof(ReleaseDate), Serialize());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/ScoreGroup.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Specifies game score rating.\r\n    /// </summary>\r\n    public enum ScoreRating : int\r\n    {\r\n        /// <summary>\r\n        /// No score.\r\n        /// </summary>\r\n        None = 0,\r\n        /// <summary>\r\n        /// Negative rating.\r\n        /// </summary>\r\n        Negative = 1,\r\n        /// <summary>\r\n        /// Positive rating.\r\n        /// </summary>\r\n        Positive = 2,\r\n        /// <summary>\r\n        /// Mixed rating.\r\n        /// </summary>\r\n        Mixed = 3\r\n    }\r\n\r\n    /// <summary>\r\n    /// Specifies rating score groups.\r\n    /// </summary>\r\n    public enum ScoreGroup : int\r\n    {\r\n        /// <summary>\r\n        /// Score range from 0 to 10.\r\n        /// </summary>\r\n        [Description(\"0x\")]\r\n        O0x = 0,\r\n\r\n        /// <summary>\r\n        /// Score range from 10 to 20.\r\n        /// </summary>\r\n        [Description(\"1x\")]\r\n        O1x = 1,\r\n\r\n        /// <summary>\r\n        /// Score range from 20 to 30.\r\n        /// </summary>\r\n        [Description(\"2x\")]\r\n        O2x = 2,\r\n\r\n        /// <summary>\r\n        /// Score range from 30 to 40.\r\n        /// </summary>\r\n        [Description(\"3x\")]\r\n        O3x = 3,\r\n\r\n        /// <summary>\r\n        /// Score range from 40 to 50.\r\n        /// </summary>\r\n        [Description(\"4x\")]\r\n        O4x = 4,\r\n\r\n        /// <summary>\r\n        /// Score range from 50 to 60.\r\n        /// </summary>\r\n        [Description(\"5x\")]\r\n        O5x = 5,\r\n\r\n        /// <summary>\r\n        /// Score range from 60 to 70.\r\n        /// </summary>\r\n        [Description(\"6x\")]\r\n        O6x = 6,\r\n\r\n        /// <summary>\r\n        /// Score range from 70 to 80.\r\n        /// </summary>\r\n        [Description(\"7x\")]\r\n        O7x = 7,\r\n\r\n        /// <summary>\r\n        /// Score range from 80 to 90.\r\n        /// </summary>\r\n        [Description(\"8x\")]\r\n        O8x = 8,\r\n\r\n        /// <summary>\r\n        /// Score range from 90 to 100.\r\n        /// </summary>\r\n        [Description(\"9x\")]\r\n        O9x = 9,\r\n\r\n        /// <summary>\r\n        /// No score.\r\n        /// </summary>\r\n        [Description(\"LOCNone\")]\r\n        None = 10\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/Series.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Describes Series object.\r\n    /// </summary>\r\n    public class Series : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Series\"/>.\r\n        /// </summary>\r\n        public Series() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Series\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Series(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty series.\r\n        /// </summary>\r\n        public static readonly Series Empty = new Series { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Models/Tag.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Models\r\n{\r\n    /// <summary>\r\n    /// Describes Tag object.\r\n    /// </summary>\r\n    public class Tag : DatabaseObject\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Tag\"/>.\r\n        /// </summary>\r\n        public Tag() : base()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Tag\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        public Tag(string name) : base()\r\n        {\r\n            Name = name;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets empty tag.\r\n        /// </summary>\r\n        public static readonly Tag Empty = new Tag { Id = Guid.Empty, Name = string.Empty };\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Playnite.SDK.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{19BC9097-5705-4352-90E2-99F0C63230D0}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>Playnite.SDK</RootNamespace>\r\n    <AssemblyName>Playnite.SDK</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <DocumentationFile>bin\\Debug\\Playnite.SDK.xml</DocumentationFile>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <DocumentationFile>bin\\Release\\Playnite.SDK.xml</DocumentationFile>\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xaml\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"WindowsBase\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"ApplicationMode.cs\" />\r\n    <Compile Include=\"BuiltInExtensions.cs\" />\r\n    <Compile Include=\"Collections\\ComparableList.cs\" />\r\n    <Compile Include=\"Collections\\ObservableConcurrentDictionary.cs\" />\r\n    <Compile Include=\"Collections\\ObservableObject.cs\" />\r\n    <Compile Include=\"Collections\\RangeObservableCollection.cs\" />\r\n    <Compile Include=\"Controls\\PluginUserControl.cs\" />\r\n    <Compile Include=\"Database\\IGameDatabase.cs\" />\r\n    <Compile Include=\"Database\\IItemCollection.cs\" />\r\n    <Compile Include=\"Data\\MarkupConverter.cs\" />\r\n    <Compile Include=\"Data\\DataSerialization.cs\" />\r\n    <Compile Include=\"Data\\SQLite.cs\" />\r\n    <Compile Include=\"Extensions\\StringExtensions.cs\" />\r\n    <Compile Include=\"IEmulationAPI.cs\" />\r\n    <Compile Include=\"Events\\ApplicationEvents.cs\" />\r\n    <Compile Include=\"Events\\PlayniteUriEventArgs.cs\" />\r\n    <Compile Include=\"Events\\WebViewEvents.cs\" />\r\n    <Compile Include=\"Exceptions\\LocalizedException.cs\" />\r\n    <Compile Include=\"Exceptions\\ScriptRuntimeException.cs\" />\r\n    <Compile Include=\"Exceptions\\TypeMismatchException.cs\" />\r\n    <Compile Include=\"Exceptions\\ReferenceException.cs\" />\r\n    <Compile Include=\"Extensions\\ListExtensions.cs\" />\r\n    <Compile Include=\"IAddons.cs\" />\r\n    <Compile Include=\"IPlayniteSettingsAPI.cs\" />\r\n    <Compile Include=\"IUriHandlerAPI.cs\" />\r\n    <Compile Include=\"Models\\AgeRatingOrg.cs\" />\r\n    <Compile Include=\"Models\\AppSoftware.cs\" />\r\n    <Compile Include=\"Models\\FilterPreset.cs\" />\r\n    <Compile Include=\"Models\\GameRom.cs\" />\r\n    <Compile Include=\"Models\\GameScannerConfig.cs\" />\r\n    <Compile Include=\"Models\\IIdentifiable.cs\" />\r\n    <Compile Include=\"Models\\ImportExclusionList.cs\" />\r\n    <Compile Include=\"Models\\InstallationStatus.cs\" />\r\n    <Compile Include=\"Models\\InstallSizeGroup.cs\" />\r\n    <Compile Include=\"Models\\PastTimeSegment.cs\" />\r\n    <Compile Include=\"Models\\PlaytimeCategory.cs\" />\r\n    <Compile Include=\"Models\\ReleaseDate.cs\" />\r\n    <Compile Include=\"Models\\ScoreGroup.cs\" />\r\n    <Compile Include=\"Models\\GameFeature.cs\" />\r\n    <Compile Include=\"Plugins\\Actions.cs\" />\r\n    <Compile Include=\"Plugins\\MenuEntry.cs\" />\r\n    <Compile Include=\"Plugins\\MetadataPlugin.cs\" />\r\n    <Compile Include=\"Plugins\\Search.cs\" />\r\n    <Compile Include=\"Plugins\\SidebarItem.cs\" />\r\n    <Compile Include=\"Plugins\\TopPanelItem.cs\" />\r\n    <Compile Include=\"RelayCommand.cs\" />\r\n    <Compile Include=\"ResourceProvider.cs\" />\r\n    <Compile Include=\"ExpandableVariables.cs\" />\r\n    <Compile Include=\"IDialogsFactory.cs\" />\r\n    <Compile Include=\"ExtensionFunction.cs\" />\r\n    <Compile Include=\"Database\\IGameDatabaseAPI.cs\" />\r\n    <Compile Include=\"LibraryClient.cs\" />\r\n    <Compile Include=\"ILogger.cs\" />\r\n    <Compile Include=\"IMainViewAPI.cs\" />\r\n    <Compile Include=\"MetadataProvider.cs\" />\r\n    <Compile Include=\"INotificationsAPI.cs\" />\r\n    <Compile Include=\"IPlayniteAPI.cs\" />\r\n    <Compile Include=\"IPlayniteInfoAPI.cs\" />\r\n    <Compile Include=\"IPlaynitePathsAPI.cs\" />\r\n    <Compile Include=\"ISettings.cs\" />\r\n    <Compile Include=\"IWebView.cs\" />\r\n    <Compile Include=\"LogManager.cs\" />\r\n    <Compile Include=\"Models\\Region.cs\" />\r\n    <Compile Include=\"Models\\GameSource.cs\" />\r\n    <Compile Include=\"Models\\Category.cs\" />\r\n    <Compile Include=\"Models\\DatabaseObject.cs\" />\r\n    <Compile Include=\"Models\\Genre.cs\" />\r\n    <Compile Include=\"Models\\Company.cs\" />\r\n    <Compile Include=\"Models\\GameMetadata.cs\" />\r\n    <Compile Include=\"Models\\CompletionStatus.cs\" />\r\n    <Compile Include=\"Models\\Emulator.cs\" />\r\n    <Compile Include=\"Models\\Game.cs\" />\r\n    <Compile Include=\"Models\\GameAction.cs\" />\r\n    <Compile Include=\"Models\\Link.cs\" />\r\n    <Compile Include=\"Models\\Platform.cs\" />\r\n    <Compile Include=\"Models\\AgeRating.cs\" />\r\n    <Compile Include=\"Models\\Series.cs\" />\r\n    <Compile Include=\"Models\\Tag.cs\" />\r\n    <Compile Include=\"Plugins\\LibraryPlugin.cs\" />\r\n    <Compile Include=\"Plugins\\Plugin.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"SdkVersions.cs\" />\r\n    <Compile Include=\"WebViewModels.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\.editorconfig\">\r\n      <Link>.editorconfig</Link>\r\n    </None>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/PlayniteSDK/Plugins/Actions.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Plugins\r\n{\r\n    /// <summary>\r\n    /// Type of automatic play action\r\n    /// </summary>\r\n    public enum AutomaticPlayActionType : int\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        File = 0,\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        Url = 1\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents controller for automatic handling of game startup.\r\n    /// </summary>\r\n    public sealed class AutomaticPlayController : PlayController\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets task type.\r\n        /// </summary>\r\n        public AutomaticPlayActionType Type { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public TrackingMode TrackingMode { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string TrackingPath { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets executable arguments for File type tasks.\r\n        /// </summary>\r\n        public string Arguments { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets executable path for File action type or URL for URL action type.\r\n        /// </summary>\r\n        public string Path { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets working directory for File action type executable.\r\n        /// </summary>\r\n        public string WorkingDir { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets delay in milliseconds before tracking actually starts.\r\n        /// </summary>\r\n        public int InitialTrackingDelay { get; set; } = 0;\r\n\r\n        /// <summary>\r\n        /// Gets or sets tracking requency in milliseconds.\r\n        /// </summary>\r\n        public int TrackingFrequency { get; set; } = 2000;\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"game\"></param>\r\n        public AutomaticPlayController(Game game) : base(game)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        public override void Play(PlayActionArgs args)\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public abstract class ControllerBase : IDisposable\r\n    {\r\n        internal SynchronizationContext execContext;\r\n\r\n        /// <summary>\r\n        /// Gets or sets controller name.\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets game attached to a specific controller operation.\r\n        /// </summary>\r\n        public Game Game { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public ControllerBase(Game game)\r\n        {\r\n            execContext = SynchronizationContext.Current;\r\n            Game = game;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public virtual void Dispose()\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents installation controller.\r\n    /// </summary>\r\n    public abstract class InstallController : ControllerBase\r\n    {\r\n        internal event EventHandler<GameInstalledEventArgs> Installed;\r\n        internal event EventHandler<GameInstallationCancelledEventArgs> InstallCancelled;\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"InstallController\"/>.\r\n        /// </summary>\r\n        /// <param name=\"game\"></param>\r\n        public InstallController(Game game) : base(game)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Start installation.\r\n        /// </summary>\r\n        public abstract void Install(InstallActionArgs args);\r\n\r\n        /// <summary>\r\n        /// Invoke to signal that installation completed.\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        protected void InvokeOnInstalled(GameInstalledEventArgs args)\r\n        {\r\n            args.Source = this;\r\n            execContext.Send((a) => Installed?.Invoke(this, args), null);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Invoke to singal that installation was cancelled.\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        protected void InvokeOnInstallationCancelled(GameInstallationCancelledEventArgs args)\r\n        {\r\n            args.Source = this;\r\n            execContext.Send((a) => InstallCancelled?.Invoke(this, args), null);\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents uninstallation controller.\r\n    /// </summary>\r\n    public abstract class UninstallController : ControllerBase\r\n    {\r\n        internal event EventHandler<GameUninstalledEventArgs> Uninstalled;\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"UninstallController\"/>.\r\n        /// </summary>\r\n        /// <param name=\"game\"></param>\r\n        public UninstallController(Game game) : base(game)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Start uninstallation.\r\n        /// </summary>\r\n        public abstract void Uninstall(UninstallActionArgs args);\r\n\r\n        /// <summary>\r\n        /// Invoke to signal that uninstallation completed.\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        protected void InvokeOnUninstalled(GameUninstalledEventArgs args)\r\n        {\r\n            args.Source = this;\r\n            execContext.Send((a) => Uninstalled?.Invoke(this, args), null);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Invoke to signal that uninstallation completed.\r\n        /// </summary>\r\n        protected void InvokeOnUninstalled()\r\n        {\r\n            InvokeOnUninstalled(new GameUninstalledEventArgs());\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents play controller.\r\n    /// </summary>\r\n    public abstract class PlayController : ControllerBase\r\n    {\r\n        internal event EventHandler<GameStartedEventArgs> Started;\r\n        internal event EventHandler<GameStoppedEventArgs> Stopped;\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"PlayController\"/>.\r\n        /// </summary>\r\n        /// <param name=\"game\"></param>\r\n        public PlayController(Game game) : base(game)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Play game.\r\n        /// </summary>\r\n        public abstract void Play(PlayActionArgs args);\r\n\r\n        /// <summary>\r\n        /// Invoke to signal that game started running.\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        protected void InvokeOnStarted(GameStartedEventArgs args)\r\n        {\r\n            args.Source = this;\r\n            execContext.Send((a) => Started?.Invoke(this, args), null);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Invoke to signal that game started running.\r\n        /// </summary>\r\n        protected void InvokeOnStarted()\r\n        {\r\n            InvokeOnStarted(new GameStartedEventArgs());\r\n        }\r\n\r\n        /// <summary>\r\n        /// Invoke to signal that game stopped running.\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        protected void InvokeOnStopped(GameStoppedEventArgs args)\r\n        {\r\n            args.Source = this;\r\n            execContext.Send((a) => Stopped?.Invoke(this, args), null);\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name ?? base.ToString();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for installation action.\r\n    /// </summary>\r\n    public class InstallActionArgs\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public InstallActionArgs()\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for uninstallation actions.\r\n    /// </summary>\r\n    public class UninstallActionArgs\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public UninstallActionArgs()\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for play action.\r\n    /// </summary>\r\n    public class PlayActionArgs\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public PlayActionArgs()\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for game started event.\r\n    /// </summary>\r\n    public class GameStartedEventArgs\r\n    {\r\n        internal PlayController Source { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets started process ID.\r\n        /// </summary>\r\n        public int StartedProcessId { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public GameStartedEventArgs()\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for game stopped event.\r\n    /// </summary>\r\n    public class GameStoppedEventArgs\r\n    {\r\n        internal PlayController Source { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public ulong SessionLength { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public GameStoppedEventArgs()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"sessionLength\"></param>\r\n        public GameStoppedEventArgs(ulong sessionLength)\r\n        {\r\n            SessionLength = sessionLength;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for game uninstalled event.\r\n    /// </summary>\r\n    public class GameUninstalledEventArgs\r\n    {\r\n        internal UninstallController Source { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public GameUninstalledEventArgs()\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents data for game installation.\r\n    /// </summary>\r\n    public class GameInstallationData\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets installation directory.\r\n        /// </summary>\r\n        public string InstallDirectory { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets Roms.\r\n        /// </summary>\r\n        public List<GameRom> Roms { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for game installed event.\r\n    /// </summary>\r\n    public class GameInstalledEventArgs\r\n    {\r\n        internal InstallController Source { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets data for newly installed game.\r\n        /// </summary>\r\n        public GameInstallationData InstalledInfo { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public GameInstalledEventArgs()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"installData\"></param>\r\n        public GameInstalledEventArgs(GameInstallationData installData)\r\n        {\r\n            InstalledInfo = installData;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class GameInstallationCancelledEventArgs\r\n    {\r\n        internal InstallController Source { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public GameInstallationCancelledEventArgs()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Plugins/LibraryPlugin.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.SDK.Plugins\r\n{\r\n    /// <summary>\r\n    /// Represents arguments for <see cref=\"LibraryPlugin.GetGames(LibraryGetGamesArgs)\"/> method.\r\n    /// </summary>\r\n    public class LibraryGetGamesArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets cancellation token.\r\n        /// </summary>\r\n        public CancellationToken CancelToken { get; internal set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for <see cref=\"LibraryPlugin.ImportGames(LibraryImportGamesArgs)\"/> method.\r\n    /// </summary>\r\n    public class LibraryImportGamesArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets cancellation token.\r\n        /// </summary>\r\n        public CancellationToken CancelToken { get; internal set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents <see cref=\"LibraryPlugin\"/> plugin properties.\r\n    /// </summary>\r\n    public class LibraryPluginProperties : PluginProperties\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether plugin is capable of closing down original game client.\r\n        /// </summary>\r\n        public bool CanShutdownClient { get; set; } = false;\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicated whether plugin uses customized mechanism for game import.\r\n        /// </summary>\r\n        public bool HasCustomizedGameImport { get; set; } = false;\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents base game library plugin.\r\n    /// </summary>\r\n    public abstract class LibraryPlugin : Plugin\r\n    {\r\n        /// <summary>\r\n        /// Gets plugin's properties.\r\n        /// </summary>\r\n        public LibraryPluginProperties Properties { get; protected set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"LibraryPlugin\"/>.\r\n        /// </summary>\r\n        /// <param name=\"playniteAPI\"></param>\r\n        public LibraryPlugin(IPlayniteAPI playniteAPI) : base(playniteAPI)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets library name.\r\n        /// </summary>\r\n        public abstract string Name { get; }\r\n\r\n        /// <summary>\r\n        /// Gets library icon or null if no icon is available.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual string LibraryIcon { get; }\r\n\r\n        /// <summary>\r\n        /// Gets library background image or null if no background is available.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual string LibraryBackground { get; }\r\n\r\n        /// <summary>\r\n        /// Gets library client application or null if no client is associated with this library.\r\n        /// </summary>\r\n        public virtual LibraryClient Client { get; }\r\n\r\n        /// <summary>\r\n        /// Gets library games.\r\n        /// </summary>\r\n        /// <returns>List of library games.</returns>\r\n        public virtual IEnumerable<GameMetadata> GetGames(LibraryGetGamesArgs args)\r\n        {\r\n            return new List<GameMetadata>();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Initiates game import if \"HasCustomizedGameImport\" capability is enabled.\r\n        /// </summary>\r\n        /// <returns>List of newly imported games.</returns>\r\n        public virtual IEnumerable<Game> ImportGames(LibraryImportGamesArgs args)\r\n        {\r\n            return new List<Game>();\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets library metadata downloader or null if no metadata provider is available.\r\n        /// </summary>\r\n        /// <returns>Metadata downloader.</returns>\r\n        public virtual LibraryMetadataProvider GetMetadataDownloader()\r\n        {\r\n            return null;\r\n        }\r\n\r\n        ///<inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Name;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Plugins/MenuEntry.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Plugins\r\n{\r\n    /// <summary>\r\n    /// Represents base class for plugin menu item.\r\n    /// </summary>\r\n    public abstract class PluginMenuItem\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets menu item icon.\r\n        /// </summary>\r\n        public string Icon { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets menu item description.\r\n        /// </summary>\r\n        public string Description { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets menu item menu section.\r\n        /// </summary>\r\n        public string MenuSection { get; set; }\r\n\r\n        /// <inheritdoc/>\r\n        public override string ToString()\r\n        {\r\n            return Description ?? base.ToString();\r\n        }\r\n    }\r\n\r\n    #region Game menu\r\n\r\n    /// <summary>\r\n    /// Represents arguments object used when game menu item action is activated.\r\n    /// </summary>\r\n    public class GameMenuItemActionArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets source games.\r\n        /// </summary>\r\n        public List<Game> Games { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets source menu item.\r\n        /// </summary>\r\n        public GameMenuItem SourceItem { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments object used when game menu item action is activated.\r\n    /// </summary>\r\n    public class ScriptGameMenuItemActionArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets source games.\r\n        /// </summary>\r\n        public List<Game> Games { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets source menu item.\r\n        /// </summary>\r\n        public ScriptGameMenuItem SourceItem { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents game menu item.\r\n    /// </summary>\r\n    public class GameMenuItem : PluginMenuItem\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets action to be invoked when menu item is activated.\r\n        /// </summary>\r\n        public Action<GameMenuItemActionArgs> Action { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates game menu item from script game menu item.\r\n        /// </summary>\r\n        /// <param name=\"item\"></param>\r\n        /// <returns></returns>\r\n        public static GameMenuItem FromScriptGameMenuItem(ScriptGameMenuItem item)\r\n        {\r\n            return new GameMenuItem\r\n            {\r\n                Description = item.Description,\r\n                Icon = item.Icon,\r\n                MenuSection = item.MenuSection\r\n            };\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents script game menu item.\r\n    /// </summary>\r\n    public class ScriptGameMenuItem : PluginMenuItem\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets function to be executed when menu item is activated.\r\n        /// </summary>\r\n        public string FunctionName { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for getting game menu items.\r\n    /// </summary>\r\n    public class GetGameMenuItemsArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets source games for target menu items.\r\n        /// </summary>\r\n        public List<Game> Games { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether the request is for standard game menu or global search menu.\r\n        /// </summary>\r\n        public bool IsGlobalSearchRequest { get; set; } = false;\r\n    }\r\n\r\n    #endregion Game menu\r\n\r\n    #region Main menu\r\n\r\n    /// <summary>\r\n    /// Represents arguments object used when main menu item action is activated.\r\n    /// </summary>\r\n    public class ScriptMainMenuItemActionArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets source menu item.\r\n        /// </summary>\r\n        public ScriptMainMenuItem SourceItem { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments object used when main menu item action is activated.\r\n    /// </summary>\r\n    public class MainMenuItemActionArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets source menu item.\r\n        /// </summary>\r\n        public MainMenuItem SourceItem { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents main menu item.\r\n    /// </summary>\r\n    public class MainMenuItem : PluginMenuItem\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets action to be invoked when menu item is activated.\r\n        /// </summary>\r\n        public Action<MainMenuItemActionArgs> Action { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates main menu item from script main menu item.\r\n        /// </summary>\r\n        /// <param name=\"item\"></param>\r\n        /// <returns></returns>\r\n        public static MainMenuItem FromScriptMainMenuItem(ScriptMainMenuItem item)\r\n        {\r\n            return new MainMenuItem\r\n            {\r\n                Description = item.Description,\r\n                Icon = item.Icon,\r\n                MenuSection = item.MenuSection\r\n            };\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents script main menu item.\r\n    /// </summary>\r\n    public class ScriptMainMenuItem : PluginMenuItem\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets function to be executed when menu item is activated.\r\n        /// </summary>\r\n        public string FunctionName { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for getting main menu items.\r\n    /// </summary>\r\n    public class GetMainMenuItemsArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether the request is for standard main menu or global search menu.\r\n        /// </summary>\r\n        public bool IsGlobalSearchRequest { get; set; } = false;\r\n    }\r\n\r\n    #endregion Main menu\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Plugins/MetadataPlugin.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Plugins\r\n{\r\n    /// <summary>\r\n    /// Represents metadata game fields.\r\n    /// </summary>\r\n    public enum MetadataField\r\n    {\r\n        /// <summary>\r\n        /// Name can be provided.\r\n        /// </summary>\r\n        Name,\r\n        /// <summary>\r\n        /// Genres can be provided.\r\n        /// </summary>\r\n        Genres,\r\n        /// <summary>\r\n        /// Release Date can be provided.\r\n        /// </summary>\r\n        ReleaseDate,\r\n        /// <summary>\r\n        /// List of Developers can be provided.\r\n        /// </summary>\r\n        Developers,\r\n        /// <summary>\r\n        /// List of Publishers can be provided.\r\n        /// </summary>\r\n        Publishers,\r\n        /// <summary>\r\n        /// List of Tags can be provided.\r\n        /// </summary>\r\n        Tags,\r\n        /// <summary>\r\n        /// Description can be provided.\r\n        /// </summary>\r\n        Description,\r\n        /// <summary>\r\n        /// List of associated Links can be provided.\r\n        /// </summary>\r\n        Links,\r\n        /// <summary>\r\n        /// Critics Score can be provided.\r\n        /// </summary>\r\n        CriticScore,\r\n        /// <summary>\r\n        /// Community Score can be provided.\r\n        /// </summary>\r\n        CommunityScore,\r\n        /// <summary>\r\n        /// Icon can be provided.\r\n        /// </summary>\r\n        Icon,\r\n        /// <summary>\r\n        /// Cover Image can be provided.\r\n        /// </summary>\r\n        CoverImage,\r\n        /// <summary>\r\n        /// Background Image can be provided.\r\n        /// </summary>\r\n        BackgroundImage,\r\n        /// <summary>\r\n        /// List of Features can be provided.\r\n        /// </summary>\r\n        Features,\r\n        /// <summary>\r\n        /// Age Rating can be provided.\r\n        /// </summary>\r\n        AgeRating,\r\n        /// <summary>\r\n        /// Name of the Series can be provided.\r\n        /// </summary>\r\n        Series,\r\n        /// <summary>\r\n        /// Region can be provided.\r\n        /// </summary>\r\n        Region,\r\n        /// <summary>\r\n        /// Platform can be provided.\r\n        /// </summary>\r\n        Platform,\r\n        /// <summary>\r\n        /// Install Size can be provided.\r\n        /// </summary>\r\n        InstallSize\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents options for game metadata download.\r\n    /// </summary>\r\n    public class MetadataRequestOptions\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets game data being requested for.\r\n        /// </summary>\r\n        public Game GameData\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether the request is part of bulk metadata download.\r\n        /// </summary>\r\n        public bool IsBackgroundDownload\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"MetadataRequestOptions\"/>.\r\n        /// </summary>\r\n        /// <param name=\"gameData\"></param>\r\n        /// <param name=\"backgroundDownload\"></param>\r\n        public MetadataRequestOptions(Game gameData, bool backgroundDownload)\r\n        {\r\n            GameData = gameData;\r\n            IsBackgroundDownload = backgroundDownload;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents arguments for metadata field getters.\r\n    /// </summary>\r\n    public class GetMetadataFieldArgs\r\n    {\r\n        /// <summary>\r\n        /// Gets cancellation token.\r\n        /// </summary>\r\n        public CancellationToken CancelToken { get; internal set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents metadata class providing specific fields when requested.\r\n    /// </summary>\r\n    public abstract class OnDemandMetadataProvider : IDisposable\r\n    {\r\n        /// <summary>\r\n        /// Gets currently available fields.\r\n        /// </summary>\r\n        public abstract List<MetadataField> AvailableFields { get; }\r\n\r\n        /// <inheritdoc />\r\n        public virtual void Dispose()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets name.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual string GetName(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets genres.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<MetadataProperty> GetGenres(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets release date.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual ReleaseDate? GetReleaseDate(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets developers.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<MetadataProperty> GetDevelopers(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets publishers.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<MetadataProperty> GetPublishers(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets tags.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<MetadataProperty> GetTags(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets descriptions.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual string GetDescription(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets critic score.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual int? GetCriticScore(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets community score.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual int? GetCommunityScore(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets cover image.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual MetadataFile GetCoverImage(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets icon image.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual MetadataFile GetIcon(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets background image.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual MetadataFile GetBackgroundImage(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets links.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<Link> GetLinks(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets features.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<MetadataProperty> GetFeatures(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets age rating.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<MetadataProperty> GetAgeRatings(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets series.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<MetadataProperty> GetSeries(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets region.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<MetadataProperty> GetRegions(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets platform.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<MetadataProperty> GetPlatforms(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets install size.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual ulong? GetInstallSize(GetMetadataFieldArgs args)\r\n        {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents <see cref=\"MetadataPlugin\"/> plugin properties.\r\n    /// </summary>\r\n    public class MetadataPluginProperties : PluginProperties\r\n    {\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents plugin providing game metadata.\r\n    /// </summary>\r\n    public abstract class MetadataPlugin : Plugin\r\n    {\r\n        /// <summary>\r\n        /// Gets plugin's properties.\r\n        /// </summary>\r\n        public MetadataPluginProperties Properties { get; protected set; }\r\n\r\n        /// <summary>\r\n        /// Gets metadata source name.\r\n        /// </summary>\r\n        public abstract string Name { get; }\r\n\r\n        /// <summary>\r\n        /// Gets list of game fields this metadata provider can provide.\r\n        /// </summary>\r\n        public abstract List<MetadataField> SupportedFields { get; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"MetadataPlugin\"/>.\r\n        /// </summary>\r\n        /// <param name=\"playniteAPI\"></param>\r\n        public MetadataPlugin(IPlayniteAPI playniteAPI) : base(playniteAPI)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets metadata provider.\r\n        /// </summary>\r\n        /// <param name=\"options\"></param>\r\n        /// <returns></returns>\r\n        public abstract OnDemandMetadataProvider GetMetadataProvider(MetadataRequestOptions options);\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Plugins/Plugin.cs",
    "content": "﻿using Playnite.SDK.Data;\r\nusing Playnite.SDK.Events;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\n\r\nnamespace Playnite.SDK.Plugins\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class GetPlayActionsArgs\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public Game Game { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class GetInstallActionsArgs\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public Game Game { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class GetUninstallActionsArgs\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public Game Game { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// When used, specific plugin class will be loaded by Playnite.\r\n    /// </summary>\r\n    public class LoadPluginAttribute : Attribute\r\n    {\r\n    }\r\n\r\n    /// <summary>\r\n    /// When used, specific plugin class won't be loaded by Playnite.\r\n    /// </summary>\r\n    public class IgnorePluginAttribute : Attribute\r\n    {\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class GetGameViewControlArgs\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public ApplicationMode Mode { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class AddCustomElementSupportArgs\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public List<string> ElementList { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string SourceName { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class AddSettingsSupportArgs\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string SourceName { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string SettingsRoot { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class AddConvertersSupportArgs\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public List<IValueConverter> Converters { get; set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string SourceName { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents plugin properties.\r\n    /// </summary>\r\n    public abstract class PluginProperties\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets value indicating that the plugin provides user settings view.\r\n        /// </summary>\r\n        public bool HasSettings { get; set; }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents <see cref=\"GenericPlugin\"/> plugin properties.\r\n    /// </summary>\r\n    public class GenericPluginProperties : PluginProperties\r\n    {\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents generic plugin.\r\n    /// </summary>\r\n    public abstract class GenericPlugin : Plugin\r\n    {\r\n        /// <summary>\r\n        /// Gets plugin's properties.\r\n        /// </summary>\r\n        public GenericPluginProperties Properties { get; protected set; }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"playniteAPI\"></param>\r\n        public GenericPlugin(IPlayniteAPI playniteAPI) : base(playniteAPI)\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents base Playnite plugin.\r\n    /// </summary>\r\n    public abstract class Plugin : IDisposable, IIdentifiable\r\n    {\r\n        private const string pluginSettingFileName = \"config.json\";\r\n\r\n        /// <summary>\r\n        /// Gets or sets list of global searches.\r\n        /// </summary>\r\n        public List<SearchSupport> Searches { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets instance of runtime <see cref=\"IPlayniteAPI\"/>.\r\n        /// </summary>\r\n        public readonly IPlayniteAPI PlayniteApi;\r\n\r\n        /// <summary>\r\n        /// <inheritdoc/>\r\n        /// </summary>\r\n        public abstract Guid Id { get; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"Plugin\"/>.\r\n        /// </summary>\r\n        /// <param name=\"playniteAPI\">Instance of Playnite API to be injected.</param>\r\n        public Plugin(IPlayniteAPI playniteAPI)\r\n        {\r\n            PlayniteApi = playniteAPI;\r\n        }\r\n\r\n        /// <summary>\r\n        /// <inheritdoc/>\r\n        /// </summary>\r\n        public virtual void Dispose()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets plugin settings or null if plugin doesn't provide any settings.\r\n        /// </summary>\r\n        public virtual ISettings GetSettings(bool firstRunSettings)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets plugin settings view or null if plugin doesn't provide settings view.\r\n        /// </summary>\r\n        public virtual UserControl GetSettingsView(bool firstRunView)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called before game is started.\r\n        /// </summary>\r\n        public virtual void OnGameStarting(OnGameStartingEventArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when game has started.\r\n        /// </summary>\r\n        public virtual void OnGameStarted(OnGameStartedEventArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when game stopped running.\r\n        /// </summary>\r\n        public virtual void OnGameStopped(OnGameStoppedEventArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when game startup is cancelled.\r\n        /// </summary>\r\n        public virtual void OnGameStartupCancelled(OnGameStartupCancelledEventArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when game has been installed.\r\n        /// </summary>\r\n        public virtual void OnGameInstalled(OnGameInstalledEventArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when game installation has been cancelled.\r\n        /// </summary>\r\n        public virtual void OnGameInstallationCancelled(OnGameInstallationCancelledEventArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when game has been uninstalled.\r\n        /// </summary>\r\n        public virtual void OnGameUninstalled(OnGameUninstalledEventArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when game selection changed.\r\n        /// </summary>\r\n        public virtual void OnGameSelected(OnGameSelectedEventArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when appliaction is started and initialized.\r\n        /// </summary>\r\n        public virtual void OnApplicationStarted(OnApplicationStartedEventArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when appliaction is shutting down.\r\n        /// </summary>\r\n        public virtual void OnApplicationStopped(OnApplicationStoppedEventArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when library update has been finished.\r\n        /// </summary>\r\n        public virtual void OnLibraryUpdated(OnLibraryUpdatedEventArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when gamepad/controller button is pressed or released.\r\n        /// </summary>\r\n        public virtual void OnControllerButtonStateChanged(OnControllerButtonStateChangedArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when gamepad/controller button is pressed or released in Desktop mode.\r\n        /// </summary>\r\n        public virtual void OnDesktopControllerButtonStateChanged(OnControllerButtonStateChangedArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when gamepad/controller is connected.\r\n        /// </summary>\r\n        public virtual void OnControllerConnected(OnControllerConnectedArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when gamepad/controller is disconnected.\r\n        /// </summary>\r\n        public virtual void OnControllerDisconnected(OnControllerDisconnectedArgs args)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets list of items to be displayed in game's context menu.\r\n        /// </summary>\r\n        /// <param name=\"args\">Contextual arguments.</param>\r\n        /// <returns>List of menu items to be displayed in game menu.</returns>\r\n        public virtual IEnumerable<GameMenuItem> GetGameMenuItems(GetGameMenuItemsArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets list of items to be displayed in Playnite's main menu.\r\n        /// </summary>\r\n        /// <param name=\"args\">Contextual arguments.</param>\r\n        /// <returns>List of menu items to be displayed in Playnite's main menu.</returns>\r\n        public virtual IEnumerable<MainMenuItem> GetMainMenuItems(GetMainMenuItemsArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets path dedicated for plugins to store data.\r\n        /// </summary>\r\n        /// <returns>Full directory path.</returns>\r\n        public string GetPluginUserDataPath()\r\n        {\r\n            var path = Path.Combine(PlayniteApi.Paths.ExtensionsDataPath, Id.ToString());\r\n            if (!Directory.Exists(path))\r\n            {\r\n                Directory.CreateDirectory(path);\r\n            }\r\n\r\n            return path;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets plugin configuration stored in plugin.cfg file.\r\n        /// </summary>\r\n        /// <typeparam name=\"TConfig\">Plugin configuration type.</typeparam>\r\n        /// <returns>Plugin configuration.</returns>\r\n        public TConfig GetPluginConfiguration<TConfig>() where TConfig : class\r\n        {\r\n            var pluginDir = Path.GetDirectoryName(GetType().Assembly.Location);\r\n            var pluginConfig = Path.Combine(pluginDir, \"plugin.cfg\");\r\n            if (File.Exists(pluginConfig))\r\n            {\r\n                return Serialization.FromJsonFile<TConfig>(pluginConfig);\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets plugin settings.\r\n        /// </summary>\r\n        /// <typeparam name=\"TSettings\">Plugin settings type.</typeparam>\r\n        /// <returns>Plugin settings.</returns>\r\n        public TSettings LoadPluginSettings<TSettings>() where TSettings : class\r\n        {\r\n            var setFile = Path.Combine(GetPluginUserDataPath(), pluginSettingFileName);\r\n            if (File.Exists(setFile))\r\n            {\r\n                return Serialization.FromJsonFile<TSettings>(setFile);\r\n            }\r\n            else\r\n            {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Saves plugin settings.\r\n        /// </summary>\r\n        /// <typeparam name=\"TSettings\">Plugin settings type.</typeparam>\r\n        /// <param name=\"settings\">Source plugin.</param>\r\n        public void SavePluginSettings<TSettings>(TSettings settings) where TSettings : class\r\n        {\r\n            var setDir = GetPluginUserDataPath();\r\n            var setFile = Path.Combine(setDir, pluginSettingFileName);\r\n            if (!Directory.Exists(setDir))\r\n            {\r\n                Directory.CreateDirectory(setDir);\r\n            }\r\n\r\n            var strConf = Serialization.ToJson(settings, true);\r\n            File.WriteAllText(setFile, strConf);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Opens plugin's settings view. Only works in Desktop application mode!\r\n        /// </summary>\r\n        /// <returns>True if user saved any changes, False if dialog was canceled.</returns>\r\n        public bool OpenSettingsView()\r\n        {\r\n            if (PlayniteApi.ApplicationInfo.Mode == ApplicationMode.Fullscreen)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            return PlayniteApi.MainView.OpenPluginSettings(Id);\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<PlayController> GetPlayActions(GetPlayActionsArgs args)\r\n        {\r\n            yield break;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<InstallController> GetInstallActions(GetInstallActionsArgs args)\r\n        {\r\n            yield break;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<UninstallController> GetUninstallActions(GetUninstallActionsArgs args)\r\n        {\r\n            yield break;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        /// <returns></returns>\r\n        public virtual Control GetGameViewControl(GetGameViewControlArgs args)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        public void AddCustomElementSupport(AddCustomElementSupportArgs args)\r\n        {\r\n            PlayniteApi.AddCustomElementSupport(this, args);\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        public void AddSettingsSupport(AddSettingsSupportArgs args)\r\n        {\r\n            PlayniteApi.AddSettingsSupport(this, args);\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        public void AddConvertersSupport(AddConvertersSupportArgs args)\r\n        {\r\n            PlayniteApi.AddConvertersSupport(this, args);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets sidebar items provided by this plugin.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<SidebarItem> GetSidebarItems()\r\n        {\r\n            yield break;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets top panel items provided by this plugin.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<TopPanelItem> GetTopPanelItems()\r\n        {\r\n            yield break;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets items to be included in default global search.\r\n        /// </summary>\r\n        /// <returns></returns>\r\n        public virtual IEnumerable<SearchItem> GetSearchGlobalCommands()\r\n        {\r\n            yield break;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Plugins/Search.cs",
    "content": "﻿using Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Plugins\r\n{\r\n    /// <summary>\r\n    /// Represents plugin search support.\r\n    /// </summary>\r\n    public class SearchSupport\r\n    {\r\n        internal string Keyword { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets default keyword.\r\n        /// </summary>\r\n        public string DefaultKeyword { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets search name.\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets search context.\r\n        /// </summary>\r\n        public SearchContext Context { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"SearchSupport\"/>.\r\n        /// </summary>\r\n        /// <param name=\"defaultKeyword\"></param>\r\n        /// <param name=\"name\"></param>\r\n        /// <param name=\"context\"></param>\r\n        public SearchSupport(string defaultKeyword, string name, SearchContext context)\r\n        {\r\n            DefaultKeyword = defaultKeyword;\r\n            Name = name;\r\n            Context = context;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents search context.\r\n    /// </summary>\r\n    public abstract class SearchContext\r\n    {\r\n        internal List<SearchItem> AutoSearchCache { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets search description.\r\n        /// </summary>\r\n        public string Description { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets search hint.\r\n        /// </summary>\r\n        public string Hint { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets search label.\r\n        /// </summary>\r\n        public string Label { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets search delay in milliseconds.\r\n        /// </summary>\r\n        public int Delay { get; set; } = 0;\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether auto search should be used in this context.\r\n        /// </summary>\r\n        public bool UseAutoSearch { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether search results when using auto search should be cached and reused.\r\n        /// </summary>\r\n        public bool CacheAutoSearchResults { get; set; } = true;\r\n\r\n        /// <summary>\r\n        /// Gets search results.\r\n        /// </summary>\r\n        /// <param name=\"args\"></param>\r\n        /// <returns></returns>\r\n        public abstract IEnumerable<SearchItem> GetSearchResults(GetSearchResultsArgs args);\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents generic list with static items.\r\n    /// </summary>\r\n    public class GenericListSearchContext : SearchContext\r\n    {\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GenericListSearchContext\"/>.\r\n        /// </summary>\r\n        /// <param name=\"items\"></param>\r\n        /// <param name=\"label\"></param>\r\n        public GenericListSearchContext(List<SearchItem> items, string label)\r\n        {\r\n            Label = label.GetLocalized();\r\n            AutoSearchCache = items;\r\n            UseAutoSearch = true;\r\n        }\r\n\r\n        /// <inheritdoc/>\r\n        public sealed override IEnumerable<SearchItem> GetSearchResults(GetSearchResultsArgs args)\r\n        {\r\n            return AutoSearchCache;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents global search game filter.\r\n    /// </summary>\r\n    public class GameSearchFilterSettings : ObservableObject\r\n    {\r\n        private bool uninstalled = true;\r\n        private bool hidden = false;\r\n\r\n        /// <summary>\r\n        /// Gets or set value indicating whether uninstalled games should be included.\r\n        /// </summary>\r\n        public bool Uninstalled { get => uninstalled; set => SetValue(ref uninstalled, value); }\r\n\r\n        /// <summary>\r\n        /// Gets or set value indicating whether hidden games should be included.\r\n        /// </summary>\r\n        public bool Hidden { get => hidden; set => SetValue(ref hidden, value); }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents search request arguments.\r\n    /// </summary>\r\n    public class GetSearchResultsArgs\r\n    {\r\n        internal Action<SearchContext> SwitchContextAction { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets search term.\r\n        /// </summary>\r\n        public string SearchTerm { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Gets search cancellation token.\r\n        /// </summary>\r\n        public CancellationToken CancelToken { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Gets game filter.\r\n        /// </summary>\r\n        public GameSearchFilterSettings GameFilterSettings { get; internal set; }\r\n\r\n        /// <summary>\r\n        /// Switch to new search context.\r\n        /// </summary>\r\n        /// <param name=\"newContext\"></param>\r\n        public void SwitchContext(SearchContext newContext)\r\n        {\r\n            SwitchContextAction(newContext);\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents search item action.\r\n    /// </summary>\r\n    public class SearchItemAction\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets action name.\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets item's action.\r\n        /// </summary>\r\n        public Action Action { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets value indicating whether this action should close search window when executed.\r\n        /// </summary>\r\n        public bool CloseSearch { get; set; } = true;\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"SearchItemAction\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        /// <param name=\"action\"></param>\r\n        public SearchItemAction(string name, Action action)\r\n        {\r\n            Name = name.GetLocalized();\r\n            Action = action;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents search item action that switches to new context.\r\n    /// </summary>\r\n    public class ContextSwitchSearchItemAction : SearchItemAction\r\n    {\r\n        /// <summary>\r\n        /// Gets context to switch to when action is executed.\r\n        /// </summary>\r\n        public SearchContext Context { get; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ContextSwitchSearchItemAction\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        /// <param name=\"newContext\"></param>\r\n        public ContextSwitchSearchItemAction(string name, SearchContext newContext)\r\n            : base(name, null)\r\n        {\r\n            Context = newContext;\r\n            CloseSearch = false;\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents search item for global search results.\r\n    /// </summary>\r\n    public class SearchItem : ObservableObject\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets primary actions.\r\n        /// </summary>\r\n        public SearchItemAction PrimaryAction { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets secondary action.\r\n        /// </summary>\r\n        public SearchItemAction SecondaryAction { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets menu action context.\r\n        /// </summary>\r\n        public ContextSwitchSearchItemAction MenuAction { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets item icon.\r\n        /// </summary>\r\n        public object Icon { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets item name.\r\n        /// </summary>\r\n        public string Name { get; set; }\r\n\r\n        /// <summary>\r\n        /// Gets or sets item description.\r\n        /// </summary>\r\n        public string Description { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"SearchItem\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        /// <param name=\"primaryAction\"></param>\r\n        public SearchItem(string name, SearchItemAction primaryAction)\r\n        {\r\n            Name = name.GetLocalized();\r\n            PrimaryAction = primaryAction;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"SearchItem\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        /// <param name=\"primaryAction\"></param>\r\n        /// <param name=\"icon\"></param>\r\n        public SearchItem(string name, SearchItemAction primaryAction, object icon)\r\n            : this(name, primaryAction)\r\n        {\r\n            Icon = icon;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"SearchItem\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        /// <param name=\"primaryActionName\"></param>\r\n        /// <param name=\"primaryAction\"></param>\r\n        public SearchItem(string name, string primaryActionName, Action primaryAction)\r\n            : this(name, new SearchItemAction(primaryActionName, primaryAction))\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"SearchItem\"/>.\r\n        /// </summary>\r\n        /// <param name=\"name\"></param>\r\n        /// <param name=\"primaryActionName\"></param>\r\n        /// <param name=\"primaryAction\"></param>\r\n        /// <param name=\"icon\"></param>\r\n        public SearchItem(string name, string primaryActionName, Action primaryAction, object icon)\r\n            : this(name, new SearchItemAction(primaryActionName, primaryAction), icon)\r\n        {\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents game search item for global search results.\r\n    /// </summary>\r\n    public class GameSearchItem : SearchItem\r\n    {\r\n        /// <summary>\r\n        /// Gets associated game.\r\n        /// </summary>\r\n        public Game Game { get; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GameSearchItem\"/>.\r\n        /// </summary>\r\n        /// <param name=\"game\"></param>\r\n        /// <param name=\"primaryAction\"></param>\r\n        public GameSearchItem(Game game, SearchItemAction primaryAction)\r\n            : base(game.Name, primaryAction)\r\n        {\r\n            Game = game;\r\n        }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"GameSearchItem\"/>.\r\n        /// </summary>\r\n        /// <param name=\"game\"></param>\r\n        /// <param name=\"primaryActionName\"></param>\r\n        /// <param name=\"primaryAction\"></param>\r\n        public GameSearchItem(Game game, string primaryActionName, Action primaryAction)\r\n            : base(game.Name, primaryActionName, primaryAction)\r\n        {\r\n            Game = game;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Plugins/SidebarItem.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\n\r\nnamespace Playnite.SDK.Plugins\r\n{\r\n    /// <summary>\r\n    /// Sidebar item type.\r\n    /// </summary>\r\n    public enum SiderbarItemType\r\n    {\r\n        /// <summary>\r\n        /// Button item style.\r\n        /// </summary>\r\n        Button = 0,\r\n        /// <summary>\r\n        /// View item style.\r\n        /// </summary>\r\n        View = 1\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents sidebar API object.\r\n    /// </summary>\r\n    public class SidebarItem : ObservableObject\r\n    {\r\n        /// <summary>\r\n        /// Gets or sets item type.\r\n        /// </summary>\r\n        public SiderbarItemType Type { get; set; }\r\n\r\n        private object icon;\r\n        /// <summary>\r\n        /// Gets or sets item icon.\r\n        /// </summary>\r\n        public object Icon\r\n        {\r\n            get => icon;\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string title;\r\n        /// <summary>\r\n        /// Gets or sets item title.\r\n        /// </summary>\r\n        public string Title\r\n        {\r\n            get => title;\r\n            set\r\n            {\r\n                title = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool visible = true;\r\n        /// <summary>\r\n        /// Gets or sets item visibility.\r\n        /// </summary>\r\n        public bool Visible\r\n        {\r\n            get => visible;\r\n            set\r\n            {\r\n                visible = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double progressValue = 0;\r\n        /// <summary>\r\n        /// Gets or sets current progress value.\r\n        /// </summary>\r\n        public double ProgressValue\r\n        {\r\n            get => progressValue;\r\n            set\r\n            {\r\n                progressValue = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double progressMaximum = 100;\r\n        /// <summary>\r\n        /// Gets or sets maximum progress value.\r\n        /// </summary>\r\n        public double ProgressMaximum\r\n        {\r\n            get => progressMaximum;\r\n            set\r\n            {\r\n                progressMaximum = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private Thickness iconPadding = new Thickness(8);\r\n        /// <summary>\r\n        /// Gets or sets visual item padding.\r\n        /// </summary>\r\n        public Thickness IconPadding\r\n        {\r\n            get => iconPadding;\r\n            set\r\n            {\r\n                iconPadding = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when item is activated.\r\n        /// </summary>\r\n        public Action Activated { get; set; }\r\n\r\n        /// <summary>\r\n        /// Called when view is to be opened.\r\n        /// </summary>\r\n        /// <returns>View control to be shown.</returns>\r\n        public Func<Control> Opened { get; set; }\r\n\r\n        /// <summary>\r\n        /// Called when view is closed.\r\n        /// </summary>\r\n        public Action Closed { get; set; }\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"SidebarItem\"/>.\r\n        /// </summary>\r\n        public SidebarItem()\r\n        {\r\n            if (ResourceProvider.GetResource(\"SidebarItemPadding\") is Thickness thick)\r\n            {\r\n                iconPadding = thick;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Plugins/TopPanelItem.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK.Plugins\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class TopPanelItem : ObservableObject\r\n    {\r\n        private object icon;\r\n        /// <summary>\r\n        /// Gets or sets item icon.\r\n        /// </summary>\r\n        public object Icon\r\n        {\r\n            get => icon;\r\n            set\r\n            {\r\n                icon = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string title;\r\n        /// <summary>\r\n        /// Gets or sets item title.\r\n        /// </summary>\r\n        public string Title\r\n        {\r\n            get => title;\r\n            set\r\n            {\r\n                title = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool visible = true;\r\n        /// <summary>\r\n        /// Gets or sets item visibility.\r\n        /// </summary>\r\n        public bool Visible\r\n        {\r\n            get => visible;\r\n            set\r\n            {\r\n                visible = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Called when item is activated.\r\n        /// </summary>\r\n        public Action Activated { get; set; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\nusing System.Windows.Markup;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"Playnite SDK\")]\r\n[assembly: AssemblyDescription(\"Playnite Development Kit Library\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"Playnite\")]\r\n[assembly: AssemblyCopyright(\"Copyright © Josef Nemec 2020\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"19bc9097-5705-4352-90e2-99f0c63230d0\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"6.15.0.0\")]\r\n[assembly: AssemblyFileVersion(\"6.15.0.0\")]\r\n[assembly: InternalsVisibleTo(\"Playnite.DesktopApp\")]\r\n[assembly: InternalsVisibleTo(\"Playnite.FullscreenApp\")]\r\n[assembly: InternalsVisibleTo(\"Playnite.Tests\")]\r\n[assembly: InternalsVisibleTo(\"Playnite.DesktopApp.Tests\")]\r\n[assembly: InternalsVisibleTo(\"Playnite.FullscreenApp.Tests\")]\r\n[assembly: InternalsVisibleTo(\"Playnite\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.SDK.Models\")]\r\n[assembly: XmlnsDefinition(\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\", \"Playnite.SDK.Controls\")]"
  },
  {
    "path": "source/PlayniteSDK/RelayCommand.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Input;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public abstract class RelayCommandBase : ICommand\r\n    {\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public KeyGesture Gesture\r\n        {\r\n            get; set;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public string GestureText => Gesture?.GetDisplayStringForCulture(CultureInfo.CurrentUICulture);\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        public event EventHandler CanExecuteChanged\r\n        {\r\n            add { CommandManager.RequerySuggested += value; }\r\n            remove { CommandManager.RequerySuggested -= value; }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"parameter\"></param>\r\n        /// <returns></returns>\r\n        public abstract bool CanExecute(object parameter);\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"parameter\"></param>\r\n        public abstract void Execute(object parameter);\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    public class RelayCommand : RelayCommandBase\r\n    {\r\n        private readonly Func<bool> canExecute;\r\n        private readonly Action execute;\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"execute\"></param>\r\n        public RelayCommand(Action execute)\r\n            : this(execute, null, null)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"execute\"></param>\r\n        /// <param name=\"gesture\"></param>\r\n        public RelayCommand(Action execute, KeyGesture gesture)\r\n            : this(execute, null, gesture)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"execute\"></param>\r\n        /// <param name=\"canExecute\"></param>\r\n        public RelayCommand(Action execute, Func<bool> canExecute)\r\n            : this(execute, canExecute, null)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"execute\"></param>\r\n        /// <param name=\"canExecute\"></param>\r\n        /// <param name=\"gesture\"></param>\r\n        public RelayCommand(Action execute, Func<bool> canExecute, KeyGesture gesture)\r\n        {\r\n            this.execute = execute;\r\n            this.canExecute = canExecute;\r\n            Gesture = gesture;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"parameter\"></param>\r\n        /// <returns></returns>\r\n        public override bool CanExecute(object parameter = null)\r\n        {\r\n            if (canExecute == null)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            return canExecute();\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"parameter\"></param>\r\n        public override void Execute(object parameter = null)\r\n        {\r\n            execute();\r\n        }\r\n    }\r\n\r\n    /// <summary>\r\n    ///\r\n    /// </summary>\r\n    /// <typeparam name=\"T\"></typeparam>\r\n    public class RelayCommand<T> : RelayCommandBase\r\n    {\r\n        private readonly Predicate<T> canExecute;\r\n        private readonly Action<T> execute;\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"execute\"></param>\r\n        public RelayCommand(Action<T> execute)\r\n            : this(execute, null, null)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"execute\"></param>\r\n        /// <param name=\"gesture\"></param>\r\n        public RelayCommand(Action<T> execute, KeyGesture gesture)\r\n            : this(execute, null, gesture)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"execute\"></param>\r\n        /// <param name=\"canExecute\"></param>\r\n        public RelayCommand(Action<T> execute, Predicate<T> canExecute)\r\n            : this(execute, canExecute, null)\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"execute\"></param>\r\n        /// <param name=\"canExecute\"></param>\r\n        /// <param name=\"gesture\"></param>\r\n        public RelayCommand(Action<T> execute, Predicate<T> canExecute, KeyGesture gesture)\r\n        {\r\n            this.execute = execute;\r\n            this.canExecute = canExecute;\r\n            Gesture = gesture;\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"parameter\"></param>\r\n        /// <returns></returns>\r\n        public override bool CanExecute(object parameter)\r\n        {\r\n            if (canExecute == null)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            return canExecute((T)parameter);\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <param name=\"parameter\"></param>\r\n        public override void Execute(object parameter)\r\n        {\r\n            if (parameter is T param)\r\n            {\r\n                execute(param);\r\n            }\r\n            else\r\n            {\r\n                execute(default);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/ResourceProvider.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Describes application resource provider.\r\n    /// </summary>\r\n    public interface IResourceProvider\r\n    {\r\n        /// <summary>\r\n        /// Gets string resource.\r\n        /// </summary>\r\n        /// <param name=\"key\">Resource key.</param>\r\n        /// <returns>String resource.</returns>\r\n        string GetString(string key);\r\n\r\n        /// <summary>\r\n        /// Gets application resource.\r\n        /// </summary>\r\n        /// <param name=\"key\">Resource key.</param>\r\n        /// <returns>Application resource.</returns>\r\n        object GetResource(string key);\r\n    }\r\n\r\n    /// <summary>\r\n    /// Represents default resource provider.\r\n    /// </summary>\r\n    public class ResourceProvider : IResourceProvider\r\n    {\r\n        private static IResourceProvider staticProvider;\r\n\r\n        /// <summary>\r\n        /// Creates new instance of <see cref=\"ResourceProvider\"/>.\r\n        /// </summary>\r\n        public ResourceProvider()\r\n        {\r\n        }\r\n\r\n        string IResourceProvider.GetString(string key)\r\n        {\r\n            return GetString(key);\r\n        }\r\n\r\n        object IResourceProvider.GetResource(string key)\r\n        {\r\n            return GetResource(key);\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets string resource.\r\n        /// </summary>\r\n        /// <param name=\"key\">String resource key.</param>\r\n        /// <returns>String resource.</returns>\r\n        public static string GetString(string key)\r\n        {\r\n            if (staticProvider != null)\r\n            {\r\n                return staticProvider.GetString(key);\r\n            }\r\n            else\r\n            {\r\n                var resource = Application.Current?.TryFindResource(key);\r\n                return resource == null ? $\"<!{key}!>\" : resource as string;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        /// Gets application resource.\r\n        /// </summary>\r\n        /// <param name=\"key\">Resource key.</param>\r\n        /// <returns>Application resource.</returns>\r\n        public static object GetResource(string key)\r\n        {\r\n            if (staticProvider != null)\r\n            {\r\n                return staticProvider.GetResource(key);\r\n            }\r\n            else\r\n            {\r\n                return Application.Current?.TryFindResource(key);\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///\r\n        /// </summary>\r\n        /// <typeparam name=\"T\"></typeparam>\r\n        /// <param name=\"key\"></param>\r\n        /// <returns></returns>\r\n        public static T GetResource<T>(string key)\r\n        {\r\n            return (T)Application.Current?.TryFindResource(key);\r\n        }\r\n\r\n        internal static void SetGlobalProvider(IResourceProvider provider)\r\n        {\r\n            staticProvider = provider;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/SdkVersions.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    /// <summary>\r\n    /// Represents SDK version properties.\r\n    /// </summary>\r\n    public static class SdkVersions\r\n    {\r\n        /// <summary>\r\n        /// Gets SDK version.\r\n        /// </summary>\r\n        public static System.Version SDKVersion\r\n        {\r\n            get => System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/WebViewModels.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\r\n\r\nnamespace Playnite.SDK.WebViewModels\r\n{\r\n    //\r\n    // Summary:\r\n    //     Resource type for a request.\r\n    public enum ResourceType\r\n    {\r\n        //\r\n        // Summary:\r\n        //     Top level page.\r\n        MainFrame = 0,\r\n        //\r\n        // Summary:\r\n        //     Frame or iframe.\r\n        SubFrame = 1,\r\n        //\r\n        // Summary:\r\n        //     CSS stylesheet.\r\n        Stylesheet = 2,\r\n        //\r\n        // Summary:\r\n        //     External script.\r\n        Script = 3,\r\n        //\r\n        // Summary:\r\n        //     Image (jpg/gif/png/etc).\r\n        Image = 4,\r\n        //\r\n        // Summary:\r\n        //     Font.\r\n        FontResource = 5,\r\n        //\r\n        // Summary:\r\n        //     Some other subresource. This is the default type if the actual type is unknown.\r\n        SubResource = 6,\r\n        //\r\n        // Summary:\r\n        //     Object (or embed) tag for a plugin, or a resource that a plugin requested.\r\n        Object = 7,\r\n        //\r\n        // Summary:\r\n        //     Media resource.\r\n        Media = 8,\r\n        //\r\n        // Summary:\r\n        //     Main resource of a dedicated worker.\r\n        Worker = 9,\r\n        //\r\n        // Summary:\r\n        //     Main resource of a shared worker.\r\n        SharedWorker = 10,\r\n        //\r\n        // Summary:\r\n        //     Explicitly requested prefetch.\r\n        Prefetch = 11,\r\n        //\r\n        // Summary:\r\n        //     Favicon.\r\n        Favicon = 12,\r\n        //\r\n        // Summary:\r\n        //     XMLHttpRequest.\r\n        Xhr = 13,\r\n        //\r\n        // Summary:\r\n        //     A request for a ping\r\n        Ping = 14,\r\n        //\r\n        // Summary:\r\n        //     Main resource of a service worker.\r\n        ServiceWorker = 15,\r\n        //\r\n        // Summary:\r\n        //     A report of Content Security Policy violations.\r\n        CspReport = 16,\r\n        //\r\n        // Summary:\r\n        //     A resource that a plugin requested.\r\n        PluginResource = 17,\r\n        //\r\n        // Summary:\r\n        //     A main-frame service worker navigation preload request.\r\n        NavigationPreLoadMainFrame = 19,\r\n        //\r\n        // Summary:\r\n        //     A sub-frame service worker navigation preload request.\r\n        NavigationPreLoadSubFrame = 20\r\n    }\r\n\r\n    public class Request\r\n    {\r\n        //\r\n        // Summary:\r\n        //     Request Method GET/POST etc\r\n        public string Method { get; set; }\r\n        //\r\n        // Summary:\r\n        //     Header Collection - If dealing with headers that only contain a single value\r\n        //     then it's easier to use CefSharp.IRequest.SetHeaderByName(System.String,System.String,System.Boolean)\r\n        //     or CefSharp.IRequest.GetHeaderByName(System.String). You cannot modify the referrer\r\n        //     using headers, use CefSharp.IRequest.SetReferrer(System.String,CefSharp.ReferrerPolicy).\r\n        //     NOTE: This collection is a copy of the underlying type, to make changes, take\r\n        //     a reference to the collection, make your changes, then reassign the collection.\r\n        public Dictionary<string, string> Headers { get; set; }\r\n        //\r\n        // Summary:\r\n        //     Get the resource type for this request.\r\n        public ResourceType ResourceType { get; set; }\r\n        //\r\n        // Summary:\r\n        //     Get the referrer URL.\r\n        public string ReferrerUrl { get; set; }\r\n        //\r\n        // Summary:\r\n        //     Request Url\r\n        public string Url { get; set; }\r\n        //\r\n        // Summary:\r\n        //     Returns the globally unique identifier for this request or 0 if not specified.\r\n        //     Can be used by CefSharp.IRequestHandler implementations in the browser process\r\n        //     to track a single request across multiple callbacks.\r\n        public ulong Identifier { get; }\r\n    }\r\n\r\n    //\r\n    // Summary:\r\n    //     Class used to represent a web response. The methods of this class may be called\r\n    //     on any thread.\r\n    public class Response\r\n    {\r\n        //\r\n        // Summary:\r\n        //     Get/Set the response charset.\r\n        public string Charset { get; set; }\r\n        //\r\n        // Summary:\r\n        //     MimeType\r\n        public string MimeType { get; set; }\r\n        //\r\n        // Summary:\r\n        //     Response Headers\r\n        public Dictionary<string, string> Headers { get; set; }\r\n        //\r\n        // Summary:\r\n        //     The status code of the response. Unless set, the default value used is 200 (corresponding\r\n        //     to HTTP status OK).\r\n        public int StatusCode { get; set; }\r\n        //\r\n        // Summary:\r\n        //     Status Text\r\n        public string StatusText { get; set; }\r\n    }\r\n\r\n    //\r\n    // Summary:\r\n    //     Flags that represent CefURLRequest status.\r\n    public enum UrlRequestStatus\r\n    {\r\n        //\r\n        // Summary:\r\n        //     Unknown status.\r\n        Unknown = 0,\r\n        //\r\n        // Summary:\r\n        //     Request succeeded.\r\n        Success = 1,\r\n        //\r\n        // Summary:\r\n        //     An IO request is pending, and the caller will be informed when it is completed.\r\n        IoPending = 2,\r\n        //\r\n        // Summary:\r\n        //     Request was canceled programatically.\r\n        Canceled = 3,\r\n        //\r\n        // Summary:\r\n        //     Request failed for some reason.\r\n        Failed = 4\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/PlayniteSDK/readme.md",
    "content": "# Playnite SDK\r\n\r\nPlaynite SDK package is for development of plugins for [Playnite](https://github.com/JosefNemec/Playnite/issues) video game launcher and manager.\r\n\r\nDocumentation for how to use this package is available [here](https://playnite.link/docs/master/)."
  },
  {
    "path": "source/Tests/Playnite.DesktopApp.Tests/GamesEditorTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing NUnit.Framework;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite;\r\n\r\nnamespace Playnite.DesktopApp.Tests\r\n{\r\n    [TestFixture]\r\n    public class GamesEditorTests\r\n    {\r\n        [Test]\r\n        public void GetMultiGameEditObject_StandardTest()\r\n        {\r\n            var platId = Guid.NewGuid();\r\n            var genres = new List<Guid>\r\n            {\r\n                Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()\r\n            };\r\n\r\n            var developers = new List<Guid>\r\n            {\r\n                Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()\r\n            };\r\n\r\n            var publishers = new List<Guid>\r\n            {\r\n                Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()\r\n            };\r\n\r\n            var categories = new List<Guid>\r\n            {\r\n                Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()\r\n            };\r\n\r\n            var tags = new List<Guid>\r\n            {\r\n                Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()\r\n            };\r\n\r\n            var features = new List<Guid>\r\n            {\r\n                Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()\r\n            };\r\n\r\n            var series = new List<Guid>\r\n            {\r\n                Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()\r\n            };\r\n\r\n            var ratings = new List<Guid>\r\n            {\r\n                Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()\r\n            };\r\n\r\n            var regions = new List<Guid>\r\n            {\r\n                Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()\r\n            };\r\n\r\n            var sources = new List<Guid>\r\n            {\r\n                Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()\r\n            };\r\n\r\n            var completionStatuses = new List<Guid>\r\n            {\r\n                Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()\r\n            };\r\n\r\n            // All common\r\n            var gamesCommon = new List<Game>()\r\n            {\r\n                new Game()\r\n                {\r\n                    Name = \"Game\",\r\n                    GenreIds = new List<Guid>() { genres[0], genres[1], genres[2] },\r\n                    ReleaseDate = new ReleaseDate(2011,6,20),\r\n                    DeveloperIds = new List<Guid>() { developers[0], developers[1], developers[2] },\r\n                    PublisherIds = new List<Guid>() { publishers[0], publishers[1], publishers[2] },\r\n                    CategoryIds = new List<Guid>() { categories[0], categories[1], categories[2] },\r\n                    TagIds = new List<Guid>() { tags[0], tags[1], tags[2] },\r\n                    FeatureIds = new List<Guid>() { tags[0], tags[1], tags[2] },\r\n                    Description = \"Description\",\r\n                    PlatformIds = new List<Guid>{ platId },\r\n                    LastActivity = new DateTime(2012,1,3),\r\n                    Added = new DateTime(2012,1,3),\r\n                    Playtime = 3,\r\n                    PlayCount = 3,\r\n                    InstallSize = 24354657,\r\n                    SeriesIds = new List<Guid>{ series[0] },\r\n                    Version = \"Version 3\",\r\n                    AgeRatingIds = new List<Guid>{ ratings[0] },\r\n                    RegionIds = new List<Guid>{ regions[0] },\r\n                    SourceId = sources[0],\r\n                    CompletionStatusId = completionStatuses[0],\r\n                    UserScore = 1,\r\n                    CriticScore = 2,\r\n                    CommunityScore = 99,\r\n                    Favorite = false,\r\n                    Hidden = true\r\n                },\r\n                new Game()\r\n                {\r\n                    Name = \"Game\",\r\n                    ReleaseDate = new ReleaseDate(2011,6,20),\r\n                    GenreIds = new List<Guid>() { genres[0], genres[1], genres[2] },\r\n                    DeveloperIds = new List<Guid>() { developers[0], developers[1], developers[2] },\r\n                    PublisherIds = new List<Guid>() { publishers[0], publishers[1], publishers[2] },\r\n                    CategoryIds = new List<Guid>() { categories[0], categories[1], categories[2] },\r\n                    TagIds = new List<Guid>() { tags[0], tags[1], tags[2] },\r\n                    FeatureIds = new List<Guid>() { tags[0], tags[1], tags[2] },\r\n                    SeriesIds = new List<Guid>{ series[0] },\r\n                    AgeRatingIds = new List<Guid>{ ratings[0] },\r\n                    RegionIds = new List<Guid>{ regions[0] },\r\n                    SourceId = sources[0],\r\n                    Description = \"Description\",\r\n                    PlatformIds = new List<Guid>{ platId },\r\n                    LastActivity = new DateTime(2012,1,3),\r\n                    Added = new DateTime(2012,1,3),\r\n                    Playtime = 3,\r\n                    PlayCount = 3,\r\n                    InstallSize = 24354657,\r\n                    Version = \"Version 3\",\r\n                    CompletionStatusId = completionStatuses[0],\r\n                    UserScore = 1,\r\n                    CriticScore = 2,\r\n                    CommunityScore = 99,\r\n                    Favorite = false,\r\n                    Hidden = true\r\n                },\r\n                new Game()\r\n                {\r\n                    Name = \"Game\",\r\n                    GenreIds = new List<Guid>() { genres[0], genres[1], genres[2] },\r\n                    ReleaseDate = new ReleaseDate(2011,6,20),\r\n                    DeveloperIds = new List<Guid>() { developers[0], developers[1], developers[2] },\r\n                    PublisherIds = new List<Guid>() { publishers[0], publishers[1], publishers[2] },\r\n                    CategoryIds = new List<Guid>() { categories[0], categories[1], categories[2] },\r\n                    TagIds = new List<Guid>() { tags[0], tags[1], tags[2] },\r\n                    FeatureIds = new List<Guid>() { tags[0], tags[1], tags[2] },\r\n                    Description = \"Description\",\r\n                    PlatformIds = new List<Guid>{ platId },\r\n                    LastActivity = new DateTime(2012,1,3),\r\n                    Added = new DateTime(2012,1,3),\r\n                    Playtime = 3,\r\n                    PlayCount = 3,\r\n                    InstallSize = 24354657,\r\n                    SeriesIds = new List<Guid>{ series[0] },\r\n                    Version = \"Version 3\",\r\n                    AgeRatingIds = new List<Guid>{ ratings[0] },\r\n                    RegionIds = new List<Guid>{ regions[0] },\r\n                    SourceId = sources[0],\r\n                    CompletionStatusId = completionStatuses[0],\r\n                    UserScore = 1,\r\n                    CriticScore = 2,\r\n                    CommunityScore = 99,\r\n                    Favorite = false,\r\n                    Hidden = true\r\n                }\r\n            };\r\n\r\n            var gameCommon = GameTools.GetMultiGameEditObject(gamesCommon);\r\n            var firstGame = gamesCommon.First();\r\n            Assert.AreEqual(firstGame.Name, gameCommon.Name);\r\n            CollectionAssert.AreEqual(firstGame.GenreIds, gameCommon.GenreIds);\r\n            Assert.AreEqual(firstGame.ReleaseDate, gameCommon.ReleaseDate);\r\n            CollectionAssert.AreEqual(firstGame.DeveloperIds, gameCommon.DeveloperIds);\r\n            CollectionAssert.AreEqual(firstGame.PublisherIds, gameCommon.PublisherIds);\r\n            CollectionAssert.AreEqual(firstGame.CategoryIds, gameCommon.CategoryIds);\r\n            CollectionAssert.AreEqual(firstGame.TagIds, gameCommon.TagIds);\r\n            CollectionAssert.AreEqual(firstGame.FeatureIds, gameCommon.FeatureIds);\r\n            Assert.AreEqual(firstGame.Description, gameCommon.Description);\r\n            CollectionAssert.AreEqual(firstGame.PlatformIds, gameCommon.PlatformIds);\r\n            Assert.AreEqual(firstGame.LastActivity, gameCommon.LastActivity);\r\n            Assert.AreEqual(firstGame.Added, gameCommon.Added);\r\n            Assert.AreEqual(firstGame.Playtime, gameCommon.Playtime);\r\n            Assert.AreEqual(firstGame.PlayCount, gameCommon.PlayCount);\r\n            Assert.AreEqual(firstGame.InstallSize, gameCommon.InstallSize);\r\n            CollectionAssert.AreEqual(firstGame.SeriesIds, gameCommon.SeriesIds);\r\n            Assert.AreEqual(firstGame.Version, gameCommon.Version);\r\n            CollectionAssert.AreEqual(firstGame.AgeRatingIds, gameCommon.AgeRatingIds);\r\n            CollectionAssert.AreEqual(firstGame.RegionIds, gameCommon.RegionIds);\r\n            Assert.AreEqual(firstGame.SourceId, gameCommon.SourceId);\r\n            Assert.AreEqual(firstGame.CompletionStatusId, gameCommon.CompletionStatusId);\r\n            Assert.AreEqual(firstGame.UserScore, gameCommon.UserScore);\r\n            Assert.AreEqual(firstGame.CriticScore, gameCommon.CriticScore);\r\n            Assert.AreEqual(firstGame.CommunityScore, gameCommon.CommunityScore);\r\n            Assert.AreEqual(firstGame.Favorite, gameCommon.Favorite);\r\n            Assert.AreEqual(firstGame.Hidden, gameCommon.Hidden);\r\n\r\n            // No common\r\n            var gamesNoCommon = new List<Game>()\r\n            {\r\n                new Game()\r\n                {\r\n                    Name = \"Game 1\",\r\n                    ReleaseDate = new ReleaseDate(2011,6,20),\r\n                    GenreIds = new List<Guid>() { genres[0], genres[1], genres[2] },\r\n                    DeveloperIds = new List<Guid>() { developers[0], developers[1], developers[2] },\r\n                    PublisherIds = new List<Guid>() { publishers[0], publishers[1], publishers[2] },\r\n                    CategoryIds = new List<Guid>() { categories[0], categories[1], categories[2] },\r\n                    TagIds = new List<Guid>() { tags[0], tags[1], tags[2] },\r\n                    FeatureIds = new List<Guid>() { tags[0], tags[1], tags[2] },\r\n                    SeriesIds = new List<Guid>{ series[0] },\r\n                    AgeRatingIds = new List<Guid>{ ratings[0] },\r\n                    RegionIds = new List<Guid>{ regions[0] },\r\n                    SourceId = sources[0],\r\n                    Description = \"Description 1\",\r\n                    PlatformIds = new List<Guid>{ Guid.NewGuid() },\r\n                    LastActivity = new DateTime(2012,1,1),\r\n                    Added = new DateTime(2012,1,1),\r\n                    Playtime = 1,\r\n                    PlayCount = 1,\r\n                    InstallSize = 34354657,\r\n                    Version = \"Version 1\",\r\n                    CompletionStatusId = completionStatuses[0],\r\n                    UserScore = 1,\r\n                    CriticScore = 1,\r\n                    CommunityScore = 1,\r\n                    Favorite = false,\r\n                    Hidden = true\r\n                },\r\n                new Game()\r\n                {\r\n                    Name = \"Game 2\",\r\n                    GenreIds = new List<Guid>() { genres[3], genres[4], genres[5] },\r\n                    DeveloperIds = new List<Guid>() { developers[3], developers[4], developers[5] },\r\n                    PublisherIds = new List<Guid>() { publishers[3], publishers[4], publishers[5] },\r\n                    CategoryIds = new List<Guid>() { categories[3], categories[4], categories[5] },\r\n                    TagIds = new List<Guid>() { tags[3], tags[4], tags[5] },\r\n                    FeatureIds = new List<Guid>() { tags[3], tags[4], tags[5] },\r\n                    SeriesIds = new List<Guid>{ series[1] },\r\n                    AgeRatingIds = new List<Guid>{ ratings[1] },\r\n                    RegionIds = new List<Guid>{ regions[1] },\r\n                    SourceId = sources[1],\r\n                    ReleaseDate = new ReleaseDate(2012,6,20),\r\n                    Description = \"Description 2\",\r\n                    PlatformIds = new List<Guid>{ Guid.NewGuid() },\r\n                    LastActivity = new DateTime(2012,1,2),\r\n                    Added = new DateTime(2012,1,2),\r\n                    Playtime = 2,\r\n                    PlayCount = 2,\r\n                    InstallSize = 44354657,\r\n                    Version = \"Version 2\",\r\n                    CompletionStatusId = completionStatuses[1],\r\n                    UserScore = 2,\r\n                    CriticScore = 2,\r\n                    CommunityScore = 2,\r\n                    Favorite = true,\r\n                    Hidden = false\r\n                },\r\n                new Game()\r\n                {\r\n                    Name = \"Game 3\",\r\n                    GenreIds = new List<Guid>() { genres[6], genres[7], genres[8] },\r\n                    DeveloperIds = new List<Guid>() { developers[6], developers[7], developers[8] },\r\n                    PublisherIds = new List<Guid>() { publishers[6], publishers[7], publishers[8] },\r\n                    CategoryIds = new List<Guid>() { categories[6], categories[7], categories[8] },\r\n                    TagIds = new List<Guid>() { tags[6], tags[7], tags[8] },\r\n                    FeatureIds = new List<Guid>() { tags[6], tags[7], tags[8] },\r\n                    SeriesIds = new List<Guid>{ series[2] },\r\n                    AgeRatingIds = new List<Guid>{ ratings[2] },\r\n                    RegionIds = new List<Guid>{ regions[2] },\r\n                    SourceId = sources[2],\r\n                    ReleaseDate = new ReleaseDate(2013,6,20),\r\n                    Description = \"Description 3\",\r\n                    PlatformIds = new List<Guid>{ Guid.NewGuid() },\r\n                    LastActivity = new DateTime(2012,1,3),\r\n                    Added = new DateTime(2012,1,3),\r\n                    Playtime = 3,\r\n                    PlayCount = 3,\r\n                    InstallSize = 24354657,\r\n                    Version = \"Version 3\",\r\n                    CompletionStatusId = completionStatuses[2],\r\n                    UserScore = 3,\r\n                    CriticScore = 3,\r\n                    CommunityScore = 3,\r\n                    Favorite = false,\r\n                    Hidden = false\r\n                }\r\n            };\r\n\r\n            var gameNoCommon = GameTools.GetMultiGameEditObject(gamesNoCommon);\r\n            Assert.IsNull(gameNoCommon.Name);\r\n            Assert.IsNull(gameNoCommon.ReleaseDate);\r\n            Assert.IsNull(gameNoCommon.Description);\r\n            CollectionAssert.IsEmpty(gameNoCommon.PlatformIds);\r\n            CollectionAssert.IsEmpty(gameNoCommon.GenreIds);\r\n            CollectionAssert.IsEmpty(gameNoCommon.DeveloperIds);\r\n            CollectionAssert.IsEmpty(gameNoCommon.PublisherIds);\r\n            CollectionAssert.IsEmpty(gameNoCommon.CategoryIds);\r\n            CollectionAssert.IsEmpty(gameNoCommon.TagIds);\r\n            CollectionAssert.IsEmpty(gameNoCommon.FeatureIds);\r\n            Assert.IsNull(gameNoCommon.LastActivity);\r\n            Assert.IsNull(gameNoCommon.Added);\r\n            Assert.AreEqual(gameNoCommon.Playtime, 0);\r\n            Assert.AreEqual(gameNoCommon.PlayCount, 0);\r\n            CollectionAssert.IsEmpty(gameNoCommon.SeriesIds);\r\n            Assert.IsNull(gameNoCommon.Version);\r\n            CollectionAssert.IsEmpty(gameNoCommon.AgeRatingIds);\r\n            CollectionAssert.IsEmpty(gameNoCommon.RegionIds);\r\n            Assert.AreEqual(Guid.Empty, gameNoCommon.SourceId);\r\n            Assert.AreEqual(Guid.Empty, gameNoCommon.CompletionStatusId);\r\n            Assert.IsNull(gameNoCommon.InstallSize);\r\n            Assert.IsNull(gameNoCommon.UserScore);\r\n            Assert.IsNull(gameNoCommon.CriticScore);\r\n            Assert.IsNull(gameNoCommon.CommunityScore);\r\n            Assert.IsFalse(gameNoCommon.Hidden);\r\n            Assert.IsFalse(gameNoCommon.Favorite);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.DesktopApp.Tests/MainViewAPITests.cs",
    "content": "﻿using Moq;\r\nusing NUnit.Framework;\r\nusing Playnite.Database;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp.Tests\r\n{\r\n    [TestFixture]\r\n    public class MainViewAPITests\r\n    {\r\n        [Test]\r\n        public void ViewSettingsTest()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.DesktopApp.Tests/Playnite.DesktopApp.Tests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props\" Condition=\"Exists('..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props')\" />\r\n  <Import Project=\"..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props\" Condition=\"Exists('..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props')\" />\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{CAA480E1-7AB2-4DA9-980F-6F935AB7FA69}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>Playnite.DesktopApp.Tests</RootNamespace>\r\n    <AssemblyName>Playnite.DesktopApp.Tests</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">15.0</VisualStudioVersion>\r\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\r\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\r\n    <IsCodedUITest>False</IsCodedUITest>\r\n    <TestProjectType>UnitTest</TestProjectType>\r\n    <NuGetPackageImportStamp>\r\n    </NuGetPackageImportStamp>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\r\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\Castle.Core.4.3.1\\lib\\net45\\Castle.Core.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Moq, Version=4.10.0.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\Moq.4.10.1\\lib\\net45\\Moq.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"nunit.framework, Version=3.13.2.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\NUnit.3.13.2\\lib\\net45\\nunit.framework.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Configuration\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Runtime.CompilerServices.Unsafe, Version=4.0.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\System.Runtime.CompilerServices.Unsafe.4.5.0\\lib\\netstandard2.0\\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\System.Threading.Tasks.Extensions.4.5.1\\lib\\netstandard2.0\\System.Threading.Tasks.Extensions.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"GamesEditorTests.cs\" />\r\n    <Compile Include=\"MainViewAPITests.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"SkinsTests.cs\" />\r\n    <Compile Include=\"TestsSetupClass.cs\" />\r\n    <Compile Include=\"ViewModels\\DatabaseFieldsManagerViewModelTests.cs\" />\r\n    <Compile Include=\"ViewModels\\GameEditViewModelTests.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"app.config\" />\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\..\\Playnite.DesktopApp\\Playnite.DesktopApp.csproj\">\r\n      <Project>{26dcc539-e67f-4cb5-970f-f02c1f5c6e00}</Project>\r\n      <Name>Playnite.DesktopApp</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\..\\PlayniteSDK\\Playnite.SDK.csproj\">\r\n      <Project>{19bc9097-5705-4352-90e2-99f0c63230d0}</Project>\r\n      <Name>Playnite.SDK</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\..\\Playnite\\Playnite.csproj\">\r\n      <Project>{AD271E73-8A13-4C4E-BFDC-3076646B59E3}</Project>\r\n      <Name>Playnite</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\Playnite.Tests\\Playnite.Tests.csproj\">\r\n      <Project>{f15b7d48-7f9c-406a-825c-b47bb9a5bf4b}</Project>\r\n      <Name>Playnite.Tests</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\r\n    <PropertyGroup>\r\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\r\n    </PropertyGroup>\r\n    <Error Condition=\"!Exists('..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props'))\" />\r\n    <Error Condition=\"!Exists('..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props'))\" />\r\n  </Target>\r\n</Project>"
  },
  {
    "path": "source/Tests/Playnite.DesktopApp.Tests/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n[assembly: AssemblyTitle(\"Playnite.DesktopApp.Tests\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"Playnite.DesktopApp.Tests\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2019\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n[assembly: ComVisible(false)]\r\n\r\n[assembly: Guid(\"caa480e1-7ab2-4da9-980f-6f935ab7fa69\")]\r\n\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "source/Tests/Playnite.DesktopApp.Tests/SkinsTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.SDK;\r\n\r\nnamespace Playnite.DesktopApp.Tests\r\n{\r\n    [TestFixture]\r\n    public class SkinsTests\r\n    {\r\n        [Test]\r\n        public void AvailableSkinsTest()\r\n        {\r\n            CollectionAssert.IsNotEmpty(ThemeManager.GetAvailableThemes(ApplicationMode.Desktop));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.DesktopApp.Tests/TestsSetupClass.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing Playnite.Tests;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Tests\r\n{\r\n    [SetUpFixture]\r\n    public class TestsSetupClass\r\n    {\r\n        [OneTimeSetUp]\r\n        public void GlobalSetup()\r\n        {\r\n            PlayniteTests.SetEntryAssembly(Assembly.GetExecutingAssembly());\r\n            Playnite.Tests.TestsSetupClass.OneTimeSetUp();\r\n        }\r\n\r\n        [OneTimeTearDown]\r\n        public void GlobalTeardown()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.DesktopApp.Tests/ViewModels/DatabaseFieldsManagerViewModelTests.cs",
    "content": "﻿using Moq;\r\nusing NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Tests;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.DesktopApp.Tests.ViewModels\r\n{\r\n    [TestFixture]\r\n    public class DatabaseFieldsManagerViewModelTests\r\n    {\r\n        [Test]\r\n        public void StandardListUpdateTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                var cats = new List<Category>\r\n                {\r\n                    new Category(\"Test1\"),\r\n                    new Category(\"Test2\"),\r\n                    new Category(\"Test3\")\r\n                };\r\n\r\n                db.Categories.Add(cats);\r\n                var vm = new DatabaseFieldsManagerViewModel(db, new Mock<IWindowFactory>().Object, null, null);\r\n                vm.EditingCategories[0].Name = \"Test4\";\r\n                vm.EditingCategories.Add(new Category(\"Test5\"));\r\n                vm.EditingCategories.Add(new Category(\"Test6\"));\r\n                vm.EditingCategories.RemoveAt(2);\r\n                vm.SaveChanges();\r\n\r\n                Assert.AreEqual(4, db.Categories.Count);\r\n                Assert.AreEqual(\"Test4\", db.Categories[cats[0].Id].Name);\r\n                Assert.IsNotNull(db.Categories.First(a => a.Name == \"Test2\"));\r\n                Assert.IsNotNull(db.Categories.First(a => a.Name == \"Test5\"));\r\n                Assert.IsNotNull(db.Categories.First(a => a.Name == \"Test6\"));\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void PlatformsUpdateTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                db.Platforms.Remove(db.Platforms);\r\n\r\n                var plats = new List<Platform>\r\n                {\r\n                    new Platform(\"Test1\"),\r\n                    new Platform(\"Test2\"),\r\n                    new Platform(\"Test3\")\r\n                };\r\n\r\n                db.Platforms.Add(plats);\r\n                var vm = new DatabaseFieldsManagerViewModel(db, new Mock<IWindowFactory>().Object, null, null);\r\n                vm.EditingPlatforms[0].Name = \"Test4\";\r\n                vm.EditingPlatforms.Add(new Platform(\"Test5\"));\r\n                vm.EditingPlatforms.Add(new Platform(\"Test6\"));\r\n                vm.EditingPlatforms.RemoveAt(2);\r\n                vm.SaveChanges();\r\n\r\n                Assert.AreEqual(4, db.Platforms.Count);\r\n                Assert.AreEqual(\"Test4\", db.Platforms[plats[0].Id].Name);\r\n                Assert.IsNotNull(db.Platforms.First(a => a.Name == \"Test2\"));\r\n                Assert.IsNotNull(db.Platforms.First(a => a.Name == \"Test5\"));\r\n                Assert.IsNotNull(db.Platforms.First(a => a.Name == \"Test6\"));\r\n\r\n                // TODO add file test\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void RemoveUnsusedTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                db.Platforms.Remove(db.Platforms);\r\n\r\n                var plats = new List<Platform>\r\n                {\r\n                    new Platform(\"Test1\"),\r\n                    new Platform(\"Test2\"),\r\n                    new Platform(\"Test3\")\r\n                };\r\n\r\n                var features = new List<GameFeature>\r\n                {\r\n                    new GameFeature(\"Feature1\"),\r\n                    new GameFeature(\"Feature2\"),\r\n                    new GameFeature(\"Feature3\"),\r\n                    new GameFeature(\"Feature4\")\r\n                };\r\n\r\n                var companies = new List<Company>\r\n                {\r\n                    new Company(\"Comp1\"),\r\n                    new Company(\"Comp2\"),\r\n                    new Company(\"Comp3\"),\r\n                    new Company(\"Comp4\"),\r\n                    new Company(\"Comp5\")\r\n                };\r\n\r\n                db.Features.Add(features);\r\n                db.Platforms.Add(plats);\r\n                db.Companies.Add(companies);\r\n                db.Games.Add(new Game(\"game1\")\r\n                {\r\n                    PlatformIds = new List<Guid> { plats[1].Id },\r\n                    FeatureIds = new List<Guid> { features[0].Id, features[3].Id },\r\n                    PublisherIds = new List<Guid> { companies[3].Id }\r\n                });\r\n\r\n                db.Games.Add(new Game(\"game2\")\r\n                {\r\n                    DeveloperIds = new List<Guid> { companies[0].Id },\r\n                    PublisherIds = new List<Guid> { companies[1].Id }\r\n                });\r\n\r\n                db.Games.Add(new Game(\"game3\"));\r\n\r\n                var detectedUnused = false;\r\n                var dialogs = new Mock<IDialogsFactory>();\r\n                dialogs.Setup(a => a.ShowMessage(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<MessageBoxButton>(), It.IsAny<MessageBoxImage>())).\r\n                    Callback<string, string, MessageBoxButton, MessageBoxImage>((a, b, c, d) =>\r\n                {\r\n                    detectedUnused = a.Contains(\"2\");\r\n                }).Returns(MessageBoxResult.Yes);\r\n\r\n                var vm = new DatabaseFieldsManagerViewModel(db, new Mock<IWindowFactory>().Object, dialogs.Object, TestResourceProvider.Instance);\r\n                vm.RemoveUnusedPlatformsCommand.Execute(null);\r\n                Assert.IsTrue(detectedUnused);\r\n\r\n                detectedUnused = false;\r\n                vm.RemoveUnusedFeaturesCommand.Execute(null);\r\n                Assert.IsTrue(detectedUnused);\r\n\r\n                detectedUnused = false;\r\n                vm.RemoveUnusedCompaniesCommand.Execute(null);\r\n                Assert.IsTrue(detectedUnused);\r\n\r\n                vm.RemoveUnusedSourcesCommand.Execute(null);\r\n                vm.SaveChanges();\r\n\r\n                Assert.AreEqual(1, db.Platforms.Count);\r\n                Assert.IsNotNull(db.Platforms[plats[1].Id]);\r\n\r\n                Assert.AreEqual(2, db.Features.Count);\r\n                Assert.IsNotNull(db.Features[features[0].Id]);\r\n                Assert.IsNotNull(db.Features[features[3].Id]);\r\n\r\n                Assert.AreEqual(3, db.Companies.Count);\r\n                Assert.IsNotNull(db.Companies[companies[0].Id]);\r\n                Assert.IsNotNull(db.Companies[companies[1].Id]);\r\n                Assert.IsNotNull(db.Companies[companies[3].Id]);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.DesktopApp.Tests/ViewModels/GameEditViewModelTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.DesktopApp.ViewModels;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Tests;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.DesktopApp.Tests.ViewModels\r\n{\r\n    [TestFixture]\r\n    public class GameEditViewModelTests\r\n    {\r\n        [Test]\r\n        public void ImageReplaceTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                var game = new Game()\r\n                {\r\n                    GameId = \"testid\",\r\n                    Name = \"Test Game\"\r\n                };\r\n\r\n                var origIcon = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n                var origImage = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n                var origBackground = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n                game.Icon = origIcon;\r\n                game.CoverImage = origImage;\r\n                game.BackgroundImage = origBackground;\r\n                db.Games.Add(game);\r\n\r\n                var newIcon = PlayniteTests.GenerateFakeFile();\r\n                var newImage = PlayniteTests.GenerateFakeFile();\r\n                var newBackground = PlayniteTests.GenerateFakeFile();\r\n                File.WriteAllBytes(Path.Combine(temp.TempPath, newIcon.FileName), newIcon.Content);\r\n                File.WriteAllBytes(Path.Combine(temp.TempPath, newImage.FileName), newImage.Content);\r\n                File.WriteAllBytes(Path.Combine(temp.TempPath, newBackground.FileName), newBackground.Content);\r\n\r\n                // Images are replaced\r\n                var model = new GameEditViewModel(game, db, new MockWindowFactory(), new MockDialogsFactory(), TestResourceProvider.Instance, null, new PlayniteSettings());\r\n                model.EditingGame.Icon = Path.Combine(temp.TempPath, newIcon.FileName);\r\n                model.EditingGame.CoverImage = Path.Combine(temp.TempPath, newImage.FileName);\r\n                model.EditingGame.BackgroundImage = Path.Combine(temp.TempPath, newBackground.FileName);\r\n                model.ConfirmDialog(false);\r\n\r\n                Assert.AreNotEqual(game.Icon, origIcon);\r\n                Assert.AreNotEqual(game.CoverImage, origImage);\r\n                Assert.AreNotEqual(game.BackgroundImage, origBackground);\r\n\r\n                var dbFiles = Directory.GetFiles(db.GetFileStoragePath(game.Id));\r\n                Assert.AreEqual(3, dbFiles.Count());\r\n                CollectionAssert.AreEqual(newIcon.Content, File.ReadAllBytes(db.GetFullFilePath(game.Icon)));\r\n                CollectionAssert.AreEqual(newImage.Content, File.ReadAllBytes(db.GetFullFilePath(game.CoverImage)));\r\n                CollectionAssert.AreEqual(newBackground.Content, File.ReadAllBytes(db.GetFullFilePath(game.BackgroundImage)));\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void ImageReplaceMultiTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n\r\n                var game = new Game()\r\n                {\r\n                    GameId = \"testid\",\r\n                    Name = \"Test Game\"\r\n                };\r\n\r\n                var origIcon = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n                var origImage = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n                var origBackground = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n                game.Icon = origIcon;\r\n                game.CoverImage = origImage;\r\n                game.BackgroundImage = origBackground;\r\n                db.Games.Add(game);\r\n\r\n                game = new Game()\r\n                {\r\n                    GameId = \"testid2\",\r\n                    Name = \"Test Game 2\"\r\n                };\r\n\r\n                origIcon = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n                origImage = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n                origBackground = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n                game.Icon = origIcon;\r\n                game.CoverImage = origImage;\r\n                game.BackgroundImage = origBackground;\r\n                db.Games.Add(game);\r\n\r\n                var newIcon = PlayniteTests.GenerateFakeFile();\r\n                var newImage = PlayniteTests.GenerateFakeFile();\r\n                var newBackground = PlayniteTests.GenerateFakeFile();\r\n                File.WriteAllBytes(Path.Combine(temp.TempPath, newIcon.FileName), newIcon.Content);\r\n                File.WriteAllBytes(Path.Combine(temp.TempPath, newImage.FileName), newImage.Content);\r\n                File.WriteAllBytes(Path.Combine(temp.TempPath, newBackground.FileName), newBackground.Content);\r\n\r\n                // Replaces all images for all games\r\n                var games = db.Games.ToList();\r\n                var model = new GameEditViewModel(games, db, new MockWindowFactory(), new MockDialogsFactory(), TestResourceProvider.Instance, null, new PlayniteSettings());\r\n                model.EditingGame.Icon = Path.Combine(temp.TempPath, newIcon.FileName);\r\n                model.EditingGame.CoverImage = Path.Combine(temp.TempPath, newImage.FileName);\r\n                model.EditingGame.BackgroundImage = Path.Combine(temp.TempPath, newBackground.FileName);\r\n                model.ConfirmDialog(false);\r\n\r\n                Assert.AreEqual(3, Directory.GetFiles(db.GetFileStoragePath(games[0].Id)).Count());\r\n                Assert.AreEqual(3, Directory.GetFiles(db.GetFileStoragePath(games[1].Id)).Count());\r\n\r\n                CollectionAssert.AreEqual(newIcon.Content, File.ReadAllBytes(db.GetFullFilePath(games[0].Icon)));\r\n                CollectionAssert.AreEqual(newImage.Content, File.ReadAllBytes(db.GetFullFilePath(games[0].CoverImage)));\r\n                CollectionAssert.AreEqual(newBackground.Content, File.ReadAllBytes(db.GetFullFilePath(games[0].BackgroundImage)));\r\n\r\n                CollectionAssert.AreEqual(newIcon.Content, File.ReadAllBytes(db.GetFullFilePath(games[1].Icon)));\r\n                CollectionAssert.AreEqual(newImage.Content, File.ReadAllBytes(db.GetFullFilePath(games[1].CoverImage)));\r\n                CollectionAssert.AreEqual(newBackground.Content, File.ReadAllBytes(db.GetFullFilePath(games[1].BackgroundImage)));\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.DesktopApp.Tests/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n  <runtime>\r\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.4.0\" newVersion=\"4.1.4.0\" />\r\n      </dependentAssembly>\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.0\" newVersion=\"4.0.4.0\" />\r\n      </dependentAssembly>\r\n    </assemblyBinding>\r\n  </runtime>\r\n</configuration>"
  },
  {
    "path": "source/Tests/Playnite.DesktopApp.Tests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"Castle.Core\" version=\"4.3.1\" targetFramework=\"net462\" />\r\n  <package id=\"Moq\" version=\"4.10.1\" targetFramework=\"net462\" />\r\n  <package id=\"NUnit\" version=\"3.13.2\" targetFramework=\"net462\" />\r\n  <package id=\"NUnit3TestAdapter\" version=\"3.17.0\" targetFramework=\"net462\" />\r\n  <package id=\"System.Runtime.CompilerServices.Unsafe\" version=\"4.5.0\" targetFramework=\"net462\" />\r\n  <package id=\"System.Threading.Tasks.Extensions\" version=\"4.5.1\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Tests/Playnite.FullscreenApp.Tests/Controls/FullscreenTilePanelTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.FullscreenApp.Controls;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.FullscreenApp.Tests.Controls\r\n{\r\n    [TestFixture]\r\n    [Apartment(ApartmentState.STA)]\r\n    public class FullscreenTilePanelTests\r\n    {\r\n        [Test]\r\n        public void LayoutTest()\r\n        {\r\n            var viewport = new Size(1000, 500);\r\n            var panel = new FullscreenTilePanel()\r\n            {\r\n                Rows = 2,\r\n                ItemAspectRatio = new AspectRatio(2 ,1)\r\n            };\r\n\r\n            panel.UpdateScrollInfo(viewport);            \r\n\r\n            //Assert.AreEqual(200, panel.GetItemHeight());\r\n            //Assert.AreEqual(400, panel.GetItemWidth());\r\n            //Assert.AreEqual(2, panel.Columns);\r\n            //Assert.AreEqual(100, panel.GetSideMargin());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.FullscreenApp.Tests/Playnite.FullscreenApp.Tests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props\" Condition=\"Exists('..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props')\" />\r\n  <Import Project=\"..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props\" Condition=\"Exists('..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props')\" />\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{AEDEC1D7-8C49-4A54-B265-F595CFD89247}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>Playnite.FullscreenApp.Tests</RootNamespace>\r\n    <AssemblyName>Playnite.FullscreenApp.Tests</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">15.0</VisualStudioVersion>\r\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\r\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\r\n    <IsCodedUITest>False</IsCodedUITest>\r\n    <TestProjectType>UnitTest</TestProjectType>\r\n    <NuGetPackageImportStamp>\r\n    </NuGetPackageImportStamp>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\r\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\Castle.Core.4.3.1\\lib\\net45\\Castle.Core.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Moq, Version=4.10.0.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\Moq.4.10.1\\lib\\net45\\Moq.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"nunit.framework, Version=3.13.2.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\NUnit.3.13.2\\lib\\net45\\nunit.framework.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Configuration\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Runtime.CompilerServices.Unsafe, Version=4.0.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\System.Runtime.CompilerServices.Unsafe.4.5.0\\lib\\netstandard2.0\\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\System.Threading.Tasks.Extensions.4.5.1\\lib\\netstandard2.0\\System.Threading.Tasks.Extensions.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Xaml\" />\r\n    <Reference Include=\"WindowsBase\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Controls\\FullscreenTilePanelTests.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"app.config\" />\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\..\\Playnite.FullscreenApp\\Playnite.FullscreenApp.csproj\">\r\n      <Project>{df38bfd7-c6b8-4cf7-942f-378548ed76b6}</Project>\r\n      <Name>Playnite.FullscreenApp</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\..\\Playnite\\Playnite.csproj\">\r\n      <Project>{ad271e73-8a13-4c4e-bfdc-3076646b59e3}</Project>\r\n      <Name>Playnite</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Folder Include=\"ViewModels\\\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\r\n    <PropertyGroup>\r\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\r\n    </PropertyGroup>\r\n    <Error Condition=\"!Exists('..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props'))\" />\r\n    <Error Condition=\"!Exists('..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props'))\" />\r\n  </Target>\r\n</Project>"
  },
  {
    "path": "source/Tests/Playnite.FullscreenApp.Tests/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n[assembly: AssemblyTitle(\"Playnite.FullscreenApp.Tests\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"Playnite.FullscreenApp.Tests\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2019\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n[assembly: ComVisible(false)]\r\n\r\n[assembly: Guid(\"aedec1d7-8c49-4a54-b265-f595cfd89247\")]\r\n\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "source/Tests/Playnite.FullscreenApp.Tests/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n  <runtime>\r\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.4.0\" newVersion=\"4.1.4.0\" />\r\n      </dependentAssembly>\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.0\" newVersion=\"4.0.4.0\" />\r\n      </dependentAssembly>\r\n    </assemblyBinding>\r\n  </runtime>\r\n</configuration>"
  },
  {
    "path": "source/Tests/Playnite.FullscreenApp.Tests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"Castle.Core\" version=\"4.3.1\" targetFramework=\"net462\" />\r\n  <package id=\"Moq\" version=\"4.10.1\" targetFramework=\"net462\" />\r\n  <package id=\"NUnit\" version=\"3.13.2\" targetFramework=\"net462\" />\r\n  <package id=\"NUnit3TestAdapter\" version=\"3.17.0\" targetFramework=\"net462\" />\r\n  <package id=\"System.Runtime.CompilerServices.Unsafe\" version=\"4.5.0\" targetFramework=\"net462\" />\r\n  <package id=\"System.Threading.Tasks.Extensions\" version=\"4.5.1\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Tests/Playnite.Tests/Api/PluginDescriptionTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.API;\r\nusing Playnite.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Api\r\n{\r\n    [TestFixture]\r\n    public class PluginDescriptionTests\r\n    {\r\n        [Test]\r\n        public void FromFileTest()\r\n        {\r\n            var path =  Path.Combine(PlayniteTests.ResourcesPath, PlaynitePaths.ExtensionManifestFileName);\r\n            var description = ExtensionManifest.FromFile(path);\r\n            Assert.IsNotEmpty(description.Module);\r\n            Assert.IsNotEmpty(description.Author);\r\n            Assert.IsNotEmpty(description.Name);\r\n            Assert.IsNotEmpty(description.DescriptionPath);\r\n            Assert.IsNotNull(description.Version);\r\n            Assert.AreEqual(ExtensionType.GameLibrary, description.Type);\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tests/Playnite.Tests/App/UpdateTests.cs",
    "content": "﻿using Moq;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common.Web;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.App\r\n{\r\n    [TestFixture]\r\n    public class UpdateTests\r\n    {\r\n        private Mock<IDownloader> mockDownloader;\r\n        private Mock<IPlayniteApplication> mockApp;\r\n        private string stringManifest;\r\n\r\n        [OneTimeSetUp]\r\n        public void Init()\r\n        {\r\n            mockDownloader = new Mock<IDownloader>();\r\n            mockApp = new Mock<IPlayniteApplication>();\r\n            stringManifest = File.ReadAllText(Path.Combine(PlayniteTests.ResourcesPath, \"TestUpdateManifest.json\"));\r\n        }\r\n\r\n        // TODO\r\n        //[Test]\r\n        //public void ReleaseNotesParseTest()\r\n        //{\r\n        //    IEnumerable<string> notesUrl = null;\r\n\r\n        //    mockDownloader.Setup(a => a.DownloadString(It.IsAny<string>())).Returns(stringManifest);\r\n        //    mockDownloader.Setup(a => a.DownloadString(It.IsAny<IEnumerable<string>>())).Callback<IEnumerable<string>>((a) =>\r\n        //    {\r\n        //        notesUrl = a;\r\n        //    }).Returns(\"release note\");\r\n\r\n        //    var update = new Updater(mockApp.Object, mockDownloader.Object);\r\n        //    var manifest = update.DownloadManifest();\r\n        //    CollectionAssert.IsNotEmpty(manifest.DownloadServers);\r\n        //    CollectionAssert.IsNotEmpty(manifest.Packages);\r\n        //    CollectionAssert.IsNotEmpty(manifest.ReleaseNotes);\r\n        //    CollectionAssert.IsNotEmpty(manifest.ReleaseNotesUrlRoots);\r\n        //    Assert.IsNotNull(manifest.LatestVersion);\r\n\r\n        //    var notes = update.DownloadReleaseNotes(new Version(\"1.0.0.0\"));\r\n        //    Assert.AreEqual(3, notes.Count);\r\n        //    Assert.AreEqual(\"release note\", notes[0].Note);\r\n        //    Assert.AreEqual(new Version(\"4.21\"), notes[0].Version);\r\n        //    Assert.AreEqual(\"http://localhost/update/4.1.html\", notesUrl.First());\r\n        //}\r\n\r\n        //[Test]\r\n        //public void ChooseBestDiffPassTest()\r\n        //{\r\n        //    var update = new Updater(mockApp.Object, mockDownloader.Object);\r\n        //    var manifest = new UpdateManifest()\r\n        //    {\r\n        //        LatestVersion = new Version(4, 21),\r\n        //        Packages = new List<UpdateManifest.Package>()\r\n        //        {\r\n        //            new UpdateManifest.Package() { BaseVersion = new Version(\"4.21\"), FileName = \"421.exe\" },\r\n        //            new UpdateManifest.Package() { BaseVersion = new Version(\"4.2\"), FileName = \"42to42.exe\" },\r\n        //            new UpdateManifest.Package() { BaseVersion = new Version(\"4.1\"), FileName = \"41to42.exe\" }\r\n        //        }\r\n        //    };\r\n\r\n        //    var ver = new Version(\"4.2.0.0\");\r\n        //    var package = update.GetUpdatePackage(manifest, ver);\r\n        //    Assert.AreEqual(ver.ToString(2), package.BaseVersion.ToString());\r\n        //    Assert.AreEqual(\"42to42.exe\", package.FileName);\r\n        //}\r\n\r\n        //[Test]\r\n        //public void ChooseBestDiffFullTest()\r\n        //{\r\n        //    mockDownloader.Setup(a => a.DownloadString(It.IsAny<string>())).Returns(stringManifest);\r\n        //    var update = new Updater(mockApp.Object, mockDownloader.Object);\r\n        //    var manifest = new UpdateManifest()\r\n        //    {\r\n        //        LatestVersion = new Version(4, 21),\r\n        //        Packages = new List<UpdateManifest.Package>()\r\n        //        {\r\n        //            new UpdateManifest.Package() { BaseVersion = new Version(\"4.21\"), FileName = \"421.exe\" },\r\n        //            new UpdateManifest.Package() { BaseVersion = new Version(\"4.12\"), FileName = \"412to42.exe\" },\r\n        //            new UpdateManifest.Package() { BaseVersion = new Version(\"4.1\"), FileName = \"41to42.exe\" }\r\n        //        }\r\n        //    };\r\n\r\n        //    var ver = new Version(\"4.9\");\r\n        //    var package = update.GetUpdatePackage(manifest, ver);\r\n        //    Assert.AreEqual(manifest.LatestVersion, package.BaseVersion);\r\n        //    Assert.AreEqual(\"421.exe\", package.FileName);\r\n        //}\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n  <appSettings file=\"Common.config\">\r\n  </appSettings>\r\n  <runtime>\r\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.4.0\" newVersion=\"4.1.4.0\" />\r\n      </dependentAssembly>\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.1\" newVersion=\"4.0.4.1\" />\r\n      </dependentAssembly>\r\n    </assemblyBinding>\r\n  </runtime>\r\n</configuration>"
  },
  {
    "path": "source/Tests/Playnite.Tests/ArchiveTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Settings;\r\nusing Playnite;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class ArchiveTests\r\n    {\r\n        [Test]\r\n        public void GetArchiveFilesTest()\r\n        {\r\n            var files = Archive.GetArchiveFiles(Path.Combine(PlayniteTests.ResourcesPath, \"TestZip.zip\"));\r\n            Assert.AreEqual(14, files.Count);\r\n            files = Archive.GetArchiveFiles(Path.Combine(PlayniteTests.ResourcesPath, \"Test7zip.7z\"));\r\n            Assert.AreEqual(14, files.Count);\r\n        }\r\n\r\n        [Test]\r\n        public void GetEntryStreamTest()\r\n        {\r\n            var entry = Archive.GetEntryStream(Path.Combine(PlayniteTests.ResourcesPath, \"TestZip.zip\"), \"Archive.cs\");\r\n            using (entry.Item2)\r\n            using (entry.Item1)\r\n            using (var reader = new StreamReader(entry.Item1))\r\n            {\r\n                var text = reader.ReadToEnd();\r\n                StringAssert.StartsWith(\"using System\", text);\r\n            }\r\n\r\n            entry = Archive.GetEntryStream(Path.Combine(PlayniteTests.ResourcesPath, \"Test7zip.7z\"), \"Archive.cs\");\r\n            using (entry.Item2)\r\n            using (entry.Item1)\r\n            {\r\n                Assert.AreEqual(\"37E74AE8\", FileSystem.GetCRC32(entry.Item1));\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/BackupTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class BackupTests\r\n    {\r\n        [Test]\r\n        public void RotatingBackupTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            {\r\n                void generateBackups()\r\n                {\r\n                    FileSystem.CreateFile(Path.Combine(temp.TempPath, \"PlayniteBackup-2021-07-01-01-01-01.zip\"));\r\n                    FileSystem.CreateFile(Path.Combine(temp.TempPath, \"PlayniteBackup-2021-07-02-01-01-01.zip\"));\r\n                    FileSystem.CreateFile(Path.Combine(temp.TempPath, \"PlayniteBackup-2021-07-03-01-01-01.zip\"));\r\n                }\r\n\r\n                var settings = new PlayniteSettings\r\n                {\r\n                    RotatingBackups = 0,\r\n                    AutoBackupEnabled = true,\r\n                    AutoBackupDir = temp.TempPath,\r\n                    AutoBackupIncludeExtensions = true,\r\n                    AutoBackupIncludeExtensionsData = true,\r\n                    AutoBackupIncludeLibFiles = true,\r\n                    AutoBackupIncludeThemes = true\r\n                };\r\n\r\n                // No rotating file\r\n                var backupOptions = Backup.GetAutoBackupOptions(settings, temp.TempPath, Path.Combine(temp.TempPath, \"lib\"));\r\n                generateBackups();\r\n                Backup.BackupData(backupOptions, CancellationToken.None);\r\n\r\n                var backups = Directory.GetFiles(temp.TempPath);\r\n                Assert.AreEqual(1, backups.Length);\r\n                StringAssert.AreEqualIgnoringCase(backupOptions.OutputFile, backups[0]);\r\n\r\n                // Rotating files: less than existing backups\r\n                backupOptions.RotatingBackups = 1;\r\n                generateBackups();\r\n                Backup.BackupData(backupOptions, CancellationToken.None);\r\n\r\n                backups = Directory.GetFiles(temp.TempPath);\r\n                Assert.AreEqual(2, backups.Length);\r\n                StringAssert.AreEqualIgnoringCase(backupOptions.OutputFile, backups[1]);\r\n\r\n                // Rotating files: exact to existing backups\r\n                backupOptions.RotatingBackups = 3;\r\n                generateBackups();\r\n                Backup.BackupData(backupOptions, CancellationToken.None);\r\n\r\n                backups = Directory.GetFiles(temp.TempPath);\r\n                Assert.AreEqual(4, backups.Length);\r\n                StringAssert.AreEqualIgnoringCase(backupOptions.OutputFile, backups[3]);\r\n\r\n                // Rotating files: more than existing backups\r\n                backupOptions.RotatingBackups = 10;\r\n                generateBackups();\r\n                Backup.BackupData(backupOptions, CancellationToken.None);\r\n\r\n                backups = Directory.GetFiles(temp.TempPath);\r\n                Assert.AreEqual(4, backups.Length);\r\n                StringAssert.AreEqualIgnoringCase(backupOptions.OutputFile, backups[3]);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/CloneObjectTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite;\r\nusing Playnite.SDK.Models;\r\nusing Newtonsoft.Json;\r\nusing Playnite.SDK.Data;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class CloneObjectTests\r\n    {\r\n        class TestObject : ObservableObject\r\n        {\r\n            private int prop1;\r\n            public int Prop1\r\n            {\r\n                get => prop1;\r\n                set\r\n                {\r\n                    prop1 = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n\r\n            private string prop2;\r\n            public string Prop2\r\n            {\r\n                get => prop2;\r\n                set\r\n                {\r\n                    prop2 = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n\r\n            private List<int> prop3;\r\n            public List<int> Prop3\r\n            {\r\n                get => prop3;\r\n                set\r\n                {\r\n                    prop3 = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n\r\n            private TestObject prop4;\r\n            public TestObject Prop4\r\n            {\r\n                get => prop4;\r\n                set\r\n                {\r\n                    prop4 = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n\r\n            private long prop6;\r\n            public long Prop6\r\n            {\r\n                get => prop6;\r\n                set\r\n                {\r\n                    prop6 = value;\r\n                    OnPropertyChanged();\r\n                }\r\n            }\r\n        }\r\n\r\n        public class JsonTestObject\r\n        {\r\n            public int Prop1 { get; set; }\r\n\r\n            [JsonIgnore]\r\n            public int Prop2 { get; set; }\r\n\r\n            [DontSerialize]\r\n            public int Prop3 { get; set; }\r\n        }\r\n\r\n        [Test]\r\n        public void JsonIgnoreTest()\r\n        {\r\n            var source = new JsonTestObject()\r\n            {\r\n                Prop1 = 10,\r\n                Prop2 = 20,\r\n                Prop3 = 30\r\n            };\r\n\r\n            var target = new JsonTestObject();\r\n            source.CopyProperties(target, false, null, true);\r\n            Assert.AreEqual(10, target.Prop1);\r\n            Assert.AreNotEqual(20, target.Prop2);\r\n            Assert.AreNotEqual(30, target.Prop3);\r\n\r\n            target = new JsonTestObject();\r\n            source.CopyProperties(target, false, null, false);\r\n            Assert.AreEqual(10, target.Prop1);\r\n            Assert.AreEqual(20, target.Prop2);\r\n            Assert.AreEqual(30, target.Prop3);\r\n        }\r\n\r\n        [Test]\r\n        public void CopyPropertiesTest()\r\n        {\r\n            var source = new TestObject\r\n            {\r\n                Prop1 = 2,\r\n                Prop2 = \"test\",\r\n                Prop3 = new List<int>() { 1, 2 },\r\n                Prop4 = new TestObject() { Prop2 = \"test2\" }\r\n            };\r\n\r\n            var target = new TestObject();\r\n\r\n            // Standard copy of all properties\r\n            source.CopyProperties(target, true);\r\n            Assert.AreEqual(source.Prop1, target.Prop1);\r\n            Assert.AreEqual(source.Prop2, target.Prop2);\r\n            Assert.IsNotNull(target.Prop3);\r\n            Assert.AreEqual(1, target.Prop3.First());\r\n            Assert.IsNotNull(target.Prop4);\r\n            Assert.AreEqual(source.Prop4.Prop3, target.Prop4.Prop3);\r\n\r\n            // Null copy\r\n            source.Prop2 = null;\r\n            source.Prop3 = null;\r\n            source.Prop4 = null;\r\n            source.CopyProperties(target, true);\r\n            Assert.IsNull(target.Prop2);\r\n            Assert.IsNull(target.Prop3);\r\n            Assert.IsNull(target.Prop4);\r\n\r\n            // Diff only\r\n            var changed = new List<string>();\r\n            source = new TestObject\r\n            {\r\n                Prop1 = 2,\r\n                Prop2 = \"test\",\r\n                Prop3 = new List<int>() { 1, 2 },\r\n                Prop4 = new TestObject() { Prop2 = \"test2\" },\r\n                Prop6 = 20\r\n            };\r\n\r\n            target = new TestObject\r\n            {\r\n                Prop1 = 2,\r\n                Prop2 = \"test\",\r\n                Prop6 = 0\r\n            };\r\n\r\n            target.PropertyChanged += (s, e) => changed.Add(e.PropertyName);\r\n            source.CopyProperties(target, true);\r\n            Assert.AreEqual(3, changed.Count);\r\n            Assert.AreEqual(\"Prop3\", changed[0]);\r\n            Assert.AreEqual(\"Prop4\", changed[1]);\r\n            Assert.AreEqual(\"Prop6\", changed[2]);\r\n\r\n            changed = new List<string>();\r\n            target = new TestObject\r\n            {\r\n                Prop1 = 2,\r\n                Prop2 = \"test\"\r\n            };\r\n\r\n            target.PropertyChanged += (s, e) => changed.Add(e.PropertyName);\r\n            source.CopyProperties(target, false);\r\n            Assert.AreEqual(5, changed.Count);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Converters/PlayTimeToStringConverterTests.cs",
    "content": "﻿using NUnit.Framework;\nusing Playnite.Converters;\nusing Playnite.SDK;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\n\nnamespace Playnite.Tests.Converters\n{\n    [TestFixture]\n    public class PlayTimeToStringConverterTests\n    {\n        private static string Convert(object value, object formatToDaysParameter = null)\n        {\n            return PlayTimeToStringConverter.Instance.Convert(value, typeof(string), formatToDaysParameter, CultureInfo.CurrentCulture) as string;\n        }\n\n        [Test]\n        public void ConvertLocalizationStringsTest()\n        {\n            ulong? zeroSeconds = 0;\n            ulong? totalSecondsInMinute = 60;\n            ulong? totalSecondsInHour = totalSecondsInMinute * 60;\n            ulong? totalSecondsInDay = totalSecondsInHour * 24;\n\n            // formatToDaysParameter set to null/false tests\n            Assert.AreEqual(\"Not Played\", Convert(zeroSeconds, false));\n            Assert.AreEqual(\"59 seconds\", Convert(totalSecondsInMinute - 1, false));\n            Assert.AreEqual(\"1 minutes\", Convert(totalSecondsInMinute, false));\n            Assert.AreEqual(\"24h 1m\", Convert(totalSecondsInDay + totalSecondsInMinute, false));\n\n            // formatToDaysParameter set to true\n            Assert.AreEqual(\"Not Played\", Convert(zeroSeconds, true));\n            Assert.AreEqual(\"59 seconds\", Convert(totalSecondsInMinute - 1, true));\n            Assert.AreEqual(\"1 minutes\", Convert(totalSecondsInMinute, true));\n            Assert.AreEqual(\"23h 59m\", Convert(totalSecondsInDay - 1, true));\n            Assert.AreEqual(\"1d 0h 0m\", Convert(totalSecondsInDay, true));\n\n            var testSeconds = totalSecondsInDay + (totalSecondsInHour * 2) + (totalSecondsInMinute * 30);\n            Assert.AreEqual(\"1d 2h 30m\", Convert(testSeconds, true));\n        }\n    }\n}\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/CueSheetTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing NUnit.Framework;\r\nusing Playnite.Common;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class CueSheetTests\r\n    {\r\n        [Test]\r\n        public void GetFileEntriesTest()\r\n        {\r\n            //var files = CueSheet.GetFileEntries(@\"\");\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Database/EmulatorsCollectionTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Database\r\n{\r\n    [TestFixture]\r\n    public class EmulatorsCollectionTests\r\n    {\r\n        [Test]\r\n        public void UsageRemovalTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                var emulator = new Emulator(\"test\")\r\n                {\r\n                    CustomProfiles = new System.Collections.ObjectModel.ObservableCollection<CustomEmulatorProfile>()\r\n                        {\r\n                            new CustomEmulatorProfile() { Name = \"test profile\" }\r\n                        }\r\n                };\r\n\r\n                db.Emulators.Add(emulator);\r\n                var game = new Game(\"test\")\r\n                {\r\n                    GameActions = new System.Collections.ObjectModel.ObservableCollection<GameAction>\r\n                    {\r\n                        new GameAction()\r\n                        {\r\n                            Type = GameActionType.Emulator,\r\n                            EmulatorId = emulator.Id,\r\n                            EmulatorProfileId = emulator.CustomProfiles[0].Id\r\n                        }\r\n                    }\r\n                };\r\n\r\n                db.Games.Add(game);\r\n                db.Emulators.Remove(emulator);\r\n                Assert.AreEqual(Guid.Empty, game.GameActions[0].EmulatorId);\r\n                Assert.AreEqual(null, game.GameActions[0].EmulatorProfileId);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Database/FiltersDatabaseTests.cs",
    "content": "﻿using NUnit.Framework;\nusing Playnite.Common;\nusing Playnite.Database;\nusing Playnite.SDK.Models;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Playnite.Tests.Database\n{\n    [TestFixture]\n    public class FiltersDatabaseTests\n    {\n        [Test]\n        public void SortedFilterPresetsTest()\n        {\n            using (var temp = TempDirectory.Create())\n            using (var db = new TestGameDatabase(temp.TempPath))\n            {\n                db.OpenDatabase();\n                db.FilterPresets.Select(a => a.Id).ToList().ForEach(a => db.FilterPresets.Remove(a));\n                Assert.AreEqual(0, db.FilterPresets.Count);\n                var addedFilterPresets = new List<FilterPreset>();\n                for (int i = 0; i < 10; i++)\n                {\n                    var filterPreset = new FilterPreset() { Name = $\"Preset {i}\" };\n                    db.FilterPresets.Add(filterPreset);\n                    addedFilterPresets.Add(filterPreset);\n                }\n\n                // Set default sorting order based on added order\n                var newFilterPresetSettings = new FilterPresetsSettings\n                {\n                    SortingOrder = addedFilterPresets.Select(x => x.Id).ToList()\n                };\n\n                db.SetFilterPresetsSettings(newFilterPresetSettings);\n                var sortedFilterPresets = db.GetSortedFilterPresets();\n\n                // Verify that order is the same as when it was set\n                Assert.IsTrue(sortedFilterPresets.Select(x => x.Id).SequenceEqual(addedFilterPresets.Select(x => x.Id)));\n\n                // Set last added Filter Preset to first in order\n                newFilterPresetSettings.SortingOrder.Remove(addedFilterPresets.Last().Id);\n                newFilterPresetSettings.SortingOrder.Insert(0, addedFilterPresets.Last().Id);\n                db.SetFilterPresetsSettings(newFilterPresetSettings);\n                sortedFilterPresets = db.GetSortedFilterPresets();\n                Assert.AreEqual(addedFilterPresets.Last(), sortedFilterPresets.First());\n\n                // Add a new filter preset and verify that it shows as last item when obtaining sorted Filter Presets\n                var newFilterPreset = new FilterPreset() { Name = \"New Filter Preset 1\" };\n                db.FilterPresets.Add(newFilterPreset);\n                sortedFilterPresets = db.GetSortedFilterPresets();\n                Assert.AreEqual(newFilterPreset, sortedFilterPresets.Last());\n\n                // Add multiple new filter presets and verify that they are in sorted order last in the list\n                var newFilterPresets = new List<FilterPreset>\n                {\n                    new FilterPreset() { Name = \"New Filter Preset C\" },\n                    new FilterPreset() { Name = \"New Filter Preset B\" },\n                    new FilterPreset() { Name = \"New Filter Preset D\" },\n                    new FilterPreset() { Name = \"New Filter Preset A\" }\n                };\n\n                foreach (var filterPreset in newFilterPresets)\n                {\n                    db.FilterPresets.Add(filterPreset);\n                }\n\n                newFilterPresets.Sort((x, y) => x.Name.CompareTo(y.Name));\n                sortedFilterPresets = db.GetSortedFilterPresets();\n                for (int i = 1; i < newFilterPresets.Count + 1; i++)\n                {\n                    var newIndex = newFilterPresets.Count - i;\n                    var sortedIndex = sortedFilterPresets.Count - i;\n                    Assert.AreEqual(newFilterPresets[newIndex].Name, sortedFilterPresets[sortedIndex].Name);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Database/GameDatabaseFileTests.cs",
    "content": "﻿using LiteDB;\r\nusing Moq;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Database\r\n{\r\n    [TestFixture]\r\n    public class GameDatabaseFileTests\r\n    {\r\n        [Test]\r\n        public void AddFileTest()\r\n        {\r\n            using (var db = new GameDbTestWrapper())\r\n            {\r\n                var testId = Guid.NewGuid();\r\n                var filesDir = Path.Combine(db.DbDirectory, \"files\", testId.ToString());\r\n\r\n                void testImage(string path, string resFilter, string addedExt, bool addAsImage)\r\n                {\r\n                    var newPath = db.DB.AddFile(path, testId, addAsImage, CancellationToken.None);\r\n                    Assert.IsNotNull(newPath);\r\n                    StringAssert.EndsWith(addedExt, newPath);\r\n                    Assert.AreEqual(1, Directory.GetFiles(filesDir, resFilter).Count());\r\n                    FileSystem.DeleteDirectory(filesDir);\r\n                }\r\n\r\n                void testImageMeta(MetadataFile file, string resFilter)\r\n                {\r\n                    Assert.IsNotNull(db.DB.AddFile(file, testId, true, CancellationToken.None));\r\n                    Assert.AreEqual(1, Directory.GetFiles(filesDir, resFilter).Count());\r\n                    FileSystem.DeleteDirectory(filesDir);\r\n                }\r\n\r\n                // Standard image local file\r\n                testImage(Path.Combine(PlayniteTests.ResourcesPath, \"Images\", \"applogo.png\"), \"*.png\", \".png\", true);\r\n\r\n                // Standard image htpp file\r\n                testImage(@\"https://playnite.link/applogo.png\", \"*.png\", \".png\", true);\r\n\r\n                // Standard image content file\r\n                var contentImage = File.ReadAllBytes(Path.Combine(PlayniteTests.ResourcesPath, \"Images\", \"applogo.png\"));\r\n                testImageMeta(new MetadataFile(\"test.png\", contentImage), \"*.png\");\r\n\r\n                // Local exe icon file\r\n                testImage(Path.Combine(PlayniteTests.ResourcesPath, \"Images\", \"YesIcon.exe\"), \"*.ico\", \".ico\", true);\r\n\r\n                // Http exe icon file\r\n                testImage(@\"https://playnite.link/YesIcon.exe\", \"*.ico\", \".ico\", true);\r\n\r\n                // No image\r\n                testImage(Path.Combine(PlayniteTests.ResourcesPath, \"Images\", \"YesIcon.exe\"), \"*.exe\", \".exe\", false);\r\n\r\n                // No image http\r\n                testImage(@\"https://playnite.link/YesIcon.exe\", \"*.exe\", \".exe\", false);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void AddFileFailureTest()\r\n        {\r\n            using (var db = new GameDbTestWrapper())\r\n            {\r\n                var testId = Guid.NewGuid();\r\n                var filesDir = Path.Combine(db.DbDirectory, \"files\", testId.ToString());\r\n\r\n                void testImage(string path)\r\n                {\r\n                    Assert.IsNull(db.DB.AddFile(path, testId, true, CancellationToken.None));\r\n                    Assert.IsTrue(!Directory.Exists(filesDir) || Directory.GetFiles(filesDir, \"*.*\").Count() == 0);\r\n                    FileSystem.DeleteDirectory(filesDir);\r\n                }\r\n\r\n                // Missing http file\r\n                testImage(@\"https://playnite.link/doesntexists.png\");\r\n\r\n                // Missing local file\r\n                testImage(@\"c:\\dir\\nope.png\");\r\n\r\n                // Http exe no icon file\r\n                testImage(@\"https://playnite.link/NoIcon.exe\");\r\n\r\n                // Non-image filed\r\n                testImage(Path.Combine(PlayniteTests.ResourcesPath, \"Images\", \"NoIcon.exe\"));\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void ImageFilePathReuseTest()\r\n        {\r\n            using (var db = new GameDbTestWrapper())\r\n            {\r\n                var testId = Guid.NewGuid();\r\n                var filesDir = Path.Combine(db.DbDirectory, \"files\", testId.ToString());\r\n                FileSystem.CreateDirectory(filesDir, true);\r\n\r\n                File.Copy(\r\n                    Path.Combine(PlayniteTests.ResourcesPath, \"Images\", \"applogo.png\"),\r\n                    Path.Combine(filesDir, \"newFile.png\"));\r\n\r\n                var resFile = db.DB.AddFile(Path.Combine(filesDir, \"newFile.png\"), testId, true, CancellationToken.None);\r\n                Assert.AreEqual(testId + \"\\\\\" + \"newFile.png\", resFile);\r\n                Assert.AreEqual(1, Directory.GetFiles(filesDir, \"*.*\").Count());\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Database/GameDatabaseMigrationTests.cs",
    "content": "﻿using LiteDB;\r\nusing Moq;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Database\r\n{\r\n    [TestFixture]\r\n    public class GameDatabaseMigrationTests\r\n    {\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Database/GameDatabasePlatformsTests.cs",
    "content": "﻿using Moq;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Database\r\n{\r\n    [TestFixture]\r\n    public class GameDatabasePlatformsTests\r\n    {\r\n        [Test]\r\n        public void PlatformGeneratorTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                var platforms = db.Platforms;\r\n                CollectionAssert.IsNotEmpty(db.Platforms);\r\n                db.Platforms.Remove(platforms);\r\n                CollectionAssert.IsEmpty(db.Platforms);\r\n                db.Platforms.Add(new Platform(\"Test\"));\r\n                db.Platforms.Add(new Platform(\"Test2\"));\r\n                Assert.AreEqual(2, db.Platforms.Count);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void PlatformRemovalTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                var platform = new Platform(\"Test\");\r\n                db.Platforms.Add(platform);\r\n                var game = new Game(\"Test\")\r\n                {\r\n                    PlatformIds = new List<Guid> { platform.Id }\r\n                };\r\n\r\n                db.Games.Add(game);\r\n                db.Platforms.Remove(platform);\r\n                var dbGame = db.Games[game.Id];\r\n                CollectionAssert.IsEmpty(dbGame.PlatformIds);\r\n                Assert.IsNull(db.Platforms.FirstOrDefault(a => a.Name == \"Test\"));\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Database/GameDatabaseTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing Playnite;\r\nusing Moq;\r\nusing NUnit.Framework;\r\nusing Playnite.Settings;\r\nusing Playnite.Common;\r\nusing System.Threading;\r\n\r\nnamespace Playnite.Tests.Database\r\n{\r\n    public class TestGameDatabase : GameDatabase\r\n    {\r\n        public TestGameDatabase() : base()\r\n        {\r\n            Game.DatabaseReference = this;\r\n        }\r\n\r\n        public TestGameDatabase(string path) : base(path)\r\n        {\r\n            Game.DatabaseReference = this;\r\n        }\r\n\r\n        public void ClearRegions()\r\n        {\r\n            Regions.Select(a => a.Id).ToList().ForEach(a => Regions.Remove(a));\r\n            Assert.AreEqual(0, Regions.Count);\r\n        }\r\n\r\n        public void ClearPlatforms()\r\n        {\r\n            Platforms.Select(a => a.Id).ToList().ForEach(a => Platforms.Remove(a));\r\n            Assert.AreEqual(0, Platforms.Count);\r\n        }\r\n    }\r\n\r\n    [TestFixture]\r\n    public class GameDatabaseTests\r\n    {\r\n        [OneTimeSetUp]\r\n        public void Init()\r\n        {\r\n            // Some test are reading resources, which cannot be access until pack:// namespace is initialized\r\n            // http://stackoverflow.com/questions/6005398/uriformatexception-invalid-uri-invalid-port-specified\r\n            string s = System.IO.Packaging.PackUriHelper.UriSchemePack;\r\n        }\r\n\r\n        [Test]\r\n        public void GetFullDbPathTest()\r\n        {\r\n            var appData = Environment.ExpandEnvironmentVariables(\"%AppData%\");\r\n            var progPath = PlaynitePaths.ProgramPath;\r\n            Assert.AreEqual(Path.Combine(appData, @\"playnite\\games\"), GameDatabase.GetFullDbPath(@\"%AppData%\\playnite\\games\"));\r\n            Assert.AreEqual(Path.Combine(progPath, \"games\"), GameDatabase.GetFullDbPath(@\"{PlayniteDir}\\games\"));\r\n            Assert.AreEqual(@\"c:\\test\\games\", GameDatabase.GetFullDbPath(@\"c:\\test\\games\"));\r\n            Assert.AreEqual(Path.Combine(Environment.CurrentDirectory, @\"games\"), GameDatabase.GetFullDbPath(\"games\"));\r\n        }\r\n\r\n        [Test]\r\n        public void ListUpdateTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                db.Games.Add(new Game()\r\n                {\r\n                    GameId = \"testid\",\r\n                    Name = \"Test Game\"\r\n                });\r\n\r\n                db.Games.Add(new Game()\r\n                {\r\n                    GameId = \"testid2\",\r\n                    Name = \"Test Game 2\"\r\n                });\r\n\r\n                Assert.AreEqual(2, db.Games.Count);\r\n\r\n                var games = db.Games.ToList();\r\n                games[1].Name = \"Changed Name\";\r\n                db.Games.Update(games[1]);\r\n\r\n                games = db.Games.ToList();\r\n                Assert.AreEqual(\"Changed Name\", games[1].Name);\r\n\r\n                db.Games.Remove(games[1]);\r\n                Assert.AreEqual(1, db.Games.Count);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void DeleteGameImageCleanupTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                var game = new Game(\"Test\");\r\n                db.Games.Add(game);\r\n                game.Icon = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n                game.BackgroundImage = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n                game.CoverImage = db.AddFile(PlayniteTests.GenerateFakeFile(), game.Id, true, CancellationToken.None);\r\n\r\n                Assert.IsNotEmpty(game.Icon);\r\n                Assert.IsNotEmpty(game.BackgroundImage);\r\n                Assert.IsNotEmpty(game.CoverImage);\r\n\r\n                var files = Directory.GetFiles(db.GetFileStoragePath(game.Id));\r\n                Assert.AreEqual(3, files.Count());\r\n\r\n                db.Games.Remove(game);\r\n                files = Directory.GetFiles(db.GetFileStoragePath(game.Id));\r\n                Assert.AreEqual(0, files.Count());\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void FieldsInUseTests()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                GameDatabase.GenerateSampleData(db);\r\n\r\n                var eventCount = 0;\r\n                db.AgeRatingsInUseUpdated += (_, __) => eventCount++;\r\n                db.CategoriesInUseUpdated += (_, __) => eventCount++;\r\n                db.DevelopersInUseUpdated += (_, __) => eventCount++;\r\n                db.FeaturesInUseUpdated += (_, __) => eventCount++;\r\n                db.GenresInUseUpdated += (_, __) => eventCount++;\r\n                db.PlatformsInUseUpdated += (_, __) => eventCount++;\r\n                db.PublishersInUseUpdated += (_, __) => eventCount++;\r\n                db.RegionsInUseUpdated += (_, __) => eventCount++;\r\n                db.SeriesInUseUpdated += (_, __) => eventCount++;\r\n                db.SourcesInUseUpdated += (_, __) => eventCount++;\r\n                db.TagsInUseUpdated += (_, __) => eventCount++;\r\n\r\n                Assert.AreEqual(1, db.UsedAgeRatings.Count);\r\n                Assert.AreEqual(1, db.UsedCategories.Count);\r\n                Assert.AreEqual(1, db.UsedDevelopers.Count);\r\n                Assert.AreEqual(1, db.UsedFeastures.Count);\r\n                Assert.AreEqual(1, db.UsedGenres.Count);\r\n                Assert.AreEqual(1, db.UsedPlatforms.Count);\r\n                Assert.AreEqual(1, db.UsedPublishers.Count);\r\n                Assert.AreEqual(1, db.UsedRegions.Count);\r\n                Assert.AreEqual(1, db.UsedSeries.Count);\r\n                Assert.AreEqual(1, db.UsedSources.Count);\r\n                Assert.AreEqual(1, db.UsedTags.Count);\r\n\r\n                var addedCat = db.Categories.Add(\"new category\");\r\n                var addedCat2 = db.Categories.Add(\"new category2\");\r\n                Assert.AreEqual(1, db.UsedCategories.Count);\r\n\r\n                var game = db.Games.First();\r\n                game.CategoryIds.Add(addedCat.Id);\r\n                db.Games.Update(game);\r\n                Assert.AreEqual(2, db.UsedCategories.Count);\r\n                db.Categories.Remove(addedCat);\r\n                Assert.AreEqual(1, db.UsedCategories.Count);\r\n\r\n                var newGame = new Game(\"test\");\r\n                newGame.CategoryIds = new List<Guid> { addedCat.Id, addedCat2.Id };\r\n                db.Games.Add(newGame);\r\n                Assert.AreEqual(2, db.UsedCategories.Count);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void GameImportPlatformTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new TestGameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                db.ClearPlatforms();\r\n\r\n                // Import based on specificication id, should use spec\r\n                var imported = db.ImportGame(new GameMetadata\r\n                {\r\n                    Platforms = new HashSet<MetadataProperty> { new MetadataSpecProperty(\"pc_windows\") }\r\n                }, Guid.Empty);\r\n\r\n                Assert.AreEqual(\"pc_windows\", db.Platforms.First().SpecificationId);\r\n                Assert.AreEqual(\"pc_windows\", imported.Platforms[0].SpecificationId);\r\n                Assert.AreEqual(\"PC (Windows)\", imported.Platforms[0].Name);\r\n\r\n                // Import based on specification name, should use spec\r\n                db.ClearPlatforms();\r\n                imported = db.ImportGame(new GameMetadata\r\n                {\r\n                    Platforms = new HashSet<MetadataProperty> { new MetadataSpecProperty(\"PC (Windows)\") }\r\n                }, Guid.Empty);\r\n\r\n                Assert.AreEqual(\"pc_windows\", db.Platforms.First().SpecificationId);\r\n                Assert.AreEqual(\"pc_windows\", imported.Platforms[0].SpecificationId);\r\n                Assert.AreEqual(\"PC (Windows)\", imported.Platforms[0].Name);\r\n\r\n                // Field name matching test\r\n                imported = db.ImportGame(new GameMetadata\r\n                {\r\n                    Platforms = new HashSet<MetadataProperty> { new MetadataNameProperty(\"PC(Windows)\") }\r\n                }, Guid.Empty);\r\n\r\n                Assert.AreEqual(\"pc_windows\", imported.Platforms[0].SpecificationId);\r\n                Assert.AreEqual(\"PC (Windows)\", imported.Platforms[0].Name);\r\n                Assert.AreEqual(1, db.Platforms.Count);\r\n\r\n                // Import based on existing name\r\n                var plat = db.Platforms.First();\r\n                plat.Name = \"PC (Windows) 1\";\r\n                db.Platforms.Update(plat);\r\n                imported = db.ImportGame(new GameMetadata\r\n                {\r\n                    Platforms = new HashSet<MetadataProperty> { new MetadataNameProperty(\"PC (Windows) 1\") }\r\n                }, Guid.Empty);\r\n\r\n                Assert.AreEqual(\"pc_windows\", imported.Platforms[0].SpecificationId);\r\n                Assert.AreEqual(\"PC (Windows) 1\", imported.Platforms[0].Name);\r\n                Assert.AreEqual(1, db.Platforms.Count);\r\n\r\n                // Import of uknown platform\r\n                imported = db.ImportGame(new GameMetadata\r\n                {\r\n                    Platforms = new HashSet<MetadataProperty> { new MetadataNameProperty(\"test\") }\r\n                }, Guid.Empty);\r\n\r\n                Assert.AreEqual(null, imported.Platforms[0].SpecificationId);\r\n                Assert.AreEqual(\"test\", imported.Platforms[0].Name);\r\n                Assert.AreEqual(2, db.Platforms.Count);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void GameImportRegionTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new TestGameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                db.ClearRegions();\r\n\r\n                // Import based on specificication id, should use spec\r\n                var imported = db.ImportGame(new GameMetadata\r\n                {\r\n                    Regions = new HashSet<MetadataProperty> { new MetadataSpecProperty(\"world\") }\r\n                }, Guid.Empty);\r\n\r\n                Assert.AreEqual(\"world\", db.Regions.First().SpecificationId);\r\n                Assert.AreEqual(\"world\", imported.Regions[0].SpecificationId);\r\n                Assert.AreEqual(\"World\", imported.Regions[0].Name);\r\n\r\n                // Import based on specification name, should use spec\r\n                db.ClearRegions();\r\n                imported = db.ImportGame(new GameMetadata\r\n                {\r\n                    Regions = new HashSet<MetadataProperty> { new MetadataSpecProperty(\"World\") }\r\n                }, Guid.Empty);\r\n\r\n                Assert.AreEqual(\"world\", db.Regions.First().SpecificationId);\r\n                Assert.AreEqual(\"world\", imported.Regions[0].SpecificationId);\r\n                Assert.AreEqual(\"World\", imported.Regions[0].Name);\r\n\r\n                // Field name matching test\r\n                imported = db.ImportGame(new GameMetadata\r\n                {\r\n                    Regions = new HashSet<MetadataProperty> { new MetadataNameProperty(\"Wo rld\") }\r\n                }, Guid.Empty);\r\n\r\n                Assert.AreEqual(\"world\", imported.Regions[0].SpecificationId);\r\n                Assert.AreEqual(\"World\", imported.Regions[0].Name);\r\n                Assert.AreEqual(1, db.Regions.Count);\r\n\r\n                // Import based on existing name\r\n                var region = db.Regions.First();\r\n                region.Name = \"World 1\";\r\n                db.Regions.Update(region);\r\n                imported = db.ImportGame(new GameMetadata\r\n                {\r\n                    Regions = new HashSet<MetadataProperty> { new MetadataNameProperty(\"World 1\") }\r\n                }, Guid.Empty);\r\n\r\n                Assert.AreEqual(\"world\", imported.Regions[0].SpecificationId);\r\n                Assert.AreEqual(\"World 1\", imported.Regions[0].Name);\r\n                Assert.AreEqual(1, db.Regions.Count);\r\n\r\n                // Import of uknown Region\r\n                imported = db.ImportGame(new GameMetadata\r\n                {\r\n                    Regions = new HashSet<MetadataProperty> { new MetadataNameProperty(\"test\") }\r\n                }, Guid.Empty);\r\n\r\n                Assert.AreEqual(null, imported.Regions[0].SpecificationId);\r\n                Assert.AreEqual(\"test\", imported.Regions[0].Name);\r\n                Assert.AreEqual(2, db.Regions.Count);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void GetImportedRomFilesTest()\r\n        {\r\n            using (var db = new GameDbTestWrapper())\r\n            {\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void GetImportedRomFilesVariableTest()\r\n        {\r\n            using (var db = new GameDbTestWrapper())\r\n            {\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Database/GameLibraryFilterTests.cs",
    "content": "using NUnit.Framework;\nusing Playnite.Common;\nusing Playnite.Database;\nusing Playnite.SDK.Models;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Playnite.Tests.Database\n{\n    [TestFixture]\n    public class GameLibraryFilterTests\n    {\n        private TempDirectory TempDirectory { get; set; }\n        private GameDatabase GameDatabase { get; set; }\n\n        private Game GameNone { get; set; }\n        private Game GameA { get; set; }\n        private Game GameB { get; set; }\n        private Game GameBoth { get; set; }\n        private Game GameHidden { get; set; }\n\n        private readonly Guid SteamPluginId = Guid.NewGuid();\n        private readonly Guid XboxPluginId = Guid.NewGuid();\n\n        [OneTimeSetUp]\n        public void Init()\n        {\n            ulong secondsFromHours(double hours) => (ulong)(hours * 3600D);\n\n            TempDirectory = TempDirectory.Create();\n            GameDatabase = new TestGameDatabase(TempDirectory.TempPath);\n            GameDatabase.OpenDatabase();\n            GameDatabase.AgeRatings.Add(\"Everyone\");\n            GameDatabase.AgeRatings.Add(\"Mature\");\n            GameDatabase.Categories.Add(\"Has cats\");\n            GameDatabase.Categories.Add(\"Has dogs\");\n            GameDatabase.Companies.Add(\"iD Software\");\n            GameDatabase.Companies.Add(\"Bethesda\");\n            var notPlayed = GameDatabase.CompletionStatuses.Add(\"Not played\");\n            var played = GameDatabase.CompletionStatuses.Add(\"Played\");\n            var beaten = GameDatabase.CompletionStatuses.Add(\"Beaten\");\n            GameDatabase.Features.Add(\"Singleplayer\");\n            GameDatabase.Features.Add(\"Multiplayer\");\n            GameDatabase.Genres.Add(\"Action\");\n            GameDatabase.Genres.Add(\"Strategy\");\n            GameDatabase.Platforms.Add(\"PC (Windows)\");\n            GameDatabase.Platforms.Add(\"Xbox\");\n            GameDatabase.Regions.Add(\"Europe\");\n            GameDatabase.Regions.Add(\"Japan\");\n            GameDatabase.Series.Add(\"Assassin's Creed\");\n            GameDatabase.Series.Add(\"Forza\");\n            GameDatabase.Sources.Add(\"Steam\");\n            GameDatabase.Sources.Add(\"Xbox\");\n            GameDatabase.Tags.Add(\"Cinematic\");\n            GameDatabase.Tags.Add(\"Surreal\");\n\n            var now = DateTime.Now;\n\n            GameNone = new Game(\"Game None\")\n            {\n                Version = null,\n                ReleaseDate = null,\n                Added = null,\n                LastActivity = null,\n                Modified = null,\n                Playtime = 0,\n                InstallSize = null,\n                CommunityScore = null,\n                CriticScore = null,\n                UserScore = null,\n                Favorite = false,\n                IsInstalled = false,\n                PluginId = Guid.Empty,\n                SourceId = Guid.Empty,\n                CompletionStatusId = Guid.Empty,\n            };\n\n            GameA = new Game(\"Game Alpha\")\n            {\n                Version = \"1.0\",\n                ReleaseDate = new ReleaseDate(2015, 12, 9),\n                Added = now - TimeSpan.FromDays(200),\n                LastActivity = null,\n                Modified = null,\n                Playtime = 0,\n                InstallSize = 1000, //under 100MB\n                CommunityScore = 11,\n                CriticScore = 11,\n                UserScore = 11,\n                Favorite = true,\n                IsInstalled = true,\n                PluginId = SteamPluginId,\n                SourceId = GameDatabase.Sources.First().Id,\n                CompletionStatusId = notPlayed.Id,\n                AgeRatingIds = new List<Guid> { GameDatabase.AgeRatings.First().Id },\n                CategoryIds = new List<Guid> { GameDatabase.Categories.First().Id },\n                DeveloperIds = new List<Guid> { GameDatabase.Companies.First().Id },\n                PublisherIds = new List<Guid> { GameDatabase.Companies.First().Id },\n                FeatureIds = new List<Guid> { GameDatabase.Features.First().Id },\n                GenreIds = new List<Guid> { GameDatabase.Genres.First().Id },\n                PlatformIds = new List<Guid> { GameDatabase.Platforms.First().Id },\n                RegionIds = new List<Guid> { GameDatabase.Regions.First().Id },\n                SeriesIds = new List<Guid> { GameDatabase.Series.First().Id },\n                TagIds = new List<Guid> { GameDatabase.Tags.First().Id },\n            };\n\n            GameB = new Game(\"Game Beta\")\n            {\n                Version = \"1.5.1\",\n                ReleaseDate = new ReleaseDate(2023, 3, 26),\n                Added = now - TimeSpan.FromDays(6),\n                LastActivity = now - TimeSpan.FromDays(6),\n                Modified = now - TimeSpan.FromDays(6),\n                Playtime = secondsFromHours(5D),\n                InstallSize = 0x40000001, //over 1GB\n                CommunityScore = 51,\n                CriticScore = 51,\n                UserScore = 51,\n                Favorite = false,\n                IsInstalled = false,\n                PluginId = XboxPluginId,\n                SourceId = GameDatabase.Sources.Last().Id,\n                CompletionStatusId = played.Id,\n                AgeRatingIds = new List<Guid> { GameDatabase.AgeRatings.Last().Id },\n                CategoryIds = new List<Guid> { GameDatabase.Categories.Last().Id },\n                DeveloperIds = new List<Guid> { GameDatabase.Companies.Last().Id },\n                PublisherIds = new List<Guid> { GameDatabase.Companies.Last().Id },\n                FeatureIds = new List<Guid> { GameDatabase.Features.Last().Id },\n                GenreIds = new List<Guid> { GameDatabase.Genres.Last().Id },\n                PlatformIds = new List<Guid> { GameDatabase.Platforms.Last().Id },\n                RegionIds = new List<Guid> { GameDatabase.Regions.Last().Id },\n                SeriesIds = new List<Guid> { GameDatabase.Series.Last().Id },\n                TagIds = new List<Guid> { GameDatabase.Tags.Last().Id },\n            };\n\n            GameBoth = new Game(\"Game Both\")\n            {\n                Version = \"alpha-2\",\n                ReleaseDate = new ReleaseDate(2025, 8, 26),\n                Added = now.Date.AddMinutes(1),\n                LastActivity = now.Date.AddMinutes(1),\n                Modified = now.Date.AddMinutes(1),\n                Playtime = secondsFromHours(50D),\n                InstallSize = 0x280000001, //over 10GB\n                CommunityScore = 100,\n                CriticScore = 100,\n                UserScore = 100,\n                Favorite = true,\n                IsInstalled = true,\n                PluginId = Guid.Empty,\n                SourceId = Guid.Empty,\n                CompletionStatusId = beaten.Id,\n                AgeRatingIds = GameDatabase.AgeRatings.Select(x => x.Id).ToList(),\n                CategoryIds = GameDatabase.Categories.Select(x => x.Id).ToList(),\n                DeveloperIds = GameDatabase.Companies.Select(x => x.Id).ToList(),\n                PublisherIds = GameDatabase.Companies.Select(x => x.Id).ToList(),\n                FeatureIds = GameDatabase.Features.Select(x => x.Id).ToList(),\n                GenreIds = GameDatabase.Genres.Select(x => x.Id).ToList(),\n                PlatformIds = GameDatabase.Platforms.Select(x => x.Id).ToList(),\n                RegionIds = GameDatabase.Regions.Select(x => x.Id).ToList(),\n                SeriesIds = GameDatabase.Series.Select(x => x.Id).ToList(),\n                TagIds = GameDatabase.Tags.Select(x => x.Id).ToList(),\n            };\n\n            GameHidden = new Game(\"Game Hidden\") { Hidden = true };\n\n            GameDatabase.Games.Add(new[] { GameNone, GameA, GameB, GameBoth, GameHidden });\n        }\n\n        [OneTimeTearDown]\n        public void Cleanup()\n        {\n            GameNone = null;\n            GameA = null;\n            GameB = null;\n            GameBoth = null;\n            GameHidden = null;\n            GameDatabase.Dispose();\n            TempDirectory.Dispose();\n        }\n\n        [Test]\n        public void SingleValueFieldsEmpty()\n        {\n            var filterSettings = new FilterSettings\n            {\n                ReleaseYear = new StringFilterItemProperties(FilterSettings.MissingFieldString),\n                Added = GetTodayFilter(), //Added, Modified, and RecentActivity are automatically set\n                RecentActivity = GetTodayFilter(),\n                Modified = GetTodayFilter(),\n                LastActivity = new EnumFilterItemProperties((int)PastTimeSegment.Never),\n                PlayTime = new EnumFilterItemProperties((int)PlaytimeCategory.NotPlayed),\n                InstallSize = new EnumFilterItemProperties((int)InstallSizeGroup.None),\n                CommunityScore = new EnumFilterItemProperties((int)ScoreGroup.None),\n                CriticScore = new EnumFilterItemProperties((int)ScoreGroup.None),\n                UserScore = new EnumFilterItemProperties((int)ScoreGroup.None),\n                Library = new IdItemFilterItemProperties(Guid.Empty),\n                Source = new IdItemFilterItemProperties(Guid.Empty),\n                CompletionStatuses = new IdItemFilterItemProperties(Guid.Empty),\n            };\n\n            var filteredGames = GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n\n            AssertCollectionsContentsAreEqual(filteredGames, GameNone);\n        }\n\n        [Test]\n        public void SingleValueFieldsIgnoreANDFilteringStyle()\n        {\n            var scoreFilter = new EnumFilterItemProperties(new List<int> { (int)ScoreGroup.None, (int)ScoreGroup.O1x, (int)ScoreGroup.O5x });\n            var filterSettings = new FilterSettings\n            {\n                ReleaseYear = new StringFilterItemProperties(new List<string> { FilterSettings.MissingFieldString, \"2015\", \"2023\" }),\n                Added = GetTodayFilter(), //Added, Modified, and RecentActivity are automatically set\n                RecentActivity = GetTodayFilter(),\n                Modified = GetTodayFilter(),\n                LastActivity = new EnumFilterItemProperties(new List<int> { (int)PastTimeSegment.Never, (int)PastTimeSegment.PastYear, (int)PastTimeSegment.PastWeek }),\n                PlayTime = new EnumFilterItemProperties(new List<int> { (int)PlaytimeCategory.NotPlayed, (int)PlaytimeCategory.LessThenHour, (int)PlaytimeCategory.O1_10 }),\n                InstallSize = new EnumFilterItemProperties(new List<int> { (int)InstallSizeGroup.None, (int)InstallSizeGroup.S0_0MB_100MB, (int)InstallSizeGroup.S2_1GB_5GB }),\n                CommunityScore = scoreFilter,\n                CriticScore = scoreFilter,\n                UserScore = scoreFilter,\n                Library = new IdItemFilterItemProperties(new List<Guid> { Guid.Empty, SteamPluginId, XboxPluginId }),\n                Source = new IdItemFilterItemProperties(new List<Guid>(GameDatabase.Sources.Select(x => x.Id)) { Guid.Empty }),\n                CompletionStatuses = new IdItemFilterItemProperties(new List<Guid>(GameDatabase.CompletionStatuses.Select(x => x.Id)) { Guid.Empty }),\n                UseAndFilteringStyle = true,\n            };\n\n            var filteredGames = GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n\n            AssertCollectionsContentsAreEqual(filteredGames, GameNone, GameA, GameB);\n        }\n\n        [Test]\n        public void MultipleValueFieldsMatchAny()\n        {\n            var filterSettings = GetMultipleValueFieldFilterSettings();\n            var filteredGames = GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n\n            AssertCollectionsContentsAreEqual(filteredGames, GameA, GameB, GameBoth);\n        }\n\n        [Test]\n        public void MultipleValueFieldsMatchAll()\n        {\n            var filterSettings = GetMultipleValueFieldFilterSettings();\n            filterSettings.UseAndFilteringStyle = true;\n\n            var filteredGames = GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n\n            AssertCollectionsContentsAreEqual(filteredGames, GameBoth);\n        }\n\n        [Test]\n        public void NameFilter()\n        {\n            void AssertNameMatch(string nameFilter, bool useFuzzyNameMatch, params Game[] expected)\n            {\n                var filterSettings = new FilterSettings { Name = nameFilter };\n                var filteredGames = GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch).ToList();\n\n                AssertCollectionsContentsAreEqual(filteredGames, expected);\n            }\n\n            AssertNameMatch(\"alpha\", false, GameA);\n            AssertNameMatch(\"alpha\", true, GameA); //see if fuzzy filter matches exact strings too\n            AssertNameMatch(\"!alpha\", true, GameA); //! at the start of strings makes the matching exact instead of fuzzy\n            AssertNameMatch(\"game alpga\", true, GameA);\n            AssertNameMatch(\"game alpga\", false, expected: Array.Empty<Game>());\n            AssertNameMatch(\"!game alpga\", true, expected: Array.Empty<Game>());\n            AssertNameMatch(\"^A\", false, expected: Array.Empty<Game>()); //^ at the start of strings matches the name grouping character\n            AssertNameMatch(\"^A\", true, expected: Array.Empty<Game>());\n            AssertNameMatch(\"^G\", false, GameNone, GameA, GameB, GameBoth);\n            AssertNameMatch(\"^G\", true, GameNone, GameA, GameB, GameBoth);\n        }\n\n        [Test]\n        public void InstallFilterEmpty()\n        {\n            void AssertAllGamesAreInFilter(FilterSettings filterSettings)\n            {\n                var filteredGames = GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n\n                AssertCollectionsContentsAreEqual(filteredGames, GameNone, GameA, GameB, GameBoth);\n            }\n\n            AssertAllGamesAreInFilter(new FilterSettings { IsInstalled = false, IsUnInstalled = false });\n            AssertAllGamesAreInFilter(new FilterSettings { IsInstalled = true, IsUnInstalled = true });\n        }\n\n        [Test]\n        public void FilterInstalled()\n        {\n            var filterSettings = new FilterSettings { IsInstalled = true };\n            var filteredGames = GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n\n            AssertCollectionsContentsAreEqual(filteredGames, GameA, GameBoth);\n        }\n\n        [Test]\n        public void FilterUninstalled()\n        {\n            var filterSettings = new FilterSettings { IsUnInstalled = true };\n            var filteredGames = GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n\n            AssertCollectionsContentsAreEqual(filteredGames, GameNone, GameB);\n        }\n\n        [Test]\n        public void FilterFavorite()\n        {\n            var filterSettings = new FilterSettings { Favorite = true };\n            var filteredGames = GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n\n            AssertCollectionsContentsAreEqual(filteredGames, GameA, GameBoth);\n        }\n\n        [Test]\n        public void FilterHidden()\n        {\n            var filterSettings = new FilterSettings { Hidden = true };\n            var filteredGames = GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n\n            AssertCollectionsContentsAreEqual(filteredGames, GameHidden);\n        }\n\n        [Test]\n        public void FilterVersion()\n        {\n            var filterSettings = new FilterSettings { Version = \"1.\" };\n            var filteredGames = GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n\n            AssertCollectionsContentsAreEqual(filteredGames, GameA, GameB);\n        }\n\n        [Test]\n        public void FilterMultipleValuesByName()\n        {\n            List<Game> FilterFeatures(string featureFilterText, bool and)\n            {\n                var filterSettings = new FilterSettings\n                {\n                    Feature = new IdItemFilterItemProperties(featureFilterText),\n                    UseAndFilteringStyle = and,\n                };\n                return GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n            }\n\n            // \"player\" matches both Singleplayer and Multiplayer, but counts as 1 condition, thus it matches all 3 of these games\n            AssertCollectionsContentsAreEqual(FilterFeatures(\"player\", true), GameA, GameB, GameBoth);\n            AssertCollectionsContentsAreEqual(FilterFeatures(\"single, multi\", true), GameBoth);\n\n            AssertCollectionsContentsAreEqual(FilterFeatures(\"player\", false), GameA, GameB, GameBoth);\n            AssertCollectionsContentsAreEqual(FilterFeatures(\"single, multi\", false), GameA, GameB, GameBoth);\n        }\n\n        [Test]\n        public void FilterSingleValuesByName()\n        {\n            List<Game> FilterCompletionStatus(string completionFilterText, bool and)\n            {\n                var filterSettings = new FilterSettings\n                {\n                    CompletionStatuses = new IdItemFilterItemProperties(completionFilterText),\n                    UseAndFilteringStyle = and,\n                };\n                return GameDatabase.GetFilteredGames(filterSettings, useFuzzyNameMatch: false).ToList();\n            }\n\n            AssertCollectionsContentsAreEqual(FilterCompletionStatus(\"played\", true), GameA, GameB);\n            AssertCollectionsContentsAreEqual(FilterCompletionStatus(\"played\", false), GameA, GameB);\n            AssertCollectionsContentsAreEqual(FilterCompletionStatus(\"not played, beaten\", true), GameA, GameBoth);\n            AssertCollectionsContentsAreEqual(FilterCompletionStatus(\"not played, beaten\", false), GameA, GameBoth);\n        }\n\n        private FilterSettings GetMultipleValueFieldFilterSettings()\n        {\n            IdItemFilterItemProperties getIdFilter(IEnumerable<DatabaseObject> items)\n            {\n                return new IdItemFilterItemProperties(items.Select(x => x.Id).ToList());\n            }\n\n            return new FilterSettings\n            {\n                AgeRating = getIdFilter(GameDatabase.AgeRatings),\n                Category = getIdFilter(GameDatabase.Categories),\n                Developer = getIdFilter(GameDatabase.Companies),\n                Publisher = getIdFilter(GameDatabase.Companies),\n                Feature = getIdFilter(GameDatabase.Features),\n                Genre = getIdFilter(GameDatabase.Genres),\n                Platform = getIdFilter(GameDatabase.Platforms),\n                Region = getIdFilter(GameDatabase.Regions),\n                Series = getIdFilter(GameDatabase.Series),\n                Tag = getIdFilter(GameDatabase.Tags),\n            };\n        }\n\n        private static EnumFilterItemProperties GetTodayFilter() => new EnumFilterItemProperties((int)PastTimeSegment.Today);\n\n        /// <summary>\n        /// Assert that the items in two collections are the same, in any order\n        /// </summary>\n        /// <param name=\"actual\"></param>\n        /// <param name=\"expected\"></param>\n        /// <typeparam name=\"T\"></typeparam>\n        private static void AssertCollectionsContentsAreEqual<T>(List<T> actual, params T[] expected)\n        {\n            foreach (var x in expected)\n            {\n                Assert.Contains(x, actual);\n            }\n\n            Assert.AreEqual(expected.Length, actual.Count);\n        }\n    }\n}"
  },
  {
    "path": "source/Tests/Playnite.Tests/Database/GameLibraryTests.cs",
    "content": "﻿using Moq;\r\nusing NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Database\r\n{\r\n    [TestFixture]\r\n    public class GameLibraryTests\r\n    {\r\n        [Test]\r\n        public void PlaytimeImportTest()\r\n        {\r\n            var gameId = \"tesId\";\r\n            var libPlugin = new Mock<LibraryPlugin>(MockBehavior.Loose, null);\r\n            ulong timeToImport = 500;\r\n            libPlugin.Setup(a => a.Id).Returns(Guid.NewGuid());\r\n            libPlugin.Setup(a => a.GetGames(It.IsAny<LibraryGetGamesArgs>())).Returns(() => new List<GameMetadata>\r\n            {\r\n                new GameMetadata()\r\n                {\r\n                    GameId = gameId,\r\n                    Playtime = timeToImport\r\n                }\r\n            });\r\n\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            using (var token = new CancellationTokenSource())\r\n            {\r\n                db.OpenDatabase();\r\n\r\n                db.ImportGames(libPlugin.Object, token.Token, PlaytimeImportMode.NewImportsOnly);\r\n                Assert.AreEqual(timeToImport, db.Games.First().Playtime);\r\n\r\n                timeToImport = 600;\r\n                db.ImportGames(libPlugin.Object, token.Token, PlaytimeImportMode.Never);\r\n                Assert.AreEqual(500, db.Games.First().Playtime);\r\n                db.ImportGames(libPlugin.Object, token.Token, PlaytimeImportMode.Always);\r\n                Assert.AreEqual(timeToImport, db.Games.First().Playtime);\r\n\r\n                var g = db.Games.First();\r\n                g.Playtime = 0;\r\n                db.Games.Update(g);\r\n                Assert.AreEqual(0, db.Games.First().Playtime);\r\n                db.ImportGames(libPlugin.Object, token.Token, PlaytimeImportMode.Never);\r\n                Assert.AreEqual(0, db.Games.First().Playtime);\r\n\r\n                g.Playtime = 0;\r\n                db.Games.Update(g);\r\n                Assert.AreEqual(0, db.Games.First().Playtime);\r\n                db.ImportGames(libPlugin.Object, token.Token, PlaytimeImportMode.NewImportsOnly);\r\n                Assert.AreEqual(0, db.Games.First().Playtime);\r\n\r\n                db.ImportGames(libPlugin.Object, token.Token, PlaytimeImportMode.Always);\r\n                Assert.AreEqual(timeToImport, db.Games.First().Playtime);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void InstallSizeImportTest()\r\n        {\r\n            var gameId = \"testId\";\r\n            var libPlugin = new Mock<LibraryPlugin>(MockBehavior.Loose, null);\r\n            ulong? installSizeToImport = 200;\r\n            libPlugin.Setup(a => a.Id).Returns(Guid.NewGuid());\r\n            libPlugin.Setup(a => a.GetGames(It.IsAny<LibraryGetGamesArgs>())).Returns(() => new List<GameMetadata>\r\n            {\r\n                new GameMetadata()\r\n                {\r\n                    GameId = gameId,\r\n                    InstallSize = installSizeToImport,\r\n                    IsInstalled = true\r\n                }\r\n            });\r\n\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            using (var token = new CancellationTokenSource())\r\n            {\r\n                db.OpenDatabase();\r\n                db.ImportGames(libPlugin.Object, token.Token, PlaytimeImportMode.NewImportsOnly);\r\n                var g = db.Games.First();\r\n                Assert.AreEqual(installSizeToImport, g.InstallSize);\r\n                \r\n                installSizeToImport = 999;\r\n                db.ImportGames(libPlugin.Object, token.Token, PlaytimeImportMode.Always);\r\n                Assert.AreNotEqual(installSizeToImport, g.InstallSize);\r\n                \r\n                g.IsInstalled = false;\r\n                g.OverrideInstallState = true;\r\n                db.Games.Update(g);\r\n                db.ImportGames(libPlugin.Object, token.Token, PlaytimeImportMode.Always);\r\n                Assert.AreEqual(installSizeToImport, g.InstallSize);\r\n\r\n                g.OverrideInstallState = false;\r\n                db.Games.Update(g);\r\n                installSizeToImport = null;\r\n                db.ImportGames(libPlugin.Object, token.Token, PlaytimeImportMode.Always);\r\n                Assert.AreNotEqual(installSizeToImport, g.InstallSize);\r\n\r\n                installSizeToImport = 0;\r\n                db.ImportGames(libPlugin.Object, token.Token, PlaytimeImportMode.Always);\r\n                Assert.AreNotEqual(installSizeToImport, g.InstallSize);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Database/ItemCollectionTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Database\r\n{\r\n    [TestFixture]\r\n    public class ItemCollectionTests\r\n    {\r\n        [Test]\r\n        public void AddTest()\r\n        {\r\n            var newGame = new Game(\"TestGame\");\r\n            using (var temp = TempDirectory.Create())\r\n            using (var col = new ItemCollection<Game>(Path.Combine(temp.TempPath, \"db\"), null))\r\n            {\r\n                col.Add(newGame);\r\n                Assert.AreEqual(1, col.Count);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void EventsInvokeCountNonBufferedTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var col = new ItemCollection<DatabaseObject>(Path.Combine(temp.TempPath, \"db\"), null))\r\n            {\r\n                var itemUpdates = 0;\r\n                var colUpdates = 0;\r\n                col.ItemUpdated += (e, args) => itemUpdates++;\r\n                col.ItemCollectionChanged += (e, args) => colUpdates++;\r\n\r\n                var item = new DatabaseObject();\r\n                col.Add(item);\r\n                col.Update(item);\r\n                col.Remove(item);\r\n                Assert.AreEqual(1, itemUpdates);\r\n                Assert.AreEqual(2, colUpdates);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void EventsInvokeCountBufferedTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var col = new ItemCollection<DatabaseObject>(Path.Combine(temp.TempPath, \"db\"), null))\r\n            {\r\n                var itemUpdates = 0;\r\n                var colUpdates = 0;\r\n                col.ItemUpdated += (e, args) => itemUpdates++;\r\n                col.ItemCollectionChanged += (e, args) => colUpdates++;\r\n\r\n                var item = new DatabaseObject();\r\n                col.BeginBufferUpdate();\r\n                col.Add(item);\r\n                col.Update(item);\r\n                col.Remove(item);\r\n                Assert.AreEqual(0, itemUpdates);\r\n                Assert.AreEqual(0, colUpdates);\r\n                col.EndBufferUpdate();\r\n                Assert.AreEqual(1, itemUpdates);\r\n                Assert.AreEqual(1, colUpdates);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void EventsArgsNonBufferedTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var col = new ItemCollection<DatabaseObject>(Path.Combine(temp.TempPath, \"db\"), null))\r\n            {\r\n                ItemCollectionChangedEventArgs<DatabaseObject> itemColArgs = null;\r\n                ItemUpdatedEventArgs<DatabaseObject> itemUpdateArgs = null;\r\n                col.ItemUpdated += (e, args) => itemUpdateArgs = args;\r\n                col.ItemCollectionChanged += (e, args) => itemColArgs = args;\r\n                var item = new DatabaseObject() { Name = \"Original\" };\r\n\r\n                col.Add(item);\r\n                Assert.AreEqual(1, itemColArgs.AddedItems.Count);\r\n                Assert.AreEqual(item, itemColArgs.AddedItems[0]);\r\n                Assert.AreEqual(0, itemColArgs.RemovedItems.Count);\r\n\r\n                item.Name = \"New\";\r\n                col.Update(item);\r\n                Assert.AreEqual(1, itemUpdateArgs.UpdatedItems.Count);\r\n                Assert.AreEqual(\"Original\", itemUpdateArgs.UpdatedItems[0].OldData.Name);\r\n                Assert.AreEqual(\"New\", itemUpdateArgs.UpdatedItems[0].NewData.Name);\r\n\r\n                col.Remove(item);\r\n                Assert.AreEqual(0, itemColArgs.AddedItems.Count);\r\n                Assert.AreEqual(1, itemColArgs.RemovedItems.Count);\r\n                Assert.AreEqual(item, itemColArgs.RemovedItems[0]);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void EventsArgsBufferedTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var col = new ItemCollection<DatabaseObject>(Path.Combine(temp.TempPath, \"db\"), null))\r\n            {\r\n                ItemCollectionChangedEventArgs<DatabaseObject> itemColArgs = null;\r\n                ItemUpdatedEventArgs<DatabaseObject> itemUpdateArgs = null;\r\n                col.ItemUpdated += (e, args) => itemUpdateArgs = args;\r\n                col.ItemCollectionChanged += (e, args) => itemColArgs = args;\r\n                var item = new DatabaseObject();\r\n\r\n                col.BeginBufferUpdate();\r\n                col.Add(item);\r\n                col.Update(item);\r\n                col.Remove(item);\r\n                Assert.IsNull(itemColArgs);\r\n                Assert.IsNull(itemUpdateArgs);\r\n\r\n                col.EndBufferUpdate();\r\n                Assert.AreEqual(1, itemColArgs.AddedItems.Count);\r\n                Assert.AreEqual(1, itemColArgs.RemovedItems.Count);\r\n                Assert.AreEqual(1, itemUpdateArgs.UpdatedItems.Count);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void NestedBufferTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var col = new ItemCollection<DatabaseObject>(Path.Combine(temp.TempPath, \"db\"), null))\r\n            {\r\n                var colChanges = 0;\r\n                var colUpdates = 0;\r\n                col.ItemUpdated += (e, args) => colUpdates++;\r\n                col.ItemCollectionChanged += (e, args) => colChanges++;\r\n                var item = new DatabaseObject();\r\n\r\n                col.BeginBufferUpdate();\r\n                col.BeginBufferUpdate();\r\n                col.BeginBufferUpdate();\r\n                col.Add(item);\r\n                col.Update(item);\r\n                col.EndBufferUpdate();\r\n                Assert.AreEqual(0, colChanges);\r\n                Assert.AreEqual(0, colChanges);\r\n                col.EndBufferUpdate();\r\n                Assert.AreEqual(0, colChanges);\r\n                Assert.AreEqual(0, colChanges);\r\n                col.EndBufferUpdate();\r\n                Assert.AreEqual(1, colUpdates);\r\n                Assert.AreEqual(1, colChanges);\r\n\r\n                col.BeginBufferUpdate();\r\n                col.Update(item);\r\n                col.EndBufferUpdate();\r\n                Assert.AreEqual(2, colUpdates);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void BufferConsolidationTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var col = new ItemCollection<DatabaseObject>(Path.Combine(temp.TempPath, \"db\"), null))\r\n            {\r\n                ItemCollectionChangedEventArgs<DatabaseObject> colChanges = null;\r\n                ItemUpdatedEventArgs<DatabaseObject> colUpdates = null;\r\n                col.ItemUpdated += (e, args) => colUpdates = args;\r\n                col.ItemCollectionChanged += (e, args) => colChanges = args;\r\n\r\n                var item = new DatabaseObject() { Name = \"Original\" };\r\n                col.Add(item);\r\n\r\n                col.BeginBufferUpdate();\r\n                item.Name = \"Change1\";\r\n                col.Update(item);\r\n                item.Name = \"Change2\";\r\n                col.Update(item);\r\n                col.EndBufferUpdate();\r\n                Assert.AreEqual(1, colUpdates.UpdatedItems.Count);\r\n                Assert.AreEqual(\"Original\", colUpdates.UpdatedItems[0].OldData.Name);\r\n                Assert.AreEqual(\"Change2\", colUpdates.UpdatedItems[0].NewData.Name);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/DictionaryTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class DictionaryTests\r\n    {\r\n        [Test]\r\n        public void AddOrUpdateTest()\r\n        {\r\n            var dict = new Dictionary<int, int>\r\n            {\r\n                { 1, 0 }\r\n            };\r\n\r\n            dict.AddOrUpdate(1, 2);\r\n            Assert.AreEqual(1, dict.Keys.Count);\r\n            Assert.AreEqual(2, dict[1]);\r\n\r\n            dict.AddOrUpdate(2, 3);\r\n            Assert.AreEqual(2, dict.Keys.Count);\r\n            Assert.AreEqual(3, dict[2]);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Emulators/EmulationDatabaseTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.IO.Abstractions.TestingHelpers;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing static Playnite.Emulators.EmulationDatabase;\r\n\r\nnamespace Playnite.Tests.Emulators\r\n{\r\n    [TestFixture]\r\n    public class EmulationDatabaseTests\r\n    {\r\n        [Test]\r\n        public void GetByTests()\r\n        {\r\n            var dbFile = Path.Combine(PlayniteTests.ResourcesPath, \"Sony - PlayStation Vita.db\");\r\n            using (var reader = new EmulationDatabaseReader(dbFile))\r\n            {\r\n                var games = reader.GetByCrc(\"FDDB3297\").ToList();\r\n                Assert.AreEqual(1, games.Count);\r\n                Assert.AreEqual(\"Terraria (Europe)\", games[0].Name);\r\n\r\n                games = reader.GetBySerial(\"PCSE-00244\").ToList();\r\n                Assert.AreEqual(1, games.Count);\r\n                Assert.AreEqual(\"Valhalla Knights 3 (USA)\", games[0].Name);\r\n\r\n                games = reader.GetByRomName(\"Unit 13 (Europe) (En,Fr,De,It).vpk\").ToList();\r\n                Assert.AreEqual(1, games.Count);\r\n                Assert.AreEqual(\"PCSF-00068\", games[0].Serial);\r\n\r\n                games = reader.GetByRomNamePartial(\"zero escape - the nonary games\").ToList();\r\n                Assert.AreEqual(1, games.Count);\r\n                Assert.AreEqual(\"Zero Escape - The Nonary Games (USA)\", games[0].Name);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Emulators/EmulationTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Emulators;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.IO.Abstractions.TestingHelpers;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing static Playnite.Emulators.EmulationDatabase;\r\n\r\nnamespace Playnite.Tests.Emulators\r\n{\r\n    [TestFixture]\r\n    public class EmulationTests\r\n    {\r\n        [Test]\r\n        public void RomNameParsingTest()\r\n        {\r\n            var romName = new RomName(\"Final Fantasy VII (Europe) (Disc 1)[SCES-00867]\");\r\n            Assert.AreEqual(\"Disc 1\", romName.DiscName);\r\n            Assert.AreEqual(\"Final Fantasy VII\", romName.SanitizedName);\r\n            Assert.AreEqual(\"Europe\", romName.Properties[0]);\r\n            Assert.AreEqual(\"Disc 1\", romName.Properties[1]);\r\n            Assert.AreEqual(\"SCES-00867\", romName.Properties[2]);\r\n\r\n            romName = new RomName(\"Battlezone 2000(USA, Europe)\");\r\n            Assert.AreEqual(\"Battlezone 2000\", romName.SanitizedName);\r\n            Assert.AreEqual(\"USA\", romName.Properties[0]);\r\n            Assert.AreEqual(\"Europe\", romName.Properties[1]);\r\n        }\r\n\r\n        //[Test]\r\n        //public void TempTest()\r\n        //{\r\n        //    var emu = EmulatorDefinition.Definitions.First(a => a.Name == \"DuckStation\").Profiles[0];\r\n        //    var roms = GameScanner.ScanDirectory(\r\n        //        @\"\",\r\n        //        emu.ImageExtensions,\r\n        //        emu.Platforms,\r\n        //        @\"\",\r\n        //        new List<string>(),\r\n        //        new System.Threading.CancellationTokenSource().Token);\r\n        //}\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Emulators/EmulatorDefinitionTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Emulators;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Emulators\r\n{\r\n    [TestFixture]\r\n    public class EmulatorDefinitionTest\r\n    {\r\n        [Test]\r\n        public void GetDefinitionsTest()\r\n        {\r\n            CollectionAssert.IsNotEmpty(Emulation.Definitions);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Emulators/EmulatorScannerTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Emulators;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Emulators\r\n{\r\n    [TestFixture]\r\n    public class EmulatorScannerTests\r\n    {\r\n        [Test]\r\n        public void RelativePathTest()\r\n        {\r\n            var programDir = PlaynitePaths.ProgramPath;\r\n            var emuDef = new EmulatorDefinition\r\n            {\r\n                Id = \"testApp\",\r\n                Name = \"Test App\",\r\n                Profiles = new List<EmulatorDefinitionProfile>\r\n            {\r\n                new EmulatorDefinitionProfile\r\n                {\r\n                    ImageExtensions = new List<string> { \"iso\", \"mp3\" },\r\n                    Name = \"default\",\r\n                    StartupExecutable = @\"^TestApp\\.exe$\",\r\n                    StartupArguments = \"some args\"\r\n                }\r\n            }\r\n            };\r\n\r\n            var emus = EmulatorScanner.SearchForEmulators(programDir, new List<EmulatorDefinition> { emuDef }, CancellationToken.None);\r\n            Assert.AreEqual(1, emus.Count);\r\n            Assert.AreEqual(@\"{PlayniteDir}\\TestApp\", emus[0].InstallDir);\r\n\r\n            using (var temp = TempDirectory.Create())\r\n            {\r\n                FileSystem.CopyDirectory(TestPaths.TestAppDir, Path.Combine(temp.TempPath, \"TestApp\"));\r\n                emus = EmulatorScanner.SearchForEmulators(temp.TempPath, new List<EmulatorDefinition> { emuDef }, CancellationToken.None);\r\n                Assert.AreEqual(1, emus.Count);\r\n                Assert.AreEqual(Path.Combine(temp.TempPath, \"TestApp\"), emus[0].InstallDir);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Emulators/ScannedGameTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Emulators;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Emulators\r\n{\r\n    [TestFixture]\r\n    public class ScannedGameTests\r\n    {\r\n        [Test]\r\n        public void ToGameImportWithRelativeEmuPathsTest()\r\n        {\r\n            var emulator = new Emulator\r\n            {\r\n                InstallDir = @\"c:\\emudir\\\"\r\n            };\r\n\r\n            var config = new GameScannerConfig\r\n            {\r\n                ImportWithRelativePaths = true\r\n            };\r\n\r\n            var scannedGame = new ScannedGame\r\n            {\r\n                Roms = new ObservableCollection<ScannedRom>\r\n                {\r\n                    new ScannedRom(@\"c:\\emudir\\rom1name.iso\"),\r\n                    new ScannedRom(@\"c:\\emudir\\games\\rom2name.iso\")\r\n                },\r\n                SourceEmulator = emulator,\r\n                SourceConfig = config\r\n            };\r\n\r\n            var newGame = scannedGame.ToGame();\r\n            Assert.AreEqual(@\"{EmulatorDir}\\\", newGame.InstallDirectory);\r\n            Assert.AreEqual(@\"{InstallDir}\\rom1name.iso\", newGame.Roms[0].Path);\r\n            Assert.AreEqual(@\"{InstallDir}\\games\\rom2name.iso\", newGame.Roms[1].Path);\r\n\r\n            config.ImportWithRelativePaths = false;\r\n            newGame = scannedGame.ToGame();\r\n            Assert.AreEqual(@\"c:\\emudir\\\", newGame.InstallDirectory);\r\n            Assert.AreEqual(@\"{InstallDir}\\rom1name.iso\", newGame.Roms[0].Path);\r\n            Assert.AreEqual(@\"{InstallDir}\\games\\rom2name.iso\", newGame.Roms[1].Path);\r\n        }\r\n\r\n        [Test]\r\n        public void ToGameImportWithRelativeProgramDirPathsTest()\r\n        {\r\n            var emulator = new Emulator\r\n            {\r\n                InstallDir = @\"c:\\emudir\\\"\r\n            };\r\n\r\n            var config = new GameScannerConfig\r\n            {\r\n                ImportWithRelativePaths = true\r\n            };\r\n\r\n            var programDir = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);\r\n            var scannedGame = new ScannedGame\r\n            {\r\n                Roms = new ObservableCollection<ScannedRom>\r\n                {\r\n                    new ScannedRom(Path.Combine(programDir, \"rom1name.iso\")),\r\n                    new ScannedRom(Path.Combine(programDir, @\"games\\rom2name.iso\"))\r\n                },\r\n                SourceEmulator = emulator,\r\n                SourceConfig = config\r\n            };\r\n\r\n            var newGame = scannedGame.ToGame();\r\n            Assert.AreEqual(@\"{PlayniteDir}\\\", newGame.InstallDirectory);\r\n            Assert.AreEqual(@\"{InstallDir}\\rom1name.iso\", newGame.Roms[0].Path);\r\n            Assert.AreEqual(@\"{InstallDir}\\games\\rom2name.iso\", newGame.Roms[1].Path);\r\n\r\n            config.ImportWithRelativePaths = false;\r\n            newGame = scannedGame.ToGame();\r\n            Assert.AreEqual(programDir.TrimEnd(Path.DirectorySeparatorChar), newGame.InstallDirectory.TrimEnd(Path.DirectorySeparatorChar));\r\n            Assert.AreEqual(@\"{InstallDir}\\rom1name.iso\", newGame.Roms[0].Path);\r\n            Assert.AreEqual(@\"{InstallDir}\\games\\rom2name.iso\", newGame.Roms[1].Path);\r\n\r\n            emulator.InstallDir = @\"{PlayniteDir}\";\r\n            config.ImportWithRelativePaths = true;\r\n            newGame = scannedGame.ToGame();\r\n            Assert.AreEqual(@\"{EmulatorDir}\\\", newGame.InstallDirectory);\r\n            Assert.AreEqual(@\"{InstallDir}\\rom1name.iso\", newGame.Roms[0].Path);\r\n            Assert.AreEqual(@\"{InstallDir}\\games\\rom2name.iso\", newGame.Roms[1].Path);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Emulators/ScannerTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Emulators;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.IO.Compression;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Emulators\r\n{\r\n    [TestFixture]\r\n    public class ScannerTests\r\n    {\r\n        [Test]\r\n        public void DoubleExtensionTest() // #2768 bug\r\n        {\r\n            using (var tempPath = TempDirectory.Create())\r\n            {\r\n                var path1 = Path.Combine(tempPath.TempPath, \"game 1.p8\");\r\n                var path2 = Path.Combine(tempPath.TempPath, \"game 2.p8.png\");\r\n                FileSystem.CreateFile(path1);\r\n                FileSystem.CreateFile(path2);\r\n                FileSystem.CreateFile(Path.Combine(tempPath.TempPath, \"game 3.png\"));\r\n\r\n                var scanner = new GameScanner(new SDK.Models.GameScannerConfig(), null);\r\n                var scanResults = new List<ScannedGame>();\r\n                scanner.ScanDirectoryBase(\r\n                    tempPath.TempPath,\r\n                    new List<string> { \"p8\", \"p8.png\" },\r\n                    null,\r\n                    scanResults,\r\n                    new System.Threading.CancellationTokenSource().Token,\r\n                    null,\r\n                    true,\r\n                    true,\r\n                    true);\r\n\r\n                Assert.AreEqual(2, scanResults.Count);\r\n                Assert.AreEqual(\"game 1\", scanResults[0].Name);\r\n                Assert.AreEqual(path1, scanResults[0].Roms[0].Path);\r\n                Assert.AreEqual(\"game 2\", scanResults[1].Name);\r\n                Assert.AreEqual(path2, scanResults[1].Roms[0].Path);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void GzipHandlingTest() // #3357 bug\r\n        {\r\n            using (var tempPath = TempDirectory.Create())\r\n            {\r\n                var path1 = Path.Combine(tempPath.TempPath, \"game 1.iso.gz\");\r\n                var path2 = Path.Combine(tempPath.TempPath, \"game 2.test.iso\");\r\n                var path3 = Path.Combine(tempPath.TempPath, \"game 3.gz\");\r\n                FileSystem.CreateFile(path1);\r\n                FileSystem.CreateFile(path2);\r\n                FileSystem.CreateFile(path3);\r\n\r\n                var scanner = new GameScanner(new SDK.Models.GameScannerConfig(), null);\r\n                var scanResults = new List<ScannedGame>();\r\n                scanner.ScanDirectoryBase(\r\n                    tempPath.TempPath,\r\n                    new List<string> { \"gz\", \"iso\" },\r\n                    null,\r\n                    scanResults,\r\n                    new System.Threading.CancellationTokenSource().Token,\r\n                    null,\r\n                    true,\r\n                    true,\r\n                    true);\r\n\r\n                Assert.AreEqual(3, scanResults.Count);\r\n                Assert.AreEqual(\"game 1\", scanResults[0].Name);\r\n                Assert.AreEqual(path1, scanResults[0].Roms[0].Path);\r\n                Assert.AreEqual(\"game 2.test\", scanResults[1].Name);\r\n                Assert.AreEqual(path2, scanResults[1].Roms[0].Path);\r\n                Assert.AreEqual(\"game 3\", scanResults[2].Name);\r\n                Assert.AreEqual(path3, scanResults[2].Roms[0].Path);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void MultiDiskRegionTest() // #2573 bug\r\n        {\r\n            using (var tempPath = TempDirectory.Create())\r\n            using (var db = new GameDbTestWrapper(tempPath))\r\n            {\r\n                var isos = new List<string>\r\n                {\r\n                    Path.Combine(tempPath.TempPath, \"test game (Europe) (Disc 1).iso\"),\r\n                    Path.Combine(tempPath.TempPath, \"test game (Europe) (Disc 2).iso\"),\r\n                    Path.Combine(tempPath.TempPath, \"test game (USA) (Disc 1).iso\"),\r\n                    Path.Combine(tempPath.TempPath, \"test game (USA) (Disc 2).iso\"),\r\n                    Path.Combine(tempPath.TempPath, \"test game (JP) (EE) (Disc 1).iso\"),\r\n                    Path.Combine(tempPath.TempPath, \"test game (JP) (EE) (Disc 2).iso\"),\r\n                };\r\n\r\n                isos.ForEach(a => FileSystem.CreateFile(a));\r\n                var emu = TestAppTools.GetEmulatorObj();\r\n                db.DB.Emulators.Add(emu);\r\n                var config = new GameScannerConfig\r\n                {\r\n                    EmulatorId = emu.Id,\r\n                    EmulatorProfileId = emu.CustomProfiles[0].Id,\r\n                    Directory = tempPath.TempPath\r\n                };\r\n\r\n                var scanner = new GameScanner(config, db.DB);\r\n                var games = scanner.Scan(CancellationToken.None, out var newPlatforms, out var newRegions);\r\n\r\n                Assert.AreEqual(1, games.Count);\r\n                var game = games[0].ToGame();\r\n                Assert.AreEqual(6, game.Roms.Count);\r\n                Assert.AreEqual(\"test game\", game.Name);\r\n                Assert.AreEqual(\"Disc 1 - Europe\", game.Roms[0].Name);\r\n                Assert.AreEqual(\"Disc 2 - Europe\", game.Roms[1].Name);\r\n                Assert.AreEqual(\"Disc 1 - JP - EE\", game.Roms[2].Name);\r\n                Assert.AreEqual(\"Disc 2 - JP - EE\", game.Roms[3].Name);\r\n                Assert.AreEqual(\"Disc 1 - USA\", game.Roms[4].Name);\r\n                Assert.AreEqual(\"Disc 2 - USA\", game.Roms[5].Name);\r\n\r\n                config.MergeRelatedFiles = false;\r\n                games = scanner.Scan(CancellationToken.None, out var _, out var _);\r\n                Assert.AreEqual(6, games.Count);\r\n                games.ForEach(a => Assert.AreEqual(\"test game\", a.Name));\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void SubfolderScanOptionTest()\r\n        {\r\n            using (var tempPath = TempDirectory.Create())\r\n            using (var db = new GameDbTestWrapper(tempPath))\r\n            {\r\n                var isos = new List<string>\r\n                {\r\n                    Path.Combine(tempPath.TempPath, \"test_root.iso\"),\r\n                    Path.Combine(tempPath.TempPath, \"sub\", \"test_sub.iso\"),\r\n                    Path.Combine(tempPath.TempPath, \"sub\", \"sub2\", \"test_sub2.iso\")\r\n                };\r\n\r\n                isos.ForEach(a => FileSystem.CreateFile(a));\r\n                var emu = TestAppTools.GetEmulatorObj();\r\n                db.DB.Emulators.Add(emu);\r\n                var config = new GameScannerConfig\r\n                {\r\n                    EmulatorId = emu.Id,\r\n                    EmulatorProfileId = emu.CustomProfiles[0].Id,\r\n                    Directory = tempPath.TempPath,\r\n                    ScanSubfolders = true\r\n                };\r\n\r\n                var scanner = new GameScanner(config, db.DB);\r\n                var games = scanner.Scan(CancellationToken.None, out var newPlatforms, out var newRegions);\r\n                Assert.AreEqual(3, games.Count);\r\n\r\n                config.ScanSubfolders = false;\r\n                games = scanner.Scan(CancellationToken.None, out newPlatforms, out newRegions);\r\n                Assert.AreEqual(1, games.Count);\r\n                Assert.AreEqual(\"test root\", games[0].Name);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void ScanInsideArchivesOptionTest()\r\n        {\r\n            using (var tempPath = TempDirectory.Create())\r\n            using (var db = new GameDbTestWrapper(tempPath))\r\n            {\r\n                var archFile = Path.Combine(tempPath.TempPath, \"archive\", \"test.mp3\");\r\n                FileSystem.WriteStringToFile(archFile, \"AAA\");\r\n                ZipFile.CreateFromDirectory(Path.Combine(tempPath.TempPath, \"archive\"), Path.Combine(tempPath.TempPath, \"archive.zip\"), CompressionLevel.Fastest, false);\r\n                FileSystem.DeleteFile(archFile);\r\n                FileSystem.CreateFile(Path.Combine(tempPath.TempPath, \"test2.iso\"));\r\n\r\n                var platform = TestAppTools.GetPlatformObj();\r\n                db.DB.Platforms.Add(platform);\r\n                var emu = TestAppTools.GetEmulatorObj();\r\n                emu.CustomProfiles[0].Platforms = new List<Guid> { platform.Id };\r\n                db.DB.Emulators.Add(emu);\r\n\r\n                var config = new GameScannerConfig\r\n                {\r\n                    EmulatorId = emu.Id,\r\n                    EmulatorProfileId = emu.CustomProfiles[0].Id,\r\n                    Directory = tempPath.TempPath,\r\n                    ScanSubfolders = true,\r\n                    ScanInsideArchives = true\r\n                };\r\n\r\n                var scanner = new GameScanner(config, db.DB,\r\n                    (platformIds) => platformIds?.Contains(TestAppTools.PlatformSpecId) == true ? new List<EmulationDatabase.IEmulationDatabaseReader>\r\n                    {\r\n                        new TestEmulationDatabaseReader(\r\n                            \"test\",\r\n                            // 66A031A7 matches generated test.mp3\r\n                            (romCrc) => romCrc == \"66A031A7\" ? new List<DatGame>() { new DatGame { Name = \"crc match\", RomName = \"crc match\" } } : new List<DatGame>(),\r\n                            (__) => new List<DatGame>(),\r\n                            (__) => new List<DatGame>(),\r\n                            (__) => new List<DatGame>())\r\n                    } : new List<EmulationDatabase.IEmulationDatabaseReader>());\r\n\r\n                var games = scanner.Scan(CancellationToken.None, out var newPlatforms, out var newRegions);\r\n                Assert.AreEqual(2, games.Count);\r\n                Assert.AreEqual(\"crc match\", games[0].Name);\r\n                Assert.AreEqual(\"test2\", games[1].Name);\r\n\r\n                config.ScanInsideArchives = false;\r\n                games = scanner.Scan(CancellationToken.None, out newPlatforms, out newRegions);\r\n                Assert.AreEqual(2, games.Count);\r\n                Assert.AreEqual(\"archive\", games[0].Name);\r\n                Assert.AreEqual(\"test2\", games[1].Name);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void PlaylistImportTest()\r\n        {\r\n            using (var tempPath = TempDirectory.Create())\r\n            using (var db = new GameDbTestWrapper(tempPath))\r\n            {\r\n                var scanner = new GameScanner(new GameScannerConfig(), null);\r\n                var cuePath = Path.Combine(tempPath.TempPath, \"cuefile.cue\");\r\n                var binPath = Path.Combine(tempPath.TempPath, \"binfile.bin\");\r\n\r\n                // Normal import\r\n                FileSystem.WriteStringToFile(cuePath, @\"FILE \"\"binfile.bin\"\" BINARY\");\r\n                FileSystem.CreateFile(binPath);\r\n\r\n                var scanResults = new List<ScannedGame>();\r\n                scanner.ScanDirectoryBase(\r\n                    tempPath.TempPath,\r\n                    new List<string> { \"bin\", \"cue\" },\r\n                    null,\r\n                    scanResults,\r\n                    CancellationToken.None,\r\n                    null,\r\n                    true,\r\n                    true,\r\n                    true);\r\n\r\n                Assert.AreEqual(1, scanResults.Count);\r\n                Assert.IsNotNull(scanResults.FirstOrDefault(a => a.Name == \"cuefile\"));\r\n\r\n                // Case sensitivity test\r\n                FileSystem.WriteStringToFile(cuePath, @\"FILE \"\"BINFILE.BIN\"\" BINARY\");\r\n                scanResults = new List<ScannedGame>();\r\n                scanner.ScanDirectoryBase(\r\n                    tempPath.TempPath,\r\n                    new List<string> { \"bin\", \"cue\" },\r\n                    null,\r\n                    scanResults,\r\n                    CancellationToken.None,\r\n                    null,\r\n                    true,\r\n                    true,\r\n                    true);\r\n\r\n                Assert.AreEqual(1, scanResults.Count);\r\n                Assert.IsNotNull(scanResults.FirstOrDefault(a => a.Name == \"cuefile\"));\r\n\r\n                // Playlist already imported test\r\n                scanResults = new List<ScannedGame>();\r\n                scanner.importedFiles = new HashSet<string> { cuePath };\r\n                scanner.ScanDirectoryBase(\r\n                  tempPath.TempPath,\r\n                  new List<string> { \"bin\", \"cue\" },\r\n                  null,\r\n                  scanResults,\r\n                  CancellationToken.None,\r\n                  null,\r\n                  true,\r\n                    true,\r\n                  true);\r\n\r\n                Assert.AreEqual(0, scanResults.Count);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void ExclusionFileTest()\r\n        {\r\n            var exList = new List<string>\r\n            {\r\n                @\"file1.file\"\r\n            };\r\n\r\n            var scanDir = @\"c:\\emudir\\\";\r\n            var parsed = GameScanner.ParseExclusions(scanDir, exList);\r\n            var matches = GameScanner.GetFileExclusionMatches(new List<string>\r\n            {\r\n                @\"c:\\emudir\\test\\file1.file\",\r\n                @\"c:\\emudir\\file1.file\"\r\n            }, parsed);\r\n\r\n            Assert.AreEqual(1, matches.Count);\r\n            Assert.AreEqual(@\"c:\\emudir\\file1.file\", matches[0]);\r\n\r\n            // Any sub-dir match\r\n            exList = new List<string>\r\n            {\r\n                @\">file1.file\",\r\n                @\">dir\\file2.file\"\r\n            };\r\n\r\n            parsed = GameScanner.ParseExclusions(scanDir, exList);\r\n            matches = GameScanner.GetFileExclusionMatches(new List<string>\r\n            {\r\n                @\"c:\\emudir\\sub\\file1.file\",\r\n                @\"c:\\emudir\\file1.file\",\r\n                @\"c:\\emudir\\dir\\file2.file\",\r\n                @\"c:\\emudir\\sub\\dir\\file2.file\"\r\n            }, parsed);\r\n\r\n            Assert.AreEqual(4, matches.Count);\r\n\r\n            // Regex absolute match\r\n            exList = new List<string>\r\n            {\r\n                @\"?file\\d+\\.file$\",\r\n                @\"?dir\\\\file\\d+\\.file2$\"\r\n            };\r\n\r\n            parsed = GameScanner.ParseExclusions(scanDir, exList);\r\n            matches = GameScanner.GetFileExclusionMatches(new List<string>\r\n            {\r\n                @\"c:\\emudir\\file1.file\",\r\n                @\"c:\\emudir\\dir\\file2.file2\"\r\n            }, parsed);\r\n\r\n            Assert.AreEqual(2, matches.Count);\r\n\r\n            // Regex any level match\r\n            exList = new List<string>\r\n            {\r\n                @\">?file\\d+\\.file$\",\r\n                @\">?dir\\\\file\\d+\\.file2$\"\r\n            };\r\n\r\n            parsed = GameScanner.ParseExclusions(scanDir, exList);\r\n            matches = GameScanner.GetFileExclusionMatches(new List<string>\r\n            {\r\n                @\"c:\\emudir\\file1.file\",\r\n                @\"c:\\emudir\\sub\\file1.file\",\r\n                @\"c:\\emudir\\dir\\file2.file2\",\r\n                @\"c:\\emudir\\sub\\dir\\file2.file2\",\r\n                @\"c:\\emudir\\filethree.file\",\r\n            }, parsed);\r\n\r\n            Assert.AreEqual(4, matches.Count);\r\n        }\r\n\r\n        [Test]\r\n        public void ExclusionDirectoryTest()\r\n        {\r\n            var exList = new List<string>\r\n            {\r\n                @\"dir\"\r\n            };\r\n\r\n            var scanDir = @\"c:\\emudir\\\";\r\n            var parsed = GameScanner.ParseExclusions(scanDir, exList);\r\n            var matches = GameScanner.GetDirectoryExclusionMatches(new List<string>\r\n            {\r\n                @\"c:\\emudir\\dir\\\",\r\n                @\"c:\\emudir\\test\\dir\"\r\n            }, parsed);\r\n\r\n            Assert.AreEqual(1, matches.Count);\r\n            Assert.AreEqual(@\"c:\\emudir\\dir\\\", matches[0]);\r\n\r\n            // Any sub-dir match\r\n            exList = new List<string>\r\n            {\r\n                @\">dir\"\r\n            };\r\n\r\n            parsed = GameScanner.ParseExclusions(scanDir, exList);\r\n            matches = GameScanner.GetDirectoryExclusionMatches(new List<string>\r\n            {\r\n                @\"c:\\emudir\\dir\\\",\r\n                @\"c:\\emudir\\test\\dir\"\r\n            }, parsed);\r\n\r\n            Assert.AreEqual(2, matches.Count);\r\n\r\n            // Regex absolute match\r\n            exList = new List<string>\r\n            {\r\n                @\"?dir\\d+$\",\r\n                @\"?test\\\\dir\\d+$\"\r\n            };\r\n\r\n            parsed = GameScanner.ParseExclusions(scanDir, exList);\r\n            matches = GameScanner.GetDirectoryExclusionMatches(new List<string>\r\n            {\r\n                @\"c:\\emudir\\dir1\\\",\r\n                @\"c:\\emudir\\test\\dir2\"\r\n            }, parsed);\r\n\r\n            Assert.AreEqual(2, matches.Count);\r\n\r\n            // Regex any level match\r\n            exList = new List<string>\r\n            {\r\n                @\">?dir\\d+$\",\r\n                @\">?test\\\\dirtwo\\d+$\"\r\n            };\r\n\r\n            parsed = GameScanner.ParseExclusions(scanDir, exList);\r\n            matches = GameScanner.GetDirectoryExclusionMatches(new List<string>\r\n            {\r\n                @\"c:\\emudir\\dir1\\\",\r\n                @\"c:\\emudir\\sub\\dir1\\\",\r\n                @\"c:\\emudir\\test\\dirtwo2\",\r\n                @\"c:\\emudir\\sub\\test\\dirtwo2\",\r\n                @\"c:\\emudir\\dirthree\",\r\n            }, parsed);\r\n\r\n            Assert.AreEqual(4, matches.Count);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/ExtensionFactoryTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Plugins;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class ExtensionFactoryTests\r\n    {\r\n        [Test]\r\n        public void DeduplicateExtListTest()\r\n        {\r\n            var manifests = new List<BaseExtensionManifest>\r\n            {\r\n                new ExtensionManifest { Id = \"test1\", Version = \"1.0\" },\r\n                new ExtensionManifest { Id = \"test1\", Version = \"3.0\" },\r\n                new ExtensionManifest { Id = \"test1\", Version = \"2.0.2\" },\r\n                new ExtensionManifest { Id = \"test2\", Version = \"5.0.1.2\" },\r\n                new ExtensionManifest { Id = \"test3\", Version = \"1.0\" },\r\n                new ExtensionManifest { Id = \"test3\", Version = \"1.0.1\" },\r\n            };\r\n\r\n            var list = ExtensionFactory.DeduplicateExtList(manifests).ToList();\r\n            Assert.AreEqual(3, list.Count);\r\n            Assert.AreEqual(\"3.0\", list[0].Version);\r\n            Assert.AreEqual(\"5.0.1.2\", list[1].Version);\r\n            Assert.AreEqual(\"1.0.1\", list[2].Version);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Extensions/BitmapExtensionsTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Drawing.Imaging;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.Tests.Extensions\r\n{\r\n    [TestFixture]\r\n    public class BitmapExtensionsTests\r\n    {\r\n        [Test]\r\n        public void BitmapLoadPropertiesEquabilityTest()\r\n        {\r\n            var np1 = new BitmapLoadProperties(1, 1, new DpiScale(1, 1));\r\n            var np2 = new BitmapLoadProperties(1, 1, new DpiScale(1, 1));\r\n            var np3 = new BitmapLoadProperties(2, 2, new DpiScale(2, 2));\r\n            BitmapLoadProperties np4 = null;\r\n            var np5 = new BitmapLoadProperties(2, 2, new DpiScale(2, 2), ImageLoadScaling.BitmapDotNet);\r\n            var np6 = new BitmapLoadProperties(2, 2, new DpiScale(2, 2), ImageLoadScaling.None);\r\n\r\n            Assert.AreEqual(np1, np2);\r\n            Assert.IsTrue(np1 == np2);\r\n            Assert.IsTrue(np4 == null);\r\n            Assert.IsTrue(np3 != null);\r\n            Assert.IsTrue(np3 == np5);\r\n            Assert.IsTrue(np5 != np6);\r\n\r\n            Assert.AreNotEqual(np1, np3);\r\n            Assert.IsTrue(np1 != np3);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Extensions/DateTimesTests.cs",
    "content": "﻿using NUnit.Framework;\nusing Playnite.SDK.Models;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Playnite.Tests.Extensions\n{\n    [TestFixture]\n    public class DateTimesTests\n    {\n        [Test]\n        public void FutureDatesAreNotWeekdays()\n        {\n            CultureInfo.CurrentCulture = new CultureInfo(\"en-US\");\n            var today = new DateTime(2023, 3, 24);\n            var releaseDate = new ReleaseDate(2023, 6, 6);\n            using (DateTimes.UseCustomDates(new CustomDateTimeProvider(today)))\n            {\n                var dateString = DateTimes.ToDisplayString(releaseDate, new ReleaseDateFormattingOptions(\"d\", pastWeekRelativeFormat: true));\n                Assert.AreEqual(\"6/6/2023\", dateString);\n            }\n        }\n\n        private class CustomDateTimeProvider : DateTimes.IDateTimes\n        {\n            private readonly DateTime dateTime;\n\n            public CustomDateTimeProvider(DateTime dateTime)\n            {\n                this.dateTime = dateTime;\n            }\n\n            public DateTime Now => dateTime;\n\n            public DateTime Today => dateTime.Date;\n        }\n    }\n}\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Extensions/EnumsTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Extensions\r\n{\r\n    public enum TestEnum\r\n    {\r\n        [System.ComponentModel.Description(\"desc1\")]\r\n        Test1,\r\n        Test2\r\n    }\r\n\r\n    [TestFixture]\r\n    public class EnumsTests\r\n    {\r\n        [Test]\r\n        public void Test()\r\n        {\r\n            Assert.AreEqual(\"desc1\", TestEnum.Test1.GetDescription());\r\n            Assert.AreEqual(\"Test2\", TestEnum.Test2.GetDescription());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Extensions/NetExtensionsTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite;\r\nusing System;\r\nusing System.Net;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Extensions\r\n{\r\n    [TestFixture]\r\n    public class NetExtensionsTests\r\n    {\r\n        [Test]\r\n        public void IsSuccessTest()\r\n        {\r\n            Assert.IsTrue(HttpStatusCode.OK.IsSuccess());\r\n            Assert.IsTrue(HttpStatusCode.NoContent.IsSuccess());\r\n            Assert.IsFalse(HttpStatusCode.Continue.IsSuccess());\r\n            Assert.IsFalse(HttpStatusCode.Redirect.IsSuccess());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Extensions/ObjectExtensionsTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Extensions\r\n{\r\n    [TestFixture]\r\n    public class ObjectExtensionsTests\r\n    {\r\n        public class AttributeTestClass\r\n        {\r\n            [RequiresRestart]\r\n            public bool Prop1 { get; set; }\r\n\r\n            public bool Prop2 { get; set; }\r\n        }\r\n\r\n        [Test]\r\n        public void HasPropertyAssignedAttributeTest()\r\n        {\r\n            Assert.IsTrue(typeof(AttributeTestClass).HasPropertyAttribute<RequiresRestartAttribute>(nameof(AttributeTestClass.Prop1)));\r\n            Assert.IsFalse(typeof(AttributeTestClass).HasPropertyAttribute<RequiresRestartAttribute>(nameof(AttributeTestClass.Prop2)));\r\n            Assert.IsFalse(typeof(AttributeTestClass).HasPropertyAttribute<RequiresRestartAttribute>(\"SomePropNoexistetn\"));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Extensions/StringExtensionsTests.cs",
    "content": "﻿using NUnit.Framework;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Playnite.Tests.Extensions\n{\n    [TestFixture]\n    public class StringExtensionsTests\n    {\n        [Test]\n        public void JeroWrenklinSimilarityTests()\n        {\n            Assert.AreEqual(1.0, \"hello\".GetJaroWinklerSimilarityIgnoreCase(\"hello\"));\n            Assert.AreNotEqual(1.0, \"hello\".GetJaroWinklerSimilarity(\"Hello\"));\n            Assert.AreEqual(1.0, \"hello\".GetJaroWinklerSimilarityIgnoreCase(\"Hello\"));\n            Assert.AreEqual(0.0, \"kiwi\".GetJaroWinklerSimilarity(\"banana\"));\n            Assert.AreEqual(1.0, \"\".GetJaroWinklerSimilarity(\"\"));\n            Assert.AreEqual(1.0, \"\".GetJaroWinklerSimilarityIgnoreCase(\"\"));\n        }\n\n        [Test]\n        public void LevenshteinDistanceTests()\n        {\n            Assert.AreEqual(0, \"hello\".GetLevenshteinDistance(\"hello\"));\n            Assert.AreNotEqual(0, \"hello\".GetLevenshteinDistance(\"Hello\"));\n            Assert.AreEqual(1, \"hello\".GetLevenshteinDistance(\"Hello\"));\n            Assert.AreEqual(0, \"hello\".GetLevenshteinDistanceIgnoreCase(\"Hello\"));\n            Assert.AreEqual(1, \"car\".GetLevenshteinDistance(\"cars\"));\n            Assert.AreEqual(2, \"a car\".GetLevenshteinDistance(\"car\"));\n            Assert.AreEqual(2, \"car\".GetLevenshteinDistance(\"car a\"));\n            Assert.AreEqual(0, \"\".GetLevenshteinDistance(\"\")); // Empty strings means exact match\n            Assert.AreEqual(\"abc\".Length, \"\".GetLevenshteinDistance(\"abc\")); // Empty string and non empty string means distance is length of other string\n\n            Assert.AreEqual(3, \"abc\".GetLevenshteinDistance(\"def\"));\n            Assert.AreEqual(4, \"hello\".GetLevenshteinDistance(\"world\"));\n            Assert.AreEqual(2, \"flaw\".GetLevenshteinDistance(\"lawn\"));\n            Assert.AreEqual(3, \"kitten\".GetLevenshteinDistance(\"sitting\"));\n\n            var baseString = \"my string\";\n            for (int i = 0; i < 10; i++)\n            {\n                var toMatchString = baseString + new string('a', i); // Each added character increases the distance by one\n                Assert.AreEqual(i, baseString.GetLevenshteinDistance(toMatchString));\n            }\n\n            var stringPrefix = \"apple\";\n            var stringsList = new List<string>\n            {\n                $\"{stringPrefix} 123456789\",\n                $\"{stringPrefix} 12345678\",\n                $\"{stringPrefix} 1234567\",\n                $\"{stringPrefix} 123456\",\n                $\"{stringPrefix} 12345\",\n                $\"{stringPrefix} 1234\",\n                $\"{stringPrefix} 12\",\n                $\"{stringPrefix} 1\",\n                $\"{stringPrefix} 123\",\n            };\n\n            var sortedList = stringsList.OrderBy(str => str.Length);\n\n            // Since Levenshtein calculates number of different characters, it's possible to use the\n            // length to verify that the ordering is correct if all use the same base string\n            var sortedLevenshteinList = stringsList.OrderBy(str => str.GetLevenshteinDistance(stringPrefix));\n            Assert.IsTrue(sortedList.SequenceEqual(sortedLevenshteinList));\n        }\n    }\n}"
  },
  {
    "path": "source/Tests/Playnite.Tests/FileSystemTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Settings;\r\nusing Playnite;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class FileSystemTests\r\n    {\r\n        [Test]\r\n        public void CanWriteToFolderTest()\r\n        {\r\n            Assert.IsTrue(FileSystem.CanWriteToFolder(PlaynitePaths.ProgramPath));\r\n            Assert.IsFalse(FileSystem.CanWriteToFolder(@\"c:\\Windows\\\"));\r\n        }\r\n\r\n        [Test]\r\n        public void GetFreeSpaceTest()\r\n        {\r\n            Assert.AreNotEqual(0, FileSystem.GetFreeSpace(@\"c:\\\"));\r\n            Assert.AreNotEqual(0, FileSystem.GetFreeSpace(@\"c:\\test\\\"));\r\n            Assert.AreNotEqual(0, FileSystem.GetFreeSpace(@\"c:\\test\\file.txt\"));\r\n            Assert.AreEqual(0, FileSystem.GetFreeSpace(\"c\"));\r\n            Assert.AreEqual(0, FileSystem.GetFreeSpace(\"file.txt\"));\r\n        }\r\n\r\n        [Test]\r\n        public async Task ReadFileAsStringSafeTest()\r\n        {\r\n            var testPath = Path.Combine(PlayniteTests.TempPath, \"ReadFileAsStringSafeTest.txt\");\r\n            FileSystem.DeleteFile(testPath);\r\n            var fs = new FileStream(testPath, FileMode.Create);\r\n            fs.Write(new byte[] { 1 }, 0, 1);\r\n            Assert.Throws<IOException>(() => FileSystem.ReadFileAsStringSafe(testPath));\r\n            string result = null;\r\n            var task = Task.Run(() => result = FileSystem.ReadFileAsStringSafe(testPath));\r\n            await Task.Delay(1000);\r\n            fs.Dispose();\r\n            await task;\r\n            Assert.IsNotNull(result);\r\n        }\r\n\r\n        [Test]\r\n        public async Task WriteStringToFileSafeTest()\r\n        {\r\n            var testPath = Path.Combine(PlayniteTests.TempPath, \"WriteStringToFileSafeTest.txt\");\r\n            FileSystem.DeleteFile(testPath);\r\n            var fs = new FileStream(testPath, FileMode.Create);\r\n            Assert.Throws<IOException>(() => FileSystem.WriteStringToFileSafe(testPath, \"test\"));\r\n            var task = Task.Run(() => FileSystem.WriteStringToFileSafe(testPath, \"test\"));\r\n            await Task.Delay(1000);\r\n            fs.Dispose();\r\n            await task;\r\n            Assert.AreEqual(\"test\", File.ReadAllText(testPath));\r\n        }\r\n\r\n        [Test]\r\n        public void CheckSumTests()\r\n        {\r\n            var testFile = Path.Combine(PlayniteTests.ResourcesPath, \"TestIni.ini\");\r\n            StringAssert.AreEqualIgnoringCase(\"46fcb37aa8e69b4ead0d702fd459299d\", FileSystem.GetMD5(testFile));\r\n            StringAssert.AreEqualIgnoringCase(\"D8B22F5D\", FileSystem.GetCRC32(testFile));\r\n        }\r\n\r\n        [Test]\r\n        public void DirectorySizeScanTest()\r\n        {\r\n            using (var tempPath = TempDirectory.Create())\r\n            {\r\n                // Subdirectory is used to verify that called methods work correctly in long paths\r\n                var subDirName = new string('a', 255);\r\n                var subDirName2 = new string('b', 30);\r\n                var subdirPath = Path.Combine(tempPath.TempPath, subDirName, subDirName2);\r\n                FileSystem.CreateDirectory(subdirPath);\r\n\r\n                var filePath = Path.Combine(subdirPath, \"DummyFile\");\r\n                var dummyFileLenght = 1024;\r\n                using (var fileStream = new FileStream(Paths.FixPathLength(filePath), FileMode.Create, FileAccess.Write, FileShare.None))\r\n                {\r\n                    fileStream.SetLength(dummyFileLenght);\r\n                }\r\n\r\n                // We can't check the exact size because it will vary depending on drive\r\n                // cluster size so we only check if value is higher than zero\r\n                var dirSizeOnDisk = FileSystem.GetDirectorySize(tempPath.TempPath, true);\r\n                Assert.Greater(dirSizeOnDisk, 0);\r\n\r\n                var dirSize = FileSystem.GetDirectorySize(tempPath.TempPath, false);\r\n                Assert.AreEqual(dummyFileLenght, dirSize);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/GameFieldComparerTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Database;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class GameFieldComparerTests\r\n    {\r\n        [Test]\r\n        public void CompareTest()\r\n        {\r\n            Assert.IsTrue(GameFieldComparer.StringEquals(\"Single Player\", \"Single Player\"));\r\n            Assert.IsTrue(GameFieldComparer.StringEquals(\"Single-Player\", \"Single Player\"));\r\n            Assert.IsTrue(GameFieldComparer.StringEquals(\"SinglePlayer\", \"Single Player\"));\r\n            Assert.IsTrue(GameFieldComparer.StringEquals(\"single player\", \"Single Player\"));\r\n\r\n            Assert.IsFalse(GameFieldComparer.StringEquals(\"SingleaPlayer\", \"Single Player\"));\r\n            Assert.IsFalse(GameFieldComparer.StringEquals(\"Single:Player\", \"Single Player\"));\r\n\r\n            Assert.IsTrue(GameFieldComparer.StringEquals(null, null));\r\n            Assert.IsFalse(GameFieldComparer.StringEquals(null, \"Single Player\"));\r\n            Assert.IsFalse(GameFieldComparer.StringEquals(\"Single:Player\", null));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/GamesEditorTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Controllers;\r\nusing Playnite.Scripting.PowerShell;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class GamesEditorTests\r\n    {\r\n        private const string executeScriptActionTestFileName = \"test.txt\";\r\n\r\n        [Test]\r\n        public void ExecuteScriptActionPowerShellTest()\r\n        {\r\n            using (var runtime = new PowerShellRuntime(\"test\"))\r\n            ExecuteScriptActionTest(runtime, $\"'PowerShell' | Out-File {executeScriptActionTestFileName}\");\r\n        }\r\n\r\n        public void ExecuteScriptActionTest(PowerShellRuntime runtime, string script)\r\n        {\r\n            using (var tempDir = TempDirectory.Create())\r\n            {\r\n                var game = new Game()\r\n                {\r\n                    InstallDirectory = tempDir.TempPath\r\n                };\r\n\r\n                var editor = new GamesEditor(null, new GameControllerFactory(null), new PlayniteSettings(), null, null, new TestPlayniteApplication(), null);\r\n                editor.ExecuteScriptAction(runtime, script, game, true, false, GameScriptType.None);\r\n                var testPath = Path.Combine(tempDir.TempPath, executeScriptActionTestFileName);\r\n                var content = File.ReadAllText(testPath);\r\n                Assert.AreEqual(\"PowerShell\", content.Trim());\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/GamesStatsTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class GamesStatsTests\r\n    {\r\n        [Test]\r\n        public void BasicTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                db.Games.Add(new List<Game>\r\n                {\r\n                    new Game(\"Game 1\"),\r\n                    new Game(\"Steam game 1\")\r\n                    {\r\n                        IsInstalled = true,\r\n                        Hidden = true\r\n                    },\r\n                    new Game(\"Origin game 1\")\r\n                    {\r\n                    },\r\n                    new Game(\"GOG game 1\")\r\n                    {\r\n                        Hidden = true\r\n                    },\r\n                    new Game(\"GOG game 2\")\r\n                    {\r\n                        Hidden = false\r\n                    }\r\n                });\r\n\r\n                var stats = new DatabaseStats(db);\r\n\r\n                Assert.AreEqual(5, stats.Total);\r\n                Assert.AreEqual(1, stats.Installed);\r\n                Assert.AreEqual(2, stats.Hidden);\r\n                Assert.AreEqual(0, stats.Favorite);\r\n\r\n                var newGame = new Game(\"Game 2\") { Favorite = true };\r\n                db.Games.Add(newGame);\r\n                Assert.AreEqual(6, stats.Total);\r\n                Assert.AreEqual(1, stats.Favorite);\r\n\r\n                newGame.IsInstalled = true;\r\n                db.Games.Update(newGame);\r\n                Assert.AreEqual(2, stats.Installed);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/ImageSourceManagerTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Globalization;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Media.Imaging;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class CustomImageStringToImageConverterTests\r\n    {\r\n        [Test]\r\n        public void LocalFileTest()\r\n        {\r\n            var image = Path.Combine(PlaynitePaths.ProgramPath, \"Resources\", \"Images\", \"applogo.png\");\r\n            var result = ImageSourceManager.GetImage(image, false);\r\n            Assert.AreEqual(typeof(BitmapImage), result.GetType());\r\n        }\r\n\r\n        [Test]\r\n        public void ResourceTest()\r\n        {\r\n            var image = ImageSourceManager.GetImage(\"resources:/Resources/Images/icon_dark.png\", false);\r\n            Assert.IsNotNull(image);\r\n            Assert.AreNotEqual(DependencyProperty.UnsetValue, image);\r\n        }\r\n\r\n        [Test]\r\n        public void WebTest()\r\n        {\r\n            FileSystem.DeleteDirectory(PlaynitePaths.ImagesCachePath);\r\n            var image = @\"http://playnite.link/applogo.png\";\r\n            var result = ImageSourceManager.GetImage(image, false);\r\n            Assert.AreEqual(typeof(BitmapImage), result.GetType());\r\n        }\r\n\r\n        [Test]\r\n        public void DatabaseTest()\r\n        {\r\n            var file = Path.Combine(PlaynitePaths.ProgramPath, \"Resources\", \"Images\", \"applogo.png\");\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                var image = db.AddFile(file, Guid.NewGuid(), true, CancellationToken.None);\r\n                ImageSourceManager.SetDatabase(db);\r\n                var result = ImageSourceManager.GetImage(image, false);\r\n                Assert.AreEqual(typeof(BitmapImage), result.GetType());\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/ImagesTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing NUnit.Framework;\r\nusing Playnite.Common;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class ImagesTests\r\n    {\r\n        [Test]\r\n        public void GetImagePropertiesTest()\r\n        {\r\n            var path = Path.Combine(PlaynitePaths.ProgramPath, \"Resources\", \"Images\", \"applogo.png\");\r\n            var properties = Images.GetImageProperties(path);\r\n            Assert.AreEqual(256, properties.Height);\r\n            Assert.AreEqual(261, properties.Width);\r\n        }\r\n\r\n        [Test]\r\n        public void GetImagePropertiesIcoTest()\r\n        {\r\n            var gw2icon = Images.GetImageProperties(Path.Combine(PlaynitePaths.ProgramPath, \"Resources\", \"Images\", \"gw2_icon.ico\"));\r\n            Assert.AreEqual(256, gw2icon.Height);\r\n            Assert.AreEqual(256, gw2icon.Width);\r\n\r\n            var mecicon = Images.GetImageProperties(Path.Combine(PlaynitePaths.ProgramPath, \"Resources\", \"Images\", \"mec_icon.ico\"));\r\n            Assert.AreEqual(256, mecicon.Height);\r\n            Assert.AreEqual(256, mecicon.Width);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/IniParserTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class IniParserTests\r\n    {\r\n        [Test]\r\n        public void StandardTest()\r\n        {\r\n            var iniStr = File.ReadAllLines(Path.Combine(PlayniteTests.ResourcesPath, \"TestIni.ini\"));\r\n            var ini = IniParser.Parse(iniStr);\r\n            Assert.AreEqual(\"true\", ini[\"RegionDoesRequirePermission\"][\"GameDev\"]);\r\n            Assert.IsNull(ini[\"test\"]?[\"test2\"]);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/InstallSizeScanTests.cs",
    "content": "﻿using NUnit.Framework;\nusing Playnite.Common;\nusing Playnite.Controllers;\nusing Playnite.SDK.Models;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\r\nusing System.Threading.Tasks;\n\nnamespace Playnite.Tests\n{\n    [TestFixture]\n    public class InstallSizeScanTests\n    {\n        [Test]\n        public void UpdateGameInstallSizeTest()\n        {\n            // Thread.Sleep(50) is there because the scan can be sometimes so fast that the date would not change\n            // despite scan being actually done.\n\n            var resourcesRootDir = Path.Combine(PlayniteTests.ResourcesPath, \"SizeScan\");\n            var playniteSettings = new PlayniteSettings()\n            {\n                // We don't use size on disk because the value will vary depending\n                // on PC drive cluster size\n                InstallSizeScanUseSizeOnDisk = false\n            };\n\n            var gamesEditor = new GamesEditor(null, new GameControllerFactory(null), playniteSettings, null, null, new TestPlayniteApplication(), null);\n            var game = new Game(\"Test game\")\n            {\n                IsInstalled = true,\n                InstallDirectory = resourcesRootDir,\n                Roms = new System.Collections.ObjectModel.ObservableCollection<GameRom>()\n            };\n\n            game.Roms.Add(new GameRom(\"RomName\", @\"{InstallDir}\\CueNonExistingFiles.cue\"));\n            Assert.AreEqual(null, game.InstallSize);\n            Assert.AreEqual(null, game.LastSizeScanDate);\n\n            var onlyIfDataMissing = true;\n            var updateGameOnLibrary = false;\n            var checkLastScanDate = false;\n\n            // Size scan shouldn't happen if rom playlist files do not exist and final rom list is empty\n            gamesEditor.UpdateGameSize(game, false, updateGameOnLibrary, checkLastScanDate);\n            Assert.AreEqual(null, game.InstallSize);\n            Assert.AreEqual(null, game.LastSizeScanDate);\n\n            // Not installed games shouldn't be scanned\n            game.IsInstalled = false;\n            game.Roms[0].Path = @\"{InstallDir}\\CueTestFiles.cue\";\n            Thread.Sleep(50);\n            gamesEditor.UpdateGameSize(game, onlyIfDataMissing, updateGameOnLibrary, checkLastScanDate);\n            Assert.AreEqual(null, game.InstallSize);\n            Assert.AreEqual(null, game.LastSizeScanDate);\n\n            // Installed games should be scanned\n            game.IsInstalled = true;\n            Thread.Sleep(50);\n            gamesEditor.UpdateGameSize(game, onlyIfDataMissing, updateGameOnLibrary, checkLastScanDate);\n            Assert.AreEqual(1024, game.InstallSize);\n            Assert.AreNotEqual(null, game.LastSizeScanDate);\n\n            // Size scan shouldn't happen if data is not missing and \"onlyIfDataMissing\" is true\n            var previousLastSizeScanDate = game.LastSizeScanDate;\n            game.Roms.Add(new GameRom(\"RomName\", @\"{InstallDir}\\Empty2KbFile.bin\"));\n            Thread.Sleep(50);\n            gamesEditor.UpdateGameSize(game, onlyIfDataMissing, updateGameOnLibrary, checkLastScanDate);\n            Assert.AreEqual(1024, game.InstallSize);\n            Assert.AreEqual(previousLastSizeScanDate, game.LastSizeScanDate);\n\n            // Size scan should happen if \"onlyIfDataMissing\" is false\n            onlyIfDataMissing = false;\n            previousLastSizeScanDate = game.LastSizeScanDate;\n            Thread.Sleep(50);\n            gamesEditor.UpdateGameSize(game, onlyIfDataMissing, updateGameOnLibrary, checkLastScanDate);\n            Assert.AreEqual(3072, game.InstallSize);\n            Assert.AreNotEqual(previousLastSizeScanDate, game.LastSizeScanDate);\n\n            // If the game doesn't have roms, the Installation Directory will be used to scan the size\n            // the size must be greater than 0 and the previous size, since it will be adding the size\n            // of the cue file\n            var previousInstallSize = game.InstallSize;\n            game.Roms = null;\n            game.InstallSize = null;\n            game.LastSizeScanDate = null;\n            Thread.Sleep(50);\n            gamesEditor.UpdateGameSize(game, onlyIfDataMissing, updateGameOnLibrary, checkLastScanDate);\n            Assert.AreNotEqual(null, game.InstallSize);\n            Assert.Greater(game.InstallSize, previousInstallSize);\n            Assert.AreNotEqual(null, game.LastSizeScanDate);\n\n            // Scan shouldn't be done if installation directory does not exists\n            game.InstallSize = null;\n            game.LastSizeScanDate = null;\n            game.InstallDirectory = Path.Combine(resourcesRootDir, \"PathThatDoesNotExists\");\n            Thread.Sleep(50);\n            gamesEditor.UpdateGameSize(game, onlyIfDataMissing, updateGameOnLibrary, checkLastScanDate);\n            Assert.AreEqual(null, game.InstallSize);\n            Assert.AreEqual(null, game.LastSizeScanDate);\n        }\n    }\n}"
  },
  {
    "path": "source/Tests/Playnite.Tests/ListExtensionsTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class ListExtensionsTests\r\n    {\r\n        [Test]\r\n        public void HasItemsTest()\r\n        {\r\n            Assert.IsFalse(((IEnumerable<object>)null).HasItems());\r\n            Assert.IsFalse(new List<string>().HasItems());\r\n            Assert.IsTrue(new List<string>() { \"1\" }.HasItems());\r\n        }\r\n\r\n        [Test]\r\n        public void HasNonEmptyItemsTest()\r\n        {\r\n            Assert.IsFalse(new List<string>() { string.Empty }.HasNonEmptyItems());\r\n            Assert.IsFalse(new List<string>() { \"\" }.HasNonEmptyItems());\r\n            Assert.IsFalse(new List<string>() { \"\", \"\" }.HasNonEmptyItems());\r\n            Assert.IsTrue(new List<string>() { \"test\" }.HasNonEmptyItems());\r\n            Assert.IsTrue(new List<string>() { \"\", \"test\" }.HasNonEmptyItems());\r\n        }\r\n\r\n        [Test]\r\n        public void IntersectsPartiallyWithTest()\r\n        {\r\n            Assert.IsTrue((new List<string> { \"test\" }).IntersectsPartiallyWith(new List<string> { \"test\" }));\r\n            Assert.IsTrue((new List<string> { \"Test\" }).IntersectsPartiallyWith(new List<string> { \"test\" }));\r\n            Assert.IsTrue((new List<string> { \"Test\" }).IntersectsPartiallyWith(new List<string> { \"test2\" }));\r\n            Assert.IsTrue((new List<string> { \"Test2\" }).IntersectsPartiallyWith(new List<string> { \"test\", \"test2\" }));\r\n            Assert.IsTrue((new List<string> { \"test\", \"test2\" }).IntersectsPartiallyWith(new List<string> { \"Test2\" }));\r\n            Assert.IsFalse((new List<string> { \"test\", \"test2\" }).IntersectsPartiallyWith(new List<string> { string.Empty }));\r\n            Assert.IsFalse((new List<string> { \"test\", \"test2\" }).IntersectsPartiallyWith(null));\r\n            Assert.IsFalse((new List<string> { \"test\", \"test2\" }).IntersectsPartiallyWith(new List<string> { \"aaaa\" }));\r\n            Assert.IsFalse(((List<string>)null).IntersectsPartiallyWith(new List<string> { \"test\", \"test2\" }));\r\n        }\r\n\r\n        [Test]\r\n        public void IntersectsExactlyWithTest()\r\n        {\r\n            Assert.IsTrue((new List<string> { \"test\" }).IntersectsExactlyWith(new List<string> { \"test\" }));\r\n            Assert.IsTrue((new List<string> { \"Test\" }).IntersectsExactlyWith(new List<string> { \"test\" }));\r\n            Assert.IsTrue((new List<string> { \"Test2\" }).IntersectsExactlyWith(new List<string> { \"test\", \"test2\" }));\r\n            Assert.IsTrue((new List<string> { \"Test3\", \"test2\" }).IntersectsExactlyWith(new List<string> { \"test\", \"test2\" }));\r\n            Assert.IsTrue((new List<string> { \"test\", \"test2\" }).IntersectsExactlyWith(new List<string> { \"Test2\" }));\r\n            Assert.IsFalse((new List<string> { \"test\", \"test2\" }).IntersectsExactlyWith(new List<string> { \"Test3\" }));\r\n            Assert.IsFalse((new List<string> { \"test\", \"test2\" }).IntersectsExactlyWith(new List<string> { \"Test3\", \"test5\" }));\r\n            Assert.IsFalse((new List<string> { \"test\", \"test2\" }).IntersectsExactlyWith(new List<string> { string.Empty }));\r\n            Assert.IsFalse((new List<string> { \"test\", \"test2\" }).IntersectsExactlyWith(null));\r\n            Assert.IsFalse(((List<string>)null).IntersectsExactlyWith(new List<string> { \"test\", \"test2\" }));\r\n        }\r\n\r\n        [Test]\r\n        public void ContainsStringTest()\r\n        {\r\n            var testList = new List<string> { \"test\", \"string\", \"someTest\" };\r\n            Assert.IsTrue(testList.ContainsString(\"test\"));\r\n            Assert.IsTrue(testList.ContainsString(\"Test\"));\r\n            Assert.IsFalse(testList.ContainsString(\"Test\", StringComparison.Ordinal));\r\n            Assert.IsFalse(testList.ContainsString(\"some\"));\r\n        }\r\n\r\n        [Test]\r\n        public void ContainsStringPartialTest()\r\n        {\r\n            var testList = new List<string> { \"test\", \"string\", \"someTest\" };\r\n            Assert.IsTrue(testList.ContainsStringPartial(\"test\"));\r\n            Assert.IsTrue(testList.ContainsStringPartial(\"str\"));\r\n            Assert.IsFalse(testList.ContainsStringPartial(\"Some\", StringComparison.Ordinal));\r\n        }\r\n\r\n        [Test]\r\n        public void ContainsPartOfStringTest()\r\n        {\r\n            var testList = new List<string> { \"test\", \"str\", \"someTest\" };\r\n            Assert.IsTrue(testList.ContainsPartOfString(\"test\"));\r\n            Assert.IsTrue(testList.ContainsPartOfString(\"string\"));\r\n            Assert.IsTrue(testList.ContainsPartOfString(\"SomeTest\"));\r\n            Assert.IsFalse(testList.ContainsPartOfString(\"st\"));\r\n            Assert.IsFalse(testList.ContainsPartOfString(\"SomeTest\", StringComparison.Ordinal));\r\n        }\r\n\r\n        [Test]\r\n        public void IsListEqualTest()\r\n        {\r\n            Assert.IsTrue(\r\n                new List<int> { 1, 2, 3 }.IsListEqual(\r\n                new List<int> {1, 2, 3 }));\r\n            Assert.IsTrue(\r\n                new List<int> { 1, 2, 3 }.IsListEqual(\r\n                new List<int> { 3, 2, 1 }));\r\n            Assert.IsFalse(\r\n                new List<int> { 1, 2, 3 }.IsListEqual(\r\n                new List<int> { 1, }));\r\n            Assert.IsFalse(\r\n                new List<int> { 1 }.IsListEqual(\r\n                new List<int> { 1, 2, 3 }));\r\n        }\r\n\r\n        [Test]\r\n        public void IsListEqualExactTest()\r\n        {\r\n            Assert.IsTrue(\r\n                new List<int> { 1, 2, 3 }.IsListEqualExact(\r\n                new List<int> { 1, 2, 3 }));\r\n            Assert.IsFalse(\r\n                new List<int> { 1, 2, 3 }.IsListEqualExact(\r\n                new List<int> { 3, 2, 1 }));\r\n            Assert.IsFalse(\r\n                new List<int> { 1, 2, 3 }.IsListEqualExact(\r\n                new List<int> { 1, }));\r\n            Assert.IsFalse(\r\n                new List<int> { 1 }.IsListEqualExact(\r\n                new List<int> { 1, 2, 3 }));\r\n        }\r\n\r\n        [Test]\r\n        public void GetCommonItemsTest()\r\n        {\r\n            List<int> list1 = new List<int> { 1, 2, 3, 4, };\r\n            List<int> list2 = new List<int> { 1, 2, 3 };\r\n            List<int> list3 = new List<int> { 1, 2 };\r\n            var common = ListExtensions.GetCommonItems(new List<List<int>> { list1, list2, list3 }).ToArray();\r\n            Assert.AreEqual(2, common.Count());\r\n            Assert.AreEqual(1, common[0]);\r\n            Assert.AreEqual(2, common[1]);\r\n        }\r\n\r\n        [Test]\r\n        public void GetDistinctItemsTest()\r\n        {\r\n            List<int> list1 = new List<int> { 1, 2, 3, 4, };\r\n            List<int> list2 = new List<int> { 1, 2 };\r\n            List<int> list3 = new List<int> { 1, 2, 5};\r\n            var distinct = ListExtensions.GetDistinctItems(new List<List<int>> { list1, list2, list3 }).ToArray();\r\n            Assert.AreEqual(3, distinct.Count());\r\n            Assert.AreEqual(3, distinct[0]);\r\n            Assert.AreEqual(4, distinct[1]);\r\n            Assert.AreEqual(5, distinct[2]);\r\n\r\n            ListExtensions.GetDistinctItemsP(list1, list2, list3).ToArray();\r\n            Assert.AreEqual(3, distinct.Count());\r\n            Assert.AreEqual(3, distinct[0]);\r\n            Assert.AreEqual(4, distinct[1]);\r\n            Assert.AreEqual(5, distinct[2]);\r\n        }\r\n\r\n        [Test]\r\n        public void ContainsTest()\r\n        {\r\n            List<int> list1 = new List<int> { 1, 2, 3, 4, };\r\n            List<int> list2 = new List<int> { 1, 2 };\r\n            List<int> list3 = new List<int> { 1, 2, 5 };\r\n\r\n            Assert.IsTrue(list1.Contains(list2));\r\n            Assert.IsFalse(list2.Contains(list1));\r\n            Assert.IsFalse(list1.Contains(list3));\r\n        }\r\n\r\n        [Test]\r\n        public void ToHashSetTest()\r\n        {\r\n            var list = new List<int> { 1, 2, 3, 4, };\r\n            var hash = list.ToHashSet();\r\n            Assert.AreEqual(4, hash.Count);\r\n\r\n            list = new List<int> { 1, 2, 3, 4, 2, 3 };\r\n            hash = list.ToHashSet();\r\n            Assert.AreEqual(4, hash.Count);\r\n\r\n            new List<int>(0).ToHashSet();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/LocalizationTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class LocalizationTests\r\n    {\r\n        [Test]\r\n        public void AvailableLangsTest()\r\n        {\r\n            CollectionAssert.IsNotEmpty(Localization.AvailableLanguages);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/M3UTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class M3UTests\r\n    {\r\n        [Test]\r\n        public void GetEntriesTest()\r\n        {\r\n            var testm3uPath = Path.Combine(PlayniteTests.ResourcesPath, \"test.m3u\");\r\n            var entires = M3U.GetEntries(testm3uPath);\r\n            Assert.AreEqual(14, entires.Count);\r\n\r\n            Assert.AreEqual(2, entires[0].Extensions.Count);\r\n            Assert.AreEqual(@\"111,The Orichalcon - \"\"megAsfear (Title)\"\" [http://doom2.ocremix.org - Delta-Q-Delta]\", entires[0].Extensions[\"#EXTINF\"]);\r\n            Assert.AreEqual(@\"1234\", entires[0].Extensions[\"#EXTBYT\"]);\r\n\r\n            Assert.AreEqual(0, entires[2].Extensions.Count);\r\n            Assert.AreEqual(1, entires[3].Extensions.Count);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Manifests/AddonManifestTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite;\r\nusing Playnite.SDK.Models;\r\nusing Newtonsoft.Json;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class AddonManifestTests\r\n    {\r\n        [Test]\r\n        public void GetLatestCompatiblePackageTest()\r\n        {\r\n            var manifest = new AddonInstallerManifest\r\n            {\r\n                Packages = new List<AddonInstallerPackage>\r\n                {\r\n                    new AddonInstallerPackage\r\n                    { Version = new Version(1, 0), RequiredApiVersion = new Version (1, 0) },\r\n                    new AddonInstallerPackage\r\n                    { Version = new Version(1, 1), RequiredApiVersion = new Version (1, 0) },\r\n                    new AddonInstallerPackage\r\n                    { Version = new Version(1, 2), RequiredApiVersion = new Version (1, 1) },\r\n                    new AddonInstallerPackage\r\n                    { Version = new Version(1, 3), RequiredApiVersion = new Version (2, 0) },\r\n                }\r\n            };\r\n\r\n            CollectionAssert.IsEmpty(manifest.GetCompatiblePackages(new Version(3, 0)));\r\n            Assert.AreEqual(new Version(1, 1), manifest.GetCompatiblePackages(new Version(1, 0)).First().Version);\r\n            Assert.AreEqual(new Version(1, 2), manifest.GetCompatiblePackages(new Version(1, 1)).First().Version);\r\n            Assert.AreEqual(new Version(1, 3), manifest.GetCompatiblePackages(new Version(2, 0)).First().Version);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Metadata/MetadataDownloaderDownloadTests.cs",
    "content": "﻿using Moq;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.Metadata;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing Playnite.Tests.Database;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Metadata\r\n{\r\n    [TestFixture]\r\n    public class MetadataDownloaderDownloadTests\r\n    {\r\n        public class OnDemandTestMetadataProvider : OnDemandMetadataProvider\r\n        {\r\n            public override List<MetadataField> AvailableFields => availableFields;\r\n\r\n            private List<MetadataField> availableFields;\r\n            private GameMetadata metadata;\r\n\r\n            public OnDemandTestMetadataProvider(ref GameMetadata metadata, ref List<MetadataField> availableFields)\r\n            {\r\n                this.metadata = metadata;\r\n                this.availableFields = availableFields;\r\n            }\r\n\r\n            public override MetadataFile GetBackgroundImage(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.BackgroundImage;\r\n            }\r\n\r\n            public override int? GetCommunityScore(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.CommunityScore;\r\n            }\r\n\r\n            public override MetadataFile GetCoverImage(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.CoverImage;\r\n            }\r\n\r\n            public override int? GetCriticScore(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.CriticScore;\r\n            }\r\n\r\n            public override string GetDescription(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Description;\r\n            }\r\n\r\n            public override IEnumerable<MetadataProperty> GetDevelopers(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Developers;\r\n            }\r\n\r\n            public override IEnumerable<MetadataProperty> GetGenres(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Genres;\r\n            }\r\n\r\n            public override MetadataFile GetIcon(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Icon;\r\n            }\r\n\r\n            public override IEnumerable<Link> GetLinks(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Links;\r\n            }\r\n\r\n            public override string GetName(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Name;\r\n            }\r\n\r\n            public override IEnumerable<MetadataProperty> GetPublishers(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Publishers;\r\n            }\r\n\r\n            public override ReleaseDate? GetReleaseDate(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.ReleaseDate;\r\n            }\r\n\r\n            public override IEnumerable<MetadataProperty> GetTags(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Tags;\r\n            }\r\n\r\n            public override IEnumerable<MetadataProperty> GetFeatures(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Features;\r\n            }\r\n\r\n            public override IEnumerable<MetadataProperty> GetAgeRatings(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.AgeRatings;\r\n            }\r\n\r\n            public override IEnumerable<MetadataProperty> GetPlatforms(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Platforms;\r\n            }\r\n\r\n            public override IEnumerable<MetadataProperty> GetRegions(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Regions;\r\n            }\r\n\r\n            public override IEnumerable<MetadataProperty> GetSeries(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.Series;\r\n            }\r\n\r\n            public override ulong? GetInstallSize(GetMetadataFieldArgs args)\r\n            {\r\n                return metadata.InstallSize;\r\n            }\r\n        }\r\n\r\n        public class TestMetadataPlugin : MetadataPlugin\r\n        {\r\n            public int CallCount { get; set; } = 0;\r\n            public const string DataString = \"plugin\";\r\n            public override string Name => \"TestMetadataPlugin\";\r\n            public override Guid Id { get; } = Guid.NewGuid();\r\n            private List<MetadataField> supportedFields;\r\n            public override List<MetadataField> SupportedFields => supportedFields;\r\n            public GameMetadata ReturnMetadata = new GameMetadata\r\n            {\r\n                Description = DataString\r\n            };\r\n\r\n            public TestMetadataPlugin(IPlayniteAPI playniteAPI) : base(playniteAPI)\r\n            {\r\n            }\r\n\r\n            public override OnDemandMetadataProvider GetMetadataProvider(MetadataRequestOptions options)\r\n            {\r\n                CallCount++;\r\n                return new OnDemandTestMetadataProvider(ref ReturnMetadata, ref supportedFields);\r\n            }\r\n\r\n            public void SetSupportedFields(List<MetadataField> fields)\r\n            {\r\n                supportedFields = fields;\r\n            }\r\n        }\r\n\r\n        public class TestLibraryMetadataProvider : LibraryMetadataProvider\r\n        {\r\n            public const string DataString = \"store\";\r\n            public int CallCount = 0;\r\n            public GameMetadata ReturnMetadata { get; set; } = new GameMetadata\r\n            {\r\n                Description = DataString\r\n            };\r\n\r\n            public override GameMetadata GetMetadata(Game game)\r\n            {\r\n                CallCount++;\r\n                return ReturnMetadata;\r\n            }\r\n        }\r\n\r\n        private Random random = new Random();\r\n        private byte[] randomFile\r\n        {\r\n            get\r\n            {\r\n                var b = new byte[20];\r\n                random.NextBytes(b);\r\n                return b;\r\n            }\r\n        }\r\n\r\n        private TestMetadataPlugin GetTestPlugin()\r\n        {\r\n            return new TestMetadataPlugin(null);\r\n        }\r\n\r\n        private TestLibraryMetadataProvider GetTestLibraryProvider()\r\n        {\r\n            return new TestLibraryMetadataProvider();\r\n        }\r\n\r\n        [Test]\r\n        public void ProcessFieldTest()\r\n        {\r\n            var storeId = Guid.NewGuid();\r\n            var storeDownloader = GetTestLibraryProvider();\r\n            var testPlugin = GetTestPlugin();\r\n\r\n            List<MetadataPlugin> metadataDownloaders = new List<MetadataPlugin>()\r\n            {\r\n                testPlugin\r\n            };\r\n\r\n            Dictionary<Guid, LibraryMetadataProvider> libraryDownloaders = new Dictionary<Guid, LibraryMetadataProvider>()\r\n            {\r\n                { storeId, storeDownloader }\r\n            };\r\n\r\n            var existingMetadata = new Dictionary<Guid, GameMetadata>();\r\n            var existingPluginData = new Dictionary<Guid, OnDemandMetadataProvider>();\r\n            var fieldSettings = new MetadataFieldSettings();\r\n            var downloader = new MetadataDownloader(null, metadataDownloaders, libraryDownloaders);\r\n            var game = new Game();\r\n            var cancelToken = new CancellationTokenSource();\r\n\r\n            // Store is not called if custom game\r\n            var downloadedMetadata = downloader.ProcessField(\r\n                game,\r\n                new MetadataFieldSettings(true, new List<Guid> { Guid.Empty }),\r\n                MetadataField.Description,\r\n                existingMetadata,\r\n                existingPluginData,\r\n                cancelToken.Token);\r\n\r\n            Assert.IsNull(downloadedMetadata);\r\n            Assert.AreEqual(0, storeDownloader.CallCount);\r\n            Assert.AreEqual(0, testPlugin.CallCount);\r\n            Assert.AreEqual(0, existingMetadata.Count);\r\n\r\n            // Store download works\r\n            game.PluginId = storeId;\r\n            downloadedMetadata = downloader.ProcessField(\r\n                game,\r\n                new MetadataFieldSettings(true, new List<Guid> { Guid.Empty }),\r\n                MetadataField.Description,\r\n                existingMetadata,\r\n                existingPluginData,\r\n                cancelToken.Token);\r\n\r\n            Assert.AreEqual(TestLibraryMetadataProvider.DataString, downloadedMetadata.Description);\r\n            Assert.AreEqual(1, storeDownloader.CallCount);\r\n            Assert.AreEqual(0, testPlugin.CallCount);\r\n            Assert.AreEqual(1, existingMetadata.Count);\r\n\r\n            // Already downloaded data are reqused\r\n            downloadedMetadata = downloader.ProcessField(\r\n                game,\r\n                new MetadataFieldSettings(true, new List<Guid> { Guid.Empty }),\r\n                MetadataField.Description,\r\n                existingMetadata,\r\n                existingPluginData,\r\n                cancelToken.Token);\r\n\r\n            Assert.IsNotNull(downloadedMetadata);\r\n            Assert.AreEqual(1, storeDownloader.CallCount);\r\n            Assert.AreEqual(0, testPlugin.CallCount);\r\n            Assert.AreEqual(1, existingMetadata.Count);\r\n\r\n            // Store is still used and plugin is not called\r\n            downloadedMetadata = downloader.ProcessField(\r\n                game,\r\n                new MetadataFieldSettings(true, new List<Guid> { Guid.Empty, testPlugin.Id }),\r\n                MetadataField.Description,\r\n                existingMetadata,\r\n                existingPluginData,\r\n                cancelToken.Token);\r\n\r\n            Assert.AreEqual(TestLibraryMetadataProvider.DataString, downloadedMetadata.Description);\r\n            Assert.IsNotNull(downloadedMetadata);\r\n            Assert.AreEqual(1, storeDownloader.CallCount);\r\n            Assert.AreEqual(0, testPlugin.CallCount);\r\n            Assert.AreEqual(1, existingMetadata.Count);\r\n\r\n            // Plugin is not used if not supporting field\r\n            downloadedMetadata = downloader.ProcessField(\r\n                game,\r\n                new MetadataFieldSettings(true, new List<Guid> { Guid.Empty, testPlugin.Id }),\r\n                MetadataField.Description,\r\n                existingMetadata,\r\n                existingPluginData,\r\n                cancelToken.Token);\r\n\r\n            Assert.AreEqual(TestLibraryMetadataProvider.DataString, downloadedMetadata.Description);\r\n            Assert.IsNotNull(downloadedMetadata);\r\n            Assert.AreEqual(1, storeDownloader.CallCount);\r\n            Assert.AreEqual(0, testPlugin.CallCount);\r\n            Assert.AreEqual(1, existingMetadata.Count);\r\n\r\n            // Plugin data is used\r\n            testPlugin.SetSupportedFields(new List<MetadataField> { MetadataField.Description });\r\n            downloadedMetadata = downloader.ProcessField(\r\n                game,\r\n                new MetadataFieldSettings(true, new List<Guid> { testPlugin.Id, Guid.Empty }),\r\n                MetadataField.Description,\r\n                existingMetadata,\r\n                existingPluginData,\r\n                cancelToken.Token);\r\n\r\n            Assert.AreEqual(TestMetadataPlugin.DataString, downloadedMetadata.Description);\r\n            Assert.IsNotNull(downloadedMetadata);\r\n            Assert.AreEqual(1, storeDownloader.CallCount);\r\n            Assert.AreEqual(1, testPlugin.CallCount);\r\n            Assert.AreEqual(1, existingPluginData.Count);\r\n\r\n            // Not data are returned if specific fields doesn't have them\r\n            testPlugin.ReturnMetadata.Description = null;\r\n            downloadedMetadata = downloader.ProcessField(\r\n                game,\r\n                new MetadataFieldSettings(true, new List<Guid> { testPlugin.Id }),\r\n                MetadataField.Description,\r\n                existingMetadata,\r\n                existingPluginData,\r\n                cancelToken.Token);\r\n\r\n            Assert.IsNull(downloadedMetadata);\r\n\r\n            // Second data are used if first doesn't have them\r\n            testPlugin.ReturnMetadata.Description = string.Empty;\r\n            downloadedMetadata = downloader.ProcessField(\r\n                game,\r\n                new MetadataFieldSettings(true, new List<Guid> { testPlugin.Id, Guid.Empty }),\r\n                MetadataField.Description,\r\n                existingMetadata,\r\n                existingPluginData,\r\n                cancelToken.Token);\r\n\r\n            Assert.AreEqual(TestLibraryMetadataProvider.DataString, downloadedMetadata.Description);\r\n        }\r\n\r\n        [Test]\r\n        public async Task MissingDataTest()\r\n        {\r\n            // Tests that existing data are not overriden by empty metadata from external providers.\r\n            var storeId = Guid.NewGuid();\r\n            var storeDownloader = GetTestLibraryProvider();\r\n            storeDownloader.ReturnMetadata = new GameMetadata();\r\n            var testPlugin = GetTestPlugin();\r\n            testPlugin.ReturnMetadata = new GameMetadata();\r\n            testPlugin.SetSupportedFields(new List<MetadataField>\r\n            {\r\n                MetadataField.Description,\r\n                MetadataField.Icon,\r\n                MetadataField.CoverImage,\r\n                MetadataField.BackgroundImage,\r\n                MetadataField.Links,\r\n                MetadataField.Publishers,\r\n                MetadataField.Developers,\r\n                MetadataField.Tags,\r\n                MetadataField.Genres,\r\n                MetadataField.ReleaseDate,\r\n                MetadataField.Features,\r\n                MetadataField.InstallSize\r\n            });\r\n\r\n            List<MetadataPlugin> metadataDownloaders = new List<MetadataPlugin>()\r\n            {\r\n                testPlugin\r\n            };\r\n\r\n            Dictionary<Guid, LibraryMetadataProvider> libraryDownloaders = new Dictionary<Guid, LibraryMetadataProvider>()\r\n            {\r\n                { storeId, storeDownloader }\r\n            };\r\n\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                Game.DatabaseReference = db;\r\n\r\n                var importedGame = db.ImportGame(new GameMetadata()\r\n                {\r\n                    Name = \"Game\",\r\n                    GameId = \"storeId\",\r\n                    Genres = new HashSet<MetadataProperty> { new MetadataNameProperty(\"Genre\") },\r\n                    ReleaseDate = new ReleaseDate(2012, 6, 6),\r\n                    Developers = new HashSet<MetadataProperty> { new MetadataNameProperty(\"Developer\") },\r\n                    Publishers = new HashSet<MetadataProperty> { new MetadataNameProperty(\"Publisher\") },\r\n                    Tags = new HashSet<MetadataProperty> { new MetadataNameProperty(\"Tag\") },\r\n                    Features = new HashSet<MetadataProperty> { new MetadataNameProperty(\"Feature\") },\r\n                    Description = \"Description\",\r\n                    Links = new List<Link> { new Link() },\r\n                    InstallSize = 1000\r\n                });\r\n\r\n                importedGame.PluginId = storeId;\r\n                importedGame.Icon = \"icon\";\r\n                importedGame.CoverImage = \"image\";\r\n                importedGame.BackgroundImage = \"backImage\";\r\n                db.Games.Update(importedGame);\r\n\r\n                var downloader = new MetadataDownloader(db, metadataDownloaders, libraryDownloaders);\r\n                var settings = new MetadataDownloaderSettings() { SkipExistingValues = false };\r\n\r\n                var dbGames = db.Games.ToList();\r\n                var f = dbGames[0].ReleaseDate;\r\n                var s = importedGame.ReleaseDate;\r\n\r\n                settings.ConfigureFields(new List<Guid> { testPlugin.Id, Guid.Empty }, true);\r\n                await downloader.DownloadMetadataAsync(\r\n                    db.Games.ToList(), settings, new PlayniteSettings(), null, new CancellationTokenSource().Token);\r\n\r\n                dbGames = db.Games.ToList();\r\n                Assert.AreEqual(1, testPlugin.CallCount);\r\n                Assert.AreEqual(1, storeDownloader.CallCount);\r\n                var game = dbGames[0];\r\n                Assert.AreEqual(\"Description\", game.Description);\r\n                Assert.AreEqual(\"icon\", game.Icon);\r\n                Assert.AreEqual(\"image\", game.CoverImage);\r\n                Assert.AreEqual(\"backImage\", game.BackgroundImage);\r\n                Assert.AreEqual(\"Developer\", game.Developers[0].Name);\r\n                Assert.AreEqual(\"Publisher\", game.Publishers[0].Name);\r\n                Assert.AreEqual(\"Genre\", game.Genres[0].Name);\r\n                CollectionAssert.IsNotEmpty(game.Links);\r\n                Assert.AreEqual(\"Tag\", game.Tags[0].Name);\r\n                Assert.AreEqual(\"Feature\", game.Features[0].Name);\r\n                Assert.AreEqual(2012, game.ReleaseDate.Value.Year);\r\n                Assert.AreEqual(1000, game.InstallSize);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public async Task SkipExistingTest()\r\n        {\r\n            // Tests that existing data are not overriden even if metadata provider has them.\r\n            var testPlugin = GetTestPlugin();\r\n            testPlugin.SetSupportedFields(new List<MetadataField>\r\n            {\r\n                MetadataField.Description,\r\n                MetadataField.Icon,\r\n                MetadataField.CoverImage,\r\n                MetadataField.BackgroundImage,\r\n                MetadataField.Links,\r\n                MetadataField.Publishers,\r\n                MetadataField.Developers,\r\n                MetadataField.Tags,\r\n                MetadataField.Genres,\r\n                MetadataField.ReleaseDate,\r\n                MetadataField.Features,\r\n                MetadataField.InstallSize\r\n            });\r\n\r\n            var gameId = \"Game1\";\r\n            var icon = new MetadataFile($\"IGDBIconName{gameId}.file\", randomFile);\r\n            var image = new MetadataFile($\"IGDBImageName{gameId}.file\", randomFile);\r\n            var background = new MetadataFile($\"IGDB backgournd {gameId}\");\r\n            testPlugin.ReturnMetadata = new GameMetadata()\r\n            {\r\n                Name = \"IGDB Game \" + gameId,\r\n                Description = $\"IGDB Description {gameId}\",\r\n                Developers = new HashSet<MetadataProperty> { new MetadataNameProperty($\"IGDB Developer {gameId}\") },\r\n                Genres = new HashSet<MetadataProperty> { new MetadataNameProperty($\"IGDB Genre {gameId}\") },\r\n                Links = new List<Link> { new Link($\"IGDB link {gameId}\", $\"IGDB link url {gameId}\") },\r\n                Publishers = new HashSet<MetadataProperty> { new MetadataNameProperty($\"IGDB publisher {gameId}\") },\r\n                ReleaseDate = new ReleaseDate(2012, 6, 6),\r\n                Tags = new HashSet<MetadataProperty> { new MetadataNameProperty($\"IGDB Tag {gameId}\") },\r\n                Features = new HashSet<MetadataProperty> { new MetadataNameProperty($\"IGDB Feature {gameId}\") },\r\n                Icon = icon,\r\n                BackgroundImage = background,\r\n                CoverImage = image,\r\n                InstallSize = 2000\r\n            };\r\n\r\n            List<MetadataPlugin> metadataDownloaders = new List<MetadataPlugin>()\r\n            {\r\n                testPlugin\r\n            };\r\n\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new GameDatabase(temp.TempPath))\r\n            using (var token = new CancellationTokenSource())\r\n            {\r\n                db.OpenDatabase();\r\n                Game.DatabaseReference = db;\r\n                var addedGame = db.ImportGame(new GameMetadata()\r\n                {\r\n                    Name = \"Game1\",\r\n                    Description = \"Description\",\r\n                    Developers = new HashSet<MetadataProperty> { new MetadataNameProperty(\"Developers\") },\r\n                    Genres = new HashSet<MetadataProperty> { new MetadataNameProperty(\"Genres\") },\r\n                    Links = new List<Link>() { new Link(\"Link\", \"URL\") },\r\n                    Publishers = new HashSet<MetadataProperty> { new MetadataNameProperty(\"Publishers\") },\r\n                    ReleaseDate = new ReleaseDate(2012, 6, 6),\r\n                    Tags = new HashSet<MetadataProperty> { new MetadataNameProperty(\"Tags\") },\r\n                    Features = new HashSet<MetadataProperty> { new MetadataNameProperty(\"Features\") },\r\n                    UserScore = 1,\r\n                    CommunityScore = 2,\r\n                    CriticScore = 3,\r\n                    InstallSize = 1000\r\n                });\r\n\r\n                addedGame.Icon = \"Icon\";\r\n                addedGame.CoverImage = \"Image\";\r\n                addedGame.BackgroundImage = \"BackgroundImage\";\r\n\r\n                var downloader = new MetadataDownloader(db, metadataDownloaders, new List<LibraryPlugin>());\r\n                var settings = new MetadataDownloaderSettings() { SkipExistingValues = true };\r\n\r\n                // No download - all values are kept\r\n                settings.ConfigureFields(new List<Guid> { testPlugin.Id }, true);\r\n                await downloader.DownloadMetadataAsync(\r\n                    db.Games.ToList(), settings, new PlayniteSettings(), null, token.Token);\r\n\r\n                var dbGames = db.Games.ToList();\r\n                Assert.AreEqual(0, testPlugin.CallCount);\r\n\r\n                var game1 = dbGames[0];\r\n                Assert.AreEqual(\"Description\", game1.Description);\r\n                Assert.AreEqual(\"Developers\", game1.Developers[0].Name);\r\n                Assert.AreEqual(\"Genres\", game1.Genres[0].Name);\r\n                Assert.AreEqual(\"Link\", game1.Links[0].Name);\r\n                Assert.AreEqual(\"URL\", game1.Links[0].Url);\r\n                Assert.AreEqual(\"Publishers\", game1.Publishers[0].Name);\r\n                Assert.AreEqual(\"Tags\", game1.Tags[0].Name);\r\n                Assert.AreEqual(\"Features\", game1.Features[0].Name);\r\n                Assert.AreEqual(2012, game1.ReleaseDate.Value.Year);\r\n                Assert.AreEqual(1000, game1.InstallSize);\r\n                Assert.IsNotEmpty(game1.BackgroundImage);\r\n                Assert.IsNotEmpty(game1.Icon);\r\n                Assert.IsNotEmpty(game1.CoverImage);\r\n\r\n                // Single download - values are changed even when present\r\n                settings.SkipExistingValues = false;\r\n                await downloader.DownloadMetadataAsync(\r\n                    db.Games.ToList(), settings, new PlayniteSettings(), null, token.Token);\r\n\r\n                dbGames = db.Games.ToList();\r\n                Assert.AreEqual(1, testPlugin.CallCount);\r\n\r\n                game1 = dbGames[0];\r\n                Assert.AreEqual(\"IGDB Description Game1\", game1.Description);\r\n                Assert.AreEqual(\"IGDB Developer Game1\", game1.Developers[0].Name);\r\n                Assert.AreEqual(\"IGDB Genre Game1\", game1.Genres[0].Name);\r\n                Assert.AreEqual(\"IGDB link Game1\", game1.Links[0].Name);\r\n                Assert.AreEqual(\"IGDB link url Game1\", game1.Links[0].Url);\r\n                Assert.AreEqual(\"IGDB publisher Game1\", game1.Publishers[0].Name);\r\n                Assert.AreEqual(\"IGDB Tag Game1\", game1.Tags[0].Name);\r\n                Assert.AreEqual(\"IGDB Feature Game1\", game1.Features[0].Name);\r\n                Assert.AreEqual(2012, game1.ReleaseDate.Value.Year);\r\n                Assert.AreEqual(2000, game1.InstallSize);\r\n                Assert.IsNotEmpty(game1.BackgroundImage);\r\n                Assert.IsNotEmpty(game1.Icon);\r\n                Assert.IsNotEmpty(game1.CoverImage);\r\n\r\n                // Single download - values are changed when skip enabled and values are not present\r\n                testPlugin.CallCount = 0;\r\n                settings.SkipExistingValues = true;\r\n                db.Games.Remove(game1);\r\n                db.Games.Add(new Game(\"Game1\"));\r\n\r\n                await downloader.DownloadMetadataAsync(\r\n                    db.Games.ToList(), settings, new PlayniteSettings(), null, token.Token);\r\n\r\n                dbGames = db.Games.ToList();\r\n                Assert.AreEqual(1, testPlugin.CallCount);\r\n\r\n                game1 = dbGames[0];\r\n                Assert.AreEqual(\"IGDB Description Game1\", game1.Description);\r\n                Assert.AreEqual(\"IGDB Developer Game1\", game1.Developers[0].Name);\r\n                Assert.AreEqual(\"IGDB Genre Game1\", game1.Genres[0].Name);\r\n                Assert.AreEqual(\"IGDB link Game1\", game1.Links[0].Name);\r\n                Assert.AreEqual(\"IGDB link url Game1\", game1.Links[0].Url);\r\n                Assert.AreEqual(\"IGDB publisher Game1\", game1.Publishers[0].Name);\r\n                Assert.AreEqual(\"IGDB Tag Game1\", game1.Tags[0].Name);\r\n                Assert.AreEqual(\"IGDB Feature Game1\", game1.Features[0].Name);\r\n                Assert.AreEqual(2012, game1.ReleaseDate.Value.Year);\r\n                Assert.AreEqual(2000, game1.InstallSize);\r\n                Assert.IsNotEmpty(game1.BackgroundImage);\r\n                Assert.IsNotEmpty(game1.Icon);\r\n                Assert.IsNotEmpty(game1.CoverImage);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void PlatformRegionIdHandlingTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            using (var db = new TestGameDatabase(temp.TempPath))\r\n            {\r\n                db.OpenDatabase();\r\n                db.ClearPlatforms();\r\n                db.ClearRegions();\r\n\r\n                var testPlugin = GetTestPlugin();\r\n                testPlugin.SetSupportedFields(new List<MetadataField> { MetadataField.Platform, MetadataField.Region });\r\n                var addedGame = db.ImportGame(new GameMetadata { Name = \"Game1\" });\r\n                var downloader = new MetadataDownloader(db, new List<MetadataPlugin> { testPlugin }, new List<LibraryPlugin>());\r\n                var settings = new MetadataDownloaderSettings { SkipExistingValues = false };\r\n                settings.ConfigureFields(new List<Guid> { testPlugin.Id }, true);\r\n\r\n                testPlugin.ReturnMetadata.Platforms = new HashSet<MetadataProperty> { new MetadataSpecProperty(\"pc_windows\") };\r\n                testPlugin.ReturnMetadata.Regions = new HashSet<MetadataProperty> { new MetadataSpecProperty(\"world\") };\r\n                downloader.DownloadMetadataAsync(\r\n                    db.Games.ToList(), settings, new PlayniteSettings(), null, new CancellationTokenSource().Token).GetAwaiter().GetResult();\r\n                Assert.AreEqual(\"pc_windows\", db.Platforms.First().SpecificationId);\r\n                Assert.AreEqual(\"pc_windows\", addedGame.Platforms[0].SpecificationId);\r\n                Assert.AreEqual(\"PC (Windows)\", addedGame.Platforms[0].Name);\r\n\r\n                Assert.AreEqual(\"world\", db.Regions.First().SpecificationId);\r\n                Assert.AreEqual(\"world\", addedGame.Regions[0].SpecificationId);\r\n                Assert.AreEqual(\"World\", addedGame.Regions[0].Name);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Models/CopyDiffToTest.cs",
    "content": "﻿using NUnit.Framework;\r\nusing NUnit.Framework.Internal;\r\nusing Playnite.Common;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Models\r\n{\r\n    [TestFixture]\r\n    public class CopyDiffToTests\r\n    {\r\n        public List<T> GenerateList<T>(int size, Random random, bool boolState, Func<T> generator = null)\r\n        {\r\n            var items = new List<T>(size);\r\n            Enumerable.Range(1, random.Next(1, size)).ForEach(a => items.Add(generator == null ? GenerateObject<T>(random, boolState) : generator()));\r\n            return items;\r\n        }\r\n\r\n        public ObservableCollection<T> GenerateObservableList<T>(int size, Random random, bool boolState, Func<T> generator = null)\r\n        {\r\n            return GenerateList<T>(size, random, boolState, generator).ToObservable();\r\n        }\r\n\r\n        public T GenerateObject<T>(Random random, bool boolState)\r\n        {\r\n            var obj = typeof(T).CrateInstance<T>();\r\n            foreach (var prop in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(prop => prop.GetCustomAttribute(typeof(Playnite.SDK.Data.DontSerializeAttribute)) == null))\r\n            {\r\n                if (prop.PropertyType == typeof(string))\r\n                {\r\n                    prop.SetValue(obj, PlayniteTests.GetRandomString(random.Next(10, 100)));\r\n                }\r\n                else if (prop.PropertyType == typeof(List<string>))\r\n                {\r\n                    prop.SetValue(obj, GenerateList<string>(5, random, boolState, () => PlayniteTests.GetRandomString(random.Next(10, 100))));\r\n                }\r\n                else if (prop.PropertyType == typeof(Guid))\r\n                {\r\n                    prop.SetValue(obj, Guid.NewGuid());\r\n                }\r\n                else if (prop.PropertyType == typeof(List<Guid>))\r\n                {\r\n                    prop.SetValue(obj, GenerateList<Guid>(5, random, boolState, () => Guid.NewGuid()));\r\n                }\r\n                else if (prop.PropertyType == typeof(bool))\r\n                {\r\n                    prop.SetValue(obj, boolState);\r\n                }\r\n                else if (prop.PropertyType == typeof(DateTime?))\r\n                {\r\n                    prop.SetValue(obj, new DateTime(random.Next(1980, 2020), random.Next(1, 12), random.Next(1, 28)));\r\n                }\r\n                else if (prop.PropertyType == typeof(ReleaseDate?))\r\n                {\r\n                    prop.SetValue(obj, new ReleaseDate(random.Next(1980, 2020), random.Next(1, 12), random.Next(1, 28)));\r\n                }\r\n                else if (prop.PropertyType == typeof(ulong?) || prop.PropertyType == typeof(ulong))\r\n                {\r\n                    prop.SetValue(obj, (ulong)random.Next(0, int.MaxValue));\r\n                }\r\n                else if (prop.PropertyType == typeof(int?) || prop.PropertyType == typeof(int))\r\n                {\r\n                    prop.SetValue(obj, random.Next(0, 100));\r\n                }\r\n                else if (prop.PropertyType == typeof(List<int>))\r\n                {\r\n                    prop.SetValue(obj, GenerateList<int>(5, random, boolState, () => random.Next(0, 100)));\r\n                }\r\n                else if (prop.PropertyType.IsEnum)\r\n                {\r\n                    var values = Enum.GetValues(prop.PropertyType);\r\n                    prop.SetValue(obj, values.GetValue(random.Next(values.Length)));\r\n                }\r\n                else if (Nullable.GetUnderlyingType(prop.PropertyType)?.IsEnum == true)\r\n                {\r\n                    var values = Enum.GetValues(Nullable.GetUnderlyingType(prop.PropertyType));\r\n                    prop.SetValue(obj, values.GetValue(random.Next(values.Length)));\r\n                }\r\n                else if (prop.PropertyType.FullName.StartsWith(\"Playnite.SDK.Models\"))\r\n                {\r\n                    var genMethod = typeof(CopyDiffToTests).GetMethod(nameof(GenerateObject)).MakeGenericMethod(prop.PropertyType);\r\n                    prop.SetValue(obj, genMethod.Invoke(this, new object[] { random, boolState }));\r\n                }\r\n                else if (prop.PropertyType.FullName.Contains(\"ObservableCollection`1[[Playnite.SDK.Models\"))\r\n                {\r\n                    var baseType = prop.PropertyType.BaseType.GetGenericArguments()[0];\r\n                    var genMethod = typeof(CopyDiffToTests).GetMethod(nameof(GenerateObservableList)).MakeGenericMethod(baseType);\r\n                    prop.SetValue(obj, genMethod.Invoke(this, new object[] { 5, random, boolState, null }));\r\n                }\r\n                else\r\n                {\r\n                    throw new Exception($\"Uknown member type {prop.PropertyType}\");\r\n                }\r\n            }\r\n\r\n            return obj;\r\n        }\r\n\r\n        [Test]\r\n        public void GameCopyDiffToTest()\r\n        {\r\n            var random = new Random();\r\n            var generated = GenerateObject<Game>(random, false);\r\n            var generated2 = GenerateObject<Game>(random, true);\r\n            generated2.Id = generated.Id;\r\n            var empty = new Game() { Id = generated.Id };\r\n            generated.CopyDiffTo(empty);\r\n            generated.CopyDiffTo(generated2);\r\n\r\n            Assert.AreEqual(0, generated.GetDifferences(empty).Count);\r\n            Assert.AreEqual(0, generated.GetDifferences(generated2).Count);\r\n            Assert.AreEqual(Serialization.ToJson(generated), Serialization.ToJson(empty));\r\n            Assert.AreEqual(Serialization.ToJson(generated), Serialization.ToJson(generated2));\r\n\r\n            generated2.Name = \"test\";\r\n            generated2.Description = \"test2\";\r\n            var changes = 0;\r\n            generated2.PropertyChanged += (_, __) => changes++;\r\n            generated.CopyDiffTo(generated2);\r\n            Assert.AreEqual(2, changes);\r\n        }\r\n\r\n        public void CopyDiffToTest<T>() where T : DatabaseObject\r\n        {\r\n            var random = new Random();\r\n            var generated = GenerateObject<T>(random, false);\r\n            var generated2 = GenerateObject<T>(random, true);\r\n            generated2.Id = generated.Id;\r\n            var empty = typeof(T).CrateInstance<T>();\r\n            empty.Id = generated.Id;\r\n            generated.CopyDiffTo(empty);\r\n            generated.CopyDiffTo(generated2);\r\n\r\n            Assert.AreEqual(Serialization.ToJson(generated), Serialization.ToJson(empty));\r\n            Assert.AreEqual(Serialization.ToJson(generated), Serialization.ToJson(generated2));\r\n        }\r\n\r\n        [Test]\r\n        public void CopyDiffToTest()\r\n        {\r\n            CopyDiffToTest<AgeRating>();\r\n            CopyDiffToTest<Category>();\r\n            CopyDiffToTest<Company>();\r\n            CopyDiffToTest<CompletionStatus>();\r\n            CopyDiffToTest<Emulator>();\r\n            CopyDiffToTest<GameFeature>();\r\n            CopyDiffToTest<FilterPreset>();\r\n            CopyDiffToTest<Genre>();\r\n            CopyDiffToTest<ImportExclusionItem>();\r\n            CopyDiffToTest<Platform>();\r\n            CopyDiffToTest<Region>();\r\n            CopyDiffToTest<GameScannerConfig>();\r\n            CopyDiffToTest<Series>();\r\n            CopyDiffToTest<GameSource>();\r\n            CopyDiffToTest<Tag>();\r\n            CopyDiffToTest<AppSoftware>();\r\n        }\r\n\r\n        [Test]\r\n        public void GetCopyTest()\r\n        {\r\n            var random = new Random();\r\n\r\n            var game = GenerateObject<Game>(random, true);\r\n            Assert.AreEqual(Serialization.ToJson(game), Serialization.ToJson(game.GetCopy()));\r\n\r\n            var gameAction = GenerateObject<GameAction>(random, true);\r\n            Assert.AreEqual(Serialization.ToJson(gameAction), Serialization.ToJson(gameAction.GetCopy()));\r\n\r\n            var cusProfile = GenerateObject<CustomEmulatorProfile>(random, true);\r\n            Assert.AreEqual(Serialization.ToJson(cusProfile), Serialization.ToJson(cusProfile.GetCopy()));\r\n\r\n            var buiProfile = GenerateObject<BuiltInEmulatorProfile>(random, true);\r\n            Assert.AreEqual(Serialization.ToJson(buiProfile), Serialization.ToJson(buiProfile.GetCopy()));\r\n\r\n            var emulator = GenerateObject<Emulator>(random, true);\r\n            Assert.AreEqual(Serialization.ToJson(emulator), Serialization.ToJson(emulator.GetCopy()));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Models/DatabaseObjectTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Models\r\n{\r\n    [TestFixture]\r\n    public class DatabaseObjectTests\r\n    {\r\n        [Test]\r\n        public void CopyDiffToTest()\r\n        {\r\n            var obj1 = new DatabaseObject() { Name = \"obj1\" };\r\n            var obj2 = new DatabaseObject() { Name = \"obj2\" };\r\n            var obj3 = new DatabaseObject() { Name = \"Obj1\" };\r\n            var obj4 = new DatabaseObject() { Name = \"obj1\" };\r\n            var changes = 0;\r\n\r\n            obj1.PropertyChanged += (s, e) => changes++;\r\n            obj2.PropertyChanged += (s, e) => changes++;\r\n            obj3.PropertyChanged += (s, e) => changes++;\r\n\r\n            obj1.CopyDiffTo(obj2);\r\n            Assert.AreEqual(1, changes);\r\n            Assert.AreEqual(\"obj1\", obj2.Name);\r\n\r\n            changes = 0;\r\n            obj1.CopyDiffTo(obj3);\r\n            Assert.AreEqual(1, changes);\r\n            Assert.AreEqual(\"obj1\", obj3.Name);\r\n\r\n            changes = 0;\r\n            obj1.CopyDiffTo(obj4);\r\n            Assert.AreEqual(0, changes);\r\n            Assert.AreEqual(\"obj1\", obj4.Name);\r\n        }\r\n\r\n        [Test]\r\n        public void CopyDiffToArgumentTest()\r\n        {\r\n            var obj1 = new DatabaseObject() { Name = \"obj1\" };\r\n            var obj2 = new Version();\r\n            Assert.Throws<ArgumentNullException>(() => obj1.CopyDiffTo(null));\r\n            Assert.Throws<ReferenceException>(() => obj1.CopyDiffTo(obj1));\r\n            Assert.Throws<TypeMismatchException>(() => obj1.CopyDiffTo(obj2));\r\n        }\r\n\r\n        [Test]\r\n        public void EqualsTest()\r\n        {\r\n            var obj1 = new DatabaseObject();\r\n            var obj2 = new DatabaseObject() { Id = obj1.Id };\r\n            var obj3 = new DatabaseObject();\r\n            Assert.AreEqual(obj1, obj2);\r\n            Assert.AreNotEqual(obj1, obj3);\r\n            Assert.IsTrue(obj1.Equals(obj2));\r\n            Assert.IsFalse(obj1.Equals(obj3));\r\n            Assert.AreEqual(2, new List<DatabaseObject> { obj1, obj2, obj3 }.Distinct().Count());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Models/GameActionTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Models\r\n{\r\n    [TestFixture]\r\n    public class GameActionTests\r\n    {\r\n        [Test]\r\n        public void EqualityTest()\r\n        {\r\n            var obj1 = new GameAction()\r\n            {\r\n                AdditionalArguments = \"addargs\",\r\n                Arguments = \"args\",\r\n                EmulatorId = new Guid(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),\r\n                EmulatorProfileId = \"2\",\r\n                IsPlayAction = false,\r\n                Name = \"name\",\r\n                OverrideDefaultArgs = false,\r\n                Path = \"path\",\r\n                SuppressNotifications = false,\r\n                Type = GameActionType.Emulator,\r\n                WorkingDir = \"workdir\"\r\n            };\r\n\r\n            var obj2 = new GameAction()\r\n            {\r\n                AdditionalArguments = \"addargs\",\r\n                Arguments = \"args\",\r\n                EmulatorId = new Guid(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),\r\n                EmulatorProfileId = \"2\",\r\n                IsPlayAction = false,\r\n                Name = \"name\",\r\n                OverrideDefaultArgs = false,\r\n                Path = \"path\",\r\n                SuppressNotifications = false,\r\n                Type = GameActionType.Emulator,\r\n                WorkingDir = \"workdir\"\r\n            };\r\n\r\n            var obj3 = new GameAction()\r\n            {\r\n                AdditionalArguments = \"addargs2\",\r\n                Arguments = \"args2\",\r\n                EmulatorId = new Guid(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),\r\n                EmulatorProfileId = \"1\",\r\n                IsPlayAction = true,\r\n                Name = \"name2\",\r\n                OverrideDefaultArgs = true,\r\n                Path = \"path2\",\r\n                SuppressNotifications = true,\r\n                Type = GameActionType.File,\r\n                WorkingDir = \"workdir2\"\r\n            };\r\n\r\n            Assert.IsTrue(obj1.Equals(obj2));\r\n            Assert.IsFalse(obj1.Equals(obj3));\r\n\r\n            Assert.IsTrue(\r\n                new List<GameAction> { new GameAction() { Name = \"1\" }, new GameAction() { Name = \"2\" } }.IsListEqualExact(\r\n                new List<GameAction> { new GameAction() { Name = \"1\" }, new GameAction() { Name = \"2\" } }));\r\n\r\n            Assert.IsFalse(\r\n                new List<GameAction> { new GameAction() { Name = \"1\" }, new GameAction() { Name = \"2\" } }.IsListEqualExact(\r\n                new List<GameAction> { new GameAction() { Name = \"2\" }, new GameAction() { Name = \"1\" } }));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Models/GameTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.Settings;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Models\r\n{\r\n    [TestFixture]\r\n    public class GameTests\r\n    {\r\n        [Test]\r\n        public void ExpandVariablesTest()\r\n        {\r\n            var database = new InMemoryGameDatabase();\r\n            Game.DatabaseReference = database;\r\n            GameDatabase.GenerateSampleData(database);\r\n\r\n            var dir = @\"c:\\test\\test2\\\";\r\n            var game = new Game()\r\n            {\r\n                Name = \"test game\",\r\n                InstallDirectory = dir,\r\n                Roms = new ObservableCollection<GameRom> { new GameRom(\"test\", Path.Combine(dir, \"test.iso\")) },\r\n                PlatformIds = new List<Guid> { database.Platforms.First().Id },\r\n                Version = \"1.0\",\r\n                PluginId = Guid.NewGuid(),\r\n                GameId = \"game_id\",\r\n                Id = Guid.NewGuid()\r\n            };\r\n\r\n            Assert.AreEqual(string.Empty, game.ExpandVariables(string.Empty));\r\n            Assert.AreEqual(\"teststring\", game.ExpandVariables(\"teststring\"));\r\n            Assert.AreEqual(dir + \"teststring\", game.ExpandVariables(\"{InstallDir}teststring\"));\r\n            Assert.AreEqual(game.InstallDirectory, game.ExpandVariables(\"{InstallDir}\"));\r\n            Assert.AreEqual(\"test\", game.ExpandVariables(\"{ImageNameNoExt}\"));\r\n            Assert.AreEqual(\"test.iso\", game.ExpandVariables(\"{ImageName}\"));\r\n            Assert.AreEqual(PlaynitePaths.ProgramPath, game.ExpandVariables(\"{PlayniteDir}\"));\r\n            Assert.AreEqual(\"test game\", game.ExpandVariables(\"{Name}\"));\r\n            Assert.AreEqual(\"test2\", game.ExpandVariables(\"{InstallDirName}\"));\r\n            Assert.AreEqual(game.Platforms[0].Name, game.ExpandVariables(\"{Platform}\"));\r\n            Assert.AreEqual(game.PluginId.ToString(), game.ExpandVariables(\"{PluginId}\"));\r\n            Assert.AreEqual(game.GameId, game.ExpandVariables(\"{GameId}\"));\r\n            Assert.AreEqual(game.Id.ToString(), game.ExpandVariables(\"{DatabaseId}\"));\r\n            Assert.AreEqual(game.Version, game.ExpandVariables(\"{Version}\"));\r\n            Assert.AreEqual(Path.Combine(dir, \"test.iso\"), game.ExpandVariables(\"{ImagePath}\"));\r\n\r\n            game.InstallDirectory = @\"c:\\test\\test2\";\r\n            Assert.AreEqual(\"test2\", game.ExpandVariables(\"{InstallDirName}\"));\r\n        }\r\n\r\n        [Test]\r\n        public void ExpandVariablesReferenceTest()\r\n        {\r\n            var database = new InMemoryGameDatabase();\r\n            Game.DatabaseReference = database;\r\n            GameDatabase.GenerateSampleData(database);\r\n\r\n            var game = new Game()\r\n            {\r\n                Name = \"test game\",\r\n                InstallDirectory = @\"{PlayniteDir}\\test\\test2\\\",\r\n                Roms = new ObservableCollection<GameRom> { new GameRom(\"test\", @\"{InstallDir}\\test.iso\") }\r\n            };\r\n\r\n            var expanded = game.ExpandVariables(\"{ImagePath}\");\r\n            StringAssert.DoesNotContain(\"{ImagePath}\", expanded);\r\n            StringAssert.DoesNotContain(\"{PlayniteDir}\", expanded);\r\n        }\r\n\r\n        [Test]\r\n        public void ExpandVariablesEmptyTest()\r\n        {\r\n            // Should not throw\r\n            var game = new Game();\r\n            game.ExpandVariables(string.Empty);\r\n            game.ExpandVariables(null);\r\n        }\r\n\r\n        [Test]\r\n        public void GameIdTest()\r\n        {\r\n            var game1 = new Game();\r\n            Assert.IsFalse(string.IsNullOrEmpty(game1.GameId));\r\n            Assert.AreNotEqual(game1.GameId, new Game().GameId);\r\n        }\r\n\r\n        [Test]\r\n        public void GetCompatibleEmulatorsTest()\r\n        {\r\n            using (var db = new GameDbTestWrapper())\r\n            {\r\n                db.DB.Emulators.Add(new List<Emulator>\r\n                {\r\n                    new Emulator(\"emu1\")\r\n                    {\r\n                        CustomProfiles = new ObservableCollection<CustomEmulatorProfile>\r\n                        {\r\n                            new CustomEmulatorProfile\r\n                            {\r\n                                Name = \"ps\",\r\n                                Platforms = db.DB.Platforms.Where(a => a.SpecificationId == \"sony_playstation\" || a.SpecificationId == \"sony_playstation2\").Select(a => a.Id).ToList()\r\n                            },\r\n                            new CustomEmulatorProfile\r\n                            {\r\n                                Platforms = db.DB.Platforms.Where(a => a.SpecificationId == \"xbox\").Select(a => a.Id).ToList()\r\n                            }\r\n                        }\r\n                    },\r\n                    new Emulator(\"emu2\")\r\n                    {\r\n                        CustomProfiles = new ObservableCollection<CustomEmulatorProfile>\r\n                        {\r\n                            new CustomEmulatorProfile\r\n                            {\r\n                                Platforms = db.DB.Platforms.Where(a => a.SpecificationId == \"xbox\").Select(a => a.Id).ToList()\r\n                            }\r\n                        }\r\n                    },\r\n                    new Emulator(\"emu3\")\r\n                    {\r\n                        CustomProfiles = new ObservableCollection<CustomEmulatorProfile>\r\n                        {\r\n                            new CustomEmulatorProfile\r\n                            {\r\n                                Name = \"test profile\"\r\n                            }\r\n                        }\r\n                    },\r\n                    new Emulator(\"emu4\")\r\n                    {\r\n                        BuiltInConfigId = \"duckstation\",\r\n                        BuiltinProfiles = new ObservableCollection<BuiltInEmulatorProfile>\r\n                        {\r\n                            new BuiltInEmulatorProfile\r\n                            {\r\n                                Name = \"test\",\r\n                                BuiltInProfileName = \"Default\"\r\n                            },\r\n                        }\r\n                    },\r\n                    new Emulator(\"emu5\")\r\n                    {\r\n                        BuiltInConfigId = \"duckstation\",\r\n                        BuiltinProfiles = new ObservableCollection<BuiltInEmulatorProfile>\r\n                        {\r\n                            new BuiltInEmulatorProfile\r\n                            {\r\n                                Name = \"test\",\r\n                                BuiltInProfileName = \"Default\"\r\n                            },\r\n                        },\r\n                        CustomProfiles = new ObservableCollection<CustomEmulatorProfile>\r\n                        {\r\n                            new CustomEmulatorProfile\r\n                            {\r\n                                Platforms = db.DB.Platforms.Where(a => a.SpecificationId == \"sony_playstation\").Select(a => a.Id).ToList()\r\n                            }\r\n                        }\r\n                    },\r\n                    new Emulator(\"emu6\")\r\n                    {\r\n                        BuiltInConfigId = \"melonds\",\r\n                        BuiltinProfiles = new ObservableCollection<BuiltInEmulatorProfile>\r\n                        {\r\n                            new BuiltInEmulatorProfile\r\n                            {\r\n                                Name = \"test\",\r\n                                BuiltInProfileName = \"Default\"\r\n                            }\r\n                        }\r\n                    }\r\n                });\r\n\r\n                var game = new Game()\r\n                {\r\n                    PlatformIds = db.DB.Platforms.Where(a => a.SpecificationId == \"sony_playstation\").Select(a => a.Id).ToList()\r\n                };\r\n\r\n                var comEmus = game.GetCompatibleEmulators(db.DB).OrderBy(a => a.Key.Name).ToList();\r\n                Assert.AreEqual(3, comEmus.Count);\r\n\r\n                Assert.AreEqual(\"emu1\", comEmus[0].Key.Name);\r\n                Assert.AreEqual(1, comEmus[0].Value.Count);\r\n                Assert.AreEqual(\"ps\", comEmus[0].Value[0].Name);\r\n\r\n                Assert.AreEqual(\"emu4\", comEmus[1].Key.Name);\r\n                Assert.AreEqual(1, comEmus[1].Value.Count);\r\n\r\n                Assert.AreEqual(\"emu5\", comEmus[2].Key.Name);\r\n                Assert.AreEqual(2, comEmus[2].Value.Count);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void InstallDriveTest()\r\n        {\r\n            var database = new InMemoryGameDatabase();\r\n            Game.DatabaseReference = database;\r\n            GameDatabase.GenerateSampleData(database);\r\n\r\n            var dir = @\"C:\\test\\test2\\\";\r\n            var game = new Game()\r\n            {\r\n                Name = \"test game\",\r\n                InstallDirectory = dir,\r\n                IsInstalled = true\r\n            };\r\n\r\n            Assert.AreEqual(@\"C:\\\", game.GetInstallDrive());\r\n            game.InstallDirectory = @\"c:\\test\\test2\\\";\r\n            Assert.AreEqual(@\"C:\\\", game.GetInstallDrive());\r\n            game.IsInstalled = false;\r\n            Assert.AreEqual(string.Empty, game.GetInstallDrive());\r\n\r\n            game.IsInstalled = true;\r\n            game.InstallDirectory = @\" \";\r\n            Assert.AreEqual(string.Empty, game.GetInstallDrive());\r\n            game.InstallDirectory = @\"\";\r\n            Assert.AreEqual(string.Empty, game.GetInstallDrive());\r\n            game.InstallDirectory = null;\r\n            Assert.AreEqual(string.Empty, game.GetInstallDrive());\r\n            game.InstallDirectory = @\"c:\\test\\<>:\"\"/\\|?*\\test2\\\";\r\n            Assert.AreEqual(string.Empty, game.GetInstallDrive());\r\n            game.InstallDirectory = @\"SomeString\";\r\n            Assert.AreEqual(string.Empty, game.GetInstallDrive());\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tests/Playnite.Tests/Models/MetadataPropertyTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Models\r\n{\r\n    [TestFixture]\r\n    public class MetadataPropertyTests\r\n    {\r\n        [Test]\r\n        public void EqualityTest()\r\n        {\r\n            Assert.IsTrue(new MetadataNameProperty(\"test\").Equals(new MetadataNameProperty(\"test\")));\r\n            Assert.IsFalse(new MetadataNameProperty(\"test\").Equals(new MetadataNameProperty(\"test2\")));\r\n\r\n            Assert.IsTrue(new MetadataSpecProperty(\"test\").Equals(new MetadataSpecProperty(\"test\")));\r\n            Assert.IsFalse(new MetadataSpecProperty(\"test\").Equals(new MetadataSpecProperty(\"test2\")));\r\n\r\n            var guid1 = Guid.NewGuid();\r\n            var guid2 = Guid.NewGuid();\r\n            Assert.IsTrue(new MetadataIdProperty(guid1).Equals(new MetadataIdProperty(guid1)));\r\n            Assert.IsFalse(new MetadataIdProperty(guid1).Equals(new MetadataIdProperty(guid2)));\r\n        }\r\n\r\n        [Test]\r\n        public void CloneTest()\r\n        {\r\n            var orig = new MetadataNameProperty(\"test\");\r\n            var clone = orig.GetClone();\r\n            Assert.IsTrue(orig.Equals(clone));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/PathsTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing NUnit.Framework;\r\nusing Playnite.Common;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class PathsTests\r\n    {\r\n        [Test]\r\n        public void GetFinalPathNameTest()\r\n        {\r\n            Assert.AreEqual(@\"C:\\Users\", Paths.GetFinalPathName(@\"c:\\Documents and Settings\"));\r\n            Assert.AreEqual(@\"C:\\Users\", Paths.GetFinalPathName(@\"C:\\Users\"));\r\n            Assert.AreEqual(@\"\\\\server\\someunc\\testpath\", Paths.GetFinalPathName(@\"\\\\server\\someunc\\testpath\"));\r\n        }\r\n\r\n        [Test]\r\n        public void GetValidFilePathTest()\r\n        {\r\n            Assert.IsTrue(Paths.IsValidFilePath(@\"test.db\"));\r\n            Assert.IsTrue(Paths.IsValidFilePath(@\"c:\\test.db\"));\r\n            Assert.IsTrue(Paths.IsValidFilePath(@\"..\\test.db\"));\r\n\r\n            Assert.IsFalse(Paths.IsValidFilePath(@\"c:\\test\"));\r\n            Assert.IsFalse(Paths.IsValidFilePath(@\"q:\\test.db\"));\r\n            Assert.IsFalse(Paths.IsValidFilePath(string.Empty));\r\n            Assert.IsFalse(Paths.IsValidFilePath(@\"test\"));\r\n            Assert.IsFalse(Paths.IsValidFilePath(@\"..\\test\"));\r\n        }\r\n\r\n        [Test]\r\n        public void FixSeparatorsTest()\r\n        {\r\n            Assert.AreEqual(@\"D:\\GOG Games\\AAAlbion\\DOSBOX\\dosbox.exe\", Paths.FixSeparators(@\"D:/GOG Games//AAAlbion\\\\\\DOSBOX/\\dosbox.exe\"));\r\n            Assert.AreEqual(@\"D:\\GOG Games\\Albion\\DOSBOX\\dosbox.exe\", Paths.FixSeparators(@\"D:\\GOG Games\\Albion\\DOSBOX\\dosbox.exe\"));\r\n            Assert.AreEqual(@\"\\\\unc\\test\\path\\dosbox.exe\", Paths.FixSeparators(@\"\\\\unc\\test/path\\\\dosbox.exe\"));\r\n            Assert.AreEqual(@\"\\\\unc\\test\\path\\dosbox.exe\", Paths.FixSeparators(@\"\\\\unc\\test\\path\\dosbox.exe\"));\r\n            Assert.AreEqual(@\"D:\\これはユニコードパステストです\\dosbox.exe\", Paths.FixSeparators(@\"D:/これはユニコードパステストです\\/\\dosbox.exe\"));\r\n        }\r\n\r\n        [Test]\r\n        public void AreEqualTest()\r\n        {\r\n            Assert.IsTrue(Paths.AreEqual(@\"c:\\test\", @\"c:\\TesT\"));\r\n            Assert.IsTrue(Paths.AreEqual(\"test\", \"TesT\"));\r\n            Assert.IsTrue(Paths.AreEqual(@\"c:\\test\\\", @\"c:\\TesT\"));\r\n            Assert.IsTrue(Paths.AreEqual(@\"c:/test/\", @\"c:\\TesT\"));\r\n            Assert.IsTrue(Paths.AreEqual(@\"..\\test\\\", @\"..\\TesT\"));\r\n            Assert.IsTrue(Paths.AreEqual(@\".\\test\\\", @\"TesT\"));\r\n            Assert.IsTrue(Paths.AreEqual(@\"\\\\unc\\test\\\", @\"\\\\UNC\\TesT\"));\r\n            Assert.IsTrue(Paths.AreEqual(@\"file.exe\", @\".\\file.exe\"));\r\n\r\n            Assert.IsFalse(Paths.AreEqual(@\"file2.exe\", @\".\\file.exe\"));\r\n            Assert.IsFalse(Paths.AreEqual(@\"c:\\file.exe\", @\"d:\\file.exe\"));\r\n            Assert.IsFalse(Paths.AreEqual(@\"c:\\file:?.exe\", @\"d:\\file.exe\"));\r\n        }\r\n\r\n        [Test]\r\n        public void IsFullPathTest()\r\n        {\r\n            Assert.IsTrue(Paths.IsFullPath(@\"c:\\test\"));\r\n            Assert.IsTrue(Paths.IsFullPath(@\"c:\\test\\test.exe\"));\r\n            Assert.IsTrue(Paths.IsFullPath(@\"c:\\test\\\"));\r\n            Assert.IsTrue(Paths.IsFullPath(@\"c:\\test\\..\\test.exe\"));\r\n            Assert.IsTrue(Paths.IsFullPath(@\"\\\\server\\share\\test.exe\"));\r\n            Assert.IsFalse(Paths.IsFullPath(@\"test\"));\r\n            Assert.IsFalse(Paths.IsFullPath(@\"\\test\"));\r\n            Assert.IsFalse(Paths.IsFullPath(@\".\\test\"));\r\n            Assert.IsFalse(Paths.IsFullPath(@\"test.exe\"));\r\n            Assert.IsFalse(Paths.IsFullPath(@\"\\test.exe\"));\r\n            Assert.IsFalse(Paths.IsFullPath(@\".\\test.exe\"));\r\n        }\r\n\r\n        [Test]\r\n        public void GetSafeFilenameTest()\r\n        {\r\n            Assert.AreEqual(\"test aaa\", Paths.GetSafePathName(\"test >> aaa \"));\r\n        }\r\n\r\n        [Test]\r\n        public void GetCommonDirectoryTest()\r\n        {\r\n            Assert.AreEqual(@\"c:\\test\\\", Paths.GetCommonDirectory(new string[]\r\n            {\r\n                @\"c:\\test\\file.exe\",\r\n                @\"c:\\test\\file2.exe\",\r\n                @\"c:\\test\\\",\r\n            }));\r\n\r\n            Assert.AreEqual(@\"c:\\test\\file\\\", Paths.GetCommonDirectory(new string[]\r\n            {\r\n                @\"c:\\test\\file\\aa.exe\",\r\n                @\"c:\\test\\file\\bb.ee\",\r\n                @\"c:\\test\\file\\cc.ss\",\r\n            }));\r\n\r\n            Assert.AreEqual(@\"c:\\\", Paths.GetCommonDirectory(new string[]\r\n            {\r\n                @\"c:\\file1.aa\",\r\n                @\"c:\\file1.aa\",\r\n                @\"c:\\file1.aa\",\r\n            }));\r\n\r\n            Assert.AreEqual(string.Empty, Paths.GetCommonDirectory(new string[]\r\n            {\r\n                @\"c:\\test\\file1\",\r\n                @\"d:\\test\\file2\",\r\n                @\"e:\\test\\file\",\r\n            }));\r\n\r\n            Assert.AreEqual(string.Empty, Paths.GetCommonDirectory(new string[]\r\n{\r\n                @\"c:\\test\\file1\",\r\n                @\"d:\\test1\\aa\\file2\",\r\n                @\"e:\\test2\\file\",\r\n            }));\r\n        }\r\n\r\n        [Test]\r\n        public void MathcesFilePattern()\r\n        {\r\n            Assert.IsTrue(Paths.MathcesFilePattern(@\"c:\\test\\aa.txt\", \"*.txt\"));\r\n            Assert.IsTrue(Paths.MathcesFilePattern(@\"c:\\test\\aa.txt\", \"*.TXT\"));\r\n            Assert.IsFalse(Paths.MathcesFilePattern(@\"c:\\test\\aa.txt\", \"*.doc\"));\r\n            Assert.IsTrue(Paths.MathcesFilePattern(@\"c:\\test\\aa.txt\", @\"c:\\**\\*.txt\"));\r\n            Assert.IsFalse(Paths.MathcesFilePattern(@\"c:\\test\\aa.txt\", @\"d:\\**\\*.txt\"));\r\n            Assert.IsTrue(Paths.MathcesFilePattern(@\"c:\\test\\aa.txt\", \".doc;*.txt\"));\r\n        }\r\n\r\n        [Test]\r\n        public void FixPathLengthTests()\r\n        {\r\n            Assert.AreEqual(\r\n                @\"\\\\?\\d:\\Users\\dasdasdasd_opgjx5r\\AppData\\Roaming\\Playnite\\ExtensionsData\\00000002-dbd1-46c6-b5d0-b1ba559d10e4\\catalogcache\\0ded1556336546bf849c9d28878ec86c_e24cb0ee3d1c4279b60100178b73db42_20210929-143303-REL_UPDATE_2_1010972_Shipping_1010972-deploy-20210930-092520.json\",\r\n                Paths.FixPathLength(\r\n                    @\"d:\\Users\\dasdasdasd_opgjx5r\\AppData\\Roaming\\Playnite\\ExtensionsData\\00000002-dbd1-46c6-b5d0-b1ba559d10e4\\catalogcache\\0ded1556336546bf849c9d28878ec86c_e24cb0ee3d1c4279b60100178b73db42_20210929-143303-REL_UPDATE_2_1010972_Shipping_1010972-deploy-20210930-092520.json\"));\r\n            Assert.AreEqual(\r\n                @\"\\\\?\\UNC\\server\\share\\Users\\dasdasdasd_opgjx5r\\AppData\\Roaming\\Playnite\\ExtensionsData\\00000002-dbd1-46c6-b5d0-b1ba559d10e4\\catalogcache\\0ded1556336546bf849c9d28878ec86c_e24cb0ee3d1c4279b60100178b73db42_20210929-143303-REL_UPDATE_2_1010972_Shipping_1010972-deploy-20210930-092520.json\",\r\n                Paths.FixPathLength(\r\n                    @\"\\\\server\\share\\Users\\dasdasdasd_opgjx5r\\AppData\\Roaming\\Playnite\\ExtensionsData\\00000002-dbd1-46c6-b5d0-b1ba559d10e4\\catalogcache\\0ded1556336546bf849c9d28878ec86c_e24cb0ee3d1c4279b60100178b73db42_20210929-143303-REL_UPDATE_2_1010972_Shipping_1010972-deploy-20210930-092520.json\"));\r\n        }\r\n\r\n        [Test]\r\n        public void ContainsInvalidFileNameCharsTest()\r\n        {\r\n            Assert.IsTrue(Paths.ContainsInvalidPathChars(@\"c:\\<>\\aaa.txt\"));\r\n            Assert.IsFalse(Paths.ContainsInvalidPathChars(@\"c:\\test\\aaa.txt\"));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Playnite.Tests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props\" Condition=\"Exists('..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props')\" />\r\n  <Import Project=\"..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props\" Condition=\"Exists('..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props')\" />\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{F15B7D48-7F9C-406A-825C-B47BB9A5BF4B}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>Playnite.Tests</RootNamespace>\r\n    <AssemblyName>Playnite.Tests</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">15.0</VisualStudioVersion>\r\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\r\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\r\n    <IsCodedUITest>False</IsCodedUITest>\r\n    <TestProjectType>UnitTest</TestProjectType>\r\n    <NuGetPackageImportStamp>\r\n    </NuGetPackageImportStamp>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\r\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\Castle.Core.4.3.1\\lib\\net45\\Castle.Core.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"LiteDB, Version=4.1.4.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\LiteDB.4.1.4\\lib\\net40\\LiteDB.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"Microsoft.Dynamic, Version=1.2.0.0, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\DynamicLanguageRuntime.1.2.1\\lib\\net45\\Microsoft.Dynamic.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.Scripting, Version=1.2.0.0, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\DynamicLanguageRuntime.1.2.1\\lib\\net45\\Microsoft.Scripting.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.Scripting.Metadata, Version=1.2.0.0, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\DynamicLanguageRuntime.1.2.1\\lib\\net45\\Microsoft.Scripting.Metadata.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Microsoft.VisualStudio.CodeCoverage.Shim, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\DynamicLanguageRuntime.1.2.1\\lib\\net45\\Microsoft.VisualStudio.CodeCoverage.Shim.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Moq, Version=4.10.0.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\Moq.4.10.1\\lib\\net45\\Moq.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\Newtonsoft.Json.10.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"nunit.framework, Version=3.13.2.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\NUnit.3.13.2\\lib\\net45\\nunit.framework.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Configuration\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Drawing\" />\r\n    <Reference Include=\"System.IO.Abstractions, Version=2.1.0.227, Culture=neutral, PublicKeyToken=96bf224d23c43e59, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\System.IO.Abstractions.2.1.0.227\\lib\\net40\\System.IO.Abstractions.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.IO.Abstractions.TestingHelpers, Version=2.1.0.227, Culture=neutral, PublicKeyToken=96bf224d23c43e59, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\System.IO.Abstractions.TestingHelpers.2.1.0.227\\lib\\net40\\System.IO.Abstractions.TestingHelpers.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.IO.Compression.FileSystem\" />\r\n    <Reference Include=\"System.Management.Automation\" />\r\n    <Reference Include=\"System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\System.Runtime.CompilerServices.Unsafe.4.5.3\\lib\\net461\\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\System.Threading.Tasks.Extensions.4.5.1\\lib\\netstandard2.0\\System.Threading.Tasks.Extensions.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\System.ValueTuple.4.5.0\\lib\\net461\\System.ValueTuple.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Windows.Forms\" />\r\n    <Reference Include=\"System.Xaml\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"WindowsBase\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"..\\TestApp\\TestAppProcInfo.cs\">\r\n      <Link>_TestTools\\TestAppProcInfo.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"Api\\PluginDescriptionTests.cs\" />\r\n    <Compile Include=\"App\\UpdateTests.cs\" />\r\n    <Compile Include=\"CloneObjectTests.cs\" />\r\n    <Compile Include=\"Converters\\PlayTimeToStringConverterTests.cs\" />\r\n    <Compile Include=\"Database\\EmulatorsCollectionTests.cs\" />\r\n    <Compile Include=\"Database\\FiltersDatabaseTests.cs\" />\r\n    <Compile Include=\"Database\\GameLibraryFilterTests.cs\" />\r\n    <Compile Include=\"Emulators\\EmulationTests.cs\" />\r\n    <Compile Include=\"Emulators\\EmulationDatabaseTests.cs\" />\r\n    <Compile Include=\"Emulators\\ScannedGameTests.cs\" />\r\n    <Compile Include=\"Emulators\\EmulatorScannerTests.cs\" />\r\n    <Compile Include=\"Emulators\\ScannerTests.cs\" />\r\n    <Compile Include=\"Extensions\\BitmapExtensionsTests.cs\" />\r\n    <Compile Include=\"Extensions\\DateTimesTests.cs\" />\r\n    <Compile Include=\"Extensions\\NetExtensionsTests.cs\" />\r\n    <Compile Include=\"Extensions\\ObjectExtensionsTests.cs\" />\r\n    <Compile Include=\"ArchiveTests.cs\" />\r\n    <Compile Include=\"BackupTests.cs\" />\r\n    <Compile Include=\"Extensions\\StringExtensionsTests.cs\" />\r\n    <Compile Include=\"InstallSizeScanTests.cs\" />\r\n    <Compile Include=\"M3UTests.cs\" />\r\n    <Compile Include=\"SearchViewModelTests.cs\" />\r\n    <Compile Include=\"_TestTools\\GameDbTestWrapper.cs\" />\r\n    <Compile Include=\"GameFieldComparerTests.cs\" />\r\n    <Compile Include=\"GamesEditorTests.cs\" />\r\n    <Compile Include=\"ImageSourceManagerTests.cs\" />\r\n    <Compile Include=\"Database\\GameDatabaseFileTests.cs\" />\r\n    <Compile Include=\"Database\\GameDatabaseMigrationTests.cs\" />\r\n    <Compile Include=\"Database\\GameDatabasePlatformsTests.cs\" />\r\n    <Compile Include=\"Database\\GameDatabaseTests.cs\" />\r\n    <Compile Include=\"Database\\GameLibraryTests.cs\" />\r\n    <Compile Include=\"Database\\ItemCollectionTests.cs\" />\r\n    <Compile Include=\"Emulators\\EmulatorDefinitionTests.cs\" />\r\n    <Compile Include=\"Extensions\\EnumsTests.cs\" />\r\n    <Compile Include=\"FileSystemTests.cs\" />\r\n    <Compile Include=\"GamesStatsTests.cs\" />\r\n    <Compile Include=\"ExtensionFactoryTests.cs\" />\r\n    <Compile Include=\"DictionaryTests.cs\" />\r\n    <Compile Include=\"Models\\CopyDiffToTest.cs\" />\r\n    <Compile Include=\"CueSheetTests.cs\" />\r\n    <Compile Include=\"Models\\MetadataPropertyTests.cs\" />\r\n    <Compile Include=\"ReleaseDateTests.cs\" />\r\n    <Compile Include=\"SerializationTests.cs\" />\r\n    <Compile Include=\"IniParserTests.cs\" />\r\n    <Compile Include=\"ListExtensionsTests.cs\" />\r\n    <Compile Include=\"Manifests\\AddonManifestTests.cs\" />\r\n    <Compile Include=\"Models\\DatabaseObjectTests.cs\" />\r\n    <Compile Include=\"Models\\GameActionTests.cs\" />\r\n    <Compile Include=\"ImagesTests.cs\" />\r\n    <Compile Include=\"PlayniteUriHandlerTests.cs\" />\r\n    <Compile Include=\"Plugins\\ExtensionManifestTests.cs\" />\r\n    <Compile Include=\"ProcessStarterTests.cs\" />\r\n    <Compile Include=\"SigningToolsTests.cs\" />\r\n    <Compile Include=\"SortableNameConverterTests.cs\" />\r\n    <Compile Include=\"_TestTools\\TestAppTools.cs\" />\r\n    <Compile Include=\"_TestTools\\TestDateTimes.cs\" />\r\n    <Compile Include=\"_TestTools\\TestEmulationDatabase.cs\" />\r\n    <Compile Include=\"_TestTools\\TestPlayniteApplication.cs\" />\r\n    <Compile Include=\"XmlTests.cs\" />\r\n    <Compile Include=\"SizesTests.cs\" />\r\n    <Compile Include=\"LocalizationTests.cs\" />\r\n    <Compile Include=\"Metadata\\MetadataDownloaderDownloadTests.cs\" />\r\n    <Compile Include=\"_TestTools\\MockDialogsFactory.cs\" />\r\n    <Compile Include=\"_TestTools\\TestResourceProvider.cs\" />\r\n    <Compile Include=\"_TestTools\\MockWindowFactory.cs\" />\r\n    <Compile Include=\"Models\\GameTests.cs\" />\r\n    <Compile Include=\"PathsTests.cs\" />\r\n    <Compile Include=\"_TestTools\\PlayniteTests.cs\" />\r\n    <Compile Include=\"ProgramsTests.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"SafeFileEnumeratorTests.cs\" />\r\n    <Compile Include=\"Scripting\\PowerShell\\PowerShellTests.cs\" />\r\n    <Compile Include=\"SelectableDbItemListTests.cs\" />\r\n    <Compile Include=\"SettingsTests.cs\" />\r\n    <Compile Include=\"Settings\\FilterSettingsTests.cs\" />\r\n    <Compile Include=\"StringExtensionsTests.cs\" />\r\n    <Compile Include=\"System\\ComputerTests.cs\" />\r\n    <Compile Include=\"System\\ProcessExtensionsTests.cs\" />\r\n    <Compile Include=\"_TestTools\\TestsSetupClass.cs\" />\r\n    <Compile Include=\"TimerTests.cs\" />\r\n    <Compile Include=\"Web\\HttpDownloaderTests.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\testgamelibrary\\extension.yaml\">\r\n      <Link>Resources\\extension.yaml</Link>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"App.config\" />\r\n    <None Include=\"packages.config\" />\r\n    <None Include=\"Resources\\GOG\\library_unreleased.json\">\r\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\Serialization\\invalid.json\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\Serialization\\invalid.toml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\Serialization\\invalid.yaml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\Serialization\\valid.json\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\Serialization\\valid.toml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\Serialization\\valid.yaml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\SizeScan\\CueNonExistingFiles.cue\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\SizeScan\\CueTestFiles.cue\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\SizeScan\\Empty0KbFile.bin\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\SizeScan\\Empty1KbFile.bin\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\SizeScan\\Empty2KbFile.bin\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\Sony - PlayStation Vita.db\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\Test7zip.7z\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\TestIni.ini\">\r\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\TestUpdateManifest.json\">\r\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\..\\PlayniteSDK\\Playnite.SDK.csproj\">\r\n      <Project>{19bc9097-5705-4352-90e2-99f0c63230d0}</Project>\r\n      <Name>Playnite.SDK</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\..\\Playnite\\Playnite.csproj\">\r\n      <Project>{ad271e73-8a13-4c4e-bfdc-3076646b59e3}</Project>\r\n      <Name>Playnite</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Resource Include=\"Resources\\Images\\icon_dark.png\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Resources\\Images\\applogo.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Resources\\TestZip.zip\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\XmlTest\\Xml1.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Resources\\XmlTest\\Xml2.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Resources\\XmlTest\\Xml4.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Resources\\XmlTest\\Xml3.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\Playnite\\Localization\\LocSource.xaml\">\r\n      <Link>Localization\\LocSource.xaml</Link>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Content Include=\"Resources\\Images\\mec_icon.ico\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <Content Include=\"Resources\\Images\\gw2_icon.ico\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </Content>\r\n    <None Include=\"Resources\\test.m3u\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\Images\\NoIcon.exe\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\Images\\YesIcon.exe\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup />\r\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\r\n    <PropertyGroup>\r\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\r\n    </PropertyGroup>\r\n    <Error Condition=\"!Exists('..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props'))\" />\r\n    <Error Condition=\"!Exists('..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props'))\" />\r\n  </Target>\r\n  <PropertyGroup>\r\n    <PostBuildEvent>xcopy \"$(SolutionDir)\\Tests\\TestGameLibrary\\bin\\$(ConfigurationName)\" \"$(TargetDir)\\Extensions\\TestGameLibrary\\\" /e /y /exclude:$(SolutionDir)\\..\\build\\ExtensionsRefIgnoreList.txt\r\nxcopy \"$(SolutionDir)\\Tests\\TestPlugin\\bin\\$(ConfigurationName)\" \"$(TargetDir)\\Extensions\\Tests\\\" /e /y /exclude:$(SolutionDir)\\..\\build\\ExtensionsRefIgnoreList.txt\r\nxcopy \"$(SolutionDir)\\Tests\\TestApp\\bin\\$(ConfigurationName)\" \"$(TargetDir)\\TestApp\\\" /e /y</PostBuildEvent>\r\n  </PropertyGroup>\r\n</Project>"
  },
  {
    "path": "source/Tests/Playnite.Tests/PlayniteUriHandlerTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class PlayniteUriHandlerTests\r\n    {\r\n        [Test]\r\n        public void BasicProcessingTest()\r\n        {\r\n            var uri = @\"playnite://linkutilities/AddLink/https%3A%2F%2Fxyz.de%2Fabc/Test 33\";\r\n            var (source, arguments) = PlayniteUriHandler.ParseUri(uri);\r\n            Assert.AreEqual(\"linkutilities\", source);\r\n            Assert.AreEqual(3, arguments.Length);\r\n            Assert.AreEqual(\"AddLink\", arguments[0]);\r\n            Assert.AreEqual(\"https://xyz.de/abc\", arguments[1]);\r\n            Assert.AreEqual(\"Test 33\", arguments[2]);\r\n\r\n            uri = @\"playnite://test/arg1/arg2/arg3\";\r\n            (source, arguments) = PlayniteUriHandler.ParseUri(uri);\r\n            Assert.AreEqual(\"test\", source);\r\n            Assert.AreEqual(3, arguments.Length);\r\n            Assert.AreEqual(\"arg1\", arguments[0]);\r\n            Assert.AreEqual(\"arg2\", arguments[1]);\r\n            Assert.AreEqual(\"arg3\", arguments[2]);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Plugins/ExtensionManifestTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.API;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Plugins\r\n{\r\n    [TestFixture]\r\n    public class ExtensionManifestTests\r\n    {\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/ProcessStarterTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class ProcessStarterTests\r\n    {\r\n        [Test]\r\n        public void StartProcessWaitTest()\r\n        {\r\n            var notepad = ProcessStarter.StartProcess(\"notepad\");\r\n            Assert.AreEqual(1, Process.GetProcessesByName(\"notepad\").Count());\r\n\r\n            var ivalidRes = ProcessStarter.StartProcessWait(CmdLineTools.TaskKill, \"/f /pid 999999\", null, true);\r\n            Assert.AreEqual(128, ivalidRes);\r\n\r\n            var validRes = ProcessStarter.StartProcessWait(CmdLineTools.TaskKill, $\"/f /pid {notepad.Id}\", null, true);\r\n            Assert.AreEqual(0, validRes);\r\n            Thread.Sleep(200);\r\n            Assert.AreEqual(0, Process.GetProcessesByName(\"notepad\").Count());\r\n        }\r\n\r\n        [Test]\r\n        public void ShellExecuteTest()\r\n        {\r\n            var procid = ProcessStarter.ShellExecute(@\"notepad\");\r\n            Assert.AreNotEqual(0, procid);\r\n            Assert.AreEqual(1, Process.GetProcessesByName(\"notepad\").Count());\r\n            ProcessStarter.ShellExecute($\"{CmdLineTools.TaskKill} /f /pid {procid}\");\r\n            Thread.Sleep(200);\r\n            Assert.AreEqual(0, Process.GetProcessesByName(\"notepad\").Count());\r\n        }\r\n\r\n        [Test]\r\n        public void StartProcessWaitStdTest()\r\n        {\r\n            ProcessStarter.StartProcessWait(CmdLineTools.IPConfig, null, null, out var stdOut, out var stdErr);\r\n            StringAssert.Contains(\"Windows IP Configuration\", stdOut);\r\n            Assert.IsTrue(stdErr.IsNullOrEmpty());\r\n\r\n            ProcessStarter.StartProcessWait(CmdLineTools.TaskKill, \"/pid 999999\", null, out var stdOut2, out var stdErr2);\r\n            StringAssert.Contains(\"ERROR: The process\", stdErr2);\r\n            Assert.IsTrue(stdOut2.IsNullOrEmpty());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/ProgramsTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing NUnit.Framework;\r\nusing Playnite.Common;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class ProgramsTests\r\n    {\r\n        [Test]\r\n        public async Task GetInstalledProgramsTest()\r\n        {\r\n            var apps = await Programs.GetInstalledPrograms(CancellationToken.None);\r\n            Assert.AreNotEqual(apps.Count, 0);\r\n\r\n            var firstApp = apps.First();\r\n            Assert.IsFalse(string.IsNullOrEmpty(firstApp.Icon));\r\n            Assert.IsFalse(string.IsNullOrEmpty(firstApp.Name));\r\n            Assert.IsFalse(string.IsNullOrEmpty(firstApp.Path));\r\n        }\r\n\r\n        [Test]\r\n        public async Task GetExecutablesFromFolderTest()\r\n        {\r\n            var apps = await Programs.GetExecutablesFromFolder(@\"c:\\Program Files\\\", System.IO.SearchOption.AllDirectories, CancellationToken.None);\r\n            Assert.AreNotEqual(apps.Count, 0);\r\n\r\n            var firstApp = apps.First();\r\n            Assert.IsFalse(string.IsNullOrEmpty(firstApp.Icon));\r\n            Assert.IsFalse(string.IsNullOrEmpty(firstApp.Name));\r\n            Assert.IsFalse(string.IsNullOrEmpty(firstApp.Path));\r\n            Assert.IsFalse(string.IsNullOrEmpty(firstApp.WorkDir));\r\n        }\r\n\r\n        [Test]\r\n        public void GetUWPAppsTest()\r\n        {\r\n            var apps = Programs.GetUWPApps();\r\n            Assert.AreNotEqual(apps.Count, 0);\r\n\r\n            var firstApp = apps.First();\r\n            Assert.IsFalse(string.IsNullOrEmpty(firstApp.Icon));\r\n            Assert.IsFalse(string.IsNullOrEmpty(firstApp.Name));\r\n            Assert.IsFalse(string.IsNullOrEmpty(firstApp.Path));\r\n        }\r\n\r\n        [Test]\r\n        public void IsPathScanExcludedTest()\r\n        {\r\n            // Uninstallers\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"unins000.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"setup1.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"setup.exe\"));\r\n            Assert.IsFalse(Programs.IsFileScanExcluded(\"test.exe\"));\r\n\r\n            // Config executables and Redistributables\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"config.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"aConfigFile.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"DXSETUP.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"vc_redist.x64.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"vc_redist.x86.exe\"));\r\n\r\n            // Game engines executables\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"UnityCrashHandler32.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"UnityCrashHandler64.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"notification_helper.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"python.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"pythonw.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"zsync.exe\"));\r\n            Assert.IsTrue(Programs.IsFileScanExcluded(\"zsyncmake.exe\"));\r\n            Assert.IsFalse(Programs.IsFileScanExcluded(\"otherPythonFile.exe\"));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n[assembly: AssemblyTitle(\"Playnite.Tests\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"Playnite.Tests\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2019\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n[assembly: ComVisible(false)]\r\n\r\n[assembly: Guid(\"f15b7d48-7f9c-406a-825c-b47bb9a5bf4b\")]\r\n\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/ReleaseDateTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class ReleaseDateTests\r\n    {\r\n        [Test]\r\n        public void CompareToTest()\r\n        {\r\n            var date = new ReleaseDate(2000);\r\n            var dateMonth = new ReleaseDate(2001, 2);\r\n            var dateDay = new ReleaseDate(2002, 5, 12);\r\n            Assert.AreEqual(-1, date.CompareTo(dateMonth));\r\n            Assert.AreEqual(0, date.CompareTo(new ReleaseDate(2000)));\r\n            Assert.AreEqual(1, dateDay.CompareTo(date));\r\n        }\r\n\r\n        [Test]\r\n        public void EqualsTest()\r\n        {\r\n            var date1 = new ReleaseDate(2000, 1, 1);\r\n            var date2 = new ReleaseDate(2000, 1, 1);\r\n            var date3 = new ReleaseDate(2000, 1, 2);\r\n            Assert.AreEqual(date1, date2);\r\n            Assert.AreNotEqual(date1, date3);\r\n            Assert.IsTrue(date1 == date2);\r\n            Assert.IsTrue(date1 != date3);\r\n        }\r\n\r\n        [Test]\r\n        public void SerializationTest()\r\n        {\r\n            Assert.AreEqual(\"2001-2-3\", new ReleaseDate(2001, 2, 3).Serialize());\r\n            Assert.AreEqual(\"2001-2\", new ReleaseDate(2001, 2).Serialize());\r\n            Assert.AreEqual(\"2001\", new ReleaseDate(2001).Serialize());\r\n            Assert.AreEqual(new ReleaseDate(2001, 2, 3), ReleaseDate.Deserialize(\"2001-2-3\"));\r\n            Assert.AreEqual(new ReleaseDate(2001, 2), ReleaseDate.Deserialize(\"2001-2\"));\r\n            Assert.AreEqual(new ReleaseDate(2001), ReleaseDate.Deserialize(\"2001\"));\r\n        }\r\n\r\n        [Test]\r\n        public void JsonSerializationTest()\r\n        {\r\n            Assert.AreEqual(\r\n                Serialization.ToJson(new ReleaseDate(2001, 2, 3)),\r\n                \"{\\\"ReleaseDate\\\":\\\"2001-2-3\\\"}\");\r\n            Assert.AreEqual(\r\n                new ReleaseDate(2001, 2, 3).GetClone(),\r\n                new ReleaseDate(2001, 2, 3));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/GOG/library_unreleased.json",
    "content": "[\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 1207658695,\r\n        \"availability\": {\r\n            \"isAvailable\": true,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Beneath a Steel Sky\",\r\n        \"image\": \"\\/\\/images-1.gog.com\\/8c9562087850f4f0bc5cbb073e2207e75cb016d7b1632800db3e36c8e85d79d2\",\r\n        \"url\": \"\\/game\\/beneath_a_steel_sky\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": true,\r\n            \"Linux\": true\r\n        },\r\n        \"category\": \"Adventure\",\r\n        \"rating\": 43,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"beneath_a_steel_sky\",\r\n        \"updates\": 1,\r\n        \"isNew\": false,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"1994-04-11 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 1207658927,\r\n        \"availability\": {\r\n            \"isAvailable\": true,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Dragonsphere\",\r\n        \"image\": \"\\/\\/images-2.gog.com\\/bc3757dfa649ab55df0677a47ede21308c332beeec408709ced006b28a76566b\",\r\n        \"url\": \"\\/game\\/dragonsphere\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": true,\r\n            \"Linux\": true\r\n        },\r\n        \"category\": \"Adventure\",\r\n        \"rating\": 37,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"dragonsphere\",\r\n        \"updates\": 1,\r\n        \"isNew\": false,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"1994-01-02 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 2,\r\n        \"availability\": {\r\n            \"isAvailable\": false,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Fallout 2 Classic\",\r\n        \"image\": \"\\/\\/images-2.gog.com\\/e53d34bde0d96488b581a2e79fe3f9b25eabc9e51c990361443aa7b9c7660dd2\",\r\n        \"url\": \"\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": true,\r\n            \"Linux\": false\r\n        },\r\n        \"category\": \"Role-playing\",\r\n        \"rating\": 48,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"fallout_2_classic\",\r\n        \"updates\": 0,\r\n        \"isNew\": false,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"1998-09-30 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 1,\r\n        \"availability\": {\r\n            \"isAvailable\": false,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Fallout Classic\",\r\n        \"image\": \"\\/\\/images-1.gog.com\\/0ef80c3dc9692710809e4adaf2fcd3348f9ede1f530af6182c2972c86238e71a\",\r\n        \"url\": \"\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": true,\r\n            \"Linux\": false\r\n        },\r\n        \"category\": \"Role-playing\",\r\n        \"rating\": 48,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"fallout_classic\",\r\n        \"updates\": 0,\r\n        \"isNew\": false,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"1997-09-30 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 3,\r\n        \"availability\": {\r\n            \"isAvailable\": false,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Fallout Tactics Classic\",\r\n        \"image\": \"\\/\\/images-4.gog.com\\/4f7a5f52b7618dc9f51ac95c4106182a3321053c381e9b4015a943856edffea4\",\r\n        \"url\": \"\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": true,\r\n            \"Linux\": false\r\n        },\r\n        \"category\": \"Role-playing\",\r\n        \"rating\": 43,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"fallout_tactics_classic\",\r\n        \"updates\": 0,\r\n        \"isNew\": false,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"2001-03-15 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 1971477531,\r\n        \"availability\": {\r\n            \"isAvailable\": false,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"GWENT: The Witcher Card Game\",\r\n        \"image\": \"\\/\\/images-3.gog.com\\/002535c866db51076f9aebe7faef60619452b02cc4aca0f9e07b97ee5703f75b\",\r\n        \"url\": \"\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": false,\r\n            \"Linux\": false\r\n        },\r\n        \"category\": \"\",\r\n        \"rating\": 0,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"seawolf_new\",\r\n        \"updates\": 0,\r\n        \"isNew\": true,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"-0001-11-30 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 1207658890,\r\n        \"availability\": {\r\n            \"isAvailable\": true,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Neverwinter Nights Diamond\",\r\n        \"image\": \"\\/\\/images-3.gog.com\\/690e76916523b140d297f86906c67e2816b27005ee1b6743b53332c9583b2654\",\r\n        \"url\": \"\\/game\\/neverwinter_nights_diamond_edition\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": false,\r\n            \"Linux\": false\r\n        },\r\n        \"category\": \"Role-playing\",\r\n        \"rating\": 46,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"neverwinter_nights_diamond_edition\",\r\n        \"updates\": 0,\r\n        \"isNew\": true,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"2005-11-03 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 1207659013,\r\n        \"availability\": {\r\n            \"isAvailable\": true,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Treasure Adventure Game\",\r\n        \"image\": \"\\/\\/images-1.gog.com\\/e966b44b9f146d21bc835a2f0785693116422778e4e112020d3add98046141c9\",\r\n        \"url\": \"\\/game\\/treasure_adventure_game\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": false,\r\n            \"Linux\": false\r\n        },\r\n        \"category\": \"Adventure\",\r\n        \"rating\": 43,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"treasure_adventure_game\",\r\n        \"updates\": 0,\r\n        \"isNew\": false,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"2011-11-26 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 1207658901,\r\n        \"availability\": {\r\n            \"isAvailable\": true,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Tyrian 2000\",\r\n        \"image\": \"\\/\\/images-4.gog.com\\/346da67f4079d2d4e64ab0e7c310ee81218734d4bde4d74d3a3f074510cf6fa5\",\r\n        \"url\": \"\\/game\\/tyrian_2000\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": true,\r\n            \"Linux\": false\r\n        },\r\n        \"category\": \"Shooter\",\r\n        \"rating\": 43,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"tyrian_2000\",\r\n        \"updates\": 0,\r\n        \"isNew\": false,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"1999-11-30 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 1207658962,\r\n        \"availability\": {\r\n            \"isAvailable\": true,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Ultima\\u2122 4: Quest of the Avatar\",\r\n        \"image\": \"\\/\\/images-2.gog.com\\/cb10216b4721fc46db91a79af4bee55dc90123c13ebcc11a50980d384ca1a4a1\",\r\n        \"url\": \"\\/game\\/ultima_4\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": true,\r\n            \"Linux\": false\r\n        },\r\n        \"category\": \"Role-playing\",\r\n        \"rating\": 43,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"ultima_4\",\r\n        \"updates\": 0,\r\n        \"isNew\": false,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"1985-09-16 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 1207659121,\r\n        \"availability\": {\r\n            \"isAvailable\": true,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Warsow\",\r\n        \"image\": \"\\/\\/images-1.gog.com\\/541398e891bdb948292a8e04d08b6e29af03a30b255acd02a574c3e2256b261e\",\r\n        \"url\": \"\\/game\\/warsow\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": true,\r\n            \"Linux\": true\r\n        },\r\n        \"category\": \"Shooter\",\r\n        \"rating\": 38,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"warsow\",\r\n        \"updates\": 1,\r\n        \"isNew\": false,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"2012-10-08 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 1207658924,\r\n        \"availability\": {\r\n            \"isAvailable\": true,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Witcher: Enhanced Edition, The \",\r\n        \"image\": \"\\/\\/images-1.gog.com\\/37d4a208d1f5bb0e163da540ac894ba46a7d566ede31aaaefc74bbcd46ebd190\",\r\n        \"url\": \"\\/game\\/the_witcher\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": true,\r\n            \"Linux\": false\r\n        },\r\n        \"category\": \"Role-playing\",\r\n        \"rating\": 47,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"the_witcher\",\r\n        \"updates\": 0,\r\n        \"isNew\": true,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"2007-10-26 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    },\r\n    {\r\n        \"isGalaxyCompatible\": true,\r\n        \"tags\": [],\r\n        \"id\": 1207659061,\r\n        \"availability\": {\r\n            \"isAvailable\": true,\r\n            \"isAvailableInAccount\": true\r\n        },\r\n        \"title\": \"Worlds of Ultima\\u2122 : The Savage Empire\",\r\n        \"image\": \"\\/\\/images-4.gog.com\\/07c86c0a10902cd350ff5476ed7f27f5290246016bd1a3ab3d52cda5759663ce\",\r\n        \"url\": \"\\/game\\/worlds_of_ultima_the_savage_empire\",\r\n        \"worksOn\": {\r\n            \"Windows\": true,\r\n            \"Mac\": true,\r\n            \"Linux\": false\r\n        },\r\n        \"category\": \"Role-playing\",\r\n        \"rating\": 41,\r\n        \"isComingSoon\": false,\r\n        \"isMovie\": false,\r\n        \"isGame\": true,\r\n        \"slug\": \"worlds_of_ultima_the_savage_empire\",\r\n        \"updates\": 0,\r\n        \"isNew\": false,\r\n        \"dlcCount\": 0,\r\n        \"releaseDate\": {\r\n            \"date\": \"1990-12-30 00:00:00.000000\",\r\n            \"timezone_type\": 3,\r\n            \"timezone\": \"Europe\\/Nicosia\"\r\n        },\r\n        \"isBaseProductMissing\": false,\r\n        \"isHidingDisabled\": false,\r\n        \"isInDevelopment\": false,\r\n        \"isHidden\": false\r\n    }\r\n]"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/Serialization/invalid.json",
    "content": "{\r\n    \"prop1\" : 666\r\n    \"prop2\" : \"test\"\r\n}"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/Serialization/invalid.toml",
    "content": ""
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/Serialization/invalid.yaml",
    "content": ""
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/Serialization/valid.json",
    "content": "{\r\n    \"prop1\" : 666,\r\n    \"prop2\" : \"test\"\r\n}"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/Serialization/valid.toml",
    "content": ""
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/Serialization/valid.yaml",
    "content": ""
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/SizeScan/CueNonExistingFiles.cue",
    "content": "FILE \"FileThatDoesNotExists1.bin\" BINARY\n  TRACK 01 MODE2/2352\n    INDEX 01 00:00:00\nFILE \"FileThatDoesNotExists2.bin\" BINARY\n  TRACK 01 MODE2/2352\n    INDEX 01 00:00:00"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/SizeScan/CueTestFiles.cue",
    "content": "FILE \"Empty0KbFile.bin\" BINARY\n  TRACK 01 MODE2/2352\n    INDEX 01 00:00:00\nFILE \"Empty1KbFile.bin\" BINARY\n  TRACK 01 MODE2/2352\n    INDEX 01 00:00:00"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/TestIni.ini",
    "content": "﻿[RegionDoesRequirePermission]\nGameDev=true\nCI=true\nStage=true\nLocalHost=true\n\n;========== XMPP - MCP SETTINGS ==========\n[OnlineSubsystemMcp.XMPP]\nbUseSSL=true\nServerPort=5222\n\n;========== XMPP - REGION MCP SETTINGS ==========\n[OnlineSubsystemMcp.XMPP Prod]\nServerAddr=xmpp-service-prod.ol.epicgames.com\nDomain=prod.ol.epicgames.com\n\n[OnlineSubsystemMcp.XMPP Stage]\nServerAddr=xmpp-service-stage.ol.epicgames.com\nDomain=stage.ol.epicgames.com\n\n[OnlineSubsystemMcp.XMPP GameDev]\nServerAddr=xmpp-service-gamedev.ol.epicgames.net\nDomain=gamedev.ol.epicgames.net\n\n[OnlineSubsystemMcp.XMPP CI]\nServerAddr=xmpp-service-ci.ol.epicgames.net\nDomain=ci.ol.epicgames.net"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/TestIni.md5",
    "content": "46fcb37aa8e69b4ead0d702fd459299d *TestIni.ini\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/TestIni.sfv",
    "content": "; Generated by WIN-SFV32 v1.0\r\n; (Compatible: Total Commander 9.51)\r\nTestIni.ini D8B22F5D\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/TestUpdateManifest.json",
    "content": "﻿{\r\n    \"latestVersion\":  \"4.21\",\r\n    \"downloadServers\": [\r\n        \"http://localhost/build/\",\r\n        \"http://localhost/mirror/\"\r\n    ],\r\n    \"releaseNotesUrlRoots\" : [ \r\n        \"http://localhost/update/\"\r\n    ],\r\n    \"packages\": [\r\n        {\r\n            \"baseVersion\" : \"4.21\",\r\n            \"fileName\": \"421.exe\",\r\n            \"checksum\": \"C4CEEA6981242B9087FF9065CE8E5AFD\"\r\n        },\r\n        {\r\n            \"baseVersion\" : \"4.2\",\r\n            \"fileName\": \"42to421.exe\",\r\n            \"checksum\": \"EECEEA6981242B9087FF9065CE8E5AFD\"\r\n        },\r\n        {\r\n            \"baseVersion\" : \"4.1\",\r\n            \"fileName\": \"41to421.exe\",\r\n            \"checksum\": \"BBBEEA6981242B9087FF9065CE8E5AFD\"\r\n        }\r\n    ],\r\n    \"releaseNotes\" : [\r\n        {\r\n            \"version\" : \"4.21\",\r\n            \"fileName\" : \"4.21.html\"\r\n        },\r\n        {\r\n            \"version\" : \"4.2\",\r\n            \"fileName\" : \"4.2.html\"\r\n        },\r\n        {\r\n            \"version\" : \"4.1\",\r\n            \"fileName\" : \"4.1.html\"\r\n        }\r\n    ]\r\n}"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/XmlTest/Xml1.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type CheckBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type CheckBox}\">\r\n                    <Border Background=\"{TemplateBinding Background}\"\r\n                            Padding=\"{TemplateBinding Padding}\">\r\n                        <StackPanel Orientation=\"Horizontal\">\r\n                            <Border x:Name=\"BulletBorder\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                                    BorderThickness=\"{TemplateBinding BorderThickness}\" Background=\"{TemplateBinding Background}\"\r\n                                    Style=\"{DynamicResource HighlightBorder}\" >\r\n                                <Grid Width=\"18\" Height=\"18\" Background=\"{DynamicResource NormalBrushDark}\">\r\n                                    <Viewbox x:Name=\"CheckIcon\" Visibility=\"Collapsed\">\r\n                                        <TextBlock Text=\"b\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                    <Viewbox x:Name=\"IndeterminateIcon\" Visibility=\"Collapsed\" Margin=\"2\">\r\n                                        <TextBlock Text=\"g\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                </Grid>\r\n                            </Border>                            \r\n                            <ContentPresenter RecognizesAccessKey=\"True\" Margin=\"5,0,0,0\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\" />\r\n                        </StackPanel>\r\n                    </Border>                    \r\n                    <ControlTemplate.Triggers>\r\n                        <MultiTrigger>\r\n                            <MultiTrigger.Conditions>\r\n                                <Condition Property=\"IsChecked\" Value=\"{x:Null}\" />\r\n                                <Condition Property=\"IsThreeState\" Value=\"True\" />\r\n                            </MultiTrigger.Conditions>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"IndeterminateIcon\"/>\r\n                        </MultiTrigger>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"CheckIcon\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>                  \r\n</ResourceDictionary>"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/XmlTest/Xml2.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    mc:Ignorable=\"d\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n\r\n    <Style TargetType=\"{x:Type CheckBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type CheckBox}\">\r\n                    <Border Background=\"{TemplateBinding Background}\"\r\n                            Padding=\"{TemplateBinding Padding}\">\r\n                        <StackPanel Orientation=\"Horizontal\">\r\n                            <Border x:Name=\"BulletBorder\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                                    Style=\"{DynamicResource HighlightBorder}\"\r\n                                    BorderThickness=\"{TemplateBinding BorderThickness}\" Background=\"{TemplateBinding Background}\" >\r\n                                <Grid Width=\"18\" Height=\"18\" Background=\"{DynamicResource NormalBrushDark}\">\r\n                                    <Viewbox x:Name=\"CheckIcon\" Visibility=\"Collapsed\">\r\n                                        <TextBlock Text=\"b\" FontFamily=\"Marlett\"\r\n                                                   Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                   HorizontalAlignment=\"Center\"\r\n                                                   VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                    <Viewbox x:Name=\"IndeterminateIcon\" Visibility=\"Collapsed\" Margin=\"2\">\r\n                                        <TextBlock Text=\"g\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                </Grid>\r\n                            </Border>                            \r\n                            <ContentPresenter VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\r\n                                              RecognizesAccessKey=\"True\" Margin=\"5,0,0,0\" />\r\n                        </StackPanel>\r\n                    </Border>                    \r\n                    <ControlTemplate.Triggers>\r\n                        <MultiTrigger>\r\n                            <MultiTrigger.Conditions>\r\n                                <Condition Property=\"IsChecked\" Value=\"{x:Null}\" />\r\n                                <Condition Property=\"IsThreeState\" Value=\"True\" />\r\n                            </MultiTrigger.Conditions>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"IndeterminateIcon\"/>\r\n                        </MultiTrigger>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"CheckIcon\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>                  \r\n</ResourceDictionary>"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/XmlTest/Xml3.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type CheckBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type CheckBox}\">\r\n                    <Border Background=\"{TemplateBinding Background}\"\r\n                            Padding=\"{TemplateBinding Padding}\">\r\n                        <StackPanel Orientation=\"Horizontal\">\r\n                            <Border x:Name=\"BulletBorder\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                                    BorderThickness=\"{TemplateBinding BorderThickness}\" Background=\"{TemplateBinding Background}\"\r\n                                    Style=\"{DynamicResource HighlightBorder}\" >\r\n                                <Grid Width=\"18\" Height=\"18\" Background=\"{DynamicResource NormalBrushDark}\">\r\n                                    <Viewbox x:Name=\"CheckIcon\" Visibility=\"Collapsed\">\r\n                                        <TextBlock Text=\"b\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                    <Viewbox x:Name=\"IndeterminateIcon\" Visibility=\"Collapsed\" Margin=\"2\">\r\n                                        <TextBlock Text=\"g\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                </Grid>\r\n                            </Border>                            \r\n                            <ContentPresenter RecognizesAccessKey=\"True\" Margin=\"5,0,0,0\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\" />\r\n                        </StackPanel>\r\n                    </Border>                    \r\n                    <ControlTemplate.Triggers>\r\n                        <MultiTrigger>\r\n                            <MultiTrigger.Conditions>\r\n                                <Condition Property=\"IsChecked\" Value=\"{x:Null}\" />\r\n                                <Condition Property=\"IsThreeState\" Value=\"True\" />\r\n                            </MultiTrigger.Conditions>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"IndeterminateIcon\"/>\r\n                        </MultiTrigger>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"CheckIcon\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>                  \r\n</ResourceDictionary>"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/XmlTest/Xml4.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:i=\"clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\">\r\n\r\n    <Style TargetType=\"{x:Type CheckBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type CheckBox}\">\r\n                    <Border Background=\"{TemplateBinding Background}\"\r\n                            Padding=\"{TemplateBinding Padding}\">\r\n                        <StackPanel Orientation=\"Horizontal\">\r\n                            <Border x:Name=\"BulletBorder\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                                    BorderThickness=\"{TemplateBinding BorderThickness}\" Background=\"{TemplateBinding Background}\"\r\n                                    Style=\"{DynamicResource HighlightBorder}\" >\r\n                                <Grid Width=\"18\" Height=\"18\" Background=\"{DynamicResource NormalBrushDark}\">\r\n                                    <Viewbox x:Name=\"CheckIcon\" Visibility=\"Collapsed\">\r\n                                        <TextBlock Text=\"b\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                    <Viewbox x:Name=\"IndeterminateIcon\" Visibility=\"Collapsed\" Margin=\"2\">\r\n                                        <TextBlock Text=\"g\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                    HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                </Grid>\r\n                            </Border>                            \r\n                            <ContentPresenter RecognizesAccessKey=\"True\" Margin=\"6,0,0,0\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\" />\r\n                        </StackPanel>\r\n                    </Border>                    \r\n                    <ControlTemplate.Triggers>\r\n                        <MultiTrigger>\r\n                            <MultiTrigger.Conditions>\r\n                                <Condition Property=\"IsChecked\" Value=\"{x:Null}\" />\r\n                                <Condition Property=\"IsThreeState\" Value=\"True\" />\r\n                            </MultiTrigger.Conditions>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"IndeterminateIcon\"/>\r\n                        </MultiTrigger>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"CheckIcon\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>                  \r\n</ResourceDictionary>"
  },
  {
    "path": "source/Tests/Playnite.Tests/Resources/test.m3u",
    "content": "#EXTM3U\r\n#EXTINF:111,The Orichalcon - \"megAsfear (Title)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n#EXTBYT:1234\r\n01 The Orichalcon - megAsfear (Title).mp3\r\n#EXTINF:258,Evil Horde - \"Running from Evil Horde (MAP01 - Running from Evil)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n#EXTBYT:4321\r\n02 Evil Horde - Running from Evil Horde (MAP01 - Running from Evil).mp3\r\n03 analoq - Adrian's Sleep (MAP25 - Adrian's Asleep).mp3\r\n#EXTINF:347,Mazedude - \"Westside Archvile (MAP20 - Message for the Archvile)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n04 Mazedude - Westside Archvile (MAP20 - Message for the Archvile).mp3\r\n#EXTINF:294,Jovette Rivera - \"The Countdown (MAP03 - Countdown to Death)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n05 Jovette Rivera - The Countdown (MAP03 - Countdown to Death).mp3\r\n#EXTINF:232,The Orichalcon - \"Crushing Headache (MAP06 - In the Dark)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n06 The Orichalcon - Crushing Headache (MAP06 - In the Dark).mp3\r\n#EXTINF:273,Mazedude - \"Silent Healer (MAP02 - The Healer Stalks)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n07 Mazedude - Silent Healer (MAP02 - The Healer Stalks).mp3\r\n#EXTINF:367,Big Giant Circles, Flik - \"Icon of Sinwave (MAP30 - Opening to Hell)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n08 Big Giant Circles, Flik - Icon of Sinwave (MAP30 - Opening to Hell).mp3\r\n#EXTINF:179,John Revoredo - \"31 Seconds (MAP09 - Into Sandy's City)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n09 John Revoredo - 31 Seconds (MAP09 - Into Sandy's City).mp3\r\n#EXTINF:236,Mazedude, Ailsean - \"The End of Hell (Endgame)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n10 Mazedude, Ailsean - The End of Hell (Endgame).mp3\r\n#EXTINF:221,phoenixdk - \"No Smoking Area (MAP23 - Bye Bye American Pie)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n11 phoenixdk - No Smoking Area (MAP23 - Bye Bye American Pie).mp3\r\n#EXTINF:210,Evil Horde - \"The Duel (MAP08 - The Dave D. Taylor Blues)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n12 Evil Horde - The Duel (MAP08 - The Dave D. Taylor Blues).mp3\r\n#EXTINF:217,djpretzel - \"Red Waltz (Intermission)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\n13 djpretzel - Red Waltz (Intermission).mp3\r\n#EXTINF:349,phoenixdk - \"Ablaze (MAP10 - The Demon's Dead)\" [http://doom2.ocremix.org - Delta-Q-Delta]\r\nBonus phoenixdk - Ablaze (MAP10 - The Demon's Dead).mp3\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/SafeFileEnumeratorTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class SafeFileEnumeratorTests\r\n    {\r\n        [Test]\r\n        public void OverUnsafeWorksTest()\r\n        {\r\n            var path = @\"c:\\Windows\\appcompat\\\";\r\n\r\n            var dirInfo = new System.IO.DirectoryInfo(path);\r\n            Assert.Throws<UnauthorizedAccessException>(() => dirInfo.GetFiles(\"*.*\", SearchOption.AllDirectories));\r\n\r\n            var enumerator = new SafeFileEnumerator(path, \"*.*\", SearchOption.AllDirectories);\r\n            Assert.DoesNotThrow(() => enumerator.ToList());\r\n        }\r\n\r\n        [Test]\r\n        public void StandardEnumTest()\r\n        {\r\n            var path = @\"c:\\Windows\\appcompat\\\";\r\n            var enumerator = new SafeFileEnumerator(path, \"*.*\", SearchOption.AllDirectories);\r\n            var files = enumerator.ToList();\r\n            CollectionAssert.IsNotEmpty(files);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Scripting/PowerShell/PowerShellTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing Playnite.Scripting.PowerShell;\r\nusing Playnite.SDK.Exceptions;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Management.Automation;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests.Scripting.PowerShell\r\n{\r\n    [TestFixture]\r\n    public class PowerShellTests\r\n    {\r\n        [Test]\r\n        public void ExecuteTest()\r\n        {\r\n            using (var ps = new PowerShellRuntime(\"ExecuteTest\"))\r\n            {\r\n                var res = ps.Execute(\"return 2 + 2\");\r\n                Assert.AreEqual(4, res);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void ExecuteArgumentsTest()\r\n        {\r\n            using (var ps = new PowerShellRuntime(\"ExecuteArgumentsTest\"))\r\n            {\r\n                var res = ps.Execute(\"return $param1 + $param2\",\r\n                    variables: new Dictionary<string, object>()\r\n                    {\r\n                        { \"param1\", 1 },\r\n                        { \"param2\", 2 }\r\n                    });\r\n\r\n                Assert.AreEqual(3, res);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void FunctionExecuteTest()\r\n        {\r\n            using (var ps = new PowerShellRuntime(\"FunctionExecuteTest\"))\r\n            {\r\n                ps.Execute(@\"\r\nfunction TestFunc()\r\n{\r\n    return 4 + 4\r\n}\r\n\");\r\n                var res = ps.Execute(\"TestFunc\");\r\n                Assert.AreEqual(8, res);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void ErrorHandlingTest()\r\n        {\r\n            using (var ps = new PowerShellRuntime(\"ErrorHandlingTest\"))\r\n            {\r\n                Assert.Throws<ScriptRuntimeException>(() => ps.Execute(\"throw \\\"Testing Exception\\\"\"));\r\n                Assert.Throws<ScriptRuntimeException>(() => ps.Execute(\"1 / 0\"));\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void GetFunctionTest()\r\n        {\r\n            using (var tempDir = TempDirectory.Create())\r\n            {\r\n                using (var ps = new PowerShellRuntime(\"GetFunctionTest\"))\r\n                {\r\n                    Assert.IsTrue(ps.GetFunction(\"TestFunc\") == null);\r\n                    var path = Path.Combine(tempDir.TempPath, \"GetFunctionTest.psm1\");\r\n                    File.WriteAllText(path, @\"\r\nfunction TestFunc()\r\n{\r\n    return 4 + 4\r\n}\r\n\");\r\n                    ps.ImportModule(path);\r\n                    Assert.IsTrue(ps.GetFunction(\"TestFunc\") != null);\r\n                }\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void ExecuteWorkDirTest()\r\n        {\r\n            using (var tempDir = TempDirectory.Create())\r\n            {\r\n                Directory.SetCurrentDirectory(tempDir.TempPath);\r\n                using (var runtime = new PowerShellRuntime(\"ExecuteWorkDirTest\"))\r\n                {\r\n                    var outPath = \"workDirTest.txt\";\r\n                    FileSystem.DeleteFile(outPath);\r\n                    FileAssert.DoesNotExist(outPath);\r\n                    runtime.Execute($\"'test' | Out-File workDirTest.txt\");\r\n                    FileAssert.Exists(outPath);\r\n\r\n                    FileSystem.CreateDirectory(\"subdirectory\");\r\n                    var tempDir2 = Path.Combine(tempDir.TempPath, \"subdirectory\");\r\n                    outPath = Path.Combine(tempDir2, outPath);\r\n                    FileSystem.DeleteFile(outPath);\r\n                    FileAssert.DoesNotExist(outPath);\r\n                    runtime.Execute($\"'test' | Out-File workDirTest.txt\", tempDir2);\r\n                    FileAssert.Exists(outPath);\r\n                }\r\n                Directory.SetCurrentDirectory(\"\\\\\");\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void ExecuteFileTest()\r\n        {\r\n            using (var tempDir = TempDirectory.Create())\r\n            using (var runtime = new PowerShellRuntime(\"ExecuteFileTest\"))\r\n            {\r\n                var filePath = Path.Combine(tempDir.TempPath, \"ExecuteFileTest.ps1\");\r\n                File.WriteAllText(filePath, @\"\r\nparam($FileArgs)\r\nreturn $FileArgs.Arg1 + $FileArgs.Arg2\r\n\");\r\n                var res = runtime.ExecuteFile(filePath, null, new Dictionary<string, object>\r\n                {\r\n                    { \"Arg1\", 2 },\r\n                    { \"Arg2\", 3 }\r\n                });\r\n                Assert.AreEqual(5, res);\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/SearchViewModelTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.ViewModels;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class SearchViewModelTests\r\n    {\r\n        [Test]\r\n        [SetCulture(\"en-US\")]\r\n        public void MatchTextFilterTest()\r\n        {\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"c\", \"has chalupa\", false));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"op stea\", \"open steam settings\", false));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"op STea\", \"open settings steam\", false));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"open steam\", \"open steam settings\", false));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"\", \"open steam settings\", false));\r\n\r\n            Assert.IsFalse(SearchViewModel.MatchTextFilter(\"opass stea\", \"open steam settings\", false));\r\n            Assert.IsFalse(SearchViewModel.MatchTextFilter(\"test\", \"\", false));\r\n\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"\", \"\", false));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(null, null, false));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"\", null, false));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(null, \"\", false));\r\n\r\n            // Acronym tests\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"gow\", \"Gears of War\", true));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"goW\", \" Gears of War\", true));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"GOW\", \"god of war 3\", true));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"GOW\", \"god   of war   3\", true));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"gOw3\", \"god of war 3\", true));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"COD\", \"Call of Duty®: Modern Warfare® II\", true));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"CODMW\", \"Call of Duty®: Modern Warfare® II\", true));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"cod\", \"Call of Duty ®\", true));\r\n\r\n            Assert.IsFalse(SearchViewModel.MatchTextFilter(\"goW\", \" Gears of War\", false));\r\n            Assert.IsFalse(SearchViewModel.MatchTextFilter(\"GOW\", \"god of war 3\", false));\r\n            Assert.IsFalse(SearchViewModel.MatchTextFilter(\"GOW3\", \"god of war 3\", false));\r\n            Assert.IsFalse(SearchViewModel.MatchTextFilter(\"CODMW\", \"Call of Duty®: Modern Warfare® II\", false));\r\n            Assert.IsFalse(SearchViewModel.MatchTextFilter(\" GOW\", \"god of war 3\", true));\r\n            Assert.IsFalse(SearchViewModel.MatchTextFilter(\"GOW \", \"god of war 3\", true));\r\n            Assert.IsFalse(SearchViewModel.MatchTextFilter(\"gOw3\", \"god of war 2\", true));\r\n            Assert.IsFalse(SearchViewModel.MatchTextFilter(\"g OW\", \"god of war 3\", true));\r\n\r\n            // JaroWinklerSimilarity tests\r\n            var filter = \"mario pary\";\r\n            var minimumSimilarity = 0.90;\r\n            var gameNames = new List<string> { \"Mario Party\", \"Mario Party 1\", \"Mario Party 2\", \"Mario Party Advance\", \"Mario Tennis\", \"Super Mario 64\" };\r\n            foreach (var gameName in gameNames)\r\n            {\r\n                Assert.AreEqual(filter.GetJaroWinklerSimilarityIgnoreCase(gameName) >= minimumSimilarity, SearchViewModel.MatchTextFilter(filter, gameName, false, minimumSimilarity));\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        [SetCulture(\"cs-CZ\")]\r\n        public void CzechCultureMatchTextFilterTest()\r\n        {\r\n            // ch is a separate character in Czech so this would fail with wrong culture settings in string comparison\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"c\", \"has chalupa\", false));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"cupa\", \"has chalčupa\", false));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"čupa\", \"has chalčupa\", false));\r\n            Assert.IsTrue(SearchViewModel.MatchTextFilter(\"cupa\", \"has chalČupa\", false));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/SelectableDbItemListTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class SelectableDbItemListTests\r\n    {\r\n        [Test]\r\n        public void PropertiesTest()\r\n        {\r\n            var items = new List<DatabaseObject>()\r\n            {\r\n                new DatabaseObject() { Name = \"Test1\" },\r\n                new DatabaseObject() { Name = \"Test2\" }\r\n            };\r\n\r\n            List<Guid> refIds = null;\r\n            var dbList = new SelectableDbItemList(items);\r\n            dbList.SelectionChanged += (s, e) =>\r\n            {\r\n                refIds = dbList.GetSelectedIds().ToList();\r\n            };\r\n\r\n            var selectionItems = dbList.ToList();\r\n            selectionItems[0].Selected = true;\r\n            selectionItems[1].Selected = true;\r\n            CollectionAssert.IsNotEmpty(refIds);\r\n            Assert.AreEqual(\"Test1, Test2\", dbList.AsString);\r\n            \r\n            selectionItems[1].Selected = false;\r\n            Assert.AreEqual(\"Test1\", dbList.AsString);\r\n            Assert.AreEqual(1, refIds.Count);\r\n\r\n            selectionItems[0].Selected = false;\r\n            CollectionAssert.IsEmpty(refIds);\r\n            Assert.IsEmpty(dbList.AsString);\r\n        }\r\n\r\n        [Test]\r\n        public void EventsTest()\r\n        {\r\n            var items = new List<DatabaseObject>()\r\n            {\r\n                new DatabaseObject() { Name = \"Test1\" },\r\n                new DatabaseObject() { Name = \"Test2\" },\r\n                new DatabaseObject() { Name = \"Test3\" }\r\n            };\r\n\r\n            var properies = 0;\r\n            var selections = 0;\r\n            var dbList = new SelectableDbItemList(items);\r\n            dbList.SelectionChanged += (s, e) =>\r\n            {\r\n                properies++;\r\n            };\r\n\r\n            dbList.PropertyChanged += (s, e) =>\r\n            {\r\n                selections++;\r\n            };\r\n\r\n            dbList.SetSelection(new List<Guid> { items[0].Id, items[1].Id });\r\n            Assert.AreEqual(1, properies);\r\n            Assert.AreEqual(1, selections);\r\n\r\n            dbList.First().Selected = false;\r\n            Assert.AreEqual(2, properies);\r\n            Assert.AreEqual(2, selections);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/SerializationTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing SdkSerialization = Playnite.SDK.Data.Serialization;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class SerializationTests\r\n    {\r\n        public class JsonIgnoreTestClass\r\n        {\r\n            [Newtonsoft.Json.JsonIgnore]\r\n            public int Test1 { get; set;}\r\n\r\n            [Playnite.SDK.Data.DontSerialize]\r\n            public int Test2 { get; set; }\r\n\r\n            public int Test3 { get; set; }\r\n\r\n            public int Test4;\r\n\r\n            public int Test5 { get; set; }\r\n\r\n            public int Test6 { get; set; }\r\n\r\n            [Newtonsoft.Json.JsonIgnore]\r\n            public int Test7;\r\n\r\n            public bool ShouldSerializeTest5()\r\n            {\r\n                return true;\r\n            }\r\n\r\n            public bool ShouldSerializeTest6()\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        public class PropertyNameTestClass\r\n        {\r\n            [Newtonsoft.Json.JsonProperty(\"test-1\")]\r\n            public int Test1 { get; set; }\r\n\r\n            [Playnite.SDK.Data.SerializationPropertyName(\"test-2\")]\r\n            public int Test2 { get; set; }\r\n\r\n            public int Test3 { get; set; }\r\n        }\r\n\r\n        [Test]\r\n        public void JsonDontSerializeAttributeTest()\r\n        {\r\n            var obj = new JsonIgnoreTestClass\r\n            {\r\n                Test1 = 1,\r\n                Test2 = 2,\r\n                Test3 = 3,\r\n                Test4 = 4,\r\n                Test5 = 5,\r\n                Test6 = 6,\r\n                Test7 = 7\r\n            };\r\n\r\n            var str = Serialization.ToJson(obj);\r\n            Assert.IsFalse(str.Contains(\"Test1\"));\r\n            Assert.IsFalse(str.Contains(\"Test2\"));\r\n            Assert.IsTrue(str.Contains(\"Test3\"));\r\n            Assert.IsTrue(str.Contains(\"Test4\"));\r\n            Assert.IsTrue(str.Contains(\"Test5\"));\r\n            Assert.IsFalse(str.Contains(\"Test6\"));\r\n            Assert.IsFalse(str.Contains(\"Test7\"));\r\n\r\n            var str2 = @\"{\"\"Test1\"\":1,\"\"Test2\"\":2,\"\"Test3\"\":3,\"\"Test4\"\":4,\"\"Test5\"\":5}\";\r\n            var obj2 = Serialization.FromJson<JsonIgnoreTestClass>(str2);\r\n            Assert.AreEqual(0, obj2.Test1);\r\n            Assert.AreEqual(0, obj2.Test2);\r\n            Assert.AreEqual(3, obj2.Test3);\r\n            Assert.AreEqual(4, obj2.Test4);\r\n            Assert.AreEqual(5, obj2.Test5);\r\n        }\r\n\r\n        [Test]\r\n        public void JsonPropertyNameTest()\r\n        {\r\n            var obj = new PropertyNameTestClass\r\n            {\r\n                Test1 = 1,\r\n                Test2 = 2,\r\n                Test3 = 3\r\n            };\r\n\r\n            var str = Serialization.ToJson(obj);\r\n            Assert.IsTrue(str.Contains(\"test-1\"));\r\n            Assert.IsTrue(str.Contains(\"test-2\"));\r\n            Assert.IsTrue(str.Contains(\"Test3\"));\r\n\r\n            var str2 = @\"{\"\"test-1\"\":1,\"\"test-2\"\":2,\"\"Test3\"\":3}\";\r\n            var obj2 = Serialization.FromJson<PropertyNameTestClass>(str2);\r\n            Assert.AreEqual(1, obj2.Test1);\r\n            Assert.AreEqual(2, obj2.Test2);\r\n            Assert.AreEqual(3, obj2.Test3);\r\n        }\r\n\r\n        public class SerializationTestObject\r\n        {\r\n            public int prop1 { get; set; }\r\n            public string prop2 { get; set; }\r\n        }\r\n\r\n        [Test]\r\n        public void JsonDerializationTests()\r\n        {\r\n            var validFile = Path.Combine(PlayniteTests.ResourcesPath, \"Serialization\", \"valid.json\");\r\n            var invalidFile = Path.Combine(PlayniteTests.ResourcesPath, \"Serialization\", \"invalid.json\");\r\n            Exception serError = null;\r\n            var validJson = File.ReadAllText(validFile);\r\n            var invalidJson = File.ReadAllText(invalidFile);\r\n\r\n            // Raw content test\r\n            var validObj = SdkSerialization.FromJson<SerializationTestObject>(validJson);\r\n            Assert.AreEqual(666, validObj.prop1);\r\n            Assert.AreEqual(\"test\", validObj.prop2);\r\n\r\n            var success = SdkSerialization.TryFromJson<SerializationTestObject>(validJson, out validObj);\r\n            Assert.IsTrue(success);\r\n            Assert.AreEqual(666, validObj.prop1);\r\n            Assert.AreEqual(\"test\", validObj.prop2);\r\n\r\n            success = SdkSerialization.TryFromJson<SerializationTestObject>(validJson, out validObj, out serError);\r\n            Assert.IsTrue(success);\r\n            Assert.AreEqual(666, validObj.prop1);\r\n            Assert.AreEqual(\"test\", validObj.prop2);\r\n            Assert.IsNull(serError);\r\n\r\n            success = SdkSerialization.TryFromJson<SerializationTestObject>(invalidJson, out validObj);\r\n            Assert.IsFalse(success);\r\n            Assert.IsNull(validObj);\r\n\r\n            success = SdkSerialization.TryFromJson<SerializationTestObject>(invalidJson, out validObj, out serError);\r\n            Assert.IsFalse(success);\r\n            Assert.IsNull(validObj);\r\n            Assert.IsNotNull(serError);\r\n\r\n            // File tests\r\n            validObj = SdkSerialization.FromJsonFile<SerializationTestObject>(validFile);\r\n            Assert.AreEqual(666, validObj.prop1);\r\n            Assert.AreEqual(\"test\", validObj.prop2);\r\n\r\n            success = SdkSerialization.TryFromJsonFile<SerializationTestObject>(validFile, out validObj);\r\n            Assert.IsTrue(success);\r\n            Assert.AreEqual(666, validObj.prop1);\r\n            Assert.AreEqual(\"test\", validObj.prop2);\r\n\r\n            success = SdkSerialization.TryFromJsonFile<SerializationTestObject>(validFile, out validObj, out serError);\r\n            Assert.IsTrue(success);\r\n            Assert.AreEqual(666, validObj.prop1);\r\n            Assert.AreEqual(\"test\", validObj.prop2);\r\n            Assert.IsNull(serError);\r\n\r\n            success = SdkSerialization.TryFromJsonFile<SerializationTestObject>(invalidFile, out validObj);\r\n            Assert.IsFalse(success);\r\n            Assert.IsNull(validObj);\r\n\r\n            success = SdkSerialization.TryFromJsonFile<SerializationTestObject>(invalidFile, out validObj, out serError);\r\n            Assert.IsFalse(success);\r\n            Assert.IsNull(validObj);\r\n            Assert.IsNotNull(serError);\r\n\r\n            // Steam test\r\n            using (var fs = new FileStream(validFile, FileMode.Open, FileAccess.Read))\r\n            {\r\n                validObj = SdkSerialization.FromJsonStream<SerializationTestObject>(fs);\r\n                Assert.AreEqual(666, validObj.prop1);\r\n                Assert.AreEqual(\"test\", validObj.prop2);\r\n            }\r\n\r\n            using (var fs = new FileStream(validFile, FileMode.Open, FileAccess.Read))\r\n            {\r\n                success = SdkSerialization.TryFromJsonStream<SerializationTestObject>(fs, out validObj);\r\n                Assert.IsTrue(success);\r\n                Assert.AreEqual(666, validObj.prop1);\r\n                Assert.AreEqual(\"test\", validObj.prop2);\r\n            }\r\n\r\n            using (var fs = new FileStream(validFile, FileMode.Open, FileAccess.Read))\r\n            {\r\n                success = SdkSerialization.TryFromJsonStream<SerializationTestObject>(fs, out validObj, out serError);\r\n                Assert.IsTrue(success);\r\n                Assert.AreEqual(666, validObj.prop1);\r\n                Assert.AreEqual(\"test\", validObj.prop2);\r\n            }\r\n\r\n            using (var fs = new FileStream(invalidFile, FileMode.Open, FileAccess.Read))\r\n            {\r\n                success = SdkSerialization.TryFromJsonStream<SerializationTestObject>(fs, out validObj);\r\n                Assert.IsFalse(success);\r\n                Assert.IsNull(validObj);\r\n            }\r\n\r\n            using (var fs = new FileStream(invalidFile, FileMode.Open, FileAccess.Read))\r\n            {\r\n                success = SdkSerialization.TryFromJsonStream<SerializationTestObject>(fs, out validObj, out serError);\r\n                Assert.IsFalse(success);\r\n                Assert.IsNull(validObj);\r\n                Assert.IsNotNull(serError);\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void JsonSerializationTests()\r\n        {\r\n            var testObj = new SerializationTestObject\r\n            {\r\n                prop1 = 666,\r\n                prop2 = \"test\"\r\n            };\r\n\r\n            var json = SdkSerialization.ToJson(testObj, false);\r\n            Assert.AreEqual(1, json.GetLineCount());\r\n            var back = SdkSerialization.FromJson<SerializationTestObject>(json);\r\n            Assert.AreEqual(666, back.prop1);\r\n            Assert.AreEqual(\"test\", back.prop2);\r\n\r\n            json = SdkSerialization.ToJson(testObj, true);\r\n            Assert.AreEqual(4, json.GetLineCount());\r\n            back = SdkSerialization.FromJson<SerializationTestObject>(json);\r\n            Assert.AreEqual(666, back.prop1);\r\n            Assert.AreEqual(\"test\", back.prop2);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Settings/FilterSettingsTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing SdkModels = Playnite.SDK.Models;\r\n\r\nnamespace Playnite.Tests.Settings\r\n{\r\n    [TestFixture]\r\n    public class FilterSettingsTests\r\n    {\r\n        [Test]\r\n        public void ShouldSerializeTest()\r\n        {\r\n            var settings = new FilterSettings();\r\n\r\n            var json = Serialization.ToJson(settings);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Name), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Series), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Source), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.AgeRating), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Region), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Genre), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Publisher), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Developer), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Category), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Tag), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Platform), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Library), json);\r\n            StringAssert.DoesNotContain(nameof(FilterSettings.Feature), json);\r\n\r\n            settings.Name = \"test\";\r\n            settings.Series = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            settings.Source = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            settings.AgeRating = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            settings.Region = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            settings.Genre = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            settings.Publisher = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            settings.Developer = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            settings.Category = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            settings.Tag = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            settings.Platform = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            settings.Library = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            settings.Feature = new IdItemFilterItemProperties() { Text = \"test\" };\r\n            json = Serialization.ToJson(settings);\r\n\r\n            StringAssert.Contains(nameof(FilterSettings.Name), json);\r\n            StringAssert.Contains(nameof(FilterSettings.Series), json);\r\n            StringAssert.Contains(nameof(FilterSettings.Source), json);\r\n            StringAssert.Contains(nameof(FilterSettings.AgeRating), json);\r\n            StringAssert.Contains(nameof(FilterSettings.Region), json);\r\n            StringAssert.Contains(nameof(FilterSettings.Genre), json);\r\n            StringAssert.Contains(nameof(FilterSettings.Publisher), json);\r\n            StringAssert.Contains(nameof(FilterSettings.Developer), json);\r\n            StringAssert.Contains(nameof(FilterSettings.Category), json);\r\n            StringAssert.Contains(nameof(FilterSettings.Tag), json);\r\n            StringAssert.Contains(nameof(FilterSettings.Platform), json);\r\n            StringAssert.Contains(nameof(FilterSettings.Library), json);\r\n            StringAssert.Contains(nameof(FilterSettings.Feature), json);\r\n        }\r\n\r\n        [Test]\r\n        public void StringFilterItemPropertiesEqualsTest()\r\n        {\r\n            Assert.IsTrue(new StringFilterItemProperties(\"test\").Equals(new SdkModels.StringFilterItemProperties(\"test\")));\r\n            Assert.IsTrue(new StringFilterItemProperties(new List<string> { \"test\", \"test2\" }).Equals(new SdkModels.StringFilterItemProperties(new List<string> { \"test\", \"test2\" })));\r\n            Assert.IsTrue(new StringFilterItemProperties(new List<string> { \"test\", \"test2\" }).Equals(new SdkModels.StringFilterItemProperties(new List<string> { \"test2\", \"test\" })));\r\n            Assert.IsTrue(new StringFilterItemProperties().Equals(new SdkModels.StringFilterItemProperties()));\r\n\r\n            Assert.IsTrue(new StringFilterItemProperties(new List<string> { \"test\", \"test2\" }).Equals(new StringFilterItemProperties(new List<string> { \"test\", \"test2\" })));\r\n            Assert.IsTrue(new StringFilterItemProperties(new List<string> { \"test\", \"test2\" }).Equals(new StringFilterItemProperties(new List<string> { \"test2\", \"test\" })));\r\n            Assert.IsTrue(new StringFilterItemProperties(\"test\").Equals(new StringFilterItemProperties(\"test\")));\r\n            Assert.IsTrue(new StringFilterItemProperties().Equals(new StringFilterItemProperties()));\r\n\r\n            Assert.IsFalse(new StringFilterItemProperties(new List<string> { \"test\", \"test2\" }).Equals(new SdkModels.StringFilterItemProperties(new List<string> { \"test\" })));\r\n            Assert.IsFalse(new StringFilterItemProperties(\"test\").Equals(new SdkModels.StringFilterItemProperties(\"test2\")));\r\n            Assert.IsFalse(new StringFilterItemProperties().Equals((SdkModels.StringFilterItemProperties)null));\r\n\r\n            Assert.IsFalse(new StringFilterItemProperties(new List<string> { \"test\", \"test2\" }).Equals(new StringFilterItemProperties(new List<string> { \"test2\" })));\r\n            Assert.IsFalse(new StringFilterItemProperties().Equals((StringFilterItemProperties)null));\r\n            Assert.IsFalse(new StringFilterItemProperties(\"test\").Equals(new StringFilterItemProperties(\"test2\")));\r\n        }\r\n\r\n        [Test]\r\n        public void StringFilterItemPropertiesSdkModelTest()\r\n        {\r\n            CollectionAssert.AreEqual(new StringFilterItemProperties(new List<string> { \"test\", \"test2\" }).ToSdkModel().Values, new List<string> { \"test\", \"test2\" });\r\n            CollectionAssert.AreEqual(new StringFilterItemProperties(\"test\").ToSdkModel().Values, new List<string> { \"test\" });\r\n            Assert.AreEqual(new StringFilterItemProperties().ToSdkModel(), null);\r\n\r\n            CollectionAssert.AreEqual(StringFilterItemProperties.FromSdkModel(new SdkModels.StringFilterItemProperties(new List<string> { \"test\", \"test2\" })).Values, new List<string> { \"test\", \"test2\" });\r\n            CollectionAssert.AreEqual(StringFilterItemProperties.FromSdkModel(new SdkModels.StringFilterItemProperties(\"test\")).Values, new List<string> { \"test\" });\r\n            Assert.AreEqual(StringFilterItemProperties.FromSdkModel(new SdkModels.StringFilterItemProperties()), null);\r\n        }\r\n\r\n        [Test]\r\n        public void EnumFilterItemPropertiesEqualsTest()\r\n        {\r\n            Assert.IsTrue(new EnumFilterItemProperties(1).Equals(new SdkModels.EnumFilterItemProperties(1)));\r\n            Assert.IsTrue(new EnumFilterItemProperties(new List<int> { 1, 2 }).Equals(new SdkModels.EnumFilterItemProperties(new List<int> { 1, 2 })));\r\n            Assert.IsTrue(new EnumFilterItemProperties(new List<int> { 1, 2 }).Equals(new SdkModels.EnumFilterItemProperties(new List<int> { 2, 1 })));\r\n            Assert.IsTrue(new EnumFilterItemProperties().Equals(new SdkModels.EnumFilterItemProperties()));\r\n\r\n            Assert.IsTrue(new EnumFilterItemProperties(new List<int> { 1, 2 }).Equals(new EnumFilterItemProperties(new List<int> { 1, 2 })));\r\n            Assert.IsTrue(new EnumFilterItemProperties(new List<int> { 1, 2 }).Equals(new EnumFilterItemProperties(new List<int> { 2, 1 })));\r\n            Assert.IsTrue(new EnumFilterItemProperties(1).Equals(new EnumFilterItemProperties(1)));\r\n            Assert.IsTrue(new EnumFilterItemProperties().Equals(new EnumFilterItemProperties()));\r\n\r\n            Assert.IsFalse(new EnumFilterItemProperties(new List<int> { 1, 2 }).Equals(new SdkModels.EnumFilterItemProperties(new List<int> { 1 })));\r\n            Assert.IsFalse(new EnumFilterItemProperties(1).Equals(new SdkModels.EnumFilterItemProperties(2)));\r\n            Assert.IsFalse(new EnumFilterItemProperties().Equals((SdkModels.EnumFilterItemProperties)null));\r\n\r\n            Assert.IsFalse(new EnumFilterItemProperties(new List<int> { 1, 2 }).Equals(new EnumFilterItemProperties(new List<int> { 2 })));\r\n            Assert.IsFalse(new EnumFilterItemProperties().Equals((EnumFilterItemProperties)null));\r\n            Assert.IsFalse(new EnumFilterItemProperties(1).Equals(new EnumFilterItemProperties(2)));\r\n        }\r\n\r\n        [Test]\r\n        public void EnumFilterItemPropertiesSdkModelTest()\r\n        {\r\n            CollectionAssert.AreEqual(new EnumFilterItemProperties(new List<int> { 1, 2 }).ToSdkModel().Values, new List<int> { 1, 2 });\r\n            CollectionAssert.AreEqual(new EnumFilterItemProperties(1).ToSdkModel().Values, new List<int> { 1 });\r\n            Assert.IsNull(new EnumFilterItemProperties().ToSdkModel());\r\n\r\n            CollectionAssert.AreEqual(EnumFilterItemProperties.FromSdkModel(new SdkModels.EnumFilterItemProperties(new List<int> { 1, 2 })).Values, new List<int> { 1, 2 });\r\n            CollectionAssert.AreEqual(EnumFilterItemProperties.FromSdkModel(new SdkModels.EnumFilterItemProperties(1)).Values, new List<int> { 1 });\r\n            Assert.IsNull(EnumFilterItemProperties.FromSdkModel(new SdkModels.EnumFilterItemProperties()));\r\n        }\r\n\r\n        [Test]\r\n        public void FilterItemPropertiesEqualsTest()\r\n        {\r\n            var id = Guid.NewGuid();\r\n            var id2 = Guid.NewGuid();\r\n            Assert.IsTrue(new IdItemFilterItemProperties(\"test\").Equals(new IdItemFilterItemProperties(\"test\")));\r\n            Assert.IsTrue(new IdItemFilterItemProperties(id).Equals(new IdItemFilterItemProperties(id)));\r\n            Assert.IsTrue(new IdItemFilterItemProperties(new List<Guid> { id, id2 }).Equals(new IdItemFilterItemProperties(new List<Guid> { id2, id })));\r\n            Assert.IsTrue(new IdItemFilterItemProperties().Equals(new IdItemFilterItemProperties()));\r\n\r\n            Assert.IsTrue(new IdItemFilterItemProperties(\"test\").Equals(new SdkModels.IdItemFilterItemProperties(\"test\")));\r\n            Assert.IsTrue(new IdItemFilterItemProperties(id).Equals(new SdkModels.IdItemFilterItemProperties(id)));\r\n            Assert.IsTrue(new IdItemFilterItemProperties(new List<Guid> { id, id2 }).Equals(new SdkModels.IdItemFilterItemProperties(new List<Guid> { id2, id })));\r\n            Assert.IsTrue(new IdItemFilterItemProperties().Equals(new SdkModels.IdItemFilterItemProperties()));\r\n\r\n            Assert.IsFalse(new IdItemFilterItemProperties(\"test\").Equals(new IdItemFilterItemProperties(\"test2\")));\r\n            Assert.IsFalse(new IdItemFilterItemProperties(id).Equals(new IdItemFilterItemProperties(id2)));\r\n            Assert.IsFalse(new IdItemFilterItemProperties(new List<Guid> { id }).Equals(new IdItemFilterItemProperties(new List<Guid> { id, id2 })));\r\n            Assert.IsFalse(new IdItemFilterItemProperties(id).Equals(new IdItemFilterItemProperties()));\r\n            Assert.IsFalse(new IdItemFilterItemProperties().Equals(new IdItemFilterItemProperties(id)));\r\n\r\n            Assert.IsFalse(new IdItemFilterItemProperties(\"test\").Equals(new SdkModels.IdItemFilterItemProperties(\"test2\")));\r\n            Assert.IsFalse(new IdItemFilterItemProperties(id).Equals(new SdkModels.IdItemFilterItemProperties(id2)));\r\n            Assert.IsFalse(new IdItemFilterItemProperties(new List<Guid> { id }).Equals(new SdkModels.IdItemFilterItemProperties(new List<Guid> { id, id2 })));\r\n            Assert.IsFalse(new IdItemFilterItemProperties(id).Equals(new SdkModels.IdItemFilterItemProperties()));\r\n            Assert.IsFalse(new IdItemFilterItemProperties().Equals(new SdkModels.IdItemFilterItemProperties(id)));\r\n        }\r\n\r\n        [Test]\r\n        public void FilterItemPropertiesSdkModelTest()\r\n        {\r\n            var id = Guid.NewGuid();\r\n            Assert.AreEqual(new IdItemFilterItemProperties(\"test\").ToSdkModel().Text, \"test\");\r\n            CollectionAssert.AreEqual(new IdItemFilterItemProperties(id).ToSdkModel().Ids, new List<Guid> { id });\r\n            CollectionAssert.AreEqual(new IdItemFilterItemProperties(new List<Guid> { id }).ToSdkModel().Ids, new List<Guid> { id });\r\n            Assert.IsNull(new IdItemFilterItemProperties().ToSdkModel());\r\n\r\n            Assert.AreEqual(IdItemFilterItemProperties.FromSdkModel(new SdkModels.IdItemFilterItemProperties(\"test\")).Text, \"test\");\r\n            Assert.AreEqual(IdItemFilterItemProperties.FromSdkModel(new SdkModels.IdItemFilterItemProperties(id)).Ids, new List<Guid> { id });\r\n            Assert.AreEqual(IdItemFilterItemProperties.FromSdkModel(new SdkModels.IdItemFilterItemProperties(new List<Guid> { id })).Ids, new List<Guid> { id });\r\n            Assert.IsNull(IdItemFilterItemProperties.FromSdkModel(new SdkModels.IdItemFilterItemProperties()));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/SettingsTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Settings;\r\nusing Playnite.Common;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class SettingsTests\r\n    {\r\n        [SetUp]\r\n        public void TestInit()\r\n        {\r\n            FileSystem.DeleteFile(PlaynitePaths.UninstallerPath);\r\n        }\r\n\r\n        [OneTimeTearDown]\r\n        public void Cleanup()\r\n        {\r\n            FileSystem.DeleteFile(PlaynitePaths.UninstallerPath);\r\n        }\r\n\r\n        [Test]\r\n        public void PortableInnoPathsTest()\r\n        {\r\n            Assert.IsTrue(PlayniteSettings.IsPortable);\r\n            Assert.AreNotEqual(\r\n                Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), \"Playnite\"),\r\n                PlaynitePaths.ConfigRootPath);\r\n        }\r\n\r\n        [Test]\r\n        public void PeriodicUpdateCheckTest()\r\n        {\r\n            var settings = new PlayniteSettings();\r\n            var testDates = new TestDateTimes();\r\n            using (DateTimes.UseCustomDates(testDates))\r\n            {\r\n                // --- Program update\r\n                // No date set check\r\n                testDates.Now = new DateTime(2020, 10, 1, 12, 0, 0);\r\n                settings.CheckForProgramUpdates = UpdateCheckFrequency.OnceADay;\r\n                Assert.IsTrue(settings.ShouldCheckProgramUpdatePeriodic());\r\n\r\n                // Once a day check\r\n                settings.LastProgramUpdateCheck = new DateTime(2020, 10, 1, 10, 00, 0);\r\n                Assert.IsFalse(settings.ShouldCheckProgramUpdatePeriodic());\r\n                testDates.Now = new DateTime(2020, 10, 2, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckProgramUpdatePeriodic());\r\n\r\n                // Once a week check\r\n                settings.CheckForProgramUpdates = UpdateCheckFrequency.OnceAWeek;\r\n                Assert.IsFalse(settings.ShouldCheckProgramUpdatePeriodic());\r\n                testDates.Now = new DateTime(2020, 10, 8, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckProgramUpdatePeriodic());\r\n\r\n                // Startup only check\r\n                settings.CheckForProgramUpdates = UpdateCheckFrequency.OnEveryStartup;\r\n                Assert.IsFalse(settings.ShouldCheckProgramUpdatePeriodic());\r\n\r\n                // --- Addon update\r\n                // No date set check\r\n                testDates.Now = new DateTime(2020, 10, 1, 12, 0, 0);\r\n                settings.CheckForAddonUpdates = UpdateCheckFrequency.OnceADay;\r\n                Assert.IsTrue(settings.ShouldCheckAddonUpdatePeriodic());\r\n\r\n                // Once a day check\r\n                settings.LastAddonUpdateCheck = new DateTime(2020, 10, 1, 10, 00, 0);\r\n                Assert.IsFalse(settings.ShouldCheckAddonUpdatePeriodic());\r\n                testDates.Now = new DateTime(2020, 10, 2, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckAddonUpdatePeriodic());\r\n\r\n                // Once a week check\r\n                settings.CheckForAddonUpdates = UpdateCheckFrequency.OnceAWeek;\r\n                Assert.IsFalse(settings.ShouldCheckAddonUpdatePeriodic());\r\n                testDates.Now = new DateTime(2020, 10, 8, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckAddonUpdatePeriodic());\r\n\r\n                // Startup only check\r\n                settings.CheckForAddonUpdates = UpdateCheckFrequency.OnEveryStartup;\r\n                Assert.IsFalse(settings.ShouldCheckAddonUpdatePeriodic());\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void StartupUpdateCheckTest()\r\n        {\r\n            var settings = new PlayniteSettings();\r\n            var testDates = new TestDateTimes();\r\n            using (DateTimes.UseCustomDates(testDates))\r\n            {\r\n                // --- Program update\r\n                // No date set check\r\n                testDates.Now = new DateTime(2020, 10, 1, 12, 0, 0);\r\n                settings.CheckForProgramUpdates = UpdateCheckFrequency.OnceADay;\r\n                Assert.IsTrue(settings.ShouldCheckProgramUpdateStartup());\r\n\r\n                // Once a day check\r\n                settings.LastProgramUpdateCheck = new DateTime(2020, 10, 1, 10, 00, 0);\r\n                Assert.IsFalse(settings.ShouldCheckProgramUpdateStartup());\r\n                testDates.Now = new DateTime(2020, 10, 2, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckProgramUpdateStartup());\r\n\r\n                // Once a week check\r\n                settings.CheckForProgramUpdates = UpdateCheckFrequency.OnceAWeek;\r\n                Assert.IsFalse(settings.ShouldCheckProgramUpdateStartup());\r\n                testDates.Now = new DateTime(2020, 10, 8, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckProgramUpdateStartup());\r\n\r\n                // Startup only check\r\n                settings.CheckForProgramUpdates = UpdateCheckFrequency.OnEveryStartup;\r\n                Assert.IsTrue(settings.ShouldCheckProgramUpdateStartup());\r\n\r\n                // --- Addon update\r\n                // No date set check\r\n                testDates.Now = new DateTime(2020, 10, 1, 12, 0, 0);\r\n                settings.CheckForAddonUpdates = UpdateCheckFrequency.OnceADay;\r\n                Assert.IsTrue(settings.ShouldCheckAddonUpdateStartup());\r\n\r\n                // Once a day check\r\n                settings.LastAddonUpdateCheck = new DateTime(2020, 10, 1, 10, 00, 0);\r\n                Assert.IsFalse(settings.ShouldCheckAddonUpdateStartup());\r\n                testDates.Now = new DateTime(2020, 10, 2, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckAddonUpdateStartup());\r\n\r\n                // Once a week check\r\n                settings.CheckForAddonUpdates = UpdateCheckFrequency.OnceAWeek;\r\n                Assert.IsFalse(settings.ShouldCheckAddonUpdateStartup());\r\n                testDates.Now = new DateTime(2020, 10, 8, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckAddonUpdateStartup());\r\n\r\n                // Startup only check\r\n                settings.CheckForAddonUpdates = UpdateCheckFrequency.OnEveryStartup;\r\n                Assert.IsTrue(settings.ShouldCheckAddonUpdateStartup());\r\n            }\r\n        }\r\n\r\n        [Test]\r\n        public void LibraryUpdateStartupCheckTest()\r\n        {\r\n            var settings = new PlayniteSettings();\r\n            var testDates = new TestDateTimes();\r\n            using (DateTimes.UseCustomDates(testDates))\r\n            {\r\n                // Lib update\r\n                // Manual check\r\n                settings.CheckForLibraryUpdates = LibraryUpdateCheckFrequency.Manually;\r\n                Assert.IsFalse(settings.ShouldCheckLibraryOnStartup());\r\n\r\n                // No date set check\r\n                testDates.Now = new DateTime(2020, 10, 1, 12, 0, 0);\r\n                settings.CheckForLibraryUpdates = LibraryUpdateCheckFrequency.OnceADay;\r\n                Assert.IsTrue(settings.ShouldCheckLibraryOnStartup());\r\n\r\n                // Once a day check\r\n                settings.LastLibraryUpdateCheck = new DateTime(2020, 10, 1, 10, 00, 0);\r\n                Assert.IsFalse(settings.ShouldCheckLibraryOnStartup());\r\n                testDates.Now = new DateTime(2020, 10, 2, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckLibraryOnStartup());\r\n\r\n                // Once a week check\r\n                settings.CheckForLibraryUpdates = LibraryUpdateCheckFrequency.OnceAWeek;\r\n                Assert.IsFalse(settings.ShouldCheckLibraryOnStartup());\r\n                testDates.Now = new DateTime(2020, 10, 8, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckLibraryOnStartup());\r\n\r\n                // Startup onyl check\r\n                settings.CheckForLibraryUpdates = LibraryUpdateCheckFrequency.OnEveryStartup;\r\n                Assert.IsTrue(settings.ShouldCheckLibraryOnStartup());\r\n\r\n                // Emu update\r\n                // Manual check\r\n                settings.CheckForEmulatedLibraryUpdates = LibraryUpdateCheckFrequency.Manually;\r\n                Assert.IsFalse(settings.ShouldCheckEmuLibraryOnStartup());\r\n\r\n                // No date set check\r\n                testDates.Now = new DateTime(2020, 10, 1, 12, 0, 0);\r\n                settings.CheckForEmulatedLibraryUpdates = LibraryUpdateCheckFrequency.OnceADay;\r\n                Assert.IsTrue(settings.ShouldCheckEmuLibraryOnStartup());\r\n\r\n                // Once a day check\r\n                settings.LastEmuLibraryUpdateCheck = new DateTime(2020, 10, 1, 10, 00, 0);\r\n                Assert.IsFalse(settings.ShouldCheckEmuLibraryOnStartup());\r\n                testDates.Now = new DateTime(2020, 10, 2, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckEmuLibraryOnStartup());\r\n\r\n                // Once a week check\r\n                settings.CheckForEmulatedLibraryUpdates = LibraryUpdateCheckFrequency.OnceAWeek;\r\n                Assert.IsFalse(settings.ShouldCheckEmuLibraryOnStartup());\r\n                testDates.Now = new DateTime(2020, 10, 8, 10, 0, 0);\r\n                Assert.IsTrue(settings.ShouldCheckEmuLibraryOnStartup());\r\n\r\n                // Startup onyl check\r\n                settings.CheckForEmulatedLibraryUpdates = LibraryUpdateCheckFrequency.OnEveryStartup;\r\n                Assert.IsTrue(settings.ShouldCheckEmuLibraryOnStartup());\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/SigningToolsTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class SigningToolsTests\r\n    {\r\n        [Test]\r\n        public void IsTrustedTest()\r\n        {\r\n            var selfFilePath = Assembly.GetExecutingAssembly().Location;\r\n            Assert.IsFalse(SigningTools.IsTrusted(selfFilePath));\r\n            Assert.IsTrue(SigningTools.IsTrusted(@\"c:\\Windows\\explorer.exe\"));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/SizesTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Drawing;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class SizesTets\r\n    {\r\n        private static IEnumerable<TestCaseData> GetAspectRatioCases()\r\n        {\r\n            yield return new TestCaseData(new Rectangle(0, 0, 1920, 1080), new AspectRatio(16, 9));\r\n            yield return new TestCaseData(new Rectangle(0, 0, 1280, 720), new AspectRatio(16, 9));\r\n            yield return new TestCaseData(new Rectangle(0, 0, 1920, 1200), new AspectRatio(8, 5));\r\n            yield return new TestCaseData(new Rectangle(0, 0, 1024, 768), new AspectRatio(4, 3));\r\n            yield return new TestCaseData(new Rectangle(0, 0, 3840, 1080), new AspectRatio(32, 9));\r\n            yield return new TestCaseData(new Rectangle(0, 0, 1280, 1024), new AspectRatio(5, 4));\r\n        }\r\n\r\n        [Test, TestCaseSource(nameof(GetAspectRatioCases))]\r\n        public void GetAspectRatioTest(Rectangle input, AspectRatio output)\r\n        {\r\n            Assert.AreEqual(output, Sizes.GetAspectRatio(input));\r\n        }\r\n\r\n        private static IEnumerable<TestCaseData> GetWidthTestCases()\r\n        {\r\n            yield return new TestCaseData(720, 1280, new AspectRatio(16, 9));\r\n            yield return new TestCaseData(1200, 1920, new AspectRatio(16, 10));\r\n            yield return new TestCaseData(1080, 3840, new AspectRatio(32, 9));\r\n        }\r\n\r\n        [Test, TestCaseSource(nameof(GetWidthTestCases))]\r\n        public void GetWidthTest(double height, double width, AspectRatio ratio)\r\n        {\r\n            Assert.AreEqual(width, ratio.GetWidth(height));\r\n        }\r\n\r\n        private static IEnumerable<TestCaseData> GetHeightTestCases()\r\n        {\r\n            yield return new TestCaseData(1280, 720, new AspectRatio(16, 9));\r\n            yield return new TestCaseData(1920, 1200, new AspectRatio(16, 10));\r\n            yield return new TestCaseData(3840, 1080, new AspectRatio(32, 9));\r\n        }\r\n\r\n        [Test, TestCaseSource(nameof(GetHeightTestCases))]\r\n        public void GetHeightTest(int width, int height, AspectRatio ratio)\r\n        {\r\n            Assert.AreEqual(height, ratio.GetHeight(width));\r\n        }\r\n\r\n        [Test]\r\n        public void GetMegapixelsFromResTest()\r\n        {\r\n            Assert.AreEqual(0.922, Sizes.GetMegapixelsFromRes(1280, 720));\r\n            Assert.AreEqual(0.540, Sizes.GetMegapixelsFromRes(600, 900));\r\n        }\r\n\r\n        [Test]\r\n        public void AspectRatioEquatableTest()\r\n        {\r\n            var asp1 = new AspectRatio(1, 2);\r\n            var asp2 = new AspectRatio(1, 2);\r\n            var asp3 = new AspectRatio(1, 1);\r\n\r\n            Assert.IsTrue(asp1 == asp2);\r\n            Assert.IsFalse(asp1 == asp3);\r\n            Assert.AreEqual(asp1, asp2);\r\n            Assert.AreNotEqual(asp1, asp3);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/SortableNameConverterTests.cs",
    "content": "﻿using NUnit.Framework;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Playnite.Tests\n{\n    [TestFixture]\n    public class SortableNameConverterTests\n    {\n        //Insignificant side-effects (harder to fix without making exceptions, and not damaging for sorting with other games in their franchise):\n\n        //Back 4 Blood                                      ->      Back 04 Blood\n        //Left 4 Dead                                       ->      Left 04 Dead\n        //Spirit Swap: Lofi Beats to Match-3 To             ->      Spirit Swap: Lofi Beats to Match-03 To\n        //Kingdom Hearts 358/2 Days                         ->      Kingdom Hearts 358/02 Days\n        //Ether One                                         ->      Ether 01\n        //It Takes Two                                      ->      It Takes 02\n        //Army of Two\t                                    ->      Army of 02\n        //                                                          Army of Two: The Devil's Cartel won't be changed, but this will still preserve release order sorting\n        //Hyperdimension Neptunia Re;Birth3 V Generation\t->      Hyperdimension Neptunia Re;Birth3 05 Generation\n        //STAR WARS: Rebel Assault I + II                   ->      STAR WARS: Rebel Assault I + 02\n        //Emily is Away <3\t                                ->      Emily is Away <03\n\n        [TestCase(\"Final Fantasy XIII-2\", \"Final Fantasy 13-02\")]\n        [TestCase(\"Final Fantasy Ⅻ\", \"Final Fantasy 12\")] //Ⅻ is a single unicode character here\n        [TestCase(\"FINAL FANTASY X/X-2 HD Remaster\", \"FINAL FANTASY 10/10-02 HD Remaster\")]\n        [TestCase(\"Warhammer ↂↇ\", \"Warhammer 40000\")]\n        [TestCase(\"Carmageddon 2: Carpocalypse Now\", \"Carmageddon 02: Carpocalypse Now\")]\n        [TestCase(\"SOULCALIBUR IV\", \"SOULCALIBUR 04\")]\n        [TestCase(\"Quake III: Team Arena\", \"Quake 03: Team Arena\")]\n        [TestCase(\"THE KING OF FIGHTERS XIV STEAM EDITION\", \"KING OF FIGHTERS 14 STEAM EDITION\")]\n        [TestCase(\"A Hat in Time\", \"Hat in Time\")]\n        [TestCase(\"Battlefield V\", \"Battlefield 05\")]\n        [TestCase(\"Tales of Monkey Island: Chapter 1 - Launch of the Screaming Narwhal\", \"Tales of Monkey Island: Chapter 01 - Launch of the Screaming Narwhal\")]\n        [TestCase(\"Tales of Monkey Island: Chapter I - Launch of the Screaming Narwhal\", \"Tales of Monkey Island: Chapter 01 - Launch of the Screaming Narwhal\")]\n        [TestCase(\"KOBOLD: Chapter I\", \"KOBOLD: Chapter 01\")]\n        [TestCase(\"Crazy Machines 1.5 New from the Lab\", \"Crazy Machines 01.5 New from the Lab\")]\n        [TestCase(\"Half-Life 2: Episode One\", \"Half-Life 02: Episode 01\")]\n        [TestCase(\"Unravel Two\", \"Unravel 02\")]\n        [TestCase(\"The Elder Scrolls II: Daggerfall Unity - GOG Cut\", \"Elder Scrolls 02: Daggerfall Unity - GOG Cut\")]\n        [TestCase(\"Metal Slug XX\", \"Metal Slug 20\")]\n        [TestCase(\"The Uncanny X-Men\", \"Uncanny X-Men\")]\n        [TestCase(\"Test X-\", \"Test 10-\")]\n        [TestCase(\"The Witcher 3\", \"Witcher 03\")]\n        [TestCase(\"the Witcher 3\", \"Witcher 03\")]\n        [TestCase(\"A Game\", \"Game\")]\n        [TestCase(\"An Usual Game\", \"Usual Game\")]\n        public void ConvertToSortableNameTest(string input, string expected)\n        {\n            var c = new SortableNameConverter(new PlayniteSettings().GameSortingNameRemovedArticles);\n            var output = c.Convert(input);\n            Assert.AreEqual(expected, output);\n        }\n\n        [TestCase(\"SHENZHEN I/O\")]\n        [TestCase(\"XIII\")]\n        [TestCase(\"X: Beyond the Frontier\")]\n        [TestCase(\"X3: Terran Conflict\")]\n        [TestCase(\"X-COM\")]\n        [TestCase(\"Gobliiins\")]\n        [TestCase(\"Before I Forget\")]\n        [TestCase(\"A.I.M. Racing\")]\n        [TestCase(\"S.T.A.L.K.E.R.: Shadow of Chernobyl\")]\n        [TestCase(\"Battlefield 1942\")]\n        [TestCase(\"Metal Wolf Chaos XD\")]\n        [TestCase(\"Prince of Persia: The Two Thrones\")]\n        [TestCase(\"Daemon X Machina\")]\n        [TestCase(\"Bit Blaster XL\")]\n        [TestCase(\"STAR WARS X-Wing vs TIE Fighter: Balance of Power Campaigns\")]\n        [TestCase(\"Star Wars: X-Wing Alliance\")]\n        [TestCase(\"Acceleration of Suguri X-Edition\")]\n        [TestCase(\"Guilty Gear X2 #Reload\")]\n        [TestCase(\"Mega Man X Legacy Collection\")] //Mega Man 10 is a different game\n        [TestCase(\"LEGO DC Super-Villains\")]\n        [TestCase(\"Constant C\")]\n        [TestCase(\"Metroid: Other M\")]\n        [TestCase(\"Zero Escape: Zero Time Dilemma\")] //zero isn't currently parsed but if it ever is, this title should remain unchanged\n        [TestCase(\"Worms W M D\")]\n        [TestCase(\"Sonic Adventure DX\")]\n        [TestCase(\"Zone of The Enders: The 2nd Runner M∀RS\")]\n        [TestCase(\"AnUsual Game\")]\n        [TestCase(null)]\n        [TestCase(\"\")]\n        [TestCase(\"  \")]\n        public void SortableNameIsUnchanged(string input)\n        {\n            var c = new SortableNameConverter(new PlayniteSettings().GameSortingNameRemovedArticles);\n            var output = c.Convert(input);\n            Assert.AreEqual(input, output);\n        }\n\n        [TestCase(\"The Witcher 3\", \"The Witcher 03\")]\n        [TestCase(\"A Hat in Time\", \"A Hat in Time\")]\n        public void SortableNameNoArticlesRemovedTest(string input, string expected)\n        {\n            var c = new SortableNameConverter(new string[0]);\n            var output = c.Convert(input);\n            Assert.AreEqual(expected, output);\n        }\n\n        [TestCase(\"I\", 1)]\n        [TestCase(\"II\", 2)]\n        [TestCase(\"IV\", 4)]\n        [TestCase(\"VIII\", 8)]\n        [TestCase(\"IX\", 9)]\n        [TestCase(\"XIII\", 13)]\n        [TestCase(\"XIX\", 19)]\n        [TestCase(\"CCLXXXI\", 281)]\n        [TestCase(\"MCMLVIII\", 1958)]\n        [TestCase(\"LMMXXIV\", 1974)]\n        [TestCase(\"MLMXXIV\", 1974)]\n        [TestCase(\"MCMXCVIII\", 1998)]\n        [TestCase(\"MCMXCIX\", 1999)]\n        public void ConvertRomanNumeralsToIntTest(string input, int expected)\n        {\n            int? output = SortableNameConverter.ConvertRomanNumeralToInt(input);\n            Assert.AreEqual(expected, output);\n        }\n\n        [TestCase(\"IVX\")]\n        [TestCase(\"VIX\")]\n        [TestCase(\"IIII\")]\n        [TestCase(\"XXL\")]\n        [TestCase(\"IIX\")]\n        [TestCase(\"asdf\")]\n        public void ConvertRomanNumeralsToIntRejectsNonsense(string input)\n        {\n            int? output = SortableNameConverter.ConvertRomanNumeralToInt(input);\n            Assert.AreEqual(null, output);\n        }\n\n    }\n}\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/StringExtensionsTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class StringExtensionsTests\r\n    {\r\n        [TestCase(\"Middle-earth™: Shadow of War™\", \"Middle-earth: Shadow of War\")]\r\n        [TestCase(\"Command®   & Conquer™ Red_Alert 3™ : Uprising©:_Best Game\", \"Command & Conquer Red Alert 3: Uprising: Best Game\")]\r\n        [TestCase(\"Witcher 3, The\", \"The Witcher 3\")]\r\n        [TestCase(\"Pokemon.Red.[US].[l33th4xor].Test.[22]\", \"Pokemon Red Test\")]\r\n        [TestCase(\"Pokemon.Red.[US].(l33th 4xor).Test.(22)\", \"Pokemon Red Test\")]\r\n        [TestCase(\"[PROTOTYPE]™\", \"[PROTOTYPE]\")]\r\n        [TestCase(\"(PROTOTYPE2)™\", \"(PROTOTYPE2)\")]\r\n        public void NormalizeGameNameTest(string input, string expectedOutput)\r\n        {\r\n            string output = StringExtensions.NormalizeGameName(input);\r\n            Assert.AreEqual(expectedOutput, output);\r\n        }\r\n\r\n        [Test]\r\n        public void GetPathWithoutAllExtensionsTest()\r\n        {\r\n            Assert.AreEqual(@\"c:\\test\\SomeFile\", StringExtensions.GetPathWithoutAllExtensions(@\"c:\\test\\SomeFile.zip\"));\r\n            Assert.AreEqual(@\"SomeFile\", StringExtensions.GetPathWithoutAllExtensions(@\"SomeFile.r888s.42rar.zip1\"));\r\n            Assert.AreEqual(@\"SomeFile\", StringExtensions.GetPathWithoutAllExtensions(@\"SomeFile\"));\r\n            Assert.AreEqual(@\"SomeFile\", StringExtensions.GetPathWithoutAllExtensions(@\"SomeFile.Test.42rar.zip1\"));\r\n            Assert.AreEqual(@\"SomeFile.zip1test.aa_aa\", StringExtensions.GetPathWithoutAllExtensions(@\"SomeFile.zip1test.aa_aa.zip\"));\r\n            Assert.AreEqual(@\"SomeFile.zip1_test\", StringExtensions.GetPathWithoutAllExtensions(@\"SomeFile.zip1_test\"));\r\n        }\r\n\r\n        [Test]\r\n        public void IsHttpUrlTest()\r\n        {\r\n            Assert.IsTrue(@\"http://www.playnite.link\".IsHttpUrl());\r\n            Assert.IsTrue(@\"https://playnite.link\".IsHttpUrl());\r\n            Assert.IsTrue(@\"HTTP://WWW.PLAYNITE.LINK\".IsHttpUrl());\r\n            Assert.IsTrue(@\"HTTPS://PLAYNITE.LINK\".IsHttpUrl());\r\n            Assert.IsFalse(@\"ftp://www.playnite.link\".IsHttpUrl());\r\n            Assert.IsFalse(@\"www.playnite.link\".IsHttpUrl());\r\n        }\r\n\r\n        [Test]\r\n        public void IsUriTest()\r\n        {\r\n            Assert.IsTrue(@\"http://www.playnite.link\".IsUri());\r\n            Assert.IsFalse(@\"www.playnite.link\".IsUri());\r\n            Assert.IsTrue(@\"mailto:someadress@test.cz\".IsUri());\r\n            Assert.IsTrue(@\"playnite://test/test\".IsUri());\r\n            Assert.IsFalse(@\"testsstring\".IsUri());\r\n            Assert.IsFalse(@\"c:\\test\\aa.txt\".IsUri());\r\n        }\r\n\r\n        [Test]\r\n        public void IsNullOrWhiteSpaceTest()\r\n        {\r\n            var multiLine = @\"\r\n\r\n   \r\n\r\n\";\r\n            Assert.IsTrue(multiLine.IsNullOrWhiteSpace());\r\n        }\r\n\r\n        [Test]\r\n        public void TrimEndStringTest()\r\n        {\r\n            Assert.AreEqual(\"Test \", \"Test totrim\".TrimEndString(\"totrim\"));\r\n            Assert.AreEqual(\"Test totrim\", \"Test totrim\".TrimEndString(\"aaa\"));\r\n        }\r\n\r\n        [Test]\r\n        public void ToTileCaseTest()\r\n        {\r\n            Assert.AreEqual(\"Test Is Good\", \"tEst is gOOD\".ToTileCase());\r\n        }\r\n\r\n        [Test]\r\n        public void ContainsAnyTest()\r\n        {\r\n            Assert.IsTrue(\"test[dasd\".ContainsAny(new char[] { ']', '[' }));\r\n            Assert.IsFalse(\"test dasd\".ContainsAny(new char[] { ']', '[' }));\r\n        }\r\n\r\n        [Test]\r\n        public void GetLineCountTest()\r\n        {\r\n            Assert.AreEqual(0, ((string)null).GetLineCount());\r\n            Assert.AreEqual(1, (\"\").GetLineCount());\r\n            Assert.AreEqual(2, (\"\\n\").GetLineCount());\r\n            Assert.AreEqual(3, (\"line1\\nline2\\nline3\").GetLineCount());\r\n        }\r\n\r\n        [Test]\r\n        public void EndWithDirSeparatorTest()\r\n        {\r\n            Assert.AreEqual(@\"\", \"\".EndWithDirSeparator());\r\n            Assert.IsNull(((string)null).EndWithDirSeparator());\r\n            Assert.AreEqual(@\"test\\\", \"test\".EndWithDirSeparator());\r\n            Assert.AreEqual(@\"test\\\", @\"test\\\".EndWithDirSeparator());\r\n            Assert.AreEqual(@\"test\\\", @\"test\\\\\\\".EndWithDirSeparator());\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/System/ComputerTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class ComputerTests\r\n    {\r\n        [Test]\r\n        public void GetMonitorsTest()\r\n        {\r\n            var screens = Computer.GetScreens();\r\n            CollectionAssert.IsNotEmpty(screens);\r\n            Assert.IsTrue(screens.Any(a => a.Primary));\r\n        }\r\n\r\n        [Test]\r\n        public void GetSystemInfoTest()\r\n        {\r\n            var info = Computer.GetSystemInfo();\r\n            CollectionAssert.IsNotEmpty(info.Gpus);\r\n            Assert.IsFalse(string.IsNullOrEmpty(info.Cpu));\r\n            Assert.IsFalse(string.IsNullOrEmpty(info.WindowsVersion));\r\n            Assert.AreNotEqual(0, info.Ram);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/System/ProcessExtensionsTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite.Common;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class ProcessExtensionsTests\r\n    {\r\n        [Test]\r\n        public void IsRunningTest()\r\n        {\r\n            Assert.IsTrue(ProcessExtensions.IsRunning(\"svchost\"));\r\n            Assert.IsFalse(ProcessExtensions.IsRunning(\"perfwatson$\"));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/TimerTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class TimerTests\r\n    {\r\n        [Test]\r\n        public void TimeConvertersTests()\r\n        {\r\n            Assert.AreEqual(1000, Timer.SecondsToMilliseconds(1));\r\n            Assert.AreEqual(60000, Timer.MinutesToMilliseconds(1));\r\n            Assert.AreEqual(3600000, Timer.HoursToMilliseconds(1));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/Web/HttpDownloaderTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Settings;\r\nusing System.Net;\r\nusing Playnite.Common.Web;\r\nusing System.Threading;\r\n\r\nnamespace Playnite.Tests.Web\r\n{\r\n    [TestFixture]\r\n    public class HttpDownloaderTests\r\n    {\r\n        [Test]\r\n        public void GetResponseCodeTest()\r\n        {\r\n            var resp = HttpDownloader.GetResponseCode(@\"https://playnite.link/favicon.ico\", CancellationToken.None, out var headers);\r\n            Assert.AreEqual(HttpStatusCode.OK, resp);\r\n            Assert.AreEqual(\"15086\", headers[\"Content-Length\"]);\r\n\r\n            resp = HttpDownloader.GetResponseCode(@\"https://playnite.link/test.tst\", CancellationToken.None, out headers);\r\n            Assert.AreEqual(HttpStatusCode.NotFound, resp);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/XmlTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Drawing;\r\nusing NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing System.IO;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [TestFixture]\r\n    public class XmlTets\r\n    {\r\n        [Test]\r\n        public static void SimpleAreEqualStringTest()\r\n        {\r\n            Assert.IsTrue(Xml.AreEqual(\r\n                @\"<t><a att='aa'  ett='bb'>11</a></t>\",\r\n                @\"<t><a att='aa' ett='bb'>11</a></t>\"));\r\n            Assert.IsTrue(Xml.AreEqual(\r\n                @\"<t><a att='aa' ett='bb'>11</a></t>\",\r\n                @\"<t><a ett='bb' att='aa'>11</a></t>\"));\r\n            Assert.IsTrue(Xml.AreEqual(\r\n                @\"<t><a att='aa'    ett='bb'>11</a>  </t>\",\r\n                @\"<t>  <a ett='bb' att='aa'>11</a></t>\"));\r\n\r\n            Assert.IsFalse(Xml.AreEqual(\r\n                @\"<t><a att='aa' ett='bb'>11</a></t>\",\r\n                @\"<t><a att='aa' ett='bb'>22</a></t>\"));\r\n            Assert.IsFalse(Xml.AreEqual(\r\n                @\"<t><a att='aa' ett='aa'>11</a></t>\",\r\n                @\"<t><a ett='bb' att='aa'>11</a></t>\"));\r\n            Assert.IsFalse(Xml.AreEqual(\r\n                @\"<t><a att='aa'    ett='bb'>11</a>  </t>\",\r\n                @\"<t>  <b ett='bb' att='aa'>11</b></t>\"));            \r\n        }\r\n\r\n        [Test]\r\n        public static void XamlsAreEqualStringTest()\r\n        {\r\n            var xml1 = File.ReadAllText(Path.Combine(PlayniteTests.ResourcesPath, \"XmlTest\", \"Xml1.xaml\"));\r\n            var xml2 = File.ReadAllText(Path.Combine(PlayniteTests.ResourcesPath, \"XmlTest\", \"Xml2.xaml\"));\r\n            var xml3 = File.ReadAllText(Path.Combine(PlayniteTests.ResourcesPath, \"XmlTest\", \"Xml3.xaml\"));\r\n            var xml4 = File.ReadAllText(Path.Combine(PlayniteTests.ResourcesPath, \"XmlTest\", \"Xml4.xaml\"));\r\n\r\n            Assert.IsTrue(Xml.AreEqual(xml1, xml2));\r\n            Assert.IsFalse(Xml.AreEqual(xml1, xml3));\r\n            Assert.IsFalse(Xml.AreEqual(xml1, xml4));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/_TestTools/GameDbTestWrapper.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Database;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    public class GameDbTestWrapper : IDisposable\r\n    {\r\n        private readonly bool createdTempPath;\r\n        private readonly TempDirectory tempDir;\r\n        public readonly GameDatabase DB;\r\n        public readonly string DbDirectory;\r\n\r\n        public GameDbTestWrapper(bool openDb = true)\r\n        {\r\n            var stack = new StackTrace(1);\r\n            var method = stack.GetFrame(0).GetMethod();\r\n            tempDir = TempDirectory.Create(true, Paths.GetSafePathName($\"{method.DeclaringType.Name}_{method.Name}\"));\r\n            DbDirectory = tempDir.TempPath;\r\n            DB = new GameDatabase(DbDirectory);\r\n            Game.DatabaseReference = DB;\r\n            createdTempPath = true;\r\n\r\n            if (openDb)\r\n            {\r\n                DB.OpenDatabase();\r\n            }\r\n        }\r\n\r\n        public GameDbTestWrapper(TempDirectory dbPath, bool openDb = true)\r\n        {\r\n            DbDirectory = dbPath.TempPath;\r\n            DB = new GameDatabase(DbDirectory);\r\n            Game.DatabaseReference = DB;\r\n            createdTempPath = false;\r\n\r\n            if (openDb)\r\n            {\r\n                DB.OpenDatabase();\r\n            }\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n            DB.Dispose();\r\n            if (createdTempPath)\r\n            {\r\n                tempDir.Dispose();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/_TestTools/MockDialogsFactory.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    public class MockDialogsFactory : IDialogsFactory\r\n    {\r\n        public string SaveFile(string filter)\r\n        {\r\n            return string.Empty;\r\n        }\r\n\r\n        public string SaveFile(string filter, bool promptOverwrite)\r\n        {\r\n            return string.Empty;\r\n        }\r\n\r\n        public string SelectFile(string filter)\r\n        {\r\n            return string.Empty;\r\n        }\r\n\r\n        public List<string> SelectFiles(string filter)\r\n        {\r\n            return new List<string>();\r\n        }\r\n\r\n        public string SelectFolder()\r\n        {\r\n            return string.Empty;\r\n        }\r\n\r\n        public string SelectIconFile()\r\n        {\r\n            return string.Empty;\r\n        }\r\n\r\n        public string SelectImagefile()\r\n        {\r\n            return string.Empty;\r\n        }\r\n\r\n        public StringSelectionDialogResult SelectString(string messageBoxText, string caption, string defaultInput)\r\n        {\r\n            return new StringSelectionDialogResult(false, string.Empty);\r\n        }\r\n\r\n        public StringSelectionDialogResult SelectString(string messageBoxText, string caption, string defaultInput, List<MessageBoxToggle> options)\r\n        {\r\n            return new StringSelectionDialogResult(false, string.Empty);\r\n        }\r\n\r\n        public System.Windows.MessageBoxResult ShowErrorMessage(string messageBoxText, string caption)\r\n        {\r\n            return MessageBoxResult.None;\r\n        }\r\n\r\n        public System.Windows.MessageBoxResult ShowErrorMessage(string messageBoxText)\r\n        {\r\n            return MessageBoxResult.None;\r\n        }\r\n\r\n        public System.Windows.MessageBoxResult ShowMessage(string messageBoxText, string caption, System.Windows.MessageBoxButton button, System.Windows.MessageBoxImage icon)\r\n        {\r\n            return MessageBoxResult.None;\r\n        }\r\n\r\n        public System.Windows.MessageBoxResult ShowMessage(string messageBoxText, string caption, System.Windows.MessageBoxButton button)\r\n        {\r\n            return MessageBoxResult.None;\r\n        }\r\n\r\n        public System.Windows.MessageBoxResult ShowMessage(string messageBoxText, string caption)\r\n        {\r\n            return MessageBoxResult.None;\r\n        }\r\n\r\n        public System.Windows.MessageBoxResult ShowMessage(string messageBoxText)\r\n        {\r\n            return MessageBoxResult.None;\r\n        }\r\n\r\n        public void ShowSelectableString(string messageBoxText, string caption, string defaultInput)\r\n        {\r\n        }\r\n\r\n        public ImageFileOption ChooseImageFile(List<ImageFileOption> files, string caption = null, double itemWidth = 240, double itemHeight = 180)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public GenericItemOption ChooseItemWithSearch(List<GenericItemOption> items, Func<string, List<GenericItemOption>> searchFunction, string defaultSearch = null, string caption = null)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public MessageBoxOption ShowMessage(string messageBoxText, string caption, MessageBoxImage icon, List<MessageBoxOption> options)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public GlobalProgressResult ActivateGlobalProgress(Action<GlobalProgressActionArgs> progresAction, GlobalProgressOptions progressArgs)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public GlobalProgressResult ActivateGlobalProgress(Func<GlobalProgressActionArgs, Task> progresAction, GlobalProgressOptions progressArgs)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public Window CreateWindow(WindowCreationOptions options)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public Window GetCurrentAppWindow()\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public string SelectFolder(string initialDir)\r\n        {\r\n            return string.Empty;\r\n        }\r\n\r\n        public string SelectFile(string filter, string initialDir)\r\n        {\r\n            return string.Empty;\r\n        }\r\n\r\n        public List<string> SelectFiles(string filter, string initialDir)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public string SelectIconFile(string initialDir)\r\n        {\r\n            return string.Empty;\r\n        }\r\n\r\n        public string SelectImagefile(string initialDir)\r\n        {\r\n            return string.Empty;\r\n        }\r\n\r\n        public string SaveFile(string filter, string initialDir)\r\n        {\r\n            return string.Empty;\r\n        }\r\n\r\n        public string SaveFile(string filter, bool promptOverwrite, string initialDir)\r\n        {\r\n            return string.Empty;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/_TestTools/MockWindowFactory.cs",
    "content": "﻿using Playnite.Controls;\r\nusing Playnite.Windows;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    public class MockWindowFactory : IWindowFactory\r\n    {\r\n        public bool WasClosed\r\n        {\r\n            get;\r\n        }\r\n\r\n        public WindowBase Window\r\n        {\r\n            get;\r\n        }\r\n\r\n        public void BringToForeground()\r\n        {\r\n\r\n        }\r\n\r\n        public void Close()\r\n        {\r\n\r\n        }\r\n\r\n        public void Close(bool? resutl)\r\n        {\r\n\r\n        }\r\n\r\n        public bool? CreateAndOpenDialog(object dataContext)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public void RestoreWindow()\r\n        {\r\n\r\n        }\r\n\r\n        public void Show(object dataContext)\r\n        {\r\n\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/_TestTools/PlayniteTests.cs",
    "content": "﻿using Moq;\r\nusing Playnite.API;\r\nusing Playnite.Metadata;\r\nusing Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    public static class TestPaths\r\n    {\r\n        public static string TestAppDir => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, \"TestApp\");\r\n        public const string TestAppExeName = \"TestApp.exe\";\r\n        public static string TestAppExePath => Path.Combine(TestAppDir, TestAppExeName);\r\n        public const string TestAppAppInfoName = \"appinfo.json\";\r\n        public static string TestAppAppInfoPath => Path.Combine(TestAppDir, TestAppAppInfoName);\r\n    }\r\n\r\n    public static class PlayniteTests\r\n    {\r\n        private static readonly string randomStringChars = \"ABCDEFGHIJKLMNOPQRSTYVWXZabcdefghijklmnopqrstyvwxz0123456789\";\r\n        private static readonly Random randomStringRandom = new Random();\r\n\r\n        public static string ResourcesPath => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, \"Resources\");\r\n\r\n        public static string TempPath\r\n        {\r\n            get\r\n            {\r\n                var path = Path.Combine(Path.GetTempPath(), \"playnite_unittests\");\r\n                if (!Directory.Exists(path))\r\n                {\r\n                    Directory.CreateDirectory(path);\r\n                }\r\n\r\n                return path;\r\n            }\r\n        }\r\n\r\n        private static Random random = new Random();\r\n\r\n        public static MetadataFile GenerateFakeFile(string directory)\r\n        {\r\n            var file = new byte[20];\r\n            random.NextBytes(file);\r\n            var fileName = Guid.NewGuid().ToString() + \".file\";\r\n            var filePath = Path.Combine(directory, fileName);\r\n            File.WriteAllBytes(filePath, file);\r\n            return new MetadataFile(fileName, file);\r\n        }\r\n\r\n        public static MetadataFile GenerateFakeFile()\r\n        {\r\n            var file = new byte[20];\r\n            random.NextBytes(file);\r\n            var fileName = Guid.NewGuid().ToString() + \".file\";\r\n            return new MetadataFile(fileName, file);\r\n        }\r\n\r\n        public static void SetEntryAssembly(Assembly assembly)\r\n        {\r\n            AppDomainManager manager = new AppDomainManager();\r\n            FieldInfo entryAssemblyfield = manager.GetType().GetField(\"m_entryAssembly\", BindingFlags.Instance | BindingFlags.NonPublic);\r\n            entryAssemblyfield.SetValue(manager, assembly);\r\n\r\n            AppDomain domain = AppDomain.CurrentDomain;\r\n            FieldInfo domainManagerField = domain.GetType().GetField(\"_domainManager\", BindingFlags.Instance | BindingFlags.NonPublic);\r\n            domainManagerField.SetValue(domain, manager);\r\n        }\r\n\r\n        public static Mock<IPlayniteAPI> GetTestingApi()\r\n        {\r\n            var api = new Mock<IPlayniteAPI>();\r\n            var notification = new Mock<INotificationsAPI>();\r\n            api.Setup(a => a.Paths).Returns(new PlaynitePathsAPI());\r\n            api.Setup(a => a.ApplicationInfo).Returns(new PlayniteInfoAPI());\r\n            api.Setup(a => a.Resources).Returns(new ResourceProvider());\r\n            api.Setup(a => a.Notifications).Returns(notification.Object);\r\n            return api;\r\n        }\r\n\r\n        public static string GetRandomString(int length)\r\n        {\r\n            if (length <= 0)\r\n            {\r\n                throw new ArgumentException(\"0 is not a valid length\");\r\n            }\r\n\r\n            var randomSetLeng = randomStringChars.Length - 1;\r\n            var result = new StringBuilder(length);\r\n            lock (randomStringRandom)\r\n            {\r\n                for (int i = 0; i < length; i++)\r\n                {\r\n                    result.Append(randomStringChars[randomStringRandom.Next(0, randomSetLeng)]);\r\n                }\r\n\r\n                return result.ToString();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/_TestTools/TestAppTools.cs",
    "content": "﻿using Playnite.Emulators;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    public class TestAppTools\r\n    {\r\n        public const string PlatformSpecId = \"test_app_platform\";\r\n\r\n        public static EmulatorDefinition GetEmulatorDefitionObj()\r\n        {\r\n            return new EmulatorDefinition\r\n            {\r\n                Id = \"testApp\",\r\n                Name = \"Test App\",\r\n                Profiles = new List<EmulatorDefinitionProfile>\r\n                {\r\n                    new EmulatorDefinitionProfile\r\n                    {\r\n                        ImageExtensions = new List<string> { \"iso\", \"mp3\", \"zip\" },\r\n                        Name = \"default\",\r\n                        StartupExecutable = @\"^TestApp\\.exe$\",\r\n                        StartupArguments = \"some args\"\r\n                    }\r\n                }\r\n            };\r\n        }\r\n\r\n        public static Emulator GetEmulatorObj()\r\n        {\r\n            return new Emulator\r\n            {\r\n                Name = \"Test App\",\r\n                CustomProfiles = new ObservableCollection<CustomEmulatorProfile>\r\n                {\r\n                    new CustomEmulatorProfile\r\n                    {\r\n                        Name = \"test profile\",\r\n                        Arguments = \"{ImagePath}\",\r\n                        Executable = \"TestPath.exe\",\r\n                        ImageExtensions = new List<string> { \"iso\", \"mp3\", \"zip\" }\r\n                    }\r\n                }\r\n            };\r\n        }\r\n\r\n        public static Platform GetPlatformObj()\r\n        {\r\n            return new Platform\r\n            {\r\n                Name = \"Test App platform\",\r\n                SpecificationId = PlatformSpecId\r\n            };\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/_TestTools/TestDateTimes.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    public class TestDateTimes : DateTimes.IDateTimes\r\n    {\r\n        public DateTime Now { get; set; }\r\n        public DateTime Today { get; set; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/_TestTools/TestEmulationDatabase.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Playnite.Emulators;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    public class TestEmulationDatabaseReader : EmulationDatabase.IEmulationDatabaseReader\r\n    {\r\n        private readonly Func<string, IEnumerable<DatGame>> getByCrc;\r\n        private readonly Func<string, IEnumerable<DatGame>> getByRomName;\r\n        private readonly Func<string, IEnumerable<DatGame>> getByRomNamePartial;\r\n        private readonly Func<string, IEnumerable<DatGame>> getBySerial;\r\n\r\n        public string DatabaseName { get; internal set; }\r\n\r\n        public TestEmulationDatabaseReader(\r\n            string databaseName,\r\n            Func<string, IEnumerable<DatGame>> getByCrc,\r\n            Func<string, IEnumerable<DatGame>> getByRomName,\r\n            Func<string, IEnumerable<DatGame>> getByRomNamePartial,\r\n            Func<string, IEnumerable<DatGame>> getBySerial)\r\n        {\r\n            DatabaseName = databaseName;\r\n            this.getByCrc = getByCrc;\r\n            this.getByRomName = getByRomName;\r\n            this.getByRomNamePartial = getByRomNamePartial;\r\n            this.getBySerial = getBySerial;\r\n        }\r\n\r\n        public void Dispose()\r\n        {\r\n        }\r\n\r\n        public IEnumerable<DatGame> GetByCrc(string checksum)\r\n        {\r\n            return getByCrc(checksum);\r\n        }\r\n\r\n        public IEnumerable<DatGame> GetByRomName(string romName)\r\n        {\r\n            return getByRomName(romName);\r\n        }\r\n\r\n        public IEnumerable<DatGame> GetByRomNamePartial(string romNamePart)\r\n        {\r\n            return getByRomNamePartial(romNamePart);\r\n        }\r\n\r\n        public IEnumerable<DatGame> GetBySerial(string serial)\r\n        {\r\n            return getBySerial(serial);\r\n        }\r\n\r\n        public void ClearStatementCache()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/_TestTools/TestPlayniteApplication.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing Playnite.API;\r\nusing Playnite.SDK;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    public class TestPlayniteApplication : PlayniteApplication\r\n    {\r\n        public TestPlayniteApplication()\r\n        {\r\n        }\r\n\r\n        public override PlayniteAPI GetApiInstance(ExtensionManifest pluginOwner)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override PlayniteAPI GetApiInstance()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override void InitializeNative()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override void InstantiateApp()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override void Minimize()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override void Restart(bool saveSettings)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override void Restart(CmdLineOptions options, bool saveSettings)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override void Restore()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override void ShowWindowsNotification(string title, string body, Action action)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override bool Startup()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override void SwitchAppMode(ApplicationMode mode)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override void ConfigureViews()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/_TestTools/TestResourceProvider.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    public class TestResourceProvider : IResourceProvider\r\n    {\r\n        private readonly ResourceDictionary engStringResource;\r\n\r\n        public static readonly TestResourceProvider Instance = new TestResourceProvider();\r\n\r\n        public TestResourceProvider()\r\n        {\r\n            var engSource = Path.Combine(PlaynitePaths.LocalizationsPath, PlaynitePaths.EngLocSourceFileName);\r\n            engStringResource = Xaml.FromFile<ResourceDictionary>(engSource);\r\n        }\r\n\r\n        public object GetResource(string key)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public string GetString(string key)\r\n        {\r\n            return engStringResource[key]?.ToString() ?? key;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/_TestTools/TestsSetupClass.cs",
    "content": "﻿using NUnit.Framework;\r\nusing Playnite;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace Playnite.Tests\r\n{\r\n    [SetUpFixture]\r\n    public class TestsSetupClass\r\n    {\r\n        public static void OneTimeSetUp()\r\n        {\r\n            // To register pack:// scheme\r\n            var current = new Application();\r\n            FileSystem.CreateDirectory(PlayniteTests.TempPath, true);\r\n            NLogLogger.IsTraceEnabled = true;\r\n            PlayniteSettings.ConfigureLogger();\r\n            SDK.Data.Serialization.Init(new DataSerializer());\r\n            SDK.Data.SQLite.Init((a, b) => new Sqlite(a, b));\r\n            ResourceProvider.SetGlobalProvider(TestResourceProvider.Instance);\r\n            Assert.AreEqual(\"Filters\", ResourceProvider.GetString(LOC.Filters));\r\n        }\r\n\r\n        [OneTimeSetUp]\r\n        public void GlobalSetup()\r\n        {\r\n            PlayniteTests.SetEntryAssembly(Assembly.GetExecutingAssembly());\r\n            OneTimeSetUp();\r\n        }\r\n\r\n        [OneTimeTearDown]\r\n        public void GlobalTeardown()\r\n        {\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Tests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"Castle.Core\" version=\"4.3.1\" targetFramework=\"net462\" />\r\n  <package id=\"DynamicLanguageRuntime\" version=\"1.2.1\" targetFramework=\"net462\" />\r\n  <package id=\"LiteDB\" version=\"4.1.4\" targetFramework=\"net462\" />\r\n  <package id=\"Moq\" version=\"4.10.1\" targetFramework=\"net462\" />\r\n  <package id=\"Newtonsoft.Json\" version=\"10.0.3\" targetFramework=\"net462\" />\r\n  <package id=\"NUnit\" version=\"3.13.2\" targetFramework=\"net462\" />\r\n  <package id=\"NUnit3TestAdapter\" version=\"3.17.0\" targetFramework=\"net462\" />\r\n  <package id=\"System.IO.Abstractions\" version=\"2.1.0.227\" targetFramework=\"net462\" />\r\n  <package id=\"System.IO.Abstractions.TestingHelpers\" version=\"2.1.0.227\" targetFramework=\"net462\" />\r\n  <package id=\"System.Runtime.CompilerServices.Unsafe\" version=\"4.5.3\" targetFramework=\"net462\" />\r\n  <package id=\"System.Threading.Tasks.Extensions\" version=\"4.5.1\" targetFramework=\"net462\" />\r\n  <package id=\"System.ValueTuple\" version=\"4.5.0\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Tests/Playnite.Toolbox.Tests/ExtensionsTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing Playnite.SDK;\r\n\r\nnamespace Playnite.Toolbox.Tests\r\n{\r\n    [TestFixture]\r\n    public class ExtensionsTests\r\n    {\r\n        [Test]\r\n        public void ConvertToValidIdentifierNameTest()\r\n        {\r\n            Assert.AreEqual(\"itchio2\", Extensions.ConvertToValidIdentifierName(\"itch.io@$#% 2\"));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Toolbox.Tests/PathsTests.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing NUnit.Framework;\r\nusing Playnite.Common;\r\n\r\nnamespace Playnite.Toolbox.Tests\r\n{\r\n    [TestFixture]\r\n    public class PathsTests\r\n    {\r\n        [Test]\r\n        public void GetNextBackupFolderTest()\r\n        {\r\n            using (var temp = TempDirectory.Create())\r\n            {\r\n                var backupPath = Paths.GetNextBackupFolder(temp.TempPath);\r\n                Assert.AreEqual(\"backup_0\", Path.GetFileName(backupPath));\r\n                Directory.CreateDirectory(backupPath);\r\n                backupPath = Paths.GetNextBackupFolder(temp.TempPath);\r\n                Assert.AreEqual(\"backup_1\", Path.GetFileName(backupPath));\r\n                Directory.CreateDirectory(Path.Combine(temp.TempPath, \"backup_20\"));\r\n                backupPath = Paths.GetNextBackupFolder(temp.TempPath);\r\n                Assert.AreEqual(\"backup_21\", Path.GetFileName(backupPath));\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Toolbox.Tests/Playnite.Toolbox.Tests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props\" Condition=\"Exists('..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props')\" />\r\n  <Import Project=\"..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props\" Condition=\"Exists('..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props')\" />\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{256026D4-A05D-438C-BD11-2D3FBADB2B4C}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>Playnite.Toolbox.Tests</RootNamespace>\r\n    <AssemblyName>Playnite.Toolbox.Tests</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">15.0</VisualStudioVersion>\r\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\r\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\r\n    <IsCodedUITest>False</IsCodedUITest>\r\n    <TestProjectType>UnitTest</TestProjectType>\r\n    <NuGetPackageImportStamp>\r\n    </NuGetPackageImportStamp>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\r\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Castle.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\Castle.Core.4.3.1\\lib\\net45\\Castle.Core.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Moq, Version=4.10.0.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\Moq.4.10.1\\lib\\net45\\Moq.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"nunit.framework, Version=3.13.2.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\NUnit.3.13.2\\lib\\net45\\nunit.framework.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Configuration\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Runtime.CompilerServices.Unsafe, Version=4.0.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\System.Runtime.CompilerServices.Unsafe.4.5.0\\lib\\netstandard2.0\\System.Runtime.CompilerServices.Unsafe.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\System.Threading.Tasks.Extensions.4.5.1\\lib\\netstandard2.0\\System.Threading.Tasks.Extensions.dll</HintPath>\r\n    </Reference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"PathsTests.cs\" />\r\n    <Compile Include=\"ExtensionsTests.cs\" />\r\n    <Compile Include=\"ThemesTests.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"app.config\" />\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\..\\PlayniteSDK\\Playnite.SDK.csproj\">\r\n      <Project>{19bc9097-5705-4352-90e2-99f0c63230d0}</Project>\r\n      <Name>Playnite.SDK</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\..\\Playnite\\Playnite.csproj\">\r\n      <Project>{ad271e73-8a13-4c4e-bfdc-3076646b59e3}</Project>\r\n      <Name>Playnite</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\..\\Tools\\Playnite.Toolbox\\Playnite.Toolbox.csproj\">\r\n      <Project>{9c73c47e-64c2-4691-a602-a8463185e232}</Project>\r\n      <Name>Playnite.Toolbox</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Resources\\Changelog\\1.1.0-1.2.0.txt\">\r\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Resources\\Changelog\\1.2.0-1.3.0.txt\">\r\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Resources\\Changelog\\1.3.0-1.4.0.txt\">\r\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\r\n    <PropertyGroup>\r\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\r\n    </PropertyGroup>\r\n    <Error Condition=\"!Exists('..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\NUnit3TestAdapter.3.17.0\\build\\net35\\NUnit3TestAdapter.props'))\" />\r\n    <Error Condition=\"!Exists('..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\packages\\NUnit.3.13.2\\build\\NUnit.props'))\" />\r\n  </Target>\r\n  <PropertyGroup>\r\n    <PostBuildEvent>xcopy \"$(SolutionDir)\\Tools\\Playnite.Toolbox\\Templates\\Themes\\Changelog\" \"$(TargetDir)\\Templates\\Themes\\Changelog\\\" /e /y</PostBuildEvent>\r\n  </PropertyGroup>\r\n</Project>"
  },
  {
    "path": "source/Tests/Playnite.Toolbox.Tests/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n[assembly: AssemblyTitle(\"Playnite.Toolbox.Tests\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"Playnite.Toolbox.Tests\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2019\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n[assembly: ComVisible(false)]\r\n\r\n[assembly: Guid(\"256026d4-a05d-438c-bd11-2d3fbadb2b4c\")]\r\n\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "source/Tests/Playnite.Toolbox.Tests/Resources/Changelog/1.1.0-1.2.0.txt",
    "content": "﻿M\tsource/Playnite.DesktopApp/Themes/Desktop/Default/1.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/2.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/3.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/10.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/11.xaml"
  },
  {
    "path": "source/Tests/Playnite.Toolbox.Tests/Resources/Changelog/1.2.0-1.3.0.txt",
    "content": "﻿M\tsource/Playnite.DesktopApp/Themes/Desktop/Default/1.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/4.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/5.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/12.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/13.xaml"
  },
  {
    "path": "source/Tests/Playnite.Toolbox.Tests/Resources/Changelog/1.3.0-1.4.0.txt",
    "content": "﻿M\tsource/Playnite.DesktopApp/Themes/Desktop/Default/1.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/6.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/7.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/14.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/15.xaml"
  },
  {
    "path": "source/Tests/Playnite.Toolbox.Tests/ThemesTests.cs",
    "content": "﻿using NUnit.Framework;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.IO;\r\nusing Playnite.SDK;\r\n\r\nnamespace Playnite.Toolbox.Tests\r\n{\r\n    [TestFixture]\r\n    public class ThemesTests\r\n    {\r\n        [Test]\r\n        public void GetThemeChangelogTest()\r\n        {\r\n            var changelogPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, \"Resources\", \"Changelog\");\r\n            var changelog = Themes.GetThemeChangelog(new Version(\"1.1.0\"), ApplicationMode.Desktop, changelogPath);\r\n            Assert.AreEqual(7, changelog.Count);\r\n            StringAssert.EndsWith(\"2.xaml\", changelog[0].Path);\r\n            StringAssert.EndsWith(\"3.xaml\", changelog[1].Path);\r\n            StringAssert.EndsWith(\"4.xaml\", changelog[2].Path);\r\n            StringAssert.EndsWith(\"5.xaml\", changelog[3].Path);\r\n            StringAssert.EndsWith(\"1.xaml\", changelog[4].Path);\r\n            StringAssert.EndsWith(\"6.xaml\", changelog[5].Path);\r\n            StringAssert.EndsWith(\"7.xaml\", changelog[6].Path);\r\n\r\n            changelog = Themes.GetThemeChangelog(new Version(\"1.2.0\"), ApplicationMode.Desktop, changelogPath);\r\n            Assert.AreEqual(5, changelog.Count);\r\n\r\n            changelog = Themes.GetThemeChangelog(new Version(\"1.3.0\"), ApplicationMode.Desktop, changelogPath);\r\n            Assert.AreEqual(3, changelog.Count);\r\n\r\n            changelog = Themes.GetThemeChangelog(new Version(\"1.2.0\"), ApplicationMode.Fullscreen, changelogPath);\r\n            Assert.AreEqual(4, changelog.Count);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/Playnite.Toolbox.Tests/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n  <runtime>\r\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.4.0\" newVersion=\"4.1.4.0\" />\r\n      </dependentAssembly>\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Runtime.CompilerServices.Unsafe\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.0.4.0\" newVersion=\"4.0.4.0\" />\r\n      </dependentAssembly>\r\n    </assemblyBinding>\r\n  </runtime>\r\n</configuration>"
  },
  {
    "path": "source/Tests/Playnite.Toolbox.Tests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"Castle.Core\" version=\"4.3.1\" targetFramework=\"net462\" />\r\n  <package id=\"Moq\" version=\"4.10.1\" targetFramework=\"net462\" />\r\n  <package id=\"NUnit\" version=\"3.13.2\" targetFramework=\"net462\" />\r\n  <package id=\"NUnit3TestAdapter\" version=\"3.17.0\" targetFramework=\"net462\" />\r\n  <package id=\"System.Runtime.CompilerServices.Unsafe\" version=\"4.5.0\" targetFramework=\"net462\" />\r\n  <package id=\"System.Threading.Tasks.Extensions\" version=\"4.5.1\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Tests/TestApp/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n<configuration>\r\n    <startup> \r\n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\" />\r\n    </startup>\r\n</configuration>"
  },
  {
    "path": "source/Tests/TestApp/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Resources;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\nusing System.Windows;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"TestApp\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"TestApp\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2022\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n//In order to begin building localizable applications, set\r\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\r\n//inside a <PropertyGroup>.  For example, if you are using US english\r\n//in your source files, set the <UICulture> to en-US.  Then uncomment\r\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\r\n//the line below to match the UICulture setting in the project file.\r\n\r\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\r\n\r\n\r\n[assembly: ThemeInfo(\r\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\r\n                                     //(used if a resource is not found in the page,\r\n                                     // or application resource dictionaries)\r\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\r\n                                              //(used if a resource is not found in the page,\r\n                                              // app, or any theme specific resource dictionaries)\r\n)]\r\n\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "source/Tests/TestApp/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace TestApp.Properties\r\n{\r\n\r\n\r\n    /// <summary>\r\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\r\n    /// </summary>\r\n    // This class was auto-generated by the StronglyTypedResourceBuilder\r\n    // class via a tool like ResGen or Visual Studio.\r\n    // To add or remove a member, edit your .ResX file then rerun ResGen\r\n    // with the /str option, or rebuild your VS project.\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\r\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    internal class Resources\r\n    {\r\n\r\n        private static global::System.Resources.ResourceManager resourceMan;\r\n\r\n        private static global::System.Globalization.CultureInfo resourceCulture;\r\n\r\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        internal Resources()\r\n        {\r\n        }\r\n\r\n        /// <summary>\r\n        ///   Returns the cached ResourceManager instance used by this class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Resources.ResourceManager ResourceManager\r\n        {\r\n            get\r\n            {\r\n                if ((resourceMan == null))\r\n                {\r\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"TestApp.Properties.Resources\", typeof(Resources).Assembly);\r\n                    resourceMan = temp;\r\n                }\r\n                return resourceMan;\r\n            }\r\n        }\r\n\r\n        /// <summary>\r\n        ///   Overrides the current thread's CurrentUICulture property for all\r\n        ///   resource lookups using this strongly typed resource class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Globalization.CultureInfo Culture\r\n        {\r\n            get\r\n            {\r\n                return resourceCulture;\r\n            }\r\n            set\r\n            {\r\n                resourceCulture = value;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/TestApp/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "source/Tests/TestApp/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace TestApp.Properties\r\n{\r\n\r\n\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"11.0.0.0\")]\r\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase\r\n    {\r\n\r\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\r\n\r\n        public static Settings Default\r\n        {\r\n            get\r\n            {\r\n                return defaultInstance;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/TestApp/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\r\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\r\n  <Profiles>\r\n    <Profile Name=\"(Default)\" />\r\n  </Profiles>\r\n  <Settings />\r\n</SettingsFile>"
  },
  {
    "path": "source/Tests/TestApp/TestApp.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing Newtonsoft.Json;\r\nusing Playnite.Common;\r\nusing Playnite.SDK;\r\n\r\nnamespace TestApp\r\n{\r\n    public class TestApp\r\n    {\r\n        [STAThread]\r\n        public static int Main(string[] args)\r\n        {\r\n            try\r\n            {\r\n                var appInfoFile = Path.Combine(Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory), \"appinfo.json\");\r\n                FileSystem.DeleteFile(appInfoFile);\r\n                var appInfo = new TestAppProcInfo\r\n                {\r\n                    WorkingDir = Environment.CurrentDirectory,\r\n                    Arguments = args\r\n                };\r\n\r\n                FileSystem.WriteStringToFile(appInfoFile, JsonConvert.SerializeObject(appInfo, Formatting.Indented));\r\n                return 0;\r\n            }\r\n            catch\r\n            {\r\n                return 1;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/TestApp/TestApp.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{94B6E43B-3907-4C1B-A804-AF1D1ADEF286}</ProjectGuid>\r\n    <OutputType>WinExe</OutputType>\r\n    <RootNamespace>TestApp</RootNamespace>\r\n    <AssemblyName>TestApp</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r\n    <WarningLevel>4</WarningLevel>\r\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\r\n    <Deterministic>true</Deterministic>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <LangVersion>7.3</LangVersion>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <LangVersion>7.3</LangVersion>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <StartupObject>TestApp.TestApp</StartupObject>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <ApplicationManifest>app.manifest</ApplicationManifest>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\Newtonsoft.Json.10.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Web\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xaml\">\r\n      <RequiredTargetFramework>4.0</RequiredTargetFramework>\r\n    </Reference>\r\n    <Reference Include=\"WindowsBase\" />\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"..\\..\\Playnite\\Common\\Extensions\\StringExtensions.cs\">\r\n      <Link>Shared\\StringExtensions.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Common\\FileSystem.cs\">\r\n      <Link>Shared\\FileSystem.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Common\\Paths.cs\">\r\n      <Link>Shared\\Paths.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Fileapi.cs\">\r\n      <Link>Shared\\Native\\Fileapi.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Gdi32.cs\">\r\n      <Link>Shared\\Native\\Gdi32.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Kernel32.cs\">\r\n      <Link>Shared\\Native\\Kernel32.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Ntdll.cs\">\r\n      <Link>Shared\\Native\\Ntdll.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Powrprof.cs\">\r\n      <Link>Shared\\Native\\Powrprof.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Processthreadsapi.cs\">\r\n      <Link>Shared\\Native\\Processthreadsapi.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Psapi.cs\">\r\n      <Link>Shared\\Native\\Psapi.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Shell32.cs\">\r\n      <Link>Shared\\Native\\Shell32.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Shlwapi.cs\">\r\n      <Link>Shared\\Native\\Shlwapi.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\User32.cs\">\r\n      <Link>Shared\\Native\\User32.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Winbase.cs\">\r\n      <Link>Shared\\Native\\Winbase.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Windef.cs\">\r\n      <Link>Shared\\Native\\Windef.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\WinError.cs\">\r\n      <Link>Shared\\Native\\WinError.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Wingdi.cs\">\r\n      <Link>Shared\\Native\\Wingdi.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Winnt.cs\">\r\n      <Link>Shared\\Native\\Winnt.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Wintrust.cs\">\r\n      <Link>Shared\\Native\\Wintrust.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\winuser.cs\">\r\n      <Link>Shared\\Native\\winuser.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"TestApp.cs\" />\r\n    <Compile Include=\"TestAppProcInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\r\n      <SubType>Code</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DesignTime>True</DesignTime>\r\n      <DependentUpon>Resources.resx</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DependentUpon>Settings.settings</DependentUpon>\r\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\r\n    </Compile>\r\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\r\n      <Generator>ResXFileCodeGenerator</Generator>\r\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\r\n    </EmbeddedResource>\r\n    <None Include=\"app.manifest\" />\r\n    <None Include=\"packages.config\" />\r\n    <None Include=\"Properties\\Settings.settings\">\r\n      <Generator>SettingsSingleFileGenerator</Generator>\r\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"App.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\..\\PlayniteSDK\\Playnite.SDK.csproj\">\r\n      <Project>{19bc9097-5705-4352-90e2-99f0c63230d0}</Project>\r\n      <Name>Playnite.SDK</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/Tests/TestApp/TestAppProcInfo.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace TestApp\r\n{\r\n    public class TestAppProcInfo\r\n    {\r\n        public string WorkingDir { get; set; }\r\n        public string[] Arguments { get; set; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/TestApp/app.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n  <assemblyIdentity version=\"1.0.0.0\" name=\"Playnite.DesktopApp\"/>\r\n  <trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\">\r\n    <security>\r\n      <requestedPrivileges xmlns=\"urn:schemas-microsoft-com:asm.v3\">\r\n        <requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\r\n      </requestedPrivileges>\r\n    </security>\r\n  </trustInfo>\r\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\r\n    <application>\r\n      <!-- Windows 7 -->\r\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" />\r\n      <!-- Windows 8 -->\r\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" />\r\n      <!-- Windows 8.1 -->\r\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" />\r\n      <!-- Windows 10 -->\r\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />\r\n    </application>\r\n  </compatibility>\r\n</assembly>\r\n"
  },
  {
    "path": "source/Tests/TestApp/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"Newtonsoft.Json\" version=\"10.0.3\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Tests/TestGameLibrary/BuildCopyExclude.txt",
    "content": "PlayniteSDK.dll\r\nPlayniteSDK.pdb\r\nPlayniteSDK.xml\r\nLiteDB.dll\r\nNewtonsoft.Json.dll\r\nNewtonsoft.Json.xml"
  },
  {
    "path": "source/Tests/TestGameLibrary/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"TestGameLibrary\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"TestGameLibrary\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2018\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"db0e5b51-2960-4869-899d-5e0c65a697a6\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "source/Tests/TestGameLibrary/TestGameLibrary.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace TestGameLibrary\r\n{\r\n    public class TestGameLibrary : LibraryPlugin\r\n    {\r\n        public override Guid Id { get; } = Guid.Parse(\"D625A3B7-1AA4-41CB-9CD7-74448D28E99B\");\r\n\r\n        public override string Name { get; } = \"Test Library\";\r\n\r\n        public override string LibraryIcon { get; }\r\n\r\n        public override LibraryClient Client { get; }\r\n\r\n        public TestGameLibrary(IPlayniteAPI api) : base (api)\r\n        {\r\n            LibraryIcon = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @\"Resources\\installer.ico\");\r\n        }\r\n\r\n        public override ISettings GetSettings(bool firstRunSettings)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public override UserControl GetSettingsView(bool firstRunView)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public override IEnumerable<GameMetadata> GetGames(LibraryGetGamesArgs args)\r\n        {\r\n            return new List<GameMetadata>()\r\n            {\r\n                new GameMetadata()\r\n                {\r\n                    Name = \"Notepad\",\r\n                    GameId = \"notepad\",\r\n                    IsInstalled = true,\r\n                    Icon = new MetadataFile(@\"c:\\Windows\\notepad.exe\")\r\n                },\r\n                new GameMetadata()\r\n                {\r\n                    Name = \"Calculator\",\r\n                    GameId = \"calc\",\r\n                    IsInstalled = true,\r\n                    Icon = new MetadataFile(@\"https://playnite.link/applogo.png\"),\r\n                    BackgroundImage =  new MetadataFile(@\"https://playnite.link/applogo.png\")\r\n                },\r\n                new GameMetadata()\r\n                {\r\n                    Name = \"Paint\",\r\n                    GameId = \"mspaint\",\r\n                    IsInstalled = true,\r\n                    Icon = new MetadataFile(LibraryIcon)\r\n                },\r\n                new GameMetadata()\r\n                {\r\n                    Name = \"WordPad\",\r\n                    GameId = \"write\",\r\n                    IsInstalled = true,\r\n                    Icon = new MetadataFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @\"Resources\\icon.tga\"))\r\n                }\r\n            };\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/TestGameLibrary/TestGameLibrary.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{DB0E5B51-2960-4869-899D-5E0C65A697A6}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>TestGameLibrary</RootNamespace>\r\n    <AssemblyName>TestGameLibrary</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"TestGameLibrary.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"extension.yaml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"Resources\\icon.tga\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\..\\PlayniteSDK\\Playnite.SDK.csproj\">\r\n      <Project>{19bc9097-5705-4352-90e2-99f0c63230d0}</Project>\r\n      <Name>Playnite.SDK</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Resources\\installer.ico\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/Tests/TestGameLibrary/extension.yaml",
    "content": "﻿Id: Test_GameLibrary\r\nName: Test GameLibrary\r\nAuthor: Josef Nemec\r\nVersion: 1.0\r\nModule: TestGameLibrary.dll\r\nType: GameLibrary"
  },
  {
    "path": "source/Tests/TestMetadataPlugin/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"TestMetadataPlugin\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"TestMetadataPlugin\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2018\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"afe32bf4-e669-4e3f-8363-1d32beb158f6\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "source/Tests/TestMetadataPlugin/TestMetadataPlugin.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace TestPlugin\r\n{\r\n    public class TestMetadataProvider : OnDemandMetadataProvider\r\n    {\r\n        public override List<MetadataField> AvailableFields => new List<MetadataField>\r\n        {\r\n            MetadataField.Links,\r\n            MetadataField.Platform,\r\n            MetadataField.Region,\r\n            MetadataField.Features\r\n        };\r\n\r\n        public override IEnumerable<Link> GetLinks(GetMetadataFieldArgs args)\r\n        {\r\n            yield return new Link(\"Playnite website\", \"https://playnite.link/\");\r\n            yield return null;\r\n        }\r\n\r\n        public override IEnumerable<MetadataProperty> GetPlatforms(GetMetadataFieldArgs args)\r\n        {\r\n            yield return new MetadataSpecProperty(\"pc_windows\");\r\n            yield return new MetadataSpecProperty(\"Sony PlayStation Vita\");\r\n            yield return new MetadataNameProperty(\"Microsoft Xbox 360\");\r\n        }\r\n\r\n        public override IEnumerable<MetadataProperty> GetRegions(GetMetadataFieldArgs args)\r\n        {\r\n            yield return new MetadataSpecProperty(\"newZealand\");\r\n            yield return new MetadataSpecProperty(\"hongKong\");\r\n        }\r\n\r\n        public override IEnumerable<MetadataProperty> GetFeatures(GetMetadataFieldArgs args)\r\n        {\r\n            yield return new MetadataNameProperty(\"Test Feature\");\r\n        }\r\n    }\r\n\r\n    public class TestMetadataPlugin : MetadataPlugin\r\n    {\r\n        public override string Name => \"TestMetadataPlugin\";\r\n        public override Guid Id { get; } = Guid.Parse(\"A51194CD-AA44-47A0-8B89-D1FD544DD9C9\");\r\n        public override List<MetadataField> SupportedFields => new List<MetadataField>\r\n        {\r\n            MetadataField.Links,\r\n            MetadataField.Platform,\r\n            MetadataField.Region,\r\n            MetadataField.Features\r\n        };\r\n\r\n        public TestMetadataPlugin(IPlayniteAPI playniteAPI) : base(playniteAPI)\r\n        {\r\n        }\r\n\r\n        public override OnDemandMetadataProvider GetMetadataProvider(MetadataRequestOptions options)\r\n        {\r\n            return new TestMetadataProvider();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/TestMetadataPlugin/TestMetadataPlugin.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{AFE32BF4-E669-4E3F-8363-1D32BEB158F5}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>TestMetadataPlugin</RootNamespace>\r\n    <AssemblyName>TestMetadataPlugin</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Drawing\" />\r\n    <Reference Include=\"System.Xaml\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"WindowsBase\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"TestMetadataPlugin.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\..\\PlayniteSDK\\Playnite.SDK.csproj\">\r\n      <Project>{19bc9097-5705-4352-90e2-99f0c63230d0}</Project>\r\n      <Name>Playnite.SDK</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"extension.yaml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/Tests/TestMetadataPlugin/extension.yaml",
    "content": "﻿Id: Test_Metadata_Plugin\r\nName: Test Metadata Plugin\r\nAuthor: Josef Nemec\r\nVersion: 1.0\r\nModule: TestMetadataPlugin.dll\r\nType: MetadataProvider"
  },
  {
    "path": "source/Tests/TestPlugin/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"TestPlugin\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"TestPlugin\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2018\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"afe32bf4-e669-4e3f-8363-1d32beb158f6\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "source/Tests/TestPlugin/TestPlugin.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Data;\r\nusing Playnite.SDK.Events;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.Globalization;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Media;\r\n\r\nnamespace TestPlugin\r\n{\r\n    public class DefaultSearchContext : SearchContext\r\n    {\r\n        public DefaultSearchContext()\r\n        {\r\n            Delay = 500;\r\n            Description = \"Default search description\";\r\n            Label = \"test search\";\r\n            Hint = \"search hint goes here\";\r\n        }\r\n\r\n        public override IEnumerable<SearchItem> GetSearchResults(GetSearchResultsArgs args)\r\n        {\r\n            var game = API.Instance.Database.Games.First();\r\n            yield return new GameSearchItem(\r\n                game,\r\n                \"test\",\r\n                () => API.Instance.Dialogs.ShowErrorMessage(game.Name));\r\n\r\n            yield return new SearchItem($\"test plugin: {args.SearchTerm}\", new SearchItemAction(\"Blow up\", () => { }))\r\n            {\r\n                Description = \"test plugin description\",\r\n                Icon = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), \"Resources\", \"icon.png\")\r\n            };\r\n\r\n            yield return new SearchItem($\"test plugin #2: {args.SearchTerm}\", new SearchItemAction(\"Blow up\", () => { }))\r\n            {\r\n                Description = \"test plugin description\",\r\n                SecondaryAction = new SearchItemAction(\"blow up more\", () => { })\r\n            };\r\n\r\n            yield return new SearchItem($\"icon test\", new SearchItemAction(\"Blow up\", () => {\r\n                API.Instance.Database.ImportGame(new GameMetadata() { Name = \"# import from search\" });\r\n            }))\r\n            {\r\n                Icon = @\"https://playnite.link/applogo.png\",\r\n                Description = \"http icon test\"\r\n            };\r\n        }\r\n    }\r\n\r\n    public class SlowSearchContext : SearchContext\r\n    {\r\n        public SlowSearchContext()\r\n        {\r\n            Delay = 500;\r\n            Description = \"Slow search description\";\r\n        }\r\n\r\n        public override IEnumerable<SearchItem> GetSearchResults(GetSearchResultsArgs args)\r\n        {\r\n            if (string.IsNullOrWhiteSpace(args.SearchTerm))\r\n            {\r\n                yield break;\r\n            }\r\n\r\n            Thread.Sleep(3000);\r\n            if (args.CancelToken.IsCancellationRequested)\r\n            {\r\n                yield break;\r\n            }\r\n\r\n            yield return new SearchItem($\"slow result: {args.SearchTerm}\", new SearchItemAction(\"Blow up slowly\", () => { }))\r\n            {\r\n                Description = \"test plugin description\",\r\n                Icon = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), \"Resources\", \"icon.png\")\r\n            };\r\n        }\r\n    }\r\n\r\n    public class TestConverter : IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            return value?.ToString() + \" converted\";\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n    }\r\n\r\n    public class TestPlugin : GenericPlugin\r\n    {\r\n        private static ILogger logger = LogManager.GetLogger();\r\n\r\n        public TestPluginSettingsViewModel Settings { get; private set; }\r\n\r\n        public override Guid Id { get; } = Guid.Parse(\"D51194CD-AA44-47A0-8B89-D1FD544DD9C9\");\r\n\r\n        public TestPlugin(IPlayniteAPI api) : base(api)\r\n        {\r\n            Properties = new GenericPluginProperties\r\n            {\r\n                HasSettings = true\r\n            };\r\n\r\n            Settings = new TestPluginSettingsViewModel(this, api);\r\n            AddCustomElementSupport(new AddCustomElementSupportArgs\r\n            {\r\n                ElementList = new List<string> { \"TestUserControl\" },\r\n                SourceName = \"TestPlugin\",\r\n            });\r\n\r\n            AddSettingsSupport(new AddSettingsSupportArgs\r\n            {\r\n                SourceName = \"TestPlugin\",\r\n                SettingsRoot = $\"{nameof(Settings)}.{nameof(Settings.Settings)}\"\r\n            });\r\n\r\n            Searches = new List<SearchSupport>\r\n            {\r\n                new SearchSupport(\"test\", \"Testing plugin search\", new DefaultSearchContext()),\r\n                new SearchSupport(\"slow\", \"Slow plugin search test\", new SlowSearchContext())\r\n            };\r\n\r\n            AddConvertersSupport(new AddConvertersSupportArgs\r\n            {\r\n                Converters = new List<IValueConverter> { new TestConverter() },\r\n                SourceName = \"TestPlugin\",\r\n            });\r\n\r\n            api.Notifications.Add(\"test\", \"some test \", NotificationType.Info);\r\n            api.Notifications.Add(\"test2\", \"some test longer notification that's overlowing to aa lines aa likely\", NotificationType.Error);\r\n        }\r\n\r\n        public override ISettings GetSettings(bool firstRunSettings)\r\n        {\r\n            return Settings;\r\n        }\r\n\r\n        public override UserControl GetSettingsView(bool firstRunView)\r\n        {\r\n            return new TestPluginSettingsView();\r\n        }\r\n\r\n        public override void OnGameInstalled(OnGameInstalledEventArgs args)\r\n        {\r\n            logger.Info($\"TestPluginDev OnGameInstalled {args.Game.Name}\");\r\n        }\r\n\r\n        public override void OnGameStarted(OnGameStartedEventArgs args)\r\n        {\r\n            logger.Info($\"TestPluginDev OnGameStarted {args.Game.Name} {args.StartedProcessId}\");\r\n            logger.Warn(PlayniteApi.ApplicationSettings.CompletionStatus.PlayedStatus.ToString());\r\n        }\r\n\r\n        public override void OnGameStarting(OnGameStartingEventArgs args)\r\n        {\r\n            logger.Info($\"TestPluginDev OnGameStarting {args.Game.Name}\");\r\n            logger.Warn(args.SourceAction?.Name);\r\n        }\r\n\r\n        public override void OnGameStopped(OnGameStoppedEventArgs args)\r\n        {\r\n            logger.Info($\"TestPluginDev OnGameStopped {args.Game.Name}\");\r\n        }\r\n\r\n        public override void OnGameUninstalled(OnGameUninstalledEventArgs args)\r\n        {\r\n            logger.Info($\"TestPluginDev OnGameUninstalled {args.Game.Name}\");\r\n        }\r\n\r\n        public override void OnApplicationStarted(OnApplicationStartedEventArgs args)\r\n        {\r\n            logger.Info(\"TestPluginDev OnApplicationStarted\");\r\n            //CrashTest();\r\n        }\r\n\r\n        public override void OnGameSelected(OnGameSelectedEventArgs args)\r\n        {\r\n            //logger.Warn($\"TestPluginDev OnGameSelected {args.NewValue?.Count}\");\r\n        }\r\n\r\n        public override void OnLibraryUpdated(OnLibraryUpdatedEventArgs args)\r\n        {\r\n        }\r\n\r\n        private async void CrashTest()\r\n        {\r\n            await Task.Delay(100);\r\n            throw new NotImplementedException();\r\n        }\r\n\r\n        public override IEnumerable<MainMenuItem> GetMainMenuItems(GetMainMenuItemsArgs args)\r\n        {\r\n            yield return new MainMenuItem\r\n            {\r\n                Description = \"window test\",\r\n                Action = (_) =>\r\n                {\r\n                    var window = PlayniteApi.Dialogs.CreateWindow(new WindowCreationOptions()\r\n                    {\r\n                        ShowCloseButton = false,\r\n                        ShowMaximizeButton = false\r\n                    }\r\n                    );\r\n                    window.Title = \"window plugin test\";\r\n                    window.Content = new TestPluginSettingsView();\r\n                    window.Owner = PlayniteApi.Dialogs.GetCurrentAppWindow();\r\n                    window.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;\r\n                    window.Height = 640;\r\n                    window.Width = 480;\r\n                    window.ShowDialog();\r\n                }\r\n            };\r\n            yield return new MainMenuItem\r\n            {\r\n                Description = \"-\"\r\n            };\r\n\r\n            yield return new MainMenuItem\r\n            {\r\n                Description = \"serialization test\",\r\n                Action = (_) =>\r\n                {\r\n                    PlayniteApi.Dialogs.ShowErrorMessage(\"test error\");\r\n                }\r\n            };\r\n\r\n            yield return new MainMenuItem\r\n            {\r\n                MenuSection = \"@\",\r\n                Description = \"this is in extension menu\",\r\n                Action = (_) =>\r\n                {\r\n                },\r\n                Icon = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), \"Resources\", \"icon.png\"),\r\n            };\r\n\r\n            yield return new MainMenuItem\r\n            {\r\n                MenuSection = \"@nested|nested2\",\r\n                Description = \"nested test menu menu\",\r\n                Action = (_) =>\r\n                {\r\n                    PlayniteApi.Dialogs.ShowErrorMessage(\"test error from nested\");\r\n                }\r\n            };\r\n\r\n            yield return new MainMenuItem\r\n            {\r\n                MenuSection = \"test|test2\",\r\n                Description = \"filtered item test\",\r\n                Action = (_) =>\r\n                {\r\n                    var filtered = PlayniteApi.MainView.FilteredGames;\r\n                    logger.Warn(filtered.Count.ToString());\r\n                    if (filtered.Count > 2)\r\n                    {\r\n                        PlayniteApi.MainView.SelectGames(filtered.Select(a => a.Id).Take(2));\r\n                    }\r\n                },\r\n                Icon = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), \"Resources\", \"icon.png\"),\r\n            };\r\n        }\r\n\r\n        public override IEnumerable<GameMenuItem> GetGameMenuItems(GetGameMenuItemsArgs args)\r\n        {\r\n            yield return new GameMenuItem\r\n            {\r\n                Description = \"test plugin root test\",\r\n                Action = (_) => PlayniteApi.Dialogs.ShowMessage(\"test plugin root test\"),\r\n                Icon = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), \"Resources\", \"icon.png\"),\r\n            };\r\n            yield return new GameMenuItem\r\n            {\r\n                Description = \"window test\",\r\n                MenuSection = \"test plugin\",\r\n                Action = (_) => PlayniteApi.Dialogs.ShowMessage(\"window test\")\r\n            };\r\n            yield return new GameMenuItem\r\n            {\r\n                Description = \"-\",\r\n                MenuSection = \"test plugin\"\r\n            };\r\n            yield return new GameMenuItem\r\n            {\r\n                Description = \"serialization test\",\r\n                MenuSection = \"test plugin\",\r\n                Action = (_) => PlayniteApi.Dialogs.ShowMessage(\"serialization test\"),\r\n                Icon = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), \"Resources\", \"icon.png\"),\r\n            };\r\n        }\r\n\r\n        public class CalcSidebar : SidebarItem\r\n        {\r\n            public CalcSidebar()\r\n            {\r\n                Type = SiderbarItemType.Button;\r\n                Title = \"Calculator\";\r\n                Icon = new TextBlock\r\n                {\r\n                    Text = char.ConvertFromUtf32(0xef08),\r\n                    FontFamily = ResourceProvider.GetResource(\"FontIcoFont\") as FontFamily,\r\n                    Foreground = Brushes.OrangeRed\r\n                };\r\n                ProgressValue = 40;\r\n                ProgressMaximum = 100;\r\n                Activated = () => Process.Start(\"calc\");\r\n            }\r\n        }\r\n\r\n        public class ViewSidebarTest : SidebarItem\r\n        {\r\n            public ViewSidebarTest()\r\n            {\r\n                Type = SiderbarItemType.View;\r\n                Title = \"TestView\";\r\n                Icon = new TextBlock\r\n                {\r\n                    Text = char.ConvertFromUtf32(0xeaf1),\r\n                    FontFamily = ResourceProvider.GetResource(\"FontIcoFont\") as FontFamily\r\n                };\r\n                Opened = () => new Button { Content = \"test\" }; ;\r\n            }\r\n        }\r\n\r\n        public override IEnumerable<SidebarItem> GetSidebarItems()\r\n        {\r\n            yield return new SidebarItem\r\n            {\r\n                Title = \"direct test\",\r\n                Activated = () => Process.Start(\"calc\"),\r\n                Icon = new TextBlock\r\n                {\r\n                    Text = char.ConvertFromUtf32(0xebdf),\r\n                    FontSize = 20,\r\n                    FontFamily = ResourceProvider.GetResource(\"FontIcoFont\") as FontFamily\r\n                },\r\n                ProgressValue = 40\r\n            };\r\n            yield return new ViewSidebarTest();\r\n            yield return new CalcSidebar()\r\n            {\r\n                Title = \"zaltulator\",\r\n                Icon = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), \"Resources\", \"icon.png\"),\r\n                IconPadding = new System.Windows.Thickness(4),\r\n                ProgressValue = 0\r\n            };\r\n        }\r\n\r\n        public override IEnumerable<PlayController> GetPlayActions(GetPlayActionsArgs args)\r\n        {\r\n            return null;\r\n            //yield return new AutomaticPlayController(args.Game)\r\n            //{\r\n            //    Type = AutomaticPlayActionType.File,\r\n            //    TrackingMode = TrackingMode.Process,\r\n            //    Name = \"Notepad\",\r\n            //    Path = \"notepad.exe\"\r\n            //};\r\n        }\r\n\r\n        public override Control GetGameViewControl(GetGameViewControlArgs args)\r\n        {\r\n            if (args.Name == \"TestUserControl\")\r\n            {\r\n                logger.Warn(PlayniteApi.MainView.ActiveDesktopView.ToString());\r\n                return new TestPluginUserControl(Settings);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        public override IEnumerable<TopPanelItem> GetTopPanelItems()\r\n        {\r\n            yield return new TopPanelItem()\r\n            {\r\n                Icon = new TextBlock\r\n                {\r\n                    Text = char.ConvertFromUtf32(0xebdf),\r\n                    FontSize = 20,\r\n                    FontFamily = ResourceProvider.GetResource(\"FontIcoFont\") as FontFamily\r\n                },\r\n                Title = \"Calculator\",\r\n                Activated = () =>\r\n                {\r\n                    PlayniteApi.MainView.OpenSearch(new DefaultSearchContext(), null);\r\n                }\r\n            };\r\n            //new TopPanelItem()\r\n            //{\r\n            //    Title = \"Steam fields\",\r\n            //    Activated = () => Process.Start(@\"steam://open/friends\")\r\n            //}\r\n        }\r\n\r\n        public override IEnumerable<SearchItem> GetSearchGlobalCommands()\r\n        {\r\n            TextBlock icon = null;\r\n            PlayniteApi.MainView.UIDispatcher.Invoke(() => icon = new TextBlock\r\n            {\r\n                Text = char.ConvertFromUtf32(0xef08),\r\n                FontFamily = ResourceProvider.GetResource(\"FontIcoFont\") as FontFamily,\r\n                Foreground = Brushes.OrangeRed\r\n            });\r\n\r\n            yield return new SearchItem(\r\n                \"test command\",\r\n                \"activate\",\r\n                () =>\r\n                {\r\n                    var threadTest = new TextBlock\r\n                    {\r\n                        Text = char.ConvertFromUtf32(0xef08),\r\n                        FontFamily = ResourceProvider.GetResource(\"FontIcoFont\") as FontFamily,\r\n                        Foreground = Brushes.OrangeRed\r\n                    };\r\n                    PlayniteApi.Dialogs.ShowMessage(\"teste command\");\r\n                },\r\n                icon)\r\n            {\r\n                Description = \"some description goes here to describe things\"\r\n            };\r\n\r\n            yield return new SearchItem(\r\n                \"test command 2\",\r\n                \"activate\", () => PlayniteApi.Dialogs.ShowMessage(\"teste command 2\"),\r\n                Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), \"Resources\", \"icon.png\"));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/TestPlugin/TestPlugin.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{AFE32BF4-E669-4E3F-8363-1D32BEB158F6}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>TestPlugin</RootNamespace>\r\n    <AssemblyName>TestPlugin</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Drawing\" />\r\n    <Reference Include=\"System.Xaml\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"WindowsBase\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"TestPlugin.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"TestPluginSettings.cs\" />\r\n    <Compile Include=\"TestPluginSettingsView.xaml.cs\">\r\n      <DependentUpon>TestPluginSettingsView.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"TestPluginUserControl.xaml.cs\">\r\n      <DependentUpon>TestPluginUserControl.xaml</DependentUpon>\r\n    </Compile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\..\\PlayniteSDK\\Playnite.SDK.csproj\">\r\n      <Project>{19bc9097-5705-4352-90e2-99f0c63230d0}</Project>\r\n      <Name>Playnite.SDK</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"extension.yaml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Page Include=\"TestPluginSettingsView.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n    <Page Include=\"TestPluginUserControl.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Resources\\icon.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/Tests/TestPlugin/TestPluginSettings.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Data;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace TestPlugin\r\n{\r\n    public class TestPluginSettings : ObservableObject\r\n    {\r\n        private string option1 = \"test default\";\r\n        public string Option1\r\n        {\r\n            get => option1;\r\n            set\r\n            {\r\n                option1 = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private int option2 = 666;\r\n        public int Option2\r\n        {\r\n            get => option2;\r\n            set\r\n            {\r\n                option2 = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n    }\r\n\r\n    public class TestPluginSettingsViewModel : ObservableObject, ISettings\r\n    {\r\n        public readonly ILogger Logger = LogManager.GetLogger();\r\n        public IPlayniteAPI PlayniteApi { get; set; }\r\n        public TestPlugin Plugin { get; set; }\r\n        public TestPluginSettings EditingClone { get; set; }\r\n\r\n        public RelayCommand TestCommand => new RelayCommand(() =>\r\n        {\r\n            //using (var webview = PlayniteApi.WebViews.CreateOffscreenView())\r\n            //{\r\n            //    var cooks = webview.GetCookies();\r\n            //}\r\n        });\r\n\r\n        private TestPluginSettings settings;\r\n        public TestPluginSettings Settings\r\n        {\r\n            get => settings;\r\n            set\r\n            {\r\n                settings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public TestPluginSettingsViewModel(TestPlugin plugin, IPlayniteAPI playniteApi)\r\n        {\r\n            Plugin = plugin;\r\n            PlayniteApi = playniteApi;\r\n\r\n            var savedSettings = Plugin.LoadPluginSettings<TestPluginSettings>();\r\n            if (savedSettings != null)\r\n            {\r\n                Settings = savedSettings;\r\n            }\r\n            else\r\n            {\r\n                Settings = new TestPluginSettings();\r\n            }\r\n        }\r\n\r\n        public void BeginEdit()\r\n        {\r\n            EditingClone = Serialization.GetClone(Settings);\r\n        }\r\n\r\n        public void CancelEdit()\r\n        {\r\n            Settings = EditingClone;\r\n        }\r\n\r\n        public void EndEdit()\r\n        {\r\n            Plugin.SavePluginSettings(Settings);\r\n        }\r\n\r\n        public virtual bool VerifySettings(out List<string> errors)\r\n        {\r\n            errors = new List<string>();\r\n            return true;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/TestPlugin/TestPluginSettingsView.xaml",
    "content": "﻿<UserControl x:Class=\"TestPlugin.TestPluginSettingsView\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:TestPlugin\"\r\n             mc:Ignorable=\"d\" \r\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\r\n    <DockPanel>\r\n        <TextBox Text=\"{Binding Settings.Option1, UpdateSourceTrigger=PropertyChanged}\" DockPanel.Dock=\"Top\"/>\r\n        <Slider Value=\"{Binding Settings.Option2, UpdateSourceTrigger=PropertyChanged}\" DockPanel.Dock=\"Top\"\r\n                Minimum=\"0\" Maximum=\"1000\"/>\r\n        <Button Content=\"test\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Top\"\r\n                Command=\"{Binding TestCommand}\"/>\r\n    </DockPanel>\r\n</UserControl>\r\n"
  },
  {
    "path": "source/Tests/TestPlugin/TestPluginSettingsView.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace TestPlugin\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for TestPluginSettingsView.xaml\r\n    /// </summary>\r\n    public partial class TestPluginSettingsView : UserControl\r\n    {\r\n        public TestPluginSettingsView()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/TestPlugin/TestPluginUserControl.xaml",
    "content": "﻿<PluginUserControl x:Class=\"TestPlugin.TestPluginUserControl\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \r\n             xmlns:local=\"clr-namespace:TestPlugin\"\r\n             xmlns:sdk=\"clr-namespace:Playnite.SDK.Controls;assembly=Playnite.SDK\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"450\" d:DesignWidth=\"800\">\r\n    <DockPanel>\r\n        <TextBlock Text=\"{Binding SettingsModel.Settings.Option2, RelativeSource={RelativeSource AncestorType=UserControl}}\"\r\n                   Foreground=\"LimeGreen\" DockPanel.Dock=\"Top\" />\r\n        <Button Content=\"{Binding GameContext.Name}\" Foreground=\"LimeGreen\" DockPanel.Dock=\"Top\" />\r\n    </DockPanel>\r\n</PluginUserControl>\r\n"
  },
  {
    "path": "source/Tests/TestPlugin/TestPluginUserControl.xaml.cs",
    "content": "﻿using Playnite.SDK.Controls;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace TestPlugin\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for UserControl1.xaml\r\n    /// </summary>\r\n    public partial class TestPluginUserControl : PluginUserControl\r\n    {\r\n        public TestPluginSettingsViewModel SettingsModel { get; set;}\r\n\r\n        public TestPluginUserControl(TestPluginSettingsViewModel settings)\r\n        {\r\n            InitializeComponent();\r\n            DataContext = this;\r\n            SettingsModel = settings;\r\n        }\r\n\r\n        public override void GameContextChanged(Game oldContext, Game newContext)\r\n        {\r\n            Console.WriteLine($\"---- TestPluginUserControl ---- {newContext?.ToString()}\");\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tests/TestPlugin/extension.yaml",
    "content": "﻿Id: Test_Generic_Plugin\r\nName: Test Generic Plugin\r\nAuthor: Josef Nemec\r\nVersion: 1.0\r\nModule: TestPlugin.dll\r\nType: GenericPlugin"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n    <startup> \r\n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\" />\r\n    </startup>\r\n  <runtime>\r\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.4.0\" newVersion=\"4.1.4.0\" />\r\n      </dependentAssembly>\r\n    </assemblyBinding>\r\n  </runtime>\r\n</configuration>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/CmdLineOptions.cs",
    "content": "﻿using CommandLine;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Toolbox\r\n{\r\n    public enum ItemType\r\n    {\r\n        Uknown,\r\n        DesktopTheme,\r\n        FullscreenTheme,\r\n        PowerShellScript,\r\n        GenericPlugin,\r\n        MetadataPlugin,\r\n        LibraryPlugin\r\n    }\r\n\r\n    public enum ManifestType\r\n    {\r\n        Installer,\r\n        Addon\r\n    }\r\n\r\n    [Verb(\"new\", HelpText = \"Generate new add-on from template.\")]\r\n    public class NewCmdLineOptions\r\n    {\r\n        [Value(0, Required = true, HelpText = \"Add-on type.\")]\r\n        public ItemType Type { get; set; }\r\n        [Value(1, Required = true, HelpText = \"Add-on name.\")]\r\n        public string Name { get; set; }\r\n        [Value(2, Required = false, HelpText = \"Output directory (for extensions only).\")]\r\n        public string OutDirectory { get; set; }\r\n    }\r\n\r\n    [Verb(\"pack\", HelpText = \"Pack existing add-on.\")]\r\n    public class PackCmdLineOptions\r\n    {\r\n        [Value(0, Required = true, HelpText = \"Add-on directory to pack.\")]\r\n        public string Directory { get; set; }\r\n        [Value(1, Required = true, HelpText = \"Destination directory for packaged file to be saved to.\")]\r\n        public string Destination { get; set; }\r\n    }\r\n\r\n    [Verb(\"update\", HelpText = \"Update theme to newer version.\")]\r\n    public class UpdateCmdLineOptions\r\n    {\r\n        [Value(0, Required = true, HelpText = \"Theme directory to update.\")]\r\n        public string Directory { get; set; }\r\n    }\r\n\r\n    [Verb(\"verify\", HelpText = \"Verify addon manifest.\")]\r\n    public class VerifyManifestOptions\r\n    {\r\n        [Value(0, Required = true, HelpText = \"Manifest type.\")]\r\n        public ManifestType Type { get; set; }\r\n        [Value(1, Required = true, HelpText = \"Full manifest file path.\")]\r\n        public string ManifestPath { get; set;}\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Extensions.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Globalization;\r\nusing System.IO;\r\nusing System.IO.Compression;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Toolbox\r\n{\r\n    public class Extensions\r\n    {\r\n        private const string nameReplaceMask = \"_name_\";\r\n        private const string namespaceReplaceMask = \"_namespace_\";\r\n        private const string guidReplaceMask = \"00000000-0000-0000-0000-000000000001\";\r\n        private const string genericPluginProjectName = \"GenericPlugin\";\r\n        private const string libraryPluginProjectName = \"CustomLibraryPlugin\";\r\n        private const string metadataPluginProjectName = \"CustomMetadataPlugin\";\r\n\r\n        public static string ConvertToValidIdentifierName(string input)\r\n        {\r\n            // https://stackoverflow.com/questions/950616/what-characters-are-allowed-in-c-sharp-class-name\r\n            bool isValidInIdentifier(char c, bool firstChar = true)\r\n            {\r\n                switch (char.GetUnicodeCategory(c))\r\n                {\r\n                    case UnicodeCategory.UppercaseLetter:\r\n                    case UnicodeCategory.LowercaseLetter:\r\n                    case UnicodeCategory.TitlecaseLetter:\r\n                    case UnicodeCategory.ModifierLetter:\r\n                    case UnicodeCategory.OtherLetter:\r\n                        // Always allowed in C# identifiers\r\n                        return true;\r\n\r\n                    case UnicodeCategory.LetterNumber:\r\n                    case UnicodeCategory.NonSpacingMark:\r\n                    case UnicodeCategory.SpacingCombiningMark:\r\n                    case UnicodeCategory.DecimalDigitNumber:\r\n                    case UnicodeCategory.ConnectorPunctuation:\r\n                    case UnicodeCategory.Format:\r\n                        // Only allowed after first char\r\n                        return !firstChar;\r\n                    default:\r\n                        return false;\r\n                }\r\n            }\r\n\r\n            if (input.IsNullOrWhiteSpace())\r\n            {\r\n                throw new ArgumentNullException(nameof(input));\r\n            }\r\n\r\n            var sb = new StringBuilder(input.Length);\r\n            for (int i = 0; i < input.Length; i++)\r\n            {\r\n                var chr = input[i];\r\n                if (isValidInIdentifier(chr, i == 0))\r\n                {\r\n                    sb.Append(chr);\r\n                }\r\n            }\r\n\r\n            return sb.ToString();\r\n        }\r\n\r\n        public static string GenerateScriptExtension(string name, string directory)\r\n        {\r\n            var normalizedName = ConvertToValidIdentifierName(name);\r\n            var outDir = Path.Combine(directory, normalizedName);\r\n            if (Directory.Exists(outDir))\r\n            {\r\n                throw new Exception($\"Extension already exists: {outDir}\");\r\n            }\r\n\r\n            var templateArchive = Path.Combine(PlaynitePaths.ProgramPath, \"Templates\", \"Extensions\", \"PowerShellScript.zip\"); ;\r\n            ZipFile.ExtractToDirectory(templateArchive, outDir);\r\n            var pluginId = Guid.NewGuid();\r\n            foreach (var filePath in Directory.GetFiles(outDir, \"*.*\", SearchOption.AllDirectories))\r\n            {\r\n                var changed = false;\r\n                var fileContent = File.ReadAllText(filePath, Encoding.UTF8);\r\n                if (fileContent.Contains(nameReplaceMask))\r\n                {\r\n                    fileContent = fileContent.Replace(nameReplaceMask, normalizedName);\r\n                    changed = true;\r\n                }\r\n\r\n                if (fileContent.Contains(guidReplaceMask))\r\n                {\r\n                    fileContent = fileContent.Replace(guidReplaceMask, pluginId.ToString());\r\n                    changed = true;\r\n                }\r\n\r\n                if (changed)\r\n                {\r\n                    File.WriteAllText(filePath, fileContent, Encoding.UTF8);\r\n                }\r\n\r\n                if (filePath.Contains(nameReplaceMask))\r\n                {\r\n                    File.Move(filePath, filePath.Replace(nameReplaceMask, normalizedName));\r\n                }\r\n            }\r\n\r\n            return outDir;\r\n        }\r\n\r\n        public static string GeneratePluginExtension(ExtensionType type, string name, string directory)\r\n        {\r\n            var normalizedName = Common.Paths.GetSafePathName(name).Replace(\" \", string.Empty);\r\n            var outDir = Path.Combine(directory, normalizedName);\r\n            if (Directory.Exists(outDir))\r\n            {\r\n                throw new Exception($\"Extension already exists: {outDir}\");\r\n            }\r\n\r\n            var templateArchive = Paths.GetPluginTemplateArchivePath(type);\r\n            ZipFile.ExtractToDirectory(templateArchive, outDir);\r\n            var pluginId = Guid.NewGuid();\r\n\r\n            foreach (var filePath in Directory.GetFiles(outDir, \"*.*\", SearchOption.AllDirectories))\r\n            {\r\n                var changed = false;\r\n                var fileContent = File.ReadAllText(filePath, Encoding.UTF8);\r\n                if (fileContent.Contains(nameReplaceMask))\r\n                {\r\n                    fileContent = fileContent.Replace(nameReplaceMask, normalizedName);\r\n                    changed = true;\r\n                }\r\n\r\n                if (fileContent.Contains(namespaceReplaceMask))\r\n                {\r\n                    fileContent = fileContent.Replace(namespaceReplaceMask, normalizedName);\r\n                    changed = true;\r\n                }\r\n\r\n                if (fileContent.Contains(guidReplaceMask))\r\n                {\r\n                    fileContent = fileContent.Replace(guidReplaceMask, pluginId.ToString());\r\n                    changed = true;\r\n                }\r\n\r\n                if (changed)\r\n                {\r\n                    File.WriteAllText(filePath, fileContent, Encoding.UTF8);\r\n                }\r\n\r\n                if (filePath.Contains(nameReplaceMask))\r\n                {\r\n                    File.Move(filePath, filePath.Replace(nameReplaceMask, normalizedName));\r\n                }\r\n            }\r\n\r\n            var outProjectFile = Path.Combine(outDir, normalizedName + \".csproj\");\r\n            var outSolutionFile = Path.Combine(outDir, normalizedName + \".sln\");\r\n            var baseProjectName = genericPluginProjectName;\r\n\r\n            switch (type)\r\n            {\r\n                case ExtensionType.GenericPlugin:\r\n                    baseProjectName = genericPluginProjectName;\r\n                    break;\r\n                case ExtensionType.GameLibrary:\r\n                    baseProjectName = libraryPluginProjectName;\r\n                    break;\r\n                case ExtensionType.MetadataProvider:\r\n                    baseProjectName = metadataPluginProjectName;\r\n                    break;\r\n            }\r\n\r\n            File.Move(Path.Combine(outDir, baseProjectName + \".csproj\"), outProjectFile);\r\n            File.Move(Path.Combine(outDir, baseProjectName + \".sln\"), outSolutionFile);\r\n            FileSystem.ReplaceStringInFile(outProjectFile, baseProjectName, normalizedName);\r\n            FileSystem.ReplaceStringInFile(outSolutionFile, baseProjectName, normalizedName);\r\n            return outDir;\r\n        }\r\n\r\n        public static string PackageExtension(string extDirectory, string targetPath)\r\n        {\r\n            var dirInfo = new DirectoryInfo(extDirectory);\r\n            var manifestPath = Path.Combine(extDirectory, PlaynitePaths.ExtensionManifestFileName);\r\n            if (!File.Exists(manifestPath))\r\n            {\r\n                throw new Exception($\"Manifest file ({PlaynitePaths.ExtensionManifestFileName}) not found!\");\r\n            }\r\n\r\n            var extInfo = ExtensionInstaller.GetExtensionManifest(manifestPath);\r\n            if (extInfo.Id.IsNullOrEmpty())\r\n            {\r\n                throw new Exception(\"Cannot package extension, ID is missing!\");\r\n            }\r\n\r\n            extInfo.VerifyManifest();\r\n\r\n            var packedPath = Path.Combine(targetPath, $\"{Common.Paths.GetSafePathName(extInfo.Id).Replace(' ', '_')}_{extInfo.Version.ToString().Replace(\".\", \"_\")}{PlaynitePaths.PackedExtensionFileExtention}\");\r\n            FileSystem.PrepareSaveFile(packedPath);\r\n            var ignoreFiles = File.ReadAllLines(Paths.ExtFileIgnoreListPath);\r\n\r\n            using (var zipStream = new FileStream(packedPath, FileMode.Create))\r\n            {\r\n                using (var zipFile = new ZipArchive(zipStream, ZipArchiveMode.Create))\r\n                {\r\n                    foreach (var file in Directory.GetFiles(extDirectory, \"*.*\", SearchOption.AllDirectories))\r\n                    {\r\n                        var subName = file.Replace(extDirectory, \"\").TrimStart(Path.DirectorySeparatorChar);\r\n                        if (ignoreFiles.ContainsString(subName, StringComparison.OrdinalIgnoreCase))\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        zipFile.CreateEntryFromFile(file, subName, CompressionLevel.Optimal);\r\n                    }\r\n                }\r\n            }\r\n\r\n            return packedPath;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/NLog.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n<nlog xmlns=\"http://www.nlog-project.org/schemas/NLog.xsd\"\r\n      xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n\r\n  <targets>\r\n    <target name=\"logfile\" xsi:type=\"File\" fileName=\"Toolbox.log\" />\r\n    <target name=\"logconsole\" xsi:type=\"ColoredConsole\" layout=\"${message}\" />\r\n  </targets>\r\n  <rules>\r\n    <logger name=\"*\" minlevel=\"Info\" writeTo=\"logconsole\" />\r\n    <logger name=\"*\" minlevel=\"Trace\" writeTo=\"logfile\" />\r\n  </rules>\r\n</nlog>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Paths.cs",
    "content": "﻿using Playnite.API;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Toolbox\r\n{\r\n    public class Paths\r\n    {\r\n        public static string GetThemesPath(ApplicationMode mode)\r\n        {\r\n            return Path.Combine(PlaynitePaths.ThemesProgramPath, ThemeManager.GetThemeRootDir(mode));\r\n        }\r\n\r\n        public static string GetThemeTemplateDir(ApplicationMode mode)\r\n        {\r\n            return Path.Combine(PlaynitePaths.ProgramPath, \"Templates\", \"Themes\", ThemeManager.GetThemeRootDir(mode));\r\n        }\r\n\r\n        public static string GetThemeTemplateFilePath(ApplicationMode mode, string fileName)\r\n        {\r\n            return Path.Combine(PlaynitePaths.ProgramPath, \"Templates\", \"Themes\", ThemeManager.GetThemeRootDir(mode), fileName);\r\n        }\r\n\r\n        public static string GetThemeTemplatePath(string fileName)\r\n        {\r\n            return Path.Combine(PlaynitePaths.ProgramPath, \"Templates\", \"Themes\", fileName);\r\n        }\r\n\r\n        public static string GetPluginTemplateArchivePath(ExtensionType type)\r\n        {\r\n            var root = Path.Combine(PlaynitePaths.ProgramPath, \"Templates\", \"Extensions\");\r\n            switch (type)\r\n            {\r\n                case ExtensionType.GenericPlugin:\r\n                    return Path.Combine(root, \"GenericPlugin.zip\");\r\n                case ExtensionType.GameLibrary:\r\n                    return Path.Combine(root, \"CustomLibraryPlugin.zip\");\r\n                case ExtensionType.MetadataProvider:\r\n                    return Path.Combine(root, \"CustomMetadataPlugin.zip\");\r\n                case ExtensionType.Script:\r\n                default:\r\n                    throw new NotSupportedException();\r\n            }\r\n        }\r\n\r\n        public static string ChangeLogsDir => Path.Combine(PlaynitePaths.ProgramPath, \"Templates\", \"Themes\", \"Changelog\");\r\n        public static string ExtFileIgnoreListPath => Path.Combine(PlaynitePaths.ProgramPath, \"Templates\", \"Extensions\", \"ExtensionsRefIgnoreList.txt\");\r\n\r\n        public static string GetNextBackupFolder(string rootFolder)\r\n        {\r\n            var latestBack = -1;\r\n            var dirs = Directory.GetDirectories(rootFolder).Where(a => Path.GetFileName(a).StartsWith(\"backup_\")).ToList();\r\n            if (dirs.Any())\r\n            {\r\n                latestBack = dirs.Select(a => int.Parse(Path.GetFileName(a).Replace(\"backup_\", \"\"))).Max();\r\n            }\r\n\r\n            latestBack += 1;\r\n            return Path.Combine(rootFolder, $\"backup_{latestBack}\");\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Playnite.Toolbox.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{9C73C47E-64C2-4691-A602-A8463185E232}</ProjectGuid>\r\n    <OutputType>Exe</OutputType>\r\n    <RootNamespace>Playnite.Toolbox</RootNamespace>\r\n    <AssemblyName>Toolbox</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\r\n    <Deterministic>true</Deterministic>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n    <LangVersion>7.3</LangVersion>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <DebugSymbols>true</DebugSymbols>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x64</PlatformTarget>\r\n    <LangVersion>7.3</LangVersion>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"CommandLine, Version=2.8.0.0, Culture=neutral, PublicKeyToken=5a870481e358d379, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\CommandLineParser.2.8.0\\lib\\net461\\CommandLine.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\NLog.4.7.6\\lib\\net45\\NLog.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Configuration\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.IO.Compression\" />\r\n    <Reference Include=\"System.IO.Compression.FileSystem\" />\r\n    <Reference Include=\"System.Runtime.Serialization\" />\r\n    <Reference Include=\"System.ServiceModel\" />\r\n    <Reference Include=\"System.Transactions\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Xml\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Verify.cs\" />\r\n    <Compile Include=\"CmdLineOptions.cs\" />\r\n    <Compile Include=\"Extensions.cs\" />\r\n    <Compile Include=\"Paths.cs\" />\r\n    <Compile Include=\"Program.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n    <Compile Include=\"Strings.cs\" />\r\n    <Compile Include=\"Themes.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\..\\references\\Fonts\\icofont.ttf\">\r\n      <Link>Templates\\Themes\\Fonts\\icofont.ttf</Link>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"..\\..\\..\\references\\Fonts\\TitilliumWeb*.*\">\r\n      <Link>Templates\\Themes\\Fullscreen\\Fonts\\%(Filename)%(Extension)</Link>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"..\\..\\..\\references\\Fonts\\PlayStation4.*\">\r\n      <Link>Templates\\Themes\\Fullscreen\\Fonts\\%(Filename)%(Extension)</Link>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"..\\..\\..\\references\\Fonts\\XBOXONE.*\">\r\n      <Link>Templates\\Themes\\Fullscreen\\Fonts\\%(Filename)%(Extension)</Link>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"App.config\" />\r\n    <None Include=\"NLog.config\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\..\\PlayniteSDK\\Playnite.SDK.csproj\">\r\n      <Project>{19BC9097-5705-4352-90E2-99F0C63230D0}</Project>\r\n      <Name>Playnite.SDK</Name>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"..\\..\\Playnite\\Playnite.csproj\">\r\n      <Project>{ad271e73-8a13-4c4e-bfdc-3076646b59e3}</Project>\r\n      <Name>Playnite</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Folder Include=\"Templates\\Themes\\Desktop\\Fonts\\\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\Playnite.DesktopApp\\App.xaml\">\r\n      <Link>Templates\\Themes\\Desktop\\App.xaml</Link>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\Playnite.FullscreenApp\\App.xaml\">\r\n      <Link>Templates\\Themes\\Fullscreen\\App.xaml</Link>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Templates\\Themes\\Desktop\\Theme.csproj\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n      <SubType>Designer</SubType>\r\n    </None>\r\n    <None Include=\"Templates\\Themes\\Desktop\\Theme.sln\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\Playnite\\Localization\\LocSource.xaml\">\r\n      <Link>Templates\\Themes\\LocSource.xaml</Link>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\Playnite.DesktopApp\\GlobalResources.xaml\">\r\n      <Link>Templates\\Themes\\Desktop\\GlobalResources.xaml</Link>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\Playnite.FullscreenApp\\GlobalResources.xaml\">\r\n      <Link>Templates\\Themes\\Fullscreen\\GlobalResources.xaml</Link>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Templates\\Themes\\Fullscreen\\Theme.csproj\">\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Templates\\Themes\\Fullscreen\\Theme.sln\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\..\\build\\ExtensionsRefIgnoreList.txt\">\r\n      <Link>Templates\\Extensions\\ExtensionsRefIgnoreList.txt</Link>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\Playnite.DesktopApp\\ControlGalleryView.xaml\">\r\n      <Link>Templates\\Themes\\Desktop\\ControlGalleryView.xaml</Link>\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\Playnite.FullscreenApp\\ControlGalleryView.xaml\">\r\n      <Link>Templates\\Themes\\Fullscreen\\ControlGalleryView.xaml</Link>\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <PropertyGroup>\r\n    <PostBuildEvent>xcopy \"$(SolutionDir)\\Tools\\Playnite.Toolbox\\Templates\\Themes\\Changelog\" \"$(TargetDir)\\Templates\\Themes\\Changelog\\\" /e /y</PostBuildEvent>\r\n  </PropertyGroup>\r\n</Project>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Program.cs",
    "content": "﻿using CommandLine;\r\nusing CommandLine.Text;\r\nusing Playnite.API;\r\nusing Playnite.Common;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Runtime;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\nusing System.Xml;\r\nusing System.Xml.Linq;\r\n\r\nnamespace Playnite.Toolbox\r\n{\r\n    class Program\r\n    {\r\n        public static int AppResult { get; set; } = 0;\r\n        private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();\r\n\r\n        static int Main(string[] args)\r\n        {\r\n            FileSystem.CreateDirectory(PlaynitePaths.JitProfilesPath);\r\n            ProfileOptimization.SetProfileRoot(PlaynitePaths.JitProfilesPath);\r\n            ProfileOptimization.StartProfile(\"toolbox\");\r\n\r\n            logger.Debug(\"Toolbox started.\");\r\n            logger.Debug(Environment.CommandLine);\r\n\r\n            var cmdlineParser = new Parser(with =>\r\n            {\r\n                with.CaseInsensitiveEnumValues = true;\r\n                with.HelpWriter = null;\r\n            });\r\n\r\n            var result = cmdlineParser.ParseArguments<NewCmdLineOptions, PackCmdLineOptions, UpdateCmdLineOptions, VerifyManifestOptions>(args);\r\n            result.WithParsed<NewCmdLineOptions>(ProcessNewOptions)\r\n                .WithParsed<PackCmdLineOptions>(ProcessPackOptions)\r\n                .WithParsed<UpdateCmdLineOptions>(ProcessUpdateOptions)\r\n                .WithParsed<VerifyManifestOptions>(ProcessVerifyOptions)\r\n                .WithNotParsed(errs => DisplayHelp(result, errs));\r\n            if (result.Tag == ParserResultType.NotParsed)\r\n            {\r\n                AppResult = 2;\r\n            }\r\n\r\n            if (Debugger.IsAttached)\r\n            {\r\n                Console.ReadLine();\r\n            }\r\n\r\n            return AppResult;\r\n        }\r\n\r\n        static void DisplayHelp<T>(ParserResult<T> result, IEnumerable<Error> errs)\r\n        {\r\n            var helpText = HelpText.AutoBuild(result, h =>\r\n            {\r\n                h.AdditionalNewLineAfterOption = false;\r\n                h.AddEnumValuesToHelpText = true;\r\n                h.AutoHelp = false;\r\n                h.AutoVersion = false;\r\n                return h;\r\n            });\r\n            Console.WriteLine(helpText);\r\n        }\r\n\r\n        public static ItemType GetExtensionType(string directory)\r\n        {\r\n            var themeMan = Path.Combine(directory, PlaynitePaths.ThemeManifestFileName);\r\n            var extMan = Path.Combine(directory, PlaynitePaths.ExtensionManifestFileName);\r\n            if (File.Exists(themeMan))\r\n            {\r\n                var desc = ExtensionInstaller.GetThemeManifest(themeMan);\r\n                switch (desc.Mode)\r\n                {\r\n                    case ApplicationMode.Desktop:\r\n                        return ItemType.DesktopTheme;\r\n                    case ApplicationMode.Fullscreen:\r\n                        return ItemType.FullscreenTheme;\r\n                }\r\n            }\r\n            else if (File.Exists(extMan))\r\n            {\r\n                var desc = ExtensionInstaller.GetExtensionManifest(extMan);\r\n                switch (desc.Type)\r\n                {\r\n                    case ExtensionType.GenericPlugin:\r\n                        return ItemType.GenericPlugin;\r\n                    case ExtensionType.GameLibrary:\r\n                        return ItemType.LibraryPlugin;\r\n                    case ExtensionType.Script:\r\n                        return ItemType.PowerShellScript;\r\n                    case ExtensionType.MetadataProvider:\r\n                        return ItemType.MetadataPlugin;\r\n                }\r\n            }\r\n\r\n            return ItemType.Uknown;\r\n        }\r\n\r\n        public static void ProcessNewOptions(NewCmdLineOptions options)\r\n        {\r\n            if (!options.OutDirectory.IsNullOrEmpty())\r\n                options.OutDirectory = options.OutDirectory.Trim('\"');\r\n\r\n            try\r\n            {\r\n                var outPath = string.Empty;\r\n                switch (options.Type)\r\n                {\r\n                    case ItemType.DesktopTheme:\r\n                        outPath = Themes.GenerateNewTheme(ApplicationMode.Desktop, options.Name);\r\n                        break;\r\n                    case ItemType.FullscreenTheme:\r\n                        outPath = Themes.GenerateNewTheme(ApplicationMode.Fullscreen, options.Name);\r\n                        break;\r\n                    case ItemType.PowerShellScript:\r\n                        outPath = Extensions.GenerateScriptExtension(options.Name, options.OutDirectory);\r\n                        break;\r\n                    case ItemType.GenericPlugin:\r\n                        outPath = Extensions.GeneratePluginExtension(ExtensionType.GenericPlugin, options.Name, options.OutDirectory);\r\n                        break;\r\n                    case ItemType.MetadataPlugin:\r\n                        outPath = Extensions.GeneratePluginExtension(ExtensionType.MetadataProvider, options.Name, options.OutDirectory);\r\n                        break;\r\n                    case ItemType.LibraryPlugin:\r\n                        outPath = Extensions.GeneratePluginExtension(ExtensionType.GameLibrary, options.Name, options.OutDirectory);\r\n                        break;\r\n                    default:\r\n                        throw new NotSupportedException($\"Uknown extension type {options.Type}.\");\r\n                }\r\n\r\n                logger.Info($\"Created new {options.Type} in \\\"{outPath}\\\"\");\r\n                logger.Warn($\"Don't forget to update manifest file with relevant information.\");\r\n                if (options.Type == ItemType.GenericPlugin || options.Type == ItemType.LibraryPlugin || options.Type == ItemType.MetadataPlugin)\r\n                {\r\n                    logger.Warn($\"Use generated .sln solution file to open plugin source.\");\r\n                }\r\n            }\r\n            catch (Exception e) when (!Debugger.IsAttached)\r\n            {\r\n                AppResult = 1;\r\n                logger.Error(e, $\"Failed to create new {options.Type}.\" + Environment.NewLine + e.Message);\r\n            }\r\n        }\r\n\r\n        public static void ProcessPackOptions(PackCmdLineOptions options)\r\n        {\r\n            options.Destination = options.Destination.Trim('\"');\r\n            options.Directory = options.Directory.Trim('\"');\r\n\r\n            try\r\n            {\r\n                var outPath = string.Empty;\r\n                var type = GetExtensionType(options.Directory);\r\n                switch (type)\r\n                {\r\n                    case ItemType.DesktopTheme:\r\n                        outPath = Themes.PackageTheme(options.Directory, options.Destination, ApplicationMode.Desktop);\r\n                        break;\r\n                    case ItemType.FullscreenTheme:\r\n                        outPath = Themes.PackageTheme(options.Directory, options.Destination, ApplicationMode.Fullscreen);\r\n                        break;\r\n                    case ItemType.PowerShellScript:\r\n                    case ItemType.GenericPlugin:\r\n                    case ItemType.MetadataPlugin:\r\n                    case ItemType.LibraryPlugin:\r\n                        outPath = Extensions.PackageExtension(options.Directory, options.Destination);\r\n                        break;\r\n                    case ItemType.Uknown:\r\n                        throw new NotSupportedException();\r\n                }\r\n\r\n                logger.Info($\"{type} successfully packed as \\\"{outPath}\\\"\");\r\n            }\r\n            catch (Exception e) when (!Debugger.IsAttached)\r\n            {\r\n                AppResult = 1;\r\n                logger.Error(e, $\"Failed to pack extension: {options.Directory}.\" + Environment.NewLine + e.Message);\r\n            }\r\n        }\r\n\r\n        public static void ProcessUpdateOptions(UpdateCmdLineOptions options)\r\n        {\r\n            options.Directory = options.Directory.Trim('\"');\r\n\r\n            try\r\n            {\r\n                var type = GetExtensionType(options.Directory);\r\n                switch (type)\r\n                {\r\n                    case ItemType.DesktopTheme:\r\n                        Themes.UpdateTheme(options.Directory, ApplicationMode.Desktop);\r\n                        break;\r\n                    case ItemType.FullscreenTheme:\r\n                        Themes.UpdateTheme(options.Directory, ApplicationMode.Desktop);\r\n                        break;\r\n                    case ItemType.Uknown:\r\n                    case ItemType.PowerShellScript:\r\n                    case ItemType.GenericPlugin:\r\n                    case ItemType.MetadataPlugin:\r\n                    case ItemType.LibraryPlugin:\r\n                        throw new NotSupportedException();\r\n                }\r\n            }\r\n            catch (Exception e) when (!Debugger.IsAttached)\r\n            {\r\n                AppResult = 1;\r\n                logger.Error(e, \"Failed to update extension.\" + Environment.NewLine + e.Message);\r\n            }\r\n        }\r\n\r\n        public static void ProcessVerifyOptions(VerifyManifestOptions options)\r\n        {\r\n            try\r\n            {\r\n                switch (options.Type)\r\n                {\r\n                    case ManifestType.Installer:\r\n                        AppResult = Verify.VerifyInstallerManifest(options.ManifestPath, out var _) ? 0 : 1;\r\n                        break;\r\n                    case ManifestType.Addon:\r\n                        AppResult = Verify.VerifyAddonManifest(options.ManifestPath) ? 0 : 1;\r\n                        break;\r\n                    default:\r\n                        throw new NotSupportedException();\r\n                }\r\n            }\r\n            catch (Exception e) when(!Debugger.IsAttached)\r\n            {\r\n                AppResult = 1;\r\n                logger.Error(e, \"Failed to verify manifest.\" + Environment.NewLine + e.Message);\r\n            }\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"Playnite.Toolbox\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"Playnite.Toolbox\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2019\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"9c73c47e-64c2-4691-a602-a8463185e232\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Strings.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Toolbox\r\n{\r\n    public class Strings\r\n    {\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/App.xaml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Application xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n    <Application.Resources>\r\n        <ResourceDictionary>\r\n            <Style x:Key=\"BaseTextBlockStyle\" TargetType=\"TextBlock\" />\r\n            <ResourceDictionary.MergedDictionaries>                \r\n                <ResourceDictionary Source=\"Localization/en_US.xaml\" />\r\n            </ResourceDictionary.MergedDictionaries>\r\n        </ResourceDictionary>\r\n    </Application.Resources>\r\n</Application>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/BuildInclude.txt",
    "content": "Properties\\AssemblyInfo.cs\r\nLocalization\\en_US.xaml\r\nCustomLibraryPlugin.csproj\r\nCustomLibraryPlugin.sln\r\nextension.yaml\r\nicon.png\r\npackages.config\r\n_name_.cs\r\n_name_Client.cs\r\n_name_Settings.cs\r\n_name_SettingsView.xaml\r\n_name_SettingsView.xaml.cs\r\nApp.xaml"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/CustomLibraryPlugin.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>_namespace_</RootNamespace>\r\n    <AssemblyName>_name_</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <Deterministic>true</Deterministic>\r\n    <ProjectGuid>{2351B5C1-6E28-4B79-A1D9-90FDA53B5417}</ProjectGuid>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Playnite.SDK, Version=6.15.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <HintPath>packages\\PlayniteSDK.6.15.0\\lib\\net462\\Playnite.SDK.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xaml\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"WindowsBase\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"_name_Client.cs\" />\r\n    <Compile Include=\"_name_.cs\" />\r\n    <Compile Include=\"_name_Settings.cs\" />\r\n    <Compile Include=\"_name_SettingsView.xaml.cs\">\r\n      <DependentUpon>_name_SettingsView.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"extension.yaml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"icon.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Localization\\*.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Page Include=\"App.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"_name_SettingsView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/CustomLibraryPlugin.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 15\r\nVisualStudioVersion = 15.0.28307.1267\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CustomLibraryPlugin\", \"CustomLibraryPlugin.csproj\", \"{2351B5C1-6E28-4B79-A1D9-90FDA53B5417}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{2351B5C1-6E28-4B79-A1D9-90FDA53B5417}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{2351B5C1-6E28-4B79-A1D9-90FDA53B5417}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{2351B5C1-6E28-4B79-A1D9-90FDA53B5417}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{2351B5C1-6E28-4B79-A1D9-90FDA53B5417}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {E180B1C9-C8AE-4CAD-8119-8D66A21AD6E2}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/Localization/en_US.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" \r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" \r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n                    \r\n</ResourceDictionary>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"_name_\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"_name_\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2019\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"00000000-0000-0000-0000-000000000001\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/_name_.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace _namespace_\r\n{\r\n    public class _name_ : LibraryPlugin\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        private _name_SettingsViewModel settings { get; set; }\r\n\r\n        public override Guid Id { get; } = Guid.Parse(\"00000000-0000-0000-0000-000000000001\");\r\n\r\n        // Change to something more appropriate\r\n        public override string Name => \"Custom Library\";\r\n\r\n        // Implementing Client adds ability to open it via special menu in playnite.\r\n        public override LibraryClient Client { get; } = new _name_Client();\r\n\r\n        public _name_(IPlayniteAPI api) : base(api)\r\n        {\r\n            settings = new _name_SettingsViewModel(this);\r\n            Properties = new LibraryPluginProperties\r\n            {\r\n                HasSettings = true\r\n            };\r\n        }\r\n\r\n        public override IEnumerable<GameMetadata> GetGames(LibraryGetGamesArgs args)\r\n        {\r\n            // Return list of user's games.\r\n            return new List<GameMetadata>()\r\n            {\r\n                new GameMetadata()\r\n                {\r\n                    Name = \"Notepad\",\r\n                    GameId = \"notepad\",\r\n                    GameActions = new List<GameAction>\r\n                    {\r\n                        new GameAction()\r\n                        {\r\n                            Type = GameActionType.File,\r\n                            Path = \"notepad.exe\",\r\n                            IsPlayAction = true\r\n                        }\r\n                    },\r\n                    IsInstalled = true,\r\n                    Icon = new MetadataFile(@\"c:\\Windows\\notepad.exe\")\r\n                },\r\n                new GameMetadata()\r\n                {\r\n                    Name = \"Calculator\",\r\n                    GameId = \"calc\",\r\n                    GameActions = new List<GameAction>\r\n                    {\r\n                        new GameAction()\r\n                        {\r\n                            Type = GameActionType.File,\r\n                            Path = \"calc.exe\",\r\n                            IsPlayAction = true\r\n                        }\r\n                    },\r\n                    IsInstalled = true,\r\n                    Icon = new MetadataFile(@\"https://playnite.link/applogo.png\"),\r\n                    BackgroundImage = new MetadataFile(@\"https://playnite.link/applogo.png\")\r\n                }\r\n            };\r\n        }\r\n\r\n        public override ISettings GetSettings(bool firstRunSettings)\r\n        {\r\n            return settings;\r\n        }\r\n\r\n        public override UserControl GetSettingsView(bool firstRunSettings)\r\n        {\r\n            return new _name_SettingsView();\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/_name_Client.cs",
    "content": "﻿using Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace _namespace_\r\n{\r\n    public class _name_Client : LibraryClient\r\n    {\r\n        public override bool IsInstalled => true;\r\n\r\n        public override void Open()\r\n        {\r\n            throw new NotImplementedException();\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/_name_Settings.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Data;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace _namespace_\r\n{\r\n    public class _name_Settings : ObservableObject\r\n    {\r\n        private string option1 = string.Empty;\r\n        private bool option2 = false;\r\n        private bool optionThatWontBeSaved = false;\r\n\r\n        public string Option1 { get => option1; set => SetValue(ref option1, value); }\r\n        public bool Option2 { get => option2; set => SetValue(ref option2, value); }\r\n        // Playnite serializes settings object to a JSON object and saves it as text file.\r\n        // If you want to exclude some property from being saved then use `JsonDontSerialize` ignore attribute.\r\n        [DontSerialize]\r\n        public bool OptionThatWontBeSaved { get => optionThatWontBeSaved; set => SetValue(ref optionThatWontBeSaved, value); }\r\n    }\r\n\r\n    public class _name_SettingsViewModel : ObservableObject, ISettings\r\n    {\r\n        private readonly _name_ plugin;\r\n        private _name_Settings editingClone { get; set; }\r\n\r\n        private _name_Settings settings;\r\n        public _name_Settings Settings\r\n        {\r\n            get => settings;\r\n            set\r\n            {\r\n                settings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public _name_SettingsViewModel(_name_ plugin)\r\n        {\r\n            // Injecting your plugin instance is required for Save/Load method because Playnite saves data to a location based on what plugin requested the operation.\r\n            this.plugin = plugin;\r\n\r\n            // Load saved settings.\r\n            var savedSettings = plugin.LoadPluginSettings<_name_Settings>();\r\n\r\n            // LoadPluginSettings returns null if no saved data is available.\r\n            if (savedSettings != null)\r\n            {\r\n                Settings = savedSettings;\r\n            }\r\n            else\r\n            {\r\n                Settings = new _name_Settings();\r\n            }\r\n        }\r\n\r\n        public void BeginEdit()\r\n        {\r\n            // Code executed when settings view is opened and user starts editing values.\r\n            editingClone = Serialization.GetClone(Settings);\r\n        }\r\n\r\n        public void CancelEdit()\r\n        {\r\n            // Code executed when user decides to cancel any changes made since BeginEdit was called.\r\n            // This method should revert any changes made to Option1 and Option2.\r\n            Settings = editingClone;\r\n        }\r\n\r\n        public void EndEdit()\r\n        {\r\n            // Code executed when user decides to confirm changes made since BeginEdit was called.\r\n            // This method should save settings made to Option1 and Option2.\r\n            plugin.SavePluginSettings(Settings);\r\n        }\r\n\r\n        public bool VerifySettings(out List<string> errors)\r\n        {\r\n            // Code execute when user decides to confirm changes made since BeginEdit was called.\r\n            // Executed before EndEdit is called and EndEdit is not called if false is returned.\r\n            // List of errors is presented to user if verification fails.\r\n            errors = new List<string>();\r\n            return true;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/_name_SettingsView.xaml",
    "content": "﻿<UserControl x:Class=\"_namespace_._name_SettingsView\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"400\" d:DesignWidth=\"600\">\r\n    <StackPanel>\r\n        <TextBlock Text=\"Description for Option1:\"/>\r\n        <TextBox Text=\"{Binding Settings.Option1}\"/>\r\n        <TextBlock Text=\"Description for Option2:\"/>\r\n        <CheckBox IsChecked=\"{Binding Settings.Option2}\"/>\r\n    </StackPanel>\r\n</UserControl>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/_name_SettingsView.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace _namespace_\r\n{\r\n    public partial class _name_SettingsView : UserControl\r\n    {\r\n        public _name_SettingsView()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/extension.yaml",
    "content": "﻿Id: _name__00000000-0000-0000-0000-000000000001\r\nName: Custom Library Importer\r\nAuthor: John Doe\r\nVersion: 1.0\r\nModule: _name_.dll\r\nType: GameLibrary\r\nIcon: icon.png"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomLibraryPlugin/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"PlayniteSDK\" version=\"6.15.0\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/App.xaml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Application xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n    <Application.Resources>\r\n        <ResourceDictionary>\r\n            <Style x:Key=\"BaseTextBlockStyle\" TargetType=\"TextBlock\" />\r\n            <ResourceDictionary.MergedDictionaries>                \r\n                <ResourceDictionary Source=\"Localization/en_US.xaml\" />\r\n            </ResourceDictionary.MergedDictionaries>\r\n        </ResourceDictionary>\r\n    </Application.Resources>\r\n</Application>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/BuildInclude.txt",
    "content": "Properties\\AssemblyInfo.cs\r\nLocalization\\en_US.xaml\r\nCustomMetadataPlugin.csproj\r\nCustomMetadataPlugin.sln\r\nextension.yaml\r\nicon.png\r\npackages.config\r\n_name_.cs\r\n_name_Provider.cs\r\n_name_Settings.cs\r\n_name_SettingsView.xaml\r\n_name_SettingsView.xaml.cs\r\nApp.xaml"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/CustomMetadataPlugin.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{A54423D1-8E7A-4339-B0D5-24E7CEFE469B}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>_namespace_</RootNamespace>\r\n    <AssemblyName>_name_</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <Deterministic>true</Deterministic>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Playnite.SDK, Version=6.15.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <HintPath>packages\\PlayniteSDK.6.15.0\\lib\\net462\\Playnite.SDK.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xaml\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"WindowsBase\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"_name_.cs\" />\r\n    <Compile Include=\"_name_Provider.cs\" />\r\n    <Compile Include=\"_name_Settings.cs\" />\r\n    <Compile Include=\"_name_SettingsView.xaml.cs\">\r\n      <DependentUpon>_name_SettingsView.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"extension.yaml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"icon.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Localization\\*.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Page Include=\"App.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"_name_SettingsView.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/CustomMetadataPlugin.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 15\r\nVisualStudioVersion = 15.0.28307.1267\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CustomMetadataPlugin\", \"CustomMetadataPlugin.csproj\", \"{A54423D1-8E7A-4339-B0D5-24E7CEFE469B}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{A54423D1-8E7A-4339-B0D5-24E7CEFE469B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{A54423D1-8E7A-4339-B0D5-24E7CEFE469B}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{A54423D1-8E7A-4339-B0D5-24E7CEFE469B}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{A54423D1-8E7A-4339-B0D5-24E7CEFE469B}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {5C479C99-F527-4737-88D7-62D7B11B025A}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/Localization/en_US.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" \r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" \r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n                    \r\n</ResourceDictionary>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"_name_\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"_name_\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2019\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"00000000-0000-0000-0000-000000000001\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/_name_.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace _namespace_\r\n{\r\n    public class _name_ : MetadataPlugin\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        private _name_SettingsViewModel settings { get; set; }\r\n\r\n        public override Guid Id { get; } = Guid.Parse(\"00000000-0000-0000-0000-000000000001\");\r\n\r\n        public override List<MetadataField> SupportedFields { get; } = new List<MetadataField>\r\n        {\r\n            MetadataField.Description\r\n            // Include addition fields if supported by the metadata source\r\n        };\r\n\r\n        // Change to something more appropriate\r\n        public override string Name => \"Custom Metadata\";\r\n\r\n        public _name_(IPlayniteAPI api) : base(api)\r\n        {\r\n            settings = new _name_SettingsViewModel(this);\r\n            Properties = new MetadataPluginProperties\r\n            {\r\n                HasSettings = true\r\n            };\r\n        }\r\n\r\n        public override OnDemandMetadataProvider GetMetadataProvider(MetadataRequestOptions options)\r\n        {\r\n            return new _name_Provider(options, this);\r\n        }\r\n\r\n        public override ISettings GetSettings(bool firstRunSettings)\r\n        {\r\n            return settings;\r\n        }\r\n\r\n        public override UserControl GetSettingsView(bool firstRunSettings)\r\n        {\r\n            return new _name_SettingsView();\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/_name_Provider.cs",
    "content": "﻿using Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace _namespace_\r\n{\r\n    public class _name_Provider : OnDemandMetadataProvider\r\n    {\r\n        private readonly MetadataRequestOptions options;\r\n        private readonly _name_ plugin;\r\n\r\n        public override List<MetadataField> AvailableFields => throw new NotImplementedException();\r\n\r\n        public _name_Provider(MetadataRequestOptions options, _name_ plugin)\r\n        {\r\n            this.options = options;\r\n            this.plugin = plugin;\r\n        }\r\n\r\n        // Override additional methods based on supported metadata fields.\r\n        public override string GetDescription(GetMetadataFieldArgs args)\r\n        {\r\n            return options.GameData.Name + \" description\";\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/_name_Settings.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Data;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace _namespace_\r\n{\r\n    public class _name_Settings : ObservableObject\r\n    {\r\n        private string option1 = string.Empty;\r\n        private bool option2 = false;\r\n        private bool optionThatWontBeSaved = false;\r\n\r\n        public string Option1 { get => option1; set => SetValue(ref option1, value); }\r\n        public bool Option2 { get => option2; set => SetValue(ref option2, value); }\r\n        // Playnite serializes settings object to a JSON object and saves it as text file.\r\n        // If you want to exclude some property from being saved then use `JsonDontSerialize` ignore attribute.\r\n        [DontSerialize]\r\n        public bool OptionThatWontBeSaved { get => optionThatWontBeSaved; set => SetValue(ref optionThatWontBeSaved, value); }\r\n    }\r\n\r\n    public class _name_SettingsViewModel : ObservableObject, ISettings\r\n    {\r\n        private readonly _name_ plugin;\r\n        private _name_Settings editingClone { get; set; }\r\n\r\n        private _name_Settings settings;\r\n        public _name_Settings Settings\r\n        {\r\n            get => settings;\r\n            set\r\n            {\r\n                settings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public _name_SettingsViewModel(_name_ plugin)\r\n        {\r\n            // Injecting your plugin instance is required for Save/Load method because Playnite saves data to a location based on what plugin requested the operation.\r\n            this.plugin = plugin;\r\n\r\n            // Load saved settings.\r\n            var savedSettings = plugin.LoadPluginSettings<_name_Settings>();\r\n\r\n            // LoadPluginSettings returns null if no saved data is available.\r\n            if (savedSettings != null)\r\n            {\r\n                Settings = savedSettings;\r\n            }\r\n            else\r\n            {\r\n                Settings = new _name_Settings();\r\n            }\r\n        }\r\n\r\n        public void BeginEdit()\r\n        {\r\n            // Code executed when settings view is opened and user starts editing values.\r\n            editingClone = Serialization.GetClone(Settings);\r\n        }\r\n\r\n        public void CancelEdit()\r\n        {\r\n            // Code executed when user decides to cancel any changes made since BeginEdit was called.\r\n            // This method should revert any changes made to Option1 and Option2.\r\n            Settings = editingClone;\r\n        }\r\n\r\n        public void EndEdit()\r\n        {\r\n            // Code executed when user decides to confirm changes made since BeginEdit was called.\r\n            // This method should save settings made to Option1 and Option2.\r\n            plugin.SavePluginSettings(Settings);\r\n        }\r\n\r\n        public bool VerifySettings(out List<string> errors)\r\n        {\r\n            // Code execute when user decides to confirm changes made since BeginEdit was called.\r\n            // Executed before EndEdit is called and EndEdit is not called if false is returned.\r\n            // List of errors is presented to user if verification fails.\r\n            errors = new List<string>();\r\n            return true;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/_name_SettingsView.xaml",
    "content": "﻿<UserControl x:Class=\"_namespace_._name_SettingsView\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"400\" d:DesignWidth=\"600\">\r\n    <StackPanel>\r\n        <TextBlock Text=\"Description for Option1:\"/>\r\n        <TextBox Text=\"{Binding Settings.Option1}\"/>\r\n        <TextBlock Text=\"Description for Option2:\"/>\r\n        <CheckBox IsChecked=\"{Binding Settings.Option2}\"/>\r\n    </StackPanel>\r\n</UserControl>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/_name_SettingsView.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace _namespace_\r\n{\r\n    public partial class _name_SettingsView : UserControl\r\n    {\r\n        public _name_SettingsView()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/extension.yaml",
    "content": "﻿Id: _name__00000000-0000-0000-0000-000000000001\r\nName: Custom Metadata Provider\r\nAuthor: John Doe\r\nVersion: 1.0\r\nModule: _name_.dll\r\nType: MetadataProvider\r\nIcon: icon.png"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/CustomMetadataPlugin/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"PlayniteSDK\" version=\"6.15.0\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/App.xaml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Application xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n    <Application.Resources>\r\n        <ResourceDictionary>\r\n            <Style x:Key=\"BaseTextBlockStyle\" TargetType=\"TextBlock\" />\r\n            <ResourceDictionary.MergedDictionaries>                \r\n                <ResourceDictionary Source=\"Localization/en_US.xaml\" />\r\n            </ResourceDictionary.MergedDictionaries>\r\n        </ResourceDictionary>\r\n    </Application.Resources>\r\n</Application>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/BuildInclude.txt",
    "content": "Properties\\AssemblyInfo.cs\r\nLocalization\\en_US.xaml\r\nextension.yaml\r\nGenericPlugin.csproj\r\nGenericPlugin.sln\r\nicon.png\r\npackages.config\r\n_name_.cs\r\n_name_Settings.cs\r\n_name_SettingsView.xaml\r\n_name_SettingsView.xaml.cs\r\nApp.xaml"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/GenericPlugin.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{4FDF1E89-5BC3-4C72-8FDA-0D580E7A5D5F}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>_namespace_</RootNamespace>\r\n    <AssemblyName>_name_</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <Deterministic>true</Deterministic>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Playnite.SDK, Version=6.15.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <HintPath>packages\\PlayniteSDK.6.15.0\\lib\\net462\\Playnite.SDK.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xaml\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"WindowsBase\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"_name_.cs\" />\r\n    <Compile Include=\"_name_Settings.cs\" />\r\n    <Compile Include=\"_name_SettingsView.xaml.cs\">\r\n      <DependentUpon>_name_SettingsView.xaml</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"extension.yaml\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"Localization\\*.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n    <Page Include=\"App.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Page Include=\"_name_SettingsView.xaml\">\r\n      <SubType>Designer</SubType>\r\n      <Generator>MSBuild:Compile</Generator>\r\n    </Page>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"icon.png\">\r\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\r\n    </None>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/GenericPlugin.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 15\r\nVisualStudioVersion = 15.0.28307.1267\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"GenericPlugin\", \"GenericPlugin.csproj\", \"{4FDF1E89-5BC3-4C72-8FDA-0D580E7A5D5F}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{4FDF1E89-5BC3-4C72-8FDA-0D580E7A5D5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{4FDF1E89-5BC3-4C72-8FDA-0D580E7A5D5F}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{4FDF1E89-5BC3-4C72-8FDA-0D580E7A5D5F}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{4FDF1E89-5BC3-4C72-8FDA-0D580E7A5D5F}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {620DAE38-0360-4A4F-A05E-7FE07CD0E592}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/Localization/en_US.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" \r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" \r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\">\r\n\r\n</ResourceDictionary>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"_name_\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"_name_\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2019\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"00000000-0000-0000-0000-000000000001\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/_name_.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Events;\r\nusing Playnite.SDK.Models;\r\nusing Playnite.SDK.Plugins;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Controls;\r\n\r\nnamespace _namespace_\r\n{\r\n    public class _name_ : GenericPlugin\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n\r\n        private _name_SettingsViewModel settings { get; set; }\r\n\r\n        public override Guid Id { get; } = Guid.Parse(\"00000000-0000-0000-0000-000000000001\");\r\n\r\n        public _name_(IPlayniteAPI api) : base(api)\r\n        {\r\n            settings = new _name_SettingsViewModel(this);\r\n            Properties = new GenericPluginProperties\r\n            {\r\n                HasSettings = true\r\n            };\r\n        }\r\n\r\n        public override void OnGameInstalled(OnGameInstalledEventArgs args)\r\n        {\r\n            // Add code to be executed when game is finished installing.\r\n        }\r\n\r\n        public override void OnGameStarted(OnGameStartedEventArgs args)\r\n        {\r\n            // Add code to be executed when game is started running.\r\n        }\r\n\r\n        public override void OnGameStarting(OnGameStartingEventArgs args)\r\n        {\r\n            // Add code to be executed when game is preparing to be started.\r\n        }\r\n\r\n        public override void OnGameStopped(OnGameStoppedEventArgs args)\r\n        {\r\n            // Add code to be executed when game is preparing to be started.\r\n        }\r\n\r\n        public override void OnGameUninstalled(OnGameUninstalledEventArgs args)\r\n        {\r\n            // Add code to be executed when game is uninstalled.\r\n        }\r\n\r\n        public override void OnApplicationStarted(OnApplicationStartedEventArgs args)\r\n        {\r\n            // Add code to be executed when Playnite is initialized.\r\n        }\r\n\r\n        public override void OnApplicationStopped(OnApplicationStoppedEventArgs args)\r\n        {\r\n            // Add code to be executed when Playnite is shutting down.\r\n        }\r\n\r\n        public override void OnLibraryUpdated(OnLibraryUpdatedEventArgs args)\r\n        {\r\n            // Add code to be executed when library is updated.\r\n        }\r\n\r\n        public override ISettings GetSettings(bool firstRunSettings)\r\n        {\r\n            return settings;\r\n        }\r\n\r\n        public override UserControl GetSettingsView(bool firstRunSettings)\r\n        {\r\n            return new _name_SettingsView();\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/_name_Settings.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Data;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace _namespace_\r\n{\r\n    public class _name_Settings : ObservableObject\r\n    {\r\n        private string option1 = string.Empty;\r\n        private bool option2 = false;\r\n        private bool optionThatWontBeSaved = false;\r\n\r\n        public string Option1 { get => option1; set => SetValue(ref option1, value); }\r\n        public bool Option2 { get => option2; set => SetValue(ref option2, value); }\r\n        // Playnite serializes settings object to a JSON object and saves it as text file.\r\n        // If you want to exclude some property from being saved then use `JsonDontSerialize` ignore attribute.\r\n        [DontSerialize]\r\n        public bool OptionThatWontBeSaved { get => optionThatWontBeSaved; set => SetValue(ref optionThatWontBeSaved, value); }\r\n    }\r\n\r\n    public class _name_SettingsViewModel : ObservableObject, ISettings\r\n    {\r\n        private readonly _name_ plugin;\r\n        private _name_Settings editingClone { get; set; }\r\n\r\n        private _name_Settings settings;\r\n        public _name_Settings Settings\r\n        {\r\n            get => settings;\r\n            set\r\n            {\r\n                settings = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public _name_SettingsViewModel(_name_ plugin)\r\n        {\r\n            // Injecting your plugin instance is required for Save/Load method because Playnite saves data to a location based on what plugin requested the operation.\r\n            this.plugin = plugin;\r\n\r\n            // Load saved settings.\r\n            var savedSettings = plugin.LoadPluginSettings<_name_Settings>();\r\n\r\n            // LoadPluginSettings returns null if no saved data is available.\r\n            if (savedSettings != null)\r\n            {\r\n                Settings = savedSettings;\r\n            }\r\n            else\r\n            {\r\n                Settings = new _name_Settings();\r\n            }\r\n        }\r\n\r\n        public void BeginEdit()\r\n        {\r\n            // Code executed when settings view is opened and user starts editing values.\r\n            editingClone = Serialization.GetClone(Settings);\r\n        }\r\n\r\n        public void CancelEdit()\r\n        {\r\n            // Code executed when user decides to cancel any changes made since BeginEdit was called.\r\n            // This method should revert any changes made to Option1 and Option2.\r\n            Settings = editingClone;\r\n        }\r\n\r\n        public void EndEdit()\r\n        {\r\n            // Code executed when user decides to confirm changes made since BeginEdit was called.\r\n            // This method should save settings made to Option1 and Option2.\r\n            plugin.SavePluginSettings(Settings);\r\n        }\r\n\r\n        public bool VerifySettings(out List<string> errors)\r\n        {\r\n            // Code execute when user decides to confirm changes made since BeginEdit was called.\r\n            // Executed before EndEdit is called and EndEdit is not called if false is returned.\r\n            // List of errors is presented to user if verification fails.\r\n            errors = new List<string>();\r\n            return true;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/_name_SettingsView.xaml",
    "content": "﻿<UserControl x:Class=\"_namespace_._name_SettingsView\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n             mc:Ignorable=\"d\"\r\n             d:DesignHeight=\"400\" d:DesignWidth=\"600\">\r\n    <StackPanel>\r\n        <TextBlock Text=\"Description for Option1:\"/>\r\n        <TextBox Text=\"{Binding Settings.Option1}\"/>\r\n        <TextBlock Text=\"Description for Option2:\"/>\r\n        <CheckBox IsChecked=\"{Binding Settings.Option2}\"/>\r\n    </StackPanel>\r\n</UserControl>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/_name_SettingsView.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Media.Imaging;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace _namespace_\r\n{\r\n    public partial class _name_SettingsView : UserControl\r\n    {\r\n        public _name_SettingsView()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/extension.yaml",
    "content": "﻿Id: _name__00000000-0000-0000-0000-000000000001\r\nName: Generic Plugin\r\nAuthor: John Doe\r\nVersion: 1.0\r\nModule: _name_.dll\r\nType: GenericPlugin\r\nIcon: icon.png"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/GenericPlugin/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"PlayniteSDK\" version=\"6.15.0\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/PowerShellScript/BuildInclude.txt",
    "content": "extension.yaml\r\nPowerShellScript.psm1"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/PowerShellScript/PowerShellScript.psm1",
    "content": "function OnApplicationStarted()\r\n{\r\n    $__logger.Info(\"OnApplicationStarted\")\r\n}\r\n\r\nfunction OnApplicationStopped()\r\n{\r\n    $__logger.Info(\"OnApplicationStopped\")\r\n}\r\n\r\nfunction OnLibraryUpdated()\r\n{\r\n    $__logger.Info(\"OnLibraryUpdated\")\r\n}\r\n\r\nfunction OnGameStarting()\r\n{\r\n    param($evnArgs)\r\n    $__logger.Info(\"OnGameStarting $($evnArgs.Game)\")\r\n}\r\n\r\nfunction OnGameStarted()\r\n{\r\n    param($evnArgs)\r\n    $__logger.Info(\"OnGameStarted $($evnArgs.Game)\")\r\n}\r\n\r\nfunction OnGameStopped()\r\n{\r\n    param($evnArgs)\r\n    $__logger.Info(\"OnGameStopped $($evnArgs.Game) $($evnArgs.ElapsedSeconds)\")\r\n}\r\n\r\nfunction OnGameInstalled()\r\n{\r\n    param($evnArgs)\r\n    $__logger.Info(\"OnGameInstalled $($evnArgs.Game)\")\r\n}\r\n\r\nfunction OnGameUninstalled()\r\n{\r\n    param($evnArgs)\r\n    $__logger.Info(\"OnGameUninstalled $($evnArgs.Game)\")\r\n}\r\n\r\nfunction OnGameSelected()\r\n{\r\n    param($gameSelectionEventArgs)\r\n    $__logger.Info(\"OnGameSelected $($gameSelectionEventArgs.OldValue) -> $($gameSelectionEventArgs.NewValue)\")\r\n}\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Extensions/PowerShellScript/extension.yaml",
    "content": "Id: _name__00000000-0000-0000-0000-000000000001\r\nName: PowerShell Extension\r\nAuthor: John Doe\r\nVersion: 1.0\r\nModule: PowerShellScript.psm1\r\nType: Script"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.4.1-1.5.0.txt",
    "content": "M\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/NullableIntBox.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/NumericBox.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/SliderEx.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/GridViewItemTemplate.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Media.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/DetailsViewGameOverview.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/FilterPanel.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/GridViewGameOverview.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/MainPanel.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Constants.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/Button.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ListGameItem.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameDetails.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/MainMenu.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/SettingsMenu.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.5.0-1.6.0.txt",
    "content": "M\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/Main.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/SettingsMenu.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.6.0-1.7.0.txt",
    "content": "A\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/ExpanderEx.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/GameGroupMenu.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/SidebarItem.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Button.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Expander.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/TextBox.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ToggleButton.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/TreeView.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/DetailsViewGroupStyle.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/DetailsViewItemStyle.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Media.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/DetailsViewGameOverview.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/GridViewGameOverview.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/Library.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/LibraryDetailsView.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/LibraryGridView.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/MainWindow.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/Sidebar.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Constants.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ToolTip.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.7.0-1.8.0.txt",
    "content": "A\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DescriptionView.html\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ProgressBar.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DescriptionView.html\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameDetails.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.8.0-1.9.0.txt",
    "content": "M\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Constants.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/MainPanel.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameMenu.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/1.9.0-2.0.0.txt",
    "content": "M\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Constants.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/ComboBoxList.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/ExtendedDataGrid.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/FilterSelectionBox.xaml\r\nD\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/MainMenu.xaml\r\nD\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/NullableIntBox.xaml\r\nD\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/NumericBox.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/NumericBoxes.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/PathSelectionBox.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/SearchBox.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/SidebarItem.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/SliderEx.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/TopPanelItem.xaml\r\nD\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/ViewSettingsMenu.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/CheckBox.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/DataGrid.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Expander.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ScrollViewer.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Slider.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/TabControl.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Thumb.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/GridViewGroupStyle.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/ListViewGroupStyle.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/PlayButton.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/PropertyItemButton.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Media.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/DetailsViewGameOverview.xaml\r\nD\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/FilterPanel.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/FilterPanelView.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/GridViewGameOverview.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/Library.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/LibraryDetailsView.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/LibraryGridView.xaml\r\nD\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/MainPanel.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/Sidebar.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/TopPanel.xaml\r\nD\tsource/Playnite.DesktopApp/Themes/Desktop/DefaultRed/Constants.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Constants.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/CustomControls/FilterDbItemtSelection.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/CustomControls/FilterEnumListSelection.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/CustomControls/FilterPresetSelector.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/CustomControls/FilterStringListSelection.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/CustomControls/WindowBase.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/Button.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/CheckBox.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ComboBox.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ScrollViewer.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/Slider.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/TextBox.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ToggleButton.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ToolTip.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ButtonBottomMenu.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ButtonFilterNagivation.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ButtonMainMenu.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ButtonMessageBox.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ButtonTopMenu.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ButtonVirtualKeyboard.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/CheckBoxSettings.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ListGameItem.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ListGameItemStyle.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ListGameItemTemplate.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/MainWindowStyle.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ToggleButtonTopFilter.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Images/ButtonPrompts/PlayStation/PlayStation.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Images/ButtonPrompts/Xbox/Xbox.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/ActionSelection.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/Filters.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/FiltersAdditional.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/FiltersView.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameDetails.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameMenu.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameStatus.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/Main.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/MainMenu.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/MessageBox.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/Notifications.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/NotificationsMenu.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/SettingsMenu.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/SettingsMenus.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/TextInput.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/DefaultLime/Constants.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/2.0.0-2.1.0.txt",
    "content": "M\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/ComboBoxList.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/2.1.0-2.2.0.txt",
    "content": "A\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/HotKeyBox.xaml\r\nA\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/SearchView.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/HelpMenu.xaml\r\nA\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/ItemSelection.xaml\r\nD\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/ActionSelection.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Constants.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/SliderEx.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Button.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ComboBox.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/CheckBox.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/ScrollViewer.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DefaultControls/Slider.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/DerivedStyles/NotificationMessage.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Media.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/DetailsViewGameOverview.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/GridViewGameOverview.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/TopPanel.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/CustomControls/FilterPresetSelector.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/Slider.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DerivedStyles/ListGameItemStyle.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/FiltersView.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameDetails.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameMenu.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/MainMenu.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/2.2.0-2.3.0.txt",
    "content": "M\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Media.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/DetailsViewGameOverview.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/GridViewGameOverview.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/TopPanel.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/2.3.0-2.4.0.txt",
    "content": "M\tsource/Playnite.DesktopApp/Themes/Desktop/Default/CustomControls/GameMenu.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/SearchView.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameDetails.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameStatus.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/2.4.0-2.5.0.txt",
    "content": "M\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Media.xaml\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/DetailsViewGameOverview.xaml\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/GridViewGameOverview.xaml\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameMenu.xaml\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/MainMenu.xaml\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/2.5.0-2.6.0.txt",
    "content": "D\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Images/twitter.png\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/MainMenu.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/SettingsMenus.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/2.7.0-2.8.0.txt",
    "content": "A\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/CustomMenus.xaml\r\nM\tsource/Playnite.DesktopApp/Themes/Desktop/Default/Views/ExplorerPanel.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/GameMenu.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Views/MainMenu.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Changelog/2.8.0-2.9.0.txt",
    "content": "M\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Constants.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/DefaultControls/ProgressBar.xaml\r\nM\tsource/Playnite.FullscreenApp/Themes/Fullscreen/Default/Media.xaml\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Desktop/Theme.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{DEFEF902-318F-4568-AEDB-4F681A2D1D9B}</ProjectGuid>\r\n    <OutputType>WinExe</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>Theme</RootNamespace>\r\n    <AssemblyName>Theme</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <Deterministic>true</Deterministic>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <StartupObject />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Playnite\">\r\n      <HintPath>..\\..\\..\\Playnite.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Playnite.SDK\">\r\n      <HintPath>..\\..\\..\\Playnite.SDK.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Playnite.DesktopApp\">\r\n      <HintPath>..\\..\\..\\Playnite.DesktopApp.exe</HintPath>\r\n    </Reference>\r\n        <Reference Include=\"HtmlRenderer\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\..\\HtmlRenderer.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"HtmlRenderer.WPF\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\..\\HtmlRenderer.WPF.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PhotoSauce.MagicScaler\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\..\\PhotoSauce.MagicScaler.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Windows.Interactivity\">\r\n      <HintPath>..\\..\\..\\System.Windows.Interactivity.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Xaml\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"WindowsBase\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ApplicationDefinition Include=\"App.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </ApplicationDefinition>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"theme.yaml\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Desktop/Theme.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 15\r\nVisualStudioVersion = 15.0.28307.539\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Theme\", \"Theme.csproj\", \"{DEFEF902-318F-4568-AEDB-4F681A2D1D9B}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{DEFEF902-318F-4568-AEDB-4F681A2D1D9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{DEFEF902-318F-4568-AEDB-4F681A2D1D9B}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{DEFEF902-318F-4568-AEDB-4F681A2D1D9B}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{DEFEF902-318F-4568-AEDB-4F681A2D1D9B}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {EF4E8A61-70F4-467A-BFAC-34758533A904}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Fullscreen/Theme.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{DEFEF902-318F-4568-AEDB-4F681A2D1D9A}</ProjectGuid>\r\n    <OutputType>WinExe</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>Theme</RootNamespace>\r\n    <AssemblyName>Theme</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <Deterministic>true</Deterministic>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <StartupObject />\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Playnite\">\r\n      <HintPath>..\\..\\..\\Playnite.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Playnite.SDK\">\r\n      <HintPath>..\\..\\..\\Playnite.SDK.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Playnite.FullscreenApp\">\r\n      <HintPath>..\\..\\..\\Playnite.FullscreenApp.exe</HintPath>\r\n    </Reference>\r\n        <Reference Include=\"HtmlRenderer\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\..\\HtmlRenderer.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"HtmlRenderer.WPF\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\..\\HtmlRenderer.WPF.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PhotoSauce.MagicScaler\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\..\\PhotoSauce.MagicScaler.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Windows.Interactivity\">\r\n      <HintPath>..\\..\\..\\System.Windows.Interactivity.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System.Xaml\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"WindowsBase\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ApplicationDefinition Include=\"App.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </ApplicationDefinition>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"theme.yaml\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Templates/Themes/Fullscreen/Theme.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 15\r\nVisualStudioVersion = 15.0.28307.539\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBD}\") = \"Theme\", \"Theme.csproj\", \"{DEFEF902-318F-4568-AEDB-4F681A2D1D9A}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{DEFEF902-318F-4568-AEDB-4F681A2D1D9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{DEFEF902-318F-4568-AEDB-4F681A2D1D9A}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{DEFEF902-318F-4568-AEDB-4F681A2D1D9A}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{DEFEF902-318F-4568-AEDB-4F681A2D1D9A}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {EF4E8A61-70F4-467A-BFAC-34758533A904}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Themes.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Plugins;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.IO.Compression;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\nusing System.Xml.Linq;\r\n\r\nnamespace Playnite.Toolbox\r\n{\r\n    public class FileChange\r\n    {\r\n        public string ChangeType { get; set; }\r\n        public string Path { get; set; }\r\n\r\n        public override string ToString()\r\n        {\r\n            return $\"{ChangeType}: {Path}\";\r\n        }\r\n    }\r\n\r\n    public class Themes\r\n    {\r\n        private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();\r\n        public const string GlobalResourcesName = \"GlobalResources.xaml\";\r\n        public const string ControlGalleryViewName = \"ControlGalleryView.xaml\";\r\n\r\n        public static List<string> PackageFileBlackList { get; } = new List<string>\r\n        {\r\n            PlaynitePaths.ThemeManifestFileName,\r\n            PlaynitePaths.ThemeProjFileName,\r\n            PlaynitePaths.ThemeSlnFileName,\r\n            PlaynitePaths.AppXamlFileName,\r\n            GlobalResourcesName,\r\n            PlaynitePaths.EngLocSourceFileName,\r\n            ControlGalleryViewName\r\n        };\r\n\r\n        public static List<string> PackageFileBlackListRegex { get; } = new List<string>\r\n        {\r\n            @\"\\.sln$\",\r\n            @\"\\.csproj$\",\r\n            @\"\\.csproj\\.user$\",\r\n            @\"^Fonts\\\\\",\r\n            @\"^\\.vs\\\\\",\r\n            @\"^bin\\\\\",\r\n            @\"^obj\\\\\",\r\n            @\"^backup_\"\r\n        };\r\n\r\n        public static List<FileChange> GetThemeChangelog(Version baseVersion, ApplicationMode mode, string changelogDir)\r\n        {\r\n            if (!Directory.Exists(changelogDir))\r\n            {\r\n                throw new FileNotFoundException(\"Theme changelog not found.\");\r\n            }\r\n\r\n            var changes = new List<FileChange>();\r\n            foreach (var changeFile in Directory.GetFiles(changelogDir, \"*.txt\").OrderBy(a => a))\r\n            {\r\n                var match = Regex.Match(Path.GetFileName(changeFile), @\"(.+)-(.+)\\.txt\");\r\n                if (!match.Success)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                var oldVersion = new Version(match.Groups[1].Value);\r\n                var newVersion = new Version(match.Groups[2].Value);\r\n                if (oldVersion < baseVersion)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                foreach (var line in File.ReadAllLines(changeFile))\r\n                {\r\n                    var lineMatch = Regex.Match(line, $\"([A-Z])\\\\s(.+{ThemeManager.GetThemeRootDir(mode)}\\\\/Default.+)\");\r\n                    if (!lineMatch.Success)\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    var changeType = lineMatch.Groups[1].Value;\r\n                    var changePath = lineMatch.Groups[2].Value;\r\n\r\n                    var exist = changes.FirstOrDefault(a => a.Path == changePath);\r\n                    if (exist != null)\r\n                    {\r\n                        changes.Remove(exist);\r\n                    }\r\n\r\n                    changes.Add(new FileChange\r\n                    {\r\n                        ChangeType = changeType,\r\n                        Path = changePath\r\n                    });\r\n                }\r\n            }\r\n\r\n            return changes;\r\n        }\r\n\r\n        public static List<FileChange> GetThemeChangelog(Version baseVersion, ApplicationMode mode)\r\n        {\r\n            return GetThemeChangelog(baseVersion, mode, Paths.ChangeLogsDir);\r\n        }\r\n\r\n        public static void CopyThemeDirectory(string sourceDirName, string destDirName, List<string> approvedXamls)\r\n        {\r\n            var dir = new DirectoryInfo(sourceDirName);\r\n            if (!dir.Exists)\r\n            {\r\n                throw new DirectoryNotFoundException(\r\n                    \"Source directory does not exist or could not be found: \"\r\n                    + sourceDirName);\r\n            }\r\n\r\n            var dirs = dir.GetDirectories();\r\n            if (!Directory.Exists(destDirName))\r\n            {\r\n                Directory.CreateDirectory(destDirName);\r\n            }\r\n\r\n            var files = dir.GetFiles();\r\n            foreach (var file in files)\r\n            {\r\n                string temppath = Path.Combine(destDirName, file.Name);\r\n                if (file.Extension.Equals(\".xaml\", StringComparison.OrdinalIgnoreCase))\r\n                {\r\n                    if (approvedXamls.ContainsString(file.FullName))\r\n                    {\r\n                        file.CopyTo(temppath, true);\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    file.CopyTo(temppath, true);\r\n                }\r\n            }\r\n\r\n            foreach (var subdir in dirs)\r\n            {\r\n                string temppath = Path.Combine(destDirName, subdir.Name);\r\n                CopyThemeDirectory(subdir.FullName, temppath, approvedXamls);\r\n            }\r\n        }\r\n\r\n        public static bool AreFilesEqual(string file1, string file2)\r\n        {\r\n            var file1Info = new FileInfo(file1);\r\n            var file2Info = new FileInfo(file2);\r\n            if (file1Info.Length != file2Info.Length)\r\n            {\r\n                return false;\r\n            }\r\n\r\n            if (file1Info.Extension.Equals(\".xaml\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                return Xml.AreEqual(File.ReadAllText(file1), File.ReadAllText(file2));\r\n            }\r\n            else\r\n            {\r\n                return FileSystem.GetMD5(file1) == FileSystem.GetMD5(file2);\r\n            }\r\n        }\r\n\r\n        public static string PackageTheme(string themeDirectory, string targetPath, ApplicationMode mode)\r\n        {\r\n            var dirInfo = new DirectoryInfo(themeDirectory);\r\n            var manifestPath = Path.Combine(themeDirectory, PlaynitePaths.ThemeManifestFileName);\r\n            if (!File.Exists(manifestPath))\r\n            {\r\n                throw new Exception($\"Manifest file ({PlaynitePaths.ThemeManifestFileName}) not found!\");\r\n            }\r\n\r\n            var extInfo = ExtensionInstaller.GetThemeManifest(manifestPath);\r\n            if (extInfo.Id.IsNullOrEmpty())\r\n            {\r\n                throw new Exception(\"Cannot package theme, ID is missing!\");\r\n            }\r\n\r\n            extInfo.VerifyManifest();\r\n\r\n            var apiVer = extInfo.Mode == ApplicationMode.Desktop ? ThemeManager.DesktopApiVersion : ThemeManager.FullscreenApiVersion;\r\n            var themeApiVer = Version.Parse(extInfo.ThemeApiVersion);\r\n            if (themeApiVer > apiVer)\r\n            {\r\n                throw new Exception($\"Cannot package theme. Unsupported API version detected: {themeApiVer}\");\r\n            }\r\n            else if (themeApiVer != apiVer)\r\n            {\r\n                logger.Warn(\"Selected theme has not been updated to the latest supported API version. Please consider updating the theme!\");\r\n                logger.Warn(\"https://github.com/JosefNemec/Playnite/issues/1259\");\r\n            }\r\n\r\n            var defaultThemeDir = Path.Combine(Paths.GetThemesPath(mode), \"Default\");\r\n            targetPath = Path.Combine(targetPath, $\"{Common.Paths.GetSafePathName(extInfo.Id).Replace(' ', '_')}_{extInfo.Version.ToString().Replace(\".\", \"_\")}{PlaynitePaths.PackedThemeFileExtention}\");\r\n            FileSystem.PrepareSaveFile(targetPath);\r\n            using (var zipStream = new FileStream(targetPath, FileMode.Create))\r\n            {\r\n                using (var zipFile = new ZipArchive(zipStream, ZipArchiveMode.Create))\r\n                {\r\n                    zipFile.CreateEntryFromFile(manifestPath, PlaynitePaths.ThemeManifestFileName);\r\n\r\n                    foreach (var file in Directory.GetFiles(themeDirectory, \"*.*\", SearchOption.AllDirectories))\r\n                    {\r\n                        var subName = file.Replace(themeDirectory, \"\").TrimStart(Path.DirectorySeparatorChar);\r\n                        if (file == targetPath)\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        if (PackageFileBlackList.Any(a => subName.EndsWith(a, StringComparison.OrdinalIgnoreCase)))\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        if (PackageFileBlackListRegex.Any(a => Regex.IsMatch(subName, a, RegexOptions.IgnoreCase)))\r\n                        {\r\n                            continue;\r\n                        }\r\n\r\n                        var defaultFile = Path.Combine(defaultThemeDir, subName);\r\n                        if (File.Exists(defaultFile))\r\n                        {\r\n                            if (!AreFilesEqual(file, defaultFile))\r\n                            {\r\n                                zipFile.CreateEntryFromFile(file, subName, CompressionLevel.Optimal);\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            zipFile.CreateEntryFromFile(file, subName);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return targetPath;\r\n        }\r\n\r\n        public static void BackupTheme(string themeDirectory, string destination)\r\n        {\r\n            var dir = new DirectoryInfo(themeDirectory);\r\n            var dirs = dir.GetDirectories();\r\n            if (!Directory.Exists(destination))\r\n            {\r\n                Directory.CreateDirectory(destination);\r\n            }\r\n\r\n            var files = dir.GetFiles();\r\n            foreach (var file in files)\r\n            {\r\n                var targetPath = Path.Combine(destination, file.Name);\r\n                file.CopyTo(targetPath, true);\r\n            }\r\n\r\n            foreach (var subdir in dirs)\r\n            {\r\n                if (!subdir.Name.StartsWith(\"backup_\"))\r\n                {\r\n                    string targetPath = Path.Combine(destination, subdir.Name);\r\n                    BackupTheme(subdir.FullName, targetPath);\r\n                }\r\n            }\r\n        }\r\n\r\n        public static void UpdateTheme(string themeDirectory, ApplicationMode mode)\r\n        {\r\n            var themeManifestPath = Path.Combine(themeDirectory, \"theme.yaml\");\r\n            var currentThemeMan = new ThemeManifest(themeManifestPath);\r\n            var origThemeApiVersion = new Version(currentThemeMan.ThemeApiVersion);\r\n\r\n            if (!File.Exists(Path.Combine(themeDirectory, PlaynitePaths.ThemeProjFileName)))\r\n            {\r\n                throw new Exception(\"Cannot update theme that was not generated via Toolbox utility.\");\r\n            }\r\n\r\n            if (ThemeManager.GetApiVersion(mode) == origThemeApiVersion)\r\n            {\r\n                logger.Warn(\"Theme is already updated to current API version.\");\r\n                return;\r\n            }\r\n\r\n            var folder = Paths.GetNextBackupFolder(themeDirectory);\r\n            BackupTheme(themeDirectory, Paths.GetNextBackupFolder(themeDirectory));\r\n            logger.Info($\"Current theme backed up into \\\"{Path.GetFileName(folder)}\\\" folder.\");\r\n\r\n            var defaultThemeDir = Path.Combine(Paths.GetThemesPath(mode), \"Default\");\r\n            var origFilesZip = Path.Combine(Paths.ChangeLogsDir, currentThemeMan.ThemeApiVersion + \".zip\");\r\n            var themeChanges = Themes.GetThemeChangelog(origThemeApiVersion, mode);\r\n            if (!themeChanges.HasItems())\r\n            {\r\n                logger.Info(\"No files to update.\");\r\n                return;\r\n            }\r\n\r\n            // Update files\r\n            var notUpdated = new List<string>();\r\n            using (var origFiles = ZipFile.OpenRead(origFilesZip))\r\n            {\r\n                foreach (var changedFile in themeChanges)\r\n                {\r\n                    var subpath = Common.Paths.FixSeparators(Regex.Replace(changedFile.Path, \".+Themes/(Desktop|Fullscreen)/Default/\", \"\"));\r\n                    var curThemePath = Path.Combine(themeDirectory, subpath);\r\n                    var defaultPath = Path.Combine(defaultThemeDir, subpath);\r\n                    if (changedFile.ChangeType == \"D\")\r\n                    {\r\n                        FileSystem.DeleteFile(curThemePath);\r\n                    }\r\n                    else\r\n                    {\r\n                        var canUpdate = false;\r\n                        if (File.Exists(curThemePath))\r\n                        {\r\n                            var origEntry = origFiles.GetEntry(ThemeManager.GetThemeRootDir(mode) + \"\\\\\" + subpath);\r\n                            if (origEntry == null)\r\n                            {\r\n                                canUpdate = false;\r\n                            }\r\n                            else\r\n                            {\r\n                                var origContent = string.Empty;\r\n                                using (var reader = new StreamReader(origEntry.Open()))\r\n                                {\r\n                                    origContent = reader.ReadToEnd();\r\n                                }\r\n\r\n                                if (subpath.EndsWith(\".xaml\", StringComparison.OrdinalIgnoreCase))\r\n                                {\r\n                                    if (Xml.AreEqual(origContent, File.ReadAllText(curThemePath)))\r\n                                    {\r\n                                        canUpdate = true;\r\n                                    }\r\n                                }\r\n                                else\r\n                                {\r\n                                    if (origContent == FileSystem.GetMD5(curThemePath))\r\n                                    {\r\n                                        canUpdate = true;\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            canUpdate = true;\r\n                        }\r\n\r\n                        if (canUpdate)\r\n                        {\r\n                            FileSystem.CopyFile(defaultPath, curThemePath);\r\n                        }\r\n                        else\r\n                        {\r\n                            logger.Debug($\"Can't update {subpath}.\");\r\n                            notUpdated.Add(subpath);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (notUpdated.HasItems())\r\n            {\r\n                logger.Warn(\"Couldn't update some theme files, please update them manually:\");\r\n                notUpdated.ForEach(a => logger.Warn(a));\r\n            }\r\n\r\n            // Update common files\r\n            GenerateCommonThemeFiles(mode, themeDirectory);\r\n\r\n            // Update manifest\r\n            currentThemeMan.ThemeApiVersion = ThemeManager.GetApiVersion(mode).ToString(3);\r\n            File.WriteAllText(themeManifestPath, Serialization.ToYaml(currentThemeMan));\r\n        }\r\n\r\n        public static List<string> GenerateCommonThemeFiles(ApplicationMode mode, string outDir)\r\n        {\r\n            var defaultThemeXamlFiles = new List<string>();\r\n\r\n            // Modify paths in App.xaml\r\n            var appXaml = XDocument.Load(Paths.GetThemeTemplateFilePath(mode, PlaynitePaths.AppXamlFileName));\r\n            foreach (var resDir in appXaml.Descendants().Where(a =>\r\n                a.Name.LocalName == \"ResourceDictionary\" && a.Attribute(\"Source\")?.Value.StartsWith(\"Themes\") == true))\r\n            {\r\n                var val = resDir.Attribute(\"Source\").Value.Replace($\"Themes/{mode.GetDescription()}/Default/\", \"\");\r\n                resDir.Attribute(\"Source\").Value = val;\r\n                defaultThemeXamlFiles.Add(val.Replace('/', '\\\\'));\r\n            }\r\n\r\n            // Remove resources that should not be part of the theme\r\n            var hidden = appXaml.Descendants().FirstOrDefault(a => a.Attribute(\"Source\")?.Value == \"HiddenStyles.xaml\");\r\n            hidden?.Remove();\r\n\r\n            // Change localization file reference\r\n            var langElem = appXaml.Descendants().First(a => a.Attribute(\"Source\")?.Value.EndsWith(PlaynitePaths.EngLocSourceFileName) == true);\r\n            langElem.Attribute(\"Source\").Value = PlaynitePaths.EngLocSourceFileName;\r\n\r\n            // Update theme project file\r\n            XNamespace ns = \"http://schemas.microsoft.com/developer/msbuild/2003\";\r\n            var csproj = XDocument.Load(Paths.GetThemeTemplateFilePath(mode, PlaynitePaths.ThemeProjFileName));\r\n            var groupRoot = new XElement(ns + \"ItemGroup\");\r\n            csproj.Root.Add(groupRoot);\r\n\r\n            foreach (var resDir in appXaml.Descendants().Where(a =>\r\n               a.Name.LocalName == \"ResourceDictionary\" && a.Attribute(\"Source\") != null))\r\n            {\r\n                groupRoot.Add(new XElement(ns + \"Content\",\r\n                                new XAttribute(\"Include\", resDir.Attribute(\"Source\").Value.Replace('/', '\\\\')),\r\n                                new XElement(ns + \"Generator\", \"MSBuild:Compile\"),\r\n                                new XElement(ns + \"SubType\", \"Designer\")));\r\n            }\r\n\r\n            appXaml.Save(Path.Combine(outDir, PlaynitePaths.AppXamlFileName));\r\n            csproj.Save(Path.Combine(outDir, PlaynitePaths.ThemeProjFileName));\r\n\r\n            FileSystem.CopyFile(Paths.GetThemeTemplatePath(PlaynitePaths.EngLocSourceFileName), Path.Combine(outDir, PlaynitePaths.EngLocSourceFileName));\r\n            FileSystem.CopyFile(Paths.GetThemeTemplateFilePath(mode, Themes.GlobalResourcesName), Path.Combine(outDir, Themes.GlobalResourcesName));\r\n            FileSystem.CopyFile(Paths.GetThemeTemplateFilePath(mode, PlaynitePaths.ThemeSlnFileName), Path.Combine(outDir, PlaynitePaths.ThemeSlnFileName));\r\n\r\n            var outGalleryFile = Path.Combine(outDir, ControlGalleryViewName);\r\n            FileSystem.CopyFile(Paths.GetThemeTemplateFilePath(mode, ControlGalleryViewName), outGalleryFile);\r\n            // We need to modify pctrls namespace in ControlGalleryViewName\r\n            // because the original version is made in a way to be compatbiel when loaded from Playnite solution\r\n            File.WriteAllText(outGalleryFile,\r\n                File.ReadAllText(outGalleryFile).Replace(\r\n                    $\"clr-namespace:Playnite.{mode}App.Controls\",\r\n                    $\"clr-namespace:Playnite.{mode}App.Controls;assembly=Playnite.{mode}App\"));\r\n\r\n            var commonFontsDirs = Paths.GetThemeTemplatePath(\"Fonts\");\r\n            if (Directory.Exists(commonFontsDirs))\r\n            {\r\n                foreach (var fontFile in Directory.GetFiles(commonFontsDirs))\r\n                {\r\n                    var targetPath = Path.Combine(outDir, \"Fonts\", Path.GetFileName(fontFile));\r\n                    FileSystem.CopyFile(fontFile, targetPath);\r\n                }\r\n            }\r\n\r\n            var modeFontDir = Paths.GetThemeTemplateFilePath(mode, \"Fonts\");\r\n            if (Directory.Exists(modeFontDir))\r\n            {\r\n                foreach (var fontFile in Directory.GetFiles(modeFontDir))\r\n                {\r\n                    var targetPath = Path.Combine(outDir, \"Fonts\", Path.GetFileName(fontFile));\r\n                    FileSystem.CopyFile(fontFile, targetPath);\r\n                }\r\n            }\r\n\r\n            return defaultThemeXamlFiles;\r\n        }\r\n\r\n        public static string GenerateNewTheme(ApplicationMode mode, string themeName)\r\n        {\r\n            var themeDirName = Common.Paths.GetSafePathName(themeName).Replace(\" \", string.Empty);\r\n            var defaultThemeDir = Path.Combine(Paths.GetThemesPath(mode), \"Default\");\r\n            var outDir = Path.Combine(PlaynitePaths.ThemesProgramPath, mode.GetDescription(), themeDirName);\r\n            if (Directory.Exists(outDir))\r\n            {\r\n                throw new Exception($\"Theme directory \\\"{outDir}\\\" already exists.\");\r\n            }\r\n\r\n            FileSystem.CreateDirectory(outDir);\r\n            var defaultThemeXamlFiles = GenerateCommonThemeFiles(mode, outDir);\r\n            CopyThemeDirectory(defaultThemeDir, outDir, defaultThemeXamlFiles.Select(a => Path.Combine(defaultThemeDir, a)).ToList());\r\n\r\n            var themeDesc = new ThemeManifest()\r\n            {\r\n                Id = themeName + \"_\" + Guid.NewGuid().ToString(),\r\n                Author = \"Your Name Here\",\r\n                Name = themeName,\r\n                Version = \"1.0\",\r\n                Mode = mode,\r\n                ThemeApiVersion = ThemeManager.GetApiVersion(mode).ToString()\r\n            };\r\n\r\n            File.WriteAllText(Path.Combine(outDir, PlaynitePaths.ThemeManifestFileName), Serialization.ToYaml(themeDesc));\r\n            Explorer.NavigateToFileSystemEntry(Path.Combine(outDir, PlaynitePaths.ThemeSlnFileName));\r\n            return outDir;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/Verify.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Common.Web;\r\nusing System;\r\nusing System.Net;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Toolbox\r\n{\r\n    public class Verify\r\n    {\r\n        private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();\r\n\r\n        public static bool VerifyInstallerManifest(string manifestFile, out string addonId)\r\n        {\r\n            logger.Info($\"Verifying installer manifest {manifestFile} ...\");\r\n            addonId = string.Empty;\r\n            var passed = true;\r\n            if (manifestFile.IsHttpUrl())\r\n            {\r\n                var newManifestFile = Path.Combine(PlaynitePaths.TempPath, \"httpmanifest.yaml\");\r\n                HttpDownloader.DownloadFile(manifestFile, newManifestFile);\r\n                manifestFile = newManifestFile;\r\n            }\r\n\r\n            if (!File.Exists(manifestFile))\r\n            {\r\n                logger.Error(\"Manifest file not found!\");\r\n                passed = false;\r\n                return false;\r\n            }\r\n\r\n            AddonInstallerManifestBase manifest = null;\r\n            try\r\n            {\r\n                manifest = Serialization.FromYamlFile<AddonInstallerManifestBase>(manifestFile);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to parse installer manifest YAML:\");\r\n                logger.Error(e.Message);\r\n                passed = false;\r\n                return false;\r\n            }\r\n\r\n            addonId = manifest.AddonId;\r\n            CheckPropertyString(manifest.AddonId, nameof(manifest.AddonId), true, ref passed);\r\n            if (manifest.Packages.HasItems())\r\n            {\r\n                foreach (var package in manifest.Packages)\r\n                {\r\n                    CheckPropertyURL(package.PackageUrl, $\"Package > {nameof(package.PackageUrl)}\", true, false, ref passed);\r\n                    CheckPropertyDateTime(package.ReleaseDate, $\"Package > {nameof(package.ReleaseDate)}\", true, ref passed);\r\n                    CheckPropertyVersion(package.Version, $\"Package > {nameof(package.Version)}\", true, ref passed);\r\n                    CheckPropertyVersion(package.RequiredApiVersion, $\"Package > {nameof(package.RequiredApiVersion)}\", true, ref passed);\r\n                    if (!package.Changelog.HasNonEmptyItems())\r\n                    {\r\n                        logger.Error($\"Installer package is missing changelog.\");\r\n                        passed = false;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                logger.Error(\"Installer manifest doesn't have any packages specified.\");\r\n                passed = false;\r\n            }\r\n\r\n            if (passed)\r\n            {\r\n                logger.Info(\"Installer manifest passed verification.\");\r\n            }\r\n            else\r\n            {\r\n                logger.Error(\"Installer manifest didn't pass verification.\");\r\n            }\r\n\r\n            return passed;\r\n        }\r\n\r\n        public static bool VerifyAddonManifest(string manifestFile)\r\n        {\r\n            logger.Info($\"Verifying addon manifest {manifestFile} ...\");\r\n            var passed = true;\r\n            if (manifestFile.IsHttpUrl())\r\n            {\r\n                var newManifestFile = Path.Combine(PlaynitePaths.TempPath, \"httpmanifest.yaml\");\r\n                HttpDownloader.DownloadFile(manifestFile, newManifestFile);\r\n                manifestFile = newManifestFile;\r\n            }\r\n\r\n            if (!File.Exists(manifestFile))\r\n            {\r\n                logger.Error(\"Manifest file not found!\");\r\n                passed = false;\r\n                return false;\r\n            }\r\n\r\n            AddonManifestBase manifest = null;\r\n            try\r\n            {\r\n                manifest = Serialization.FromYamlFile<AddonManifestBase>(manifestFile);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                logger.Error(e, \"Failed to parse addon manifest YAML:\");\r\n                logger.Error(e.Message);\r\n                passed = false;\r\n                return false;\r\n            }\r\n\r\n            CheckPropertyString(manifest.AddonId, nameof(manifest.AddonId), true, ref passed);\r\n            CheckPropertyString(manifest.Name, nameof(manifest.Name), true, ref passed);\r\n            CheckPropertyString(manifest.Author, nameof(manifest.Author), true, ref passed);\r\n            CheckPropertyString(manifest.ShortDescription, nameof(manifest.ShortDescription), true, ref passed);\r\n            CheckPropertyURL(manifest.IconUrl, nameof(manifest.IconUrl), false, false, ref passed);\r\n            CheckPropertyURL(manifest.SourceUrl, nameof(manifest.SourceUrl), true, true, ref passed);\r\n            foreach (var screenshot in manifest.Screenshots ?? new List<AddonManifestBase.AddonScreenshot>())\r\n            {\r\n                CheckPropertyURL(screenshot.Thumbnail, $\"Screenshots > {nameof(screenshot.Thumbnail)}\", true, false, ref passed);\r\n                CheckPropertyURL(screenshot.Image, $\"Screenshots > {nameof(screenshot.Image)}\", true, false, ref passed);\r\n            }\r\n\r\n            if (manifest.UserAgreement != null)\r\n            {\r\n                CheckPropertyURL(manifest.UserAgreement.AgreementUrl, $\"UserAgreement > {nameof(manifest.UserAgreement.AgreementUrl)}\", true, false, ref passed);\r\n                CheckPropertyDateTime(manifest.UserAgreement.Updated, $\"UserAgreement > {nameof(manifest.UserAgreement.Updated)}\", true, ref passed);\r\n            }\r\n\r\n            if (CheckPropertyURL(manifest.InstallerManifestUrl, nameof(manifest.InstallerManifestUrl), true, false, ref passed))\r\n            {\r\n                if (!VerifyInstallerManifest(manifest.InstallerManifestUrl, out var installerAddonId))\r\n                {\r\n                    passed = false;\r\n                }\r\n\r\n                if (manifest.AddonId != installerAddonId)\r\n                {\r\n                    logger.Error($\"Addon manifest ID and installer maniefst ID do not match:\\n{manifest.AddonId} vs {installerAddonId}\");\r\n                    passed = false;\r\n                }\r\n            }\r\n\r\n            if (passed)\r\n            {\r\n                logger.Info(\"Addon manifest passed verifiction.\");\r\n            }\r\n            else\r\n            {\r\n                logger.Error(\"Addon manifest didn't pass verification.\");\r\n            }\r\n\r\n            return passed;\r\n        }\r\n\r\n        private static bool CheckPropertyURL(string url, string propertyName, bool mandatory, bool allowHtmlContent, ref bool passRes)\r\n        {\r\n            if (url.IsNullOrWhiteSpace() && mandatory)\r\n            {\r\n                logger.Error($\"{propertyName} URL is missing.\");\r\n                passRes = false;\r\n                return false;\r\n            }\r\n\r\n            if (url.IsNullOrWhiteSpace() && !mandatory)\r\n            {\r\n                return true;\r\n            }\r\n\r\n            if (!url.IsHttpUrl())\r\n            {\r\n                logger.Error($\"{propertyName} is not HTTP URL.\\n{url}\");\r\n                passRes = false;\r\n                return false;\r\n            }\r\n\r\n            if (!HttpDownloader.GetResponseCode(url, new System.Threading.CancellationTokenSource(Timer.SecondsToMilliseconds(10)).Token, out var _).IsSuccess())\r\n            {\r\n                logger.Error($\"{propertyName} doesn't point to reachable HTTP location.\\n{url}\");\r\n                passRes = false;\r\n                return false;\r\n            }\r\n\r\n            if (!allowHtmlContent)\r\n            {\r\n                var testFile = Path.Combine(PlaynitePaths.TempPath, \"webfiletest.file\");\r\n                HttpDownloader.DownloadFile(url, testFile);\r\n                if (File.ReadAllText(testFile).Contains(\"<html\"))\r\n                {\r\n                    logger.Error($\"{propertyName} doesn't point to corret file. It needs to point to the actual file content, not its repository page.\\n{url}\");\r\n                    passRes = false;\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        private static bool CheckPropertyString(string value, string propertyName, bool mandatory, ref bool passRes)\r\n        {\r\n            if (value.IsNullOrWhiteSpace() && mandatory)\r\n            {\r\n                logger.Error($\"{propertyName} property is missing.\");\r\n                passRes = false;\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        private static bool CheckPropertyDateTime(DateTime value, string propertyName, bool mandatory, ref bool passRes)\r\n        {\r\n            if (value == default(DateTime) && mandatory)\r\n            {\r\n                logger.Error($\"{propertyName} property is missing.\");\r\n                passRes = false;\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        private static bool CheckPropertyVersion(Version value, string propertyName, bool mandatory, ref bool passRes)\r\n        {\r\n            if (value == null && mandatory)\r\n            {\r\n                logger.Error($\"{propertyName} property is missing.\");\r\n                passRes = false;\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tools/Playnite.Toolbox/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"CommandLineParser\" version=\"2.8.0\" targetFramework=\"net462\" />\r\n  <package id=\"NLog\" version=\"4.7.6\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Tools/Playnite.Utilities/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n    <startup> \r\n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\" />\r\n    </startup>\r\n  <runtime>\r\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n      <dependentAssembly>\r\n        <assemblyIdentity name=\"System.Numerics.Vectors\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\r\n        <bindingRedirect oldVersion=\"0.0.0.0-4.1.4.0\" newVersion=\"4.1.4.0\" />\r\n      </dependentAssembly>\r\n    </assemblyBinding>\r\n  </runtime>\r\n</configuration>"
  },
  {
    "path": "source/Tools/Playnite.Utilities/DatParser.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.Emulators;\r\nusing SqlNado;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Utilities\r\n{\r\n    public class DatParser\r\n    {\r\n        enum Token\r\n        {\r\n            None,\r\n            Property,\r\n            PropertyValue,\r\n            PropertyStringValue\r\n        }\r\n\r\n        public class DatProperty\r\n        {\r\n            public string Name { get; set; }\r\n            public object Value { get; set; }\r\n\r\n            public override string ToString()\r\n            {\r\n                return $\"{Name} : {Value}\";\r\n            }\r\n        }\r\n\r\n        public class DatObject\r\n        {\r\n            public string Name { get; set; }\r\n            public List<DatProperty> Properties { get; set; } = new List<DatProperty>();\r\n\r\n            public DatObject()\r\n            {\r\n            }\r\n\r\n            public DatObject(string name)\r\n            {\r\n                Name = name;\r\n            }\r\n        }\r\n\r\n        readonly Dictionary<string, PropertyInfo> datGameProperties = new Dictionary<string, PropertyInfo>();\r\n\r\n        public int ReadIndex { get; set; } = 0;\r\n        public char[] Content { get; set; }\r\n        public int CurrentLine { get; set; } = 1;\r\n        public int CurrentLinePos { get; set; } = 1;\r\n\r\n        public DatParser()\r\n        {\r\n            foreach (var prop in typeof(DatGame).GetProperties(BindingFlags.Public | BindingFlags.Instance))\r\n            {\r\n                if (prop.GetCustomAttribute(typeof(DatPropertyAttribute)) is DatPropertyAttribute datAtt)\r\n                {\r\n                    datGameProperties.Add(datAtt.Name, prop);\r\n                }\r\n            }\r\n        }\r\n\r\n        private DatGame ParseGame(DatObject datObj)\r\n        {\r\n            if (datObj == null)\r\n            {\r\n                throw new ArgumentNullException(\"Can't parse game object, no object given.\");\r\n            }\r\n\r\n            var datGame = new DatGame();\r\n            foreach (var prop in datObj.Properties)\r\n            {\r\n                var romAdded = false;\r\n                if (prop.Name == \"rom\" && !romAdded)\r\n                {\r\n                    romAdded = true;\r\n                    foreach (var romDatProp in (prop.Value as DatObject).Properties)\r\n                    {\r\n                        if (datGameProperties.TryGetValue(\"rom.\" + romDatProp.Name, out var romPropInfo))\r\n                        {\r\n                            SetParsedProperty(romPropInfo, datGame, (string)romDatProp.Value);\r\n                        }\r\n                    }\r\n                }\r\n                else if (datGameProperties.TryGetValue(prop.Name, out var propInfo))\r\n                {\r\n                    if (prop.Value is DatObject)\r\n                    {\r\n                        throw new Exception(\"Can't assign object to uknown dat property.\");\r\n                    }\r\n\r\n                    SetParsedProperty(propInfo, datGame, (string)prop.Value);\r\n                }\r\n            }\r\n\r\n            datGame.FixData();\r\n            return datGame;\r\n        }\r\n\r\n        private void SetParsedProperty(PropertyInfo prop, object datGame, string propValue)\r\n        {\r\n            if (prop.PropertyType == typeof(uint))\r\n            {\r\n                prop.SetValue(datGame, uint.Parse(propValue));\r\n            }\r\n            else if (prop.PropertyType == typeof(int))\r\n            {\r\n                prop.SetValue(datGame, int.Parse(propValue));\r\n            }\r\n            else if (prop.PropertyType == typeof(long))\r\n            {\r\n                prop.SetValue(datGame, long.Parse(propValue));\r\n            }\r\n            else if (prop.PropertyType == typeof(string))\r\n            {\r\n                prop.SetValue(datGame, propValue);\r\n            }\r\n            else\r\n            {\r\n                throw new Exception(\"Uknown target type.\");\r\n            }\r\n        }\r\n\r\n        private DatProperty ParseProperty()\r\n        {\r\n            var datProperty = new DatProperty();\r\n            var propName = string.Empty;\r\n            var propValue = string.Empty;\r\n            Token curToken = Token.Property;\r\n            while (curToken != Token.None)\r\n            {\r\n                if (ReadIndex >= Content.Length)\r\n                {\r\n                    break;\r\n                }\r\n\r\n                var chr = Content[ReadIndex];\r\n                ReadIndex++;\r\n                CurrentLinePos++;\r\n                var whiteSpace = char.IsWhiteSpace(chr);\r\n\r\n                if (whiteSpace && curToken == Token.Property)\r\n                {\r\n                    curToken = Token.PropertyValue;\r\n                    datProperty.Name = propName;\r\n                    continue;\r\n                }\r\n\r\n                if (!whiteSpace && curToken == Token.Property)\r\n                {\r\n                    propName += chr;\r\n                    continue;\r\n                }\r\n\r\n                if (chr == '\"' && curToken == Token.PropertyValue)\r\n                {\r\n                    curToken = Token.PropertyStringValue;\r\n                    continue;\r\n                }\r\n\r\n                if (chr == '\"' && curToken == Token.PropertyStringValue)\r\n                {\r\n                    datProperty.Value = propValue;\r\n                    curToken = Token.None;\r\n                    continue;\r\n                }\r\n\r\n                if (whiteSpace && curToken == Token.PropertyStringValue ||\r\n                    !whiteSpace && curToken == Token.PropertyStringValue)\r\n                {\r\n                    propValue += chr;\r\n                    continue;\r\n                }\r\n\r\n                if (chr == '(')\r\n                {\r\n                    datProperty.Value = ParseObject();\r\n                    break;\r\n                }\r\n\r\n                if (!whiteSpace && curToken == Token.PropertyValue)\r\n                {\r\n                    propValue += chr;\r\n                    continue;\r\n                }\r\n\r\n                if (curToken == Token.PropertyValue && (whiteSpace || chr == ')'))\r\n                {\r\n                    datProperty.Value = propValue;\r\n                    curToken = Token.None;\r\n                    continue;\r\n                }\r\n\r\n                break;\r\n            }\r\n\r\n            return datProperty;\r\n        }\r\n\r\n        private DatObject ParseObject()\r\n        {\r\n            var datObject = new DatObject();\r\n            Token curToken = Token.Property;\r\n            while (curToken != Token.None)\r\n            {\r\n                if (ReadIndex >= Content.Length)\r\n                {\r\n                    break;\r\n                }\r\n\r\n                var chr = Content[ReadIndex];\r\n                ReadIndex++;\r\n                CurrentLinePos++;\r\n                if (chr == '\\n')\r\n                {\r\n                    CurrentLinePos = 0;\r\n                    CurrentLine++;\r\n                    continue;\r\n                }\r\n\r\n                if (chr == '\\r')\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                var whiteSpace = char.IsWhiteSpace(chr);\r\n                if (whiteSpace)\r\n                {\r\n                    continue;\r\n                }\r\n\r\n                if (chr == ')')\r\n                {\r\n                    break;\r\n                }\r\n\r\n                ReadIndex--;\r\n                datObject.Properties.Add(ParseProperty());\r\n            }\r\n\r\n            return datObject;\r\n        }\r\n\r\n        public static List<DatGame> ConsolidateDatFiles(IEnumerable<string> datFiles, Func<DatGame, string> groupSelector)\r\n        {\r\n            var parsedDatFiles = datFiles.AsParallel().SelectMany(a => new DatParser().ParseFile(a)).ToList();\r\n            var consolidatedGames = new List<DatGame>();\r\n            foreach (var group in parsedDatFiles.GroupBy(groupSelector, StringComparer.OrdinalIgnoreCase))\r\n            {\r\n                if (group.Count() == 1)\r\n                {\r\n                    consolidatedGames.Add(group.First());\r\n                }\r\n                else\r\n                {\r\n                    var baseObj = group.First();\r\n                    foreach (var obj in group)\r\n                    {\r\n                        if (baseObj != obj)\r\n                        {\r\n                            obj.CopyTo(baseObj);\r\n                        }\r\n                    }\r\n\r\n                    consolidatedGames.Add(baseObj);\r\n                }\r\n            }\r\n\r\n            return consolidatedGames;\r\n        }\r\n\r\n        public List<DatGame> ParseFile(string path)\r\n        {\r\n            ReadIndex = 0;\r\n            CurrentLine = 1;\r\n            CurrentLinePos = 1;\r\n            Content = File.ReadAllText(path, Encoding.UTF8).ToCharArray();\r\n            var root = ParseObject();\r\n            var games = new List<DatGame>(root.Properties.Count);\r\n            foreach (var child in root.Properties)\r\n            {\r\n                if (child.Name == \"game\")\r\n                {\r\n                    try\r\n                    {\r\n                        games.Add(ParseGame(child.Value as DatObject));\r\n                    }\r\n                    catch\r\n                    {\r\n                        Console.WriteLine($\"Failed top parse game child in {path}\");\r\n                    }\r\n                }\r\n            }\r\n\r\n            return games;\r\n        }\r\n\r\n        public static void ProcessLibretroDb(string libretroDir, string outputDir, bool generateSql, bool generateYaml)\r\n        {\r\n            FileSystem.CreateDirectory(outputDir);\r\n            Func<DatGame, string> libretroDbDefaultGroupSelectors = (g) => g.RomCrc;\r\n            var libretroDbGroupSelectors = new Dictionary<string, Func<DatGame, string>>(StringComparer.OrdinalIgnoreCase)\r\n            {\r\n                { \"Sony - PlayStation\", (g) => g.Serial },\r\n                { \"Sony - PlayStation 3\", (g) => g.Serial },\r\n                { \"Nintendo - GameCube\", (g) => g.Serial },\r\n                { \"Nintendo - Wii\", (g) => g.Serial },\r\n                { \"Sega - Dreamcast\", (g) => g.Serial },\r\n                { \"Sega - Mega-CD - Sega CD\", (g) => g.Serial },\r\n                { \"Sega - Saturn\", (g) => g.Serial },\r\n                { \"Sony - PlayStation 2\", (g) => g.Serial },\r\n                { \"Sony - PlayStation Portable\", (g) => g.Serial },\r\n                { \"Sony - PlayStation Vita\", (g) => g.Serial },\r\n                { \"Nintendo - Wii U\", (g) => g.Serial }\r\n            };\r\n\r\n            var datDirs = new List<string>\r\n            {\r\n                Path.Combine(libretroDir, @\"dat\"),\r\n                Path.Combine(libretroDir, @\"metadat\\no-intro\"),\r\n                Path.Combine(libretroDir, @\"metadat\\redump\"),\r\n                Path.Combine(libretroDir, @\"metadat\\libretro-dats\"),\r\n                Path.Combine(libretroDir, @\"metadat\\fbneo-split\"),\r\n                Path.Combine(libretroDir, @\"metadat\\mame\"),\r\n                Path.Combine(libretroDir, @\"metadat\\mame-member\"),\r\n                Path.Combine(libretroDir, @\"metadat\\mame-split\"),\r\n                Path.Combine(libretroDir, @\"metadat\\mame-nonmerged\"),\r\n                Path.Combine(libretroDir, @\"metadat\\homebrew\"),\r\n                Path.Combine(libretroDir, @\"metadat\\hacks\"),\r\n                Path.Combine(libretroDir, @\"metadat\\headered\"),\r\n                Path.Combine(libretroDir, @\"metadat\\serial\"),\r\n                Path.Combine(libretroDir, @\"metadat\\releaseyear\"),\r\n                Path.Combine(libretroDir, @\"metadat\\origin\")\r\n            };\r\n\r\n            var ignoreList = new List<string>\r\n            {\r\n                \"MAME 2000 XML.dat\",\r\n                \"MAME BIOS.dat\",\r\n                \"FBNeo_romcenter.dat\",\r\n                \"System.dat\",\r\n                \"MAME 2000 BIOS.dat\",\r\n                \"Cannonball.dat\",\r\n                \"Cave Story.dat\",\r\n                \"Dinothawr.dat\",\r\n                \"DOOM.dat\",\r\n                \"Flashback.dat\",\r\n                \"ChaiLove.dat\",\r\n                \"LeapFrog - LeapPad.dat\",\r\n                \"Lutro.dat\",\r\n                \"Microsoft - Xbox One.dat\",\r\n                \"Mobile - J2ME.dat\",\r\n                \"Mobile - Palm OS.dat\",\r\n                \"Mobile - Symbian.dat\",\r\n                \"Mobile - Zeebo.dat\",\r\n                \"MrBoom.dat\",\r\n                \"Quake.dat\",\r\n                \"Quake II.dat\",\r\n                \"Quake III.dat\",\r\n                \"Rick Dangerous.dat\",\r\n                \"RPG Maker.dat\",\r\n                \"Sony - PlayStation 4.dat\",\r\n                \"Sony - PlayStation Portable (UMD Music).dat\",\r\n                \"Sony - PlayStation Portable (UMD Video).dat\",\r\n                \"Tiger - Game.com.dat\",\r\n                \"Tiger - Gizmondo.dat\",\r\n                \"Tomb Raider.dat\",\r\n                \"Wolfenstein 3D.dat\",\r\n                \"Microsoft - XBOX 360 (Title Updates).dat\",\r\n                \"HBMAME.dat\",\r\n                \"MAME 2000.dat\",\r\n                \"MAME 2003.dat\",\r\n                \"MAME 2003-Plus.dat\",\r\n                \"MAME 2010.dat\",\r\n                \"MAME 2015.dat\",\r\n                \"MAME 2016.dat\",\r\n                \"MAME.dat\",\r\n                \"ScummVM.dat\",\r\n                \"Atomiswave.dat\",\r\n                \"Sony - PlayStation Minis.dat\",\r\n                \"Thomson - MOTO.dat\"\r\n            };\r\n\r\n            var datFiles = new List<FileInfo>();\r\n            datDirs.ForEach(d => datFiles.AddRange(\r\n                Directory.GetFiles(d, \"*.dat\", SearchOption.AllDirectories).Where(f => !ignoreList.Contains(Path.GetFileName(f), StringComparer.OrdinalIgnoreCase)).\r\n                Select(f => new FileInfo(f))));\r\n            var databases = datFiles.GroupBy(a => a.Name, StringComparer.OrdinalIgnoreCase);\r\n            Parallel.ForEach(\r\n                databases,\r\n                (db, _, __) =>\r\n                {\r\n                    var dbName = Path.GetFileNameWithoutExtension(db.Key);\r\n                    var selector = libretroDbDefaultGroupSelectors;\r\n                    if (libretroDbGroupSelectors.TryGetValue(dbName, out var sel))\r\n                    {\r\n                        selector = sel;\r\n                    }\r\n\r\n                    var cons = DatParser.ConsolidateDatFiles(db.Select(a => a.FullName), selector);\r\n                    if (dbName == \"Sony - PlayStation 3\")\r\n                    {\r\n                        string ps3ResgionCharToRegion(char regionKey)\r\n                        {\r\n                            switch (regionKey)\r\n                            {\r\n                                case 'A': return \"Asia\";\r\n                                case 'C': return \"China\";\r\n                                case 'E': return \"Europe\";\r\n                                case 'H': return \"Hong Kong\";\r\n                                case 'J': return \"Japan\";\r\n                                case 'K': return \"Korea\";\r\n                                case 'P': return \"Japan\";\r\n                                case 'U': return \"USA\";\r\n                                default: return null;\r\n                            }\r\n                        }\r\n\r\n                        foreach (var game in cons)\r\n                        {\r\n                            if (game.Region.IsNullOrEmpty() && !game.Serial.IsNullOrEmpty())\r\n                            {\r\n                                game.Region = ps3ResgionCharToRegion(game.Serial[2]);\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (generateYaml)\r\n                    {\r\n                        var yamlPath = Path.Combine(outputDir, $\"{dbName}.yaml\");\r\n                        FileSystem.DeleteFile(yamlPath);\r\n                        File.WriteAllText(\r\n                            yamlPath,\r\n                            Serialization.ToYaml(cons),\r\n                            Encoding.UTF8);\r\n                    }\r\n\r\n                    if (generateSql)\r\n                    {\r\n                        var dbPath = Path.Combine(outputDir, $\"{dbName}.db\");\r\n                        FileSystem.DeleteFile(dbPath);\r\n                        using (var sqlDb = new SQLiteDatabase(dbPath))\r\n                        {\r\n                            sqlDb.ExecuteNonQuery(\"PRAGMA journal_mode = OFF;\");\r\n                            sqlDb.Save(cons);\r\n                        }\r\n                    }\r\n                });\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tools/Playnite.Utilities/Playnite.Utilities.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{BF51C274-61E9-4C47-94F4-1C2EF46EBB33}</ProjectGuid>\r\n    <OutputType>Exe</OutputType>\r\n    <RootNamespace>Playnite.Utilities</RootNamespace>\r\n    <AssemblyName>Putility</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\r\n    <Deterministic>true</Deterministic>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <LangVersion>7.3</LangVersion>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"LiteDB, Version=4.1.4.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL\">\r\n      <HintPath>..\\..\\packages\\LiteDB.4.1.4\\lib\\net40\\LiteDB.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"SQLNado, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\..\\references\\SQLNado.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"DatParser.cs\" />\r\n    <Compile Include=\"Program.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"App.config\" />\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"..\\..\\Playnite\\Playnite.csproj\">\r\n      <Project>{ad271e73-8a13-4c4e-bfdc-3076646b59e3}</Project>\r\n      <Name>Playnite</Name>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/Tools/Playnite.Utilities/Program.cs",
    "content": "﻿using LiteDB;\r\nusing Playnite.Common;\r\nusing Playnite.Emulators;\r\nusing SqlNado;\r\nusing System;\r\nusing System.Collections.Concurrent;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Text;\r\nusing System.Text.RegularExpressions;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.Utilities\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            DatParser.ProcessLibretroDb(@\"e:\\Devel\\libretro-database\", @\"d:\\Downloads\\dats\", true, true);\r\n            Console.WriteLine(\"Done\");\r\n            Console.ReadLine();\r\n        }\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "source/Tools/Playnite.Utilities/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"Playnite.Utilities\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"Playnite.Utilities\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2021\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"bf51c274-61e9-4c47-94f4-1c2ef46ebb33\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "source/Tools/Playnite.Utilities/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"LiteDB\" version=\"4.1.4\" targetFramework=\"net462\" />\r\n</packages>"
  },
  {
    "path": "source/Tools/PlayniteInstaller/App.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n  <startup>\r\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\"/>\r\n  </startup>\r\n  <runtime>\r\n    <loadFromRemoteSources enabled=\"True\" />\r\n  </runtime>\r\n</configuration>\r\n"
  },
  {
    "path": "source/Tools/PlayniteInstaller/App.xaml",
    "content": "﻿<Application x:Class=\"PlayniteInstaller.App\"\r\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"             \r\n             Startup=\"Application_Startup\"\r\n             Exit=\"Application_Exit\">\r\n    <Application.Resources>\r\n        <ResourceDictionary Source=\"Classic.xaml\"/>\r\n    </Application.Resources>\r\n</Application>\r\n"
  },
  {
    "path": "source/Tools/PlayniteInstaller/App.xaml.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Configuration;\r\nusing System.Data;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\n\r\nnamespace PlayniteInstaller\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for App.xaml\r\n    /// </summary>\r\n    public partial class App : Application\r\n    {\r\n        private static ILogger logger;\r\n\r\n        public static string TempDir => Path.Combine(Path.GetTempPath(), \"PlayniteInstaller\");\r\n        public static string InstallerDownloadPath => Path.Combine(Path.GetTempPath(), \"PlayniteInstaller\", \"installer.exe\");\r\n\r\n        private static Version currentVersion;\r\n        public static Version CurrentVersion\r\n        {\r\n            get\r\n            {\r\n                if (currentVersion == null)\r\n                {\r\n                    currentVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;\r\n                }\r\n\r\n                return currentVersion;\r\n            }\r\n        }\r\n\r\n        private void Application_Startup(object sender, StartupEventArgs e)\r\n        {\r\n            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;\r\n            FileSystem.CreateDirectory(App.TempDir);\r\n            LogManager.Initialize(Path.Combine(App.TempDir, \"installer.log\"));\r\n            logger = LogManager.GetLogger();\r\n            logger.Debug($\"Installer started {CurrentVersion}\");\r\n\r\n            var window = new MainWindow();\r\n            window.DataContext = new MainViewModel(window);\r\n            window.ShowDialog();\r\n            Shutdown();\r\n        }\r\n\r\n        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)\r\n        {\r\n            logger.Error((Exception)e.ExceptionObject, \"Unhandled exception occured.\");\r\n            MessageBox.Show(\r\n               \"Unrecoverable error occured and installer will now close.\",\r\n               \"Critical error\",\r\n               MessageBoxButton.OK, MessageBoxImage.Error);\r\n        }\r\n\r\n        private void Application_Exit(object sender, ExitEventArgs e)\r\n        {\r\n            LogManager.Dispose();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tools/PlayniteInstaller/Classic.xaml",
    "content": "﻿\r\n    <ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n                    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\r\n                    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n                    xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n                    mc:Ignorable=\"d\" >\r\n\r\n    <Color x:Key=\"BlackColor\">#FF000000</Color>\r\n    <Color x:Key=\"WhiteColor\">#FFFFFFFF</Color>\r\n\r\n    <Color x:Key=\"TextColor\">#f2f2f2</Color>\r\n    <Color x:Key=\"TextColorDarker\">#a3a3a3</Color>\r\n    <Color x:Key=\"TextColorDark\">#000000</Color>\r\n    <Color x:Key=\"MainColor\">#4c4c4c</Color>\r\n    <Color x:Key=\"MainColorDark\">#252422</Color>\r\n    <Color x:Key=\"HoverColor\">#247BA0</Color>\r\n    <Color x:Key=\"DefaultColor\">#FF9BB1C5</Color>\r\n    <Color x:Key=\"GlyphColor\">#55CDFF</Color>\r\n    <Color x:Key=\"HighlightGlyphColor\">#33019fcb</Color>\r\n    <Color x:Key=\"PopupBackgroundColor\">#171e26</Color>\r\n    <Color x:Key=\"PopupBorderColor\">#3e6184</Color>\r\n    <Color x:Key=\"BackgroundToneColor\">#182028</Color>\r\n\r\n    <SolidColorBrush x:Key=\"ControlBackgroundBrush\" Color=\"Transparent\" />\r\n    <SolidColorBrush x:Key=\"TextBrush\" Color=\"{DynamicResource TextColor}\" />\r\n    <SolidColorBrush x:Key=\"TextBrushDarker\" Color=\"{DynamicResource TextColorDarker}\" />\r\n    <SolidColorBrush x:Key=\"TextBrushDark\" Color=\"{DynamicResource TextColorDark}\" />\r\n    <SolidColorBrush x:Key=\"NormalBrush\" Color=\"{DynamicResource MainColor}\" />\r\n    <SolidColorBrush x:Key=\"NormalBrushDark\" Color=\"{DynamicResource MainColorDark}\" />\r\n    <SolidColorBrush x:Key=\"NormalBorderBrush\" Color=\"{DynamicResource MainColor}\" />\r\n    <SolidColorBrush x:Key=\"HoverBrush\" Color=\"{DynamicResource HighlightGlyphColor}\" />\r\n    <SolidColorBrush x:Key=\"GlyphBrush\" Color=\"{DynamicResource GlyphColor}\" />\r\n    <SolidColorBrush x:Key=\"HighlightGlyphBrush\" Color=\"{DynamicResource HighlightGlyphColor}\" />\r\n    <SolidColorBrush x:Key=\"PopupBorderBrush\" Color=\"{DynamicResource PopupBorderColor}\" />\r\n    <SolidColorBrush x:Key=\"TooltipBackgroundBrush\" Color=\"{DynamicResource BackgroundToneColor}\" />\r\n    <SolidColorBrush x:Key=\"ButtonBackgroundBrush\" Color=\"#1c1b19\" />\r\n\r\n    <sys:Double x:Key=\"FontSize\">14</sys:Double>\r\n    <FontFamily x:Key=\"FontFamily\">Trebuchet MS</FontFamily>\r\n    <Thickness x:Key=\"PopupBorderThickness\">1</Thickness>\r\n    <Thickness x:Key=\"ControlBorderThickness\">1</Thickness>\r\n    <sys:Double x:Key=\"EllipseBorderThickness\">1</sys:Double>\r\n    <CornerRadius x:Key=\"ControlCornerRadius\">1</CornerRadius>\r\n\r\n    <LinearGradientBrush  x:Key=\"PopupBackgroundBrush\" StartPoint=\"0.4,0\" EndPoint=\"0.5,1.2\" >\r\n        <GradientStop Color=\"{DynamicResource MainColorDark}\" Offset=\"0\"/>\r\n        <GradientStop Color=\"{DynamicResource BackgroundToneColor}\" Offset=\"0.9\"/>\r\n    </LinearGradientBrush>\r\n\r\n    <LinearGradientBrush  x:Key=\"ExpanderBackgroundBrush\" StartPoint=\"-1,0.5\" EndPoint=\"1.5,1\" >\r\n        <GradientStop Color=\"{DynamicResource MainColor}\" Offset=\"0\"/>\r\n        <GradientStop Color=\"{DynamicResource MainColorDark}\" Offset=\"0.9\"/>\r\n    </LinearGradientBrush>\r\n\r\n    <LinearGradientBrush x:Key=\"WindowBackgourndBrush\" StartPoint=\"0.5,-0.2\" EndPoint=\"0.4,1\" >\r\n        <GradientStop Color=\"#1F2933\" Offset=\"0\"/>\r\n        <GradientStop Color=\"{DynamicResource MainColorDark}\" Offset=\"0.4\"/>\r\n    </LinearGradientBrush>\r\n\r\n    <sys:Double x:Key=\"GameCoverViewRation\">1.4</sys:Double>\r\n\r\n    <Style TargetType=\"Border\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"HighlightBorder\" TargetType=\"Border\" BasedOn=\"{StaticResource {x:Type Border}}\">\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n\r\n    <Style x:Key=\"BaseStyle\" TargetType=\"Control\">\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                <Setter Property=\"Opacity\" Value=\"0.5\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n\r\n    <Style x:Key=\"BaseTextBlockStyle\" TargetType=\"TextBlock\">\r\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\r\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type Button}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Padding\" Value=\"10,5,10,5\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Button}\">\r\n                    <Border BorderThickness=\"{TemplateBinding BorderThickness}\" Background=\"{TemplateBinding Background}\"\r\n                            CornerRadius=\"{DynamicResource ControlCornerRadius}\" Style=\"{DynamicResource HighlightBorder}\">\r\n                        <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                          VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"\r\n                                          Margin=\"{TemplateBinding Padding}\" RecognizesAccessKey=\"True\" />\r\n                    </Border>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type CheckBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type CheckBox}\">\r\n                    <BulletDecorator>\r\n                        <BulletDecorator.Bullet>\r\n                            <Border x:Name=\"BulletBorder\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                                    BorderThickness=\"{TemplateBinding BorderThickness}\" Background=\"{TemplateBinding Background}\"\r\n                                    Style=\"{DynamicResource HighlightBorder}\" >\r\n                                <Grid Width=\"18\" Height=\"18\" Background=\"{DynamicResource NormalBrushDark}\">\r\n                                    <Viewbox x:Name=\"CheckIcon\" Visibility=\"Collapsed\">\r\n                                        <TextBlock Text=\"b\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                   HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                    <Viewbox x:Name=\"IndeterminateIcon\" Visibility=\"Collapsed\" Margin=\"2\">\r\n                                        <TextBlock Text=\"g\" FontFamily=\"Marlett\" Foreground=\"{DynamicResource GlyphBrush}\"\r\n                                                   HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\r\n                                    </Viewbox>\r\n                                </Grid>\r\n                            </Border>\r\n                        </BulletDecorator.Bullet>\r\n                        <Border Padding=\"{TemplateBinding Padding}\" Background=\"{TemplateBinding Background}\">\r\n                            <ContentPresenter RecognizesAccessKey=\"True\" Margin=\"5,0,0,0\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"/>\r\n                        </Border>\r\n                    </BulletDecorator>\r\n                    <ControlTemplate.Triggers>\r\n                        <MultiTrigger>\r\n                            <MultiTrigger.Conditions>\r\n                                <Condition Property=\"IsChecked\" Value=\"{x:Null}\" />\r\n                                <Condition Property=\"IsThreeState\" Value=\"True\" />\r\n                            </MultiTrigger.Conditions>\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"IndeterminateIcon\"/>\r\n                        </MultiTrigger>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"CheckIcon\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"BulletBorder\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>    \r\n\r\n    <Style TargetType=\"{x:Type ProgressBar}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\"/>\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource NormalBrushDark}\"/>\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\"/>\r\n        <Setter Property=\"Height\" Value=\"20\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ProgressBar}\">\r\n                    <Border BorderThickness=\"{TemplateBinding BorderThickness}\" BorderBrush=\"{DynamicResource NormalBorderBrush}\"\r\n                            CornerRadius=\"{DynamicResource ControlCornerRadius}\">\r\n                        <Grid SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\">\r\n                            <Rectangle Fill=\"{TemplateBinding Background}\" />\r\n                            <Rectangle Name=\"PART_Track\" Margin=\"0\" />\r\n                            <Decorator x:Name=\"PART_Indicator\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Stretch\">\r\n                                <Grid>\r\n                                    <Rectangle Fill=\"{TemplateBinding Foreground}\" />\r\n                                    <Grid x:Name=\"Animation\" Visibility=\"Hidden\">\r\n                                        <Rectangle Fill=\"{TemplateBinding Background}\" Margin=\"0,0,50,0\">\r\n                                            <Rectangle.RenderTransform>\r\n                                                <ScaleTransform x:Name=\"HiderPreTransform\" ScaleX=\"0\"/>\r\n                                            </Rectangle.RenderTransform>\r\n                                        </Rectangle>\r\n                                        <Rectangle Fill=\"{TemplateBinding Background}\" RenderTransformOrigin=\"1, 0\" Margin=\"50,0,0,0\">\r\n                                            <Rectangle.RenderTransform>\r\n                                                <ScaleTransform x:Name=\"HiderPostTransform\" ScaleX=\"1\" />\r\n                                            </Rectangle.RenderTransform>\r\n                                        </Rectangle>\r\n                                    </Grid>\r\n                                </Grid>\r\n                            </Decorator>\r\n                        </Grid>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsIndeterminate\" Value=\"True\">\r\n                            <Setter TargetName=\"Animation\" Property=\"Visibility\" Value=\"Visible\" />\r\n                            <Trigger.EnterActions>\r\n                                <BeginStoryboard>\r\n                                    <Storyboard RepeatBehavior=\"Forever\">\r\n                                        <DoubleAnimation Storyboard.TargetName=\"HiderPreTransform\" Storyboard.TargetProperty=\"(ScaleTransform.ScaleX)\"\r\n                                                         To=\"1\" Duration=\"0:00:4\" AutoReverse=\"True\"/>\r\n                                        <DoubleAnimation Storyboard.TargetName=\"HiderPostTransform\" Storyboard.TargetProperty=\"(ScaleTransform.ScaleX)\"\r\n                                                         To=\"0\" Duration=\"0:00:4\" AutoReverse=\"True\"/>\r\n                                    </Storyboard>\r\n                                </BeginStoryboard>\r\n                            </Trigger.EnterActions>\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type TextBox}\" BasedOn=\"{StaticResource BaseStyle}\">\r\n        <Setter Property=\"KeyboardNavigation.TabNavigation\" Value=\"None\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"AllowDrop\" Value=\"True\" />\r\n        <Setter Property=\"CaretBrush\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\"/>\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource NormalBorderBrush}\"/>\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ControlBorderThickness}\" />\r\n        <Setter Property=\"Padding\" Value=\"3\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type TextBox}\">\r\n                    <Border x:Name=\"Border\" BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                            Background=\"{TemplateBinding Background}\" CornerRadius=\"{DynamicResource ControlCornerRadius}\"\r\n                            Style=\"{DynamicResource HighlightBorder}\">\r\n                        <ScrollViewer x:Name=\"PART_ContentHost\"\r\n                                      VerticalScrollBarVisibility=\"{TemplateBinding VerticalScrollBarVisibility}\"\r\n                                      HorizontalScrollBarVisibility=\"{TemplateBinding HorizontalScrollBarVisibility}\"/>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\r\n                            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource GlyphBrush}\" TargetName=\"Border\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsReadOnly\" Value=\"True\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.8\"  />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>    \r\n\r\n    <Style TargetType=\"{x:Type Popup}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"AllowsTransparency\" Value=\"True\" />\r\n    </Style>    \r\n\r\n    <Style TargetType=\"{x:Type Hyperlink}\">\r\n        <Setter Property=\"FontSize\" Value=\"14\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource GlyphBrush}\" />\r\n        <Setter Property=\"TextDecorations\" Value=\"{x:Null}\" />\r\n        <Style.Triggers>\r\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n            </Trigger>\r\n            <Trigger Property=\"IsEnabled\" Value=\"False\">\r\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrushDarker}\" />\r\n            </Trigger>\r\n        </Style.Triggers>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type ToolTip}\">\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Background\" Value=\"{DynamicResource TooltipBackgroundBrush}\" />\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"FontSize\" Value=\"14\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource PopupBorderBrush}\" />\r\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource PopupBorderThickness}\" />\r\n    </Style>\r\n\r\n    <Style x:Key=\"ExpanderDownHeaderStyle\" TargetType=\"{x:Type ToggleButton}\">\r\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource TextBrush}\" />\r\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\r\n                    <Border Padding=\"{TemplateBinding Padding}\" Background=\"{TemplateBinding Background}\"\r\n                            BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\">\r\n                        <Grid>\r\n                            <Grid.ColumnDefinitions>\r\n                                <ColumnDefinition Width=\"Auto\" />\r\n                                <ColumnDefinition Width=\"*\" />\r\n                            </Grid.ColumnDefinitions>\r\n                            <TextBlock Text=\"4\" x:Name=\"CollapsedIcon\" FontFamily=\"Marlett\"\r\n                                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"\r\n                                       Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                       Foreground=\"{DynamicResource GlyphBrush}\" FontSize=\"18\" MinWidth=\"20\" Margin=\"0,0,5,0\"\r\n                                       Grid.Column=\"0\" TextAlignment=\"Center\" />\r\n                            <TextBlock Text=\"6\" x:Name=\"ExpandedIcon\" FontFamily=\"Marlett\"\r\n                                       VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"\r\n                                       Style=\"{DynamicResource BaseTextBlockStyle}\"\r\n                                       Foreground=\"{DynamicResource GlyphBrush}\" FontSize=\"18\" MinWidth=\"20\" Margin=\"0,0,5,0\"\r\n                                       Visibility=\"Collapsed\"\r\n                                       Grid.Column=\"0\" TextAlignment=\"Center\"/>\r\n                            <ContentPresenter Grid.Column=\"1\" VerticalAlignment=\"Center\"\r\n                                              SnapsToDevicePixels=\"True\" HorizontalAlignment=\"Stretch\" RecognizesAccessKey=\"True\"  />\r\n                        </Grid>\r\n                    </Border>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\r\n                            <Setter Property=\"Visibility\" TargetName=\"ExpandedIcon\" Value=\"Visible\" />\r\n                            <Setter Property=\"Visibility\" TargetName=\"CollapsedIcon\" Value=\"Collapsed\" />\r\n                        </Trigger>\r\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\r\n                            <Setter Property=\"Opacity\" Value=\"0.75\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n\r\n    <Style TargetType=\"{x:Type Expander}\">\r\n        <Setter Property=\"BorderThickness\" Value=\"0\" />\r\n        <Setter Property=\"BorderBrush\" Value=\"Transparent\" />\r\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\r\n        <Setter Property=\"Template\">\r\n            <Setter.Value>\r\n                <ControlTemplate TargetType=\"{x:Type Expander}\">\r\n                    <DockPanel>\r\n                        <ToggleButton BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\"\r\n                                      Style=\"{DynamicResource ExpanderDownHeaderStyle}\"\r\n                                      Padding=\"{TemplateBinding Padding}\"\r\n                                      MinHeight=\"25\" DockPanel.Dock=\"Top\"\r\n                                      Background=\"{TemplateBinding Background}\"\r\n                                      Content=\"{TemplateBinding Header}\"\r\n                                      IsChecked=\"{Binding Path=IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}\" />\r\n                        <Border x:Name=\"Border\" DockPanel.Dock=\"Top\" Visibility=\"Collapsed\"\r\n                                BorderThickness=\"{TemplateBinding BorderThickness}\" BorderBrush=\"{TemplateBinding BorderBrush}\">\r\n                            <ContentPresenter Focusable=\"False\"\r\n                                              HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\r\n                                              VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"  />\r\n                        </Border>\r\n                    </DockPanel>\r\n                    <ControlTemplate.Triggers>\r\n                        <Trigger Property=\"IsExpanded\" Value=\"true\">\r\n                            <Setter Property=\"Visibility\" TargetName=\"Border\" Value=\"Visible\" />\r\n                        </Trigger>\r\n                    </ControlTemplate.Triggers>\r\n                </ControlTemplate>\r\n            </Setter.Value>\r\n        </Setter>\r\n    </Style>\r\n</ResourceDictionary>\r\n"
  },
  {
    "path": "source/Tools/PlayniteInstaller/Converters.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Globalization;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Data;\r\nusing System.Windows.Markup;\r\n\r\nnamespace PlayniteInstaller\r\n{\r\n    public class InstallStatusToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            return (InstallStatus)value == (InstallStatus)parameter ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            throw new NotSupportedException();\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class BooleanToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return Visibility.Collapsed;\r\n            }\r\n\r\n            return ((bool)value) ? Visibility.Visible : Visibility.Collapsed;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            return ((Visibility)value) == Visibility.Visible ? true : false;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n\r\n    public class InvertedBooleanToVisibilityConverter : MarkupExtension, IValueConverter\r\n    {\r\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            if (value == null)\r\n            {\r\n                return Visibility.Visible;\r\n            }\r\n\r\n            return ((bool)value) ? Visibility.Collapsed : Visibility.Visible;\r\n        }\r\n\r\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\r\n        {\r\n            return null;\r\n        }\r\n\r\n        public override object ProvideValue(IServiceProvider serviceProvider)\r\n        {\r\n            return this;\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tools/PlayniteInstaller/Logger.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Playnite.SDK\r\n{\r\n    public class Logger : ILogger\r\n    {\r\n        private readonly string loggerName;\r\n\r\n        public Logger(string loggerName)\r\n        {\r\n            this.loggerName = loggerName;\r\n        }\r\n\r\n        public void Debug(string message)\r\n        {\r\n            WriteMessage(\"|DEBUG: \" + message);\r\n        }\r\n\r\n        public void Debug(Exception exception, string message)\r\n        {\r\n            WriteMessage(exception, \"|DEBUG: \" + message);\r\n        }\r\n\r\n        public void Error(string message)\r\n        {\r\n            WriteMessage(\"|ERROR: \" + message);\r\n        }\r\n\r\n        public void Error(Exception exception, string message)\r\n        {\r\n            WriteMessage(exception, \"|ERROR: \" + message);\r\n        }\r\n\r\n        public void Info(string message)\r\n        {\r\n            WriteMessage(\"|INFO: \" + message);\r\n        }\r\n\r\n        public void Info(Exception exception, string message)\r\n        {\r\n            WriteMessage(exception, \"|INFO: \" + message);\r\n        }\r\n\r\n        public void Trace(string message)\r\n        {\r\n            WriteMessage(\"|TRACE: \" + message);\r\n        }\r\n\r\n        public void Trace(Exception exception, string message)\r\n        {\r\n            WriteMessage(exception, \"|TRACE: \" + message);\r\n        }\r\n\r\n        public void Warn(string message)\r\n        {\r\n            WriteMessage(\"|WARN: \" + message);\r\n        }\r\n\r\n        public void Warn(Exception exception, string message)\r\n        {\r\n            WriteMessage(exception, \"|WARN: \" + message);\r\n        }\r\n\r\n        private void WriteMessage(string message)\r\n        {\r\n            LogManager.WriteMessage(loggerName + message);\r\n        }\r\n\r\n        private void WriteMessage(Exception exception, string message)\r\n        {\r\n            LogManager.WriteMessage(loggerName + message);\r\n            LogManager.WriteMessage(exception.ToString());\r\n        }\r\n    }\r\n\r\n    public class LogManager\r\n    {\r\n        private static FileStream logStream;\r\n        private static StreamWriter logWriter;\r\n        private static object writeLock = new object();\r\n\r\n        public static void Initialize(string filePath)\r\n        {\r\n            logStream = new FileStream(filePath, FileMode.Append, FileAccess.Write);\r\n            logWriter = new StreamWriter(logStream) { AutoFlush = true };\r\n        }\r\n\r\n        public static void Dispose()\r\n        {\r\n            logWriter.Dispose();\r\n            logStream.Dispose();\r\n        }\r\n\r\n        public static void WriteMessage(string message)\r\n        {\r\n            lock (writeLock)\r\n            {\r\n                logWriter.WriteLine(DateTime.Now.ToLongTimeString() + \"|\" + message);\r\n            }\r\n\r\n            if (Debugger.IsAttached)\r\n            {\r\n                Console.WriteLine(message);\r\n            }\r\n        }\r\n\r\n        [MethodImpl(MethodImplOptions.NoInlining)]\r\n        public static ILogger GetLogger()\r\n        {\r\n            var className = (new StackFrame(1)).GetMethod().DeclaringType.Name;\r\n            return GetLogger(className);\r\n        }\r\n\r\n        public static ILogger GetLogger(string loggerName)\r\n        {\r\n            return new Logger(loggerName);\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tools/PlayniteInstaller/MainViewModel.cs",
    "content": "﻿using Playnite.Common;\r\nusing Playnite.SDK;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Configuration;\r\nusing System.Diagnostics;\r\nusing System.IO;\r\nusing System.Linq;\r\nusing System.Net;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Forms;\r\n\r\nnamespace PlayniteInstaller\r\n{\r\n    public enum InstallStatus\r\n    {\r\n        Idle,\r\n        Downloading,\r\n        Installing\r\n    }\r\n\r\n    public class CustomWebClient : WebClient\r\n    {\r\n        protected override WebRequest GetWebRequest(Uri address)\r\n        {\r\n            var request = base.GetWebRequest(address);\r\n            if (request != null)\r\n                request.Timeout = 10 * 1000;\r\n\r\n            return request;\r\n        }\r\n    }\r\n\r\n    public class MainViewModel : ObservableObject\r\n    {\r\n        private static readonly ILogger logger = LogManager.GetLogger();\r\n        private readonly Window windowHost;\r\n        private readonly List<string> UrlMirrors;\r\n        private CustomWebClient webClient;\r\n\r\n        private InstallStatus status;\r\n        public InstallStatus Status\r\n        {\r\n            get => status;\r\n            set\r\n            {\r\n                status = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private double progressValue;\r\n        public double ProgressValue\r\n        {\r\n            get => progressValue;\r\n            set\r\n            {\r\n                progressValue = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private string destinationFolder;\r\n        public string DestionationFolder\r\n        {\r\n            get => destinationFolder;\r\n            set\r\n            {\r\n                destinationFolder = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        private bool portable;\r\n        public bool Portable\r\n        {\r\n            get => portable;\r\n            set\r\n            {\r\n                portable = value;\r\n                OnPropertyChanged();\r\n            }\r\n        }\r\n\r\n        public RelayCommand<object> BrowseCommand\r\n        {\r\n            get => new RelayCommand<object>((_) =>\r\n            {\r\n                Browse();\r\n            });\r\n        }\r\n\r\n        public RelayCommand<object> InstallCommand\r\n        {\r\n            get => new RelayCommand<object>(async (_) =>\r\n            {\r\n                await Install();\r\n            }, (_) => Status == InstallStatus.Idle);\r\n        }\r\n\r\n        public RelayCommand<object> CancelCommand\r\n        {\r\n            get => new RelayCommand<object>((_) =>\r\n            {\r\n                Cancel();\r\n            }, (_) => Status != InstallStatus.Installing);\r\n        }\r\n\r\n        public static RelayCommand<string> NavigateUrlCommand\r\n        {\r\n            get => new RelayCommand<string>((url) =>\r\n            {\r\n                try\r\n                {\r\n                    Process.Start(url);\r\n                }\r\n                catch (Exception e) when (!Debugger.IsAttached)\r\n                {\r\n                    logger.Error(e, \"Failed to open url.\");\r\n                }\r\n            });\r\n        }\r\n\r\n        private List<string> ParseList(string input)\r\n        {\r\n            return input.Split(new[] { '\\r', '\\n' }).Where(a => !string.IsNullOrWhiteSpace(a)).ToList();\r\n        }\r\n\r\n        public MainViewModel(Window window)\r\n        {\r\n            windowHost = window;\r\n            DestionationFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), \"Playnite\");\r\n            UrlMirrors = ParseList(Resources.ReadFileFromResource(\"PlayniteInstaller.installer_mirrors.txt\"));\r\n            logger.Debug(\"Server mirrors in use:\");\r\n            UrlMirrors.ForEach(a => logger.Debug(a));\r\n        }\r\n\r\n        public void Browse()\r\n        {\r\n            var dialog = new FolderBrowserDialog()\r\n            {\r\n                Description = \"Select Destination Folder...\",\r\n                ShowNewFolderButton = true\r\n            };\r\n\r\n            if (dialog.ShowDialog() == DialogResult.OK)\r\n            {\r\n                DestionationFolder = Path.Combine(dialog.SelectedPath, \"Playnite\");\r\n            }\r\n        }\r\n\r\n        public async Task Install()\r\n        {\r\n            if (DestionationFolder.StartsWith(@\"c:\\Program Files\", StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                System.Windows.MessageBox.Show(\r\n                    \"Can't install Playnite to selected directory, use a different path.\",\r\n                    \"Location not supported\",\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n                return;\r\n            }\r\n\r\n            if (!FileSystem.CanWriteToFolder(DestionationFolder))\r\n            {\r\n                System.Windows.MessageBox.Show(\r\n                    \"Can't install Playnite to selected directory, use a different path.\",\r\n                    \"Access error\",\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n                return;\r\n            }\r\n\r\n            Status = InstallStatus.Downloading;\r\n\r\n            try\r\n            {\r\n                FileSystem.DeleteFile(App.InstallerDownloadPath);\r\n                if (webClient != null)\r\n                {\r\n                    webClient.Dispose();\r\n                    webClient = null;\r\n                }\r\n\r\n                webClient = new CustomWebClient();\r\n                var installerUrls = await TryDownloadManifest(UrlMirrors);\r\n                webClient.DownloadProgressChanged += WebClient_DownloadProgressChanged;\r\n                if (await TryDownloadInstaller(installerUrls) == false)\r\n                {\r\n                    return;\r\n                }\r\n\r\n                Status = InstallStatus.Installing;\r\n                var args = string.Format(@\"/VERYSILENT /NOCANCEL /DIR=\"\"{0}\"\" \", DestionationFolder);\r\n                args += Portable ? \"/PORTABLE\" : \"\";\r\n                logger.Info($\"Starting:\\n{App.InstallerDownloadPath}\\n{args}\");\r\n\r\n                var installed = false;\r\n                await Task.Run(() =>\r\n                {\r\n                    using (var process = Process.Start(App.InstallerDownloadPath, args))\r\n                    {\r\n                        process.WaitForExit();\r\n                        if (process.ExitCode == 0)\r\n                        {\r\n                            installed = true;\r\n                        }\r\n                        else\r\n                        {\r\n                            logger.Error($\"Installer failed {process.ExitCode}\");\r\n                            System.Windows.MessageBox.Show(\r\n                                $\"Failed to install Playnite. Error code {process.ExitCode}\",\r\n                                \"Installation error\",\r\n                                MessageBoxButton.OK, MessageBoxImage.Error);\r\n                            Status = InstallStatus.Idle;\r\n                        }\r\n                    }\r\n                });\r\n\r\n                FileSystem.DeleteFileSafe(App.InstallerDownloadPath);\r\n                if (installed)\r\n                {\r\n                    windowHost.Close();\r\n                }\r\n            }\r\n            catch (Exception e) when (!Debugger.IsAttached)\r\n            {\r\n                logger.Error(e, \"Failed to download and install Playnite.\");\r\n                System.Windows.MessageBox.Show(\r\n                    $\"Failed to install Playnite:\\n{e.Message}\",\r\n                    \"Installation error\",\r\n                    MessageBoxButton.OK, MessageBoxImage.Error);\r\n                Status = InstallStatus.Idle;\r\n            }\r\n            finally\r\n            {\r\n                webClient?.Dispose();\r\n                webClient = null;\r\n            }\r\n        }\r\n\r\n        private async Task<List<string>> TryDownloadManifest(List<string> urls)\r\n        {\r\n            foreach (var url in urls)\r\n            {\r\n                try\r\n                {\r\n                    return ParseList(await webClient.DownloadStringTaskAsync(url));\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to download installer manifest from {url}\");\r\n                }\r\n            }\r\n\r\n            throw new Exception(\"Failed to download installer manifest.\");\r\n        }\r\n\r\n        private async Task<bool> TryDownloadInstaller(List<string> urls)\r\n        {\r\n            foreach (var url in urls)\r\n            {\r\n                try\r\n                {\r\n                    await webClient.DownloadFileTaskAsync(url, App.InstallerDownloadPath);\r\n                    return true;\r\n                }\r\n                catch (WebException webExp)\r\n                {\r\n                    if (webExp.Status == WebExceptionStatus.RequestCanceled)\r\n                    {\r\n                        return false;\r\n                    }\r\n                    else\r\n                    {\r\n                        logger.Error(webExp, $\"Failed to download installer file from {url}\");\r\n                    }\r\n                }\r\n                catch (Exception e)\r\n                {\r\n                    logger.Error(e, $\"Failed to download installer file from {url}\");\r\n                }\r\n            }\r\n\r\n            throw new Exception(\"Failed to download installer file.\");\r\n        }\r\n\r\n        private void WebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)\r\n        {\r\n            ProgressValue = e.ProgressPercentage;\r\n        }\r\n\r\n        public void Cancel()\r\n        {\r\n            if (Status == InstallStatus.Downloading)\r\n            {\r\n                webClient.CancelAsync();\r\n                webClient.Dispose();\r\n                webClient = null;\r\n                Status = InstallStatus.Idle;\r\n            }\r\n            else\r\n            {\r\n                windowHost.Close();\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tools/PlayniteInstaller/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"PlayniteInstaller.MainWindow\"\r\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\r\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\r\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"        \r\n        xmlns:sys=\"clr-namespace:System;assembly=mscorlib\"\r\n        xmlns:local=\"clr-namespace:PlayniteInstaller\"\r\n        mc:Ignorable=\"d\"\r\n        WindowStartupLocation=\"CenterScreen\" ResizeMode=\"NoResize\"\r\n        Background=\"#252422\"\r\n        Title=\"Playnite Installer\" Width=\"600\" SizeToContent=\"Height\">\r\n    \r\n    <StackPanel Margin=\"10\">\r\n        <StackPanel.Resources>\r\n            <local:InstallStatusToVisibilityConverter x:Key=\"InstallStatusToVisibilityConverter\" />\r\n            <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\" />\r\n        </StackPanel.Resources>\r\n\r\n        <TextBlock FontSize=\"20\" VerticalAlignment=\"Center\" Margin=\"15,10,10,0\">\r\n            <TextBlock.Style>\r\n                <Style TargetType=\"TextBlock\" BasedOn=\"{StaticResource BaseTextBlockStyle}\">\r\n                    <Setter Property=\"Text\" Value=\"Install Playnite\" />\r\n                    <Style.Triggers>\r\n                        <DataTrigger Binding=\"{Binding Status}\" Value=\"{x:Static local:InstallStatus.Downloading}\">\r\n                            <Setter Property=\"Text\" Value=\"Downloading...\" />\r\n                        </DataTrigger>\r\n                        <DataTrigger Binding=\"{Binding Status}\" Value=\"{x:Static local:InstallStatus.Installing}\">\r\n                            <Setter Property=\"Text\" Value=\"Installing...\" />\r\n                        </DataTrigger>\r\n                    </Style.Triggers>\r\n                </Style>\r\n            </TextBlock.Style>\r\n        </TextBlock>\r\n\r\n        <StackPanel Visibility=\"{Binding Status, Converter={StaticResource InstallStatusToVisibilityConverter}, ConverterParameter={x:Static local:InstallStatus.Idle}}\"\r\n                    Margin=\"0,15,0,5\">\r\n            <DockPanel Margin=\"5\">\r\n                <TextBlock Text=\"Destination Folder\" DockPanel.Dock=\"Left\" Margin=\"10,5,10,5\" />\r\n                <Button Content=\"Browse...\" DockPanel.Dock=\"Right\"\r\n                Command=\"{Binding BrowseCommand}\"\r\n                Padding=\"10,0,10,0\" Margin=\"10,0,10,0\"/>\r\n                <TextBox DockPanel.Dock=\"Left\" VerticalContentAlignment=\"Center\"\r\n                         Text=\"{Binding DestionationFolder,UpdateSourceTrigger=PropertyChanged}\" />\r\n            </DockPanel>\r\n\r\n            <CheckBox Content=\"Portable\" HorizontalAlignment=\"Left\"\r\n                      IsChecked=\"{Binding Portable}\"\r\n                      ToolTipService.InitialShowDelay=\"0\"\r\n                      ToolTip=\"Installs Playnite in Portable mode.&#x0a;All configuration files and game database will be stored in application's folder.\"\r\n                      Margin=\"15,10,10,10\"/>\r\n        </StackPanel>\r\n\r\n        <ProgressBar HorizontalAlignment=\"Stretch\" Height=\"25\" Margin=\"15,10,15,10\"\r\n                     Minimum=\"0\" Maximum=\"100\" Value=\"{Binding ProgressValue}\">\r\n            <ProgressBar.Style>\r\n                <Style TargetType=\"ProgressBar\" BasedOn=\"{StaticResource {x:Type ProgressBar}}\">\r\n                    <Setter Property=\"IsIndeterminate\" Value=\"False\" />\r\n                    <Setter Property=\"Visibility\" Value=\"Collapsed\" />\r\n                    <Style.Triggers>\r\n                        <DataTrigger Binding=\"{Binding Status}\" Value=\"{x:Static local:InstallStatus.Installing}\">\r\n                            <Setter Property=\"IsIndeterminate\" Value=\"True\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                        </DataTrigger>\r\n                        <DataTrigger Binding=\"{Binding Status}\" Value=\"{x:Static local:InstallStatus.Downloading}\">\r\n                            <Setter Property=\"IsIndeterminate\" Value=\"False\" />\r\n                            <Setter Property=\"Visibility\" Value=\"Visible\" />\r\n                        </DataTrigger>\r\n                    </Style.Triggers>\r\n                </Style>\r\n            </ProgressBar.Style>\r\n        </ProgressBar>\r\n\r\n        <DockPanel Margin=\"15,0,15,10\">\r\n            <Button Content=\"Cancel\" Padding=\"20,5,20,5\"\r\n                    IsCancel=\"True\" DockPanel.Dock=\"Right\"\r\n                    Command=\"{Binding CancelCommand}\"/>\r\n            <Button Content=\"Install\" Padding=\"20,5,20,5\" Margin=\"0,0,10,0\"\r\n                    IsDefault=\"True\" DockPanel.Dock=\"Right\"\r\n                    Command=\"{Binding InstallCommand}\"/>            \r\n            <TextBlock DockPanel.Dock=\"Left\" VerticalAlignment=\"Center\">\r\n                <Hyperlink Command=\"{Binding NavigateUrlCommand}\"\r\n                           CommandParameter=\"https://github.com/JosefNemec/Playnite/wiki/Installation-troubleshooting\">\r\n                    <Run Text=\"Having issues?\" />\r\n                </Hyperlink>\r\n            </TextBlock>\r\n        </DockPanel>\r\n    </StackPanel>\r\n</Window>\r\n"
  },
  {
    "path": "source/Tools/PlayniteInstaller/MainWindow.xaml.cs",
    "content": "﻿using System;\r\nusing System.Collections.Generic;\r\nusing System.Configuration;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows;\r\nusing System.Windows.Controls;\r\nusing System.Windows.Data;\r\nusing System.Windows.Documents;\r\nusing System.Windows.Input;\r\nusing System.Windows.Media;\r\nusing System.Windows.Navigation;\r\nusing System.Windows.Shapes;\r\n\r\nnamespace PlayniteInstaller\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for MainWindow.xaml\r\n    /// </summary>\r\n    public partial class MainWindow : Window\r\n    {\r\n        public MainWindow()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tools/PlayniteInstaller/PlayniteInstaller.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{62DDB6BD-36D1-42C1-BA38-6C7550EA366E}</ProjectGuid>\r\n    <OutputType>WinExe</OutputType>\r\n    <RootNamespace>PlayniteInstaller</RootNamespace>\r\n    <AssemblyName>PlayniteInstaller</AssemblyName>\r\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\r\n    <WarningLevel>4</WarningLevel>\r\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\r\n    <TargetFrameworkProfile />\r\n    <NuGetPackageImportStamp>\r\n    </NuGetPackageImportStamp>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <Prefer32Bit>false</Prefer32Bit>\r\n    <LangVersion>7.3</LangVersion>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <PlatformTarget>AnyCPU</PlatformTarget>\r\n    <DebugType>none</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n    <LangVersion>7.3</LangVersion>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <ApplicationIcon>playnite-logo-default.ico</ApplicationIcon>\r\n  </PropertyGroup>\r\n  <PropertyGroup>\r\n    <ApplicationManifest>app.manifest</ApplicationManifest>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Configuration\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.IO.Compression\" />\r\n    <Reference Include=\"System.Runtime.Serialization\" />\r\n    <Reference Include=\"System.ServiceModel\" />\r\n    <Reference Include=\"System.Transactions\" />\r\n    <Reference Include=\"System.Web\" />\r\n    <Reference Include=\"System.Windows.Forms\" />\r\n    <Reference Include=\"System.Xml\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xaml\">\r\n      <RequiredTargetFramework>4.0</RequiredTargetFramework>\r\n    </Reference>\r\n    <Reference Include=\"WindowsBase\" />\r\n    <Reference Include=\"PresentationCore\" />\r\n    <Reference Include=\"PresentationFramework\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ApplicationDefinition Include=\"App.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </ApplicationDefinition>\r\n    <Compile Include=\"..\\..\\PlayniteSDK\\Collections\\ObservableObject.cs\">\r\n      <Link>Shared\\ObservableObject.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\PlayniteSDK\\ILogger.cs\">\r\n      <Link>Shared\\ILogger.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\PlayniteSDK\\RelayCommand.cs\">\r\n      <Link>Shared\\RelayCommand.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Common\\Extensions\\StringExtensions.cs\">\r\n      <Link>Shared\\StringExtensions.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Common\\FileSystem.cs\">\r\n      <Link>Shared\\FileSystem.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Common\\Paths.cs\">\r\n      <Link>Shared\\Paths.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Common\\Resources.cs\">\r\n      <Link>Shared\\Resources.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Fileapi.cs\">\r\n      <Link>Shared\\Native\\Fileapi.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Kernel32.cs\">\r\n      <Link>Shared\\Native\\Kernel32.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Ntdll.cs\">\r\n      <Link>Shared\\Native\\Ntdll.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Processthreadsapi.cs\">\r\n      <Link>Shared\\Native\\Processthreadsapi.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Shlwapi.cs\">\r\n      <Link>Shared\\Native\\Shlwapi.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Winbase.cs\">\r\n      <Link>Shared\\Native\\Winbase.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Windef.cs\">\r\n      <Link>Shared\\Native\\Windef.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\Winnt.cs\">\r\n      <Link>Shared\\Native\\Winnt.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"..\\..\\Playnite\\Native\\winuser.cs\">\r\n      <Link>Shared\\Native\\winuser.cs</Link>\r\n    </Compile>\r\n    <Compile Include=\"Converters.cs\" />\r\n    <Compile Include=\"Logger.cs\" />\r\n    <Compile Include=\"MainViewModel.cs\" />\r\n    <Page Include=\"MainWindow.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n    <Compile Include=\"App.xaml.cs\">\r\n      <DependentUpon>App.xaml</DependentUpon>\r\n      <SubType>Code</SubType>\r\n    </Compile>\r\n    <Compile Include=\"MainWindow.xaml.cs\">\r\n      <DependentUpon>MainWindow.xaml</DependentUpon>\r\n      <SubType>Code</SubType>\r\n    </Compile>\r\n    <Page Include=\"Classic.xaml\">\r\n      <Generator>MSBuild:Compile</Generator>\r\n      <SubType>Designer</SubType>\r\n    </Page>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\r\n      <SubType>Code</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DesignTime>True</DesignTime>\r\n      <DependentUpon>Resources.resx</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\r\n      <AutoGen>True</AutoGen>\r\n      <DependentUpon>Settings.settings</DependentUpon>\r\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\r\n    </Compile>\r\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\r\n      <Generator>ResXFileCodeGenerator</Generator>\r\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\r\n    </EmbeddedResource>\r\n    <None Include=\"app.manifest\">\r\n      <SubType>Designer</SubType>\r\n    </None>\r\n    <None Include=\"Properties\\Settings.settings\">\r\n      <Generator>SettingsSingleFileGenerator</Generator>\r\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"App.config\">\r\n      <SubType>Designer</SubType>\r\n    </None>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <EmbeddedResource Include=\"installer_mirrors.txt\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Resource Include=\"playnite-logo-default.ico\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "source/Tools/PlayniteInstaller/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Resources;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\nusing System.Windows;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"PlayniteInstaller\")]\r\n[assembly: AssemblyDescription(\"Playnite Installer Application\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"Playnite Online Installer\")]\r\n[assembly: AssemblyCopyright(\"Copyright © Josef Nemec 2021\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n//In order to begin building localizable applications, set\r\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\r\n//inside a <PropertyGroup>.  For example, if you are using US english\r\n//in your source files, set the <UICulture> to en-US.  Then uncomment\r\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\r\n//the line below to match the UICulture setting in the project file.\r\n\r\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\r\n\r\n[assembly: ThemeInfo(\r\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\r\n                                     //(used if a resource is not found in the page,\r\n                                     // or application resource dictionaries)\r\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\r\n                                              //(used if a resource is not found in the page,\r\n                                              // app, or any theme specific resource dictionaries)\r\n)]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]"
  },
  {
    "path": "source/Tools/PlayniteInstaller/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace PlayniteInstaller.Properties {\r\n    using System;\r\n    \r\n    \r\n    /// <summary>\r\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\r\n    /// </summary>\r\n    // This class was auto-generated by the StronglyTypedResourceBuilder\r\n    // class via a tool like ResGen or Visual Studio.\r\n    // To add or remove a member, edit your .ResX file then rerun ResGen\r\n    // with the /str option, or rebuild your VS project.\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"15.0.0.0\")]\r\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    internal class Resources {\r\n        \r\n        private static global::System.Resources.ResourceManager resourceMan;\r\n        \r\n        private static global::System.Globalization.CultureInfo resourceCulture;\r\n        \r\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\r\n        internal Resources() {\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Returns the cached ResourceManager instance used by this class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Resources.ResourceManager ResourceManager {\r\n            get {\r\n                if (object.ReferenceEquals(resourceMan, null)) {\r\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"PlayniteInstaller.Properties.Resources\", typeof(Resources).Assembly);\r\n                    resourceMan = temp;\r\n                }\r\n                return resourceMan;\r\n            }\r\n        }\r\n        \r\n        /// <summary>\r\n        ///   Overrides the current thread's CurrentUICulture property for all\r\n        ///   resource lookups using this strongly typed resource class.\r\n        /// </summary>\r\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r\n        internal static global::System.Globalization.CultureInfo Culture {\r\n            get {\r\n                return resourceCulture;\r\n            }\r\n            set {\r\n                resourceCulture = value;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tools/PlayniteInstaller/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<root>\r\n  <!-- \r\n    Microsoft ResX Schema \r\n    \r\n    Version 2.0\r\n    \r\n    The primary goals of this format is to allow a simple XML format \r\n    that is mostly human readable. The generation and parsing of the \r\n    various data types are done through the TypeConverter classes \r\n    associated with the data types.\r\n    \r\n    Example:\r\n    \r\n    ... ado.net/XML headers & schema ...\r\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\r\n    <resheader name=\"version\">2.0</resheader>\r\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\r\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\r\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\r\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\r\n    </data>\r\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\r\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r\n        <comment>This is a comment</comment>\r\n    </data>\r\n                \r\n    There are any number of \"resheader\" rows that contain simple \r\n    name/value pairs.\r\n    \r\n    Each data row contains a name, and value. The row also contains a \r\n    type or mimetype. Type corresponds to a .NET class that support \r\n    text/value conversion through the TypeConverter architecture. \r\n    Classes that don't support this are serialized and stored with the \r\n    mimetype set.\r\n    \r\n    The mimetype is used for serialized objects, and tells the \r\n    ResXResourceReader how to depersist the object. This is currently not \r\n    extensible. For a given mimetype the value must be set accordingly:\r\n    \r\n    Note - application/x-microsoft.net.object.binary.base64 is the format \r\n    that the ResXResourceWriter will generate, however the reader can \r\n    read any of the formats listed below.\r\n    \r\n    mimetype: application/x-microsoft.net.object.binary.base64\r\n    value   : The object must be serialized with \r\n            : System.Serialization.Formatters.Binary.BinaryFormatter\r\n            : and then encoded with base64 encoding.\r\n    \r\n    mimetype: application/x-microsoft.net.object.soap.base64\r\n    value   : The object must be serialized with \r\n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r\n            : and then encoded with base64 encoding.\r\n\r\n    mimetype: application/x-microsoft.net.object.bytearray.base64\r\n    value   : The object must be serialized into a byte array \r\n            : using a System.ComponentModel.TypeConverter\r\n            : and then encoded with base64 encoding.\r\n    -->\r\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\r\n      <xsd:complexType>\r\n        <xsd:choice maxOccurs=\"unbounded\">\r\n          <xsd:element name=\"metadata\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"assembly\">\r\n            <xsd:complexType>\r\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"data\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\r\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\r\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n          <xsd:element name=\"resheader\">\r\n            <xsd:complexType>\r\n              <xsd:sequence>\r\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\r\n              </xsd:sequence>\r\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\r\n            </xsd:complexType>\r\n          </xsd:element>\r\n        </xsd:choice>\r\n      </xsd:complexType>\r\n    </xsd:element>\r\n  </xsd:schema>\r\n  <resheader name=\"resmimetype\">\r\n    <value>text/microsoft-resx</value>\r\n  </resheader>\r\n  <resheader name=\"version\">\r\n    <value>2.0</value>\r\n  </resheader>\r\n  <resheader name=\"reader\">\r\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n  <resheader name=\"writer\">\r\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r\n  </resheader>\r\n</root>"
  },
  {
    "path": "source/Tools/PlayniteInstaller/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code was generated by a tool.\r\n//     Runtime Version:4.0.30319.42000\r\n//\r\n//     Changes to this file may cause incorrect behavior and will be lost if\r\n//     the code is regenerated.\r\n// </auto-generated>\r\n//------------------------------------------------------------------------------\r\n\r\nnamespace PlayniteInstaller.Properties {\r\n    \r\n    \r\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"15.8.0.0\")]\r\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\r\n        \r\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\r\n        \r\n        public static Settings Default {\r\n            get {\r\n                return defaultInstance;\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "source/Tools/PlayniteInstaller/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\r\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\r\n  <Profiles>\r\n    <Profile Name=\"(Default)\" />\r\n  </Profiles>\r\n  <Settings />\r\n</SettingsFile>"
  },
  {
    "path": "source/Tools/PlayniteInstaller/app.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<assembly manifestVersion=\"1.0\" xmlns=\"urn:schemas-microsoft-com:asm.v1\">\r\n  <assemblyIdentity version=\"1.0.0.0\" name=\"Playnite.DesktopApp\"/>\r\n  <trustInfo xmlns=\"urn:schemas-microsoft-com:asm.v2\">\r\n    <security>\r\n      <requestedPrivileges xmlns=\"urn:schemas-microsoft-com:asm.v3\">\r\n        <requestedExecutionLevel level=\"asInvoker\" uiAccess=\"false\" />\r\n      </requestedPrivileges>\r\n    </security>\r\n  </trustInfo>\r\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\r\n    <application>\r\n      <!-- Windows 7 -->\r\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" />\r\n      <!-- Windows 8 -->\r\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" />\r\n      <!-- Windows 8.1 -->\r\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" />\r\n      <!-- Windows 10 -->\r\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />\r\n    </application>\r\n  </compatibility>\r\n</assembly>"
  },
  {
    "path": "source/Tools/PlayniteInstaller/installer_mirrors.txt",
    "content": "﻿https://raw.githubusercontent.com/JosefNemec/PlayniteWeb/master/manifests/installer_mirrors.txt\r\nhttps://playnite.link/download/installer_mirrors.txt"
  },
  {
    "path": "tests/Extensions/Plugins/FullTestPluginDev/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"FullTestPlugin\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"FullTestPlugin\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2018\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"33208479-213f-493f-b43c-fc2cec311ff6\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "tests/Extensions/Plugins/FullTestPluginDev/TestPluginDev.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace FullTestPlugin\r\n{\r\n    public class TestPluginDev : Plugin\r\n    {\r\n        private ILogger logger;\r\n\r\n        public TestPluginDev(IPlayniteAPI api) : base(api)\r\n        {\r\n            logger = PlayniteApi.CreateLogger(\"TestPluginDev\");\r\n        }\r\n\r\n        public override PluginProperties GetPluginProperties()\r\n        {\r\n            return new PluginProperties(\"Test Plugin Dev\", \"Josef Nemec\", \"1.0\");\r\n        }\r\n\r\n        public override List<ExtensionFunction> GetFunctions()\r\n        {\r\n            return new List<ExtensionFunction>()\r\n            {\r\n                new ExtensionFunction(\r\n                    \"Test Func from C#\",\r\n                    () =>\r\n                    {\r\n                        logger.Info($\"TestPluginDev ExtensionFunction {PlayniteApi.Database.GetGames().Count}\");\r\n                    })\r\n            };\r\n        }\r\n        \r\n        public override void OnLoaded()\r\n        {\r\n            logger.Info(\"TestPluginDev OnLoaded\");\r\n        }\r\n\r\n        public override void OnGameInstalled(Game game)\r\n        {\r\n            logger.Info($\"TestPluginDev OnGameInstalled {game.Name}\");\r\n        }\r\n\r\n        public override void OnGameStopped(Game game, long ellapsedSeconds)\r\n        {\r\n            logger.Info($\"TestPluginDev OnGameStopped {game.Name}\");\r\n        }\r\n\r\n        public override void OnGameUninstalled(Game game)\r\n        {\r\n            logger.Info($\"TestPluginDev OnGameUninstalled {game.Name}\");\r\n        }\r\n\r\n        public override void OnGameStarting(Game game)\r\n        {\r\n            logger.Info($\"TestPluginDev OnGameStarting {game.Name}\");\r\n        }\r\n\r\n        public override void OnGameStarted(Game game)\r\n        {\r\n            logger.Info($\"TestPluginDev OnGameStarted {game.Name}\");\r\n        }\r\n\r\n        public override void Dispose()\r\n        {\r\n            logger.Info($\"TestPluginDev Dispose\");\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "tests/Extensions/Plugins/FullTestPluginDev/TestPluginDev.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{33208479-213F-493F-B43C-FC2CEC311FF6}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>FullTestPlugin</RootNamespace>\r\n    <AssemblyName>TestPluginDev</AssemblyName>\r\n    <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"LiteDB, Version=3.1.4.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL\">\r\n      <HintPath>packages\\LiteDB.3.1.4\\lib\\net462\\LiteDB.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\r\n      <HintPath>packages\\Newtonsoft.Json.10.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PlayniteSDK, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <SpecificVersion>False</SpecificVersion>\r\n      <HintPath>..\\..\\..\\..\\source\\PlayniteSDK\\bin\\Debug\\PlayniteSDK.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"TestPluginDev.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "tests/Extensions/Plugins/FullTestPluginDev/TestPluginDev.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 15\r\nVisualStudioVersion = 15.0.27703.2026\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TestPluginDev\", \"TestPluginDev.csproj\", \"{33208479-213F-493F-B43C-FC2CEC311FF6}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{33208479-213F-493F-B43C-FC2CEC311FF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{33208479-213F-493F-B43C-FC2CEC311FF6}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{33208479-213F-493F-B43C-FC2CEC311FF6}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{33208479-213F-493F-B43C-FC2CEC311FF6}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {FA2D30C5-C251-4E04-90E3-CDFC6495D605}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/Extensions/Plugins/FullTestPluginDev/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"LiteDB\" version=\"3.1.4\" targetFramework=\"net471\" />\r\n  <package id=\"Newtonsoft.Json\" version=\"10.0.1\" targetFramework=\"net471\" />\r\n</packages>"
  },
  {
    "path": "tests/Extensions/Plugins/FullTestPluginNuget/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\n\r\n// General Information about an assembly is controlled through the following\r\n// set of attributes. Change these attribute values to modify the information\r\n// associated with an assembly.\r\n[assembly: AssemblyTitle(\"FullTestPlugin\")]\r\n[assembly: AssemblyDescription(\"\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyCompany(\"\")]\r\n[assembly: AssemblyProduct(\"FullTestPlugin\")]\r\n[assembly: AssemblyCopyright(\"Copyright ©  2018\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly not visible\r\n// to COM components.  If you need to access a type in this assembly from\r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: ComVisible(false)]\r\n\r\n// The following GUID is for the ID of the typelib if this project is exposed to COM\r\n[assembly: Guid(\"33208479-213f-493f-b43c-fc2cec311ff6\")]\r\n\r\n// Version information for an assembly consists of the following four values:\r\n//\r\n//      Major Version\r\n//      Minor Version\r\n//      Build Number\r\n//      Revision\r\n//\r\n// You can specify all the values or you can default the Build and Revision Numbers\r\n// by using the '*' as shown below:\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\r\n"
  },
  {
    "path": "tests/Extensions/Plugins/FullTestPluginNuget/TestPluginNuget.cs",
    "content": "﻿using Playnite.SDK;\r\nusing Playnite.SDK.Models;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace FullTestPlugin\r\n{\r\n    public class TestPluginNuget : Plugin\r\n    {\r\n        private ILogger logger;\r\n\r\n        public TestPluginNuget(IPlayniteAPI api) : base(api)\r\n        {\r\n            logger = PlayniteApi.CreateLogger(\"TestPluginNuget\");\r\n        }\r\n\r\n        public override PluginProperties GetPluginProperties()\r\n        {\r\n            return new PluginProperties(\"Test Plugin Nuget\", \"Josef Nemec\", \"1.0\");\r\n        }\r\n\r\n        public override List<ExtensionFunction> GetFunctions()\r\n        {\r\n            return new List<ExtensionFunction>()\r\n            {\r\n                new ExtensionFunction(\r\n                    \"Test Func from C#\",\r\n                    () =>\r\n                    {\r\n                        logger.Info($\"TestPluginNuget ExtensionFunction {PlayniteApi.Database.GetGames().Count}\");\r\n                    })\r\n            };\r\n        }\r\n        \r\n        public override void OnLoaded()\r\n        {\r\n            logger.Info(\"TestPluginNuget OnLoaded\");\r\n        }\r\n\r\n        public override void OnGameInstalled(Game game)\r\n        {\r\n            logger.Info($\"TestPluginNuget OnGameInstalled {game.Name}\");\r\n        }\r\n\r\n        public override void OnGameStopped(Game game, long ellapsedSeconds)\r\n        {\r\n            logger.Info($\"TestPluginNuget OnGameStopped {game.Name}\");\r\n        }\r\n\r\n        public override void OnGameUninstalled(Game game)\r\n        {\r\n            logger.Info($\"TestPluginNuget OnGameUninstalled {game.Name}\");\r\n        }\r\n\r\n        public override void OnGameStarted(Game game)\r\n        {\r\n            logger.Info($\"TestPluginNuget OnGameStarted {game.Name}\");\r\n        }\r\n\r\n        public override void Dispose()\r\n        {\r\n            logger.Info($\"TestPluginNuget Dispose\");\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "tests/Extensions/Plugins/FullTestPluginNuget/TestPluginNuget.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{33208479-213F-493F-B43C-FC2CEC311FF6}</ProjectGuid>\r\n    <OutputType>Library</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>FullTestPlugin</RootNamespace>\r\n    <AssemblyName>TestPluginNuget</AssemblyName>\r\n    <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <DebugType>full</DebugType>\r\n    <Optimize>false</Optimize>\r\n    <OutputPath>bin\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\r\n    <DebugType>pdbonly</DebugType>\r\n    <Optimize>true</Optimize>\r\n    <OutputPath>bin\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <WarningLevel>4</WarningLevel>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"LiteDB, Version=3.1.4.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL\">\r\n      <HintPath>packages\\LiteDB.3.1.4\\lib\\net462\\LiteDB.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\r\n      <HintPath>packages\\Newtonsoft.Json.10.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PlayniteSDK, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\r\n      <HintPath>packages\\PlayniteSDK.1.0.1\\lib\\net462\\PlayniteSDK.dll</HintPath>\r\n    </Reference>\r\n    <Reference Include=\"PresentationFramework\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Core\" />\r\n    <Reference Include=\"System.Xml.Linq\" />\r\n    <Reference Include=\"System.Data.DataSetExtensions\" />\r\n    <Reference Include=\"Microsoft.CSharp\" />\r\n    <Reference Include=\"System.Data\" />\r\n    <Reference Include=\"System.Net.Http\" />\r\n    <Reference Include=\"System.Xml\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"TestPluginNuget.cs\" />\r\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"packages.config\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n</Project>"
  },
  {
    "path": "tests/Extensions/Plugins/FullTestPluginNuget/TestPluginNuget.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 15\r\nVisualStudioVersion = 15.0.27703.2026\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TestPluginNuget\", \"TestPluginNuget.csproj\", \"{33208479-213F-493F-B43C-FC2CEC311FF6}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Any CPU = Debug|Any CPU\r\n\t\tRelease|Any CPU = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{33208479-213F-493F-B43C-FC2CEC311FF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r\n\t\t{33208479-213F-493F-B43C-FC2CEC311FF6}.Debug|Any CPU.Build.0 = Debug|Any CPU\r\n\t\t{33208479-213F-493F-B43C-FC2CEC311FF6}.Release|Any CPU.ActiveCfg = Release|Any CPU\r\n\t\t{33208479-213F-493F-B43C-FC2CEC311FF6}.Release|Any CPU.Build.0 = Release|Any CPU\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {F6C3D297-FB51-458D-B55A-74773BC5B3AE}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/Extensions/Plugins/FullTestPluginNuget/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"LiteDB\" version=\"3.1.4\" targetFramework=\"net471\" />\r\n  <package id=\"Newtonsoft.Json\" version=\"10.0.1\" targetFramework=\"net471\" />\r\n  <package id=\"PlayniteSDK\" version=\"1.0.1\" targetFramework=\"net471\" />\r\n</packages>"
  },
  {
    "path": "tests/Extensions/Plugins/LibraryExporter/LibraryExporter.psm1",
    "content": "function ExportLibrary()\r\n{\r\n    $games = $PlayniteApi.Database.GetGames()\r\n    $path = $PlayniteApi.Dialogs.SaveFile(\"CSV|*.csv|Formated TXT|*.txt\")\r\n    if ($path)\r\n    {\r\n        if ($path -match \".csv$\")\r\n        {\r\n            $games | Select Name, Provider, ReleaseDate, Playtime, Source, IsInstalled | ConvertTo-Csv | Out-File $path -Encoding utf8\r\n        }\r\n        else\r\n        {           \r\n            $games | Select Name, Provider, ReleaseDate, Playtime, Source, IsInstalled | Format-Table -AutoSize | Out-File $path -Encoding utf8\r\n        }\r\n        \r\n        $PlayniteApi.Dialogs.ShowMessage(\"Library exported successfully.\");\r\n    }\r\n}"
  },
  {
    "path": "tests/Extensions/Plugins/LibraryExporter/plugin.info",
    "content": "﻿Name: GOG library importer\r\nAuthor: Josef Nemec\r\nVersion: 1.0\r\nModule: LibraryExporter.ps1\r\nType: Script\r\nFunctions: \r\n    - Description: Export Library\r\n      Name: ExportLibrary"
  },
  {
    "path": "tests/Extensions/Scripts/FullPowerShellScript.ps1",
    "content": "$global:__attributes = @{\r\n    Author = \"Josef Nemec\"\r\n    Version = \"1.0\"\r\n}\r\n\r\n$global:__exports = @(\r\n    @{\r\n        Name = \"PowerShell Function\"\r\n        Function = \"MenuFunction\"\r\n    }\r\n)\r\n\r\nfunction global:OnScriptLoaded()\r\n{\r\n    $__logger.Info(\"FullPowerShellScript OnScriptLoaded\")\r\n}\r\n\r\nfunction global:OnGameStarting()\r\n{\r\n    param(\r\n        $game\r\n    )\r\n\r\n    $__logger.Info(\"FullPowerShellScript OnGameStarting $($game.Name)\")\r\n}\r\n\r\nfunction global:OnGameStarted()\r\n{\r\n    param(\r\n        $game\r\n    )\r\n    \r\n    $__logger.Info(\"FullPowerShellScript OnGameStarted $($game.Name)\")\r\n}\r\n\r\nfunction global:OnGameStopped()\r\n{\r\n    param(\r\n        $game,\r\n        $ellapsedSeconds\r\n    )\r\n    \r\n    $__logger.Info(\"FullPowerShellScript OnGameStopped $($game.Name)\")\r\n}\r\n\r\nfunction global:OnGameInstalled()\r\n{\r\n    param(\r\n        $game\r\n    )   \r\n    \r\n    $__logger.Info(\"FullPowerShellScript OnGameInstalled $($game.Name)\")  \r\n}\r\n\r\nfunction global:OnGameUninstalled()\r\n{\r\n    param(\r\n        $game\r\n    ) \r\n    \r\n    $__logger.Info(\"FullPowerShellScript OnGameUninstalled $($game.Name)\")   \r\n}\r\n\r\nfunction global:MenuFunction()\r\n{\r\n    \r\n    $__logger.Info(\"FullPowerShellScript MenuFunction\")\r\n}"
  },
  {
    "path": "tests/Extensions/Scripts/FullPythonScript.py",
    "content": "__attributes = {\r\n    'Author': 'Josef Nemec',\r\n    'Version': '1.0'\r\n}\r\n\r\n__exports = [\r\n    {\r\n        'Name': 'Python Function',\r\n        'Function' : 'menu_function'\r\n    }\r\n]\r\n\r\ndef on_script_loaded():    \r\n    __logger.Info('FullPythonScript on_script_loaded')\r\n\r\ndef on_game_starting(game):\r\n    __logger.Info('FullPythonScript on_game_starting ' + game.Name)\r\n\r\ndef on_game_started(game):\r\n    __logger.Info('FullPythonScript on_game_started ' + game.Name)\r\n\r\ndef on_game_stopped(game, ellapsed_seconds):\r\n    __logger.Info('FullPythonScript on_game_stopped ' + game.Name)\r\n\r\ndef on_game_installed(game):\r\n    __logger.Info('FullPythonScript on_game_installed ' + game.Name)\r\n\r\ndef on_game_uninstalled(game):\r\n    __logger.Info('FullPythonScript on_game_uninstalled ' + game.Name)\r\n\r\ndef menu_function():\r\n    __logger.Info('FullPythonScript menu_function')"
  },
  {
    "path": "tests/Mapping/AboutWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass AboutWindow : Window\r\n{\r\n    [UIObject]$ButtonCreatePackage\r\n    [UIObject]$ButtonClose\r\n    [UIObject]$HyperlinkSource\r\n    [UIObject]$HyperlinkHomepage\r\n    [UIObject]$TextVersionInfo\r\n\r\n    AboutWindow() : base({Get-UIWindow -ProcessName \"PlayniteUI\" | Get-UIWindow -AutomationId \"WindowAbout\"}, \"WindowAbout\")\r\n    {\r\n        $this.ButtonCreatePackage = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonCreatePackage\" -First}), \"ButtonCreatePackage\")\r\n        $this.ButtonClose         = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonClose\" -First}), \"ButtonClose\")\r\n        $this.HyperlinkSource     = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"HyperlinkSource\" -First}), \"HyperlinkSource\")\r\n        $this.HyperlinkHomepage   = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"HyperlinkHomepage\" -First}), \"HyperlinkHomepage\")\r\n        $this.TextVersionInfo     = [UIObject]::New($this.GetChildReference({Get-UITextBlock -AutomationId \"TextVersionInfo\" -First}), \"TextVersionInfo\")\r\n    }\r\n}\r\n\r\nreturn [AboutWindow]::New()"
  },
  {
    "path": "tests/Mapping/CategoryConfigWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass CategoryConfigWindow : Window\r\n{\r\n    [UIObject]$ButtonAddCat\r\n    [UIObject]$ButtonCancel\r\n    [UIObject]$ButtonOK\r\n    [ListBox]$ListCategories\r\n    [UIObject]$TextNewCat\r\n\r\n    CategoryConfigWindow() : base({Get-UIWindow -ProcessName \"PlayniteUI\" | Get-UIWindow -AutomationId \"WindowCategories\"}, \"CategoryConfigWindow\")\r\n    {\r\n        $this.ButtonAddCat     = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonAddCat\" -First}), \"ButtonAddCat\")\r\n        $this.ButtonCancel     = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonCancel\" -First}), \"ButtonCancel\")\r\n        $this.ButtonOK         = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonOK\" -First}), \"ButtonOK\")\r\n        $this.ListCategories   = [ListBox]::New($this.GetChildReference({Get-UIListBox -AutomationId \"ListCategories\" -First}), \"ListCategories\")\r\n        $this.TextNewCat       = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextNewCat\" -First}), \"TextNewCat\")\r\n    }\r\n}\r\n\r\nreturn [CategoryConfigWindow]::New()"
  },
  {
    "path": "tests/Mapping/CrashHandlerWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass CrashHandlerWindow : Window\r\n{\r\n    [UIObject]$ButtonSaveDiag\r\n    [UIObject]$ButtonClose\r\n    [UIObject]$TextDetails\r\n    \r\n    CrashHandlerWindow() : base({Get-UIWindow -ProcessName \"PlayniteUI\" | Get-UIWindow -AutomationId \"WindowCrash\"}, \"CrashHandlerWindow\")\r\n    {\r\n        $this.ButtonSaveDiag = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonSaveDiag\" -First}), \"ButtonSaveDiag\")\r\n        $this.ButtonClose    = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonClose\" -First}), \"ButtonClose\")\r\n        $this.TextDetails    = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextDetails\" -First}), \"TextDetails\")\r\n    }\r\n}\r\n\r\nreturn [CrashHandlerWindow]::New()"
  },
  {
    "path": "tests/Mapping/FirstTimeWizardWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass FirstTimeWizardWindow : Window\r\n{\r\n    [UIObject]$ButtonNext\r\n    [UIObject]$ButtonBack\r\n    [UIObject]$ButtonFinish\r\n    [UIObject]$ButtonBrowseDbFile\r\n    [UIObject]$ButtonGogAuthenticate\r\n    [UIObject]$ButtonOriginAuthenticate\r\n    [UIObject]$ButtonImportGames\r\n    [UIObject]$CheckEnableGOG\r\n    [UIObject]$CheckEnableOrigin\r\n    [UIObject]$CheckEnableSteam\r\n    [UIObject]$RadioDbCustom\r\n    [UIObject]$RadioDbDefault\r\n    [UIObject]$RadioInstalledGOG\r\n    [UIObject]$RadioInstalledOrigin\r\n    [UIObject]$RadioInstalledSteam\r\n    [UIObject]$RadioLibraryGOG\r\n    [UIObject]$RadioLibraryOrigin\r\n    [UIObject]$RadioLibrarySteam\r\n    [UIObject]$TextDbFile\r\n    [UIObject]$TextSteamAccount\r\n\r\n    FirstTimeWizardWindow() : base({Get-UIWindow -ProcessName \"PlayniteUI\" | Get-UIWindow -AutomationId \"WindowWizard\"}, \"FirstTimeWizardWindow\")\r\n    {\r\n        $this.ButtonNext                = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonNext\"}), \"ButtonNext\");\r\n        $this.ButtonBack                = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonBack\"}), \"ButtonBack\");\r\n        $this.ButtonFinish              = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonFinish\"}), \"ButtonFinish\");\r\n        $this.ButtonBrowseDbFile        = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonBrowserDbFile\"}), \"ButtonBrowserDbFile\");\r\n        $this.ButtonGogAuthenticate     = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonGogAuthenticate\"}), \"ButtonGogAuthenticate\");\r\n        $this.ButtonOriginAuthenticate  = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonOriginAuthenticate\"}), \"ButtonOriginAuthenticate\");\r\n        $this.ButtonImportGames         = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonImportGames\"}), \"ButtonImportGames\");\r\n        $this.CheckEnableGOG            = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckEnableGOG\"}), \"CheckEnableGOG\");\r\n        $this.CheckEnableOrigin         = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckEnableOrigin\"}), \"CheckEnableOrigin\");\r\n        $this.CheckEnableSteam          = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckEnableSteam\"}), \"CheckEnableSteam\");\r\n        $this.RadioDbCustom             = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioDbCustom\"}), \"RadioDbCustom\");\r\n        $this.RadioDbDefault            = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioDbDefault\"}), \"RadioDbDefault\");\r\n        $this.RadioInstalledGOG         = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioInstalledGOG\"}), \"RadioInstalledGOG\");\r\n        $this.RadioInstalledOrigin      = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioInstalledOrigin\"}), \"RadioInstalledOrigin\");\r\n        $this.RadioInstalledSteam       = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioInstalledSteam\"}), \"RadioInstalledSteam\");\r\n        $this.RadioLibraryGOG           = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioLibraryGOG\"}), \"RadioLibraryGOG\");\r\n        $this.RadioLibraryOrigin        = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioLibraryOrigin\"}), \"RadioLibraryOrigin\");\r\n        $this.RadioLibrarySteam         = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioLibrarySteam\"}), \"RadioLibrarySteam\");\r\n        $this.TextDbFile                = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextDbFile\"}), \"TextDbFile\");\r\n        $this.TextSteamAccount          = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextSteamAccount\"}), \"TextSteamAccount\");\r\n    }\r\n}\r\n\r\nreturn [FirstTimeWizardWindow]::New()"
  },
  {
    "path": "tests/Mapping/GameEditWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass GameTaskControl : UIObject\r\n{\r\n    [UIObject]$ButtonBrowse\r\n    [UIObject]$ComboType\r\n    [UIObject]$TextArguments\r\n    [UIObject]$TextWorkDir\r\n    [UIObject]$TextName\r\n    [UIObject]$TextPath\r\n\r\n    GameTaskControl([scriptblock]$ScriptReference, [string]$Name) : base($ScriptReference, $Name)\r\n    {\r\n        $this.ButtonBrowse  = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonBrowse\" -First}), \"ButtonBrowse\")\r\n        $this.ComboType     = [UIObject]::New($this.GetChildReference({Get-UIComboBox -AutomationId \"ComboType\" -First}), \"ComboType\")\r\n        $this.TextArguments = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextArguments\" -First}), \"TextArguments\")\r\n        $this.TextWorkDir   = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextWorkDir\" -First}), \"TextWorkDir\")\r\n        $this.TextName      = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextName\" -First}), \"TextName\")\r\n        $this.TextPath      = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextPath\" -First}), \"TextPath\")\r\n    }\r\n\r\n    GameTaskControl([object]$ObjectReference) : base($ObjectReference)\r\n    {\r\n        $this.ButtonBrowse  = [UIObject]::New(($ObjectReference | Get-UIButton -AutomationId \"ButtonBrowse\" -First))\r\n        $this.ComboType     = [UIObject]::New(($ObjectReference | Get-UIComboBox -AutomationId \"ComboType\" -First))\r\n        $this.TextArguments = [UIObject]::New(($ObjectReference | Get-UITextBox -AutomationId \"TextArguments\" -First))\r\n        $this.TextWorkDir   = [UIObject]::New(($ObjectReference | Get-UITextBox -AutomationId \"TextWorkDir\" -First))\r\n        $this.TextName      = [UIObject]::New(($ObjectReference | Get-UITextBox -AutomationId \"TextName\" -First))\r\n        $this.TextPath      = [UIObject]::New(($ObjectReference | Get-UITextBox -AutomationId \"TextPath\" -First))\r\n    }\r\n}\r\n\r\nclass GameEditWindow : Window\r\n{\r\n    [UIObject]$ButtonSelectImage\r\n    [UIObject]$ButtonAddPlay\r\n    [UIObject]$ButtonUseExeIcon\r\n    [UIObject]$ButtonPickCat\r\n    [UIObject]$ButtonSelectIcon\r\n    [UIObject]$ButtonDownload\r\n    [UIObject]$ButtonCancel\r\n    [UIObject]$ButtonOK\r\n    [UIObject]$ButtonRemovePlay\r\n    [UIObject]$ButtonAddAction\r\n    [UIObject]$CheckForums\r\n    [UIObject]$CheckWiki\r\n    [UIObject]$CheckImage\r\n    [UIObject]$CheckIcon\r\n    [UIObject]$CheckDescription\r\n    [UIObject]$CheckStore\r\n    [UIObject]$CheckCategories\r\n    [UIObject]$CheckGenres\r\n    [UIObject]$CheckReleaseDate\r\n    [UIObject]$CheckPublisher\r\n    [UIObject]$CheckName\r\n    [UIObject]$CheckDeveloper\r\n    [UIObject]$ImageImage\r\n    [UIObject]$ImageIcon\r\n    [UIObject]$OtherTasksItems\r\n    [GameTaskControl]$TaskPlay\r\n    [UIObject]$TaskCustom\r\n    [TabControl]$TabControlMain\r\n    [UIObject]$TabActions\r\n    [UIObject]$TextGenres\r\n    [UIObject]$TextName\r\n    [UIObject]$TextWiki\r\n    [UIObject]$TextForums\r\n    [UIObject]$TextStore\r\n    [UIObject]$TextCategories\r\n    [UIObject]$TextDeveloper\r\n    [UIObject]$TextReleaseDate\r\n    [UIObject]$TextPublisher\r\n    [UIObject]$TextDescription\r\n    \r\n    GameEditWindow() : base({Get-UIWindow -ProcessName \"PlayniteUI\" -AutomationId \"WindowMain\" | Get-UIWindow -AutomationId \"WindowGameEdit\"}, \"GameEditWindow\")\r\n    {\r\n        $this.ButtonSelectImage = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonSelectImage\" -First}), \"ButtonSelectImage\")\r\n        $this.ButtonAddPlay     = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonAddPlay\" -First}), \"ButtonAddPlay\")\r\n        $this.ButtonUseExeIcon  = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonUseExeIcon\" -First}), \"ButtonUseExeIcon\")\r\n        $this.ButtonPickCat     = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonPickCat\" -First}), \"ButtonPickCat\")\r\n        $this.ButtonSelectIcon  = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonSelectIcon\" -First}), \"ButtonSelectIcon\")\r\n        $this.ButtonDownload    = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonDownload\" -First}), \"ButtonDownload\")\r\n        $this.ButtonCancel      = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonCancel\" -First}), \"ButtonCancel\")\r\n        $this.ButtonOK          = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonOK\" -First}), \"ButtonOK\")\r\n        $this.ButtonRemovePlay  = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonRemovePlay\" -First}), \"ButtonRemovePlay\")\r\n        $this.ButtonAddAction   = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonAddAction\" -First}), \"ButtonAddAction\")\r\n        $this.CheckForums       = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckForums\" -First}), \"CheckForums\")\r\n        $this.CheckWiki         = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckWiki\" -First}), \"CheckWiki\")\r\n        $this.CheckImage        = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckImage\" -First}), \"CheckImage\")\r\n        $this.CheckIcon         = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckIcon\" -First}), \"CheckIcon\")\r\n        $this.CheckDescription  = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckDescription\" -First}), \"CheckDescription\")\r\n        $this.CheckStore        = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckStore\" -First}), \"CheckStore\")\r\n        $this.CheckCategories   = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckCategories\" -First}), \"CheckCategories\")\r\n        $this.CheckGenres       = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckGenres\" -First}), \"CheckGenres\")\r\n        $this.CheckReleaseDate  = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckReleaseDate\" -First}), \"CheckReleaseDate\")\r\n        $this.CheckPublisher    = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckPublisher\" -First}), \"CheckPublisher\")\r\n        $this.CheckName         = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckName\" -First}), \"CheckName\")\r\n        $this.CheckDeveloper    = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckDeveloper\" -First}), \"CheckDeveloper\")\r\n        $this.ImageImage        = [UIObject]::New($this.GetChildReference({Get-UIImage -AutomationId \"ImageImage\" -First}), \"ImageImage\")\r\n        $this.ImageIcon         = [UIObject]::New($this.GetChildReference({Get-UIImage -AutomationId \"ImageIcon\" -First}), \"ImageIcon\")\r\n        $this.OtherTasksItems   = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"OtherTasksItems\" -First}), \"OtherTasksItems\")\r\n        $this.TaskPlay          = [GameTaskControl]::New($this.GetChildReference({Get-UIControl -AutomationId \"TaskPlay\" -First}), \"TaskPlay\")\r\n        $this.TaskCustom        = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"TaskCustom\" -First}), \"TaskCustom\")\r\n        $this.TabControlMain    = [TabControl]::New($this.GetChildReference({Get-UITabControl -AutomationId \"TabControlMain\" -First}), \"TabControlMain\")\r\n        $this.TabActions        = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"TabActions\" -First}), \"TabActions\")\r\n        $this.TextGenres        = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextGenres\" -First}), \"TextGenres\")\r\n        $this.TextName          = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextName\" -First}), \"TextName\")\r\n        $this.TextWiki          = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextWiki\" -First}), \"TextWiki\")\r\n        $this.TextForums        = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextForums\" -First}), \"TextForums\")\r\n        $this.TextStore         = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextStore\" -First}), \"TextStore\")\r\n        $this.TextCategories    = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextCategories\" -First}), \"TextCategories\")\r\n        $this.TextDeveloper     = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextDeveloper\" -First}), \"TextDeveloper\")\r\n        $this.TextReleaseDate   = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextReleaseDate\" -First}), \"TextReleaseDate\")\r\n        $this.TextPublisher     = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextPublisher\" -First}), \"TextPublisher\")\r\n        $this.TextDescription   = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextDescription\" -First}), \"TextDescription\")\r\n    }\r\n}\r\n\r\nreturn [GameEditWindow]::New()"
  },
  {
    "path": "tests/Mapping/InstalledGamesWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass InstalledGamesWindow : Window\r\n{\r\n    [UIObject]$ButtonCancel\r\n    [UIObject]$ButtonBrowse\r\n    [UIObject]$ButtonOK\r\n    [ListView]$ListPrograms\r\n    [UIObject]$TextDownloading\r\n    \r\n    InstalledGamesWindow() : base({Get-UIWindow -ProcessName \"PlayniteUI\" | Get-UIWindow -AutomationId \"WindowInstalledGames\"}, \"InstalledGamesWindow\")\r\n    {\r\n        $this.ButtonCancel         = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonCancel\" -First}), \"ButtonCancel\")\r\n        $this.ButtonBrowse         = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonBrowse\" -First}), \"ButtonBrowse\")\r\n        $this.ButtonOK             = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonOK\" -First}), \"ButtonOK\")\r\n        $this.ListPrograms         = [ListView]::New($this.GetChildReference({Get-UIListView -AutomationId \"ListPrograms\" -First}), \"ListPrograms\")\r\n        $this.TextDownloading      = [UIObject]::New($this.GetChildReference({Get-UITextBlock -AutomationId \"TextDownloading\" -First}), \"TextDownloading\")\r\n    }\r\n}\r\n\r\nreturn [InstalledGamesWindow]::New()"
  },
  {
    "path": "tests/Mapping/MainWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass MainWindow : Window\r\n{\r\n    [ListBox]$ListBoxGames\r\n    [ListView]$ListViewGames\r\n    [Menu]$PopupMenu\r\n    [UIObject]$TextFilter\r\n\r\n    [UIObject]$ButtonInstall\r\n    [UIObject]$ButtonMore\r\n    [UIObject]$ButtonSetupProgress\r\n    [UIObject]$ButtonPlay\r\n    [UIObject]$HyperlinkStore\r\n    [UIObject]$HyperlinkForum\r\n    [UIObject]$HyperlinkWiki\r\n\r\n    [Menu]$MenuMainMenu\r\n    [Menu]$MenuViewSettings\r\n    [Menu]$MenuViewMode\r\n    [UIObject]$FilterSelector\r\n    [UIObject]$GridGamesView\r\n    [UIObject]$ImagesGamesView\r\n    [UIObject]$ListGamesView\r\n    [UIObject]$SearchBoxFilter\r\n    [UIObject]$CheckFilterView\r\n    [UIObject]$ImageLogo\r\n    [UIObject]$ProgressControl\r\n    [UIObject]$TabControlView\r\n    [UIObject]$TextView\r\n    [UIObject]$TextGroup\r\n\r\n    MainWindow() : base({Get-UIWindow -ProcessName \"PlayniteUI\" -AutomationId \"WindowMain\"}, \"MainWindow\")\r\n    {\r\n        $this.ListBoxGames      = [ListBox]::New($this.GetChildReference({Get-UIListBox -AutomationId \"ListGames\" -First}), \"ListBoxGames\");\r\n        $this.ListViewGames     = [ListView]::New($this.GetChildReference({Get-UIListView -AutomationId \"GridGames\" -First}), \"ListViewGames\");\r\n        $this.PopupMenu         = [Menu]::New($this.GetChildReference({Get-UIControl -Class \"Popup\" -First}), \"PopupMenu\");\r\n        $this.TextFilter        = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextFilter\" -First}), \"TextFilter\");\r\n\r\n        $this.ButtonInstall       = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonInstall\" -First}), \"ButtonInstall\")\r\n        $this.ButtonMore          = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonMore\" -First}), \"ButtonMore\")\r\n        $this.ButtonSetupProgress = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonSetupProgress\" -First}), \"ButtonSetupProgress\")\r\n        $this.ButtonPlay          = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonPlay\" -First}), \"ButtonPlay\")\r\n        $this.HyperlinkStore      = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"HyperlinkStore\" -First}), \"HyperlinkStore\")\r\n        $this.HyperlinkForum      = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"HyperlinkForum\" -First}), \"HyperlinkForum\")\r\n        $this.HyperlinkWiki       = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"HyperlinkWiki\" -First}), \"HyperlinkWiki\")\r\n\r\n        $this.MenuMainMenu     = [Menu]::New($this.GetChildReference({Get-UIContextMenu -AutomationId \"MenuMainMenu\" -First}), \"MenuMainMenu\")\r\n        $this.MenuViewSettings = [Menu]::New($this.GetChildReference({Get-UIContextMenu -AutomationId \"MenuViewSettings\" -First}), \"MenuViewSettings\")\r\n        $this.MenuViewMode     = [Menu]::New($this.GetChildReference({Get-UIContextMenu -AutomationId \"MenuViewMode\" -First}), \"MenuViewMode\")\r\n        $this.FilterSelector   = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"FilterSelector\" -First}), \"FilterSelector\")\r\n        $this.GridGamesView    = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"GridGamesView\" -First}), \"GridGamesView\")\r\n        $this.ImagesGamesView  = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"ImagesGamesView\" -First}), \"ImagesGamesView\")\r\n        $this.ListGamesView    = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"ListGamesView\" -First}), \"ListGamesView\")\r\n        $this.SearchBoxFilter  = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"SearchBoxFilter\" -First}), \"SearchBoxFilter\")\r\n        $this.CheckFilterView  = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckFilterView\" -First}), \"CheckFilterView\")\r\n        $this.ImageLogo        = [UIObject]::New($this.GetChildReference({Get-UIImage -AutomationId \"ImageLogo\" -First}), \"ImageLogo\")\r\n        $this.ProgressControl  = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"ProgressControl\" -First}), \"ProgressControl\")\r\n        $this.TabControlView   = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"TabControlView\" -First}), \"TabControlView\")\r\n        $this.TextView         = [UIObject]::New($this.GetChildReference({Get-UITextBlock -AutomationId \"TextView\" -First}), \"TextView\")\r\n        $this.TextGroup        = [UIObject]::New($this.GetChildReference({Get-UITextBlock -AutomationId \"TextGroup\" -First}), \"TextGroup\")\r\n    }\r\n}\r\n\r\nreturn [MainWindow]::New()"
  },
  {
    "path": "tests/Mapping/MetadataLookupWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass MetadataLookupWindow : Window\r\n{\r\n    [UIObject]$ButtonOK\r\n    [UIObject]$ButtonCancel\r\n    [UIObject]$ButtonSearch\r\n    [ListBox]$ListSearch\r\n    [UIObject]$TextDownloading\r\n    [UIObject]$TextSearch\r\n\r\n    MetadataLookupWindow() : base({Get-UIWindow -ProcessName \"PlayniteUI\" | Get-UIWindow -AutomationId \"WindowMetaSearch\"}, \"MetadataLookupWindow\")\r\n    {\r\n        $this.ButtonOK         = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonOK\" -First}), \"ButtonOK\")\r\n        $this.ButtonCancel     = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonCancel\" -First}), \"ButtonCancel\")\r\n        $this.ButtonSearch     = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonSearch\" -First}), \"ButtonSearch\")\r\n        $this.ListSearch       = [ListBox]::New($this.GetChildReference({Get-UIListBox -AutomationId \"ListSearch\" -First}), \"ListSearch\")\r\n        $this.TextDownloading  = [UIObject]::New($this.GetChildReference({Get-UITextBlock -AutomationId \"TextDownloading\" -First}), \"TextDownloading\")\r\n        $this.TextSearch       = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextSearch\" -First}), \"TextSearch\")\r\n    }\r\n}\r\n\r\nreturn [MetadataLookupWindow]::New()"
  },
  {
    "path": "tests/Mapping/NotificationsWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass NotificationsWindow : Window\r\n{\r\n    [ListBox]$ListNotifications\r\n\r\n    NotificationsWindow() : base({Get-UIWindow -ProcessName \"PlayniteUI\" -AutomationId \"WindowNotifications\"}, \"NotificationsWindow\")\r\n    {\r\n        $this.ListNotifications   = [ListBox]::New($this.GetChildReference({Get-UIListBox -AutomationId \"ListNotifications\" -First}), \"ListNotifications\")\r\n    }\r\n}\r\n\r\nreturn [NotificationsWindow]::New()"
  },
  {
    "path": "tests/Mapping/OpenFileWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass OpenFileWindow : Window\r\n{\r\n    [UIObject]$ButtonOpen\r\n    [UIObject]$ButtonCancel\r\n    [UIObject]$EditFileName\r\n\r\n    OpenFileWindow() : base({Get-UIWindow -ProcessName \"PlayniteUI\" | Get-UIWindow -ControlType \"Dialog\" -Name \"Open\"}, \"OpenFileWindow\")\r\n    {\r\n        $this.ButtonOpen   = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"1\" -First}), \"ButtonOpen\")\r\n        $this.ButtonCancel = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"2\" -First}), \"ButtonCancel\")\r\n        $this.EditFileName = [UIObject]::New($this.GetChildReference({Get-UIEdit -AutomationId \"1148\" -First}), \"EditFileName\")\r\n    }\r\n}\r\n\r\nreturn [OpenFileWindow]::New()"
  },
  {
    "path": "tests/Mapping/SettingsWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass SettingsWindow : Window\r\n{\r\n    [UIObject]$ButtonBrowserDbFile\r\n    [UIObject]$ButtonGogAuth\r\n    [UIObject]$ButtonOK\r\n    [UIObject]$ButtonOriginAuth\r\n    [UIObject]$ButtonCancel\r\n    [UIObject]$CheckGogEnabled\r\n    [UIObject]$CheckGogIcons\r\n    [UIObject]$CheckOriginEnabled\r\n    [UIObject]$CheckGogRunGalaxy\r\n    [UIObject]$CheckSteamEnabled\r\n    [UIObject]$RadioLibraryOrigin\r\n    [UIObject]$RadioInstalledOrigin\r\n    [UIObject]$RadioLibrarySteam\r\n    [UIObject]$RadioInstalledSteam\r\n    [UIObject]$RadioInstalledGOG\r\n    [UIObject]$RadioLibraryGOG\r\n    [UIObject]$TextSteamAccountName\r\n    [UIObject]$TextDatabase\r\n\r\n    SettingsWindow() : base({Get-UIWindow -ProcessName \"PlayniteUI\" | Get-UIWindow -AutomationId \"WindowSettings\"}, \"SettingsWindow\")\r\n    {\r\n        $this.ButtonBrowserDbFile  = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonBrowserDbFile\" -First}), \"ButtonBrowserDbFile\")\r\n        $this.ButtonGogAuth        = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonGogAuth\" -First}), \"ButtonGogAuth\")\r\n        $this.ButtonOK             = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonOK\" -First}), \"ButtonOK\")\r\n        $this.ButtonOriginAuth     = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonOriginAuth\" -First}), \"ButtonOriginAuth\")\r\n        $this.ButtonCancel         = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"ButtonCancel\" -First}), \"ButtonCancel\")\r\n        $this.CheckGogEnabled      = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckGogEnabled\" -First}), \"CheckGogEnabled\")\r\n        $this.CheckGogIcons        = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckGogIcons\" -First}), \"CheckGogIcons\")\r\n        $this.CheckOriginEnabled   = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckOriginEnabled\" -First}), \"CheckOriginEnabled\")\r\n        $this.CheckGogRunGalaxy    = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckGogRunGalaxy\" -First}), \"CheckGogRunGalaxy\")\r\n        $this.CheckSteamEnabled    = [UIObject]::New($this.GetChildReference({Get-UICheckBox -AutomationId \"CheckSteamEnabled\" -First}), \"CheckSteamEnabled\")\r\n        $this.RadioLibraryOrigin   = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioLibraryOrigin\" -First}), \"RadioLibraryOrigin\")\r\n        $this.RadioInstalledOrigin = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioInstalledOrigin\" -First}), \"RadioInstalledOrigin\")\r\n        $this.RadioLibrarySteam    = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioLibrarySteam\" -First}), \"RadioLibrarySteam\")\r\n        $this.RadioInstalledSteam  = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioInstalledSteam\" -First}), \"RadioInstalledSteam\")\r\n        $this.RadioInstalledGOG    = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioInstalledGOG\" -First}), \"RadioInstalledGOG\")\r\n        $this.RadioLibraryGOG      = [UIObject]::New($this.GetChildReference({Get-UIRadioButton -AutomationId \"RadioLibraryGOG\" -First}), \"RadioLibraryGOG\")\r\n        $this.TextSteamAccountName = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextSteamAccountName\" -First}), \"TextSteamAccountName\")\r\n        $this.TextDatabase         = [UIObject]::New($this.GetChildReference({Get-UITextBox -AutomationId \"TextDatabase\" -First}), \"TextDatabase\")\r\n    }\r\n}\r\n\r\nreturn [SettingsWindow]::New()"
  },
  {
    "path": "tests/Mapping/SetupUninstallWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass SetupUninstallWindow : Window\r\n{\r\n    [UIObject]$ButtonYes\r\n    [UIObject]$ButtonNo\r\n    [UIObject]$ButtonClose\r\n    [UIObject]$TextStatus\r\n\r\n    SetupUninstallWindow() : base({Get-UIWindow -ProcessName \"Un_A\"}, \"SetupUninstallWindow\")\r\n    {\r\n        $this.ButtonYes = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"6\" -First}), \"ButtonYes\")\r\n        $this.ButtonNo  = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"7\" -First}), \"ButtonNo\")\r\n        $this.ButtonClose  = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"1\" -First}), \"ButtonClose\")\r\n        $this.TextStatus  = [UIObject]::New($this.GetChildReference({Get-UIControl -AutomationId \"1006\" -First}), \"TextStatus\")\r\n    }\r\n}\r\n\r\nreturn [SetupUninstallWindow]::New()"
  },
  {
    "path": "tests/Mapping/SetupWindow.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass SetupWindow : Window\r\n{\r\n    [UIObject]$ButtonInstall\r\n    [UIObject]$ButtonCancel\r\n    [UIObject]$ButtonBrowse\r\n    [UIObject]$TextPath\r\n    [UIObject]$CheckRunAfterInstall\r\n    [Window]$WindowUninstallAsk\r\n\r\n    SetupWindow() : base({Get-UIWindow -Name \"Playnite * Setup *\"}, \"SetupWindow\")\r\n    {\r\n        $this.ButtonInstall         = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"1\" -First}), \"ButtonInstall\")\r\n        $this.ButtonCancel          = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"2\" -First}), \"ButtonCancel\")\r\n        $this.ButtonBrowse          = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"1001\" -First}), \"ButtonBrowse\")\r\n        $this.TextPath              = [UIObject]::New($this.GetChildReference({Get-UIEdit -AutomationId \"1019\" -First}), \"TextPath\")\r\n        $this.CheckRunAfterInstall  = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"1203\" -First}), \"CheckRunAfterInstall\")\r\n    }\r\n}\r\n\r\nreturn [SetupWindow]::New()"
  },
  {
    "path": "tests/Mapping/SystemDialog.ps1",
    "content": "using module PSNativeAutomation\r\n\r\nclass SystemDialog : Window\r\n{\r\n    [UIObject]$ButtonYes\r\n    [UIObject]$ButtonNo\r\n    \r\n    SystemDialog() : base({Get-UIWindow -ProcessName \"PlayniteUI\" | Get-UIControl -ControlType \"Dialog\" -First}, \"SystemDialog\")\r\n    {\r\n        $this.ButtonYes = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"6\" -First}), \"ButtonYes\")\r\n        $this.ButtonNo  = [UIObject]::New($this.GetChildReference({Get-UIButton -AutomationId \"7\" -First}), \"ButtonNo\")\r\n    }\r\n}\r\n\r\nreturn [SystemDialog]::New()"
  },
  {
    "path": "tests/PlayniteCommon.ps1",
    "content": "$global:PlayniteVariables = @{\r\n    DefaultAppDir = Join-Path $env:LOCALAPPDATA \"Playnite\"\r\n    StartMenuDir = Join-Path $env:APPDATA \"\\Microsoft\\Windows\\Start Menu\\Programs\\Playnite\\\"\r\n    DesktopIconPath = Join-Path $env:ProgramData \"Desktop\\Playnite.lnk\"\r\n    UninstallRegKey32 = \"Registry::HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Playnite_is1\"\r\n    UninstallRegKey64 = \"Registry::HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Playnite_is1\"\r\n    UiProcessName = \"PlayniteUI\"\r\n    UiExecutableName = \"PlayniteUI.exe\"\r\n    DefaultUiExecutablePath = Join-Path $env:LOCALAPPDATA \"Playnite\\PlayniteUI.exe\"\r\n    DefaultUinstallerExecutablePath = Join-Path $env:LOCALAPPDATA \"Playnite\\unins000.exe\"\r\n    AppMutex = \"PlayniteInstaceMutex\"\r\n}\r\n\r\nfunction global:Stop-PlayniteProcesses()\r\n{\r\n    if (Get-Process -Name $PlayniteVariables.UiProcessName -EA 0)\r\n    {\r\n        Stop-Process -Name $PlayniteVariables.UiProcessName -Force\r\n        WaitFor { (Get-Process -Name $PlayniteVariables.UiProcessName -EA 0) -eq $null }\r\n    }\r\n}"
  },
  {
    "path": "tests/RunTests.ps1",
    "content": "param(\r\n    [string]$TestName\r\n)\r\n\r\n$ErrorActionPreference = \"Stop\"\r\n\r\nImport-Module Pester\r\nImport-Module PSNativeAutomation\r\nImport-Module powershell-yaml\r\nInvoke-Expression \".\\TestExtensions.ps1\"\r\nInvoke-Expression \".\\PlayniteCommon.ps1\"\r\n\r\nif ($TestName)\r\n{\r\n    Invoke-Pester -TestName $TestName\r\n}\r\nelse\r\n{\r\n    @(\r\n        \"Initial Startup\",\r\n        \"First Time Wizard - run through - installed only\",\r\n        \"Game import startup\",\r\n        \"Edit Window - Basic Test\",\r\n        \"Edit Window - Categories\",\r\n        \"Installed Games Window - Game import test\",\r\n        \"Custom Games - Game Creation\"\r\n    ) | ForEach-Object {\r\n        Invoke-Pester -TestName $_\r\n    }\r\n}"
  },
  {
    "path": "tests/Setup/Setup.Tests.ps1",
    "content": "function CleanSetupFiles()\r\n{\r\n    Remove-ItemSafe $PlayniteVariables.DefaultAppDir\r\n    Remove-ItemSafe $PlayniteVariables.StartMenuDir\r\n    Remove-ItemSafe $PlayniteVariables.DesktopIconPath\r\n    Remove-ItemSafe $PlayniteVariables.UninstallRegKey32\r\n    Remove-ItemSafe $PlayniteVariables.UninstallRegKey64   \r\n}\r\n\r\nDescribe \"Setup - Parameters test\" {\r\n    BeforeEach {\r\n        Stop-PlayniteProcesses\r\n        CleanSetupFiles\r\n    }\r\n\r\n    It \"Standard silent\" {\r\n        $config = Get-TestProperties\r\n        Start-ProcessAndWait $config.InstallerPath \"/SILENT\"\r\n        $PlayniteVariables.DefaultAppDir | Should Exist\r\n        $PlayniteVariables.DefaultUiExecutablePath | Should Exist\r\n        $PlayniteVariables.StartMenuDir | Should Exist\r\n        $PlayniteVariables.DesktopIconPath | Should Exist\r\n        $PlayniteVariables.DefaultUinstallerExecutablePath | Should Exist\r\n        if ($Is64BitOS)\r\n        {\r\n            $PlayniteVariables.UninstallRegKey64 | Should Exist\r\n        } \r\n        else\r\n        {\r\n            $PlayniteVariables.UninstallRegKey32 | Should Exist\r\n        }\r\n    }\r\n\r\n    It \"Portable install\" {\r\n        $config = Get-TestProperties\r\n        Start-ProcessAndWait $config.InstallerPath \"/SILENT /PORTABLE\"\r\n        $PlayniteVariables.DefaultAppDir | Should Exist\r\n        $PlayniteVariables.DefaultUiExecutablePath | Should Exist\r\n        $PlayniteVariables.StartMenuDir | Should Not Exist\r\n        $PlayniteVariables.DesktopIconPath | Should Not Exist\r\n        $PlayniteVariables.DefaultUinstallerExecutablePath | Should Not Exist\r\n        $PlayniteVariables.UninstallRegKey64 | Should Not Exist\r\n        $PlayniteVariables.UninstallRegKey32 | Should Not Exist\r\n    }\r\n\r\n    It \"Update install\" {\r\n        $config = Get-TestProperties\r\n        Start-ProcessAndWait $config.InstallerPath \"/SILENT /UPDATE\"\r\n        $PlayniteVariables.DefaultAppDir | Should Exist\r\n        $PlayniteVariables.DefaultUiExecutablePath | Should Exist\r\n        $PlayniteVariables.StartMenuDir | Should Not Exist\r\n        $PlayniteVariables.DesktopIconPath | Should Not Exist\r\n        $PlayniteVariables.DefaultUinstallerExecutablePath | Should Exist\r\n        if ($Is64BitOS)\r\n        {\r\n            $PlayniteVariables.UninstallRegKey64 | Should Exist\r\n        } \r\n        else\r\n        {\r\n            $PlayniteVariables.UninstallRegKey32 | Should Exist\r\n        }\r\n    } \r\n\r\n    It \"Update portable install\" {\r\n        $config = Get-TestProperties\r\n        Start-ProcessAndWait $config.InstallerPath \"/SILENT /PORTABLE /UPDATE\"\r\n        $PlayniteVariables.DefaultAppDir | Should Exist\r\n        $PlayniteVariables.DefaultUiExecutablePath | Should Exist\r\n        $PlayniteVariables.StartMenuDir | Should Not Exist\r\n        $PlayniteVariables.DesktopIconPath | Should Not Exist\r\n        $PlayniteVariables.DefaultUinstallerExecutablePath | Should Not Exist\r\n        $PlayniteVariables.UninstallRegKey64 | Should Not Exist\r\n        $PlayniteVariables.UninstallRegKey32 | Should Not Exist\r\n    } \r\n}\r\n\r\nDescribe \"Update install\" {\r\n    BeforeEach {\r\n        Stop-PlayniteProcesses\r\n        CleanSetupFiles\r\n    }\r\n\r\n    It \"Update install waits for Playnite exit first\" {\r\n        $mutex = Start-MutexProcess $PlayniteVariables.AppMutex\r\n\r\n        try\r\n        {\r\n            $config = Get-TestProperties\r\n            Start-Process $config.InstallerPath \"/SILENT /UPDATE\"\r\n            Sleep -s 5\r\n            $PlayniteVariables.DefaultAppDir | Should Not Exist            \r\n            Stop-Process $mutex \r\n            Sleep -s 2\r\n            $proc = Get-Process -Name ([System.IO.Path]::GetFileNameWithoutExtension($config.InstallerPath))\r\n            $proc.WaitForExit()\r\n            $PlayniteVariables.DefaultUiExecutablePath | Should Exist\r\n        }\r\n        finally\r\n        {\r\n            Stop-Process $mutex   \r\n        }\r\n    }\r\n}\r\n\r\n<# Describe \"Silent install\" {\r\n    It \"Setup installs files and shortcuts\" {\r\n        $path = \"C:\\Program Files (x86)\\Playnite\"\r\n        $data = Get-TestProperties\r\n        $setupProc = Start-Process $data.package \"/ProgressOnly 1 /D=$path\" -PassThru\r\n        $setupProc.WaitForExit()\r\n\r\n        $path | Should Exist\r\n        Join-Path $path \"PlayniteUI.exe\" | Should Exist\r\n        (Get-ChildItem $path).Count | Should BeGreaterThan 1\r\n    }\r\n\r\n    It \"Playnite is started after installation\" {\r\n        Get-Process -Name \"PlayniteUI\" -EA 0 | Should Not BeNullOrEmpty\r\n        WaitFor { Get-UIWindow -ProcessName \"PlayniteUI\" } 10000\r\n    }\r\n\r\n    It \"Shortucts start playnite\" {\r\n        if ($proc = Get-Process -Name \"PlayniteUI.exe\" -EA 0)\r\n        {\r\n            $proc | Stop-Process -Force\r\n            Wait-Process -Id $proc.Id\r\n        }\r\n\r\n        $dektop = [System.Environment]::ExpandEnvironmentVariables(\"%systemdrive%\\users\\%username%\\Desktop\")\r\n        $path = Join-Path $dektop \"Playnite.lnk\"\r\n        $path | Should Exist\r\n        Start-Process $path\r\n\r\n        Get-Process -Name \"PlayniteUI\" -EA 0 | Should Not BeNullOrEmpty\r\n        Stop-Process -Name \"PlayniteUI\"\r\n    }\r\n}\r\n\r\nDescribe \"Uninstall\" {\r\n    It \"Uninstall removes all files\" {\r\n        $window = { Get-UIDesktop | Get-UIControl -ControlType \"Dialog\" -Name \"Playnite*Uninstall\" }\r\n        $testData = Get-TestProperties\r\n\r\n        $dektop = [System.Environment]::ExpandEnvironmentVariables(\"%systemdrive%\\users\\%username%\\Desktop\")\r\n        $startMenu = [System.Environment]::ExpandEnvironmentVariables(\"c:\\Users\\crow\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Playnite\\\")        \r\n        Start-Process (Join-Path $testData.InstallPath \"uninstall.exe\")\r\n        WaitFor { & $window } 5000\r\n        & $window | Get-UIButton -Name \"Yes\" | Invoke-UIClick\r\n\r\n        # Windows completely reloads so we need to get new one later\r\n        WaitFor { & $window | Get-UIControl -AutoId \"1006\" -Name \"Completed\"  } 30000\r\n        & $window | Get-UIButton -AutoId \"1\" | Invoke-UIClick\r\n\r\n        $testData.InstallPath | Should Not Exist        \r\n        Join-Path $dektop \"Playnite.lnk\" | Should Not Exist\r\n        $startMenu | Should Not Exist\r\n    }\r\n} #>\r\n\r\n\r\n"
  },
  {
    "path": "tests/TestConfig.Template.yaml",
    "content": "InstallerPath: "
  },
  {
    "path": "tests/TestExtensions.ps1",
    "content": "$global:Is64BitOS = [System.Environment]::Is64BitOperatingSystem\r\n$global:TestVariables = @{\r\n    MutexTesterPath = Join-Path $PWD \"_Tools\\MutexTester.exe\"\r\n}\r\n\r\nfunction global:Get-TestProperties()\r\n{\r\n    param(\r\n        $path = \"TestConfig.yaml\"\r\n    )\r\n\r\n    if (-not (Test-Path $path))\r\n    {\r\n        throw \"Test config not found.\"\r\n    }\r\n\r\n    return ConvertFrom-Yaml (Get-Content $path -Raw)\r\n}\r\n\r\nfunction global:Get-NewTempFolder()\r\n{\r\n    return Join-Path $env:TEMP ([Guid]::NewGuid())\r\n}\r\n\r\nfunction global:WaitFor\r\n{\r\n    param\r\n    (\r\n        [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]\r\n        [ScriptBlock]$Condition,\r\n        [int]$Timeout = 10000,\r\n        [int]$CheckPeriod = 1000    \r\n    )\r\n\r\n    $watch = New-Object \"System.Diagnostics.Stopwatch\"\r\n    $watch.Start()\r\n\r\n    $tempErrPref = $ErrorActionPreference\r\n    $ErrorActionPreference = \"SilentlyContinue\"\r\n\r\n    try\r\n    {\r\n        while ($watch.ElapsedMilliseconds -lt $Timeout)\r\n        {\r\n            $result = $null\r\n\r\n            try\r\n            {\r\n                $result = & $Condition\r\n            }\r\n            catch\r\n            {\r\n                $result = $false\r\n            }\r\n\r\n            if (-not $result)\r\n            {\r\n                Start-Sleep -Milliseconds $CheckPeriod\r\n            }\r\n            else\r\n            {\r\n                $result = $true\r\n                break\r\n            }\r\n        }\r\n    }\r\n    finally\r\n    {\r\n        $ErrorActionPreference = $tempErrPref\r\n        $watch.Stop()\r\n    }\r\n\r\n    if (-not $result)\r\n    {\r\n        throw \"Waiting was not successful: $Condition\"\r\n    }\r\n}\r\n\r\nfunction global:Invoke-OnLocation()\r\n{\r\n    param\r\n    (\r\n        [Parameter(Mandatory=$true)]\r\n        [string]$Path,\r\n        [Parameter(Mandatory=$true)]\r\n        [ScriptBlock]$Script  \r\n    )\r\n    \r\n    Push-Location\r\n\r\n    try\r\n    {\r\n        Set-Location $Path\r\n        [System.IO.Directory]::SetCurrentDirectory((Get-Location))\r\n        & $Script\r\n    }\r\n    finally\r\n    {\r\n        Pop-Location\r\n        [System.IO.Directory]::SetCurrentDirectory((Get-Location))\r\n    }\r\n}\r\n\r\nfunction global:Remove-FolderClean()\r\n{\r\n    param\r\n    (\r\n        [Parameter(Mandatory=$true)]\r\n        [string]$Path\r\n    )\r\n\r\n    if (Test-Path $Path)\r\n    {\r\n        Remove-Item $Path -Recurse\r\n    }\r\n\r\n    New-Item $Path -ItemType Directory | Out-Null\r\n}\r\n\r\nfunction global:Remove-ItemSafe()\r\n{\r\n    param\r\n    (\r\n        [Parameter(Mandatory=$true)]\r\n        [string]$Path\r\n    )\r\n\r\n    if (Test-Path $Path)\r\n    {\r\n        Remove-Item $Path -Recurse\r\n    }\r\n}\r\n\r\nfunction global:Start-ProcessAndWait()\r\n{\r\n    param(\r\n        [string]$Path,\r\n        [string]$Arguments,\r\n        [string]$WorkingDir\r\n    )\r\n\r\n    if ($WorkingDir)\r\n    {\r\n        $proc = Start-Process $Path $Arguments -PassThru -NoNewWindow -WorkingDirectory $WorkingDir\r\n    }\r\n    else\r\n    { \r\n        $proc = Start-Process $Path $Arguments -PassThru -NoNewWindow\r\n    }\r\n\r\n    $handle = $proc.Handle # cache proc.Handle http://stackoverflow.com/a/23797762/1479211\r\n    $proc.WaitForExit()\r\n    return $proc.ExitCode\r\n}\r\n\r\nfunction global:Start-MutexProcess()\r\n{\r\n    param(\r\n        [Parameter(Mandatory=$true)]\r\n        [string]$Name\r\n    )\r\n\r\n    return Start-Process $TestVariables.MutexTesterPath $Name -NoNewWindow -PassThru\r\n}"
  },
  {
    "path": "tests/UI/CustomGames.Tests.ps1",
    "content": "function CleanWindows()\r\n{\r\n    if ($windowGameEdit.Exists())\r\n    {\r\n        $windowGameEdit.Close()\r\n    }\r\n}\r\n\r\nDescribe \"Custom Games - Game Creation\" {\r\n    BeforeAll {\r\n        $windowMain = & (Join-Path $PSScriptRoot \"..\\Mapping\\MainWindow.ps1\")\r\n        $windowGameEdit = & (Join-Path $PSScriptRoot \"..\\Mapping\\GameEditWindow.ps1\")\r\n        $dialogSystem = & (Join-Path $PSScriptRoot \"..\\Mapping\\SystemDialog.ps1\")\r\n        \r\n        $gameName = \"AA Test Game\"\r\n        $gamePath = \"c:\\Program Files\\Windows NT\\Accessories\\wordpad.exe\"\r\n        $windowMain.Focus()\r\n    }\r\n\r\n    It \"Custom game can be added\" {\r\n        $windowMain.ImageLogo.Click()\r\n        $windowMain.PopupMenu.InvokeItem(\"Add Game...\")\r\n        $windowGameEdit.WaitForObject(2000)\r\n\r\n        # Fill fields\r\n        $windowGameEdit.TextName.SetValue($gameName)\r\n\r\n        # Add Play Action\r\n        $windowGameEdit.TabControlMain.SelectItem(\"Actions\")\r\n        $windowGameEdit.ButtonAddPlay.Invoke()\r\n        $windowGameEdit.TaskPlay.TextPath.SetValue($gamePath)\r\n\r\n        $windowGameEdit.ButtonOK.Invoke()\r\n    }\r\n\r\n    It \"Custom game can be started\" {\r\n        $windowMain.ListBoxGames.GetItemNames() -contains $gameName | Should Be $true\r\n        $windowMain.ListBoxGames.GetItem($gameName).ClickDouble()\r\n        Start-Sleep -Seconds 1\r\n        Get-Process -Name \"wordpad\" -EA 0 | Should Not Be $null        \r\n        Get-Process -Name \"wordpad\" -EA 0 | Stop-Process\r\n    }\r\n\r\n    It \"Custom game can be removed\" {\r\n        $windowMain.ListBoxGames.SelectItem($gameName)\r\n        $windowMain.ButtonMore.Invoke()\r\n        $windowMain.PopupMenu.InvokeItem(\"Remove\")\r\n        $dialogSystem.WaitForObject(2000)\r\n        $dialogSystem.ButtonYes.Invoke()\r\n        $windowMain.ListBoxGames.GetItemNames() -contains $gameName | Should Be $false\r\n    }\r\n\r\n    AfterAll {\r\n        CleanWindows\r\n    }\r\n}"
  },
  {
    "path": "tests/UI/FirstTimeWizard.Tests.ps1",
    "content": "Describe \"First Time Wizard - run through - installed only\" {\r\n    BeforeAll {\r\n        $global:WizardWindow = & (Join-Path $PSScriptRoot \"..\\Mapping\\FirstTimeWizardWindow.ps1\")\r\n        $global:InstalledGamesWindow = & (Join-Path $PSScriptRoot \"..\\Mapping\\InstalledGamesWindow.ps1\")\r\n    }\r\n\r\n    It \"Wizard is opened\" {\r\n        $WizardWindow.WaitForObject(10000)\r\n    }\r\n\r\n    It \"Database location is presented\" {\r\n        $WizardWindow.ButtonNext.Invoke()\r\n        $WizardWindow.RadioDbDefault.GetSelectionState() | Should Be $true\r\n        $WizardWindow.RadioDbCustom.GetSelectionState() | Should Be $false\r\n        $WizardWindow.TextDbFile.GetEnabledState() | Should Be $false\r\n        $WizardWindow.ButtonBrowseDbFile.GetEnabledState() | Should Be $false       \r\n        $WizardWindow.RadioDbCustom.Select()\r\n        $WizardWindow.RadioDbDefault.GetSelectionState() | Should Be $false\r\n        $WizardWindow.RadioDbCustom.GetSelectionState() | Should Be $true\r\n        $WizardWindow.TextDbFile.GetEnabledState() | Should Be $true\r\n        $WizardWindow.ButtonBrowseDbFile.GetEnabledState() | Should Be $true\r\n        $WizardWindow.RadioDbDefault.Select()\r\n    }\r\n\r\n    It \"All integrations are presented and enabled\" {\r\n        $WizardWindow.ButtonNext.Invoke()\r\n        $WizardWindow.CheckEnableGOG.GetToggleState() | Should Be \"On\"\r\n        $WizardWindow.CheckEnableOrigin.GetToggleState() | Should Be \"On\"\r\n        $WizardWindow.CheckEnableSteam.GetToggleState() | Should Be \"On\"\r\n    }\r\n\r\n    It \"Steam import page\" {\r\n        $WizardWindow.ButtonNext.Invoke()\r\n        $WizardWindow.RadioInstalledSteam.GetSelectionState() | Should Be $true\r\n        $WizardWindow.TextSteamAccount.GetEnabledState() | Should Be $false\r\n        $WizardWindow.RadioLibrarySteam.Select()\r\n        $WizardWindow.TextSteamAccount.GetEnabledState() | Should Be $true\r\n        $WizardWindow.RadioInstalledSteam.Select()\r\n    }\r\n\r\n    It \"GOG import page\" {\r\n        $WizardWindow.ButtonNext.Invoke()\r\n        $WizardWindow.RadioInstalledGOG.GetSelectionState() | Should Be $true\r\n        $WizardWindow.ButtonGogAuthenticate.GetEnabledState() | Should Be $false\r\n        $WizardWindow.RadioLibraryGOG.Select()\r\n        $WizardWindow.ButtonGogAuthenticate.GetEnabledState() | Should Be $true\r\n        $WizardWindow.RadioInstalledGOG.Select()\r\n    }\r\n\r\n    It \"Origin import page\" {\r\n        $WizardWindow.ButtonNext.Invoke()\r\n        $WizardWindow.RadioInstalledOrigin.GetSelectionState() | Should Be $true\r\n        $WizardWindow.ButtonOriginAuthenticate.GetEnabledState() | Should Be $false\r\n        $WizardWindow.RadioLibraryOrigin.Select()\r\n        $WizardWindow.ButtonOriginAuthenticate.GetEnabledState() | Should Be $true        \r\n        $WizardWindow.RadioInstalledOrigin.Select()\r\n    }\r\n\r\n    It \"Custom import page\" {\r\n        $WizardWindow.ButtonNext.Invoke()\r\n        $WizardWindow.ButtonImportGames.GetEnabledState() | Should Be $true\r\n        $WizardWindow.ButtonImportGames.Invoke()        \r\n        $InstalledGamesWindow.WaitForObject(5000)\r\n        $InstalledGamesWindow.Close()\r\n    }\r\n\r\n    It \"Finish page\" {\r\n        $WizardWindow.ButtonNext.Invoke()\r\n        $WizardWindow.ButtonFinish.Invoke()\r\n        Start-Sleep -Seconds 2\r\n        $WizardWindow.Exists() | Should Be $false\r\n    }\r\n}"
  },
  {
    "path": "tests/UI/GameEditWindow.Tests.ps1",
    "content": "function CleanWindows()\r\n{\r\n    if ($windowOpenFile -and $windowOpenFile.Exists())\r\n    {\r\n        $windowOpenFile.Close()\r\n    }\r\n\r\n    if ($windowGameEdit -and $windowGameEdit.Exists())\r\n    {\r\n        $windowGameEdit.Close()\r\n    }\r\n}\r\n\r\nDescribe \"Edit Window - Basic Test\" {\r\n    BeforeAll {\r\n        $windowMain = & (Join-Path $PSScriptRoot \"..\\Mapping\\MainWindow.ps1\")\r\n        $windowGameEdit = & (Join-Path $PSScriptRoot \"..\\Mapping\\GameEditWindow.ps1\")\r\n        $windowOpenFile = & (Join-Path $PSScriptRoot \"..\\Mapping\\OpenFileWindow.ps1\")     \r\n\r\n        $editData = @{\r\n            \"Name\" = \"AA New Name\";\r\n            \"Genres\" = \"Genre1, Genre2\";\r\n            \"ReleaseDate\" = [datetime]::Now.ToShortDateString();\r\n            \"Developers\" = \"Developer1\";\r\n            \"Publishers\" = \"Publisher\";\r\n            \"Categories\" = \"Cat1, Cat2, Cat3\";\r\n            \"StoreURL\" = \"New store url\";\r\n            \"WikiURL\" = \"New wiki url\";\r\n            \"ForumsURL\" = \"New forum url\";\r\n            \"Description\" = \"New description\";\r\n            \"Icon\" = Join-Path $PSScriptRoot \"..\\TestFiles\\TestIcon.png\";\r\n            \"Image\" = Join-Path $PSScriptRoot \"..\\TestFiles\\TestCover.jpg\";\r\n        }\r\n\r\n        $windowMain.Focus()\r\n    }\r\n\r\n    BeforeEach {\r\n        CleanWindows\r\n    }\r\n\r\n    It \"Edit window can be opened\" {\r\n        $windowMain.ListBoxGames.GetItems()[(Get-Random -Minimum 0 -Maximum 5)].ClickRight()\r\n        $windowMain.PopupMenu.InvokeItem(\"Edit...\")\r\n        $windowGameEdit.WaitForObject(5000)\r\n        $windowGameEdit.Close()\r\n    }\r\n\r\n    It \"Cancel button doesn't save changes\" {\r\n        $itemIndex = Get-Random -Minimum 0 -Maximum 5\r\n        $windowMain.ListBoxGames.GetItems()[$itemIndex].ClickRight()\r\n        $windowMain.PopupMenu.InvokeItem(\"Edit...\")\r\n        $windowGameEdit.WaitForObject(5000)\r\n\r\n        # basic fileds\r\n        $windowGameEdit.TextName.SetValue($editData.Name)\r\n        $windowGameEdit.TextGenres.SetValue($editData.Genres)\r\n        $windowGameEdit.TextReleaseDate.SetValue($editData.ReleaseDate)\r\n        $windowGameEdit.TextDeveloper.SetValue($editData.Developers)\r\n        $windowGameEdit.TextPublisher.SetValue($editData.Publishers)\r\n        $windowGameEdit.TextCategories.SetValue($editData.Categories)\r\n        $windowGameEdit.TextStore.SetValue($editData.StoreURL)\r\n        $windowGameEdit.TextWiki.SetValue($editData.WikiURL)\r\n        $windowGameEdit.TextForums.SetValue($editData.ForumsURL)\r\n        $windowGameEdit.TextDescription.SetValue($editData.Description)\r\n        # images\r\n        $windowGameEdit.ButtonSelectIcon.Invoke()\r\n        $windowOpenFile.EditFileName.SetValue($editData.Icon)\r\n        $windowOpenFile.ButtonOpen.Click()\r\n        $windowGameEdit.ButtonSelectImage.Invoke()\r\n        $windowOpenFile.EditFileName.SetValue($editData.Image)\r\n        $windowOpenFile.ButtonOpen.Click()\r\n        # tasks\r\n        $windowGameEdit.TabControlMain.SelectItem(\"Actions\")\r\n        $windowGameEdit.TaskPlay.TextName.SetValue(\"TestName\")\r\n        $windowGameEdit.TaskPlay.TextPath.SetValue(\"TestPath\")\r\n\r\n        $windowGameEdit.ButtonCancel.Invoke()        \r\n        $windowMain.ListBoxGames.GetItems()[$itemIndex].ClickRight()\r\n        $windowMain.PopupMenu.InvokeItem(\"Edit...\")\r\n\r\n        $windowGameEdit.TextName.GetValue() | Should Not Be $editData.Name\r\n        $windowGameEdit.TextGenres.GetValue() | Should Not Be $editData.Genres\r\n        $windowGameEdit.TextReleaseDate.GetValue() | Should Not Be $editData.ReleaseDate\r\n        $windowGameEdit.TextDeveloper.GetValue() | Should Not Be $editData.Developers\r\n        $windowGameEdit.TextPublisher.GetValue() | Should Not Be $editData.Publishers\r\n        $windowGameEdit.TextCategories.GetValue() | Should Not Be $editData.Categories\r\n        $windowGameEdit.TextStore.GetValue() | Should Not Be $editData.StoreURL\r\n        $windowGameEdit.TextWiki.GetValue() | Should Not Be $editData.WikiURL\r\n        $windowGameEdit.TextForums.GetValue() | Should Not Be $editData.ForumsURL\r\n        $windowGameEdit.TextDescription.GetValue() | Should Not Be $editData.Description\r\n        $windowGameEdit.ImageIcon.GetObject().Current.HelpText | Should Not BeLike \"images/custom*\"\r\n        $windowGameEdit.ImageImage.GetObject().Current.HelpText | Should Not BeLike \"images/custom*\"\r\n        $windowGameEdit.TabControlMain.SelectItem(\"Actions\")\r\n        $windowGameEdit.TaskPlay.TextName.GetValue() | Should Not Be \"TestName\"\r\n        $windowGameEdit.TaskPlay.TextPath.GetValue() | Should Not Be \"TestPath\"\r\n\r\n        $windowGameEdit.Close()\r\n    }\r\n\r\n    It \"OK button saves changes\" {\r\n        $itemIndex = Get-Random -Minimum 0 -Maximum 5\r\n        $windowMain.ListBoxGames.GetItems()[$itemIndex].Select()\r\n        $windowMain.ButtonMore.Invoke()\r\n        $windowMain.PopupMenu.InvokeItem(\"Edit...\")\r\n        $windowGameEdit.WaitForObject(5000)\r\n\r\n        # basic fields\r\n        $windowGameEdit.TextName.SetValue($editData.Name)\r\n        $windowGameEdit.TextGenres.SetValue($editData.Genres)\r\n        $windowGameEdit.TextReleaseDate.SetValue($editData.ReleaseDate)\r\n        $windowGameEdit.TextDeveloper.SetValue($editData.Developers)\r\n        $windowGameEdit.TextPublisher.SetValue($editData.Publishers)\r\n        $windowGameEdit.TextCategories.SetValue($editData.Categories)\r\n        $windowGameEdit.TextStore.SetValue($editData.StoreURL)\r\n        $windowGameEdit.TextWiki.SetValue($editData.WikiURL)\r\n        $windowGameEdit.TextForums.SetValue($editData.ForumsURL)\r\n        $windowGameEdit.TextDescription.SetValue($editData.Description)\r\n        # images\r\n        $windowGameEdit.ButtonSelectIcon.Invoke()\r\n        $windowOpenFile.EditFileName.SetValue($editData.Icon)\r\n        $windowOpenFile.ButtonOpen.Click()\r\n        $windowGameEdit.ButtonSelectImage.Invoke()\r\n        $windowOpenFile.EditFileName.SetValue($editData.Image)\r\n        $windowOpenFile.ButtonOpen.Click()\r\n        # tasks\r\n        $windowGameEdit.TabControlMain.SelectItem(\"Actions\")\r\n        $windowGameEdit.TaskPlay.TextName.SetValue(\"TestName\")\r\n        $windowGameEdit.TaskPlay.TextPath.SetValue(\"TestPath\")\r\n\r\n        $windowGameEdit.ButtonOK.Invoke()        \r\n        $windowMain.ListBoxGames.GetItems()[0].Select()\r\n        $windowMain.ButtonMore.Invoke()\r\n        $windowMain.PopupMenu.InvokeItem(\"Edit...\")\r\n\r\n        $windowGameEdit.TextName.GetValue() | Should Be $editData.Name\r\n        $windowGameEdit.TextGenres.GetValue() | Should Be $editData.Genres\r\n        $windowGameEdit.TextReleaseDate.GetValue() | Should Be $editData.ReleaseDate\r\n        $windowGameEdit.TextDeveloper.GetValue() | Should Be $editData.Developers\r\n        $windowGameEdit.TextPublisher.GetValue() | Should Be $editData.Publishers\r\n        $windowGameEdit.TextCategories.GetValue() | Should Be $editData.Categories\r\n        $windowGameEdit.TextStore.GetValue() | Should Be $editData.StoreURL\r\n        $windowGameEdit.TextWiki.GetValue() | Should Be $editData.WikiURL\r\n        $windowGameEdit.TextForums.GetValue() | Should Be $editData.ForumsURL\r\n        $windowGameEdit.TextDescription.GetValue() | Should Be $editData.Description\r\n        $windowGameEdit.ImageIcon.GetObject().Current.HelpText | Should BeLike \"images/custom*\"\r\n        $windowGameEdit.ImageImage.GetObject().Current.HelpText | Should BeLike \"images/custom*\"\r\n        $windowGameEdit.TabControlMain.SelectItem(\"Actions\")\r\n        $windowGameEdit.TaskPlay.TextName.GetValue() | Should Be \"TestName\"\r\n        $windowGameEdit.TaskPlay.TextPath.GetValue() | Should Be \"TestPath\"\r\n\r\n        $windowGameEdit.Close()\r\n    }\r\n\r\n    AfterAll {\r\n        CleanWindows\r\n    }\r\n}\r\n\r\nDescribe \"Edit Window - Bulk editing\" {\r\n\r\n}\r\n\r\nDescribe \"Edit Window - Categories\" {\r\n    BeforeAll {\r\n        $windowMain = & (Join-Path $PSScriptRoot \"..\\Mapping\\MainWindow.ps1\")\r\n        $windowGameEdit = & (Join-Path $PSScriptRoot \"..\\Mapping\\GameEditWindow.ps1\")\r\n        $windowCategoryConfig = & (Join-Path $PSScriptRoot \"..\\Mapping\\CategoryConfigWindow.ps1\")      \r\n        $windowMain.Focus()  \r\n    }\r\n\r\n    BeforeEach {\r\n        CleanWindows\r\n    }\r\n\r\n    It \"Cancel doesn't change category\" { \r\n        $itemIndex = Get-Random -Minimum 0 -Maximum 5\r\n        $windowMain.ListBoxGames.GetItems()[$itemIndex].ClickRight()\r\n        $windowMain.PopupMenu.InvokeItem(\"Edit...\")\r\n        $windowGameEdit.WaitForObject(5000)\r\n        \r\n        $currentCat = $windowGameEdit.TextCategories.GetValue()\r\n        $windowGameEdit.ButtonPickCat.Invoke()\r\n        $windowCategoryConfig.WaitForObject(2000)\r\n        $windowCategoryConfig.TextNewCat.SetValue(\"NewCat1\")\r\n        $windowCategoryConfig.ButtonAddCat.Invoke()\r\n        $windowCategoryConfig.ButtonCancel.Invoke()\r\n        $windowGameEdit.TextCategories.GetValue() | Should Be $currentCat\r\n\r\n        $windowGameEdit.Close()\r\n    }\r\n\r\n    It \"OK changes category\" {\r\n        $itemIndex = Get-Random -Minimum 0 -Maximum 5\r\n        $windowMain.ListBoxGames.GetItems()[$itemIndex].ClickRight()\r\n        $windowMain.PopupMenu.InvokeItem(\"Edit...\")\r\n        $windowGameEdit.WaitForObject(5000)\r\n        \r\n        $windowGameEdit.ButtonPickCat.Invoke()\r\n        $windowCategoryConfig.WaitForObject(2000)\r\n        $windowCategoryConfig.TextNewCat.SetValue(\"NewCat1\")\r\n        $windowCategoryConfig.ButtonAddCat.Invoke()\r\n        $windowCategoryConfig.ButtonOK.Invoke()\r\n        $windowGameEdit.TextCategories.GetValue() | Should BeLike \"*NewCat1*\"\r\n\r\n        $windowGameEdit.Close()\r\n    }\r\n\r\n    AfterAll {\r\n        CleanWindows\r\n    }\r\n}\r\n\r\nDescribe \"Edit Window - Icon from EXE\" {\r\n\r\n    AfterAll {\r\n        CleanWindows\r\n    }\r\n}\r\n\r\nDescribe \"Edit Window - Metadata Download\" {\r\n\r\n    AfterAll {\r\n        CleanWindows\r\n    }\r\n}\r\n\r\nDescribe \"Edit Window - Tasks\" {\r\n\r\n    AfterAll {\r\n        CleanWindows\r\n    }\r\n}"
  },
  {
    "path": "tests/UI/InstalledGamesImport.Tests.ps1",
    "content": "function CleanWindows()\r\n{\r\n    Get-Process -Name \"notepad\" -EA 0 | Stop-Process\r\n\r\n    if ($windowOpenFile.Exists())\r\n    {\r\n        $windowOpenFile.Close()\r\n    }\r\n\r\n    if ($windowInstalled.Exists())\r\n    {\r\n        $windowInstalled.Close()\r\n    }\r\n}\r\n\r\nDescribe \"Installed Games Window - Game import test\" {\r\n    BeforeAll {\r\n        $windowMain = & (Join-Path $PSScriptRoot \"..\\Mapping\\MainWindow.ps1\")\r\n        $windowInstalled = & (Join-Path $PSScriptRoot \"..\\Mapping\\InstalledGamesWindow.ps1\")\r\n        $windowOpenFile = & (Join-Path $PSScriptRoot \"..\\Mapping\\OpenFileWindow.ps1\")\r\n        $windowMain.Focus()\r\n    }\r\n\r\n    It \"Import window can be opened and import is possible\" {\r\n        $windowMain.ImageLogo.Click()\r\n        $windowMain.PopupMenu.InvokeItem(\"Add Installed Game(s)...\")\r\n        $windowInstalled.WaitForObject(2000)\r\n        $windowInstalled.ListPrograms.WaitForObjectVisible(5000)\r\n\r\n        # Import first program in list\r\n        $items = $windowInstalled.ListPrograms.GetItems()\r\n        $items.Count | Should BeGreaterThan 0\r\n        $importedGame = $items[0]\r\n        $importedName = $importedGame.GetName()\r\n        $importedName | Should Not BeNullOrEmpty\r\n        $importedGame.GetHelpText() | Should Not BeNullOrEmpty\r\n        $importedGame.GetNativeObject() | Get-UICheckBox | Set-UIToggleState\r\n        \r\n        # Import custom program\r\n        $windowInstalled.ButtonBrowse.Invoke()\r\n        $windowOpenFile.EditFileName.SetValue(\"C:\\Windows\\System32\\notepad.exe\")\r\n        $windowOpenFile.ButtonOpen.Invoke()\r\n        $newItem = $windowInstalled.ListPrograms.GetItems() | Select-Object -Last 1\r\n        $newItem.GetName() | Should Be \"System32\"\r\n        $newItem.GetHelpText() | Should Be \"C:\\Windows\\System32\\notepad.exe\"\r\n        $newItem.GetNativeObject() | Get-UICheckBox | Get-UIToggleState | Should Be \"On\"\r\n\r\n        $windowInstalled.ButtonOK.Invoke()\r\n\r\n        # Verify that programs are added\r\n        $items = $windowMain.ListBoxGames.GetItemNames() \r\n        $items -contains $importedName | Should Be $true\r\n        $items -contains \"System32\" | Should Be $true\r\n\r\n        # Imported programs can be started\r\n        $windowMain.ListBoxGames.SelectItem(\"System32\")\r\n        $windowMain.ButtonPlay.Invoke()\r\n        Start-Sleep -Seconds 1\r\n        Get-Process -Name \"notepad\" -EA 0 | Should Not Be $null\r\n        Get-Process -Name \"notepad\" -EA 0 | Stop-Process\r\n    }\r\n\r\n    AfterAll {\r\n        CleanWindows\r\n    }\r\n}"
  },
  {
    "path": "tests/UI/Startup.Tests.ps1",
    "content": "Describe \"Initial Startup\" {\r\n    BeforeAll {\r\n        $windowMain = & (Join-Path $PSScriptRoot \"..\\Mapping\\MainWindow.ps1\")        \r\n        $testData = Get-TestProperties\r\n    }\r\n\r\n    It \"Playnite can be started and window is opened\" {\r\n        Start-Process (Join-Path $testData.InstallPath \"PlayniteUI.exe\")\r\n        $windowMain.WaitForObject(10000)\r\n    }\r\n}\r\n\r\nDescribe \"Game import startup\" {\r\n    BeforeAll {\r\n        $windowMain = & (Join-Path $PSScriptRoot \"..\\Mapping\\MainWindow.ps1\")\r\n        $windowNotifications = & (Join-Path $PSScriptRoot \"..\\Mapping\\NotificationsWindow.ps1\")\r\n        $windowMain.WaitForObject(10000)\r\n    }\r\n\r\n    It \"Import progress is shown and games are loaded\" {\r\n        $windowMain.ProgressControl.IsVisible() | Should Be $true\r\n        WaitFor { $windowMain.ProgressControl.IsVisible() -eq $false } -Timeout 30000\r\n        $windowMain.ListBoxGames.GetItemNames().Count | Should BeGreaterThan 0\r\n        $windowNotifications.Exists() | Should Be $false\r\n    }\r\n}"
  }
]